Blame view

src/services/capsuled.lua 8.06 KB
555f745e   zhangqijia   feat: 一番赏
1
2
3
4
5
  require "ProtocolCode"
  require "shared.init"
  require "GlobalVar"
  require "RedisKeys"
  require "skynet.manager"
d10a9a36   zhangqijia   fix: 一番赏增加通知信息的数据...
6
  skynet = require "skynet"
555f745e   zhangqijia   feat: 一番赏
7
8
9
10
11
12
13
14
15
16
17
18
  csvdb = require "shared.csvdata"
  redisproxy = require "shared.redisproxy"
  datacenter = require "skynet.datacenter"
  
  local capsules = {}
  local CMD = {}
  
  NotifyChangeType = {
      JOIN = 1,
      EXIT = 2,
      DRAW = 3,
      SPECIAL = 4,
0eb317fb   zhangqijia   fix: 一番赏奖励抽奖的bug与...
19
20
21
22
23
24
25
  }
  
  skynet.register_protocol {
      name = "role",
      id = 101,
      pack = skynet.pack,
      unpack = skynet.unpack,
555f745e   zhangqijia   feat: 一番赏
26
27
  }
  
cd2a7a67   zhangqijia   fix: 一番赏奖励中加入得奖者的...
28
  local function rpcRole(roleId, funcName, ...)
555f745e   zhangqijia   feat: 一番赏
29
30
      local fields = ...
      local agent = datacenter.get("agent", roleId)
0eb317fb   zhangqijia   fix: 一番赏奖励抽奖的bug与...
31
32
33
34
35
36
      if agent and agent.serv then
          if funcName == "getProperties" then
              return true, skynet.call(agent.serv, "role", funcName, fields)
          else
              return true, skynet.call(agent.serv, "role", funcName, ...)
          end
555f745e   zhangqijia   feat: 一番赏
37
      else
0eb317fb   zhangqijia   fix: 一番赏奖励抽奖的bug与...
38
39
40
41
42
43
          local roleCross = require("models.RoleCross")
          if funcName == "getProperties" then
              return false, roleCross.handle(funcName, roleId, fields)
          else
              return false, roleCross.handle(funcName, roleId, ...)
          end
555f745e   zhangqijia   feat: 一番赏
44
45
46
      end
  end
  
cd2a7a67   zhangqijia   fix: 一番赏奖励中加入得奖者的...
47
  function getNameByRoleId(roleId)
0eb317fb   zhangqijia   fix: 一番赏奖励抽奖的bug与...
48
49
      local status, name = rpcRole(roleId, "getProperty", "name")
      return name
cd2a7a67   zhangqijia   fix: 一番赏奖励中加入得奖者的...
50
51
52
  
  end
  
555f745e   zhangqijia   feat: 一番赏
53
  function broadCastCapsule(roleId, capsuleId, broadInfo)
7f21f75b   zhangqijia   fix: 一番赏 增加rank,刷...
54
55
56
      local capsule = capsules[capsuleId]
      if not capsule then print("not capsule :" .. capsuleId) return end
  
555f745e   zhangqijia   feat: 一番赏
57
58
59
60
61
62
63
64
65
66
      local register = capsule:getProperty("register") or {}
      if next(capsule) then
          for id, _ in pairs(register) do
              if id ~= roleId then
                  rpcRole(id, "SendPacket", actionCodes.Capsule_notifyChange, MsgPack.pack(broadInfo)) 	-- 通知对方
              end
          end
      end
  end
  
0eb317fb   zhangqijia   fix: 一番赏奖励抽奖的bug与...
67
  function broadCastSpecial(roleId, capsuleId, broadInfo)
01ff9b4b   zhangqijia   fix: 一番赏 优化; 抽奖记录...
68
      if not broadInfo or not next(broadInfo) then return end
7f21f75b   zhangqijia   fix: 一番赏 增加rank,刷...
69
70
71
      local capsule = capsules[capsuleId]
      if not capsule then skynet.error("not capsule: " .. capsuleId) return end
  
