Browse Source

general UpdateWallet decomposition

TooManySugar 3 years ago
parent
commit
69f2512445
3 changed files with 199 additions and 167 deletions
  1. 1 1
      connection.go
  2. 14 12
      ethermineapi/api_structs.go
  3. 184 154
      update_data.go

+ 1 - 1
connection.go

@@ -65,7 +65,7 @@ func (c *Connection) LatestMinerRecord(wallet string) (lastMinerRecord Miner, er
 func (c *Connection) ChatsWithWallet(wallet string) (ChatIds []int64, err error) {
 	result := c.GormDb.Model(&User{}).
 			Where("wallet = ?", wallet).
-			Select("chat_id").
+			Select("DISTINCT(chat_id)").
 			Scan(&ChatIds)
 	return ChatIds, result.Error
 }

+ 14 - 12
ethermineapi/api_structs.go

@@ -45,19 +45,21 @@ type JsonPayouts struct {
 	}
 }
 
+type WorkerData struct {
+	Worker           string
+	Time             int64
+	LastSeen         int64
+	ReportedHashrate int64
+	CurrentHashrate  float64
+	ValidShares      int
+	InvalidShares    int
+	StaleShares      int
+	AverageHashrate  float64
+}
+
 type JsonWorker struct {
-	Status string
-	Data   []struct {
-		Worker           string
-		Time             int64
-		LastSeen         int64
-		ReportedHashrate int64
-		CurrentHashrate  float64
-		ValidShares      int
-		InvalidShares    int
-		StaleShares      int
-		AverageHashrate  float64
-	}
+	Status 	string
+	Data 	[]WorkerData
 }
 
 type baseResponce struct {

+ 184 - 154
update_data.go

@@ -82,12 +82,17 @@ func (c *Connection) UpdateWallet(wallet string) {
 			}
 		}
 	}
+	c.UpdateWorkers(newMinerRecord, lastMinerRecord)	
+}
+
 
