roommanager.go 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748
  1. package handler
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "math/rand"
  6. "os"
  7. "strconv"
  8. "sync"
  9. "time"
  10. proto "bet24.com/servers/micros/privateroom/proto"
  11. "bet24.com/log"
  12. "bet24.com/servers/common"
  13. cash "bet24.com/servers/micros/money/proto"
  14. platformconfig "bet24.com/servers/micros/platformconfig/proto"
  15. db2 "bet24.com/servers/micros/privateroom/config"
  16. game_client "bet24.com/servers/micros/privateroom/game/client"
  17. pb "bet24.com/servers/micros/privateroom/proto"
  18. rule_status "bet24.com/servers/micros/privateroom/status/client"
  19. )
  20. const (
  21. min_room_no = 100000
  22. max_room_no = 999999
  23. room_timeout_playing = 7200
  24. room_timeout_not_playing = 600
  25. room_timeout_ended = 60
  26. )
  27. const config_key = "privateroom_config"
  28. const refresh_room_config_sec = 600
  29. //const rooms_temp_key = "privateroom_rooms_temp"
  30. type roomManager struct {
  31. lock *sync.RWMutex
  32. roomNumbers []int32
  33. roomIndex int
  34. rooms map[int]*roomInfo
  35. TaxRate int
  36. Timeout_Play int64
  37. Timeout_Free int64
  38. Timeout_End int64
  39. recvMgr *receiverMgr
  40. pubishRoomInfoFlag bool
  41. }
  42. var mgr *roomManager
  43. func getRoomManager() *roomManager {
  44. if mgr == nil {
  45. mgr = new(roomManager)
  46. //mgr.ctor()
  47. }
  48. return mgr
  49. }
  50. func (rm *roomManager) run() {
  51. rm.lock = &sync.RWMutex{}
  52. rm.rooms = make(map[int]*roomInfo)
  53. rm.loadConfig()
  54. log.Release("roomManager.run taxRate = %d", rm.TaxRate)
  55. count := max_room_no - min_room_no + 1
  56. rm.roomNumbers = make([]int32, count)
  57. for i := int32(min_room_no); i < int32(max_room_no); i++ {
  58. rm.roomNumbers[i-min_room_no] = i
  59. }
  60. for i := count - 1; i > 1; i-- {
  61. rep := rand.Intn(i)
  62. rm.roomNumbers[i], rm.roomNumbers[rep] = rm.roomNumbers[rep], rm.roomNumbers[i]
  63. }
  64. rm.roomIndex = 0
  65. rm.recvMgr = newReceiverMgr()
  66. go rm.checkTimeout()
  67. }
  68. func (rm *roomManager) loadConfig() {
  69. defer func() {
  70. time.AfterFunc(refresh_room_config_sec*time.Second, rm.loadConfig)
  71. }()
  72. configString := platformconfig.GetConfig(config_key)
  73. if configString == "" {
  74. data, err := os.ReadFile("fishconf/privateroom.json")
  75. if err != nil {
  76. log.Release("privateroom.roommanager.loadData read json failed")
  77. return
  78. }
  79. configString = string(data)
  80. platformconfig.SetConfig(config_key, configString)
  81. }
  82. err := json.Unmarshal([]byte(configString), rm)
  83. if err != nil {
  84. log.Release("privateroom.roommanager.loadData Unmarshal failed err:%v", err)
  85. return
  86. }
  87. if rm.Timeout_End == 0 {
  88. rm.Timeout_End = room_timeout_ended
  89. }
  90. if rm.Timeout_Play == 0 {
  91. rm.Timeout_Play = room_timeout_playing
  92. }
  93. if rm.Timeout_Free == 0 {
  94. rm.Timeout_Free = room_timeout_not_playing
  95. }
  96. }
  97. func (rm *roomManager) checkTimeout() {
  98. time.AfterFunc(30*time.Second, rm.checkTimeout)
  99. var toRemove []int
  100. var toDelayRemove []*roomInfo
  101. rm.lock.RLock()
  102. for _, v := range rm.rooms {
  103. t := v.isTimeout(rm.Timeout_Free, rm.Timeout_Play, rm.Timeout_End)
  104. if t == room_timeout {
  105. toRemove = append(toRemove, v.RoomNo)
  106. } else if t == room_timeout_empty {
  107. toDelayRemove = append(toDelayRemove, v)
  108. }
  109. }
  110. rm.lock.RUnlock()
  111. if len(toRemove) > 0 {
  112. log.Debug("roomManager.checkTimeout removing rooms %v", toRemove)
  113. for _, v := range toRemove {
  114. rm.closeRoom(v, "timeout")
  115. }
  116. }
  117. if len(toDelayRemove) > 0 {
  118. log.Debug("roomManager.checkTimeout delay removing rooms %d", len(toDelayRemove))
  119. for _, v := range toDelayRemove {
  120. rm.delayCloseRoom(v, "timeout")
  121. }
  122. }
  123. }
  124. func (rm *roomManager) getRoomNumber() int {
  125. rm.lock.Lock()
  126. defer rm.lock.Unlock()
  127. ret := int(rm.roomNumbers[rm.roomIndex])
  128. rm.roomIndex = (rm.roomIndex + 1) % len(rm.roomNumbers)
  129. return ret
  130. }
  131. func (rm *roomManager) addRoom(userId int, gameId int, gameName, serverAddr string, tableId int) (int, string) {
  132. errMsg := "ok"
  133. roomNo := 0
  134. roomNo = rm.getRoomNumber()
  135. rm.lock.Lock()
  136. rm.rooms[roomNo] = newRoomInfo(roomNo, serverAddr, tableId, userId, gameId, gameName)
  137. // room := proto.GetIdleRoom2(1,tableId)
  138. // roominfo.Room = room
  139. rm.lock.Unlock()
  140. return roomNo, errMsg
  141. }
  142. func (rm *roomManager) delayCloseRoom(r *roomInfo, reason string) {
  143. log.Debug("roommanager.delayCloseRoom %d,%s", r.RoomNo, reason)
  144. if r.Status == pb.PrivateRoomStatus_Ended || r.isMatch() {
  145. log.Debug("roommanager.delayCloseRoom %d,%s doCloseRoom", r.RoomNo, reason)
  146. rm.doCloseRoom(r, reason)
  147. return
  148. }
  149. roomNo := r.RoomNo
  150. delaySecs := 5
  151. time.AfterFunc(time.Duration(delaySecs)*time.Second, func() {
  152. if !r.isEmpty() {
  153. log.Release("roomManager.delayCloseRoom failed roomNo[%d] not empty", r.RoomNo)
  154. return
  155. }
  156. log.Debug("roommanager.delayCloseRoom after [%d] secondss %d,%s", delaySecs, roomNo, reason)
  157. rm.closeRoom(roomNo, reason)
  158. })
  159. }
  160. func (rm *roomManager) doCloseRoom(r *roomInfo, reason string) bool {
  161. roomNo := r.RoomNo
  162. if r.Status < pb.PrivateRoomStatus_Playing {
  163. // 如果有玩家,也退费
  164. for _, v := range r.UserList {
  165. if v == nil {
  166. continue
  167. }
  168. if r.Fee > 0 {
  169. // cash.GiveMoney(v.UserId, r.Fee, common.LOGTYPE_PRIVATEROOM_ENTER, "privateroom", "fee return", "")
  170. cash.GiveMoney2(v.UserId, r.Fee, common.LOGTYPE_PRIVATEROOM_ENTER, "privateroom", "fee return", "",v.YyfUid)
  171. }
  172. }
  173. // 可以关闭,这里应该有退费之类的操作
  174. if r.createFee > 0 {
  175. //cash.GiveMoney(r.Owner, r.createFee, common.LOGTYPE_PRIVATEROOM_ENTER, "privateroom", "create return", "")
  176. for _, v := range r.UserList {
  177. if v.UserId==r.Owner{
  178. //cash.GiveMoney2(r.Owner, r.Fee, common.LOGTYPE_PRIVATEROOM_ENTER, "privateroom", "fee return", "",r.Owner.yyfUid)
  179. cash.GiveMoney2(v.UserId, r.Fee, common.LOGTYPE_PRIVATEROOM_ENTER, "privateroom", "fee return", "",v.YyfUid)
  180. }
  181. }
  182. }
  183. }
  184. if reason == "timeout" {
  185. // 超时异常结束,通知一下比赛模块
  186. var winners []int
  187. winner := r.getAUserId()
  188. if winner != 0 {
  189. winners = append(winners, winner)
  190. r.setWinners(winners)
  191. }
  192. }
  193. // 如果游戏本来就结束了
  194. if r.Status == pb.PrivateRoomStatus_Ended {
  195. reason = "Normal Ended"
  196. }
  197. r.Status = pb.PrivateRoomStatus_Ended
  198. //if addToHistory {
  199. //getHistoryManager().addHistory(*r, reason)
  200. //}
  201. go game_client.OnRoomDismissed(r.service_addr, r.RoomNo)
  202. log.Debug("closeRoom %d %s", roomNo, reason)
  203. rm.lock.Lock()
  204. var gameRoom proto.GameRoom= proto.GameRoom{TableId:rm.rooms[roomNo].TableId}
  205. //var gameRoom
  206. db2.Engine.Get(&gameRoom)
  207. gameRoom.PlayerNum=0
  208. gameRoom.Status=1
  209. fmt.Printf("游戏结束更新房间")
  210. db2.Engine.ID(gameRoom.Id).Cols("player_num","status").Update(gameRoom)
  211. delete(rm.rooms, roomNo)
  212. rm.lock.Unlock()
  213. getSubsManager().publishRoomClosed(roomNo)
  214. getCallManager().removeRoomCall(roomNo)
  215. return true
  216. }
  217. func (rm *roomManager) closeRoom(roomNo int, reason string) bool {
  218. if roomNo == 0 {
  219. //log.Debug("%s", debug.Stack())
  220. return false
  221. }
  222. r := rm.getRoomInfo(roomNo)
  223. if r == nil {
  224. log.Release("roomManager.closeRoom failed roomNo[%d] not exist [%s]", roomNo, reason)
  225. return false
  226. }
  227. return rm.doCloseRoom(r, reason)
  228. }
  229. func (rm *roomManager) setRoomStatus(roomNo, status int) {
  230. r := rm.getRoomInfo(roomNo)
  231. if r == nil {
  232. log.Release("roomManager.setRoomStatus failed roomNo[%d] not exist", roomNo)
  233. return
  234. }
  235. // 通知服务器
  236. oldStatus := r.Status
  237. r.Status = status
  238. if oldStatus != pb.PrivateRoomStatus_Playing && status == pb.PrivateRoomStatus_Playing {
  239. r.roomStart()
  240. }
  241. if oldStatus == pb.PrivateRoomStatus_Playing && status == pb.PrivateRoomStatus_Ended {
  242. r.endedTime = time.Now().Unix()
  243. getHistoryManager().addHistory(*r, "nomal end")
  244. }
  245. rm.postRoomStatusChanged(roomNo, oldStatus, r.Status)
  246. go game_client.OnRoomStatusChanged(r.service_addr, r.RoomNo, oldStatus, r.Status)
  247. getSubsManager().publishRoomInfo(r.RoomInfo)
  248. if status >= pb.PrivateRoomStatus_Playing {
  249. getCallManager().removeRoomCall(roomNo)
  250. }
  251. }
  252. func (rm *roomManager) getRoomStatus(roomNo int) int {
  253. r := rm.getRoomInfo(roomNo)
  254. if r == nil {
  255. return pb.PrivateRoomStatus_Invalid
  256. }
  257. return r.Status
  258. }
  259. func (rm *roomManager) getRoomInfo(roomNo int) *roomInfo {
  260. rm.lock.RLock()
  261. defer rm.lock.RUnlock()
  262. ret, ok := rm.rooms[roomNo]
  263. if ok {
  264. return ret
  265. }
  266. return nil
  267. }
  268. func (rm *roomManager) getUserRooms(userId int) string {
  269. var ret []roomInfo
  270. rm.lock.RLock()
  271. for _, v := range rm.rooms {
  272. if v.Owner == userId {
  273. ret = append(ret, *v)
  274. }
  275. }
  276. rm.lock.RUnlock()
  277. d, _ := json.Marshal(ret)
  278. return string(d)
  279. }
  280. func (rm *roomManager) getRoomsByGameId(gameId int, userId int) string {
  281. var ret []roomInfo
  282. rm.lock.RLock()
  283. for _, v := range rm.rooms {
  284. if !v.IsPublic && v.Owner != userId {
  285. continue
  286. }
  287. // 房间已结束
  288. if v.Status >= pb.PrivateRoomStatus_Ended {
  289. continue
  290. }
  291. if v.GameId == gameId || gameId == 0 {
  292. ret = append(ret, *v)
  293. }
  294. }
  295. rm.lock.RUnlock()
  296. d, _ := json.Marshal(ret)
  297. return string(d)
  298. }
  299. func (rm *roomManager) getPlayingRoomNo(userId int) string {
  300. ret := ""
  301. rm.lock.RLock()
  302. for _, v := range rm.rooms {
  303. if v.isUserPlaying(userId) {
  304. ret = fmt.Sprintf("%d", v.RoomNo)
  305. break
  306. }
  307. }
  308. rm.lock.RUnlock()
  309. return ret
  310. }
  311. func (rm *roomManager) setRoomExtra(roomNo int, ruleName string, ruleData string, userCount int, target int, fee int, serviceAddr string, createFee int,
  312. isDual bool, prize int, roomType string, isPublic bool, playTime int, extraInfo string) {
  313. r := rm.getRoomInfo(roomNo)
  314. if r == nil {
  315. log.Release("roomManager.setRoomExtra roomNo[%d] not found", roomNo)
  316. return
  317. }
  318. r.Status = pb.PrivateRoomStatus_Free
  319. r.createFee = createFee
  320. if r.createFee <= 0 {
  321. r.Prize = fee * userCount * (100 - rm.TaxRate) / 100
  322. } else {
  323. r.Prize = prize
  324. }
  325. r.RoomType = roomType
  326. r.IsPublic = isPublic
  327. r.setExtra(ruleName, ruleData, userCount, fee, target, serviceAddr, isDual, playTime)
  328. r.ExtraInfo = extraInfo
  329. getSubsManager().publishRoomCreated(roomNo)
  330. }
  331. func (rm *roomManager) userRequestSit(roomNo int, userId int, nickName string, faceId int, faceUrl string, chairId int, score, baseScore, setCount int,yyfUid int) string {
  332. var ret struct {
  333. ErrMsg string
  334. ServerAddr string
  335. TableId int
  336. ChairId int
  337. BlackUsers []int // 桌子内有黑名单玩家
  338. }
  339. log.Debug("roomManager.userRequestSit[%d,%d] score[%d] baseScore[%d]", roomNo, userId, score, baseScore)
  340. r := rm.getRoomInfo(roomNo)
  341. for {
  342. if r == nil {
  343. log.Release("roomManager.userRequestSit roomNo[%d] not found", roomNo)
  344. ret.ErrMsg = fmt.Sprintf("Room [%d] not found", roomNo)
  345. break
  346. }
  347. // 如果我已经在里面了
  348. oldChairId := r.getUserChair(userId)
  349. if oldChairId >= 0 {
  350. ret.ServerAddr = r.ServerAddr
  351. ret.TableId = r.TableId
  352. ret.ChairId = oldChairId
  353. break
  354. }
  355. // 扣钱
  356. if r.Fee > 0 && !cash.ReduceMoney2(userId, r.Fee, common.LOGTYPE_PRIVATEROOM_ENTER, "privateroom", "enter", "",yyfUid) {
  357. // if r.Fee > 0 && !cash.ReduceMoney(userId, r.Fee, common.LOGTYPE_PRIVATEROOM_ENTER, "privateroom", "enter", "") {
  358. log.Release("roomManager.userRequestSit not enough cash or fee[%d]", r.Fee)
  359. ret.ErrMsg = fmt.Sprintf("not enough cash or fee[%d]", r.Fee)
  360. break
  361. }
  362. ret.ChairId, ret.ErrMsg, ret.BlackUsers = r.userRequestSit(userId, nickName, faceId, faceUrl, chairId, score, baseScore, setCount,yyfUid)
  363. if ret.ChairId != -1 {
  364. ret.ServerAddr = r.ServerAddr
  365. ret.TableId = r.TableId
  366. } else {
  367. // 加回去
  368. if r.Fee > 0 {
  369. //cash.GiveMoney(userId, r.Fee, common.LOGTYPE_PRIVATEROOM_ENTER, "privateroom", "enter return", "")
  370. cash.GiveMoney2(userId, r.Fee, common.LOGTYPE_PRIVATEROOM_ENTER, "privateroom", "enter return", "",yyfUid)
  371. }
  372. }
  373. break
  374. }
  375. d, _ := json.Marshal(ret)
  376. return string(d)
  377. }
  378. func (rm *roomManager) userLeave(roomNo, userId int) bool {
  379. r := rm.getRoomInfo(roomNo)
  380. if r == nil {
  381. log.Release("roomManager.userLeave roomNo[%d] not found", roomNo)
  382. return false
  383. }
  384. if r.Status == pb.PrivateRoomStatus_Playing {
  385. log.Release("roomManager.userLeave room has started")
  386. return false
  387. }
  388. // 如果是比赛场,先不让离开
  389. if r.isMatch() && r.Status < pb.PrivateRoomStatus_Playing {
  390. log.Release("roomManager.userLeave matchroom not end")
  391. return false
  392. }
  393. return rm.removeUser(r, userId)
  394. }
  395. func (rm *roomManager) removeUser(r *roomInfo, userId int) bool {
  396. ret := r.removeUser(userId)
  397. if !ret {
  398. return ret
  399. }
  400. if r.Fee > 0 && r.Status < pb.PrivateRoomStatus_Playing {
  401. for _, v := range r.UserList {
  402. if v.UserId==userId{
  403. // cash.GiveMoney(userId, r.Fee, common.LOGTYPE_PRIVATEROOM_ENTER, "privateroom", "enter return", "")
  404. cash.GiveMoney2(v.UserId, r.Fee, common.LOGTYPE_PRIVATEROOM_ENTER, "privateroom", "fee return", "",v.YyfUid)
  405. }
  406. }
  407. }
  408. // 如果是公共房间
  409. if r.isEmpty() {
  410. go rm.delayCloseRoom(r, "empty")
  411. } else {
  412. getSubsManager().publishRoomInfo(r.RoomInfo)
  413. }
  414. return ret
  415. }
  416. func (rm *roomManager) userSit(roomNo, userId, chairId int) int {
  417. r := rm.getRoomInfo(roomNo)
  418. if r == nil {
  419. log.Release("roomManager.userSit roomNo[%d] not found", roomNo)
  420. return 0
  421. }
  422. ret := r.userSit(userId, chairId)
  423. if ret == 1 {
  424. getSubsManager().publishRoomInfo(r.RoomInfo)
  425. }
  426. return ret
  427. }
  428. func (rm *roomManager) changeChair(roomNo, userId, chairId int) bool {
  429. r := rm.getRoomInfo(roomNo)
  430. if r == nil {
  431. log.Release("roomManager.changeChair roomNo[%d] not found", roomNo)
  432. return false
  433. }
  434. ret := r.changeChair(userId, chairId)
  435. if ret {
  436. getSubsManager().publishRoomInfo(r.RoomInfo)
  437. }
  438. return ret
  439. }
  440. func (rm *roomManager) updateUserScore(roomNo, userId, scoreDelta int) bool {
  441. r := rm.getRoomInfo(roomNo)
  442. if r == nil {
  443. log.Release("roomManager.addUserScore roomNo[%d] not found", roomNo)
  444. return false
  445. }
  446. if r.updateUserScore(userId, scoreDelta) {
  447. rm.delayPublishRoomInfo(roomNo)
  448. return true
  449. }
  450. return false
  451. }
  452. func (rm *roomManager) delayPublishRoomInfo(roomNo int) {
  453. if rm.pubishRoomInfoFlag {
  454. // 已经做了延迟
  455. return
  456. }
  457. rm.pubishRoomInfoFlag = true
  458. time.AfterFunc(time.Second, func() {
  459. if !rm.pubishRoomInfoFlag {
  460. return
  461. }
  462. rm.pubishRoomInfoFlag = false
  463. r := rm.getRoomInfo(roomNo)
  464. if r == nil {
  465. log.Release("roomManager.delayPublishRoomInfo roomNo[%d] not found", roomNo)
  466. return
  467. }
  468. log.Debug("roomManager.delayPublishRoomInfo [%d]", roomNo)
  469. getSubsManager().publishRoomInfo(r.RoomInfo)
  470. })
  471. }
  472. func (rm *roomManager) setWinners(roomNo int, winners []int) {
  473. log.Debug("privateroom.roomManager.setWinners %d,%v", roomNo, winners)
  474. r := rm.getRoomInfo(roomNo)
  475. if r == nil {
  476. log.Release("roomManager.setWinners roomNo[%d] not found", roomNo)
  477. return
  478. }
  479. if !r.setWinners(winners) {
  480. log.Release("roomManager.setWinners roomNo[%d] setWinners failed", roomNo)
  481. return
  482. }
  483. // 正常结束,发奖金
  484. if r.Prize > 0 {
  485. winners := r.getWinners()
  486. if len(winners) > 0 {
  487. prize := r.Prize / len(winners)
  488. tax := 0 //prize * rm.TaxRate / 100
  489. prize -= tax
  490. for _, v := range winners {
  491. r.setPrizeAndTax(v, prize, tax)
  492. for _, u := range r.userList {
  493. if (u.UserId==v){
  494. cash.ModifyMoneyWithTax2(v, prize, tax, common.LOGTYPE_PRIVATEROOM_PRIZE, "privateroom", "prize", "",u.YyfUid)
  495. // cash.ModifyMoneyWithTax(v, prize, tax, common.LOGTYPE_PRIVATEROOM_PRIZE, "privateroom", "prize", "")
  496. }
  497. }
  498. }
  499. }
  500. } else if r.Fee > 0 {
  501. totalPrize := r.UserCount * r.Fee
  502. winners := r.getWinners()
  503. if len(winners) > 0 {
  504. prize := totalPrize / len(winners)
  505. tax := prize * rm.TaxRate / 100
  506. prize -= tax
  507. for _, v := range winners {
  508. r.setPrizeAndTax(v, prize, tax)
  509. for _, u := range r.userList {
  510. if (u.UserId==v){
  511. cash.ModifyMoneyWithTax2(v, prize, tax, common.LOGTYPE_PRIVATEROOM_PRIZE, "privateroom", "prize", "",u.YyfUid)
  512. // cash.ModifyMoneyWithTax(v, prize, tax, common.LOGTYPE_PRIVATEROOM_PRIZE, "privateroom", "prize", "")
  513. }
  514. }
  515. }
  516. }
  517. }
  518. log.Debug("privateroom.roomManager.setWinners %d,%v dump", roomNo, winners)
  519. r.dump()
  520. }
  521. func (rm *roomManager) dump(param1 string) {
  522. log.Release("-------------------------------")
  523. log.Release("privateroom.roomManager.dump[%s]", param1)
  524. defer func() {
  525. log.Release("+++++++++++++++++++++++++++++++")
  526. log.Release("")
  527. }()
  528. if param1 == "" {
  529. rm.lock.RLock()
  530. for _, v := range rm.rooms {
  531. v.dump()
  532. }
  533. rm.lock.RUnlock()
  534. return
  535. }
  536. if param1 == "receiver" {
  537. rm.recvMgr.dump()
  538. return
  539. }
  540. roomNo, err := strconv.Atoi(param1)
  541. if err != nil {
  542. log.Release(" atoi error %v", err)
  543. return
  544. }
  545. room := rm.getRoomInfo(roomNo)
  546. if room == nil {
  547. log.Release(" room[%d] not exist", roomNo)
  548. return
  549. }
  550. public := ""
  551. if room.IsPublic {
  552. public = "Public"
  553. }
  554. log.Release(" RoomNo: %d %s", roomNo, public)
  555. log.Release(" Owner: %d", room.Owner)
  556. log.Release(" Idled: %d", room.getIdle())
  557. log.Release(" Game: %s", room.GameName)
  558. log.Release(" Addr: %s", room.ServerAddr)
  559. log.Release(" TableId: %d", room.TableId)
  560. log.Release(" Rule: %s", room.RuleName)
  561. log.Release(" UserCount: %d", room.UserCount)
  562. log.Release(" Fee: %d", room.Fee)
  563. log.Release(" Prize: %d", room.Prize)
  564. log.Release(" Status: %d", room.Status)
  565. log.Release(" StartTime %s", room.StartTime)
  566. }
  567. func (rm *roomManager) flush() {
  568. }
  569. func (rm *roomManager) registerRoomStatus(addr string) {
  570. rm.recvMgr.setReceiver(addr, true)
  571. }
  572. func (rm *roomManager) forceUserEnter(userId int, roomNo int, chairId int, secAfter int) {
  573. r := rm.getRoomInfo(roomNo)
  574. if r == nil {
  575. log.Release("roomManager.forceUserEnter failed roomNo[%d] not exist", roomNo)
  576. return
  577. }
  578. time.AfterFunc(time.Duration(secAfter)*time.Second, func() {
  579. game_client.ForceEnterUser(r.service_addr, userId, roomNo, chairId)
  580. })
  581. }
  582. func (rm *roomManager) postRoomStart(roomNo int) {
  583. receivers := rm.recvMgr.getActiveReceivers()
  584. if len(receivers) == 0 {
  585. log.Release("roomManager.postRoomStart no receiver")
  586. return
  587. }
  588. for _, c := range receivers {
  589. ok := rule_status.OnRoomStatusInfo(c, rule_status.Roomstatus_start, roomNo, 0, 0, 0, 0, nil)
  590. if !ok {
  591. log.Debug("postRoomStart failed to send messsage to %s", c)
  592. rm.recvMgr.setReceiver(c, false)
  593. }
  594. }
  595. }
  596. func (rm *roomManager) postRoomEnd(roomNo int, winners []int) {
  597. receivers := rm.recvMgr.getActiveReceivers()
  598. if len(receivers) == 0 {
  599. log.Release("roomManager.postRoomEnd no receiver")
  600. return
  601. }
  602. for _, c := range receivers {
  603. ok := rule_status.OnRoomStatusInfo(c, rule_status.Roomstatus_end, roomNo, 0, 0, 0, 0, winners)
  604. if !ok {
  605. log.Debug("postRoomEnd failed to send messsage to %s", c)
  606. rm.recvMgr.setReceiver(c, false)
  607. }
  608. }
  609. }
  610. func (rm *roomManager) postRoomStatusChanged(roomNo int, old, new int) {
  611. receivers := rm.recvMgr.getActiveReceivers()
  612. if len(receivers) == 0 {
  613. log.Release("roomManager.postRoomStatusChanged no receiver")
  614. return
  615. }
  616. for _, c := range receivers {
  617. ok := rule_status.OnRoomStatusInfo(c, rule_status.Roomstatus_statuschanged, roomNo, 0, 0, old, new, nil)
  618. if !ok {
  619. log.Debug("postRoomStatusChanged failed to send messsage to %s", c)
  620. rm.recvMgr.setReceiver(c, false)
  621. }
  622. }
  623. }
  624. func (rm *roomManager) postUserScore(roomNo int, userId, scoreDelta int) {
  625. receivers := rm.recvMgr.getActiveReceivers()
  626. if len(receivers) == 0 {
  627. log.Release("roomManager.postUserScore no receiver")
  628. return
  629. }
  630. for _, c := range receivers {
  631. ok := rule_status.OnRoomStatusInfo(c, rule_status.Roomstatus_scorechanged, roomNo, userId, scoreDelta, 0, 0, nil)
  632. if !ok {
  633. log.Debug("postUserScore failed to send messsage to %s", c)
  634. rm.recvMgr.setReceiver(c, false)
  635. }
  636. }
  637. }
  638. func (rm *roomManager) getUserRoomInfo(userId, roomNo int) *pb.RoomUser {
  639. r := rm.getRoomInfo(roomNo)
  640. if r == nil {
  641. log.Release("roomManager.getUserRoomInfo failed [%d]", roomNo)
  642. return nil
  643. }
  644. return r.getUserInfo(userId)
  645. }
  646. func (rm *roomManager) removeRoomsByServerAddr(addr string) {
  647. if addr == "" {
  648. return
  649. }
  650. var toRemove []*roomInfo
  651. rm.lock.RLock()
  652. for k, v := range rm.rooms {
  653. if v.ServerAddr == addr {
  654. toRemove = append(toRemove, rm.rooms[k])
  655. }
  656. }
  657. rm.lock.RUnlock()
  658. if len(toRemove) == 0 {
  659. return
  660. }
  661. for _, v := range toRemove {
  662. rm.postRoomEnd(v.RoomNo, nil)
  663. }
  664. rm.lock.Lock()
  665. for _, v := range toRemove {
  666. delete(rm.rooms, v.RoomNo)
  667. }
  668. rm.lock.Unlock()
  669. }