2025-07-17 16:21:08 +08:00

250 lines
6.7 KiB
Go

package handler
import (
"ecs/proto"
"ecs/servers/game/data"
"ecs/servers/game/logic"
json "github.com/json-iterator/go"
"github.com/oylshe1314/framework/client/rpc"
"github.com/oylshe1314/framework/http"
"github.com/oylshe1314/framework/server"
"github.com/oylshe1314/framework/util"
)
type InnerHandler struct {
Handler
}
func NewInnerHandler(svr server.Server, httpRpcClient rpc.HttpRpcClient, tables *data.Tables, eventManager *logic.EventManager, serverManager *logic.ServerManager, playerManager *logic.PlayerManager) *InnerHandler {
return &InnerHandler{
Handler: Handler{
server: svr,
httpRpcClient: httpRpcClient,
tables: tables,
eventManager: eventManager,
serverManager: serverManager,
playerManager: playerManager},
}
}
//func (this *InnerHandler) ServerMailList(msg *http.Message) {
// if thisLlogger().IsDebugEnabled() {
// thisLlogger().Debugf("[%s] <- ServerMailList, req: %s", msg.R.RemoteAddr, util.ToJsonString(nil))
// }
//
// var list, err = this.playerManager.RegionMailList()
// if err != nil {
// thisLlogger().Error("Read message error, ", err)
// _ = msg.Reply(proto.RawErrMessageError)
// return
// }
//
// var ack = &proto.MsgRegionMailListAck{List: list}
//
// if thisLlogger().IsDebugEnabled() {
// thisLlogger().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 {
// thisLlogger().Error("Read message error, ", err)
// _ = msg.Reply(proto.RawErrMessageError)
// return
// }
//
// if thisLlogger().IsDebugEnabled() {
// thisLlogger().Debugf("[%s] <- ServerMailSend, req: %s", msg.R.RemoteAddr, util.ToJsonString(req))
// }
//
// if req.Title == "" || req.Content == "" {
// thisLlogger().Error("Parameter error, req.Title == \"\" || req.Content == \"\"")
// _ = msg.Reply(proto.RawErrParameterError)
// return
// }
//
// err = this.playerManager.RegionMailSend(req.BackMail)
// if err != nil {
// thisLlogger().Error("Region mail send failed, ", err)
// _ = msg.Reply(proto.RawErrMailSendFailed)
// return
// }
//
// if thisLlogger().IsDebugEnabled() {
// thisLlogger().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 {
// thisLlogger().Error("Read message error, ", err)
// _ = msg.Reply(proto.RawErrMessageError)
// return
// }
//
// if thisLlogger().IsDebugEnabled() {
// thisLlogger().Debugf("[%s] <- ServerMailDelete, req: %s", msg.R.RemoteAddr, util.ToJsonString(req))
// }
//
// err = this.playerManager.RegionMailDelete(req.Ids)
// if err != nil {
// thisLlogger().Error("Region mail delete failed, ", err)
// _ = msg.Reply(proto.RawErrMailDeleteFailed)
// return
// }
//
// if thisLlogger().IsDebugEnabled() {
// thisLlogger().Debugf("[%s] -> ServerMailDelete, ack: %s", msg.R.RemoteAddr, util.ToJsonString(nil))
// }
//
// _ = msg.Reply(nil)
//}
func (this *InnerHandler) ServerPlayerQuery(msg *http.Message) {
var req = new(proto.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.RoleId == 0 {
this.Logger().Error("Parameter error, req.RoleId == 0")
_ = msg.Reply(proto.ErrParameterError)
return
}
var player = this.playerManager.GetPlayer(req.RoleId)
if player == nil {
player, err = this.playerManager.QueryPlayer(req.RoleId)
if err != nil {
this.Logger().Error("Query player failed, ", err)
_ = msg.Reply(proto.ErrPlayerQueryFailed)
return
}
}
if player == nil {
_ = msg.Reply(&proto.MsgPlayerQueryAck{})
return
}
rawMsg, err := json.Marshal(player)
if err != nil {
this.Logger().Error(err)
_ = msg.Reply(proto.ErrInternalError)
return
}
var ack = &proto.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(proto.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.RoleId == 0 {
this.Logger().Error("Parameter error, req.RoleId == 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.RoleId)
if player != nil {
this.playerManager.Kick(player, proto.ErrServerOffline.Error())
} else {
player, err = this.playerManager.QueryPlayer(req.RoleId)
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.RoleId)
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.RoleId)
if player != nil {
this.playerManager.Kick(player, proto.ErrServerOffline.Error())
this.eventManager.PlayerLogin(player, logic.LogTypePlayerKickOut, 0, player.Temp.Address)
}
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 value = msg.R.Header.Get("RoleId")
if value == "" {
this.Logger().Error("Player request need a HTTP header with name 'UserId' and value 'RoleId'")
_ = msg.Reply(proto.ErrNoHttpHeader)
return
}
var roleId, err = util.StringToInteger1[uint64](value)
if err != nil {
this.Logger().Error("Incorrect value of HTTP header 'UserId', ", err)
_ = msg.Reply(proto.ErrHttpHeaderError)
return
}
this.playerManager.HandleInner(roleId, msg)
}