423 lines
12 KiB
Go
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)
|
|
}
|