package handler import ( "ecs/proto" "ecs/proto/old" "ecs/servers/game/data" "ecs/servers/game/logic" json "github.com/json-iterator/go" "github.com/oylshe1314/framework/http" "github.com/oylshe1314/framework/server" "github.com/oylshe1314/framework/util" ) type InnerHandler struct { *Handler //eventManager *logic.EventManager serverManager *logic.ServerManager playerManager *logic.PlayerManager } func NewInnerHandler(svr server.Server, tables *data.Tables /*eventManager *logic.EventManager, */, serverManager *logic.ServerManager, playerManager *logic.PlayerManager) *InnerHandler { return &InnerHandler{Handler: newHandler(svr, tables) /*eventManager: eventManager, */, serverManager: serverManager, playerManager: playerManager} } func (this *InnerHandler) ServerOnline(msg *http.Message) { if this.logger.IsDebugEnabled() { this.logger.Debugf("[%s] <- ServerOnline, req: %s", msg.R.RemoteAddr, util.ToJsonString(nil)) } var ack = &proto.MsgServerOnlineAck{Online: this.serverManager.Online() /*, Charges: this.serverManager.Charges()*/} if this.logger.IsDebugEnabled() { this.logger.Debugf("[%s] -> ServerOnline, ack: %s", msg.R.RemoteAddr, util.ToJsonString(ack)) } _ = msg.Reply(ack) } func (this *InnerHandler) ServerOffline(msg *http.Message) { if this.logger.IsDebugEnabled() { this.logger.Debugf("[%s] <- ServerOffline, req: %s", msg.R.RemoteAddr, util.ToJsonString(nil)) } this.playerManager.KickAll(proto.ErrServerOffline.Error()) if this.logger.IsDebugEnabled() { this.logger.Debugf("[%s] -> ServerOffline, ack: %s", msg.R.RemoteAddr, util.ToJsonString(nil)) } _ = msg.Reply(nil) } func (this *InnerHandler) ServerDataReload(msg *http.Message) { if this.logger.IsDebugEnabled() { this.logger.Debugf("[%s] <- ServerDataReload, req: %s", msg.R.RemoteAddr, util.ToJsonString(nil)) } var err = this.serverManager.Reload() if err != nil { this.logger.Error("Data reload failed, ", err) _ = msg.Reply(proto.ErrDataReloadFailed) return } if this.logger.IsDebugEnabled() { this.logger.Debugf("[%s] <- ServerDataReload, ack: %s", msg.R.RemoteAddr, util.ToJsonString(nil)) } _ = msg.Reply(nil) } //func (this *InnerHandler) ServerMailList(msg *http.Message) { // if this.logger.IsDebugEnabled() { // this.logger.Debugf("[%s] <- ServerMailList, req: %s", msg.R.RemoteAddr, util.ToJsonString(nil)) // } // // var list, err = this.playerManager.RegionMailList() // if err != nil { // this.logger.Error("Read message error, ", err) // _ = msg.Reply(proto.RawErrMessageError) // return // } // // var ack = &proto.MsgRegionMailListAck{List: list} // // if this.logger.IsDebugEnabled() { // this.logger.Debugf("[%s] -> ServerMailList, ack: %s", msg.R.RemoteAddr, util.ToJsonString(ack)) // } // // _ = msg.Reply(ack) //} //func (this *InnerHandler) ServerMailSend(msg *http.Message) { // var req = new(proto.MsgRegionMailSendReq) // var err = msg.Read(req) // if err != nil { // this.logger.Error("Read message error, ", err) // _ = msg.Reply(proto.RawErrMessageError) // return // } // // if this.logger.IsDebugEnabled() { // this.logger.Debugf("[%s] <- ServerMailSend, req: %s", msg.R.RemoteAddr, util.ToJsonString(req)) // } // // if req.Title == "" || req.Content == "" { // this.logger.Error("Parameter error, req.Title == \"\" || req.Content == \"\"") // _ = msg.Reply(proto.RawErrParameterError) // return // } // // err = this.playerManager.RegionMailSend(req.BackMail) // if err != nil { // this.logger.Error("Region mail send failed, ", err) // _ = msg.Reply(proto.RawErrMailSendFailed) // return // } // // if this.logger.IsDebugEnabled() { // this.logger.Debugf("[%s] -> ServerMailSend, ack: %s", msg.R.RemoteAddr, util.ToJsonString(nil)) // } // // _ = msg.Reply(nil) //} //func (this *InnerHandler) ServerMailDelete(msg *http.Message) { // var req = new(proto.MsgRegionMailDeleteReq) // var err = msg.Read(req) // if err != nil { // this.logger.Error("Read message error, ", err) // _ = msg.Reply(proto.RawErrMessageError) // return // } // // if this.logger.IsDebugEnabled() { // this.logger.Debugf("[%s] <- ServerMailDelete, req: %s", msg.R.RemoteAddr, util.ToJsonString(req)) // } // // err = this.playerManager.RegionMailDelete(req.Ids) // if err != nil { // this.logger.Error("Region mail delete failed, ", err) // _ = msg.Reply(proto.RawErrMailDeleteFailed) // return // } // // if this.logger.IsDebugEnabled() { // this.logger.Debugf("[%s] -> ServerMailDelete, ack: %s", msg.R.RemoteAddr, util.ToJsonString(nil)) // } // // _ = msg.Reply(nil) //} func (this *InnerHandler) ServerPlayerQuery(msg *http.Message) { var req = new(old.MsgPlayerQueryReq) var err = msg.Read(req) if err != nil { this.logger.Error("Read message error, ", err) _ = msg.Reply(proto.ErrMessageError) return } if this.logger.IsDebugEnabled() { this.logger.Debugf("[%s] <- ServerPlayerQuery, req: %s", msg.R.RemoteAddr, util.ToJsonString(req)) } if req.PlayerId == 0 { this.logger.Error("Parameter error, req.PlayerId == 0") _ = msg.Reply(proto.ErrParameterError) return } var player = this.playerManager.GetPlayer(req.PlayerId) if player == nil { player, err = this.playerManager.QueryPlayer(req.PlayerId) if err != nil { this.logger.Error("Query player failed, ", err) _ = msg.Reply(proto.ErrPlayerQueryFailed) return } } if player == nil { _ = msg.Reply(&old.MsgPlayerQueryAck{}) return } rawMsg, err := json.Marshal(player) if err != nil { this.logger.Error(err) _ = msg.Reply(proto.ErrInternalError) return } var ack = &old.MsgPlayerQueryAck{Player: rawMsg} if this.logger.IsDebugEnabled() { this.logger.Debugf("[%s] <- ServerPlayerQuery, req: %s", msg.R.RemoteAddr, util.ToJsonString(ack)) } _ = msg.Reply(ack) } func (this *InnerHandler) ServerPlayerOperate(msg *http.Message) { var req = new(old.MsgPlayerOperateReq) var err = msg.Read(req) if err != nil { this.logger.Error("Read message error, ", err) _ = msg.Reply(proto.ErrMessageError) return } if this.logger.IsDebugEnabled() { this.logger.Debugf("[%s] <- ServerPlayerOperate, req: %s", msg.R.RemoteAddr, util.ToJsonString(req)) } if req.PlayerId == 0 { this.logger.Error("Parameter error, req.PlayerId == 0") _ = msg.Reply(proto.ErrParameterError) return } var player *logic.Player switch req.OperateType { case 1: if req.OperateArg == 0 { req.OperateArg = 10957 //thirty years } player = this.playerManager.GetPlayer(req.PlayerId) if player != nil { this.playerManager.Kick(player, proto.ErrServerOffline.Error()) } else { player, err = this.playerManager.QueryPlayer(req.PlayerId) if err != nil { this.logger.Error("Query player failed, ", err) _ = msg.Reply(proto.ErrPlayerQueryFailed) return } } if player != nil { this.playerManager.Ban(player, req.OperateArg) } case 2: player, err = this.playerManager.QueryPlayer(req.PlayerId) if err != nil { this.logger.Error("Query player failed, ", err) _ = msg.Reply(proto.ErrPlayerQueryFailed) return } if player != nil { this.playerManager.Unban(player) } case 3: player = this.playerManager.GetPlayer(req.PlayerId) if player != nil { this.playerManager.Kick(player, proto.ErrServerOffline.Error()) } default: this.logger.Error("Parameter error, req.OperateType: ", req.OperateType) _ = msg.Reply(proto.ErrParameterError) return } if this.logger.IsDebugEnabled() { this.logger.Debugf("[%s] <- ServerPlayerOperate, ack: %s", msg.R.RemoteAddr, util.ToJsonString(nil)) } _ = msg.Reply(nil) } func (this *InnerHandler) PlayerRequest(msg *http.Message) { var values = msg.R.Header.Values("PlayerId") if len(values) == 0 { this.logger.Error("Player request need a HTTP header with name 'PlayerId'") _ = msg.Reply(proto.ErrNoHttpHeader) return } for _, value := range values { var playerId, err = util.StringToInteger1[uint64](value) if err != nil { this.logger.Error("Incorrect value of HTTP header 'PlayerId', ", err) _ = msg.Reply(proto.ErrHttpHeaderError) return } this.playerManager.HandleInner(playerId, msg) } }