|
|
@@ -2,11 +2,9 @@ package telegram
|
|
|
|
|
|
import (
|
|
|
"app/commons/core"
|
|
|
- "encoding/json"
|
|
|
+ "app/commons/services"
|
|
|
"fmt"
|
|
|
tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5"
|
|
|
- "io"
|
|
|
- "net/http"
|
|
|
"strings"
|
|
|
)
|
|
|
|
|
|
@@ -27,75 +25,35 @@ func handleCallbackQuery(callback *tgbotapi.CallbackQuery) {
|
|
|
|
|
|
// grabRedPacket 抢红包
|
|
|
func grabRedPacket(callback *tgbotapi.CallbackQuery, packetNo string) {
|
|
|
- // TODO: 检查用户是否已绑定
|
|
|
- // TODO: 调用 API 抢红包
|
|
|
-
|
|
|
- // 临时实现
|
|
|
- userID := callback.From.ID
|
|
|
+ telegramID := callback.From.ID
|
|
|
username := callback.From.UserName
|
|
|
|
|
|
- // 模拟调用 API
|
|
|
- success, amount, message := callGrabRedPacketAPI(packetNo, userID, username)
|
|
|
-
|
|
|
- if success {
|
|
|
- // 抢到红包
|
|
|
- answerCallback(callback.ID, fmt.Sprintf("🎉 恭喜抢到 %.2f VND!", amount))
|
|
|
+ // 直接调用 service 层抢红包
|
|
|
+ redPacketService := &services.RedPacketService{}
|
|
|
|
|
|
- // 更新原消息
|
|
|
- editText := fmt.Sprintf("%s\n\n✅ @%s 抢到了 %.2f VND",
|
|
|
- callback.Message.Text, username, amount)
|
|
|
- editMessage(callback.Message.Chat.ID, callback.Message.MessageID, editText)
|
|
|
- } else {
|
|
|
- // 抢红包失败
|
|
|
- answerCallback(callback.ID, message)
|
|
|
- }
|
|
|
-
|
|
|
- core.Log.Infof("抢红包 - 用户: %s, 红包: %s, 结果: %s",
|
|
|
- username, packetNo, message)
|
|
|
-}
|
|
|
-
|
|
|
-// callGrabRedPacketAPI 调用抢红包 API(模拟)
|
|
|
-func callGrabRedPacketAPI(packetNo string, telegramID int64, username string) (bool, float64, string) {
|
|
|
- // TODO: 实现真实的 API 调用
|
|
|
- // 这里是模拟实现
|
|
|
-
|
|
|
- apiURL := "http://localhost:2001/api/v1/redpacket/grab"
|
|
|
-
|
|
|
- payload := map[string]interface{}{
|
|
|
- "packetNo": packetNo,
|
|
|
- "telegramId": telegramID,
|
|
|
- "telegramUsername": username,
|
|
|
- }
|
|
|
+ record, err := redPacketService.GrabRedPacket(
|
|
|
+ packetNo,
|
|
|
+ 0, // Telegram用户暂无平台userId
|
|
|
+ telegramID,
|
|
|
+ username,
|
|
|
+ )
|
|
|
|
|
|
- jsonData, _ := json.Marshal(payload)
|
|
|
-
|
|
|
- req, err := http.NewRequest("POST", apiURL, strings.NewReader(string(jsonData)))
|
|
|
- if err != nil {
|
|
|
- return false, 0, "系统错误"
|
|
|
- }
|
|
|
-
|
|
|
- req.Header.Set("Content-Type", "application/json")
|
|
|
- // TODO: 添加 JWT Token
|
|
|
- // req.Header.Set("Authorization", "Bearer "+token)
|
|
|
-
|
|
|
- client := &http.Client{}
|
|
|
- resp, err := client.Do(req)
|
|
|
if err != nil {
|
|
|
- return false, 0, "网络错误"
|
|
|
+ answerCallback(callback.ID, err.Error())
|
|
|
+ core.Log.Infof("抢红包 - 用户: %s, 红包: %s, 结果: %s",
|
|
|
+ username, packetNo, err.Error())
|
|
|
+ return
|
|
|
}
|
|
|
- defer resp.Body.Close()
|
|
|
|
|
|
- body, _ := io.ReadAll(resp.Body)
|
|
|
+ // 抢到红包
|
|
|
+ amount := record.Amount.InexactFloat64()
|
|
|
+ answerCallback(callback.ID, fmt.Sprintf("🎉 恭喜抢到 %.2f VND!", amount))
|
|
|
|
|
|
- var result map[string]interface{}
|
|
|
- json.Unmarshal(body, &result)
|
|
|
-
|
|
|
- if resp.StatusCode == 200 {
|
|
|
- data := result["data"].(map[string]interface{})
|
|
|
- amount := data["amount"].(float64)
|
|
|
- return true, amount, "抢红包成功"
|
|
|
- }
|
|
|
+ // 更新原消息
|
|
|
+ editText := fmt.Sprintf("%s\n\n✅ @%s 抢到了 %.2f VND",
|
|
|
+ callback.Message.Text, username, amount)
|
|
|
+ editMessage(callback.Message.Chat.ID, callback.Message.MessageID, editText)
|
|
|
|
|
|
- message := result["message"].(string)
|
|
|
- return false, 0, message
|
|
|
+ core.Log.Infof("抢红包 - 用户: %s, 红包: %s, 金额: %s, 结果: 成功",
|
|
|
+ username, packetNo, record.Amount.String())
|
|
|
}
|