package handler import ( "fmt" "math" "time" tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api" ethmineapi "gogs.veloe.link/toomanysugar/GoEthemineTelegramBot/api/ethermineapi" "gogs.veloe.link/toomanysugar/GoEthemineTelegramBot/internal/database" log "gogs.veloe.link/toomanysugar/GoEthemineTelegramBot/internal/logger" "gogs.veloe.link/toomanysugar/GoEthemineTelegramBot/cmd/settings" ) func (ah ActionHandler) getActualDataFromDatabaseHandler(chatId int64) (msgs []tgbotapi.MessageConfig) { mT := tgbotapi.NewMessage(chatId, "") errMsgToUser := "An exception occurred on sending messages while executing /actual command" var wallet string result := ah.dbconn.GormDb.Model(&database.User{}). Where("chat_id = ?", chatId). Select("wallet"). Scan(&wallet) if result.Error != nil { log.LogError.Println(result.Error) mT.Text = errMsgToUser return []tgbotapi.MessageConfig{ mT } } if wallet == "" { mT.Text = "Set wallet at first! Use /setwallet" return []tgbotapi.MessageConfig{ mT } } var lastMinerRecord database.Miner result = ah.dbconn.GormDb. Where(&database.Miner{Wallet: wallet}). Order("time desc"). Limit(1). Find(&lastMinerRecord) if result.Error != nil { log.LogError.Println(result.Error) mT.Text = "No miner data for now!" return []tgbotapi.MessageConfig{ mT } } var lastTime int64 result = ah.dbconn.GormDb. Model(&database.Worker{}). Where("wallet = ?", wallet). Select("MAX(time)"). Scan(&lastTime) if result.Error != nil { log.LogError.Println(result.Error) mT.Text = errMsgToUser return []tgbotapi.MessageConfig{ mT } } var lastWorkerRecord []database.Worker result = ah.dbconn.GormDb. Where(&database.Worker{Wallet: wallet, Time: lastTime}). Find(&lastWorkerRecord) if result.Error != nil { log.LogError.Println(result.Error) mT.Text = errMsgToUser return []tgbotapi.MessageConfig{ mT } } if len(lastWorkerRecord) == 0 { mT.Text = "No workers data for now!" return []tgbotapi.MessageConfig{ mT } } mT.Text = fmt.Sprintf("Miner %s stats:\n", lastMinerRecord.Wallet) mT.Text += fmt.Sprintf("Updated: %s\n", time.Unix(lastMinerRecord.Time, 0).Format("Monday, January 2, 2006 3:04 PM")) mT.Text += fmt.Sprintf("Reported Hashrate: %.3f MH/s\n", math.Round(float64(lastMinerRecord.ReportedHashrate)/1000)/1000) mT.Text += fmt.Sprintf("Current Hashrate: %.3f MH/s\n", math.Round(float64(lastMinerRecord.CurrentHashrate)/1000)/1000) mT.Text += fmt.Sprintf("Valid Shares: %d\n", lastMinerRecord.ValidShares) mT.Text += fmt.Sprintf("Stale Shares: %d\n", lastMinerRecord.StaleShares) mT.Text += fmt.Sprintf("Workers: %d\n", lastMinerRecord.Workers) mT.Text += fmt.Sprintf("Unpaid Balance: %.5f ETH\n", float64(lastMinerRecord.Unpaid)/math.Pow10(18)) //TODO ETH = AppSettings.currency msgs = append(msgs, mT) for i := range lastWorkerRecord { // Per worker message // Anti spam filter if i != 0 && i%20 == 0 { //TODO SOMETIHNG BETTER THAN USUAL TIMER time.Sleep(30 * time.Second) } msgText := fmt.Sprintf("Worker %s stats:\n", lastWorkerRecord[i].Worker) msgText += fmt.Sprintf("Updated: %s\n", time.Unix(lastWorkerRecord[i].Time, 0).Format("Monday, January 2, 2006 3:04 PM")) msgText += fmt.Sprintf("Reported Hashrate: %.3f MH/s\n", math.Round(float64(lastWorkerRecord[i].ReportedHashrate)/1000)/1000) msgText += fmt.Sprintf("Current Hashrate: %.3f MH/s\n", math.Round(float64(lastWorkerRecord[i].CurrentHashrate)/1000)/1000) msgText += fmt.Sprintf("Valid Shares: %d\n", lastWorkerRecord[i].ValidShares) msgText += fmt.Sprintf("Stale Shares: %d\n", lastWorkerRecord[i].StaleShares) msgText += fmt.Sprintf("Unpaid Balance: %.5f ETH\n", float64(lastWorkerRecord[i].WorkerUnpaid)/math.Pow10(18)) //TODO ETH = AppSettings.currency mW := tgbotapi.NewMessage(chatId, msgText) msgs = append(msgs, mW) } return msgs } func (ah ActionHandler) getActualDataHandler(chatId int64, miner string) []tgbotapi.MessageConfig { getActualData := func(miner string) string { url := fmt.Sprintf("%s/miner/%s/currentStats", settings.ApiUrl(), miner) var currentStats ethmineapi.JsonCurrentStats err := ethmineapi.UnmasrshalFromUrl(url, ¤tStats) if err != nil { // As in original... return "An exception occurred while executing this command." // return fmt.Sprintf("No data for specified wallet\n") } data := currentStats.Data actualData := fmt.Sprintf("Stats of miner\n%s\n", miner) actualData += fmt.Sprintf("Updated: %s\n", time.Unix(data.Time, 0).Format("Monday, January 2, 2006 3:04 PM")) actualData += fmt.Sprintf("Reported Hashrate: %.3f MH/s\n", math.Round(float64(data.ReportedHashrate)/1000)/1000) actualData += fmt.Sprintf("Current Hashrate: %.3f MH/s\n", math.Round(data.CurrentHashrate/1000)/1000) actualData += fmt.Sprintf("Valid Shares: %d\n", data.ValidShares) actualData += fmt.Sprintf("Stale Shares: %d\n", data.StaleShares) actualData += fmt.Sprintf("Workers: %d\n", data.ActiveWorkers) actualData += fmt.Sprintf("Unpaid Balance: %.5f ETH\n", float64(data.Unpaid)/math.Pow10(18)) return actualData } return []tgbotapi.MessageConfig{ tgbotapi.NewMessage(chatId, getActualData(miner))} } func (ah ActionHandler) ActualHandler(chatId int64, params []string) []tgbotapi.MessageConfig { if len(params) == 0 { return ah.getActualDataFromDatabaseHandler(chatId) } if len(params) == 1 { return ah.getActualDataHandler(chatId, params[0]) } return []tgbotapi.MessageConfig{tgbotapi.NewMessage(chatId, "usage: /actual [wallet]")} }