feat: 积分质押功能
This commit is contained in:
126
internal/svc/game_action.go
Normal file
126
internal/svc/game_action.go
Normal file
@@ -0,0 +1,126 @@
|
||||
package svc
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"database/sql"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"github.com/spf13/cast"
|
||||
"github.com/zeromicro/go-zero/core/logx"
|
||||
"io"
|
||||
"math"
|
||||
"net/http"
|
||||
"nova_task/internal/model"
|
||||
"nova_task/internal/pkg/encrypt/md5"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
// GetGameServerAddress 获取游戏服地址
|
||||
func (s *ServiceContext) GetGameServerAddress(ctx context.Context, roleID int64) (string, map[string]any, error) {
|
||||
agentIDServerID := math.Floor(float64(roleID)/100000000) / 100000
|
||||
splitStr := cast.ToString(agentIDServerID)
|
||||
splitParts := []string{"0", "0"}
|
||||
if parts := strings.Split(splitStr, "."); len(parts) == 2 {
|
||||
splitParts = parts
|
||||
}
|
||||
serverInfo := map[string]any{}
|
||||
originalAgentID, _ := strconv.ParseInt(splitParts[0], 10, 64)
|
||||
originalServerID, _ := strconv.ParseInt(splitParts[1], 10, 64)
|
||||
serverInfo["original_agent_id"] = originalAgentID
|
||||
serverInfo["original_server_id"] = originalServerID
|
||||
agentId, serverServerId, err := s.MergeServerModel.FinalServer(ctx, originalAgentID, originalServerID)
|
||||
if err != nil {
|
||||
return "", serverInfo, err
|
||||
}
|
||||
serverInfo["agent_id"] = agentId
|
||||
serverInfo["server_id"] = serverServerId
|
||||
gs, err := s.ServersModel.GetGameServer(ctx, agentId, serverServerId)
|
||||
if err != nil {
|
||||
return "", serverInfo, err
|
||||
}
|
||||
|
||||
serverInfo["web_port"] = gs.WebPort
|
||||
serverInfo["server_ip"] = gs.ServerIP
|
||||
serverInfo["public_server_ip"] = gs.PublicServerIP
|
||||
|
||||
return fmt.Sprintf("http://%s:%d", gs.PublicServerIP, gs.WebPort), serverInfo, nil
|
||||
}
|
||||
|
||||
func (s *ServiceContext) GameAction(ctx context.Context, roleId int64, action string, args map[string]any) (any, error) {
|
||||
//return map[string]any{
|
||||
// "data": 1,
|
||||
// "ret": 1,
|
||||
//}, nil
|
||||
addr, serverInfo, err := s.GetGameServerAddress(ctx, roleId)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
now := time.Now().Unix()
|
||||
request := map[string]any{
|
||||
"nova_time": now,
|
||||
"nova_token": md5.Md5str(fmt.Sprintf("%d%s", now, s.Config.NovaToken)),
|
||||
"nova_action": action,
|
||||
"role_id": roleId,
|
||||
}
|
||||
|
||||
for k, v := range args {
|
||||
if _, ok := request[k]; ok {
|
||||
continue
|
||||
}
|
||||
request[k] = v
|
||||
}
|
||||
|
||||
data, _ := json.Marshal(request)
|
||||
|
||||
httpReq, err := http.NewRequest(http.MethodPost, addr, bytes.NewReader(data))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
httpReq.Header.Set("Content-Type", "application/json")
|
||||
httpReq.Header.Set("Accept", "application/json")
|
||||
httpResp, err := http.DefaultClient.Do(httpReq)
|
||||
if err != nil {
|
||||
s.ErrLog(ctx, action, addr, serverInfo, request, nil)
|
||||
return nil, err
|
||||
}
|
||||
respData, _ := io.ReadAll(httpResp.Body)
|
||||
resp := map[string]any{}
|
||||
if err := json.Unmarshal(respData, &resp); err != nil {
|
||||
s.ErrLog(ctx, action, addr, serverInfo, request, string(respData))
|
||||
return nil, err
|
||||
}
|
||||
if cast.ToInt64(resp["ret"]) != 1 {
|
||||
s.ErrLog(ctx, action, addr, serverInfo, request, resp)
|
||||
return resp, fmt.Errorf("game action msg= %s, data=%v", cast.ToString(resp["msg"]), cast.ToString(resp["data"]))
|
||||
}
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
func (s *ServiceContext) ErrLog(ctx context.Context, action, url string, serverInfo, req, resp any) {
|
||||
var marshal = func(v any) string {
|
||||
if v == nil {
|
||||
return ""
|
||||
}
|
||||
if vv, ok := v.(string); ok {
|
||||
return vv
|
||||
}
|
||||
data, _ := json.Marshal(v)
|
||||
return string(data)
|
||||
}
|
||||
_, err := s.RequestServerLogModel.Insert(ctx, &model.NhRequestServerLog{
|
||||
Action: action,
|
||||
Url: url,
|
||||
ServerInfo: marshal(serverInfo),
|
||||
ReqData: marshal(req),
|
||||
ResData: marshal(resp),
|
||||
CreateTime: sql.NullTime{Valid: true, Time: time.Now()},
|
||||
})
|
||||
if err != nil {
|
||||
logx.Errorw("insert request server log error", logx.Field("err", err), logx.Field("action", action), logx.Field("url", url), logx.Field("server_info", serverInfo), logx.Field("req", req), logx.Field("resp", resp))
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user