293 lines
8.0 KiB
Go
293 lines
8.0 KiB
Go
![]() |
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.RawErrServerOnline.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.RawErrDataReloadFailed)
|
||
|
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.RawErrMessageError)
|
||
|
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.RawErrParameterError)
|
||
|
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.RawErrPlayerQueryFailed)
|
||
|
return
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if player == nil {
|
||
|
_ = msg.Reply(&old.MsgPlayerQueryAck{})
|
||
|
return
|
||
|
}
|
||
|
|
||
|
rawMsg, err := json.Marshal(player)
|
||
|
if err != nil {
|
||
|
this.logger.Error(err)
|
||
|
_ = msg.Reply(proto.RawErrInternalError)
|
||
|
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.RawErrMessageError)
|
||
|
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.RawErrParameterError)
|
||
|
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.RawErrServerOnline.Error())
|
||
|
} else {
|
||
|
player, err = this.playerManager.QueryPlayer(req.PlayerId)
|
||
|
if err != nil {
|
||
|
this.logger.Error("Query player failed, ", err)
|
||
|
_ = msg.Reply(proto.RawErrPlayerQueryFailed)
|
||
|
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.RawErrPlayerQueryFailed)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
if player != nil {
|
||
|
this.playerManager.Unban(player)
|
||
|
}
|
||
|
case 3:
|
||
|
player = this.playerManager.GetPlayer(req.PlayerId)
|
||
|
if player != nil {
|
||
|
this.playerManager.Kick(player, proto.RawErrServerOnline.Error())
|
||
|
}
|
||
|
default:
|
||
|
this.logger.Error("Parameter error, req.OperateType: ", req.OperateType)
|
||
|
_ = msg.Reply(proto.RawErrParameterError)
|
||
|
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.RawErrNoHttpHeader)
|
||
|
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.RawErrHttpHeaderError)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
this.playerManager.HandleInner(playerId, msg)
|
||
|
}
|
||
|
}
|