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) } }