GM rpc服务器

This commit is contained in:
hahwu 2026-03-05 17:55:36 +08:00
parent 385d571c3a
commit a2a8da873e
3 changed files with 154 additions and 93 deletions

View File

@ -1,106 +1,13 @@
package backend
import (
"context"
"fmt"
"net"
"server/db"
"server/game"
GoUtil "server/game_util"
"server/gen-go/backend"
"github.com/apache/thrift/lib/go/thrift"
)
type GameServiceHandler struct{}
func NewGameServiceHandler() *GameServiceHandler {
return &GameServiceHandler{}
}
func (h *GameServiceHandler) GetAdminInfo(ctx context.Context, id int32) (*backend.ResAdminInfo, error) {
player := game.G_GameLogicPtr.GetPlayer(int64(id))
online := true
if player == nil {
player = new(game.Player)
player.M_DwUin = int64(id)
player.InitPlayerOnly()
player.ZeroUpdate(nil)
online = false
}
res := &backend.ResAdminInfo{}
res.Name = player.GetBaseMod().NickName
res.UID = player.M_DwUin
res.AreaId = int32(player.GetDecorateMod().GetAreaId())
res.Face = int32(player.GetFaceMod().SetId)
res.Charge = player.GetChargeMod().Charge
res.MaxCharge = player.GetChargeMod().MaxCharge
res.Level = int32(player.GetPlayerBaseMod().GetLevel())
res.Diamond = int32(player.GetPlayerBaseMod().GetDiamond())
res.Star = int32(player.GetPlayerBaseMod().GetStar())
res.Energy = int32(player.GetPlayerBaseMod().GetEnergy())
res.UserName = player.GetPlayerBaseMod().GetName()
res.LoginTime = player.GetBaseMod().LoginTime
res.Cumulative = int32(player.GetBaseMod().Cumulative)
res.RegisterTime = int32(player.GetPlayerBaseMod().GetRegisterTime())
res.TodayCumulative = int32(player.GetBaseMod().TodayCumulative)
res.Ban = int8(db.GetPlayerBan(player.GetBaseMod().Account))
if online {
res.Cumulative = int32(int64(player.GetBaseMod().Cumulative) + GoUtil.Now() - int64(player.GetBaseMod().LoginTime))
res.TodayCumulative = int32(int64(player.GetBaseMod().TodayCumulative) + GoUtil.Now() - int64(player.GetBaseMod().LoginTime))
}
res.Code = player.GetBaseMod().AddCode
res.ChessMap = player.GetChessMod().ChessMap
resActLog := make([]*backend.Actlog, 0, len(player.GetFriendMod().ActivityLog))
for _, log := range player.GetFriendMod().ActivityLog {
resActLog = append(resActLog, &backend.Actlog{
Type: int8(log.Type),
Time: log.Time,
Param: log.Param,
})
}
res.ActLog = resActLog
friendList := player.GetFriendMod().NewFriendList
type friendInfo struct {
Uid int64
NickName string
Avatar int
Level int
LogoutTime int64
LoginTime int64
}
resFriendList := make([]*backend.FriendInfo, 0, len(friendList))
for v := range friendList {
ps := game.G_GameLogicPtr.GetSimplePlayerByUid(v)
if ps == nil {
continue
}
resFriendList = append(resFriendList, &backend.FriendInfo{
UID: int64(v),
NickName: ps.Name,
Face: int32(ps.Face),
Level: int32(ps.Level),
LogoutTime: ps.Loginout,
LoginTime: ps.Login,
})
}
res.FriendList = resFriendList
OrderMap := make(map[int32]*backend.OrderInfo)
Index := 0
for k, v := range player.GetOrderMod().OrderList {
OrderMap[int32(Index)] = &backend.OrderInfo{
ID: int32(k),
Type: int32(v.Type),
Time: v.Timestamp,
ChessId: GoUtil.IntSliceToString(v.MergeId),
Diff: int8(v.Diff),
}
Index++
}
res.OrderList = OrderMap
return res, nil
}
func Start() {
addr := net.JoinHostPort("localhost", "9090")
handler := NewGameServiceHandler()

View File

@ -0,0 +1,146 @@
package backend
import (
"context"
"server/db"
"server/game"
"server/game/mod/msg"
GoUtil "server/game_util"
"server/gamedata"
"server/gen-go/backend"
"server/pkg/github.com/name5566/leaf/log"
)
type GameServiceHandler struct{}
func NewGameServiceHandler() *GameServiceHandler {
return &GameServiceHandler{}
}
func (h *GameServiceHandler) ReqPlayerInfo(ctx context.Context, id int64) (*backend.ResAdminInfo, error) {
player := game.G_GameLogicPtr.GetPlayer(int64(id))
online := true
if player == nil {
player = new(game.Player)
player.M_DwUin = int64(id)
player.InitPlayerOnly()
player.ZeroUpdate(nil)
online = false
}
res := &backend.ResAdminInfo{}
res.Name = player.GetBaseMod().NickName
res.UID = player.M_DwUin
res.AreaId = int32(player.GetDecorateMod().GetAreaId())
res.Face = int32(player.GetFaceMod().SetId)
res.Charge = player.GetChargeMod().Charge
res.MaxCharge = player.GetChargeMod().MaxCharge
res.Level = int32(player.GetPlayerBaseMod().GetLevel())
res.Diamond = int32(player.GetPlayerBaseMod().GetDiamond())
res.Star = int32(player.GetPlayerBaseMod().GetStar())
res.Energy = int32(player.GetPlayerBaseMod().GetEnergy())
res.UserName = player.GetPlayerBaseMod().GetName()
res.LoginTime = player.GetBaseMod().LoginTime
res.Cumulative = int32(player.GetBaseMod().Cumulative)
res.RegisterTime = int32(player.GetPlayerBaseMod().GetRegisterTime())
res.TodayCumulative = int32(player.GetBaseMod().TodayCumulative)
res.Ban = int8(db.GetPlayerBan(player.GetBaseMod().Account))
if online {
res.Cumulative = int32(int64(player.GetBaseMod().Cumulative) + GoUtil.Now() - int64(player.GetBaseMod().LoginTime))
res.TodayCumulative = int32(int64(player.GetBaseMod().TodayCumulative) + GoUtil.Now() - int64(player.GetBaseMod().LoginTime))
}
res.Code = player.GetBaseMod().AddCode
res.ChessMap = player.GetChessMod().ChessMap
resActLog := make([]*backend.Actlog, 0, len(player.GetFriendMod().ActivityLog))
for _, log := range player.GetFriendMod().ActivityLog {
resActLog = append(resActLog, &backend.Actlog{
Type: int8(log.Type),
Time: log.Time,
Param: log.Param,
})
}
res.ActLog = resActLog
friendList := player.GetFriendMod().NewFriendList
type friendInfo struct {
Uid int64
NickName string
Avatar int
Level int
LogoutTime int64
LoginTime int64
}
resFriendList := make([]*backend.FriendInfo, 0, len(friendList))
for v := range friendList {
ps := game.G_GameLogicPtr.GetSimplePlayerByUid(v)
if ps == nil {
continue
}
resFriendList = append(resFriendList, &backend.FriendInfo{
UID: int64(v),
NickName: ps.Name,
Face: int32(ps.Face),
Level: int32(ps.Level),
LogoutTime: ps.Loginout,
LoginTime: ps.Login,
})
}
res.FriendList = resFriendList
OrderMap := make(map[int32]*backend.OrderInfo)
Index := 0
for k, v := range player.GetOrderMod().OrderList {
OrderMap[int32(Index)] = &backend.OrderInfo{
ID: int32(k),
Type: int32(v.Type),
Time: v.Timestamp,
ChessId: GoUtil.IntSliceToString(v.MergeId),
Diff: int8(v.Diff),
}
Index++
}
res.OrderList = OrderMap
return res, nil
}
func (h *GameServiceHandler) ReqReloadServerMail(ctx context.Context) (*backend.ResMessage, error) {
game.G_GameLogicPtr.MailMgrCall(&msg.Msg{Type: msg.HANDLE_TYPE_MAIL_RELOAD})
game.G_GameLogicPtr.NotifyAll(&msg.Msg{Type: msg.HANDLE_TYPE_MAIL})
log.Debug("ReqReloadServerMail success")
return &backend.ResMessage{
Code: 0,
}, nil
}
func (h *GameServiceHandler) ReqConfigReload(ctx context.Context) (*backend.ResMessage, error) {
gamedata.Reload()
return &backend.ResMessage{
Code: 0,
}, nil
}
func (h *GameServiceHandler) ReqAdminGm(ctx context.Context, uid int64, command string) (*backend.ResMessage, error) {
player := game.G_GameLogicPtr.GetPlayer(uid)
if player == nil {
return &backend.ResMessage{
Code: 1,
Msg: "player not online",
}, nil
}
player.Lock()
defer player.UnLock()
err := game.ReqGmCommand_(player, command)
if err != nil {
return &backend.ResMessage{
Code: 1,
Msg: err.Error(),
}, nil
}
return &backend.ResMessage{
Code: 0,
}, nil
}
func (h *GameServiceHandler) ReqAdminBan(ctx context.Context, uid int64, banTime int64) (*backend.ResMessage, error) {
db.UpdatePlayerBan(uid, banTime)
return &backend.ResMessage{
Code: 0,
}, nil
}

View File

@ -1339,3 +1339,11 @@ func CheckPlayerLose(Uid int) bool {
}
return false
}
func (p *Player) Lock() {
p.lock.Lock()
}
func (p *Player) UnLock() {
p.lock.Unlock()
}