samba/server/cacheta/handler/cathetaHandler.go

190 lines
5.3 KiB
Go
Raw Permalink Normal View History

2025-06-04 09:51:39 +08:00
package handler
import (
"encoding/json"
"fmt"
"github.com/rabbitmq/amqp091-go"
"samba/pkg/log"
"samba/proto"
. "samba/server/cacheta/room"
. "samba/server/cacheta/service"
. "samba/server/game/baseroom"
. "samba/server/game/player"
"samba/util/config"
"samba/util/model"
"samba/util/util"
"strconv"
)
func MakePlayerToProto(user *Player, clubId int) *proto.Player {
protoPlayer := &proto.Player{
UserId: user.UID,
ClubId: clubId,
Mnick: user.MNick,
HeadUrl: user.HeadURL,
IconId: user.IconId,
AvatarFrame: user.AvatarFrame,
Sex: user.Sex,
TakeCoin: user.TakeCoin,
Poker: nil,
Seat: -1,
IsRed: 0,
State: 1,
ClubTakeCoin: user.TakeClubCoin,
}
op := model.NewUserResourceOp()
if clubId == 0 {
coins, _ := op.Get(user.UID, model.ResCoins)
protoPlayer.Coin = coins
} else {
coins, _ := op.Get(user.UID, model.ResClubUserScore)
protoPlayer.ClubCoin = coins
}
return protoPlayer
}
func onEnterRoom(_ *amqp091.Delivery, msg map[string]interface{}) {
msgId, _, uid, data := ParseMsg(msg)
req, err := util.MapToStructT[proto.ReqEnterRoom](data)
if err != nil {
log.Error(err.Error())
return
}
rm := RoomMgr.Find(req.RoomId)
if rm != nil {
rm.OnMessage(msgId, msg)
} else {
SendMsgToGate(uid, proto.RspEnterRoomId, &proto.RspEnterRoom{Code: proto.NotExistRoom, RoomId: req.RoomId})
}
}
func onLeaveRoom(_ *amqp091.Delivery, msg map[string]interface{}) {
msgId, _, uid, data := ParseMsg(msg)
req, err := util.MapToStructT[proto.ReqLeaveRoom](data)
if err != nil {
log.Error(err.Error())
return
}
rm := RoomMgr.Find(req.RoomId)
if rm != nil {
rm.OnMessage(msgId, msg)
} else {
SendMsgToGate(uid, proto.RspLeaveRoomId, &proto.RspLeaveRoom{Code: proto.Ok, RoomId: req.RoomId})
}
}
func checkSetPokers(req *proto.ReqSetPokers) (*GameRoom, proto.ErrorCode) {
if config.Config.Application.Gm < 1 {
return nil, proto.NotOpenGm
}
rm := RoomMgr.Find(req.RoomId)
if rm == nil {
return nil, proto.NotExistRoom
}
return rm.(*GameRoom), proto.Ok
}
// gm配牌指令
func onSetPokers(d *amqp091.Delivery, msg map[string]interface{}) {
req, err := util.MapToStructT[proto.ReqSetPokers](msg["p"])
if err != nil {
log.Error(err.Error())
return
}
response := make(map[string]interface{})
response["r"] = "0"
room, code := checkSetPokers(req)
if code == proto.Ok {
room.SetGmPokers(req.UserId, req.Pokers, req.GhostPoker)
}
response["p"] = proto.RspSetPokers{Code: code}
if data, err := json.Marshal(response); err == nil {
_ = CathetaService.PublishRpc(d, data)
}
}
// 玩家在房间内掉线,主动申请重连
func onReconnect(_ *amqp091.Delivery, msg map[string]interface{}) {
_, _, uid, data := ParseMsg(msg)
req, err := util.MapToStructT[proto.ReqCachetaReconnect](data)
if err != nil {
log.Error(err.Error())
return
}
if req.RoomId >= config.Cmd.MaxRoomId || req.RoomId < config.Cmd.MinRoomId {
log.Debug(fmt.Sprintf("玩家申请重连:%v room:%v conf.maxid:%v conf.minid:%v", uid, req.RoomId, config.Cmd.MaxRoomId, config.Cmd.MinRoomId))
return
}
log.Debug(fmt.Sprintf("玩家申请重连:%v", uid))
if ir := RoomMgr.Find(req.RoomId); ir != nil {
if rm, ok := ir.(*GameRoom); ok {
msg["uid"] = uid
seat := rm.GetSeat(uid)
if seat == nil {
log.Error(rm.Log("player:%d seat is nil", uid))
return
}
log.Debug(rm.SeatLog(seat, "seat:%v 重连", seat.No()))
rm.OnMessage(proto.ReqCachetaReconnectId, msg)
return
}
}
log.Debug(fmt.Sprintf("玩家申请重连:%v 房间不存在", uid))
SendMsgToGate(uid, proto.RspCachetaReconnectId, &proto.RspCachetaReconnect{Code: proto.NotExistRoom})
}
// 玩家下线,未开始游戏则踢出去,已开始游戏则设置假退出
func onUserOffline(_ *amqp091.Delivery, msg map[string]interface{}) {
_, _, _, data := ParseMsg(msg)
req, err := util.MapToStructT[proto.UserOnline](data)
if err != nil {
log.Error(err.Error())
return
}
uid, _ := strconv.ParseInt(req.Uid, 10, 64)
log.Debug(fmt.Sprintf("玩家下线:%v", uid))
rms := RoomMgr.FindPlayerRooms(uid)
for _, rm := range rms {
leaveRoomMsg := util.MakeMessage(proto.ReqLeaveRoomId, &proto.ReqLeaveRoom{RoomId: rm.Id()}, uid, rm.Id())
rm.OnMessage(proto.ReqLeaveRoomId, leaveRoomMsg)
}
}
// 更新配置
func onUpdateConfig(_ *amqp091.Delivery, _ map[string]interface{}) {
log.Debug("更新配置")
model.InitStub()
}
// 有同类服务启动,本服务没有玩家使用时,自动关闭
func onUpdateService(_ *amqp091.Delivery, msg map[string]interface{}) {
_, _, _, data := ParseMsg(msg)
req, err := util.MapToStructT[proto.NtfNewService](data)
if err != nil {
log.Error(err.Error())
return
}
if req.Type == CathetaService.Type() && req.IsClub == (config.Cmd.IsClub > 0) {
if req.RouterKey != QueueName() {
log.Info(fmt.Sprintf("新服务:%v上线本服务等待玩家离开后关闭 req:%+v", req.RouterKey, req))
CathetaService.AutoWaitStop = true
RoomMgr.DelEmptyRoom()
}
}
}
// 管理员解散指定房间
func onDisbandRoom(_ *amqp091.Delivery, msg map[string]interface{}) {
_, _, _, data := ParseMsg(msg)
req, err := util.MapToStructT[proto.ReqDisbandRoom](data)
if err != nil {
log.Error(err.Error())
return
}
if rm := RoomMgr.Find(req.RoomId); rm != nil {
rm.OnMessage(proto.ReqDisbandRoomId, msg)
}
}