211 lines
5.0 KiB
Go
211 lines
5.0 KiB
Go
package handler
|
||
|
||
import (
|
||
"errors"
|
||
"fmt"
|
||
"github.com/rabbitmq/amqp091-go"
|
||
"samba/pkg/log"
|
||
"samba/pkg/xtime"
|
||
"samba/proto"
|
||
"samba/server/other/code"
|
||
"samba/stub"
|
||
"samba/util/model"
|
||
"samba/util/routingKey"
|
||
"samba/util/util"
|
||
"time"
|
||
)
|
||
|
||
// onReqGenerateCode 生成兑换码
|
||
func onReqGenerateCode(d *amqp091.Delivery, msg map[string]any) {
|
||
_, _, _, data := ParseMsg(msg)
|
||
req, err := util.MapToStructT[proto.ReqGenerateCode](data)
|
||
if err != nil {
|
||
log.Error(err.Error())
|
||
return
|
||
}
|
||
rule := model.Rule(req.Rule)
|
||
r := &model.RedeemCode{
|
||
Code: req.Code,
|
||
StartTime: xtime.TimestampToTime(req.StartTime).StdTime(),
|
||
EndTime: xtime.TimestampToTime(req.EndTime).StdTime(),
|
||
Count: req.Count,
|
||
Item: (*model.Items)(&req.Item),
|
||
Rule: &rule,
|
||
CreateTime: xtime.Now().StdTime(),
|
||
}
|
||
|
||
rsp := &proto.RspGenerateCode{}
|
||
|
||
err = code.CodeManager.AddCode(r)
|
||
if err != nil {
|
||
rsp.Code = util.TieOrFn(errors.Is(err, code.ErrCodeIsExists), proto.CodeIsExist, func() proto.ErrorCode {
|
||
log.Error(err.Error())
|
||
return proto.Internal
|
||
})
|
||
rsp.Msg = err.Error()
|
||
}
|
||
|
||
SendMsgToRPC(d, rsp, "onReqGenerateCode")
|
||
|
||
}
|
||
|
||
// 使用兑换码
|
||
func onReqUseCode(_ *amqp091.Delivery, msg map[string]any) {
|
||
_, _, uid, data := ParseMsg(msg)
|
||
req, err := util.MapToStructT[proto.ReqUseCode](data)
|
||
if err != nil {
|
||
log.Error(err.Error())
|
||
return
|
||
}
|
||
|
||
c, err := code.CodeManager.GetCode(req.Code)
|
||
if err != nil {
|
||
SendMsgToGate(uid, proto.RspUseCodeId, proto.RspUseCode{Code: proto.CodeIsInValid})
|
||
log.Error(err.Error())
|
||
return
|
||
}
|
||
err = code.CodeManager.UseCode(uid, c)
|
||
if err != nil {
|
||
SendMsgToGate(uid, proto.RspUseCodeId, proto.RspUseCode{
|
||
Code: util.Tie(errors.Is(err, code.ErrCodeIsUsed), proto.CodeIsUsed, proto.CodeIsInValid),
|
||
})
|
||
log.Error(err.Error())
|
||
return
|
||
}
|
||
// TODO 根据Item发放奖励
|
||
|
||
items := make(map[stub.ItemId]int64, len(*c.Item))
|
||
for it, count := range *c.Item {
|
||
item := stub.ItemId(it)
|
||
switch item {
|
||
case stub.Coin, stub.ClubCoins, stub.Diamonds:
|
||
items[item] = int64(count)
|
||
default:
|
||
log.Error(fmt.Sprintf("奖励发放失败,未知item=%d code=%s uid=%d", it, req.Code, uid))
|
||
}
|
||
}
|
||
|
||
addResource(uid, items)
|
||
|
||
}
|
||
|
||
// 兑换码使用查询
|
||
func onReqCodeUseQuery(d *amqp091.Delivery, msg map[string]any) {
|
||
_, _, _, data := ParseMsg(msg)
|
||
var err error
|
||
req, err := util.MapToStructT[proto.ReqCodeUseQuery](data)
|
||
if err != nil {
|
||
log.Error(err.Error())
|
||
return
|
||
}
|
||
defer func() {
|
||
if err != nil {
|
||
SendMsgToRPC(d, proto.RspCodeUseQuery{Code: proto.Internal, Msg: err.Error()}, "onReqCodeUseQuery")
|
||
}
|
||
}()
|
||
cs, err := model.NewRedeemCodeOp().GetList(req.Limit, req.Offset)
|
||
if err != nil {
|
||
return
|
||
}
|
||
count, err := model.NewRedeemCodeOp().Count()
|
||
if err != nil {
|
||
return
|
||
}
|
||
|
||
uses := make([]proto.CodeUse, 0, len(cs))
|
||
now := xtime.Now().StdTime()
|
||
op := model.NewRedeemCodeUseRecordOp()
|
||
for _, c := range cs {
|
||
var count int64
|
||
count, err = op.CodeUsedCount(c.Code)
|
||
if err != nil {
|
||
return
|
||
}
|
||
uses = append(uses, proto.CodeUse{
|
||
Code: c.Code,
|
||
Count: c.Count,
|
||
Item: *c.Item,
|
||
Status: util.TieOrFn(xtime.IsInDuration(now, c.StartTime, c.EndTime), 2, func() int {
|
||
return util.Tie(xtime.IsAfter(c.StartTime, now), 1, 3)
|
||
}),
|
||
UsedCount: int(count),
|
||
ValidDuration: xtime.FormatDuration(c.StartTime, c.EndTime, time.DateTime),
|
||
CreateTime: xtime.ConvertToCarbon(c.CreateTime).Timestamp(),
|
||
})
|
||
}
|
||
|
||
SendMsgToRPC(d, proto.RspCodeUseQuery{
|
||
CodeUse: uses,
|
||
Count: count,
|
||
}, "onReqCodeUseQuery")
|
||
|
||
}
|
||
|
||
// 兑换玩家信息查询
|
||
func onReqCodeUsePlayerQuery(d *amqp091.Delivery, msg map[string]any) {
|
||
_, _, _, data := ParseMsg(msg)
|
||
var err error
|
||
req, err := util.MapToStructT[proto.ReqCodeUsePlayerQuery](data)
|
||
if err != nil {
|
||
log.Error(err.Error())
|
||
return
|
||
}
|
||
defer func() {
|
||
if err != nil {
|
||
SendMsgToRPC(d, proto.RspCodeUsePlayerQuery{Code: proto.Internal, Msg: err.Error()}, "onReqCodeUsePlayerQuery")
|
||
}
|
||
}()
|
||
|
||
rc, err := model.NewRedeemCodeOp().Get(req.Code)
|
||
if err != nil {
|
||
return
|
||
}
|
||
op := model.NewRedeemCodeUseRecordOp()
|
||
|
||
cs, err := op.GetByCode(req.Code, req.Limit, req.Offset)
|
||
if err != nil {
|
||
return
|
||
}
|
||
count, err := op.CountByCode(req.Code)
|
||
if err != nil {
|
||
return
|
||
}
|
||
uses := make([]proto.CodeUsePlayer, 0, len(cs))
|
||
for _, c := range cs {
|
||
uses = append(uses, proto.CodeUsePlayer{
|
||
Code: c.Code,
|
||
Item: *rc.Item,
|
||
MNick: c.MNick,
|
||
MTime: c.MTime,
|
||
Uid: c.Uid,
|
||
UseTime: c.UseTime.Unix(),
|
||
Api: c.API,
|
||
})
|
||
}
|
||
SendMsgToRPC(d, proto.RspCodeUsePlayerQuery{
|
||
Count: count,
|
||
CodeUsePlayer: uses,
|
||
}, "onReqCodeUsePlayerQuery")
|
||
}
|
||
|
||
func addResource(uid int64, items map[stub.ItemId]int64) {
|
||
|
||
req := proto.ReqBatchAddResource{
|
||
UserId: uid,
|
||
ReqResources: make([]proto.ReqAddResource, 0, len(items)),
|
||
IsNotify: true,
|
||
}
|
||
|
||
for id, count := range items {
|
||
req.ReqResources = append(req.ReqResources, proto.ReqAddResource{
|
||
UserId: uid,
|
||
ResValue: count,
|
||
ResType: model.ItemIdToRes(id),
|
||
Reason: "code",
|
||
IsNotify: true,
|
||
})
|
||
}
|
||
|
||
SendMsgToDb(routingKey.DbKey(uid), uid, proto.ReqBatchAddResourceId, req)
|
||
}
|