0eb317fb   zhangqijia   fix: 一番赏奖励抽奖的bug与...
72
      local register = capsule:getProperty("register") or {}
7f21f75b   zhangqijia   fix: 一番赏 增加rank,刷...
73
74
75
      for id, _ in pairs(register) do
          if id ~= roleId then
              if broadInfo[id] then
da20e384   zhangqijia   feat: 一番赏 特殊赏 通知
76
                 rpcRole(id, "paySpecialReward", id, broadInfo[id])
0eb317fb   zhangqijia   fix: 一番赏奖励抽奖的bug与...
77
78
79
              end
          end
      end
555f745e   zhangqijia   feat: 一番赏
80
81
  end
  
555f745e   zhangqijia   feat: 一番赏
82
  local function add(roleId, capsuleId)
7f21f75b   zhangqijia   fix: 一番赏 增加rank,刷...
83
84
      local capsule = capsules[capsuleId]
      if not capsule then skynet.error("not capsule: " .. capsuleId) return end
555f745e   zhangqijia   feat: 一番赏
85
86
      if next(capsule) then
          capsule:join(roleId)
0eb317fb   zhangqijia   fix: 一番赏奖励抽奖的bug与...
87
          broadCastCapsule(roleId, capsuleId, {notifyType= NotifyChangeType.JOIN, roleId = roleId})
f382b4f2   zhangqijia   fix: 一番赏的抽奖bug
88
          return capsule:data(roleId)
555f745e   zhangqijia   feat: 一番赏
89
90
91
92
93
94
      end
      print("id 不存在: ".. capsuleId)
      return nil
  end
  
  local function capsuleRefreshing()
f2f84157   zhangqijia   fix: 一番赏 修复king赏bug
95
      local now = skynet.timex()
555f745e   zhangqijia   feat: 一番赏
96
      for _, v in pairs(capsules) do
f2f84157   zhangqijia   fix: 一番赏 修复king赏bug
97
          if v:refreshing(now) then
555f745e   zhangqijia   feat: 一番赏
98
99
100
101
102
103
104
105
106
107
108
109
              v:init()
              v:create()
          end
      end
  end
  
  --扭蛋机刷新
  local function check_capsules()
      pcall(capsuleRefreshing)
      skynet.timeout(60, check_capsules)
  end
  
6304b5ad   zhangqijia   feat: 一番赏 增加重置扭蛋机指令
110
111
112
113
114
115
116
117
118
119
120
121
  function CMD.reset()
      local now = skynet.timex()
      local res = redisproxy:smembers(CAPSULE_INFO) or {}
      for _, key in pairs(res) do
          redisproxy:del(CAPSULE_PUBLIC:format(key))
          redisproxy:srem(CAPSULE_INFO, key)
      end
  
      for _, data in pairs(csvdb["ichibankuji_mainCsv"]) do
          for _, val in ipairs(data) do
              if val.type == 1 then
                  local key = val.id..val.room
078bdb2f   zhangqijia   fix: 一番赏 特殊赏的抽奖记录...
122
123
124
125
126
                  local capsule = require("models.Capsule").new({ key = CAPSULE_PUBLIC:format(key), id= val.id, room = val.room, typ = 1, name=val.name})
                  capsule:init()
                  capsule:create()
                  capsules[key] = capsule
                  redisproxy:sadd(CAPSULE_INFO, key)
6304b5ad   zhangqijia   feat: 一番赏 增加重置扭蛋机指令
127
128
129
130
131
              end
          end
      end
  end
  
555f745e   zhangqijia   feat: 一番赏
132
133
134
135
  function CMD.start()
      local now = skynet.timex()
      local res = redisproxy:smembers(CAPSULE_INFO) or {}
      for _, key in pairs(res) do
d10a9a36   zhangqijia   fix: 一番赏增加通知信息的数据...
136
          local capsule = require("models.Capsule").new({ key = CAPSULE_PUBLIC:format(key)})
