优化代码

This commit is contained in:
flswld
2023-02-18 22:09:59 +08:00
parent 21fb9d400f
commit e580baeb46
37 changed files with 198 additions and 118 deletions

View File

@@ -2,6 +2,7 @@
client_proto_proxy_enable = false client_proto_proxy_enable = false
game_data_config_path = "./game_data_config" game_data_config_path = "./game_data_config"
gacha_history_server = "https://hk4e.flswld.com/api/v1" gacha_history_server = "https://hk4e.flswld.com/api/v1"
load_scene_lua_config = true # 是否加载场景详情LUA配置数据
[logger] [logger]
level = "DEBUG" level = "DEBUG"

View File

@@ -46,7 +46,8 @@ type Hk4e struct {
Version string `toml:"version"` // 支持的客户端协议版本号 三位数字 多个以逗号分隔 如300,310,320 Version string `toml:"version"` // 支持的客户端协议版本号 三位数字 多个以逗号分隔 如300,310,320
GateTcpMqAddr string `toml:"gate_tcp_mq_addr"` // 访问网关tcp直连消息队列的地址 填网关的内网地址 GateTcpMqAddr string `toml:"gate_tcp_mq_addr"` // 访问网关tcp直连消息队列的地址 填网关的内网地址
GateTcpMqPort int32 `toml:"gate_tcp_mq_port"` GateTcpMqPort int32 `toml:"gate_tcp_mq_port"`
LoginSdkUrl string `toml:"login_sdk_url"` // 网关登录验证token的sdk服务器地址 目前填dispatch的内网地址 LoginSdkUrl string `toml:"login_sdk_url"` // 网关登录验证token的sdk服务器地址 目前填dispatch的内网地址
LoadSceneLuaConfig bool `toml:"load_scene_lua_config"` // 是否加载场景详情LUA配置数据
} }
// MQ 消息队列 // MQ 消息队列
@@ -59,6 +60,10 @@ func InitConfig(filePath string) {
CONF.loadConfigFile(filePath) CONF.loadConfigFile(filePath)
} }
func GetConfig() *Config {
return CONF
}
// 加载配置文件 // 加载配置文件
func (c *Config) loadConfigFile(filePath string) { func (c *Config) loadConfigFile(filePath string) {
_, err := toml.DecodeFile(filePath, &c) _, err := toml.DecodeFile(filePath, &c)

View File

@@ -41,7 +41,7 @@ type MessageQueue struct {
func NewMessageQueue(serverType string, appId string, rpcClient *rpc.Client) (r *MessageQueue) { func NewMessageQueue(serverType string, appId string, rpcClient *rpc.Client) (r *MessageQueue) {
r = new(MessageQueue) r = new(MessageQueue)
conn, err := nats.Connect(config.CONF.MQ.NatsUrl) conn, err := nats.Connect(config.GetConfig().MQ.NatsUrl)
if err != nil { if err != nil {
logger.Error("connect nats error: %v", err) logger.Error("connect nats error: %v", err)
return nil return nil
@@ -247,7 +247,7 @@ type GateTcpMqEvent struct {
} }
func (m *MessageQueue) runGateTcpMqServer() { func (m *MessageQueue) runGateTcpMqServer() {
addr, err := net.ResolveTCPAddr("tcp4", "0.0.0.0:"+strconv.Itoa(int(config.CONF.Hk4e.GateTcpMqPort))) addr, err := net.ResolveTCPAddr("tcp4", "0.0.0.0:"+strconv.Itoa(int(config.GetConfig().Hk4e.GateTcpMqPort)))
if err != nil { if err != nil {
logger.Error("gate tcp mq parse port error: %v", err) logger.Error("gate tcp mq parse port error: %v", err)
return return

View File

@@ -19,7 +19,7 @@ type Client struct {
// NewClient 构造 // NewClient 构造
func NewClient() (*Client, error) { func NewClient() (*Client, error) {
r := new(Client) r := new(Client)
conn, err := nats.Connect(config.CONF.MQ.NatsUrl) conn, err := nats.Connect(config.GetConfig().MQ.NatsUrl)
if err != nil { if err != nil {
return nil, err return nil, err
} }

View File

@@ -9,7 +9,7 @@ import (
) )
func UnmarshalProtoObj(serverProtoObj pb.Message, clientProtoObj pb.Message, data []byte) bool { func UnmarshalProtoObj(serverProtoObj pb.Message, clientProtoObj pb.Message, data []byte) bool {
if config.CONF.Hk4e.ClientProtoProxyEnable { if config.GetConfig().Hk4e.ClientProtoProxyEnable {
err := pb.Unmarshal(data, clientProtoObj) err := pb.Unmarshal(data, clientProtoObj)
if err != nil { if err != nil {
logger.Error("parse client proto obj error: %v", err) logger.Error("parse client proto obj error: %v", err)

View File

@@ -6,7 +6,6 @@ import (
"os" "os"
"os/signal" "os/signal"
"syscall" "syscall"
"time"
"hk4e/common/config" "hk4e/common/config"
"hk4e/common/rpc" "hk4e/common/rpc"
@@ -20,6 +19,9 @@ func Run(ctx context.Context, configFile string) error {
logger.InitLogger("dispatch") logger.InitLogger("dispatch")
logger.Warn("dispatch start") logger.Warn("dispatch start")
defer func() {
logger.CloseLogger()
}()
db := dao.NewDao() db := dao.NewDao()
defer db.CloseDao() defer db.CloseDao()
@@ -43,8 +45,6 @@ func Run(ctx context.Context, configFile string) error {
switch s { switch s {
case syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT: case syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT:
logger.Warn("dispatch exit") logger.Warn("dispatch exit")
time.Sleep(time.Second)
return nil return nil
case syscall.SIGHUP: case syscall.SIGHUP:
default: default:

View File

@@ -60,7 +60,7 @@ func (c *Controller) authorize() gin.HandlerFunc {
} }
func (c *Controller) registerRouter() { func (c *Controller) registerRouter() {
if config.CONF.Logger.Level == "DEBUG" { if config.GetConfig().Logger.Level == "DEBUG" {
gin.SetMode(gin.DebugMode) gin.SetMode(gin.DebugMode)
} else { } else {
gin.SetMode(gin.ReleaseMode) gin.SetMode(gin.ReleaseMode)
@@ -138,7 +138,7 @@ func (c *Controller) registerRouter() {
engine.Use(c.authorize()) engine.Use(c.authorize())
engine.POST("/gate/token/verify", c.gateTokenVerify) engine.POST("/gate/token/verify", c.gateTokenVerify)
engine.POST("/gate/token/reset", c.gateTokenReset) engine.POST("/gate/token/reset", c.gateTokenReset)
port := config.CONF.HttpPort port := config.GetConfig().HttpPort
addr := ":" + strconv.Itoa(int(port)) addr := ":" + strconv.Itoa(int(port))
err := engine.Run(addr) err := engine.Run(addr)
if err != nil { if err != nil {

View File

@@ -20,7 +20,7 @@ type Dao struct {
func NewDao() (r *Dao) { func NewDao() (r *Dao) {
r = new(Dao) r = new(Dao)
clientOptions := options.Client().ApplyURI(config.CONF.Database.Url).SetMinPoolSize(10).SetMaxPoolSize(100) clientOptions := options.Client().ApplyURI(config.GetConfig().Database.Url).SetMinPoolSize(10).SetMaxPoolSize(100)
client, err := mongo.Connect(context.TODO(), clientOptions) client, err := mongo.Connect(context.TODO(), clientOptions)
if err != nil { if err != nil {
logger.Error("mongo connect error: %v", err) logger.Error("mongo connect error: %v", err)
@@ -34,8 +34,8 @@ func NewDao() (r *Dao) {
r.mongo = client r.mongo = client
r.db = client.Database("dispatch_hk4e") r.db = client.Database("dispatch_hk4e")
r.redis = redis.NewClient(&redis.Options{ r.redis = redis.NewClient(&redis.Options{
Addr: config.CONF.Redis.Addr, Addr: config.GetConfig().Redis.Addr,
Password: config.CONF.Redis.Password, Password: config.GetConfig().Redis.Password,
DB: 0, DB: 0,
PoolSize: 10, PoolSize: 10,
MinIdleConns: 1, MinIdleConns: 1,

View File

@@ -4,6 +4,8 @@ services:
restart: always restart: always
image: flswld/node:1.0.0 image: flswld/node:1.0.0
container_name: node container_name: node
ports:
- "1234:1234/tcp"
environment: environment:
TZ: Asia/Shanghai TZ: Asia/Shanghai
GOLANG_PROTOBUF_REGISTRATION_CONFLICT: ignore GOLANG_PROTOBUF_REGISTRATION_CONFLICT: ignore
@@ -23,6 +25,7 @@ services:
container_name: dispatch container_name: dispatch
ports: ports:
- "8080:8080/tcp" - "8080:8080/tcp"
- "2345:2345/tcp"
environment: environment:
TZ: Asia/Shanghai TZ: Asia/Shanghai
GOLANG_PROTOBUF_REGISTRATION_CONFLICT: ignore GOLANG_PROTOBUF_REGISTRATION_CONFLICT: ignore
@@ -47,6 +50,7 @@ services:
ports: ports:
- "22222:22222/udp" - "22222:22222/udp"
- "33333:33333/tcp" - "33333:33333/tcp"
- "3456:3456/tcp"
environment: environment:
TZ: Asia/Shanghai TZ: Asia/Shanghai
GOLANG_PROTOBUF_REGISTRATION_CONFLICT: ignore GOLANG_PROTOBUF_REGISTRATION_CONFLICT: ignore
@@ -67,6 +71,8 @@ services:
restart: always restart: always
image: flswld/fight:1.0.0 image: flswld/fight:1.0.0
container_name: fight container_name: fight
ports:
- "5678:5678/tcp"
environment: environment:
TZ: Asia/Shanghai TZ: Asia/Shanghai
GOLANG_PROTOBUF_REGISTRATION_CONFLICT: ignore GOLANG_PROTOBUF_REGISTRATION_CONFLICT: ignore
@@ -86,6 +92,8 @@ services:
restart: always restart: always
image: flswld/pathfinding:1.0.0 image: flswld/pathfinding:1.0.0
container_name: pathfinding container_name: pathfinding
ports:
- "6789:6789/tcp"
environment: environment:
TZ: Asia/Shanghai TZ: Asia/Shanghai
GOLANG_PROTOBUF_REGISTRATION_CONFLICT: ignore GOLANG_PROTOBUF_REGISTRATION_CONFLICT: ignore
@@ -105,6 +113,8 @@ services:
restart: always restart: always
image: flswld/gs:1.0.0 image: flswld/gs:1.0.0
container_name: gs container_name: gs
ports:
- "4567:4567/tcp"
environment: environment:
TZ: Asia/Shanghai TZ: Asia/Shanghai
GOLANG_PROTOBUF_REGISTRATION_CONFLICT: ignore GOLANG_PROTOBUF_REGISTRATION_CONFLICT: ignore
@@ -127,6 +137,7 @@ services:
container_name: gm container_name: gm
ports: ports:
- "9001:9001/tcp" - "9001:9001/tcp"
- "7890:7890/tcp"
environment: environment:
TZ: Asia/Shanghai TZ: Asia/Shanghai
GOLANG_PROTOBUF_REGISTRATION_CONFLICT: ignore GOLANG_PROTOBUF_REGISTRATION_CONFLICT: ignore

View File

@@ -57,6 +57,9 @@ func Run(ctx context.Context, configFile string) error {
logger.InitLogger("fight_" + APPID) logger.InitLogger("fight_" + APPID)
logger.Warn("fight start, appid: %v", APPID) logger.Warn("fight start, appid: %v", APPID)
defer func() {
logger.CloseLogger()
}()
messageQueue := mq.NewMessageQueue(api.FIGHT, APPID, client) messageQueue := mq.NewMessageQueue(api.FIGHT, APPID, client)
defer messageQueue.Close() defer messageQueue.Close()
@@ -74,7 +77,6 @@ func Run(ctx context.Context, configFile string) error {
switch s { switch s {
case syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT: case syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT:
logger.Warn("fight exit, appid: %v", APPID) logger.Warn("fight exit, appid: %v", APPID)
time.Sleep(time.Second)
return nil return nil
case syscall.SIGHUP: case syscall.SIGHUP:
default: default:

View File

@@ -228,7 +228,7 @@ func (f *FightRoutine) attackHandle(gameMsg *mq.GameMsg) {
continue continue
} }
hitInfo := new(proto.EvtBeingHitInfo) hitInfo := new(proto.EvtBeingHitInfo)
if config.CONF.Hk4e.ClientProtoProxyEnable { if config.GetConfig().Hk4e.ClientProtoProxyEnable {
clientProtoObj := GetClientProtoObjByName("EvtBeingHitInfo") clientProtoObj := GetClientProtoObjByName("EvtBeingHitInfo")
if clientProtoObj == nil { if clientProtoObj == nil {
logger.Error("get client proto obj is nil") logger.Error("get client proto obj is nil")
@@ -303,7 +303,7 @@ func (f *FightRoutine) getAllPlayer(entityMap map[uint32]*Entity) []uint32 {
var ClientCmdProtoMap *client_proto.ClientCmdProtoMap var ClientCmdProtoMap *client_proto.ClientCmdProtoMap
func initClientCmdProtoMap() { func initClientCmdProtoMap() {
if config.CONF.Hk4e.ClientProtoProxyEnable { if config.GetConfig().Hk4e.ClientProtoProxyEnable {
ClientCmdProtoMap = client_proto.NewClientCmdProtoMap() ClientCmdProtoMap = client_proto.NewClientCmdProtoMap()
} }
} }

View File

@@ -33,12 +33,12 @@ func Run(ctx context.Context, configFile string) error {
rsp, err := client.Discovery.RegisterServer(context.TODO(), &api.RegisterServerReq{ rsp, err := client.Discovery.RegisterServer(context.TODO(), &api.RegisterServerReq{
ServerType: api.GATE, ServerType: api.GATE,
GateServerAddr: &api.GateServerAddr{ GateServerAddr: &api.GateServerAddr{
KcpAddr: config.CONF.Hk4e.KcpAddr, KcpAddr: config.GetConfig().Hk4e.KcpAddr,
KcpPort: uint32(config.CONF.Hk4e.KcpPort), KcpPort: uint32(config.GetConfig().Hk4e.KcpPort),
MqAddr: config.CONF.Hk4e.GateTcpMqAddr, MqAddr: config.GetConfig().Hk4e.GateTcpMqAddr,
MqPort: uint32(config.CONF.Hk4e.GateTcpMqPort), MqPort: uint32(config.GetConfig().Hk4e.GateTcpMqPort),
}, },
Version: strings.Split(config.CONF.Hk4e.Version, ","), Version: strings.Split(config.GetConfig().Hk4e.Version, ","),
}) })
if err != nil { if err != nil {
return err return err
@@ -67,6 +67,9 @@ func Run(ctx context.Context, configFile string) error {
logger.InitLogger("gate_" + APPID) logger.InitLogger("gate_" + APPID)
logger.Warn("gate start, appid: %v", APPID) logger.Warn("gate start, appid: %v", APPID)
defer func() {
logger.CloseLogger()
}()
messageQueue := mq.NewMessageQueue(api.GATE, APPID, client) messageQueue := mq.NewMessageQueue(api.GATE, APPID, client)
defer messageQueue.Close() defer messageQueue.Close()
@@ -93,7 +96,6 @@ func Run(ctx context.Context, configFile string) error {
switch s { switch s {
case syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT: case syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT:
logger.Warn("gate exit, appid: %v", APPID) logger.Warn("gate exit, appid: %v", APPID)
time.Sleep(time.Second)
return nil return nil
case syscall.SIGHUP: case syscall.SIGHUP:
default: default:

View File

@@ -73,7 +73,7 @@ func NewKcpConnectManager(messageQueue *mq.MessageQueue, discovery *rpc.Discover
r.kcpEventOutput = make(chan *KcpEvent, 1000) r.kcpEventOutput = make(chan *KcpEvent, 1000)
r.reLoginRemoteKickRegChan = make(chan *RemoteKick, 1000) r.reLoginRemoteKickRegChan = make(chan *RemoteKick, 1000)
r.serverCmdProtoMap = cmd.NewCmdProtoMap() r.serverCmdProtoMap = cmd.NewCmdProtoMap()
if config.CONF.Hk4e.ClientProtoProxyEnable { if config.GetConfig().Hk4e.ClientProtoProxyEnable {
r.clientCmdProtoMap = client_proto.NewClientCmdProtoMap() r.clientCmdProtoMap = client_proto.NewClientCmdProtoMap()
} }
r.messageQueue = messageQueue r.messageQueue = messageQueue
@@ -100,7 +100,7 @@ func (k *KcpConnectManager) run() {
regionEc2b.SetSeed(ec2b.Seed()) regionEc2b.SetSeed(ec2b.Seed())
k.dispatchKey = regionEc2b.XorKey() k.dispatchKey = regionEc2b.XorKey()
// kcp // kcp
port := strconv.Itoa(int(config.CONF.Hk4e.KcpPort)) port := strconv.Itoa(int(config.GetConfig().Hk4e.KcpPort))
listener, err := kcp.ListenWithOptions("0.0.0.0:" + port) listener, err := kcp.ListenWithOptions("0.0.0.0:" + port)
if err != nil { if err != nil {
logger.Error("listen kcp err: %v", err) logger.Error("listen kcp err: %v", err)

View File

@@ -28,7 +28,7 @@ type ProtoMessage struct {
func ProtoDecode(kcpMsg *KcpMsg, func ProtoDecode(kcpMsg *KcpMsg,
serverCmdProtoMap *cmd.CmdProtoMap, clientCmdProtoMap *client_proto.ClientCmdProtoMap) (protoMsgList []*ProtoMsg) { serverCmdProtoMap *cmd.CmdProtoMap, clientCmdProtoMap *client_proto.ClientCmdProtoMap) (protoMsgList []*ProtoMsg) {
protoMsgList = make([]*ProtoMsg, 0) protoMsgList = make([]*ProtoMsg, 0)
if config.CONF.Hk4e.ClientProtoProxyEnable { if config.GetConfig().Hk4e.ClientProtoProxyEnable {
clientCmdId := kcpMsg.CmdId clientCmdId := kcpMsg.CmdId
clientProtoData := kcpMsg.ProtoData clientProtoData := kcpMsg.ProtoData
cmdName := clientCmdProtoMap.GetClientCmdNameByCmdId(clientCmdId) cmdName := clientCmdProtoMap.GetClientCmdNameByCmdId(clientCmdId)
@@ -139,7 +139,7 @@ func ProtoDecodePayloadLoop(cmdId uint16, protoData []byte, protoMessageList *[]
return return
} }
for _, unionCmd := range unionCmdNotify.GetCmdList() { for _, unionCmd := range unionCmdNotify.GetCmdList() {
if config.CONF.Hk4e.ClientProtoProxyEnable { if config.GetConfig().Hk4e.ClientProtoProxyEnable {
clientCmdId := uint16(unionCmd.MessageId) clientCmdId := uint16(unionCmd.MessageId)
clientProtoData := unionCmd.Body clientProtoData := unionCmd.Body
cmdName := clientCmdProtoMap.GetClientCmdNameByCmdId(clientCmdId) cmdName := clientCmdProtoMap.GetClientCmdNameByCmdId(clientCmdId)
@@ -231,7 +231,7 @@ func ProtoEncode(protoMsg *ProtoMsg,
} else { } else {
kcpMsg.ProtoData = nil kcpMsg.ProtoData = nil
} }
if config.CONF.Hk4e.ClientProtoProxyEnable { if config.GetConfig().Hk4e.ClientProtoProxyEnable {
serverCmdId := kcpMsg.CmdId serverCmdId := kcpMsg.CmdId
serverProtoData := kcpMsg.ProtoData serverProtoData := kcpMsg.ProtoData
serverProtoObj := serverCmdProtoMap.GetProtoObjByCmdId(serverCmdId) serverProtoObj := serverCmdProtoMap.GetProtoObjByCmdId(serverCmdId)

View File

@@ -191,11 +191,10 @@ func (k *KcpConnectManager) sendMsgHandle() {
}) })
} else if protoMsg.CmdId == cmd.ClientReconnectNotify { } else if protoMsg.CmdId == cmd.ClientReconnectNotify {
tokenResetRsp, err := httpclient.PostJson[controller.TokenResetRsp]( tokenResetRsp, err := httpclient.PostJson[controller.TokenResetRsp](
config.CONF.Hk4e.LoginSdkUrl+"/gate/token/reset?key=flswld", config.GetConfig().Hk4e.LoginSdkUrl+"/gate/token/reset?key=flswld",
&controller.TokenResetReq{ &controller.TokenResetReq{
PlayerId: session.userId, PlayerId: session.userId,
}, })
"")
if err != nil { if err != nil {
logger.Error("reset token error: %v", err) logger.Error("reset token error: %v", err)
k.kcpEventInput <- &KcpEvent{ k.kcpEventInput <- &KcpEvent{
@@ -343,12 +342,11 @@ func (k *KcpConnectManager) getPlayerToken(req *proto.GetPlayerTokenReq, session
} }
} }
tokenVerifyRsp, err := httpclient.PostJson[controller.TokenVerifyRsp]( tokenVerifyRsp, err := httpclient.PostJson[controller.TokenVerifyRsp](
config.CONF.Hk4e.LoginSdkUrl+"/gate/token/verify?key=flswld", config.GetConfig().Hk4e.LoginSdkUrl+"/gate/token/verify?key=flswld",
&controller.TokenVerifyReq{ &controller.TokenVerifyReq{
AccountId: req.AccountUid, AccountId: req.AccountUid,
AccountToken: req.AccountToken, AccountToken: req.AccountToken,
}, })
"")
if err != nil { if err != nil {
logger.Error("verify token error: %v, account uid: %v", err, req.AccountUid) logger.Error("verify token error: %v, account uid: %v", err, req.AccountUid)
loginFailClose() loginFailClose()

View File

@@ -71,7 +71,7 @@ func ReplaceGameDataConfig() {
} }
func (g *GameDataConfig) loadAll() { func (g *GameDataConfig) loadAll() {
pathPrefix := config.CONF.Hk4e.GameDataConfigPath pathPrefix := config.GetConfig().Hk4e.GameDataConfigPath
dirInfo, err := os.Stat(pathPrefix) dirInfo, err := os.Stat(pathPrefix)
if err != nil || !dirInfo.IsDir() { if err != nil || !dirInfo.IsDir() {
@@ -116,19 +116,21 @@ func (g *GameDataConfig) load() {
g.loadSceneData() // 场景 g.loadSceneData() // 场景
g.loadScenePoint() // 场景传送点 g.loadScenePoint() // 场景传送点
g.loadSceneTagData() // 场景地图图标 g.loadSceneTagData() // 场景地图图标
g.loadSceneDetail() // 场景详情LUA配置数据 if config.GetConfig().Hk4e.LoadSceneLuaConfig {
g.loadWorldAreaData() // 世界区域 g.loadSceneDetail() // 场景详情LUA配置数据
g.loadGatherData() // 采集物 }
g.loadFetterData() // 角色资料解锁 g.loadWorldAreaData() // 世界区域
g.loadItemData() // 统一道具 g.loadGatherData() // 采集物
g.loadAvatarLevelData() // 角色等级 g.loadFetterData() // 角色资料解锁
g.loadAvatarPromoteData() // 角色突破 g.loadItemData() // 统一道具
g.loadPlayerLevelData() // 玩家等级 g.loadAvatarLevelData() // 角色等级
g.loadWeaponLevelData() // 武器等级 g.loadAvatarPromoteData() // 角色突破
g.loadWeaponPromoteData() // 武器突破 g.loadPlayerLevelData() // 玩家等级
g.loadRewardData() // 奖励 g.loadWeaponLevelData() // 武器等级
g.loadAvatarCostumeData() // 角色时装 g.loadWeaponPromoteData() // 武器突破
g.loadAvatarFlycloakData() // 角色风之翼 g.loadRewardData() // 奖励
g.loadAvatarCostumeData() // 角色时装
g.loadAvatarFlycloakData() // 角色风之翼
} }
func (g *GameDataConfig) readCsvFileData(fileName string) []byte { func (g *GameDataConfig) readCsvFileData(fileName string) []byte {

View File

@@ -94,6 +94,9 @@ func TestGenGdCsv(t *testing.T) {
func TestInitGameDataConfig(t *testing.T) { func TestInitGameDataConfig(t *testing.T) {
config.InitConfig("./bin/application.toml") config.InitConfig("./bin/application.toml")
logger.InitLogger("InitGameDataConfig") logger.InitLogger("InitGameDataConfig")
defer func() {
logger.CloseLogger()
}()
logger.Info("start load conf") logger.Info("start load conf")
InitGameDataConfig() InitGameDataConfig()
logger.Info("load conf finish, conf: %v", CONF) logger.Info("load conf finish, conf: %v", CONF)
@@ -132,6 +135,9 @@ func CheckJsonLoop(path string, errorJsonFileList *[]string, totalJsonFileCount
func TestCheckJsonValid(t *testing.T) { func TestCheckJsonValid(t *testing.T) {
config.InitConfig("./bin/application.toml") config.InitConfig("./bin/application.toml")
logger.InitLogger("CheckJsonValid") logger.InitLogger("CheckJsonValid")
defer func() {
logger.CloseLogger()
}()
errorJsonFileList := make([]string, 0) errorJsonFileList := make([]string, 0)
totalJsonFileCount := 0 totalJsonFileCount := 0
CheckJsonLoop("./game_data_config/json", &errorJsonFileList, &totalJsonFileCount) CheckJsonLoop("./game_data_config/json", &errorJsonFileList, &totalJsonFileCount)
@@ -146,6 +152,9 @@ func TestCheckJsonValid(t *testing.T) {
func TestSceneBlock(t *testing.T) { func TestSceneBlock(t *testing.T) {
config.InitConfig("./bin/application.toml") config.InitConfig("./bin/application.toml")
logger.InitLogger("SceneBlock") logger.InitLogger("SceneBlock")
defer func() {
logger.CloseLogger()
}()
InitGameDataConfig() InitGameDataConfig()
scene, exist := CONF.SceneDetailMap[3] scene, exist := CONF.SceneDetailMap[3]
if !exist { if !exist {

View File

@@ -5,7 +5,6 @@ import (
"os" "os"
"os/signal" "os/signal"
"syscall" "syscall"
"time"
"hk4e/common/config" "hk4e/common/config"
"hk4e/common/rpc" "hk4e/common/rpc"
@@ -18,6 +17,9 @@ func Run(ctx context.Context, configFile string) error {
logger.InitLogger("gm") logger.InitLogger("gm")
logger.Warn("gm start") logger.Warn("gm start")
defer func() {
logger.CloseLogger()
}()
// natsrpc client // natsrpc client
client, err := rpc.NewClient() client, err := rpc.NewClient()
@@ -38,7 +40,6 @@ func Run(ctx context.Context, configFile string) error {
switch s { switch s {
case syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT: case syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT:
logger.Warn("gm exit") logger.Warn("gm exit")
time.Sleep(time.Second)
return nil return nil
case syscall.SIGHUP: case syscall.SIGHUP:
default: default:

View File

@@ -39,7 +39,7 @@ func (c *Controller) authorize() gin.HandlerFunc {
} }
func (c *Controller) registerRouter() { func (c *Controller) registerRouter() {
if config.CONF.Logger.Level == "DEBUG" { if config.GetConfig().Logger.Level == "DEBUG" {
gin.SetMode(gin.DebugMode) gin.SetMode(gin.DebugMode)
} else { } else {
gin.SetMode(gin.ReleaseMode) gin.SetMode(gin.ReleaseMode)
@@ -47,7 +47,7 @@ func (c *Controller) registerRouter() {
engine := gin.Default() engine := gin.Default()
engine.Use(c.authorize()) engine.Use(c.authorize())
engine.POST("/gm/cmd", c.gmCmd) engine.POST("/gm/cmd", c.gmCmd)
port := config.CONF.HttpPort port := config.GetConfig().HttpPort
addr := ":" + strconv.Itoa(int(port)) addr := ":" + strconv.Itoa(int(port))
err := engine.Run(addr) err := engine.Run(addr)
if err != nil { if err != nil {

View File

@@ -18,6 +18,7 @@ func (c *Controller) gmCmd(context *gin.Context) {
gmCmdReq := new(GmCmdReq) gmCmdReq := new(GmCmdReq)
err := context.ShouldBindJSON(gmCmdReq) err := context.ShouldBindJSON(gmCmdReq)
if err != nil { if err != nil {
logger.Error("parse json error: %v", err)
return return
} }
rep, err := c.gm.Cmd(context.Request.Context(), &api.CmdRequest{ rep, err := c.gm.Cmd(context.Request.Context(), &api.CmdRequest{

View File

@@ -70,6 +70,9 @@ func Run(ctx context.Context, configFile string) error {
logger.InitLogger("gs_" + APPID) logger.InitLogger("gs_" + APPID)
logger.Warn("gs start, appid: %v, gsid: %v", APPID, GSID) logger.Warn("gs start, appid: %v, gsid: %v", APPID, GSID)
defer func() {
logger.CloseLogger()
}()
gdconf.InitGameDataConfig() gdconf.InitGameDataConfig()
@@ -86,7 +89,7 @@ func Run(ctx context.Context, configFile string) error {
defer gameManager.Close() defer gameManager.Close()
// natsrpc server // natsrpc server
conn, err := nats.Connect(config.CONF.MQ.NatsUrl) conn, err := nats.Connect(config.GetConfig().MQ.NatsUrl)
if err != nil { if err != nil {
logger.Error("connect nats error: %v", err) logger.Error("connect nats error: %v", err)
return err return err
@@ -109,7 +112,6 @@ func Run(ctx context.Context, configFile string) error {
switch s { switch s {
case syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT: case syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT:
logger.Warn("gs exit, appid: %v", APPID) logger.Warn("gs exit, appid: %v", APPID)
time.Sleep(time.Second)
return nil return nil
case syscall.SIGHUP: case syscall.SIGHUP:
default: default:

View File

@@ -20,7 +20,7 @@ type Dao struct {
func NewDao() (r *Dao, err error) { func NewDao() (r *Dao, err error) {
r = new(Dao) r = new(Dao)
clientOptions := options.Client().ApplyURI(config.CONF.Database.Url).SetMinPoolSize(1).SetMaxPoolSize(10) clientOptions := options.Client().ApplyURI(config.GetConfig().Database.Url).SetMinPoolSize(1).SetMaxPoolSize(10)
client, err := mongo.Connect(context.TODO(), clientOptions) client, err := mongo.Connect(context.TODO(), clientOptions)
if err != nil { if err != nil {
logger.Error("mongo connect error: %v", err) logger.Error("mongo connect error: %v", err)
@@ -34,8 +34,8 @@ func NewDao() (r *Dao, err error) {
r.mongo = client r.mongo = client
r.db = client.Database("gs_hk4e") r.db = client.Database("gs_hk4e")
r.redis = redis.NewClient(&redis.Options{ r.redis = redis.NewClient(&redis.Options{
Addr: config.CONF.Redis.Addr, Addr: config.GetConfig().Redis.Addr,
Password: config.CONF.Redis.Password, Password: config.GetConfig().Redis.Password,
DB: 0, DB: 0,
PoolSize: 10, PoolSize: 10,
MinIdleConns: 1, MinIdleConns: 1,

View File

@@ -1,10 +1,11 @@
package game package game
import ( import (
"hk4e/gdconf"
"strconv" "strconv"
"strings" "strings"
"hk4e/gdconf"
"hk4e/gs/model" "hk4e/gs/model"
) )

View File

@@ -31,6 +31,8 @@ type CommandMessage struct {
Text string // 命令原始文本 Text string // 命令原始文本
Name string // 命令前缀 Name string // 命令前缀
Args map[string]string // 命令参数 Args map[string]string // 命令参数
FuncName string // 函数名
Param []string // 函数参数列表
} }
// CommandManager 命令管理器 // CommandManager 命令管理器
@@ -129,6 +131,12 @@ func (c *CommandManager) InputCommand(executor any, text string) {
// HandleCommand 处理命令 // HandleCommand 处理命令
// 主协程接收到命令消息后执行 // 主协程接收到命令消息后执行
func (c *CommandManager) HandleCommand(cmd *CommandMessage) { func (c *CommandManager) HandleCommand(cmd *CommandMessage) {
if cmd.FuncName != "" {
logger.Info("run gm cmd, FuncName: %v, Param: %v", cmd.FuncName, cmd.Param)
// TODO 反射调用command_gm.go中的函数并反射解析传入参数类型
return
}
executor := cmd.Executor executor := cmd.Executor
// 分割出命令的每个参数 // 分割出命令的每个参数

View File

@@ -63,7 +63,7 @@ func NewGameManager(dao *dao.Dao, messageQueue *mq.MessageQueue, gsId uint32, gs
r.dao = dao r.dao = dao
MESSAGE_QUEUE = messageQueue MESSAGE_QUEUE = messageQueue
r.snowflake = alg.NewSnowflakeWorker(int64(gsId)) r.snowflake = alg.NewSnowflakeWorker(int64(gsId))
if config.CONF.Hk4e.ClientProtoProxyEnable { if config.GetConfig().Hk4e.ClientProtoProxyEnable {
r.clientCmdProtoMap = client_proto.NewClientCmdProtoMap() r.clientCmdProtoMap = client_proto.NewClientCmdProtoMap()
// 反射调用的方法在启动时测试是否正常防止中途panic // 反射调用的方法在启动时测试是否正常防止中途panic
r.GetClientProtoObjByName("PingReq") r.GetClientProtoObjByName("PingReq")
@@ -276,7 +276,6 @@ func (g *GameManager) Close() {
}, },
}) })
} }
time.Sleep(time.Second)
} }
// SendMsgToGate 发送消息给客户端 指定网关 // SendMsgToGate 发送消息给客户端 指定网关

View File

@@ -112,7 +112,7 @@ func (g *GameManager) CombatInvocationsNotify(player *model.Player, payloadMsg p
switch entry.ArgumentType { switch entry.ArgumentType {
case proto.CombatTypeArgument_COMBAT_EVT_BEING_HIT: case proto.CombatTypeArgument_COMBAT_EVT_BEING_HIT:
hitInfo := new(proto.EvtBeingHitInfo) hitInfo := new(proto.EvtBeingHitInfo)
if config.CONF.Hk4e.ClientProtoProxyEnable { if config.GetConfig().Hk4e.ClientProtoProxyEnable {
clientProtoObj := g.GetClientProtoObjByName("EvtBeingHitInfo") clientProtoObj := g.GetClientProtoObjByName("EvtBeingHitInfo")
if clientProtoObj == nil { if clientProtoObj == nil {
logger.Error("get client proto obj is nil") logger.Error("get client proto obj is nil")
@@ -170,7 +170,7 @@ func (g *GameManager) CombatInvocationsNotify(player *model.Player, payloadMsg p
player.CombatInvokeHandler.AddEntry(entry.ForwardType, entry) player.CombatInvokeHandler.AddEntry(entry.ForwardType, entry)
case proto.CombatTypeArgument_ENTITY_MOVE: case proto.CombatTypeArgument_ENTITY_MOVE:
entityMoveInfo := new(proto.EntityMoveInfo) entityMoveInfo := new(proto.EntityMoveInfo)
if config.CONF.Hk4e.ClientProtoProxyEnable { if config.GetConfig().Hk4e.ClientProtoProxyEnable {
clientProtoObj := g.GetClientProtoObjByName("EntityMoveInfo") clientProtoObj := g.GetClientProtoObjByName("EntityMoveInfo")
if clientProtoObj == nil { if clientProtoObj == nil {
logger.Error("get client proto obj is nil") logger.Error("get client proto obj is nil")
@@ -239,7 +239,7 @@ func (g *GameManager) CombatInvocationsNotify(player *model.Player, payloadMsg p
player.CombatInvokeHandler.AddEntry(entry.ForwardType, entry) player.CombatInvokeHandler.AddEntry(entry.ForwardType, entry)
case proto.CombatTypeArgument_COMBAT_ANIMATOR_STATE_CHANGED: case proto.CombatTypeArgument_COMBAT_ANIMATOR_STATE_CHANGED:
evtAnimatorStateChangedInfo := new(proto.EvtAnimatorStateChangedInfo) evtAnimatorStateChangedInfo := new(proto.EvtAnimatorStateChangedInfo)
if config.CONF.Hk4e.ClientProtoProxyEnable { if config.GetConfig().Hk4e.ClientProtoProxyEnable {
clientProtoObj := g.GetClientProtoObjByName("EvtAnimatorStateChangedInfo") clientProtoObj := g.GetClientProtoObjByName("EvtAnimatorStateChangedInfo")
if clientProtoObj == nil { if clientProtoObj == nil {
logger.Error("get client proto obj is nil") logger.Error("get client proto obj is nil")
@@ -403,7 +403,7 @@ func (g *GameManager) ClientAbilityChangeNotify(player *model.Player, payloadMsg
switch abilityInvokeEntry.ArgumentType { switch abilityInvokeEntry.ArgumentType {
case proto.AbilityInvokeArgument_ABILITY_META_ADD_NEW_ABILITY: case proto.AbilityInvokeArgument_ABILITY_META_ADD_NEW_ABILITY:
abilityMetaAddAbility := new(proto.AbilityMetaAddAbility) abilityMetaAddAbility := new(proto.AbilityMetaAddAbility)
if config.CONF.Hk4e.ClientProtoProxyEnable { if config.GetConfig().Hk4e.ClientProtoProxyEnable {
clientProtoObj := g.GetClientProtoObjByName("AbilityMetaAddAbility") clientProtoObj := g.GetClientProtoObjByName("AbilityMetaAddAbility")
if clientProtoObj == nil { if clientProtoObj == nil {
logger.Error("get client proto obj is nil") logger.Error("get client proto obj is nil")
@@ -433,7 +433,7 @@ func (g *GameManager) ClientAbilityChangeNotify(player *model.Player, payloadMsg
worldAvatar.SetAbilityList(abilityList) worldAvatar.SetAbilityList(abilityList)
case proto.AbilityInvokeArgument_ABILITY_META_MODIFIER_CHANGE: case proto.AbilityInvokeArgument_ABILITY_META_MODIFIER_CHANGE:
abilityMetaModifierChange := new(proto.AbilityMetaModifierChange) abilityMetaModifierChange := new(proto.AbilityMetaModifierChange)
if config.CONF.Hk4e.ClientProtoProxyEnable { if config.GetConfig().Hk4e.ClientProtoProxyEnable {
clientProtoObj := g.GetClientProtoObjByName("AbilityMetaModifierChange") clientProtoObj := g.GetClientProtoObjByName("AbilityMetaModifierChange")
if clientProtoObj == nil { if clientProtoObj == nil {
logger.Error("get client proto obj is nil") logger.Error("get client proto obj is nil")

View File

@@ -23,7 +23,7 @@ type UserInfo struct {
// 获取卡池信息 // 获取卡池信息
func (g *GameManager) GetGachaInfoReq(player *model.Player, payloadMsg pb.Message) { func (g *GameManager) GetGachaInfoReq(player *model.Player, payloadMsg pb.Message) {
logger.Debug("user get gacha info, uid: %v", player.PlayerID) logger.Debug("user get gacha info, uid: %v", player.PlayerID)
serverAddr := config.CONF.Hk4e.GachaHistoryServer serverAddr := config.GetConfig().Hk4e.GachaHistoryServer
userInfo := &UserInfo{ userInfo := &UserInfo{
UserId: player.PlayerID, UserId: player.PlayerID,
RegisteredClaims: jwt.RegisteredClaims{ RegisteredClaims: jwt.RegisteredClaims{

View File

@@ -23,7 +23,7 @@ func (g *GameManager) HandleAbilityStamina(player *model.Player, entry *proto.Ab
case proto.AbilityInvokeArgument_ABILITY_MIXIN_COST_STAMINA: case proto.AbilityInvokeArgument_ABILITY_MIXIN_COST_STAMINA:
// 大剑重击 或 持续技能 耐力消耗 // 大剑重击 或 持续技能 耐力消耗
costStamina := new(proto.AbilityMixinCostStamina) costStamina := new(proto.AbilityMixinCostStamina)
if config.CONF.Hk4e.ClientProtoProxyEnable { if config.GetConfig().Hk4e.ClientProtoProxyEnable {
clientProtoObj := g.GetClientProtoObjByName("AbilityMixinCostStamina") clientProtoObj := g.GetClientProtoObjByName("AbilityMixinCostStamina")
if clientProtoObj == nil { if clientProtoObj == nil {
logger.Error("get client proto obj is nil") logger.Error("get client proto obj is nil")

View File

@@ -2,7 +2,6 @@ package service
import ( import (
"context" "context"
"fmt"
"hk4e/gs/api" "hk4e/gs/api"
"hk4e/gs/game" "hk4e/gs/game"
@@ -15,9 +14,12 @@ type GMService struct {
} }
func (s *GMService) Cmd(ctx context.Context, req *api.CmdRequest) (*api.CmdReply, error) { func (s *GMService) Cmd(ctx context.Context, req *api.CmdRequest) (*api.CmdReply, error) {
// TODO implement me commandTextInput := game.COMMAND_MANAGER.GetCommandTextInput()
fmt.Println("Cmd", req.FuncName, req.Param) commandTextInput <- &game.CommandMessage{
FuncName: req.FuncName,
Param: req.Param,
}
return &api.CmdReply{ return &api.CmdReply{
Message: "TODO", Message: "OK",
}, nil }, nil
} }

View File

@@ -6,7 +6,6 @@ import (
"os" "os"
"os/signal" "os/signal"
"syscall" "syscall"
"time"
"hk4e/common/config" "hk4e/common/config"
"hk4e/node/service" "hk4e/node/service"
@@ -20,9 +19,12 @@ func Run(ctx context.Context, configFile string) error {
logger.InitLogger("node") logger.InitLogger("node")
logger.Warn("node start") logger.Warn("node start")
defer func() {
logger.CloseLogger()
}()
// natsrpc server // natsrpc server
conn, err := nats.Connect(config.CONF.MQ.NatsUrl) conn, err := nats.Connect(config.GetConfig().MQ.NatsUrl)
if err != nil { if err != nil {
logger.Error("connect nats error: %v", err) logger.Error("connect nats error: %v", err)
return err return err
@@ -45,7 +47,6 @@ func Run(ctx context.Context, configFile string) error {
switch s { switch s {
case syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT: case syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT:
logger.Warn("node exit") logger.Warn("node exit")
time.Sleep(time.Second)
return nil return nil
case syscall.SIGHUP: case syscall.SIGHUP:
default: default:

View File

@@ -6,7 +6,6 @@ import (
"sort" "sort"
"strings" "strings"
"sync" "sync"
"sync/atomic"
"time" "time"
"hk4e/common/region" "hk4e/common/region"
@@ -53,8 +52,7 @@ type ServerInstance struct {
type DiscoveryService struct { type DiscoveryService struct {
regionEc2b *random.Ec2b // 全局区服密钥信息 regionEc2b *random.Ec2b // 全局区服密钥信息
serverInstanceMap map[string]*sync.Map // 全部服务器实例集合 key:服务器类型 value:服务器实例集合 -> key:appid value:服务器实例 serverInstanceMap map[string]*sync.Map // 全部服务器实例集合 key:服务器类型 value:服务器实例集合 -> key:appid value:服务器实例
serverAppIdMap map[string]bool // 服务器appid集合 key:appid value:是否存在 serverAppIdMap *sync.Map // 服务器appid集合 key:appid value:是否存在
gsIdCounter uint32 // GSID计数器
} }
func NewDiscoveryService() *DiscoveryService { func NewDiscoveryService() *DiscoveryService {
@@ -62,12 +60,11 @@ func NewDiscoveryService() *DiscoveryService {
r.regionEc2b = region.NewRegionEc2b() r.regionEc2b = region.NewRegionEc2b()
logger.Info("region ec2b create ok, seed: %v", r.regionEc2b.Seed()) logger.Info("region ec2b create ok, seed: %v", r.regionEc2b.Seed())
r.serverInstanceMap = make(map[string]*sync.Map) r.serverInstanceMap = make(map[string]*sync.Map)
r.serverInstanceMap[api.GATE] = &sync.Map{} r.serverInstanceMap[api.GATE] = new(sync.Map)
r.serverInstanceMap[api.GS] = &sync.Map{} r.serverInstanceMap[api.GS] = new(sync.Map)
r.serverInstanceMap[api.FIGHT] = &sync.Map{} r.serverInstanceMap[api.FIGHT] = new(sync.Map)
r.serverInstanceMap[api.PATHFINDING] = &sync.Map{} r.serverInstanceMap[api.PATHFINDING] = new(sync.Map)
r.serverAppIdMap = make(map[string]bool) r.serverAppIdMap = new(sync.Map)
r.gsIdCounter = 0
go r.removeDeadServer() go r.removeDeadServer()
return r return r
} }
@@ -82,9 +79,9 @@ func (s *DiscoveryService) RegisterServer(ctx context.Context, req *api.Register
var appId string var appId string
for { for {
appId = strings.ToLower(random.GetRandomStr(8)) appId = strings.ToLower(random.GetRandomStr(8))
_, exist := s.serverAppIdMap[appId] _, exist := s.serverAppIdMap.Load(appId)
if !exist { if !exist {
s.serverAppIdMap[appId] = true s.serverAppIdMap.Store(appId, true)
break break
} }
} }
@@ -108,12 +105,29 @@ func (s *DiscoveryService) RegisterServer(ctx context.Context, req *api.Register
AppId: appId, AppId: appId,
} }
if req.ServerType == api.GS { if req.ServerType == api.GS {
gsId := atomic.AddUint32(&s.gsIdCounter, 1) gsIdUseList := make([]bool, MaxGsId+1)
if gsId > MaxGsId { gsIdUseList[0] = true
return nil, errors.New("above max gs count") instMap.Range(func(key, value any) bool {
serverInstance := value.(*ServerInstance)
if serverInstance.gsId > MaxGsId {
logger.Error("invalid gs id inst: %v", serverInstance)
return true
}
gsIdUseList[serverInstance.gsId] = true
return true
})
newGsId := uint32(0)
for gsId, use := range gsIdUseList {
if !use {
newGsId = uint32(gsId)
break
}
} }
inst.gsId = gsId if newGsId == 0 {
rsp.GsId = gsId return nil, errors.New("no gs id can use")
}
inst.gsId = newGsId
rsp.GsId = newGsId
} }
return rsp, nil return rsp, nil
} }
@@ -250,12 +264,12 @@ func (s *DiscoveryService) GetMainGameServerAppId(ctx context.Context, req *api.
return nil, errors.New("no game server found") return nil, errors.New("no game server found")
} }
appid := "" appid := ""
minGsId := uint32(MaxGsId) mainGsId := uint32(1)
instMap.Range(func(key, value any) bool { instMap.Range(func(key, value any) bool {
serverInstance := value.(*ServerInstance) serverInstance := value.(*ServerInstance)
if serverInstance.gsId < minGsId { if serverInstance.gsId == mainGsId {
minGsId = serverInstance.gsId
appid = serverInstance.appId appid = serverInstance.appId
return false
} }
return true return true
}) })

View File

@@ -57,6 +57,9 @@ func Run(ctx context.Context, configFile string) error {
logger.InitLogger("pathfinding_" + APPID) logger.InitLogger("pathfinding_" + APPID)
logger.Warn("pathfinding start, appid: %v", APPID) logger.Warn("pathfinding start, appid: %v", APPID)
defer func() {
logger.CloseLogger()
}()
messageQueue := mq.NewMessageQueue(api.PATHFINDING, APPID, client) messageQueue := mq.NewMessageQueue(api.PATHFINDING, APPID, client)
defer messageQueue.Close() defer messageQueue.Close()
@@ -74,7 +77,6 @@ func Run(ctx context.Context, configFile string) error {
switch s { switch s {
case syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT: case syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT:
logger.Warn("pathfinding exit, appid: %v", APPID) logger.Warn("pathfinding exit, appid: %v", APPID)
time.Sleep(time.Second)
return nil return nil
case syscall.SIGHUP: case syscall.SIGHUP:
default: default:

View File

@@ -11,6 +11,9 @@ func TestAoiManagerGetSurrGridListByGid(t *testing.T) {
filePath := "./application.toml" filePath := "./application.toml"
config.InitConfig(filePath) config.InitConfig(filePath)
logger.InitLogger("") logger.InitLogger("")
defer func() {
logger.CloseLogger()
}()
aoiManager := NewAoiManager() aoiManager := NewAoiManager()
aoiManager.SetAoiRange( aoiManager.SetAoiRange(
-150, 150, -150, 150,

View File

@@ -26,13 +26,14 @@ func init() {
} }
} }
func GetJson[T any](url string, authToken string) (*T, error) { func GetJson[T any](url string, authToken ...string) (*T, error) {
logger.Debug("http get req url: %v", url)
req, err := http.NewRequest("GET", url, nil) req, err := http.NewRequest("GET", url, nil)
if err != nil { if err != nil {
return nil, err return nil, err
} }
if authToken != "" { if len(authToken) != 0 {
req.Header.Set("Authorization", "Bearer"+" "+authToken) req.Header.Set("Authorization", "Bearer"+" "+authToken[0])
} }
rsp, err := httpClient.Do(req) rsp, err := httpClient.Do(req)
if err != nil { if err != nil {
@@ -52,13 +53,14 @@ func GetJson[T any](url string, authToken string) (*T, error) {
return responseData, nil return responseData, nil
} }
func GetRaw(url string, authToken string) (string, error) { func GetRaw(url string, authToken ...string) (string, error) {
logger.Debug("http get req url: %v", url)
req, err := http.NewRequest("GET", url, nil) req, err := http.NewRequest("GET", url, nil)
if err != nil { if err != nil {
return "", err return "", err
} }
if authToken != "" { if len(authToken) != 0 {
req.Header.Set("Authorization", "Bearer"+" "+authToken) req.Header.Set("Authorization", "Bearer"+" "+authToken[0])
} }
rsp, err := httpClient.Do(req) rsp, err := httpClient.Do(req)
if err != nil { if err != nil {
@@ -69,21 +71,23 @@ func GetRaw(url string, authToken string) (string, error) {
if err != nil { if err != nil {
return "", err return "", err
} }
logger.Debug("http get rsp data: %v", string(data))
return string(data), nil return string(data), nil
} }
func PostJson[T any](url string, body any, authToken string) (*T, error) { func PostJson[T any](url string, body any, authToken ...string) (*T, error) {
reqData, err := json.Marshal(body) reqData, err := json.Marshal(body)
if err != nil { if err != nil {
return nil, err return nil, err
} }
logger.Debug("http post req url: %v", url)
req, err := http.NewRequest("POST", url, bytes.NewBuffer(reqData)) req, err := http.NewRequest("POST", url, bytes.NewBuffer(reqData))
if err != nil { if err != nil {
return nil, err return nil, err
} }
req.Header.Set("Content-Type", "application/json") req.Header.Set("Content-Type", "application/json")
if authToken != "" { if len(authToken) != 0 {
req.Header.Set("Authorization", "Bearer"+" "+authToken) req.Header.Set("Authorization", "Bearer"+" "+authToken[0])
} }
rsp, err := httpClient.Do(req) rsp, err := httpClient.Do(req)
if err != nil { if err != nil {
@@ -103,14 +107,15 @@ func PostJson[T any](url string, body any, authToken string) (*T, error) {
return responseData, nil return responseData, nil
} }
func PostRaw(url string, body string, authToken string) (string, error) { func PostRaw(url string, body string, authToken ...string) (string, error) {
logger.Debug("http post req url: %v", url)
req, err := http.NewRequest("POST", url, strings.NewReader(body)) req, err := http.NewRequest("POST", url, strings.NewReader(body))
if err != nil { if err != nil {
return "", err return "", err
} }
req.Header.Set("Content-Type", "application/json") req.Header.Set("Content-Type", "application/json")
if authToken != "" { if len(authToken) != 0 {
req.Header.Set("Authorization", "Bearer"+" "+authToken) req.Header.Set("Authorization", "Bearer"+" "+authToken[0])
} }
rsp, err := httpClient.Do(req) rsp, err := httpClient.Do(req)
if err != nil { if err != nil {
@@ -121,5 +126,6 @@ func PostRaw(url string, body string, authToken string) (string, error) {
if err != nil { if err != nil {
return "", err return "", err
} }
logger.Debug("http post rsp data: %v", string(rspData))
return string(rspData), nil return string(rspData), nil
} }

View File

@@ -66,15 +66,25 @@ func InitLogger(appName string) {
log.SetFlags(0) log.SetFlags(0)
LOG = new(Logger) LOG = new(Logger)
LOG.AppName = appName LOG.AppName = appName
LOG.Level = LOG.getLevelInt(config.CONF.Logger.Level) LOG.Level = LOG.getLevelInt(config.GetConfig().Logger.Level)
LOG.Mode = LOG.getModeInt(config.CONF.Logger.Mode) LOG.Mode = LOG.getModeInt(config.GetConfig().Logger.Mode)
LOG.Track = config.CONF.Logger.Track LOG.Track = config.GetConfig().Logger.Track
LOG.MaxSize = config.CONF.Logger.MaxSize LOG.MaxSize = config.GetConfig().Logger.MaxSize
LOG.LogInfoChan = make(chan *LogInfo, 1000) LOG.LogInfoChan = make(chan *LogInfo, 1000)
LOG.File = nil LOG.File = nil
go LOG.doLog() go LOG.doLog()
} }
func CloseLogger() {
// 等待所有日志打印完毕
for {
if len(LOG.LogInfoChan) == 0 {
break
}
time.Sleep(time.Millisecond * 100)
}
}
func (l *Logger) doLog() { func (l *Logger) doLog() {
for { for {
logInfo := <-l.LogInfoChan logInfo := <-l.LogInfoChan

View File

@@ -18,8 +18,11 @@ import (
func main() { func main() {
config.InitConfig("application.toml") config.InitConfig("application.toml")
logger.InitLogger("robot") logger.InitLogger("robot")
defer func() {
logger.CloseLogger()
}()
config.CONF.Hk4e.ClientProtoProxyEnable = false config.GetConfig().Hk4e.ClientProtoProxyEnable = false
// // DPDK模式需开启 // // DPDK模式需开启
// err := engine.InitEngine("00:0C:29:3E:3E:DF", "192.168.199.199", "255.255.255.0", "192.168.199.1") // err := engine.InitEngine("00:0C:29:3E:3E:DF", "192.168.199.199", "255.255.255.0", "192.168.199.1")
@@ -39,11 +42,8 @@ func main() {
s := <-c s := <-c
switch s { switch s {
case syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT: case syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT:
// // DPDK模式需开启 // // DPDK模式需开启
// engine.StopEngine() // engine.StopEngine()
time.Sleep(time.Second)
return return
case syscall.SIGHUP: case syscall.SIGHUP:
default: default:
@@ -85,7 +85,7 @@ func runRobot(name string) {
pingSeq++ pingSeq++
// 通过这个接口发消息给服务器 // 通过这个接口发消息给服务器
session.SendMsg(cmd.PingReq, &proto.PingReq{ session.SendMsg(cmd.PingReq, &proto.PingReq{
ClientTime: uint32(time.Now().UnixMilli()), ClientTime: uint32(time.Now().Unix()),
Seq: pingSeq, Seq: pingSeq,
}) })
case protoMsg := <-session.RecvChan: case protoMsg := <-session.RecvChan:

View File

@@ -26,7 +26,7 @@ type DispatchInfo struct {
func GetDispatchInfo(regionListUrl string, curRegionUrl string, regionListParam string, curRegionParam string, keyId string) (*DispatchInfo, error) { func GetDispatchInfo(regionListUrl string, curRegionUrl string, regionListParam string, curRegionParam string, keyId string) (*DispatchInfo, error) {
logger.Info("http get url: %v", regionListUrl+"/query_region_list"+regionListParam) logger.Info("http get url: %v", regionListUrl+"/query_region_list"+regionListParam)
regionListBase64, err := httpclient.GetRaw(regionListUrl+"/query_region_list"+regionListParam, "") regionListBase64, err := httpclient.GetRaw(regionListUrl + "/query_region_list" + regionListParam)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -49,7 +49,7 @@ func GetDispatchInfo(regionListUrl string, curRegionUrl string, regionListParam
curRegionUrl = selectRegion.DispatchUrl curRegionUrl = selectRegion.DispatchUrl
} }
logger.Info("http get url: %v", curRegionUrl+curRegionParam) logger.Info("http get url: %v", curRegionUrl+curRegionParam)
regionCurrJson, err := httpclient.GetRaw(curRegionUrl+curRegionParam, "") regionCurrJson, err := httpclient.GetRaw(curRegionUrl + curRegionParam)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -122,7 +122,7 @@ func AccountLogin(url string, account string, password string) (*AccountInfo, er
IsCrypto: true, IsCrypto: true,
} }
logger.Info("http post url: %v", url+"/hk4e_global/mdk/shield/api/login") logger.Info("http post url: %v", url+"/hk4e_global/mdk/shield/api/login")
loginResult, err := httpclient.PostJson[api.LoginResult](url+"/hk4e_global/mdk/shield/api/login", loginAccountRequestJson, "") loginResult, err := httpclient.PostJson[api.LoginResult](url+"/hk4e_global/mdk/shield/api/login", loginAccountRequestJson)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -148,7 +148,7 @@ func AccountLogin(url string, account string, password string) (*AccountInfo, er
Data: string(loginTokenDataJson), Data: string(loginTokenDataJson),
} }
logger.Info("http post url: %v", url+"/hk4e_global/combo/granter/login/v2/login") logger.Info("http post url: %v", url+"/hk4e_global/combo/granter/login/v2/login")
comboTokenRsp, err := httpclient.PostJson[api.ComboTokenRsp](url+"/hk4e_global/combo/granter/login/v2/login", comboTokenReq, "") comboTokenRsp, err := httpclient.PostJson[api.ComboTokenRsp](url+"/hk4e_global/combo/granter/login/v2/login", comboTokenReq)
if err != nil { if err != nil {
return nil, err return nil, err
} }