redpacket.go 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. package telegram
  2. import (
  3. "app/commons/core"
  4. "app/commons/services"
  5. "fmt"
  6. tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5"
  7. "strings"
  8. )
  9. // handleCallbackQuery 处理回调查询
  10. func handleCallbackQuery(callback *tgbotapi.CallbackQuery) {
  11. data := callback.Data
  12. // 处理抢红包
  13. if strings.HasPrefix(data, "grab_") {
  14. packetNo := strings.TrimPrefix(data, "grab_")
  15. grabRedPacket(callback, packetNo)
  16. return
  17. }
  18. // 其他回调
  19. answerCallback(callback.ID, "未知操作")
  20. }
  21. // grabRedPacket 抢红包
  22. func grabRedPacket(callback *tgbotapi.CallbackQuery, packetNo string) {
  23. telegramID := callback.From.ID
  24. username := callback.From.UserName
  25. // 检查绑定状态
  26. bindService := &services.TgBindService{}
  27. bound, userId := bindService.IsUserBound(telegramID)
  28. if !bound {
  29. answerCallback(callback.ID, "⚠️ 请先绑定账户!私聊我发送 /bind")
  30. // 私聊发送绑定提示
  31. sendTextMessage(telegramID, "⚠️ 您尚未绑定平台账户,无法抢红包。\n\n请发送 /bind 获取绑定链接。")
  32. core.Log.Infof("抢红包 - 用户: %s, 红包: %s, 结果: 未绑定", username, packetNo)
  33. return
  34. }
  35. // 用真实 userId 抢红包
  36. redPacketService := &services.RedPacketService{}
  37. record, err := redPacketService.GrabRedPacket(
  38. packetNo,
  39. userId,
  40. telegramID,
  41. username,
  42. )
  43. if err != nil {
  44. answerCallback(callback.ID, err.Error())
  45. core.Log.Infof("抢红包 - 用户: %s(userId:%d), 红包: %s, 结果: %s",
  46. username, userId, packetNo, err.Error())
  47. return
  48. }
  49. // 抢到红包
  50. amount := record.Amount.InexactFloat64()
  51. answerCallback(callback.ID, fmt.Sprintf("🎉 恭喜抢到 %.2f VND!", amount))
  52. // 更新原消息
  53. editText := fmt.Sprintf("%s\n\n✅ @%s 抢到了 %.2f VND",
  54. callback.Message.Text, username, amount)
  55. editMessage(callback.Message.Chat.ID, callback.Message.MessageID, editText)
  56. core.Log.Infof("抢红包 - 用户: %s(userId:%d), 红包: %s, 金额: %s, 结果: 成功",
  57. username, userId, packetNo, record.Amount.String())
  58. }