serverconfig.go 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. package gamecommon
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "log"
  6. _ "math/rand"
  7. "os"
  8. "time"
  9. "sync"
  10. slog "bet24.com/log"
  11. "bet24.com/utils"
  12. )
  13. var Server struct {
  14. LogLevel string
  15. FileLevel string
  16. LogPath string
  17. CertFile string
  18. KeyFile string
  19. MaxConnNum int
  20. Login string
  21. Password string
  22. Database string
  23. Datasource string
  24. GameDB string
  25. ChannelUrl string
  26. ChannelPassword string
  27. RedisDB int
  28. LastHour int
  29. ServiceAddr string
  30. //
  31. ServerName string
  32. ServerIP string
  33. ServerPort int
  34. ServerAddr string
  35. MonitorPort int
  36. OfflineSeconds int64
  37. }
  38. type RobotParam struct {
  39. WinAmount int // 输赢金额
  40. Param1 int // 换牌解闷概率
  41. Param2 int // 换牌闷玩家概率
  42. }
  43. type RobotConfig struct {
  44. MinRobotGold int
  45. MaxRobotGold int
  46. RobotOnlineSec int
  47. RobotCount int
  48. MinRoom int
  49. Params []RobotParam
  50. winAmount int
  51. }
  52. func (rc *RobotConfig) getParam1() int {
  53. for _, v := range rc.Params {
  54. if rc.winAmount >= v.WinAmount {
  55. return v.Param1
  56. }
  57. }
  58. return 0
  59. }
  60. func (rc *RobotConfig) addWinAmount(amount int) {
  61. rc.winAmount += amount
  62. }
  63. type RoomInfo struct {
  64. RoomID int //场次ID, 唯一
  65. RoomName string
  66. RoomDesc string
  67. MinGold int
  68. MaxGold int
  69. BaseScore int
  70. TaxRate float64 // 税收
  71. PlayMode int //0普通模式,1加倍模式
  72. //
  73. ServerIP string
  74. ServerPort int
  75. IsDual int // 是否2人桌
  76. RobotConfig
  77. }
  78. type RoomList struct {
  79. Rooms []RoomInfo
  80. lock *sync.RWMutex
  81. }
  82. var Rooms *RoomList
  83. func (r *RoomList) AddWinAmount(roomId int, amount int) {
  84. r.lock.Lock()
  85. defer r.lock.Unlock()
  86. for i := 0; i < len(r.Rooms); i++ {
  87. if r.Rooms[i].RoomID == roomId {
  88. r.Rooms[i].addWinAmount(amount)
  89. return
  90. }
  91. }
  92. }
  93. func (r *RoomList) GetParam1(roomId int) int {
  94. r.lock.RLock()
  95. defer r.lock.RUnlock()
  96. for i := 0; i < len(r.Rooms); i++ {
  97. if r.Rooms[i].RoomID == roomId {
  98. return r.Rooms[i].getParam1()
  99. }
  100. }
  101. return 0
  102. }
  103. func (r *RoomList) Dump() string {
  104. r.lock.RLock()
  105. defer r.lock.RUnlock()
  106. var ret string
  107. for _, v := range r.Rooms {
  108. ret = fmt.Sprintf("%s Room:%s winAmount:%d\n", ret, v.RoomName, v.winAmount)
  109. }
  110. return ret
  111. }
  112. var RoomConfgName = "domino"
  113. // func GetRoomInfo() string {
  114. // d, _ := json.Marshal(Room)
  115. // return string(d)
  116. // }
  117. func init() {
  118. configFile := "domino/server.json"
  119. data, err := os.ReadFile(configFile)
  120. if err != nil {
  121. log.Fatalf("read config failed domino/server.json %v", err)
  122. }
  123. fmt.Println(string(data))
  124. err = json.Unmarshal(data, &Server)
  125. if err != nil {
  126. log.Fatalf("Unmarshal config failed domino/server.json err:%v", err)
  127. return
  128. }
  129. logger, err := slog.New(Server.LogLevel, Server.FileLevel, fmt.Sprintf("%v/%v", Server.LogPath, RoomConfgName), log.LstdFlags)
  130. if err == nil {
  131. slog.Export(logger)
  132. }
  133. originPort := Server.ServerPort
  134. for i := 0; i < 100; i++ {
  135. if utils.CheckPortInUse(Server.ServerPort) {
  136. Server.ServerPort++
  137. continue
  138. }
  139. break
  140. }
  141. if Server.MonitorPort == 0 {
  142. Server.MonitorPort = Server.ServerPort + 100
  143. }
  144. now := time.Now()
  145. Server.LastHour = now.Hour()
  146. if originPort != Server.ServerPort {
  147. slog.Debug("Port %d in use, change to %d", originPort, Server.ServerPort)
  148. d, _ := json.Marshal(Server)
  149. os.WriteFile(configFile, d, 0644)
  150. }
  151. }
  152. func Run() {
  153. Rooms = new(RoomList)
  154. Rooms.lock = &sync.RWMutex{}
  155. refreshLogFile()
  156. }
  157. func refreshLogFile() {
  158. time.AfterFunc(5*time.Minute, refreshLogFile)
  159. doRefreshLogFile()
  160. doRefreshConfig()
  161. }
  162. func doRefreshLogFile() {
  163. if Server.LogPath != "" {
  164. now := time.Now()
  165. if now.Hour() != Server.LastHour {
  166. Server.LastHour = now.Hour()
  167. slog.RecreateFileLog(fmt.Sprintf("%v/%v", Server.LogPath, RoomConfgName), log.LstdFlags)
  168. }
  169. }
  170. }
  171. func doRefreshConfig() {
  172. // 保存
  173. // 加载房间表
  174. data, err := os.ReadFile("domino/rooms.json")
  175. //fmt.Println(string(data))
  176. if err != nil {
  177. log.Fatal("read rooms failed domino/rooms.json")
  178. }
  179. Rooms.lock.Lock()
  180. defer Rooms.lock.Unlock()
  181. /*
  182. winMaps := make(map[int]int)
  183. for _,v := range Rooms {
  184. winMaps[v.RoomID].
  185. }
  186. */
  187. err = json.Unmarshal(data, &Rooms)
  188. if err != nil {
  189. log.Fatalf("Unmarshal rooms failed err:%v", err)
  190. return
  191. }
  192. if len(Rooms.Rooms) <= 0 {
  193. log.Fatalf("Rooms.Rooms == 0")
  194. return
  195. }
  196. if len(Server.ServerIP) > 0 {
  197. ws := "ws"
  198. if len(Server.CertFile) > 0 {
  199. ws = "wss"
  200. }
  201. for i := 0; i < len(Rooms.Rooms); i++ {
  202. Rooms.Rooms[i].ServerIP = fmt.Sprintf("%s://%s:%d", ws, Server.ServerIP, Server.ServerPort)
  203. }
  204. }
  205. }