gameframe.go 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364
  1. package bacframe
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "math/rand"
  6. "strconv"
  7. "sync"
  8. "time"
  9. "bet24.com/log"
  10. "bet24.com/redis"
  11. coreservice "bet24.com/servers/coreservice/client"
  12. "bet24.com/servers/insecureframe/gate"
  13. "bet24.com/servers/insecureframe/message"
  14. notification "bet24.com/servers/micros/notification/proto"
  15. task "bet24.com/servers/micros/task/proto"
  16. "bet24.com/servers/transaction"
  17. "bet24.com/servers/user"
  18. )
  19. func NewGameFrame(gameSink GameSink) *GameFrame {
  20. f := new(GameFrame)
  21. f.gameSink = gameSink
  22. f.lock_user = &sync.RWMutex{}
  23. f.userlist = make(map[int32]*user.UserInfo)
  24. log.Debug("bac gameframe running...")
  25. return f
  26. }
  27. type GameFrame struct {
  28. gameSink GameSink
  29. lock_user *sync.RWMutex
  30. userlist map[int32]*user.UserInfo
  31. }
  32. // implement GateSink
  33. func (f *GameFrame) GetServerPort() int {
  34. return f.gameSink.GetServerPort()
  35. }
  36. func (f *GameFrame) OnUserEnter(userIndex int32) {
  37. }
  38. func (f *GameFrame) OnUserLogined(userIndex int32) {
  39. usr := gate.GetUserInfo(userIndex)
  40. if usr == nil {
  41. log.Debug("GameFrame.OnUserLogined invalid userIndex %d", userIndex)
  42. return
  43. }
  44. f.lock_user.Lock()
  45. f.userlist[userIndex] = usr
  46. f.lock_user.Unlock()
  47. // 先发自己
  48. f.sendUserEnter(usr, userIndex)
  49. // 发其他人
  50. f.lock_user.RLock()
  51. for k, v := range f.userlist {
  52. if k == userIndex {
  53. continue
  54. }
  55. f.sendUserEnter(usr, k)
  56. f.sendUserEnter(v, userIndex)
  57. }
  58. f.lock_user.RUnlock()
  59. f.gameSink.OnUserEnter(userIndex)
  60. }
  61. func (f *GameFrame) OnUserExit(userIndex int32) {
  62. usr := gate.GetUserInfo(userIndex)
  63. if usr == nil {
  64. log.Debug("GameFrame.OnUserExit user[%d] not exist", userIndex)
  65. return
  66. }
  67. userId := usr.GetUserId()
  68. f.lock_user.Lock()
  69. delete(f.userlist, userIndex)
  70. f.lock_user.Unlock()
  71. f.lock_user.RLock()
  72. for _, v := range f.userlist {
  73. f.sendUserExit(userId, v.GetUserIndex())
  74. }
  75. f.lock_user.RUnlock()
  76. f.gameSink.OnUserExit(userIndex)
  77. }
  78. func (f *GameFrame) OnGameMessage(userIndex int32, userID int, msg, data string) bool {
  79. switch msg {
  80. case message.Frame_ADReward:
  81. f.recvAdReward(userIndex, data)
  82. return true
  83. case message.Frame_Ping:
  84. f.recvFramePing(userIndex, data)
  85. return true
  86. default:
  87. return f.gameSink.OnGameMessage(userIndex, userID, msg, data)
  88. }
  89. }
  90. func (f *GameFrame) GetGameID() int {
  91. return f.gameSink.GetGameID()
  92. }
  93. func (f *GameFrame) GetGameName() string {
  94. return f.gameSink.GetGameName()
  95. }
  96. func (f *GameFrame) GetRoomName() string {
  97. return f.gameSink.GetRoomName()
  98. }
  99. func (f *GameFrame) GetCertFile() string {
  100. return f.gameSink.GetCertFile()
  101. }
  102. func (f *GameFrame) GetKeyFile() string {
  103. return f.gameSink.GetKeyFile()
  104. }
  105. // 机器人配置
  106. func (f *GameFrame) GetRobotCount() int {
  107. return f.gameSink.GetRobotCount()
  108. }
  109. func (f *GameFrame) GetRobotGoldLimit() (min, max int) {
  110. min, max = f.gameSink.GetRobotGoldLimit()
  111. return
  112. }
  113. func (f *GameFrame) GetRobotOnlineSec() int {
  114. return f.gameSink.GetRobotOnlineSec()
  115. }
  116. func (f *GameFrame) IsChipRoom() bool {
  117. return f.gameSink.IsChipRoom()
  118. }
  119. func (f *GameFrame) GetVersionID() int {
  120. return f.gameSink.GetVersionID()
  121. }
  122. func (f *GameFrame) IsPrivateRoom() bool {
  123. return false
  124. }
  125. func (f *GameFrame) GetChipRoom() int {
  126. if f.gameSink.IsChipRoom() {
  127. return 1
  128. } else {
  129. return 0
  130. }
  131. }
  132. func (f *GameFrame) OnPlatformConfig(key string) {
  133. f.gameSink.OnPlatformConfig(key)
  134. }
  135. // BacFrame
  136. func (f *GameFrame) NotifySceneChanged(userIndex int32) {
  137. f.SendGameData(userIndex, message.Table_GameScene, f.gameSink.OnGetGameScene())
  138. }
  139. func (f *GameFrame) KickUser(userIndex int32) bool {
  140. return gate.KickUser(userIndex)
  141. }
  142. // 如果userindex == -1 表示发给所有人
  143. func (f *GameFrame) SendGameData(userIndex int32, msg, data string) {
  144. if userIndex == -1 {
  145. gate.BroadcastData(msg, data)
  146. return
  147. }
  148. //log.Debug("GameFrame.SendGameData %d[%s]", userIndex, msg)
  149. gate.SendMessage(userIndex, msg, data)
  150. }
  151. func (f *GameFrame) GetUser(userIndex int32) *user.UserInfo {
  152. return gate.GetUserInfo(userIndex)
  153. }
  154. func (f *GameFrame) GetUserByUserId(userId int) *user.UserInfo {
  155. return gate.GetUserByUserId(userId)
  156. }
  157. func (f *GameFrame) WriteUserMoney(userId int, amount, tax int, status, scoreType int, sourceName string) (bool, int) {
  158. if scoreType < 100 {
  159. scoreType += f.gameSink.GetGameID() * 100
  160. }
  161. return gate.WriteUserMoney(userId, amount, tax, status, scoreType, sourceName, f.gameSink.IsChipRoom())
  162. }
  163. func (f *GameFrame) WriteUserMoneyWithModifyAmount(userId int, amount, tax int, status, scoreType int, sourceName string) int {
  164. if scoreType < 100 {
  165. scoreType += f.gameSink.GetGameID() * 100
  166. }
  167. return gate.WriteUserMoneyWithModifyAmount(userId, amount, tax, status, scoreType, sourceName, f.gameSink.IsChipRoom())
  168. }
  169. func (f *GameFrame) WriteBetRecord(userId int, betAmount int, winAmount int, tax int, winRate float64, betDesc string, resultDesc string, roomName string) {
  170. // 机器人不写日志
  171. usr := f.GetUserByUserId(userId)
  172. if usr == nil || !usr.IsRobot() {
  173. gameId := f.gameSink.GetGameID()
  174. gameName := f.gameSink.GetGameName()
  175. if f.gameSink.IsChipRoom() {
  176. transaction.WriteChipBetRecordAction(userId, gameId, "", betAmount, winAmount, tax, winRate, betDesc, resultDesc, 0, "", roomName)
  177. } else {
  178. transaction.WriteBetRecordAction(userId, gameId, "", betAmount, winAmount, tax, winRate, betDesc, resultDesc, 0, "", roomName)
  179. }
  180. go func() {
  181. task.DoTaskAction(userId, task.TaskAction_playgame, 1, task.TaskScope{GameName: gameName})
  182. task.DoTaskAction(userId, task.TaskAction_fire, betAmount, task.TaskScope{GameName: gameName})
  183. if winAmount-betAmount > 0 {
  184. task.DoTaskAction(userId, task.TaskAction_earn, winAmount-betAmount, task.TaskScope{GameName: gameName})
  185. task.DoTaskAction(userId, task.TaskAction_wingame, 1, task.TaskScope{GameName: gameName})
  186. }
  187. if winAmount > 0 {
  188. task.DoTaskAction(userId, task.TaskAction_betWin, winAmount, task.TaskScope{GameName: gameName})
  189. }
  190. if !f.gameSink.IsChipRoom() {
  191. notification.AddNotification(userId, notification.Notification_Chip, "")
  192. //coreservice.AddGameExp(userId, gameId, winAmount-betAmount)
  193. coreservice.AddUserWinScore(userId, winAmount-betAmount)
  194. }
  195. }()
  196. }
  197. if winAmount >= 3000000 {
  198. userName := strconv.Itoa(userId)
  199. if usr != nil {
  200. userName = usr.GetUserNickName()
  201. }
  202. f.SendBroadcast(userId, userName, winAmount)
  203. }
  204. }
  205. func (f *GameFrame) GetUserList() []*user.UserInfo {
  206. return gate.GetUserList()
  207. }
  208. func (f *GameFrame) sendUserEnter(usr *user.UserInfo, toUser int32) {
  209. if usr == nil {
  210. log.Debug("GameFrame.sendUserEnter usr == nil")
  211. return
  212. }
  213. info := usr.GetUserInfo_Table(toUser == usr.GetUserIndex())
  214. d, _ := json.Marshal(info)
  215. gate.SendMessage(toUser, message.Table_UserEnter, string(d))
  216. }
  217. func (f *GameFrame) sendUserExit(userId int, toUser int32) {
  218. info := message.TableUserExit{UserId: userId, ChairId: 0, ToWatch: false}
  219. d, _ := json.Marshal(info)
  220. gate.SendMessage(toUser, message.Table_UserExit, string(d))
  221. }
  222. func (f *GameFrame) GetVirtualUserCount(userCount int, roomType int) int {
  223. if roomType < 0 {
  224. roomType = 0
  225. } else {
  226. roomType = roomType % 1
  227. }
  228. userCounts := [][]int{}
  229. userCounts = append(userCounts, []int{95, 120, 168, 196, 234})
  230. hour := time.Now().Hour()
  231. hourIndex := 0
  232. if hour >= 18 {
  233. hourIndex = 4
  234. } else if hour >= 14 {
  235. hourIndex = 3
  236. } else if hour >= 11 {
  237. hourIndex = 2
  238. } else if hour >= 6 {
  239. hourIndex = 1
  240. }
  241. param := 86
  242. return userCount*param + userCounts[roomType][hourIndex] - 10 + rand.Intn(20)
  243. }
  244. func (f *GameFrame) recvAdReward(userIndex int32, data string) bool {
  245. usr := gate.GetUserInfo(userIndex)
  246. if usr == nil {
  247. log.Debug("GameFrame.recvAdReward user not exist")
  248. return false
  249. }
  250. serialNo, err := strconv.Atoi(data)
  251. if err != nil {
  252. log.Debug("GameFrame.recvAdReward invalid argument [%s]", data)
  253. return false
  254. }
  255. // 调用coreservice的视频奖励
  256. // 根据返回信息刷新金币,并通知用户
  257. var rewarded message.AdRewarded
  258. rewarded.UserId = usr.GetUserId()
  259. rewarded.SerialNo = serialNo
  260. rewarded.Gold = coreservice.VideoSettle(rewarded.UserId, serialNo)
  261. d, _ := json.Marshal(rewarded)
  262. log.Debug("GameFrame.recvAdReward sending data %s", string(d))
  263. gate.SendMessage(userIndex, message.Frame_ADReward, string(d))
  264. if rewarded.Gold > 0 {
  265. gate.RefreshGold(userIndex)
  266. }
  267. return true
  268. }
  269. func (f *GameFrame) recvFramePing(userIndex int32, data string) bool {
  270. gate.SendMessage(userIndex, message.Frame_Ping, data)
  271. return true
  272. }
  273. func (f *GameFrame) SendBroadcast(userId int, userName string, score int) {
  274. gameId := f.gameSink.GetGameID()
  275. gameName := f.gameSink.GetGameName()
  276. go coreservice.SendGameWinBroadcast(userId, userName, score, gameId, gameName)
  277. }
  278. func (f *GameFrame) GetUserChipOrGold(userIndex int32) int {
  279. return f.GetUserChipOrGoldByUser(f.GetUser(userIndex))
  280. }
  281. func (f *GameFrame) GetUserChipOrGoldByUserId(userId int) int {
  282. return f.GetUserChipOrGoldByUser(f.GetUserByUserId(userId))
  283. }
  284. func (f *GameFrame) GetUserChipOrGoldByUser(usr *user.UserInfo) int {
  285. if usr == nil {
  286. return 0
  287. }
  288. if gameFrame.gameSink.IsChipRoom() {
  289. return usr.GetChip()
  290. }
  291. return usr.GetUserGold()
  292. }
  293. func (f *GameFrame) UpdateRoomList(roomName, addr string) {
  294. addrKey := "Addr"
  295. onlineKey := "Online"
  296. if f.gameSink.IsChipRoom() {
  297. addrKey = "ChipAddr"
  298. onlineKey = "ChipOnline"
  299. }
  300. gameName := f.gameSink.GetGameName()
  301. if gameName == "Battle" {
  302. gameName = "dragontiger"
  303. }
  304. redis.String_SetEx(fmt.Sprintf("%s:%s:%v", gameName, addrKey, roomName), addr, 70)
  305. online := fmt.Sprintf("%d", f.GetVirtualUserCount(gate.GetPlayerCount(), 0))
  306. redis.String_SetEx(fmt.Sprintf("%s:%s:%v", gameName, onlineKey, roomName), online, 70)
  307. }
  308. func (f *GameFrame) dump(param string) {
  309. switch param {
  310. default:
  311. log.Release(" user count :%d", gate.GetPlayerCount())
  312. }
  313. }
  314. func (f *GameFrame) IsLadderRoom() bool {
  315. gameSink_LadderRoom, ok := f.gameSink.(GameSink_LadderRoom)
  316. return ok && gameSink_LadderRoom.IsLadderRoom()
  317. }