roll.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484
  1. package models
  2. // roll房
  3. import (
  4. "box-gm/utils"
  5. "encoding/json"
  6. "errors"
  7. "fmt"
  8. "log"
  9. "sync"
  10. "time"
  11. "github.com/astaxie/beego"
  12. "github.com/astaxie/beego/validation"
  13. "github.com/garyburd/redigo/redis"
  14. )
  15. type RollConditionInfo struct {
  16. Conditions string `json:"c"` // 条件
  17. CValue int `json:"cv"` // 条件值
  18. }
  19. type RollInfo struct {
  20. Id int // 活动ID
  21. Name string `orm:"size(64)" valid:"Required"` // 房间名
  22. BandShareCode string `orm:"size(10)" valid:"Required"` // 限制绑定推广码
  23. CreateTime int64 `valid:"Required"` // 创建时间
  24. ShowStartTime int64 `valid:"Required"` // 开始展示时间
  25. SignupStartTime int64 `valid:"Required"` // 报名开始时间
  26. SignupEndTime int64 `valid:"Required"` // 报名结束时间
  27. AwardTime int64 `valid:"Required"` // 开奖时间
  28. Conditions []*RollConditionInfo // 参与条件列表
  29. ItemIdList []int // 奖励物品ID列表
  30. SignupUidList []int // 报名玩家ID列表列表
  31. }
  32. type RollInfoArray []*RollInfo
  33. type RollCondition struct {
  34. KeyCondition string
  35. Name string
  36. }
  37. type RES_ROLL struct {
  38. Code int `json:"code"` // 错误码
  39. }
  40. type RollConditionArray []*RollCondition
  41. var conditionList RollConditionArray
  42. var rollList RollInfoArray
  43. var riMutex sync.Mutex
  44. var ROLL_MAIN_KEY = "roll:room"
  45. func get_roll_key(id int) string {
  46. return fmt.Sprintf("%s:%d", ROLL_MAIN_KEY, id)
  47. }
  48. func CreateRollId() int {
  49. pool := utils.GetAccountRedisPool()
  50. if pool == nil {
  51. fmt.Println("get redis pool fail")
  52. return 0
  53. }
  54. rd := pool.Get()
  55. if rd == nil {
  56. fmt.Println("get redis conn fail")
  57. return 0
  58. }
  59. defer rd.Close()
  60. reply, err := rd.Do("hincrby", "global", "max:roll:room:id", 1)
  61. if err != nil {
  62. fmt.Printf("redis hincrby err: %v", err)
  63. return 0
  64. }
  65. id, err := redis.Int(reply, err)
  66. if err != nil {
  67. fmt.Printf("redis hincrby err: %v", err)
  68. return 0
  69. }
  70. return id
  71. }
  72. // 初始化roll房信息
  73. func InitRollInfo() {
  74. // 活跃ID列表
  75. pool := utils.GetAccountRedisPool()
  76. if pool == nil {
  77. fmt.Println("get redis pool fail")
  78. return
  79. }
  80. rd := pool.Get()
  81. defer rd.Close()
  82. rollList = RollInfoArray{}
  83. result, _ := redis.Values(rd.Do("smembers", ROLL_MAIN_KEY))
  84. for _, v := range result {
  85. id := utils.StringToInt(string(v.([]byte)))
  86. pKey := get_roll_key(id)
  87. log.Printf("InitRollInfo v[%v] id[%d] pKey[%s]", v, id, pKey)
  88. name, _ := redis.String(rd.Do("hget", pKey, "name"))
  89. bandShareCode, _ := redis.String(rd.Do("hget", pKey, "bandShareCode"))
  90. creatTime, _ := redis.Int64(rd.Do("hget", pKey, "creatTime"))
  91. showStartTime, _ := redis.Int64(rd.Do("hget", pKey, "showStartTime"))
  92. signupStartTime, _ := redis.Int64(rd.Do("hget", pKey, "signupStartTime"))
  93. signupEndTime, _ := redis.Int64(rd.Do("hget", pKey, "signupEndTime"))
  94. awardTime, _ := redis.Int64(rd.Do("hget", pKey, "awardTime"))
  95. conditions, _ := redis.String(rd.Do("hget", pKey, "conditions"))
  96. var _conditions []*RollConditionInfo
  97. json.Unmarshal([]byte(conditions), &_conditions)
  98. itemIdList, _ := redis.String(rd.Do("hget", pKey, "itemIdList"))
  99. var _itemIdList []int
  100. json.Unmarshal([]byte(itemIdList), &_itemIdList)
  101. signupUidList, _ := redis.String(rd.Do("hget", pKey, "signupUidList"))
  102. var _signupUidList []int
  103. json.Unmarshal([]byte(signupUidList), &_signupUidList)
  104. rollList = append(rollList, &RollInfo{
  105. Id: id,
  106. Name: name,
  107. BandShareCode: bandShareCode,
  108. CreateTime: creatTime,
  109. ShowStartTime: showStartTime,
  110. SignupStartTime: signupStartTime,
  111. SignupEndTime: signupEndTime,
  112. AwardTime: awardTime,
  113. Conditions: _conditions,
  114. ItemIdList: _itemIdList,
  115. SignupUidList: _signupUidList,
  116. })
  117. }
  118. conditionList = append(conditionList, &RollCondition{
  119. KeyCondition: "pay_day_totalAmount",
  120. Name: "今日充值(单位:分)",
  121. })
  122. beego.Info("load roll info", len(rollList))
  123. }
  124. func checkRollInfo(hf *RollInfo) (err error) {
  125. valid := validation.Validation{}
  126. b, _ := valid.Valid(&hf)
  127. if !b {
  128. for _, err := range valid.Errors {
  129. log.Println(err.Key, err.Message)
  130. return errors.New(err.Message)
  131. }
  132. }
  133. return nil
  134. }
  135. // 新增roll房信息
  136. func AddRollInfo(hf *RollInfo) error {
  137. pool := utils.GetAccountRedisPool()
  138. if pool == nil {
  139. return fmt.Errorf("get redis pool fail")
  140. }
  141. rd := pool.Get()
  142. defer rd.Close()
  143. if err := checkRollInfo(hf); err != nil {
  144. return err
  145. }
  146. if hf.Id == 0 {
  147. hf.Id = CreateRollId()
  148. }
  149. if hf.Id == 0 {
  150. return fmt.Errorf("分配roll房ID失败")
  151. }
  152. // 插入数据库
  153. db, err := utils.GetMysqlHandler()
  154. if err != nil {
  155. log.Println("GetMysqlHandler, Error: ", err)
  156. return err
  157. }
  158. hf.CreateTime = time.Now().Unix()
  159. bConditions, _ := json.Marshal(hf.Conditions)
  160. bItemIdList, _ := json.Marshal(hf.ItemIdList)
  161. columns := "id,name,bandShareCode,createTime,showStartTime,signupStartTime,signupEndTime,awardTime,conditions,itemIdList"
  162. values := fmt.Sprintf("%d, '%s', '%s', %d, %d, %d, %d, %d, '%s', '%s'", hf.Id, hf.Name, hf.BandShareCode, hf.CreateTime, hf.ShowStartTime, hf.SignupStartTime, hf.SignupEndTime, hf.AwardTime, bConditions, bItemIdList)
  163. sql := fmt.Sprintf("insert into mdl_roll (%s) value (%s);", columns, values)
  164. log.Println("AddRollInfo sql:", sql)
  165. _, err = db.Exec(sql)
  166. if err != nil {
  167. log.Println("AddRollInfo Insert data Exec Failed, Error: ", err)
  168. return err
  169. }
  170. pKey := get_roll_key(hf.Id)
  171. rd.Do("hset", pKey, "name", hf.Name)
  172. rd.Do("hset", pKey, "bandShareCode", hf.BandShareCode)
  173. rd.Do("hset", pKey, "createTime", hf.CreateTime)
  174. rd.Do("hset", pKey, "showStartTime", hf.ShowStartTime)
  175. rd.Do("hset", pKey, "signupStartTime", hf.SignupStartTime)
  176. rd.Do("hset", pKey, "signupEndTime", hf.SignupEndTime)
  177. rd.Do("hset", pKey, "awardTime", hf.AwardTime)
  178. rd.Do("hset", pKey, "conditions", bConditions)
  179. rd.Do("hset", pKey, "itemIdList", bItemIdList)
  180. rd.Do("sadd", ROLL_MAIN_KEY, hf.Id)
  181. riMutex.Lock()
  182. rollList = append(rollList, hf)
  183. riMutex.Unlock()
  184. SendGameAddRoll(hf.Id)
  185. return nil
  186. }
  187. // 修改roll房信息
  188. func UpdateRollInfo(hf *RollInfo) error {
  189. pool := utils.GetAccountRedisPool()
  190. if pool == nil {
  191. return fmt.Errorf("get redis pool fail")
  192. }
  193. rd := pool.Get()
  194. defer rd.Close()
  195. if err := checkRollInfo(hf); err != nil {
  196. return err
  197. }
  198. // 更新数据库
  199. db, err := utils.GetMysqlHandler()
  200. if err != nil {
  201. log.Println("GetMysqlHandler, Error: ", err)
  202. return err
  203. }
  204. bConditions, _ := json.Marshal(hf.Conditions)
  205. bItemIdList, _ := json.Marshal(hf.ItemIdList)
  206. sets := fmt.Sprintf("name='%s',bandShareCode='%s',showStartTime=%d,signupStartTime=%d,signupEndTime=%d,awardTime=%d,conditions='%s',itemIdList='%s'",
  207. hf.Name, hf.BandShareCode, hf.ShowStartTime, hf.SignupStartTime, hf.SignupEndTime, hf.AwardTime, bConditions, bItemIdList)
  208. sql := fmt.Sprintf("UPDATE mdl_roll SET %s WHERE id=%d;", sets, hf.Id)
  209. // log.Println("order_insert_db sql:", sql)
  210. _, err = db.Exec(sql)
  211. if err != nil {
  212. log.Println("UpdateRollInfo update data Exec Failed, Error: ", err)
  213. return err
  214. }
  215. pKey := get_roll_key(hf.Id)
  216. rd.Do("hset", pKey, "name", hf.Name)
  217. rd.Do("hset", pKey, "bandShareCode", hf.BandShareCode)
  218. rd.Do("hset", pKey, "showStartTime", hf.ShowStartTime)
  219. rd.Do("hset", pKey, "signupStartTime", hf.SignupStartTime)
  220. rd.Do("hset", pKey, "signupEndTime", hf.SignupEndTime)
  221. rd.Do("hset", pKey, "awardTime", hf.AwardTime)
  222. rd.Do("hset", pKey, "conditions", bConditions)
  223. rd.Do("hset", pKey, "itemIdList", bItemIdList)
  224. riMutex.Lock()
  225. for i := 0; i < len(rollList); i++ {
  226. if hf.Id == rollList[i].Id {
  227. old := rollList[i]
  228. old.Name = hf.Name
  229. old.BandShareCode = hf.BandShareCode
  230. old.ShowStartTime = hf.ShowStartTime
  231. old.SignupStartTime = hf.SignupStartTime
  232. old.SignupEndTime = hf.SignupEndTime
  233. old.AwardTime = hf.AwardTime
  234. old.Conditions = hf.Conditions
  235. old.ItemIdList = hf.ItemIdList
  236. break
  237. }
  238. }
  239. riMutex.Unlock()
  240. SendGameUpdateRoll(hf.Id)
  241. return nil
  242. }
  243. // 更新参与玩家列表
  244. func UpdateSignupUidList(id int) error {
  245. pool := utils.GetAccountRedisPool()
  246. if pool == nil {
  247. return fmt.Errorf("get redis pool fail")
  248. }
  249. rd := pool.Get()
  250. defer rd.Close()
  251. pKey := get_roll_key(id)
  252. signupUidList, _ := redis.String(rd.Do("hget", pKey, "signupUidList"))
  253. var _signupUidList []int
  254. json.Unmarshal([]byte(signupUidList), &_signupUidList)
  255. for i := 0; i < len(rollList); i++ {
  256. if id == rollList[i].Id {
  257. old := rollList[i]
  258. old.SignupUidList = _signupUidList
  259. break
  260. }
  261. }
  262. return nil
  263. }
  264. // 删除roll房信息
  265. func DelRollInfoById(id int) error {
  266. pool := utils.GetAccountRedisPool()
  267. if pool == nil {
  268. return fmt.Errorf("get redis pool fail")
  269. }
  270. rd := pool.Get()
  271. defer rd.Close()
  272. riMutex.Lock()
  273. defer riMutex.Unlock()
  274. pKey := get_roll_key(id)
  275. _, err := rd.Do("del", pKey)
  276. if err != nil {
  277. log.Println(err)
  278. return err
  279. }
  280. rd.Do("srem", ROLL_MAIN_KEY, id)
  281. for i := 0; i < len(rollList); i++ {
  282. if id == rollList[i].Id {
  283. ii := i + 1
  284. rollList = append(rollList[:i], rollList[ii:]...)
  285. }
  286. }
  287. SendGameDeleteRoll(id)
  288. return nil
  289. }
  290. // 删除非活跃roll房
  291. func del_unactive_roll_info(id int) error {
  292. pool := utils.GetAccountRedisPool()
  293. if pool == nil {
  294. return fmt.Errorf("get redis pool fail")
  295. }
  296. rd := pool.Get()
  297. defer rd.Close()
  298. pKey := get_roll_key(id)
  299. _, err := rd.Do("del", pKey)
  300. if err != nil {
  301. log.Println(err)
  302. return err
  303. }
  304. rd.Do("srem", ROLL_MAIN_KEY, id)
  305. SendGameDeleteRoll(id)
  306. return nil
  307. }
  308. // 获取roll房信息信息
  309. func GetRollInfoById(id int) (hf *RollInfo) {
  310. riMutex.Lock()
  311. defer riMutex.Unlock()
  312. // 更新参与列表
  313. UpdateSignupUidList(id)
  314. for i := 0; i < len(rollList); i++ {
  315. if id == rollList[i].Id {
  316. return rollList[i]
  317. }
  318. }
  319. return nil
  320. }
  321. func GetRollInfoList() RollInfoArray {
  322. riMutex.Lock()
  323. defer riMutex.Unlock()
  324. // 更新参与列表
  325. for _, v := range rollList {
  326. UpdateSignupUidList(v.Id)
  327. }
  328. // 已开奖
  329. var _rollList RollInfoArray
  330. currTime := time.Now().Unix()
  331. for _, v := range rollList {
  332. if v.AwardTime > currTime {
  333. _rollList = append(_rollList, v)
  334. } else {
  335. del_unactive_roll_info(v.Id)
  336. }
  337. }
  338. rollList = _rollList
  339. return rollList
  340. }
  341. func GetRollConditionList() RollConditionArray {
  342. return conditionList
  343. }
  344. // 游戏服 - 新增
  345. func SendGameAddRoll(id int) error {
  346. params := make(map[string]interface{})
  347. params["name"] = "gm_add_roll"
  348. data := make(map[string]interface{})
  349. data["id"] = id
  350. params["data"] = data
  351. body, _ := json.Marshal(params)
  352. host := utils.GetKeyConf("gameservers", "web")
  353. sign := utils.Strtomd5(string(body) + utils.GetKeyConf("app", "gameKey"))
  354. url := "http://" + host + "/json?sign=" + sign
  355. buff, err := utils.SendAndRecvHTTP("POST", url, string(body))
  356. if err != nil {
  357. return err
  358. }
  359. var res RES_ROLL
  360. err = json.Unmarshal(buff, &res)
  361. if err != nil {
  362. return err
  363. }
  364. if res.Code != 200 {
  365. return fmt.Errorf("code:%d", res.Code)
  366. }
  367. return nil
  368. }
  369. // 游戏服 - 更新
  370. func SendGameUpdateRoll(id int) error {
  371. params := make(map[string]interface{})
  372. params["name"] = "gm_update_roll"
  373. data := make(map[string]interface{})
  374. data["id"] = id
  375. params["data"] = data
  376. body, _ := json.Marshal(params)
  377. host := utils.GetKeyConf("gameservers", "web")
  378. sign := utils.Strtomd5(string(body) + utils.GetKeyConf("app", "gameKey"))
  379. url := "http://" + host + "/json?sign=" + sign
  380. buff, err := utils.SendAndRecvHTTP("POST", url, string(body))
  381. if err != nil {
  382. return err
  383. }
  384. var res RES_ROLL
  385. err = json.Unmarshal(buff, &res)
  386. if err != nil {
  387. return err
  388. }
  389. if res.Code != 200 {
  390. return fmt.Errorf("code:%d", res.Code)
  391. }
  392. return nil
  393. }
  394. // 游戏服 - 更新
  395. func SendGameDeleteRoll(id int) error {
  396. params := make(map[string]interface{})
  397. params["name"] = "gm_del_roll"
  398. data := make(map[string]interface{})
  399. data["id"] = id
  400. params["data"] = data
  401. body, _ := json.Marshal(params)
  402. host := utils.GetKeyConf("gameservers", "web")
  403. sign := utils.Strtomd5(string(body) + utils.GetKeyConf("app", "gameKey"))
  404. url := "http://" + host + "/json?sign=" + sign
  405. buff, err := utils.SendAndRecvHTTP("POST", url, string(body))
  406. if err != nil {
  407. return err
  408. }
  409. var res RES_ROLL
  410. err = json.Unmarshal(buff, &res)
  411. if err != nil {
  412. return err
  413. }
  414. if res.Code != 200 {
  415. return fmt.Errorf("code:%d", res.Code)
  416. }
  417. return nil
  418. }