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

328 lines
9.4 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 (
"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/state"
"samba/util/util"
)
func getUserClubAllScore(userClubInfo *model.UserClubInfo) int64 {
return userClubInfo.Score + userClubInfo.FreeScore + userClubInfo.InOutFreeScore
}
func checkEnterClubRoom(userClubInfo *model.UserClubInfo, req *proto.ReqEnterClubRoom) (proto.ErrorCode, IRoom) {
if req.ClubId == 0 {
log.Debug(fmt.Sprintf("club:%v not exist", req.ClubId))
return proto.BadParam, nil
}
if userClubInfo == nil {
log.Debug(fmt.Sprintf("userClubInfo is nil"))
return proto.NotInClub, nil
}
if getUserClubAllScore(userClubInfo) < 1 {
log.Debug(fmt.Sprintf("user:%v club:%v socre:%v freeScore:%v inoutScore:%v not enough", userClubInfo.UID, req.ClubId, userClubInfo.Score,
userClubInfo.FreeScore, userClubInfo.InOutFreeScore))
return proto.UserClubScoreNotEnough, nil
}
clubInfo, _ := model.NewClubInfoOp().Load(req.ClubId)
clubCoin := int64(0)
if clubInfo != nil {
clubCoin, _ = model.NewUserResourceOp().Get(clubInfo.Creator, model.ResClubCoins)
if clubInfo.Open != 1 {
return proto.ClubNotOpen, nil
}
}
// 部长身上俱乐部币不足
if clubCoin < 1 {
return proto.ClubCoinNotEnough, nil
}
waitRooms, err := model.NewClubPlayingRoomOp().LoadAll(req.ClubId)
if err != nil {
log.Debug(fmt.Sprintf("club:%v not exist waiting rooms", req.ClubId))
return proto.Internal, nil
}
var waitRoom *model.ClubPlayingRoom
for _, wtRoom := range waitRooms {
if req.RoomID == wtRoom.RoomId {
waitRoom = wtRoom
break
} else {
if wtRoom.RoomType == req.RoomType {
waitRoom = wtRoom
}
}
}
if waitRoom != nil {
if waitRoom.Blind > getUserClubAllScore(userClubInfo) {
return proto.UserClubScoreNotEnough, nil
}
if rm := RoomMgr.Find(waitRoom.RoomId); rm != nil && rm.ClubId() == req.ClubId {
return proto.Ok, rm
}
}
return proto.NotClubPlayGame, nil
}
// 玩家进俱乐部房间
func onEnterClubRoom(_ *amqp091.Delivery, msg map[string]interface{}) {
_, _, uid, data := ParseMsg(msg)
req, err := util.MapToStructT[proto.ReqEnterClubRoom](data)
if err != nil {
log.Error(err.Error())
return
}
log.Debug(fmt.Sprintf("recv user:%v ReqEnterClubRoom msg:%v", uid, req))
rsp := &proto.RspEnterClubRoom{Code: proto.Ok, ClubId: req.ClubId, RoomID: req.RoomID, RoomType: req.RoomType}
var user *Player
if user, err = NewPlayer(uid); err != nil || user == nil || user.UserInfo == nil {
if err == nil {
log.Error(fmt.Sprintf("user:%v new user error", uid))
} else {
log.Error(fmt.Sprintf("user:%v new user error:%v", uid, err.Error()))
}
rsp.Code = proto.Internal
SendMsgToGate(uid, proto.RspEnterClubRoomId, rsp)
return
}
userClubInfo, _ := model.NewUserClubInfoOp().Load(uid, req.ClubId)
code, iRm := checkEnterClubRoom(userClubInfo, req)
rsp.Code = code
SendMsgToGate(uid, proto.RspEnterClubRoomId, rsp)
if iRm != nil {
trucoRoom := iRm.(*TrucoRoom)
trucoRoom.OnEnterRoom(user)
}
}
// 1. 房间匹配规则:走以下判断
// 1.1. 判断1携带的积分是否0
// 1.1. 是——走判断2
// 1.2. 否——提示:您的积分不足,请联系管理员!
// 2. 判断2是否为俱乐部内首次对局
// 2.1. 是——将用户放入到可进入且能尽快开始的房间中
// 2.2. 否——走判断3
// 3. 判断3携带积分是否满足进入上次对局的场次
// 3.1. 是——根据用户上次的进入场次匹配房间
// 3.2. 否——将用户放入到可进入且能尽快开始的房间中
func checkQuickEnterClubRoom(clubInfo *model.ClubInfo, userClubInfo *model.UserClubInfo, req *proto.ReqQuickEnterClubRoom) (proto.ErrorCode, IRoom) {
if req.ClubId == 0 {
log.Debug(fmt.Sprintf("club:%v can not 0 ", req.ClubId))
return proto.BadParam, nil
}
if userClubInfo == nil {
log.Debug(fmt.Sprintf("club:%v user club info can not nil", req.ClubId))
return proto.BadParam, nil
}
if clubInfo == nil {
log.Debug(fmt.Sprintf("club:%v not exist", req.ClubId))
return proto.NotInClub, nil
}
if clubInfo.Open != 1 {
return proto.ClubNotOpen, nil
}
if getUserClubAllScore(userClubInfo) < 1 {
log.Debug(fmt.Sprintf("user:%v club:%v socre:%v freeScore:%v inoutScore:%v not enough", userClubInfo.UID, req.ClubId, userClubInfo.Score,
userClubInfo.FreeScore, userClubInfo.InOutFreeScore))
return proto.UserClubScoreNotEnough, nil
}
clubCoin, _ := model.NewUserResourceOp().Get(clubInfo.Creator, model.ResClubCoins)
// 部长身上俱乐部币不足
if clubCoin < 1 {
return proto.ClubCoinNotEnough, nil
}
var waitRoom *model.ClubPlayingRoom
// 最近玩的房间配置id
roomType := model.NewUserQuickMatchOp().GetRoomType(userClubInfo.UID, req.PlayType)
// 等待开始房间
waitAndPlayingRooms, err := model.NewClubPlayingRoomOp().LoadAll(req.ClubId)
if err != nil {
log.Debug(fmt.Sprintf("club:%v not exist waiting rooms", req.ClubId))
return proto.Internal, nil
}
if roomType != 0 {
for _, info := range waitAndPlayingRooms {
if info.RoomType == roomType && info.Status <= int(state.RsReadyStart) {
if userClubInfo.Score < info.Blind {
continue
}
if info.MaxPlayerNum-info.CurrPlayerNum < 1 {
continue
}
waitRoom = info
break
}
}
// 没有该房间,则查找玩法一致的可进入房间
if waitRoom == nil {
for _, info := range waitAndPlayingRooms {
if info.PlayType == req.PlayType {
if userClubInfo.Score < info.Blind {
continue
}
if info.MaxPlayerNum-info.CurrPlayerNum < 1 {
continue
}
waitRoom = info
break
}
}
}
if waitRoom == nil {
return proto.NotClubPlayGame, nil
}
}
// 查看能立即凑满人数开局的房间
if waitRoom == nil {
needPlayerNum := 100
for _, info := range waitAndPlayingRooms {
if info.PlayType == req.PlayType && info.Status <= int(state.RsReadyStart) {
if userClubInfo.Score < info.Blind {
continue
}
if needPlayerNum <= info.MaxPlayerNum-info.CurrPlayerNum {
continue
}
needPlayerNum = info.MaxPlayerNum - info.CurrPlayerNum
waitRoom = info
}
}
}
if waitRoom == nil {
return proto.UserClubScoreNotEnough, nil
} else {
if rm := RoomMgr.Find(waitRoom.RoomId); rm != nil && rm.ClubId() == req.ClubId {
return proto.Ok, rm
} else {
return proto.NotClubPlayGame, nil
}
}
}
// 俱乐部玩法快速进房间
func onQuickEnterClubRoom(_ *amqp091.Delivery, msg map[string]interface{}) {
_, _, uid, data := ParseMsg(msg)
req, err := util.MapToStructT[proto.ReqQuickEnterClubRoom](data)
if err != nil {
log.Error(err.Error())
return
}
log.Debug(fmt.Sprintf("recv user:%v ReqQuickEnterClubRoom msg:%v", uid, req))
userClubInfo, _ := model.NewUserClubInfoOp().Load(uid, req.ClubId)
clubInfo, _ := model.NewClubInfoOp().Load(req.ClubId)
code, iRm := checkQuickEnterClubRoom(clubInfo, userClubInfo, req)
rsp := &proto.RspQuickEnterClubRoom{Code: code, ClubId: req.ClubId, PlayType: req.PlayType}
if code != proto.Ok {
SendMsgToGate(uid, proto.RspQuickEnterClubRoomId, rsp)
return
}
var user *Player
if user, err = NewPlayer(uid); err != nil || user == nil || user.UserInfo == nil {
if err == nil {
log.Error(fmt.Sprintf("user:%v new user error", uid))
} else {
log.Error(fmt.Sprintf("user:%v new user error:%v", uid, err.Error()))
}
rsp.Code = proto.Internal
SendMsgToGate(uid, proto.RspQuickEnterClubRoomId, rsp)
return
}
rsp.Code = code
SendMsgToGate(uid, proto.RspQuickEnterClubRoomId, rsp)
if iRm != nil {
trucoRoom := iRm.(*TrucoRoom)
trucoRoom.OnEnterRoom(user)
}
}
// 俱乐部创建玩法
func onCreatePlayGame(_ *amqp091.Delivery, msg map[string]interface{}) {
if TrucoService.AutoWaitStop {
return
}
// 不是俱乐部服务
if config.Cmd.IsClub == 0 {
return
}
_, _, _, data := ParseMsg(msg)
req, err := util.MapToStructT[proto.RspCreatePlayGame](data)
if err != nil {
log.Error(err.Error())
return
}
RoomMgr.CreateClubRoom(req.ClubId, req.GameInfo.Id, NewTrucoRoom)
}
// 俱乐部删除玩法
func onDelPlayGame(_ *amqp091.Delivery, msg map[string]interface{}) {
// 不是俱乐部服务
if config.Cmd.IsClub == 0 {
return
}
_, _, _, data := ParseMsg(msg)
req, err := util.MapToStructT[proto.RspDeletePlayGame](data)
if err != nil {
log.Error(err.Error())
return
}
RoomMgr.DeleteClubRoom(req.ClubId, req.PlayGameId)
if TrucoService.AutoWaitStop {
return
}
}
// 俱乐部修改玩法
func onUpdatePlayGame(_ *amqp091.Delivery, msg map[string]interface{}) {
// 不是俱乐部服务
if config.Cmd.IsClub == 0 {
return
}
_, _, _, data := ParseMsg(msg)
req, err := util.MapToStructT[proto.RspUpdatePlayGame](data)
if err != nil {
log.Error(err.Error())
return
}
RoomMgr.DeleteClubRoom(req.ClubId, req.SrcGameId)
if TrucoService.AutoWaitStop {
return
}
RoomMgr.CreateClubRoom(req.ClubId, req.GameInfo.Id, NewTrucoRoom)
}
// 俱乐部修改玩法
func onSetPlayGameValid(_ *amqp091.Delivery, msg map[string]interface{}) {
// 不是俱乐部服务
if config.Cmd.IsClub == 0 {
return
}
_, _, _, data := ParseMsg(msg)
req, err := util.MapToStructT[proto.RspSetPlayGameValid](data)
if err != nil {
log.Error(err.Error())
return
}
if req.Valid == 0 {
RoomMgr.DeleteClubRoom(req.ClubId, req.PlayGameId)
return
}
if TrucoService.AutoWaitStop {
return
}
RoomMgr.CreateClubRoom(req.ClubId, req.PlayGameId, NewTrucoRoom)
}