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

423 lines
12 KiB
Go

package handler
import (
"fmt"
"github.com/rabbitmq/amqp091-go"
"samba/pkg/log"
"samba/pkg/servername"
"samba/proto"
"samba/util/model"
"samba/util/routingKey"
"samba/util/util"
)
func fillClubMainPageInfo(uid int64, rsp *proto.RspClubMainPage, clubInfo *model.ClubInfo, userClubInfo *model.UserClubInfo) {
rsp.MainPageInfo.ClubId = clubInfo.ID
rsp.MainPageInfo.Name = clubInfo.Name
//rsp.MainPageInfo.Coin = clubInfo.Coin
rsp.MainPageInfo.Score = userClubInfo.Score + userClubInfo.FreeScore + userClubInfo.InOutFreeScore
rsp.MainPageInfo.PrettyNo = clubInfo.PrettyNo
rsp.MainPageInfo.Creator = clubInfo.CreatorName
rsp.MainPageInfo.IconId = clubInfo.IconId
rsp.MainPageInfo.HeadUrl = clubInfo.HeadUrl
rsp.MainPageInfo.Level = clubInfo.Level
rsp.MainPageInfo.UserScore = clubInfo.UserScore
rsp.MainPageInfo.JobTitle = userClubInfo.Admin
if uid != clubInfo.Creator {
rsp.MainPageInfo.Coin = 0
} else {
clubCoin, _ := model.NewUserResourceOp().Get(uid, model.ResClubCoins)
rsp.MainPageInfo.Coin = clubCoin
}
}
func fillClubPlayingRoom(playingRoom *model.ClubPlayingRoom) *proto.ClubPlayingRoom {
return &proto.ClubPlayingRoom{
RoomId: playingRoom.RoomId,
RoomType: playingRoom.RoomType,
PlayType: playingRoom.PlayType,
Blind: playingRoom.Blind,
CurrPlayerNum: playingRoom.CurrPlayerNum,
MaxPlayerNum: playingRoom.MaxPlayerNum,
Status: playingRoom.Status,
MaxGameNum: playingRoom.MaxGameNum,
Top: playingRoom.Top,
}
}
// 俱乐部在线房间刷新
func onClubPlayingRooms(_ *amqp091.Delivery, msg map[string]interface{}) {
_, _, uid, data := ParseMsg(msg)
req, err := util.MapToStructT[proto.ReqClubPlayingRooms](data)
if err != nil {
log.Error(err.Error())
return
}
rsp := &proto.RspClubPlayingRooms{Code: proto.Ok, ClubId: req.ClubId}
playingRooms, err := model.NewClubPlayingRoomOp().LoadAll(req.ClubId)
if err != nil {
log.Error(err.Error())
SendMsgToGate(uid, proto.RspClubPlayingRoomsId, &proto.RspClubPlayingRooms{Code: proto.Internal})
return
}
for _, rm := range playingRooms {
rsp.Rooms = append(rsp.Rooms, fillClubPlayingRoom(rm))
}
//for _, rm := range rsp.Rooms {
// log.Debug(fmt.Sprintf("RspClubPlayingRoomsId:%#v", rm))
//}
//b, _ := json.Marshal(rsp)
//log.Debug(fmt.Sprintf("RspClubPlayingRoomsId:%#v", string(b)))
SendMsgToGate(uid, proto.RspClubPlayingRoomsId, rsp)
}
// 俱乐部主页
func onClubMainPage(_ *amqp091.Delivery, msg map[string]interface{}) {
_, _, uid, data := ParseMsg(msg)
req, err := util.MapToStructT[proto.ReqClubMainPage](data)
if err != nil {
log.Error(err.Error())
return
}
clubInfo, err := model.NewClubInfoOp().Load(req.ClubId)
if err != nil {
log.Error(err.Error())
SendMsgToGate(uid, proto.RspClubMainPageId, &proto.RspClubMainPage{Code: proto.ClubNotExist})
return
}
if lv := model.NewClubLevelOp().GetLevel(clubInfo); lv != nil {
clubInfo.Level = lv.Level
}
userClubInfo, err := model.NewUserClubInfoOp().Load(uid, req.ClubId)
if err != nil {
log.Error(err.Error())
SendMsgToGate(uid, proto.RspClubMainPageId, &proto.RspClubMainPage{Code: proto.NotInClub})
return
}
perms := model.NewClubPermissionsOp().Load(req.ClubId)
rsp := &proto.RspClubMainPage{Code: proto.Ok, Rooms: nil, MainPageInfo: proto.ClubMainPageInfo{}, Permissions: perms}
fillClubMainPageInfo(uid, rsp, clubInfo, userClubInfo)
playingRooms, err := model.NewClubPlayingRoomOp().LoadAll(req.ClubId)
if err != nil {
log.Error(err.Error())
SendMsgToGate(uid, proto.RspClubMainPageId, &proto.RspClubMainPage{Code: proto.NotClubPlayGame})
return
}
for _, rm := range playingRooms {
rsp.Rooms = append(rsp.Rooms, fillClubPlayingRoom(rm))
}
SendMsgToGate(uid, proto.RspClubMainPageId, rsp)
}
func checkCreatePlayGame(userId int64, req *proto.ReqCreatePlayGame) proto.ErrorCode {
if !checkCreatePermissions(userId, req.ClubId) {
return proto.BadParam
}
if req.GameInfo.Blind < 1 || req.GameInfo.PlayerNum < 2 {
return proto.BadParam
}
return proto.Ok
}
// 俱乐部创建玩法
func onCreatePlayGame(_ *amqp091.Delivery, msg map[string]interface{}) {
_, _, uid, data := ParseMsg(msg)
req, err := util.MapToStructT[proto.ReqCreatePlayGame](data)
if err != nil {
log.Error(err.Error())
return
}
if code := checkCreatePlayGame(uid, req); code != proto.Ok {
SendMsgToGate(uid, proto.RspCreatePlayGameId, &proto.RspCreatePlayGame{Code: proto.BadParam})
return
}
rsp := &proto.RspCreatePlayGame{Code: proto.Ok}
playInfo := &model.ClubPlayInfo{
ID: 0,
ClubId: req.ClubId,
Name: req.GameInfo.Name,
PlayType: req.GameInfo.PlayType,
Blind: req.GameInfo.Blind,
PlayerNum: req.GameInfo.PlayerNum,
GameNum: req.GameInfo.GameNum,
Fee: req.GameInfo.Fee,
State: 1,
IsValid: 1,
Top: req.GameInfo.Top,
}
playInfos, _ := model.NewClubPlayInfoOp().Load(req.ClubId)
exist := false
if len(playInfos) != 0 {
for _, pi := range playInfos {
if pi.PlayType == playInfo.PlayType && pi.Blind == playInfo.Blind && pi.PlayerNum == playInfo.PlayerNum &&
pi.Fee == playInfo.Fee && pi.GameNum == playInfo.GameNum {
exist = true
break
}
}
}
if exist {
rsp.Code = proto.ExistClubPlayGame
SendMsgToGate(uid, proto.RspCreatePlayGameId, rsp)
return
}
err = model.NewClubPlayInfoOp().Create(playInfo)
if err != nil {
rsp.Code = proto.BadParam
SendMsgToGate(uid, proto.RspCreatePlayGameId, rsp)
return
}
rsp.ClubId = req.ClubId
rsp.GameInfo = req.GameInfo
rsp.GameInfo.Id = playInfo.ID
rsp.GameInfo.Blind = req.GameInfo.Blind
rsp.GameInfo.Valid = playInfo.IsValid
SendMsgToGate(uid, proto.RspCreatePlayGameId, rsp)
if rsp.Code == proto.Ok {
// 广播创建玩法
SendMsg(util.Topic(servername.Club), routingKey.CreateClubPlayType, 0, proto.RspCreatePlayGameId, rsp)
}
}
// 俱乐部获取所有玩法
func onGetPlayGames(_ *amqp091.Delivery, msg map[string]interface{}) {
_, _, uid, data := ParseMsg(msg)
req, err := util.MapToStructT[proto.ReqGetPlayGames](data)
if err != nil {
log.Error(err.Error())
return
}
if !checkPermissions(uid, req.ClubId) {
SendMsgToGate(uid, proto.RspGetPlayGamesId, &proto.RspGetPlayGames{Code: proto.BadParam})
return
}
rsp := &proto.RspGetPlayGames{Code: proto.Ok}
playInfos, err := model.NewClubPlayInfoOp().Load(req.ClubId)
if err != nil {
SendMsgToGate(uid, proto.RspGetPlayGamesId, rsp)
return
}
for _, info := range playInfos {
rsp.GameInfo = append(rsp.GameInfo, proto.ClubPlayGameInfo{
Id: info.ID,
Name: info.Name,
PlayType: info.PlayType,
Blind: info.Blind,
PlayerNum: info.PlayerNum,
GameNum: info.GameNum,
Fee: info.Fee,
Valid: info.IsValid,
Top: info.Top,
})
}
log.Debug(fmt.Sprintf("%#v", rsp))
SendMsgToGate(uid, proto.RspGetPlayGamesId, rsp)
}
func checkPermissions(userId int64, clubId int) bool {
userClubInfo, err := model.NewUserClubInfoOp().Load(userId, clubId)
if err != nil {
log.Error(err.Error())
return false
}
if userClubInfo.Admin == 1 {
return true
}
if userClubInfo.Admin == 2 {
return true
}
return false
}
// 检查创建玩法的权限
func checkCreatePermissions(userId int64, clubId int) bool {
userClubInfo, err := model.NewUserClubInfoOp().Load(userId, clubId)
if err != nil {
log.Error(err.Error())
return false
}
if userClubInfo.Admin == 1 {
return true
}
if userClubInfo.Admin != 2 {
return false
}
perms := model.NewClubPermissionsOp().Load(clubId)
for _, pi := range perms {
if pi == 1001 {
return true
}
}
return false
}
// 俱乐部修改玩法
func onUpdatePlayGame(_ *amqp091.Delivery, msg map[string]interface{}) {
_, _, uid, data := ParseMsg(msg)
req, err := util.MapToStructT[proto.ReqUpdatePlayGame](data)
if err != nil {
log.Error(err.Error())
return
}
if !checkCreatePermissions(uid, req.ClubId) {
SendMsgToGate(uid, proto.RspUpdatePlayGameId, &proto.RspUpdatePlayGame{Code: proto.BadParam})
return
}
playInfo := &model.ClubPlayInfo{
ID: req.GameInfo.Id,
ClubId: req.ClubId,
Name: req.GameInfo.Name,
PlayType: req.GameInfo.PlayType,
Blind: req.GameInfo.Blind,
PlayerNum: req.GameInfo.PlayerNum,
GameNum: req.GameInfo.GameNum,
Fee: req.GameInfo.Fee,
State: 1,
IsValid: req.GameInfo.Valid,
Top: req.GameInfo.Top,
}
playInfos, _ := model.NewClubPlayInfoOp().Load(req.ClubId)
exist := false
if len(playInfos) != 0 {
for _, pi := range playInfos {
if pi.PlayType == playInfo.PlayType && pi.Blind == playInfo.Blind && pi.PlayerNum == playInfo.PlayerNum &&
pi.Fee == playInfo.Fee && pi.GameNum == playInfo.GameNum {
exist = true
break
}
}
}
rsp := &proto.RspUpdatePlayGame{Code: proto.Ok}
if exist {
rsp.Code = proto.ExistClubPlayGame
SendMsgToGate(uid, proto.RspUpdatePlayGameId, rsp)
return
}
err = model.NewClubPlayInfoOp().Update(playInfo)
if err != nil {
rsp.Code = proto.BadParam
SendMsgToGate(uid, proto.RspUpdatePlayGameId, rsp)
return
}
rsp.ClubId = req.ClubId
rsp.SrcGameId = req.GameInfo.Id
rsp.GameInfo = req.GameInfo
rsp.GameInfo.Id = playInfo.ID
rsp.GameInfo.Valid = req.GameInfo.Valid
rsp.GameInfo.Blind = req.GameInfo.Blind
SendMsgToGate(uid, proto.RspUpdatePlayGameId, rsp)
if rsp.Code == proto.Ok {
// 广播创建玩法
SendMsg(util.Topic(servername.Club), routingKey.CreateClubPlayType, 0, proto.RspUpdatePlayGameId, rsp)
}
}
// 俱乐部删除玩法
func onDeletePlayGame(_ *amqp091.Delivery, msg map[string]interface{}) {
_, _, uid, data := ParseMsg(msg)
req, err := util.MapToStructT[proto.ReqDeletePlayGame](data)
if err != nil {
log.Error(err.Error())
return
}
if !checkCreatePermissions(uid, req.ClubId) {
SendMsgToGate(uid, proto.RspDeletePlayGameId, &proto.RspDeletePlayGame{Code: proto.BadParam})
return
}
playInfo := &model.ClubPlayInfo{
ID: req.PlayGameId,
ClubId: req.ClubId,
}
err = model.NewClubPlayInfoOp().Delete(playInfo)
rsp := &proto.RspDeletePlayGame{Code: proto.Ok}
if err != nil {
rsp.Code = proto.BadParam
SendMsgToGate(uid, proto.RspDeletePlayGameId, rsp)
return
}
rsp.PlayGameId = req.PlayGameId
rsp.ClubId = req.ClubId
SendMsgToGate(uid, proto.RspDeletePlayGameId, rsp)
if rsp.Code == proto.Ok {
// 广播创建玩法
SendMsg(util.Topic(servername.Club), routingKey.CreateClubPlayType, 0, proto.RspDeletePlayGameId, rsp)
}
}
// 俱乐部设置无效
func onSetPlayGameValid(_ *amqp091.Delivery, msg map[string]interface{}) {
_, _, uid, data := ParseMsg(msg)
req, err := util.MapToStructT[proto.ReqSetPlayGameValid](data)
if err != nil {
log.Error(err.Error())
return
}
rsp := &proto.RspSetPlayGameValid{Code: proto.BadParam, PlayGameId: req.PlayGameId, Valid: req.Valid, ClubId: req.ClubId}
if !checkCreatePermissions(uid, req.ClubId) {
SendMsgToGate(uid, proto.RspSetPlayGameValidId, rsp)
return
}
playInfo := model.NewClubPlayInfoOp().LoadAPlayInfo(req.ClubId, req.PlayGameId)
if playInfo == nil {
SendMsgToGate(uid, proto.RspSetPlayGameValidId, rsp)
return
}
broadcast := false
if playInfo.IsValid != req.Valid {
playInfo.IsValid = req.Valid
err = model.NewClubPlayInfoOp().SetValid(playInfo)
if err != nil {
SendMsgToGate(uid, proto.RspSetPlayGameValidId, rsp)
return
}
broadcast = true
}
rsp.Code = proto.Ok
SendMsgToGate(uid, proto.RspSetPlayGameValidId, rsp)
if broadcast {
// 广播创建玩法
SendMsg(util.Topic(servername.Club), routingKey.CreateClubPlayType, 0, proto.RspSetPlayGameValidId, rsp)
}
}
// 俱乐部设置玩法置顶
func onSetPlayGameTop(_ *amqp091.Delivery, msg map[string]interface{}) {
_, _, uid, data := ParseMsg(msg)
req, err := util.MapToStructT[proto.ReqSetPlayGameTop](data)
if err != nil {
log.Error(err.Error())
return
}
rsp := &proto.RspSetPlayGameTop{Code: proto.BadParam, PlayGameId: req.PlayGameId, Top: req.Top, ClubId: req.ClubId}
if !checkCreatePermissions(uid, req.ClubId) {
SendMsgToGate(uid, proto.RspSetPlayGameTopId, rsp)
return
}
playInfo := model.NewClubPlayInfoOp().LoadAPlayInfo(req.ClubId, req.PlayGameId)
if playInfo == nil {
SendMsgToGate(uid, proto.RspSetPlayGameTopId, rsp)
return
}
if playInfo.Top != req.Top {
playInfo.Top = req.Top
err = model.NewClubPlayInfoOp().SetTop(playInfo)
if err != nil {
SendMsgToGate(uid, proto.RspSetPlayGameTopId, rsp)
return
}
}
rsp.Code = proto.Ok
SendMsgToGate(uid, proto.RspSetPlayGameTopId, rsp)
}