|
@@ -0,0 +1,185 @@
|
|
1
|
+--[[
|
|
2
|
+Descripttion:roll房
|
|
3
|
+version:
|
|
4
|
+Author: Neo,Huang
|
|
5
|
+Date: 2023-11-16 21:45:09
|
|
6
|
+LastEditors: Neo,Huang
|
|
7
|
+LastEditTime: 2023-11-16 23:20:12
|
|
8
|
+--]]
|
|
9
|
+local timer = require("timer")
|
|
10
|
+local baseService = require("baseService")
|
|
11
|
+local lib_game_redis = require("lib_game_redis")
|
|
12
|
+local redisUtil = require("utils.redisUtil")
|
|
13
|
+local util_mail = require("utils.util_mail")
|
|
14
|
+local timeUtil = require "utils.timeUtil"
|
|
15
|
+
|
|
16
|
+local resAdapt = require("adapt.resAdapt")
|
|
17
|
+
|
|
18
|
+local bagData = require("data.bag")
|
|
19
|
+
|
|
20
|
+local timerAward = nil
|
|
21
|
+
|
|
22
|
+local root = {rollList = {}}
|
|
23
|
+
|
|
24
|
+-- 载入活跃roll房
|
|
25
|
+local MAIN_KEY = "roll:room"
|
|
26
|
+local function _get_room_key(rid)
|
|
27
|
+ return string.format("%s:%s", MAIN_KEY, tostring(rid))
|
|
28
|
+end
|
|
29
|
+local function _get_room_award_key()
|
|
30
|
+ return string.format("%s:award", MAIN_KEY)
|
|
31
|
+end
|
|
32
|
+local function _load_active_roll_info()
|
|
33
|
+ local ridList = lib_game_redis:smembers(MAIN_KEY)
|
|
34
|
+ log.info("_load_active_roll_info ridList[%s]", tostring(ridList))
|
|
35
|
+ if is_empty(ridList) then
|
|
36
|
+ return
|
|
37
|
+ end
|
|
38
|
+ for _, v in ipairs(ridList) do
|
|
39
|
+ local rid = tonumber(v)
|
|
40
|
+ local key = _get_room_key(rid)
|
|
41
|
+ local awardTime = redisUtil.hget_int(key, "awardTime")
|
|
42
|
+ if not is_empty(awardTime) then
|
|
43
|
+ table.insert(root.rollList, {id = rid, awardTime = awardTime})
|
|
44
|
+ end
|
|
45
|
+ end
|
|
46
|
+ log.info("_load_active_roll_info rollList[%s]", tostring(root.rollList))
|
|
47
|
+end
|
|
48
|
+-- 发奖
|
|
49
|
+local function _roll_award(rid)
|
|
50
|
+ log.info("_roll_award 房间ID[%s]", tostring(rid))
|
|
51
|
+ if is_empty(rid) then
|
|
52
|
+ return
|
|
53
|
+ end
|
|
54
|
+ local key = _get_room_key(rid)
|
|
55
|
+ -- 删除roll信息
|
|
56
|
+ lib_game_redis:del(key)
|
|
57
|
+ lib_game_redis:srem(MAIN_KEY, rid)
|
|
58
|
+ lib_game_redis:sismember(_get_room_award_key(), rid)
|
|
59
|
+
|
|
60
|
+ local signupUidList = redisUtil.hget_json(key, "signupUidList")
|
|
61
|
+ if is_empty(signupUidList) then
|
|
62
|
+ -- 没有玩家参与
|
|
63
|
+ return
|
|
64
|
+ end
|
|
65
|
+ local itemIdList = redisUtil.hget_json(key, "itemIdList")
|
|
66
|
+ if is_empty(itemIdList) then
|
|
67
|
+ -- 无奖励物品
|
|
68
|
+ return
|
|
69
|
+ end
|
|
70
|
+ local mapUidItems = {}
|
|
71
|
+ for _, id in ipairs(itemIdList) do
|
|
72
|
+ -- 随机中奖玩家
|
|
73
|
+ local index = math.random(1, #signupUidList)
|
|
74
|
+ local uid = signupUidList[index]
|
|
75
|
+ if mapUidItems[uid] == nil then
|
|
76
|
+ mapUidItems[uid] = {}
|
|
77
|
+ end
|
|
78
|
+ table.insert(mapUidItems[uid], {id = id, count = 1})
|
|
79
|
+ end
|
|
80
|
+ log.info("_roll_award mapUidItems[%s]", tostring(mapUidItems))
|
|
81
|
+ local name = redisUtil.hget(key, "name")
|
|
82
|
+ local title = "roll房结算"
|
|
83
|
+ -- 中奖玩家发奖
|
|
84
|
+ for uid, items in pairs(mapUidItems) do
|
|
85
|
+ local keyEvent = string.format("roll-%s", tostring(rid))
|
|
86
|
+ bagData:add_items(uid, items, keyEvent)
|
|
87
|
+ -- 邮件
|
|
88
|
+ local cnt = string.format("恭喜您,参与%sroll房活动中获得以下奖励,奖励已发送至背包,请查收。", tostring(name))
|
|
89
|
+ for _, v in ipairs(items) do
|
|
90
|
+ cnt = cnt + string.format("\n%s", resAdapt:get_item_name(v.id))
|
|
91
|
+ end
|
|
92
|
+ util_mail:add_mail(uid, 0, title, cnt, {}, 0, nil, nil, "system")
|
|
93
|
+ end
|
|
94
|
+ -- 未中奖玩家邮件
|
|
95
|
+ for _, uid in ipairs(signupUidList) do
|
|
96
|
+ if mapUidItems[uid] == nil then
|
|
97
|
+ local cnt = string.format("很遗憾,您参与的%sroll房活动中未获得奖励。", tostring(name))
|
|
98
|
+ end
|
|
99
|
+ util_mail:add_mail(uid, 0, title, cnt, {}, 0, nil, nil, "system")
|
|
100
|
+ end
|
|
101
|
+end
|
|
102
|
+-- 定时器结束
|
|
103
|
+local function _timeout_award()
|
|
104
|
+ log.info("_timeout_award rollList[%s]", tostring(root.rollList))
|
|
105
|
+ if is_empty(root.rollList) then
|
|
106
|
+ return
|
|
107
|
+ end
|
|
108
|
+ local rollList = {}
|
|
109
|
+ local currTime = skynet_time()
|
|
110
|
+ for _, v in ipairs(root.rollList) do
|
|
111
|
+ log.info("_timeout_award 房间ID[%s] 发奖时间[%s]", tostring(v.id), timeUtil.toString(v.awardTime))
|
|
112
|
+ if currTime >= v.awardTime then
|
|
113
|
+ -- 发奖
|
|
114
|
+ _roll_award(v.id)
|
|
115
|
+ else
|
|
116
|
+ table.insert(rollList, table.copy(v))
|
|
117
|
+ end
|
|
118
|
+ end
|
|
119
|
+ root.rollList = rollList
|
|
120
|
+end
|
|
121
|
+
|
|
122
|
+function root.onStart()
|
|
123
|
+ math.randomseed(os.time())
|
|
124
|
+ _load_active_roll_info()
|
|
125
|
+ timerAward = timer.timeOut(60, _timeout_award)
|
|
126
|
+end
|
|
127
|
+
|
|
128
|
+function root.onStop()
|
|
129
|
+ -- 取消定时器
|
|
130
|
+ timerAward.func = nil
|
|
131
|
+end
|
|
132
|
+
|
|
133
|
+-- 新增roll房
|
|
134
|
+function root.add_roll(rid)
|
|
135
|
+ local key = _get_room_key(rid)
|
|
136
|
+ local awardTime = redisUtil.hget_int(key, "awardTime")
|
|
137
|
+ local isAwarded = lib_game_redis:sismember(_get_room_award_key(), rid)
|
|
138
|
+ if not is_empty(awardTime) and not isAwarded then
|
|
139
|
+ local isMatch = false
|
|
140
|
+ for _, v in ipairs(root.rollList) do
|
|
141
|
+ if v.id == rid then
|
|
142
|
+ isMatch = true
|
|
143
|
+ v.awardTime = awardTime
|
|
144
|
+ break
|
|
145
|
+ end
|
|
146
|
+ end
|
|
147
|
+ if not isMatch then
|
|
148
|
+ table.insert(root.rollList, {id = rid, awardTime = awardTime})
|
|
149
|
+ end
|
|
150
|
+ end
|
|
151
|
+end
|
|
152
|
+-- 更新roll房
|
|
153
|
+function root.update_roll(rid)
|
|
154
|
+ local key = _get_room_key(rid)
|
|
155
|
+ local awardTime = redisUtil.hget_int(key, "awardTime")
|
|
156
|
+ local isAwarded = lib_game_redis:sismember(_get_room_award_key(), rid)
|
|
157
|
+ if not is_empty(awardTime) and not isAwarded then
|
|
158
|
+ local isMatch = false
|
|
159
|
+ for _, v in ipairs(root.rollList) do
|
|
160
|
+ if v.id == rid then
|
|
161
|
+ isMatch = true
|
|
162
|
+ v.awardTime = awardTime
|
|
163
|
+ break
|
|
164
|
+ end
|
|
165
|
+ end
|
|
166
|
+ if not isMatch then
|
|
167
|
+ table.insert(root.rollList, {id = rid, awardTime = awardTime})
|
|
168
|
+ end
|
|
169
|
+ end
|
|
170
|
+end
|
|
171
|
+-- 删除roll房
|
|
172
|
+function root.del_roll(rid)
|
|
173
|
+ local key = _get_room_key(rid)
|
|
174
|
+ -- 删除roll信息
|
|
175
|
+ lib_game_redis:del(key)
|
|
176
|
+ lib_game_redis:srem(MAIN_KEY, rid)
|
|
177
|
+ for k, v in ipairs(root.rollList) do
|
|
178
|
+ if v.id == rid then
|
|
179
|
+ table.remove(root.rollList, k)
|
|
180
|
+ break
|
|
181
|
+ end
|
|
182
|
+ end
|
|
183
|
+end
|
|
184
|
+
|
|
185
|
+baseService.start(root, ".rollSrv", true)
|