2025-08-21 17:37:09 +08:00

119 lines
2.9 KiB
Go

package smdl
import (
"admin/apps/game/domain/entity"
"admin/internal/errcode"
"admin/internal/model/dto"
"admin/lib/httpclient"
"admin/lib/xlog"
"encoding/json"
"math"
"net/url"
"strconv"
"time"
)
type itemsCacher struct {
list []*dto.CommonDtoFieldChoice
mapItems map[int]*dto.ItemInfo
getTime time.Time
}
var itemsCache *itemsCacher
type Items struct {
}
func (items *Items) GetItems(projectInfo *entity.Project) ([]*dto.CommonDtoFieldChoice, error) {
//return []*dto.CommonDtoFieldChoice{
// {Desc: "黄金战甲", Value: 123, Type: 1},
// {Desc: "黄金头盔", Value: 234, Type: 1},
// {Desc: "黄金大刀", Value: 346, Type: 1},
// {Desc: "白银大刀", Value: 346, Type: 1},
//}, nil
if itemsCache != nil && time.Now().Sub(itemsCache.getTime) < time.Minute {
// 小于1分钟就不拉了
return itemsCache.list, nil
}
alisrvAddr := projectInfo.GetApiAddr()
if alisrvAddr == "" {
return nil, errcode.New(errcode.ServerError, "项目%v没有配置api服务器地址", projectInfo.Po.Name)
}
type RspData struct {
Code int `json:"code"`
Msg string `json:"msg"`
Data struct {
List []*dto.CommonDtoFieldChoice `json:"list"`
} `json:"data"`
}
rsp := &RspData{}
err := httpclient.Request(alisrvAddr+"/items", "get", nil, rsp)
if err != nil {
return make([]*dto.CommonDtoFieldChoice, 0), nil
}
itemsCache = &itemsCacher{
list: rsp.Data.List,
mapItems: make(map[int]*dto.ItemInfo),
getTime: time.Now(),
}
for _, v := range rsp.Data.List {
itemInfo := &dto.ItemInfo{
ItemID: int(v.Value.(float64)),
ItemNum: 0,
Desc: v.Desc,
}
itemsCache.mapItems[itemInfo.ItemID] = itemInfo
}
return rsp.Data.List, nil
}
func (items *Items) ChangeRoleItem(projectInfo *entity.Project, serverId, roleId string, itemId int32, itemNum int64) error {
alisrvAddr := projectInfo.GetApiAddr()
if alisrvAddr == "" {
return errcode.New(errcode.ServerError, "项目%v没有配置api服务器地址", projectInfo.Po.Name)
}
if itemNum == 0 {
xlog.Warnf("change role item:%v,%v,%v,%v num invalid", serverId, roleId, itemId, itemNum)
return nil
}
// http://127.0.0.1:12007/GM?cmd_data=addItem&roleid=20007000171&itemsn=14201093&itemnum=1&isbind=true
params := &url.Values{}
params.Set("cmd_data", "addItem")
params.Add("roleid", roleId)
params.Add("server", serverId)
params.Set("itemsn", strconv.Itoa(int(itemId)))
params.Set("itemnum", strconv.FormatInt(int64(math.Abs(float64(itemNum))), 10))
params.Set("isbind", "true")
if itemNum < 0 {
params.Set("deduct", "true")
}
rsp := make(map[string]any)
err := httpclient.Request(alisrvAddr+"/gm", "get", params, &rsp)
if err != nil {
return err
}
rBin, _ := json.Marshal(&rsp)
xlog.Debugf("rsp:%v", string(rBin))
codeI, find := rsp["code"]
if find {
code := codeI.(float64)
if code != 0 {
msg := rsp["msg"].(string)
return errcode.New(errcode.ParamsInvalid, "游戏服返回:%v", msg)
}
}
return nil
}