actual.go 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. package handler
  2. import (
  3. "fmt"
  4. "math"
  5. "time"
  6. tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api"
  7. ethmineapi "gogs.veloe.link/toomanysugar/GoEthemineTelegramBot/api/ethermineapi"
  8. "gogs.veloe.link/toomanysugar/GoEthemineTelegramBot/internal/database"
  9. log "gogs.veloe.link/toomanysugar/GoEthemineTelegramBot/internal/logger"
  10. "gogs.veloe.link/toomanysugar/GoEthemineTelegramBot/cmd/settings"
  11. )
  12. func (ah ActionHandler) getActualDataFromDatabaseHandler(chatId int64) (msgs []tgbotapi.MessageConfig) {
  13. mT := tgbotapi.NewMessage(chatId, "")
  14. errMsgToUser := "An exception occurred on sending messages while executing /actual command"
  15. var wallet string
  16. result := ah.dbconn.GormDb.Model(&database.User{}).
  17. Where("chat_id = ?", chatId).
  18. Select("wallet").
  19. Scan(&wallet)
  20. if result.Error != nil {
  21. log.LogError.Println(result.Error)
  22. mT.Text = errMsgToUser
  23. return []tgbotapi.MessageConfig{ mT }
  24. }
  25. if wallet == "" {
  26. mT.Text = "Set wallet at first! Use /setwallet"
  27. return []tgbotapi.MessageConfig{ mT }
  28. }
  29. var lastMinerRecord database.Miner
  30. result = ah.dbconn.GormDb.
  31. Where(&database.Miner{Wallet: wallet}).
  32. Order("time desc").
  33. Limit(1).
  34. Find(&lastMinerRecord)
  35. if result.Error != nil {
  36. log.LogError.Println(result.Error)
  37. mT.Text = "No miner data for now!"
  38. return []tgbotapi.MessageConfig{ mT }
  39. }
  40. var lastTime int64
  41. result = ah.dbconn.GormDb.
  42. Model(&database.Worker{}).
  43. Where("wallet = ?", wallet).
  44. Select("MAX(time)").
  45. Scan(&lastTime)
  46. if result.Error != nil {
  47. log.LogError.Println(result.Error)
  48. mT.Text = errMsgToUser
  49. return []tgbotapi.MessageConfig{ mT }
  50. }
  51. var lastWorkerRecord []database.Worker
  52. result = ah.dbconn.GormDb.
  53. Where(&database.Worker{Wallet: wallet, Time: lastTime}).
  54. Find(&lastWorkerRecord)
  55. if result.Error != nil {
  56. log.LogError.Println(result.Error)
  57. mT.Text = errMsgToUser
  58. return []tgbotapi.MessageConfig{ mT }
  59. }
  60. if len(lastWorkerRecord) == 0 {
  61. mT.Text = "No workers data for now!"
  62. return []tgbotapi.MessageConfig{ mT }
  63. }
  64. mT.Text = fmt.Sprintf("Miner %s stats:\n", lastMinerRecord.Wallet)
  65. mT.Text += fmt.Sprintf("Updated: %s\n", time.Unix(lastMinerRecord.Time, 0).Format("Monday, January 2, 2006 3:04 PM"))
  66. mT.Text += fmt.Sprintf("Reported Hashrate: %.3f MH/s\n", math.Round(float64(lastMinerRecord.ReportedHashrate)/1000)/1000)
  67. mT.Text += fmt.Sprintf("Current Hashrate: %.3f MH/s\n", math.Round(float64(lastMinerRecord.CurrentHashrate)/1000)/1000)
  68. mT.Text += fmt.Sprintf("Valid Shares: %d\n", lastMinerRecord.ValidShares)
  69. mT.Text += fmt.Sprintf("Stale Shares: %d\n", lastMinerRecord.StaleShares)
  70. mT.Text += fmt.Sprintf("Workers: %d\n", lastMinerRecord.Workers)
  71. mT.Text += fmt.Sprintf("Unpaid Balance: %.5f ETH\n", float64(lastMinerRecord.Unpaid)/math.Pow10(18)) //TODO ETH = AppSettings.currency
  72. msgs = append(msgs, mT)
  73. for i := range lastWorkerRecord {
  74. // Per worker message
  75. // Anti spam filter
  76. if i != 0 && i%20 == 0 { //TODO SOMETIHNG BETTER THAN USUAL TIMER
  77. time.Sleep(30 * time.Second)
  78. }
  79. msgText := fmt.Sprintf("Worker %s stats:\n", lastWorkerRecord[i].Worker)
  80. msgText += fmt.Sprintf("Updated: %s\n", time.Unix(lastWorkerRecord[i].Time, 0).Format("Monday, January 2, 2006 3:04 PM"))
  81. msgText += fmt.Sprintf("Reported Hashrate: %.3f MH/s\n", math.Round(float64(lastWorkerRecord[i].ReportedHashrate)/1000)/1000)
  82. msgText += fmt.Sprintf("Current Hashrate: %.3f MH/s\n", math.Round(float64(lastWorkerRecord[i].CurrentHashrate)/1000)/1000)
  83. msgText += fmt.Sprintf("Valid Shares: %d\n", lastWorkerRecord[i].ValidShares)
  84. msgText += fmt.Sprintf("Stale Shares: %d\n", lastWorkerRecord[i].StaleShares)
  85. msgText += fmt.Sprintf("Unpaid Balance: %.5f ETH\n", float64(lastWorkerRecord[i].WorkerUnpaid)/math.Pow10(18)) //TODO ETH = AppSettings.currency
  86. mW := tgbotapi.NewMessage(chatId, msgText)
  87. msgs = append(msgs, mW)
  88. }
  89. return msgs
  90. }
  91. func (ah ActionHandler) getActualDataHandler(chatId int64, miner string) []tgbotapi.MessageConfig {
  92. getActualData := func(miner string) string {
  93. url := fmt.Sprintf("%s/miner/%s/currentStats", settings.ApiUrl(), miner)
  94. var currentStats ethmineapi.JsonCurrentStats
  95. err := ethmineapi.UnmasrshalFromUrl(url, &currentStats)
  96. if err != nil {
  97. // As in original...
  98. return "An exception occurred while executing this command."
  99. // return fmt.Sprintf("No data for specified wallet\n")
  100. }
  101. data := currentStats.Data
  102. actualData := fmt.Sprintf("Stats of miner\n%s\n", miner)
  103. actualData += fmt.Sprintf("Updated: %s\n", time.Unix(data.Time, 0).Format("Monday, January 2, 2006 3:04 PM"))
  104. actualData += fmt.Sprintf("Reported Hashrate: %.3f MH/s\n", math.Round(float64(data.ReportedHashrate)/1000)/1000)
  105. actualData += fmt.Sprintf("Current Hashrate: %.3f MH/s\n", math.Round(data.CurrentHashrate/1000)/1000)
  106. actualData += fmt.Sprintf("Valid Shares: %d\n", data.ValidShares)
  107. actualData += fmt.Sprintf("Stale Shares: %d\n", data.StaleShares)
  108. actualData += fmt.Sprintf("Workers: %d\n", data.ActiveWorkers)
  109. actualData += fmt.Sprintf("Unpaid Balance: %.5f ETH\n", float64(data.Unpaid)/math.Pow10(18))
  110. return actualData
  111. }
  112. return []tgbotapi.MessageConfig{
  113. tgbotapi.NewMessage(chatId, getActualData(miner))}
  114. }
  115. func (ah ActionHandler) ActualHandler(chatId int64, params []string) []tgbotapi.MessageConfig {
  116. if len(params) == 0 {
  117. return ah.getActualDataFromDatabaseHandler(chatId)
  118. }
  119. if len(params) == 1 {
  120. return ah.getActualDataHandler(chatId, params[0])
  121. }
  122. return []tgbotapi.MessageConfig{tgbotapi.NewMessage(chatId, "usage: /actual [wallet]")}
  123. }