samba/server/truco/handler/trucoHandler.go
2025-06-04 09:51:39 +08:00

215 lines
6.0 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package handler
import (
"encoding/json"
"fmt"
"github.com/rabbitmq/amqp091-go"
"samba/pkg/log"
"samba/proto"
. "samba/server/game/baseroom"
. "samba/server/game/player"
. "samba/server/truco/room"
. "samba/server/truco/service"
"samba/util/config"
"samba/util/model"
"samba/util/util"
"strconv"
)
func NewPlayer(uid int64) (*Player, error) {
p := &Player{UserInfo: &model.UserInfo{UID: uid}}
return p, p.Load()
}
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,
}
if clubId == 0 {
coins, _ := model.NewUserResourceOp().Get(user.UID, model.ResCoins)
protoPlayer.Coin = coins
} else {
coins, _ := model.NewUserClubInfoOp().Get(user.UID, clubId, 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) (*TrucoRoom, 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.(*TrucoRoom), 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 {
_ = TrucoService.PublishRpc(d, data)
}
}
// 玩家在房间内掉线,主动申请重连
func onReconnect(_ *amqp091.Delivery, msg map[string]interface{}) {
_, _, uid, data := ParseMsg(msg)
req, err := util.MapToStructT[proto.ReqReconnect](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.(*TrucoRoom); 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.ReqReconnectId, msg)
return
}
}
log.Debug(fmt.Sprintf("玩家申请重连:%v 房间不存在", uid))
SendMsgToGate(uid, proto.RspReconnectId, &proto.RspReconnect{Code: proto.NotExistRoom})
}
// 玩家下线,未开始游戏则踢出去,已开始游戏则设置假退出
func onUserOffline(d *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))
onCancelMatchRoom(d, util.MakeMessage(proto.ReqCancelMatchRoomId, &proto.ReqCancelMatchRoom{RoomType: 0}, uid, 0))
irs := RoomMgr.FindPlayerRooms(uid)
for _, ir := range irs {
if rm, ok := ir.(*TrucoRoom); ok {
rm.SetFakeLeave(uid, true)
}
}
}
// 更新配置
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 == TrucoService.Type() && req.IsClub == (config.Cmd.IsClub > 0) {
if req.RouterKey != QueueName() {
log.Info(fmt.Sprintf("新服务:%v上线本服务等待玩家离开后关闭 req:%+v", req.RouterKey, req))
TrucoService.AutoWaitStop = true
RoomMgr.DelEmptyRoom()
}
}
}
// gm解散指定房间
func onDisbandRoom(_ *amqp091.Delivery, msg map[string]interface{}) {
_, _, uid, 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)
} else {
SendMsgToGate(uid, proto.RspUserDisbandRoomId, &proto.RspUserDisbandRoom{Code: proto.NotExistRoom})
}
}
// 管理员解散指定房间
func onUserDisbandRoom(_ *amqp091.Delivery, msg map[string]interface{}) {
_, _, uid, data := ParseMsg(msg)
req, err := util.MapToStructT[proto.ReqUserDisbandRoom](data)
if err != nil {
log.Error(err.Error())
return
}
if rm := RoomMgr.Find(req.RoomId); rm != nil {
rm.OnMessage(proto.ReqUserDisbandRoomId, msg)
} else {
SendMsgToGate(uid, proto.RspUserDisbandRoomId, &proto.RspUserDisbandRoom{Code: proto.NotExistRoom})
}
}