redpacket.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. package telegram
  2. import (
  3. "app/commons/core"
  4. "app/commons/i18n"
  5. "app/commons/services"
  6. "fmt"
  7. tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5"
  8. "strings"
  9. )
  10. // handleCallbackQuery 处理回调查询
  11. func handleCallbackQuery(callback *tgbotapi.CallbackQuery) {
  12. data := callback.Data
  13. // 处理按钮面板回调(一键注册、余额查询、记录、帮助)
  14. if strings.HasPrefix(data, "action_") {
  15. handleActionCallback(callback)
  16. return
  17. }
  18. // 处理抢红包
  19. if strings.HasPrefix(data, "grab_") {
  20. packetNo := strings.TrimPrefix(data, "grab_")
  21. grabRedPacket(callback, packetNo)
  22. return
  23. }
  24. // 其他回调
  25. answerCallback(callback.ID, "未知操作")
  26. }
  27. // grabRedPacket 抢红包
  28. func grabRedPacket(callback *tgbotapi.CallbackQuery, packetNo string) {
  29. telegramID := callback.From.ID
  30. username := callback.From.UserName
  31. // 先查询红包获取语言设置
  32. redPacketService := &services.RedPacketService{}
  33. packetInfo, _, _ := redPacketService.GetRedPacketDetail(packetNo)
  34. lang := "vi"
  35. if packetInfo != nil && packetInfo.Lang != "" {
  36. lang = packetInfo.Lang
  37. }
  38. m := i18n.GetLang(lang)
  39. // 检查绑定状态
  40. bindService := &services.TgBindService{}
  41. bound, userId := bindService.IsUserBound(telegramID, username)
  42. if !bound {
  43. answerCallback(callback.ID, m.NotBound)
  44. sendTextMessage(telegramID, m.NotBoundDM)
  45. core.Log.Infof("抢红包 - 用户: %s, 红包: %s, 结果: 未绑定", username, packetNo)
  46. return
  47. }
  48. // 用真实 userId 抢红包
  49. record, err := redPacketService.GrabRedPacket(
  50. packetNo,
  51. userId,
  52. telegramID,
  53. username,
  54. )
  55. if err != nil {
  56. answerCallback(callback.ID, err.Error())
  57. core.Log.Infof("抢红包 - 用户: %s(userId:%d), 红包: %s, 结果: %s",
  58. username, userId, packetNo, err.Error())
  59. return
  60. }
  61. // 抢到红包
  62. amount := record.Amount.InexactFloat64()
  63. answerCallback(callback.ID, fmt.Sprintf(m.GrabSuccess, amount, packetInfo.Symbol))
  64. // 从数据库查询完整的红包信息和所有领取记录,构建实时消息
  65. packet, records, _ := redPacketService.GetRedPacketDetail(packetNo)
  66. if packet == nil {
  67. return
  68. }
  69. // 构建红包头部信息
  70. packetTypeText := i18n.PacketTypeText(packet.PacketType, lang)
  71. editText := fmt.Sprintf("%s\n💰 %s\n\n%s: %.2f %s | %s: %d | %s",
  72. m.RedPacketTitle,
  73. packet.BlessingWords,
  74. m.TotalAmount, packet.TotalAmount.InexactFloat64(), packet.Symbol,
  75. m.Count, packet.TotalCount,
  76. packetTypeText)
  77. // 追加每个人的领取记录
  78. editText += fmt.Sprintf("\n\n"+m.GrabDetail, packet.GrabbedCount, packet.TotalCount)
  79. for _, r := range records {
  80. displayName := r.TelegramUsername
  81. if displayName != "" {
  82. displayName = "@" + displayName
  83. } else {
  84. displayName = fmt.Sprintf(m.UserPrefix, r.TelegramId)
  85. }
  86. editText += fmt.Sprintf("\n"+m.GrabRecord, displayName, r.Amount.InexactFloat64(), packet.Symbol)
  87. }
  88. // 根据剩余情况决定是否保留按钮
  89. if packet.RemainCount > 0 {
  90. keyboard := tgbotapi.NewInlineKeyboardMarkup(
  91. tgbotapi.NewInlineKeyboardRow(
  92. tgbotapi.NewInlineKeyboardButtonData(
  93. fmt.Sprintf(m.GrabButtonWithNum, packet.GrabbedCount, packet.TotalCount),
  94. fmt.Sprintf("grab_%s", packetNo),
  95. ),
  96. ),
  97. )
  98. editMessageWithKeyboard(callback.Message.Chat.ID, callback.Message.MessageID, editText, keyboard)
  99. } else {
  100. editText += "\n\n" + m.AllGrabbedMsg
  101. editMessage(callback.Message.Chat.ID, callback.Message.MessageID, editText)
  102. }
  103. core.Log.Infof("抢红包 - 用户: %s(userId:%d), 红包: %s, 金额: %s, 结果: 成功",
  104. username, userId, packetNo, record.Amount.String())
  105. }