handlers.go 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. package database
  2. import (
  3. "fmt"
  4. "time"
  5. "math"
  6. ethmineapi "gogs.veloe.link/toomanysugar/GoEthemineTelegramBot/api/ethermineapi"
  7. "gogs.veloe.link/toomanysugar/GoEthemineTelegramBot/cmd/settings"
  8. log "gogs.veloe.link/toomanysugar/GoEthemineTelegramBot/internal/logger"
  9. )
  10. func (c *Connection) AddUser(chatId int64) (string, error) {
  11. // Check if user already registered
  12. var userCount int64
  13. result := c.GormDb.Model(&User{}).
  14. Where("chat_id = ?", chatId).
  15. Count(&userCount)
  16. if result.Error != nil {
  17. return "", fmt.Errorf("failed creating user: %w", result.Error)
  18. }
  19. if userCount != 0 {
  20. return "Already registered", nil
  21. }
  22. // Adding new user to database
  23. newUser := User{ChatId: chatId}
  24. result = c.GormDb.Create(newUser)
  25. if result.Error != nil {
  26. return "", fmt.Errorf("failed creating user: %w", result.Error)
  27. }
  28. log.LogInfo.Println("User was created:", newUser)
  29. return "Added new user to database. Now you can connect your miner wallet using command /setwallet <address>", nil
  30. }
  31. func (c *Connection) DeleteUser(chatId int64) (string, error) {
  32. // Check for user existance
  33. var userCount int64
  34. result := c.GormDb.Model(&User{}).
  35. Where("chat_id = ?", chatId).
  36. Count(&userCount)
  37. if result.Error != nil {
  38. return "", fmt.Errorf("failed creating user: %w", result.Error)
  39. }
  40. if userCount == 0 {
  41. return "Already deleted", nil
  42. }
  43. // Taking target for deletion
  44. var user User
  45. result = c.GormDb.Take(&user, "chat_id = ?", chatId)
  46. if result.Error != nil {
  47. return "", fmt.Errorf("failed querying user: %w", result.Error)
  48. }
  49. var walletHoldersCount int64
  50. result = c.GormDb.Model(&User{}).
  51. Where("wallet = ?", user.Wallet).
  52. Count(&walletHoldersCount)
  53. if result.Error != nil {
  54. return "", fmt.Errorf("failed querying user: %w", result.Error)
  55. }
  56. // TODO Remove code repition
  57. if walletHoldersCount > 1 {
  58. // Wallet in multiple chats
  59. result = c.GormDb.Where("chat_id = ?", chatId).Delete(User{})
  60. if result.Error != nil {
  61. return "", fmt.Errorf("failed deleting user: %w", result.Error)
  62. }
  63. } else {
  64. // Wallet in single chat
  65. result = c.GormDb.Where("chat_id = ?", chatId).Delete(User{})
  66. if result.Error != nil {
  67. return "", fmt.Errorf("failed deleting user: %w", result.Error)
  68. }
  69. result = c.GormDb.Where("wallet = ?", user.Wallet).Delete(Miner{})
  70. if result.Error != nil {
  71. return "", fmt.Errorf("failed deleting miner: %w", result.Error)
  72. }
  73. log.LogInfo.Println("Miners deleted with wallet:", user.Wallet)
  74. result = c.GormDb.Where("wallet = ?", user.Wallet).Delete(Worker{})
  75. if result.Error != nil {
  76. return "", fmt.Errorf("failed deleting workers: %w", result.Error)
  77. }
  78. log.LogInfo.Println("Workers deleted with wallet:", user.Wallet)
  79. result = c.GormDb.Where("wallet = ?", user.Wallet).Delete(Payout{})
  80. if result.Error != nil {
  81. return "", fmt.Errorf("failed deleting payouts: %w", result.Error)
  82. }
  83. log.LogInfo.Println("Payouts deleted for wallet:", user.Wallet)
  84. }
  85. log.LogInfo.Println("User was deleted:", user)
  86. return "Done!", nil
  87. }
  88. func (c *Connection) GetLastPayout(chatId int64) string {
  89. errMsgToUser := "An exception occurred on sending messages while executing /actual command"
  90. var wallet string
  91. result := c.GormDb.Model(&User{}).
  92. Where(User{ChatId: chatId}).
  93. Select("wallet").
  94. Scan(&wallet)
  95. if result.Error != nil {
  96. log.LogError.Println(result.Error)
  97. return errMsgToUser
  98. }
  99. if wallet == "" {
  100. return "Set wallet at first! Use /setwallet"
  101. }
  102. var payoutTime int64
  103. result = c.GormDb.Model(&Payout{}).
  104. Where(&Payout{Wallet: wallet}).
  105. Order("time desc").
  106. Limit(1).
  107. Select("time").
  108. Scan(&payoutTime)
  109. if result.Error != nil {
  110. log.LogInfo.Printf("No payouts data for %s! Time is set to 0!", wallet)
  111. log.LogError.Println(result.Error)
  112. payoutTime = 0
  113. }
  114. // NOTE Pointless if previous 'if' statement occurs
  115. // Must go from the start to line 235
  116. var dbPayoutRecords []Payout
  117. result = c.GormDb.
  118. Where(&Payout{Wallet: wallet, Time: payoutTime}).
  119. Find(&dbPayoutRecords)
  120. //Line 560 of Program.cs
  121. if len(dbPayoutRecords) == 0 {
  122. url := fmt.Sprintf("%s/miner/%s/payouts", settings.ApiUrl(), wallet)
  123. var payouts ethmineapi.JsonPayouts
  124. err := ethmineapi.UnmasrshalFromUrl(url, &payouts)
  125. if err != nil {
  126. log.LogError.Println(err)
  127. return fmt.Sprintf("No payout data for %s", wallet)
  128. }
  129. lastPayout := payouts.Data[0]
  130. message := fmt.Sprintf("Payout date: %s\n", time.Unix(lastPayout.PaidOn, 0).Format("Monday, January 2, 2006 3:04 PM"))
  131. message += fmt.Sprintf("Amount: %.5f %s\n", float64(lastPayout.Amount)/math.Pow10(18), settings.Currency())
  132. message += "Data source: Ethermine API \n"
  133. return message
  134. }
  135. if result.Error != nil {
  136. log.LogError.Println(result.Error)
  137. return errMsgToUser
  138. }
  139. //Line 545 of Program.cs
  140. message := fmt.Sprintf("Payout date: %s\n", time.Unix(dbPayoutRecords[0].Time, 0).Format("Monday, January 2, 2006 3:04 PM"))
  141. message += fmt.Sprintf("Amount: %.5f ETH\n", float64(dbPayoutRecords[0].Amount)/math.Pow10(18))
  142. for _, payoutRecord := range dbPayoutRecords {
  143. message += fmt.Sprintf("Worker %s paid: %.5f %s\n",
  144. payoutRecord.Worker,
  145. float64(payoutRecord.Amount)/math.Pow10(18),
  146. settings.Currency())
  147. }
  148. message += "Data source: Bot database \n"
  149. return message
  150. }