You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
80 lines
2.9 KiB
80 lines
2.9 KiB
package server |
|
|
|
import ( |
|
"github.com/golang/protobuf/proto" |
|
"reflect" |
|
"texas-poker-bk/api" |
|
"texas-poker-bk/internal/game" |
|
"texas-poker-bk/internal/service" |
|
"texas-poker-bk/internal/session" |
|
) |
|
|
|
var NetClientHandlers = make(map[int32]func(*session.NetClient, proto.Message) (proto.Message, error)) |
|
var NetAccountHandlers = make(map[int32]func(*session.NetAccount, proto.Message) (proto.Message, error)) |
|
var PlayerHandlers = make(map[int32]func(*game.Player, proto.Message) (proto.Message, error)) |
|
|
|
func init() { |
|
// ping/pong: 测延迟 |
|
HandleNetClientMsg(&api.Ping{}, func(_ *session.NetClient, ping *api.Ping) (proto.Message, error) { |
|
return &api.Pong{PingMs: ping.Ms}, nil |
|
}) |
|
// 连接token认证 |
|
HandleNetClientMsg(&api.ReqIdentity{}, service.HandleReqIdentity) |
|
// 创建桌面 |
|
HandleNetAccountMsg(&api.ReqCreateTable{}, service.HandleReqCreateTable) |
|
// 查询所有游戏桌面 |
|
HandleNetAccountMsg(&api.ReqLobbyView{}, service.HandleReqLobbyView) |
|
// 获取牌桌当前所有状态 |
|
HandleNetPlayerMsg(&api.ReqGameFullStatus{}, service.HandleReqGameFullStatus) |
|
// 加入桌面 |
|
HandleNetAccountMsg(&api.ReqJoinTable{}, service.HandleReqJoinTable) |
|
|
|
// 踢人 |
|
HandleNetPlayerMsg(&api.ReqKickOutTable{}, service.HandleReqKickOutTable) |
|
// 离开房间 |
|
HandleNetPlayerMsg(&api.ReqLeaveTable{}, service.HandleReqLeaveTable) |
|
// 解散房间 |
|
HandleNetPlayerMsg(&api.ReqDismissGameTable{}, service.HandleReqDismissGameTable) |
|
// 玩家准备 |
|
HandleNetPlayerMsg(&api.ReqReadyStart{}, service.HandleReqReadyStart) |
|
// 玩家取消准备 |
|
HandleNetPlayerMsg(&api.ReqCancelReady{}, service.HandleReqCancelReady) |
|
// 开始游戏 |
|
HandleNetPlayerMsg(&api.ReqGameStart{}, service.HandleReqGameStart) |
|
// 筹码下注 |
|
HandleNetPlayerMsg(&api.ReqBetting{}, service.HandleReqBetting) |
|
} |
|
|
|
func checkExistsTypeHandler(op int32, err error) { |
|
if err != nil { |
|
panic(err) |
|
} |
|
if NetClientHandlers[op] != nil || NetAccountHandlers[op] != nil || PlayerHandlers[op] != nil { |
|
ins, _ := api.NewProtoInstance(op) |
|
panic("duplicate type handler! " + reflect.TypeOf(ins).String()) |
|
} |
|
} |
|
|
|
func HandleNetClientMsg[T proto.Message](msg T, f func(*session.NetClient, T) (proto.Message, error)) { |
|
op, err := api.GetProtoOp(msg) |
|
checkExistsTypeHandler(op, err) |
|
NetClientHandlers[op] = func(client *session.NetClient, msg proto.Message) (proto.Message, error) { |
|
return f(client, msg.(T)) |
|
} |
|
} |
|
|
|
func HandleNetAccountMsg[T proto.Message](msg T, f func(*session.NetAccount, T) (proto.Message, error)) { |
|
op, err := api.GetProtoOp(msg) |
|
checkExistsTypeHandler(op, err) |
|
NetAccountHandlers[op] = func(account *session.NetAccount, msg proto.Message) (proto.Message, error) { |
|
return f(account, msg.(T)) |
|
} |
|
} |
|
|
|
func HandleNetPlayerMsg[T proto.Message](msg T, f func(*game.Player, T) (proto.Message, error)) { |
|
op, err := api.GetProtoOp(msg) |
|
checkExistsTypeHandler(op, err) |
|
PlayerHandlers[op] = func(player *game.Player, msg proto.Message) (proto.Message, error) { |
|
return f(player, msg.(T)) |
|
} |
|
}
|
|
|