+// UpdateWorkers updates data on workers of newMinerRecord
+func (c *Connection) UpdateWorkers(newMinerRecord Miner, lastMinerRecord Miner) {
 	// Line 64 of UpdateData.cs
-	LogInfo.Printf("Getting workers data for wallet %s\n", wallet)
-	LogInfo.Printf("From: %s/miner/%s", appSettings.ApiUrl, wallet)
+	LogInfo.Printf("Getting workers data for wallet %s\n", newMinerRecord.Wallet)
+	LogInfo.Printf("From: %s/miner/%s", appSettings.ApiUrl, newMinerRecord.Wallet)
 
-	currentWorker, err := ethmineapi.Workers(appSettings.ApiUrl, wallet)
+	currentWorker, err := ethmineapi.Workers(appSettings.ApiUrl, newMinerRecord.Wallet)
 	if err != nil {
 		LogWarn.Println(err); return
 	}
@@ -98,182 +103,207 @@ func (c *Connection) UpdateWallet(wallet string) {
 
 	// Unsure is it occurs
 	if len(currentWorker.Data) == 0 { 
-		LogInfo.Printf("data in response from %s for workers of wallet %s not an interface!\n", appSettings.ApiUrl, wallet)
+		LogInfo.Printf("data in response from %s for workers of wallet %s not contains workers!\n",
+			appSettings.ApiUrl, newMinerRecord.Wallet)
 		return
 	}
 
+	//Update for each individual worker
 	for _, workerData := range currentWorker.Data {
-		LogInfo.Printf("Creating new worker record for %s, time %d\n", workerData.Worker, workerData.Time)
-
-		newWorkerRecord := Worker{
-		    Wallet:            newMinerRecord.Wallet,
-		    Time:              workerData.Time,
-		    Worker:            workerData.Worker,
-		    ReportedHashrate:  workerData.ReportedHashrate,
-		    CurrentHashrate:   workerData.CurrentHashrate,
-		    ValidShares:       workerData.ValidShares,
-		    StaleShares:       workerData.StaleShares,
-		    InvalidShares:     workerData.InvalidShares,
-		}
+		// In perfection:
+		// worker, err := workerData.Update()
+		// if err != nil {...}
+		// if worker.Payout {
+		//	c.getPayout()
+		//	...
+		// } 
+		//
+		// In reality
+		c.updateWorker(workerData, newMinerRecord, lastMinerRecord)
+	}
+}
 
-		LogInfo.Printf("New worker record creating complete %s", newWorkerRecord.Worker)
 
-		//Search for latest record for worker
-		lastWorkerRecord, err := c.LatestWorkerRecord(workerData.Worker)
-		if err != nil {
-			LogError.Println(err); continue
-		}
 
-		// Line 85 of UpdateData.cs
-		if lastWorkerRecord != (Worker{}) {
-			//check for payout
-			if newMinerRecord.Unpaid < lastMinerRecord.Unpaid {
-				// Adding new payout field to db
-				payouts, err := ethmineapi.Payouts(appSettings.ApiUrl, wallet)
-				if err != nil {
-					LogError.Println(err); continue
-				}
+// updateWorker updates data on workerData 
+func (c *Connection) updateWorker(workerData ethmineapi.WorkerData, 
+	newMinerRecord Miner, lastMinerRecord Miner) {
 
-				if (len(payouts.Data) == 0) {
-					LogWarn.Println("No actual payouts for wallet", wallet)
-					continue
-				}
+	LogInfo.Printf("Creating new worker record for %s, time %d\n", workerData.Worker, workerData.Time)
 
-				lastPayout := payouts.Data[0]
+	newWorkerRecord := Worker{
+	    Wallet:            newMinerRecord.Wallet,
+	    Time:              workerData.Time,
+	    Worker:            workerData.Worker,
+	    ReportedHashrate:  workerData.ReportedHashrate,
+	    CurrentHashrate:   workerData.CurrentHashrate,
+	    ValidShares:       workerData.ValidShares,
+	    StaleShares:       workerData.StaleShares,
+	    InvalidShares:     workerData.InvalidShares,
+	}
 
-				LogInfo.Println("Last payout time =", lastPayout.PaidOn)
+	LogInfo.Printf("New worker record creating complete %s", newWorkerRecord.Worker)
 
-				newPayoutRecord := Payout{
-				    Wallet:  wallet,
-				    Time:    lastPayout.PaidOn,
-				    Amount:  lastPayout.Amount,
-				    Worker:  workerData.Worker,
-				}
+	//Search for latest record for worker
+	lastWorkerRecord, err := c.LatestWorkerRecord(workerData.Worker)
+	if err != nil {
+		LogError.Println(err);
+		return
+	}
 
-				workerAmount := float64(lastWorkerRecord.WorkerUnpaid+
-					(float64(lastPayout.Amount-lastMinerRecord.Unpaid))) *
-					(float64(workerData.ReportedHashrate) / float64(newMinerRecord.ReportedHashrate))
-				if math.IsNaN(workerAmount) || math.IsInf(workerAmount, 0) {
-					workerAmount = lastWorkerRecord.WorkerUnpaid
-				}
-				newPayoutRecord.WorkerAmount = workerAmount
-
-				workerUnpaid := float64(newMinerRecord.Unpaid) *
-					(float64(workerData.ReportedHashrate) / float64(newMinerRecord.ReportedHashrate))
-				LogDebug.Println("newMinerRecord.Unpaid:", newMinerRecord.Unpaid)
-				LogDebug.Println("lastMinerRecord.Unpaid:", lastMinerRecord.Unpaid)
-				LogDebug.Println("workerData.ReportedHashrate:", workerData.ReportedHashrate)
-				LogDebug.Println("newMinerRecord.ReportedHashrate:", newMinerRecord.ReportedHashrate)
-				LogDebug.Println("workerUnpaid:", workerUnpaid)
-				if math.IsNaN(workerUnpaid) || math.IsInf(workerUnpaid, 0) {
-					LogDebug.Println("workerUnpaid is NaN or Inf")
-					workerUnpaid = 0
-				}
-				newWorkerRecord.WorkerUnpaid = workerUnpaid
+	// Line 196 of UpdateData.cs
+	if lastWorkerRecord == (Worker{}) {
+		// TODO check default value of WorkerUnpaid 
+		LogDebug.Println("Setting WorkerUnpaid to 0")
+		newWorkerRecord.WorkerUnpaid = 0
+	}
+	
+	// Line 85 of UpdateData.cs
+	// check for payout
+	// maybe newWorkerRecord.WorkerUnpaid, err := c.{}payout{}(newMinerRecord, lastMinerRecord)
+
+	//Repeating of line 75 due to update of individual worker 
+	if lastWorkerRecord != (Worker{}) && newMinerRecord.Unpaid < lastMinerRecord.Unpaid {
+		// Adding new payout field to db
+		payouts, err := ethmineapi.Payouts(appSettings.ApiUrl, newWorkerRecord.Wallet)
+		if err != nil {
+			LogError.Println(err); return
+		}
 
-				result = c.GormDb.Create(&newPayoutRecord)
-				if result.Error != nil {
-					LogError.Println(result.Error)
-					return
-				}
-				LogInfo.Println("Added newPayoutRecord, time =", newPayoutRecord.Time)
-
-				//removing old records
-				result = c.GormDb.
-					Where("wallet = ? AND time < ?", newPayoutRecord.Wallet, newPayoutRecord.Time).
-					Delete(Worker{})
-				if result.Error != nil {
-					LogError.Println(result.Error)
-				}
+		if (len(payouts.Data) == 0) {
+			LogWarn.Println("No actual payouts for wallet", newWorkerRecord.Wallet)
+			return
+		}
 
-				result = c.GormDb.
-					Where("wallet = ? AND time < ?", newPayoutRecord.Wallet, newPayoutRecord.Time).
-					Delete(Miner{})
-				if result.Error != nil {
-					LogError.Println(result.Error)
-				}
+		lastPayout := payouts.Data[0]
 
-				result = c.GormDb.
-					Where("wallet = ? AND time < ?", newPayoutRecord.Wallet, newPayoutRecord.Time).
-					Delete(Payout{})
-				if result.Error != nil {
-					LogError.Println(result.Error)
-				}
-				//Line 135 of UpdateData.cs
-			} else {
-				//no check that last balance and prev balance are the same
-				//don't sure > or >=
-				//TODO rewrite this
-				var max int64
-				result := c.GormDb.Model(&Payout{}).
-					Where("wallet = ?", lastWorkerRecord.Wallet).
-					Order("time desc").
-					Limit(1).
-					Select("time").
-					Scan(&max)
-				if result.Error != nil {
-					LogWarn.Printf("No payouts data for %s! Time is set to 0!\n", lastWorkerRecord.Wallet)
-					LogError.Println(result.Error)
-					max = 0
-				}
+		LogInfo.Println("Last payout time =", lastPayout.PaidOn)
 
-				if lastWorkerRecord.Time > max {
-					workerUnpaid := float64(lastWorkerRecord.WorkerUnpaid+
-						float64(newMinerRecord.Unpaid-lastMinerRecord.Unpaid)) *
-						(float64(workerData.ReportedHashrate) / float64(newMinerRecord.ReportedHashrate))
-					if math.IsNaN(workerUnpaid) || math.IsInf(workerUnpaid, 0) {
-						workerUnpaid = lastWorkerRecord.WorkerUnpaid
-					}
-					newWorkerRecord.WorkerUnpaid = workerUnpaid
-					// Line 169 of UpdateData.cs
-				} else {
-					workerUnpaid := float64((newMinerRecord.Unpaid - lastMinerRecord.Unpaid)) *
-						(float64(workerData.ReportedHashrate) / float64(newMinerRecord.ReportedHashrate))
-					if math.IsNaN(workerUnpaid) || math.IsInf(workerUnpaid, 0) {
-						workerUnpaid = lastWorkerRecord.WorkerUnpaid
-					}
-					newWorkerRecord.WorkerUnpaid = workerUnpaid
-
-					var targetedChats []int64
-					result = c.GormDb.Model(&User{}).
-						Where("wallet = ?", newMinerRecord.Wallet).
-						Select("DISTINCT(chat_id)").
-						Scan(&targetedChats)
-					if result.Error != nil {
-						LogError.Println(result.Error)
-					} else {
-						msg := fmt.Sprintf("Debug info: Your worker %s hasn't been zeroed on payout!", workerData.Worker)
-						for _, chatId := range targetedChats {
-							go myBotClient.Send(tgbotapi.NewMessage(int64(chatId), msg))
-						}
-						LogDebug.Printf("Worker %s on address %s hasn't been zeroed on payout!\n", workerData.Worker, wallet)
-					}
-				}
-			}
-		
-			// Line 196 of UpdateData.cs
-		} else {
-			LogDebug.Println("Setting WorkerUnpaid to 0")
-			newWorkerRecord.WorkerUnpaid = 0
+		newPayoutRecord := Payout{
+		    Wallet:  newWorkerRecord.Wallet,
+		    Time:    lastPayout.PaidOn,
+		    Amount:  lastPayout.Amount,
+		    Worker:  workerData.Worker,
 		}
 
-
-		rowExists, err := c.IsWorkerRowExists(newWorkerRecord.Worker, newWorkerRecord.Time)
-		if err != nil {
-			LogError.Println(err); return
+		workerAmount := float64(lastWorkerRecord.WorkerUnpaid+
+			(float64(lastPayout.Amount-lastMinerRecord.Unpaid))) *
+			(float64(workerData.ReportedHashrate) / float64(newMinerRecord.ReportedHashrate))
+		if math.IsNaN(workerAmount) || math.IsInf(workerAmount, 0) {
+			workerAmount = lastWorkerRecord.WorkerUnpaid
 		}
+		newPayoutRecord.WorkerAmount = workerAmount
+
+		workerUnpaid := float64(newMinerRecord.Unpaid) *
+			(float64(workerData.ReportedHashrate) / float64(newMinerRecord.ReportedHashrate))
+		LogDebug.Println("newMinerRecord.Unpaid:", newMinerRecord.Unpaid)
+		LogDebug.Println("lastMinerRecord.Unpaid:", lastMinerRecord.Unpaid)
+		LogDebug.Println("workerData.ReportedHashrate:", workerData.ReportedHashrate)
+		LogDebug.Println("newMinerRecord.ReportedHashrate:", newMinerRecord.ReportedHashrate)
+		LogDebug.Println("workerUnpaid:", workerUnpaid)
+		if math.IsNaN(workerUnpaid) || math.IsInf(workerUnpaid, 0) {
+			LogDebug.Println("workerUnpaid is NaN or Inf")
+			workerUnpaid = 0
+		}
+		newWorkerRecord.WorkerUnpaid = workerUnpaid
 
-		if rowExists {
-			LogInfo.Printf("Error adding new row: row with worker: %s, time: %d already exists!\n", newWorkerRecord.Worker, newWorkerRecord.Time)
+		if result := c.GormDb.Create(&newPayoutRecord); result.Error != nil {
+			LogError.Println(result.Error)
 			return
 		}
-		result = c.GormDb.Create(&newWorkerRecord)
+		LogInfo.Println("Added newPayoutRecord, time =", newPayoutRecord.Time)
 
+		//removing old records
+		result := c.GormDb.
+			Where("wallet = ? AND time < ?", newPayoutRecord.Wallet, newPayoutRecord.Time).
+			Delete(Worker{})
+		if result.Error != nil {
+			LogError.Println(result.Error)
+		}
+
+		result = c.GormDb.
+			Where("wallet = ? AND time < ?", newPayoutRecord.Wallet, newPayoutRecord.Time).
+			Delete(Miner{})
+		if result.Error != nil {
+			LogError.Println(result.Error)
+		}
+
+		result = c.GormDb.
+			Where("wallet = ? AND time < ?", newPayoutRecord.Wallet, newPayoutRecord.Time).
+			Delete(Payout{})
 		if result.Error != nil {
 			LogError.Println(result.Error)
-			return
 		}
-		
-		LogInfo.Printf("Added new row for worker %s\n", newWorkerRecord.Worker)
+
+	//Line 135 of UpdateData.cs
+	} else {
+		//Payout not happened
+		//no check that last balance and prev balance are the same
+		//don't sure > or >=
+		//TODO rewrite this
+		var max int64
+		// max, err := c.LastPayoutTime(wallet)
+		result := c.GormDb.Model(&Payout{}).
+			Where("wallet = ?", lastWorkerRecord.Wallet).
+			Order("time desc").
+			Limit(1).
+			Select("time").
+			Scan(&max)
+		if result.Error != nil {
+			LogWarn.Printf("No payouts data for %s! Time is set to 0!\n", lastWorkerRecord.Wallet)
+			LogError.Println(result.Error)
+			max = 0
+		}
+
+		if lastWorkerRecord.Time > max {
+			workerUnpaid := float64(lastWorkerRecord.WorkerUnpaid+
+				float64(newMinerRecord.Unpaid-lastMinerRecord.Unpaid)) *
+				(float64(workerData.ReportedHashrate) / float64(newMinerRecord.ReportedHashrate))
+			if math.IsNaN(workerUnpaid) || math.IsInf(workerUnpaid, 0) {
+				workerUnpaid = lastWorkerRecord.WorkerUnpaid
+			}
+			newWorkerRecord.WorkerUnpaid = workerUnpaid
+			// Line 169 of UpdateData.cs
+		} else {
+			workerUnpaid := float64((newMinerRecord.Unpaid - lastMinerRecord.Unpaid)) *
+				(float64(workerData.ReportedHashrate) / float64(newMinerRecord.ReportedHashrate))
+			if math.IsNaN(workerUnpaid) || math.IsInf(workerUnpaid, 0) {
+				workerUnpaid = lastWorkerRecord.WorkerUnpaid
+			}
+			newWorkerRecord.WorkerUnpaid = workerUnpaid
+
+			targetedChats, err := c.ChatsWithWallet(newMinerRecord.Wallet)
+			if err != nil {
+				LogError.Println(err)
+			}
+
+			if err == nil {
+				msg := fmt.Sprintf("Debug info: Your worker %s hasn't been zeroed on payout!", 
+					workerData.Worker)
+				for _, chatId := range targetedChats {
+					go myBotClient.Send(tgbotapi.NewMessage(int64(chatId), msg))
+				}
+				LogDebug.Printf("Worker %s on address %s hasn't been zeroed on payout!\n", 
+					workerData.Worker, newMinerRecord.Wallet)
+			}
+		}
+	}
+
+	rowExists, err := c.IsWorkerRowExists(newWorkerRecord.Worker, newWorkerRecord.Time)
+	if err != nil {
+		LogError.Println(err); return
 	}
+
+	if rowExists {
+		LogInfo.Printf("Error adding new row: row with worker: %s, time: %d already exists!\n", 
+		newWorkerRecord.Worker, newWorkerRecord.Time)
+		return
+	}
+
+	if result := c.GormDb.Create(&newWorkerRecord); result.Error != nil {
+		LogError.Println(result.Error)
+		return
+	}
+	
+	LogInfo.Printf("Added new row for worker %s\n", newWorkerRecord.Worker)
 }