555f745e   zhangqijia   feat: 一番赏
137
138
139
140
141
142
143
144
          capsule:load()
          if capsule:isShow() then
              if capsule:refreshing(now) then
                  capsule:init()
                  capsule:create()
              end
              capsules[key] = capsule
          else
d10a9a36   zhangqijia   fix: 一番赏增加通知信息的数据...
145
              redisproxy:del(CAPSULE_PUBLIC:format(key))
f382b4f2   zhangqijia   fix: 一番赏的抽奖bug
146
              redisproxy:srem(CAPSULE_INFO, key)
555f745e   zhangqijia   feat: 一番赏
147
148
149
150
151
152
          end
      end
  
      for _, data in pairs(csvdb["ichibankuji_mainCsv"]) do
          for _, val in ipairs(data) do
              if val.type == 1 then
d10a9a36   zhangqijia   fix: 一番赏增加通知信息的数据...
153
                  local key = val.id..val.room
555f745e   zhangqijia   feat: 一番赏
154
                  if not capsules[key] then
f2f84157   zhangqijia   fix: 一番赏 修复king赏bug
155
156
157
158
159
160
161
162
                      if now < val.hide_time then
                          local capsule = require("models.Capsule").new({ key = CAPSULE_PUBLIC:format(key), id= val.id, room = val.room, typ = 1, name=val.name})
                          capsule:init()
                          capsule:create()
  
                          capsules[key] = capsule
                          redisproxy:sadd(CAPSULE_INFO, key)
                      end
555f745e   zhangqijia   feat: 一番赏
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
                  end
              end
          end
      end
  
      check_capsules()
  end
  
  function CMD.list(coin)
      local tmpCapsules = {}
      for k, v in pairs(capsules) do
          if v:getProperty("coin") == coin then
              local onlineCount= v:getOnlineCount()
              tmpCapsules[k] = {id=v:getProperty("id"), room=v:getProperty("room"), typ=v:getProperty("typ"), people=onlineCount[2], coin= v:getProperty("coin")}
          end
      end
      return tmpCapsules
  end
  
  function CMD.join(roleId, capsuleId)
      if capsuleId then
          return add(roleId, capsuleId)
      end
      return nil
  end
  
  
  function CMD.exit(roleId, capsuleId)
d10a9a36   zhangqijia   fix: 一番赏增加通知信息的数据...
191
      if capsuleId then
7f21f75b   zhangqijia   fix: 一番赏 增加rank,刷...
192
193
194
195
196
          local capsule = capsules[capsuleId]
          if not capsule then skynet.error("not capsule: " .. capsuleId) return end
  
          capsule:exit(roleId)
          broadCastCapsule(roleId, capsuleId, {notifyType = NotifyChangeType.EXIT, roleId = roleId})
d10a9a36   zhangqijia   fix: 一番赏增加通知信息的数据...
197
      else
652ef8f7   zhangqijia   fix: 一番赏 修复广播caps...
198
          for id, capsule in pairs(capsules) do
d10a9a36   zhangqijia   fix: 一番赏增加通知信息的数据...
199
200
              if next(capsule) then
                  capsule:exit(roleId)
652ef8f7   zhangqijia   fix: 一番赏 修复广播caps...
201
                  broadCastCapsule(roleId, id, {notifyType = NotifyChangeType.EXIT, roleId = roleId})
d10a9a36   zhangqijia   fix: 一番赏增加通知信息的数据...
202
203
              end
          end
555f745e   zhangqijia   feat: 一番赏
204
205
206
      end
  end
  
0eb317fb   zhangqijia   fix: 一番赏奖励抽奖的bug与...
207
  function CMD.draw_capsule(roleId, capsuleId, full, drawsNum, cares)
7f21f75b   zhangqijia   fix: 一番赏 增加rank,刷...
208
209
210
      local capsule = capsules[capsuleId]
      if not capsule then skynet.error("not capsule: " .. capsuleId) return 2 end
  
01ff9b4b   zhangqijia   fix: 一番赏 优化; 抽奖记录...
211
      local ret, drawReward = capsule:draw(roleId, full, drawsNum, cares)
