| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239 |
- package frame
- import (
- "bet24.com/log"
- "bet24.com/servers/insecureframe/gate"
- "bet24.com/servers/insecureframe/message"
- privateroom "bet24.com/servers/micros/privateroom/proto"
- robot_query "bet24.com/servers/micros/userservices/proto"
- userservices "bet24.com/servers/micros/userservices/proto"
- "encoding/json"
- "time"
- )
- // IPrivateRoomSink
- func (f *GameFrame) CreatePrivateRoom(creator int, ruleName string, target int, userCount int, playTimeout int) int {
- // 先创建一个table
- table := f.createPrivateTable(creator, ruleName, target, userCount, playTimeout)
- // 去coreservice判断是否能创建
- roomNo, errMsg := privateroom.CreatePrivateRoomByGameServer(creator,
- f.gameSink.GetGameID(),
- f.gameSink.GetGameName(),
- f.gameSink.GetServerAddr(),
- table.GetTableID())
- log.Release("GameFrame.createPrivateRoom %d roomNo:%d,errMsg:%s", creator, roomNo, errMsg)
- // 如果失败
- if roomNo <= 0 {
- // 解散桌子
- f.removeTable(table.GetTableID())
- return roomNo
- }
- table.setRoomNo(roomNo)
- return roomNo
- }
- func (f *GameFrame) getPrivateTable(roomNo int) *ThreadsafeTable {
- if roomNo <= 0 {
- return nil
- }
- f.lock_table.RLock()
- defer f.lock_table.RUnlock()
- for k, v := range f.tables {
- if v.roomNo != roomNo {
- continue
- }
- if v.stopped {
- log.Release("GameFrame.getPrivateTable [%d] stopped", v.tableId)
- return nil
- }
- return f.tables[k]
- }
- return nil
- }
- func (f *GameFrame) OnRoomStatusChanged(roomNo int, oldStatus, newStatus int) {
- // 找到房间
- t := f.getPrivateTable(roomNo)
- if t == nil {
- log.Release("GameFrame.OnRoomStatusChanged failed roomNo[%d] not exist", roomNo)
- return
- }
- t.onPrivateRoomStatusChanged(oldStatus, newStatus)
- }
- func (f *GameFrame) OnRoomDismissed(roomNo int) {
- // 找到房间
- t := f.getPrivateTable(roomNo)
- if t == nil {
- log.Release("GameFrame.OnRoomDismissed failed roomNo[%d] not exist", roomNo)
- return
- }
- t.onPrivateRoomDismissed()
- // 百人场可能需要等待一段时间后才删除
- if gameFrame.gameSink.GetChairCount() < 2 {
- time.Sleep(2 * time.Minute)
- }
- f.removeTable(t.tableId)
- }
- func (f *GameFrame) recvPrivateRoomRequestDismiss(userIndex int32, msg, data string) bool {
- if !f.gameSink.IsPrivateRoom() {
- return false
- }
- usr := gate.GetUserInfo(userIndex)
- if usr == nil {
- log.Debug("recvPrivateRoomRequestDismiss user not exist,%d,%s", userIndex, msg)
- return false
- }
- table := f.getTable(usr.GetUserTableId())
- if table == nil {
- log.Debug("recvPrivateRoomRequestDismiss user not in table,%d:%d,%s", userIndex, usr.GetUserId(), msg)
- return false
- }
- return table.onPrivateRoomRequestDismiss(usr, msg, data)
- }
- func (f *GameFrame) ForceEnterUser(userId int, roomNo int, chairId int) {
- // 找到房间
- t := f.getPrivateTable(roomNo)
- if t == nil {
- log.Release("GameFrame.ForceEnterUser failed roomNo[%d] not exist", roomNo)
- return
- }
- // 已经在了?
- usr := gate.GetUserByUserId(userId)
- if usr != nil {
- if usr.GetUserTableId() == t.tableId && usr.GetUserChairId() == chairId {
- log.Release("GameFrame.ForceEnterUser UserId[%d] RoomNo[%d] user already sit", userId, roomNo)
- return
- }
- log.Release("GameFrame.ForceEnterUser UserId[%d] RoomNo[%d] [%d.%d] kicking exist user[%d.%d]",
- userId, roomNo, t.tableId, chairId, usr.GetUserTableId(), usr.GetUserChairId())
- gate.KickUser(usr.GetUserIndex())
- }
- // 把玩家登录进来
- usr = gate.LoginAUser(userId)
- if usr == nil {
- log.Release("GameFrame.ForceEnterUser LoginAUser failed UserId = %d roomNo = %d", userId, roomNo)
- return
- }
- t.AddTableUser_sync(usr.GetUserIndex(), chairId, false, false)
- // 如果加入失败
- if usr.GetUserTableId() != t.tableId {
- log.Release("GameFrame.ForceEnterUser %d to %d failed", userId, roomNo)
- gate.SilentRemoveUser(userId)
- return
- }
- if robot_query.IsRobot(userId) {
- usr.SetRobot()
- }
- // 举手
- t.setUserReadyStatus_sync(usr.GetUserIndex(), true)
- f.addOfflineUser(usr)
- gate.SilentRemoveUser(userId)
- }
- func (f *GameFrame) recvPrivateRoomDismissResp(userIndex int32, msg, data string) bool {
- if !f.gameSink.IsPrivateRoom() {
- return false
- }
- usr := gate.GetUserInfo(userIndex)
- if usr == nil {
- log.Debug("recvPrivateRoomDismissResp user not exist,%d,%s", userIndex, msg)
- return false
- }
- table := f.getTable(usr.GetUserTableId())
- if table == nil {
- log.Debug("recvPrivateRoomDismissResp user not in table,%d:%d,%s", userIndex, usr.GetUserId(), msg)
- return false
- }
- return table.onPrivateRoomDismissResp(usr, msg, data)
- }
- func (f *GameFrame) SetExtraParam(roomNo int, userId int, paramId int, data string) (ret string) {
- t := f.getPrivateTable(roomNo)
- if t == nil {
- log.Release("GameFrame.SetExtraParam(%d) failed roomNo[%d] not exist", paramId, roomNo)
- return
- }
- ret = ""
- return
- }
- func (f *GameFrame) recvPrivateRoomKick(userIndex int32, msg, data string) bool {
- if !f.gameSink.IsPrivateRoom() {
- log.Debug("recvPrivateRoomKick not in privateroom")
- return false
- }
- usr := gate.GetUserInfo(userIndex)
- if usr == nil {
- log.Debug("recvPrivateRoomKick user not exist,%d,%s", userIndex, msg)
- return false
- }
- table := f.getTable(usr.GetUserTableId())
- if table == nil {
- log.Debug("recvPrivateRoomKick user not in table,%d:%d,%s", userIndex, usr.GetUserId(), msg)
- f.sendKickResult(userIndex, false, "not in table")
- return false
- }
- var kick message.KickUser
- e := json.Unmarshal([]byte(data), &kick)
- if e != nil {
- log.Debug("GameFrame.recvPrivateRoomKick Unmarshal failed %s", data)
- f.sendKickResult(userIndex, false, "invalid argument")
- return false
- }
- toUser := gate.GetUserByUserId(kick.ToUserId)
- if toUser == nil {
- log.Release("GameFrame.recvPrivateRoomKick toUserId[%d] not exist", kick.ToUserId)
- return false
- }
- if !userservices.CanKickPrivateRoomUser(usr.GetUserId(), kick.ToUserId) {
- log.Debug("GameFrame.recvPrivateRoomKick [%d]no right to kick[%d]", usr.GetUserId(), kick.ToUserId)
- f.sendKickResult(userIndex, false, "no right")
- return false
- }
- // 可以踢人
- ret := table.kickUser(toUser.GetUserIndex())
- if ret {
- // 发送成功指令
- f.sendKickResult(userIndex, true, "")
- f.sendBeKicked(toUser.GetUserIndex(), usr.GetUserId())
- } else {
- f.sendKickResult(userIndex, false, "failed")
- }
- return ret
- }
- func (f *GameFrame) sendKickResult(userIndex int32, success bool, errMsg string) {
- ret := message.KickUser{
- Success: success,
- ErrMsg: errMsg,
- }
- d, _ := json.Marshal(ret)
- gate.SendMessage(userIndex, message.Frame_PrivateRoom_KickUser, string(d))
- }
- func (f *GameFrame) sendBeKicked(userIndex int32, fromUserId int) {
- ret := message.KickUser{
- UserId: fromUserId,
- }
- d, _ := json.Marshal(ret)
- gate.SendMessage(userIndex, message.Frame_PrivateRoom_BeKicked, string(d))
- }
|