Explorar el Código

新增roll房

neo hace 1 año
padre
commit
c811435ded
Se han modificado 4 ficheros con 256 adiciones y 3 borrados
  1. 32 0
      dev/modules/roll.lua
  2. 2 1
      nodes/global/main.lua
  3. 185 0
      nodes/global/service/rollSrv.lua
  4. 37 2
      nodes/web/controllers/gm.lua

+ 32 - 0
dev/modules/roll.lua

@@ -0,0 +1,32 @@
1
+--[[
2
+Descripttion:roll房
3
+version:
4
+Author: Neo,Huang
5
+Date: 2022-08-17 16:04:20
6
+LastEditors: Neo,Huang
7
+LastEditTime: 2022-08-19 20:12:34
8
+--]]
9
+local root = class("roll", require("base.baseModule"))
10
+
11
+function root:ctor(id)
12
+	root.super.ctor(self, id, "roll", "id", true, false)
13
+	self.id = id
14
+end
15
+
16
+function root:mysql_get_init_columns()
17
+	return {
18
+		id = "bigint(20) NOT NULL COMMENT '活动ID'",
19
+		name = "varchar(64) DEFAULT NULL COMMENT '房间名'",
20
+		bandShareCode = "varchar(10) DEFAULT NULL COMMENT '绑定推广码'",
21
+		createTime = "int(11) DEFAULT 0 COMMENT '创建时间'",
22
+		showStartTime = "int(11) DEFAULT 0 COMMENT '开始展示时间'",
23
+		signupStartTime = "int(11) DEFAULT 0 COMMENT '报名开始时间'",
24
+		signupEndTime = "int(11) DEFAULT 0 COMMENT '报名结束时间'",
25
+		awardTime = "int(11) DEFAULT 0 COMMENT '开奖时间'",
26
+		conditions = "json COMMENT '参与条件列表'",
27
+		itemIdList = "json COMMENT '奖励物品ID列表'",
28
+		signupUidList = "json COMMENT '报名玩家ID列表列表'"
29
+	}
30
+end
31
+
32
+return root

+ 2 - 1
nodes/global/main.lua

@@ -24,10 +24,11 @@ skynet.start(
24 24
         -- 配置
25 25
         init_nodes:init_config()
26 26
 
27
-        skynet.uniqueservice("backupSrv")
27
+        -- skynet.uniqueservice("backupSrv")
28 28
         skynet.uniqueservice("mailSrv")
29 29
         skynet.uniqueservice("dreamSrv")
30 30
         skynet.uniqueservice("battlerecordSrv")
31
+        skynet.uniqueservice("rollSrv")
31 32
 
32 33
         -- 集群
33 34
         init_nodes:init_cluster()

+ 185 - 0
nodes/global/service/rollSrv.lua

@@ -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)

+ 37 - 2
nodes/web/controllers/gm.lua

@@ -3,6 +3,7 @@ local timeUtil = require "utils.timeUtil"
3 3
 local util_user = require("utils.util_user")
4 4
 local util_mail = require("utils.util_mail")
5 5
 local gameConst = require("const.gameConst")
6
+local nodeMgr = require "nodeMgr"
6 7
 
7 8
 local baseAdapt = require("base.baseAdapt")
8 9
 local resAdapt = require("adapt.resAdapt")
@@ -78,7 +79,7 @@ function root.gm_get_conf_goods(msg)
78 79
 end
79 80
 
80 81
 -- 对某个玩家发送邮件
81
-function root.send_mail(msg)
82
+function root.gm_send_mail(msg)
82 83
     local uid = tonumber(msg.uid)
83 84
 
84 85
     for i, v in pairs(msg.items) do
@@ -105,7 +106,7 @@ function root.send_mail(msg)
105 106
 end
106 107
 
107 108
 -- 玩家状态
108
-function root.update_player_status(msg)
109
+function root.gm_update_player_status(msg)
109 110
     log.info("update_player_status msg[%s]", tostring(msg))
110 111
     if msg == nil then
111 112
         return code.PARAMTER_ERROR
@@ -123,4 +124,38 @@ function root.update_player_status(msg)
123 124
     return code.OK
124 125
 end
125 126
 
127
+----------------------------------------
128
+-- roll房
129
+----------------------------------------
130
+-- 新增
131
+function root.gm_add_roll(msg)
132
+    local id = msg.id
133
+    if is_empty(id) then
134
+        return code.PARAMTER_ERROR
135
+    end
136
+
137
+    nodeMgr.send("global", ".rollSrv", "add_roll", id)
138
+    return code.OK
139
+end
140
+-- 更新
141
+function root.gm_update_roll(msg)
142
+    local id = msg.id
143
+    if is_empty(id) then
144
+        return code.PARAMTER_ERROR
145
+    end
146
+
147
+    nodeMgr.send("global", ".rollSrv", "update_roll", id)
148
+    return code.OK
149
+end
150
+-- 删除
151
+function root.gm_del_roll(msg)
152
+    local id = msg.id
153
+    if is_empty(id) then
154
+        return code.PARAMTER_ERROR
155
+    end
156
+
157
+    nodeMgr.send("global", ".rollSrv", "del_roll", id)
158
+    return code.OK
159
+end
160
+
126 161
 return root