7f21f75b   zhangqijia   fix: 一番赏 增加rank,刷...
212
213
      if ret > 5 then
          --broadCastCapsule(roleId, capsuleId, {notifyType = NotifyChangeType.DRAW, notify = notify})
01ff9b4b   zhangqijia   fix: 一番赏 优化; 抽奖记录...
214
          broadCastSpecial(roleId, capsuleId, drawReward["specials"])
555f745e   zhangqijia   feat: 一番赏
215
      end
01ff9b4b   zhangqijia   fix: 一番赏 优化; 抽奖记录...
216
217
      drawReward["specials"] = nil
      return ret, drawReward, capsule:data(roleId)
555f745e   zhangqijia   feat: 一番赏
218
219
  end
  
f382b4f2   zhangqijia   fix: 一番赏的抽奖bug
220
  function CMD.register(roleId, capsuleId)
7f21f75b   zhangqijia   fix: 一番赏 增加rank,刷...
221
222
223
      local capsule = capsules[capsuleId]
      if not capsule then skynet.error("not capsule: " .. capsuleId) return nil end
  
0eb317fb   zhangqijia   fix: 一番赏奖励抽奖的bug与...
224
225
226
227
      return capsule:register(roleId)
  end
  
  function CMD.goods_stock(capsuleId)
7f21f75b   zhangqijia   fix: 一番赏 增加rank,刷...
228
229
230
      local capsule = capsules[capsuleId]
      if not capsule then skynet.error("not capsule: " .. capsuleId) return 0 end
  
0eb317fb   zhangqijia   fix: 一番赏奖励抽奖的bug与...
231
232
233
      return capsule:getGoodsAmount(), capsule:getProperty("token")
  end
  
0a421d34   zhangqijia   fix: 一番赏奖励 刷新协议缺少...
234
  function CMD.capsule_data(roleId, capsuleId)
7f21f75b   zhangqijia   fix: 一番赏 增加rank,刷...
235
236
237
      local capsule = capsules[capsuleId]
      if not capsule then skynet.error("not capsule: " .. capsuleId) return nil end
  
0a421d34   zhangqijia   fix: 一番赏奖励 刷新协议缺少...
238
      return capsule:data(roleId)
f382b4f2   zhangqijia   fix: 一番赏的抽奖bug
239
240
  end
  
01ff9b4b   zhangqijia   fix: 一番赏 优化; 抽奖记录...
241
242
243
244
245
246
247
  function CMD.page_record(capsuleId, up, idx)
      local capsule = capsules[capsuleId]
      if not capsule then skynet.error("not capsule: " .. capsuleId) return nil end
  
      return capsule:pageRecord(up, idx)
  end
  
da20e384   zhangqijia   feat: 一番赏 特殊赏 通知
248
249
250
251
252
253
254
255
256
257
258
259
260
261
  function CMD.get_special_nty(roleId, capsuleId)
      local capsule = capsules[capsuleId]
      if not capsule then skynet.error("not capsule: " .. capsuleId) return nil end
  
      return capsule:getSpecialNotify(roleId)
  end
  
  function CMD.clear_special_nty(roleId, capsuleId, good_ids)
      local capsule = capsules[capsuleId]
      if not capsule then skynet.error("not capsule: " .. capsuleId) return nil end
  
      return capsule:clearSpecialNty(roleId, good_ids)
  end
  
555f745e   zhangqijia   feat: 一番赏
262
263
264
265
266
267
268
  skynet.start(function()
      skynet.dispatch("lua", function(session, address, cmd, ...)
          local f = CMD[string.lower(cmd)]
          skynet.ret(skynet.pack(f(...)))
      end)
  
      skynet.register("capsuled")
cd2a7a67   zhangqijia   fix: 一番赏奖励中加入得奖者的...
269
      globalCsv = csvdb["GlobalDefineCsv"]
555f745e   zhangqijia   feat: 一番赏
270
  end)