Commit dc9d814faa59914d3c51c95c53c1152d8252b150

Authored by zhouhaihai
1 parent f603a60f

邮件

@@ -146,4 +146,30 @@ DinerTask = { @@ -146,4 +146,30 @@ DinerTask = {
146 DishWithGoldType = 4, 146 DishWithGoldType = 4,
147 SellDishRare = 5, 147 SellDishRare = 5,
148 DishWithGoldRare = 6, 148 DishWithGoldRare = 6,
149 -}  
150 \ No newline at end of file 149 \ No newline at end of file
  150 +}
  151 +
  152 +SettingEnum = {
  153 + BgMusic = 1, -- 背景音乐
  154 + EffectMusic = 2, -- 音效
  155 + CV = 3, -- cv
  156 +}
  157 +
  158 +SettingStatus = {
  159 + [1] = {
  160 + [1] = 1, -- 开启
  161 + [0] = 1, -- 关闭
  162 + ["default"] = 1, -- 默认设置
  163 + },
  164 + [2] = {
  165 + [1] = 1, -- 开启
  166 + [0] = 1, -- 关闭
  167 + ["default"] = 1, -- 默认设置
  168 + },
  169 + [3] = {
  170 + [1] = 1, -- 开启
  171 + [0] = 1, -- 关闭
  172 + ["default"] = 1, -- 默认设置
  173 + },
  174 +}
  175 +
  176 +EMAIL_LIMIT = 50 --邮件最大数量
src/ProtocolCode.lua
@@ -35,6 +35,11 @@ actionCodes = { @@ -35,6 +35,11 @@ actionCodes = {
35 Role_chatRpc = 120, 35 Role_chatRpc = 120,
36 Role_chat = 121, 36 Role_chat = 121,
37 Role_chatGet = 122, 37 Role_chatGet = 122,
  38 + Role_changeNameRpc = 123,
  39 + Role_changeIntroRpc = 124,
  40 + Role_changeSettingRpc = 125,
  41 + Role_drawCodeRpc = 126,
  42 + Role_changeHeadRpc = 127,
38 43
39 Adv_startAdvRpc = 151, 44 Adv_startAdvRpc = 151,
40 Adv_startHangRpc = 152, 45 Adv_startHangRpc = 152,
@@ -143,6 +148,13 @@ actionCodes = { @@ -143,6 +148,13 @@ actionCodes = {
143 Store_rechargeRpc = 550, 148 Store_rechargeRpc = 550,
144 Store_dailyBuyRpc = 551, 149 Store_dailyBuyRpc = 551,
145 Store_dinerBuyRpc = 552, 150 Store_dinerBuyRpc = 552,
  151 +
  152 + Email_listRpc = 600,
  153 + Email_drawAllAttachRpc = 601,
  154 + Email_drawAttachRpc = 602,
  155 + Email_checkRpc = 603,
  156 + Email_delRpc = 604,
  157 +
146 } 158 }
147 159
148 rpcResponseBegin = 10000 160 rpcResponseBegin = 10000
@@ -8,6 +8,8 @@ R_PVP = "role:%d:pvp" -- pvp @@ -8,6 +8,8 @@ R_PVP = "role:%d:pvp" -- pvp
8 R_EQUIP_ROOT = "role:%d:equip*" -- 装备根目录 8 R_EQUIP_ROOT = "role:%d:equip*" -- 装备根目录
9 R_RUNEIDS = "role:%d:runeIds" -- 玩家拥有符文自增id 9 R_RUNEIDS = "role:%d:runeIds" -- 玩家拥有符文自增id
10 R_RUNE = "role:%d:rune:%d" -- 符文详细信息 10 R_RUNE = "role:%d:rune:%d" -- 符文详细信息
  11 +R_EMAIL = "role:%d:emailIds" --邮件列表
  12 +R_EMAIL_ITEM = "email:%d:%d" --邮件
11 13
12 14
13 -- rank 15 -- rank
src/actions/EmailAction.lua 0 → 100644
@@ -0,0 +1,188 @@ @@ -0,0 +1,188 @@
  1 +local _M = {}
  2 +local tarr2tab = table.array2Table
  3 +
  4 +local function loadEmails(roleId)
  5 + local emails = {}
  6 + local rds = string.format(R_EMAIL, roleId)
  7 + local ids = redisproxy:lrange(rds, 0, EMAIL_LIMIT - 1)
  8 + local redret = redisproxy:pipelining(function (red)
  9 + for _, id in ipairs(ids) do
  10 + red:hgetall(string.format("email:%d:%s", roleId, id))
  11 + end
  12 + end)
  13 + for index, id in ipairs(ids) do
  14 + local email = require("models.Email").new({key = string.format("email:%d:%s", roleId, id)})
  15 + if email:load(tarr2tab(redret[index])) then
  16 + table.insert(emails, email)
  17 + end
  18 + end
  19 + return emails
  20 +end
  21 +
  22 +function _M.listRpc(agent, data)
  23 + local role = agent.role
  24 + local roleId = role:getProperty("id")
  25 + local now = skynet.timex()
  26 + local result = {}
  27 + local mid = role:getProperty("sid")
  28 +
  29 + local globalEmail = redisproxy:hget("autoincrement_set", "email")
  30 + globalEmail = tonum(globalEmail)
  31 + local emailSync = role:getProperty("emailSync")
  32 + if globalEmail > emailSync then
  33 + role:setProperty("emailSync", globalEmail)
  34 + emailSync = math.max(emailSync + 1, globalEmail - EMAIL_LIMIT + 1)
  35 + local result = redisproxy:pipelining(function (red)
  36 + for id = emailSync, globalEmail do
  37 + red:hgetall(string.format("globalEmail:%s", id))
  38 + end
  39 + end)
  40 + local count = 1
  41 + for _, data in ipairs(result) do
  42 + local email = tarr2tab(data)
  43 + if tonum(email.createtime) > role:getProperty("ctime")
  44 + and ( not email.mid or tonum(email.mid) == mid )
  45 + and ( not email.endtime or tonum(email.endtime) > now )then
  46 + local time = email.timestamp and tonum(email.timestamp) or email.createtime
  47 + redisproxy:insertEmail({
  48 + roleId = roleId,
  49 + emailId = 0,
  50 + createtime = time,
  51 + title = email.title,
  52 + content = email.content,
  53 + attachments = email.attachments
  54 + })
  55 + --role:log("mail_actions", {desc = "get_global", s1 = email.title, s2 = email.attachments})
  56 + end
  57 + end
  58 + end
  59 +
  60 + local emails = loadEmails(roleId)
  61 + for _, email in ipairs(emails) do
  62 + table.insert(result, email:data())
  63 + end
  64 +
  65 + SendPacket(actionCodes.Email_listRpc, MsgPack.pack(result))
  66 + return true
  67 +end
  68 +
  69 +local function getEmailAttachments( email )
  70 + if email:getProperty("status") == 2 then
  71 + return ""
  72 + end
  73 + local attachments = email:getProperty("attachments")
  74 + if attachments:len() == 0 then
  75 + local rewardPms = email:getProperty("rewardPms")
  76 + local emailData = csvdb["emailCsv"][email:getProperty("emailId")]
  77 + if emailData then
  78 + attachments = emailData.attachment:format(table.unpack(rewardPms))
  79 + end
  80 + end
  81 + return attachments
  82 +end
  83 +
  84 +function _M.drawAllAttachRpc(agent, data)
  85 + local role = agent.role
  86 + local roleId = role:getProperty("id")
  87 +
  88 + local reward = {}
  89 + local ids = {}
  90 +
  91 + local emails = loadEmails(roleId)
  92 + redisproxy:pipelining(function (red)
  93 + for _, email in ipairs(emails) do
  94 + local attachments = getEmailAttachments(email)
  95 + if attachments ~= "" then
  96 + local emailId = email:getProperty("id")
  97 + local items = role:award(attachments)
  98 + ids[emailId] = 1
  99 + red:hset(string.format(R_EMAIL_ITEM, roleId, emailId), "status", 2)
  100 + -- role:log("mail_actions", {desc = "draw_attach", int1 = emailId, s1 = email:getProperty("title"), s2 = attachments})
  101 +
  102 + for key, v in pairs(items) do
  103 + reward[key] = (reward[key] or 0) + v
  104 + end
  105 + end
  106 + end
  107 + end)
  108 +
  109 + SendPacket(actionCodes.Email_drawAllAttachRpc, MsgPack.pack({ids = ids, reward = reward}))
  110 + return true
  111 +end
  112 +
  113 +function _M.drawAttachRpc(agent, data)
  114 + local role = agent.role
  115 + local roleId = role:getProperty("id")
  116 + local msg = MsgPack.unpack(data)
  117 + local id = msg.id
  118 +
  119 + local rds = string.format(R_EMAIL_ITEM, roleId, id)
  120 +
  121 + local email = require("models.Email").new({key = rds})
  122 + if not email:load() then return end
  123 +
  124 + local attachments = getEmailAttachments(email)
  125 + if attachments == "" then return end
  126 +
  127 + local reward = role:award(attachments)
  128 + redisproxy:hset(rds, "status", 2) -- 领取标记
  129 + SendPacket(actionCodes.Email_drawAttachRpc, MsgPack.pack({reward = reward}))
  130 +
  131 + -- role:log("mail_actions", {desc = "draw_attach", int1 = id, s1 = email:getProperty("title"), s2 = attachments, ucode = ucode})
  132 + return true
  133 +end
  134 +
  135 +function _M.checkRpc(agent, data)
  136 + local role = agent.role
  137 + local roleId = role:getProperty("id")
  138 +
  139 + local msg = MsgPack.unpack(data)
  140 + local id = msg.id
  141 +
  142 + local rds = string.format(R_EMAIL_ITEM, roleId, id)
  143 + if not redisproxy:exists(rds) then return end
  144 +
  145 + redisproxy:hset(rds, "status", 1)
  146 + -- role:log("mail_actions", {desc = "check_mail", int1 = id})
  147 +
  148 + SendPacket(actionCodes.Email_checkRpc, '')
  149 + return true
  150 +end
  151 +
  152 +function _M.delRpc(agent, data)
  153 + local role = agent.role
  154 + local roleId = role:getProperty("id")
  155 +
  156 + local rds = string.format(R_EMAIL, roleId)
  157 + local ids = redisproxy:lrange(rds, 0, EMAIL_LIMIT - 1)
  158 + local now = skynet.timex()
  159 + local result = {}
  160 + local emailSet = csvdb["emailCsv"]
  161 +
  162 + redisproxy:pipelining(function (red)
  163 + for _, id in ipairs(ids) do
  164 + local emailRds = string.format("email:%d:%s", roleId, id)
  165 + local email = require("models.Email").new({key = emailRds})
  166 + if email:load() then
  167 + local status = email:getProperty("status")
  168 + local attachments = email:getProperty("attachments")
  169 + local emailData = emailSet[email:getProperty("emailId")]
  170 + if emailData and attachments:len() == 0 then
  171 + attachments = emailData.attachment
  172 + end
  173 + if status == 2 or (status == 1 and attachments:len() == 0) then
  174 + red:lrem(rds, 0, id)
  175 + red:del(emailRds)
  176 + result[tonum(id)] = 1
  177 + end
  178 + end
  179 + end
  180 + end)
  181 + -- for delId, _ in ipairs(result) do
  182 + -- role:log("mail_actions", {desc = "del_mail", int1 = delId})
  183 + -- end
  184 + SendPacket(actionCodes.Email_delRpc, MsgPack.pack({result = result}))
  185 + return true
  186 +end
  187 +
  188 +return _M
0 \ No newline at end of file 189 \ No newline at end of file
src/actions/RoleAction.lua
@@ -277,7 +277,7 @@ function _M.createRpc(agent, data) @@ -277,7 +277,7 @@ function _M.createRpc(agent, data)
277 key = string_format("role:%d", roleId), 277 key = string_format("role:%d", roleId),
278 id = roleId, 278 id = roleId,
279 uid = tostring(msg.uid), 279 uid = tostring(msg.uid),
280 - subId = msg.subId or 0, 280 + sid = msg.subId or 0,
281 name = roleName, 281 name = roleName,
282 uname = msg.uname or "", 282 uname = msg.uname or "",
283 device = tostring(msg.device) 283 device = tostring(msg.device)
@@ -294,16 +294,85 @@ function _M.createRpc(agent, data) @@ -294,16 +294,85 @@ function _M.createRpc(agent, data)
294 return true 294 return true
295 end 295 end
296 296
  297 + newRole:award(globalCsv.birthItem)
297 -- 欢迎邮件 298 -- 欢迎邮件
298 -- redisproxy:insertEmail({roleId = roleId, emailId = 1}) 299 -- redisproxy:insertEmail({roleId = roleId, emailId = 1})
299 -- redisproxy:insertEmail({roleId = roleId, emailId = 2}) 300 -- redisproxy:insertEmail({roleId = roleId, emailId = 2})
300 301
301 - newRole:log("create", { ip = agent.ip, ucode = ucode}) 302 + newRole:log("create", { ip = agent.ip})
302 303
303 SendPacket(actionCodes.Role_createRpc, MsgPack.pack(response)) 304 SendPacket(actionCodes.Role_createRpc, MsgPack.pack(response))
304 return true 305 return true
305 end 306 end
306 307
  308 +function _M.changeNameRpc(agent, data)
  309 + local role = agent.role
  310 + local roleId = role:getProperty("id")
  311 + local msg = MsgPack.unpack(data)
  312 +
  313 + local newName = msg.name
  314 + local oldName = role:getProperty("name")
  315 +
  316 + if not newName or type(newName) ~= "string" then return end
  317 + if newName == oldName then return end
  318 + -- 检查name是否合法
  319 + local checked = validName(newName)
  320 + if checked ~= "ok" then
  321 + --[[
  322 + "existed" 已经存在
  323 + "illegal" 包含非法字符
  324 + ]]
  325 + local errCodes = {
  326 + ["existed"] = 1,
  327 + ["illegal"] = 2
  328 + }
  329 + SendPacket(actionCodes.Role_changeNameRpc, MsgPack.pack({result = errCodes[checked]}))
  330 + return true
  331 + end
  332 +
  333 + if not roleId then
  334 + SendPacket(actionCodes.Role_changeNameRpc, MsgPack.pack({result = 3}))
  335 + return true
  336 + end
  337 +
  338 + local result = redisproxy:setnx(string_format("user:%s", newName), roleId)
  339 + if result == 0 then
  340 + SendPacket(actionCodes.Role_changeNameRpc, MsgPack.pack({result = 1}))
  341 + return true
  342 + end
  343 + redisproxy:pipelining(function (red)
  344 + red:del(string_format("user:%s", oldName))
  345 + red:set(string_format("uid:%s", role:getProperty("uid")), newName)
  346 + end)
  347 +
  348 + role:updateProperties({
  349 + ["name"] = newName,
  350 + })
  351 + SendPacket(actionCodes.Role_changeNameRpc, MsgPack.pack({result = 0}))
  352 + return true
  353 +end
  354 +
  355 +function _M.changeIntroRpc(agent, data)
  356 + local role = agent.role
  357 + local roleId = role:getProperty("id")
  358 + local msg = MsgPack.unpack(data)
  359 + local content = msg.content
  360 + if not content or type(content) ~= "string" then return end
  361 +
  362 + local SERV = string_format("CHATED%d", math.random(1, 5))
  363 + local legal, mod = skynet.call(SERV, "lua", "check", content)
  364 + if not legal then
  365 + content = mod or ""
  366 + end
  367 +
  368 + if content == "" then
  369 + role:updateProperty({field = "intro", value = content})
  370 + end
  371 +
  372 + SendPacket(actionCodes.Role_changeIntroRpc, '')
  373 + return true
  374 +end
  375 +
307 function _M.syncTimeRpc(agent, data) 376 function _M.syncTimeRpc(agent, data)
308 SendPacket(actionCodes.Role_syncTimeRpc, MsgPack.pack({nowTime = skynet.timex()})) 377 SendPacket(actionCodes.Role_syncTimeRpc, MsgPack.pack({nowTime = skynet.timex()}))
309 return true 378 return true
@@ -703,4 +772,86 @@ function _M.chatGet(agent, data) @@ -703,4 +772,86 @@ function _M.chatGet(agent, data)
703 return true 772 return true
704 end 773 end
705 774
  775 +
  776 +function _M.changeSettingRpc(agent, data)
  777 + local role = agent.role
  778 + local msg = MsgPack.unpack(data)
  779 +
  780 + local id = msg.id
  781 + local status = msg.status
  782 +
  783 + local statusEnum = SettingStatus[id]
  784 + if not statusEnum then return 1 end
  785 +
  786 + if not statusEnum[status] then return 2 end
  787 +
  788 + local setting = role:getProperty("setting")
  789 + setting[id] = status
  790 + role:updateProperty({field = "setting", value = setting})
  791 +
  792 + SendPacket(actionCodes.Role_changeSettingRpc, '')
  793 + return true
  794 +end
  795 +
  796 +function _M.drawCodeRpc(agent, data)
  797 + local msg = MsgPack.unpack(data)
  798 + local codeurl = skynet.getenv("codeurl")
  799 + local role = agent.role
  800 + local msg = MsgPack.unpack(data)
  801 + local code = msg.code
  802 +
  803 + if type(code) ~= "string" then return end
  804 + if code:find("[^0-9a-zA-Z]") then return end
  805 +
  806 + local codestr = role:getProperty("codeStr")
  807 + local content = {
  808 + ["platformId"] = role:getProperty("sid"),
  809 + ["code"] = code,
  810 + ["itemIds"] = codestr,
  811 + ["key"] = "zhaolugame20170831",
  812 + }
  813 + local status, body = httpc.get(codeurl, "/libaoma?" .. httpGetFormatData(content), {})
  814 + if status == 200 then
  815 + local result = json.decode(body)
  816 + local ret = tonum(result.ret)
  817 + if ret == 0 then
  818 + local giftId = tonumber(result.giftId)
  819 + role:setProperty("codeStr", codestr:setv(giftId, 1))
  820 + local reward = role:award(result.gift)
  821 +
  822 + SendPacket(actionCodes.Role_drawCodeRpc, MsgPack.pack({
  823 + result = ret,
  824 + reward = reward,
  825 + }))
  826 + return true
  827 + end
  828 + -- 1 不存在的礼包码
  829 + -- 2 已经领取过相同类型物品
  830 + -- 3 领取数量达到上限
  831 + -- 4 过期了
  832 + SendPacket(actionCodes.Role_drawCodeRpc, MsgPack.pack({result = ret}))
  833 + return true
  834 + end
  835 + SendPacket(actionCodes.Role_drawCodeRpc, MsgPack.pack({result = -1}))
  836 + return true
  837 +end
  838 +
  839 +function _M.changeHeadRpc(agent, data)
  840 + local role = agent.role
  841 + local msg = MsgPack.unpack(data)
  842 +
  843 + local id = msg.id
  844 + local icon = csvdb["player_iconCsv"][id]
  845 + if not icon then
  846 + return
  847 + end
  848 + if role:getItemCount(id) < 1 then
  849 + return
  850 + end
  851 + role:updateProperty({field = "headId" ,value = id})
  852 + SendPacket(actionCodes.Role_changeHeadRpc, "")
  853 + return true
  854 +end
  855 +
  856 +
706 return _M 857 return _M
707 \ No newline at end of file 858 \ No newline at end of file
src/models/Email.lua 0 → 100644
@@ -0,0 +1,56 @@ @@ -0,0 +1,56 @@
  1 +local Email = class("Email", require("shared.ModelBase"))
  2 +
  3 +function Email:ctor(properties)
  4 + Email.super.ctor(self, properties)
  5 +end
  6 +
  7 +Email.schema = {
  8 + key = {"string"}, -- redis key
  9 + id = {"number", 0}, -- 数据库ID
  10 + emailId = {"number", 0}, -- 邮件csv ID
  11 + title = {"string", ""}, -- 邮件标题
  12 + content = {"string", ""}, -- 邮件正文
  13 + attachments = {"string", ""},
  14 + status = {"number", 0}, -- 邮件状态: 未读, 已读, 已领取
  15 + createtime = {"number", skynet.timex()},
  16 + contentPms = {"table", {}},
  17 + rewardPms = {"table", {}},
  18 +}
  19 +
  20 +function Email:data()
  21 + local emailId = self:getProperty("emailId")
  22 + local title = self:getProperty("title")
  23 + local content = self:getProperty("content")
  24 + local attachments = self:getProperty("attachments")
  25 + local contentPms = self:getProperty("contentPms")
  26 + local rewardPms = self:getProperty("rewardPms")
  27 +
  28 + local emailData = csvdb["emailCsv"][emailId]
  29 +
  30 + if emailData then
  31 + -- 如果内容是直接插入到数据库
  32 + if content == "" and emailData.body ~= "" then
  33 + content = io.readfile("src/" .. emailData.body)
  34 + content = content:format(table.unpack(contentPms))
  35 + end
  36 +
  37 + if title == "" and emailData.title ~= "" then
  38 + title = emailData.title
  39 + end
  40 +
  41 + if attachments == "" and emailData.attachment ~= "" then
  42 + attachments = emailData.attachment:format(table.unpack(rewardPms))
  43 + end
  44 + end
  45 +
  46 + return {
  47 + id = self:getProperty("id"),
  48 + status = self:getProperty("status"),
  49 + createtime = self:getProperty("createtime"),
  50 + title = title,
  51 + content = content,
  52 + attachments = attachments,
  53 + }
  54 +end
  55 +
  56 +return Email
0 \ No newline at end of file 57 \ No newline at end of file
src/models/Role.lua
@@ -27,6 +27,7 @@ Role.schema = { @@ -27,6 +27,7 @@ Role.schema = {
27 id = {"number"}, 27 id = {"number"},
28 uid = {"string", ""}, 28 uid = {"string", ""},
29 name = {"string", ""}, 29 name = {"string", ""},
  30 + intro = {"string", ""},
30 headId = {"number", 3201}, 31 headId = {"number", 3201},
31 sid = {"number", 0}, 32 sid = {"number", 0},
32 device = {"string", ""}, 33 device = {"string", ""},
@@ -38,6 +39,8 @@ Role.schema = { @@ -38,6 +39,8 @@ Role.schema = {
38 sversion = {"number", globalCsv.StructVersion or 0}, -- 重整数据版本 39 sversion = {"number", globalCsv.StructVersion or 0}, -- 重整数据版本
39 diamond = {"number", 0}, 40 diamond = {"number", 0},
40 reDiamond = {"number", 0}, 41 reDiamond = {"number", 0},
  42 + setting = {"table", {}}, --设置
  43 + codeStr = {"string", ""}, --已经领过的礼包码
41 -- roleInfo 44 -- roleInfo
42 level = {"number", 1}, 45 level = {"number", 1},
43 exp = {"number", 0}, 46 exp = {"number", 0},
@@ -111,6 +114,8 @@ Role.schema = { @@ -111,6 +114,8 @@ Role.schema = {
111 dinerS = {"table", {}}, -- 美食币商城 购买记录 {[id] = count} 114 dinerS = {"table", {}}, -- 美食币商城 购买记录 {[id] = count}
112 115
113 rmbC = {"number", 0}, -- 人民币重置额 116 rmbC = {"number", 0}, -- 人民币重置额
  117 +
  118 + emailSync = {"number", 0}, -- 已经同步到的邮件Id
114 } 119 }
115 120
116 121
@@ -212,7 +217,9 @@ function Role:data() @@ -212,7 +217,9 @@ function Role:data()
212 return { 217 return {
213 id = self:getProperty("id"), 218 id = self:getProperty("id"),
214 name = self:getProperty("name"), 219 name = self:getProperty("name"),
  220 + intro = self:getProperty("intro"),
215 headId = self:getProperty("headId"), 221 headId = self:getProperty("headId"),
  222 + setting = self:getProperty("setting"),
216 level = self:getProperty("level"), 223 level = self:getProperty("level"),
217 exp = self:getProperty("exp"), 224 exp = self:getProperty("exp"),
218 items = self:getProperty("items"):toNumMap(), 225 items = self:getProperty("items"):toNumMap(),
src/models/RolePlugin.lua
@@ -895,6 +895,90 @@ function RolePlugin.bind(Role) @@ -895,6 +895,90 @@ function RolePlugin.bind(Role)
895 pvpTBVC = self:getTeamBattleValue(team.heros), 895 pvpTBVC = self:getTeamBattleValue(team.heros),
896 }) 896 })
897 end 897 end
  898 +
  899 + -- update
  900 + function Role:onRecoverTimer(now)
  901 + self:checkNewEvent(now)
  902 + end
  903 +
  904 + local function breath(sec)
  905 + local last_breath = 0
  906 + return function (now)
  907 + if now >= last_breath then
  908 + last_breath = now + sec
  909 + return true
  910 + end
  911 + return false
  912 + end
  913 + end
  914 + local breathes = {
  915 + ["email"] = breath(120), -- email
  916 + }
  917 + function Role:checkNewEvent(now)
  918 + if now - self:getProperty("ltime") < 5 then
  919 + return
  920 + end
  921 +
  922 + local checks = {}
  923 + -- 检查全局邮件 -- 增加邮件红点
  924 + checks["email"] = function()
  925 + local mid = self:getProperty("sid")
  926 + local result = redisproxy:hmget("autoincrement_set", "email", "emailTimestamp")
  927 + local globalEmail = tonum(result[1])
  928 + local timestamp = tonum(result[2])
  929 + local emailSync = self:getProperty("emailSync")
  930 + if globalEmail > emailSync and timestamp > self:getProperty("ctime") then
  931 + local emailSync = math.max(emailSync + 1, globalEmail - EMAIL_LIMIT + 1)
  932 + local redret = redisproxy:pipelining(function (red)
  933 + for id = emailSync, globalEmail do
  934 + red:hgetall(string.format("globalEmail:%s", id))
  935 + end
  936 + end)
  937 + for _, data in ipairs(redret) do
  938 + local email = tarr2tab(data)
  939 + if tonum(email.createtime) > self:getProperty("ctime")
  940 + and ( not email.mid or tonum(email.mid) == mid )
  941 + and ( not email.endtime or tonum(email.endtime) > now )then
  942 + return true
  943 + end
  944 + end
  945 + end
  946 +
  947 + local roleId = self:getProperty("id")
  948 + local email_rds = string.format(R_EMAIL, roleId)
  949 +
  950 + local emailIds = redisproxy:lrange(email_rds, 0, EMAIL_LIMIT - 1) or {}
  951 + local redret = redisproxy:pipelining(function (red)
  952 + for _, id in ipairs(emailIds) do
  953 + red:hget(string.format(R_EMAIL_ITEM, roleId, id), "status")
  954 + end
  955 + end)
  956 + for index, id in ipairs(emailIds) do
  957 + if tonumber(redret[index]) == 0 then
  958 + return true
  959 + end
  960 + end
  961 + end
  962 +
  963 + local events = {}
  964 + for name, breath in pairs(breathes) do
  965 + if breath(now) and checks[name] then
  966 + local status = checks[name]()
  967 + if status then
  968 + if status == true then
  969 + events[name] = 1
  970 + else
  971 + events[name] = status
  972 + end
  973 + end
  974 + end
  975 + end
  976 +
  977 + if next(events) then
  978 + SendPacket(actionCodes.Role_notifyNewEvent, MsgPack.pack({events = events}))
  979 + end
  980 + end
  981 +
898 end 982 end
899 983
900 return RolePlugin 984 return RolePlugin
901 \ No newline at end of file 985 \ No newline at end of file
src/rdsscripts/RedisScripts.lua
1 local _M = {} 1 local _M = {}
2 2
3 -_M["rankDetails"] = {  
4 - file = "src/rdsscripts/rankDetails.lua",  
5 - sha1 = nil,  
6 -}  
7 _M["insertEmail"] = { 3 _M["insertEmail"] = {
8 file = "src/rdsscripts/insertEmail.lua", 4 file = "src/rdsscripts/insertEmail.lua",
9 sha1 = nil, 5 sha1 = nil,
10 } 6 }
11 -_M["refreshAssist"] = {  
12 - file = "src/rdsscripts/refreshAssist.lua",  
13 - sha1 = nil,  
14 -}  
15 -_M["assistInfo"] = {  
16 - file = "src/rdsscripts/assistInfo.lua",  
17 - sha1 = nil,  
18 -}  
19 7
20 return _M 8 return _M
21 \ No newline at end of file 9 \ No newline at end of file
src/rdsscripts/assistInfo.lua deleted
@@ -1,55 +0,0 @@ @@ -1,55 +0,0 @@
1 -local roleId = tonumber(KEYS[1])  
2 -  
3 -local formationJson = redis.call("hget", string.format("role:%d", roleId), "pveFormationJson")  
4 -  
5 -local formation = cjson.decode(formationJson)  
6 -  
7 -local function formatAttrEx(str)  
8 - local tb = {}  
9 - for k, v in str:gmatch("([%d.]+)=([%d.]+)") do  
10 - tb[#tb+1] = {tonumber(k), tonumber(v)}  
11 - end  
12 - return tb  
13 -end  
14 -  
15 -local function formatEquips(str)  
16 - local tb = {}  
17 - for k, v in str:gmatch("([%d.]+)=([%d.]+)") do  
18 - tb[tonumber(k)] = tonumber(v)  
19 - end  
20 - return tb  
21 -end  
22 -  
23 -local heroFields = {"type", "level", "star", "evolveCount", "wake", "breakLevel", "equips"}  
24 -local equipFields = {"type", "level", "evolCount", "attrEx"}  
25 -for _, hero in ipairs(formation.heros) do  
26 - if hero.leader then  
27 - local heroInfo = redis.call("hmget", string.format("hero:%d:%d", roleId, hero.id), unpack(heroFields))  
28 - local equipstr = heroInfo[7]  
29 - local equips = {}  
30 - for part, equipId in equipstr:gmatch("(%d+)=(%d+)") do  
31 - part, equipId = tonumber(part), tonumber(equipId)  
32 - if equipId ~= 0 then  
33 - local equipInfo = redis.call("hmget", string.format("equip:%d:%d", roleId, equipId), unpack(equipFields))  
34 - equips[equipId] = {}  
35 - for index, value in ipairs(equipInfo) do  
36 - equips[equipId][equipFields[index]] = index ~= 4 and tonumber(value) or formatAttrEx(equipInfo[4] or "")  
37 - end  
38 - end  
39 - end  
40 - return cmsgpack.pack {  
41 - type = tonumber(heroInfo[1]),  
42 - level = tonumber(heroInfo[2]),  
43 - star = tonumber(heroInfo[3]),  
44 - evolveCount = tonumber(heroInfo[4]),  
45 - wake = tonumber(heroInfo[5]),  
46 - breakLevel = tonumber(heroInfo[6]),  
47 - equips = formatEquips(heroInfo[7]),  
48 - equipDtls = equips,  
49 - }  
50 - end  
51 -end  
52 -  
53 -return cmsgpack.pack {}  
54 -  
55 -  
src/rdsscripts/insertEmail.lua
1 -local con1 = KEYS[4] or ""  
2 -local con2 = KEYS[5] or ""  
3 -local con3 = KEYS[6] or ""  
4 -local att1 = KEYS[7] or ""  
5 -local att2 = KEYS[8] or ""  
6 -local att3 = KEYS[9] or ""  
7 -local title = KEYS[10] or ""  
8 -local content = KEYS[11] or ""  
9 -local attachments = KEYS[12] or "" 1 +local EMAIL_LIMIT = KEYS[1]
  2 +local roleId = KEYS[2]
  3 +local emailId = KEYS[3] or 0
  4 +local createTime = KEYS[4]
  5 +local con = KEYS[5] or cmsgpack.pack({})
  6 +local att = KEYS[6] or cmsgpack.pack({})
  7 +local title = KEYS[7] or ""
  8 +local content = KEYS[8] or ""
  9 +local attachments = KEYS[9] or ""
10 10
11 --- local roleInfo = redis.call("HGET", string.format("role:%d", KEYS[1]), "delete") 11 +
  12 +-- local roleInfo = redis.call("HGET", string.format("role:%d", roleId), "delete")
12 13
13 -- if tonumber(roleInfo) == 1 then return end 14 -- if tonumber(roleInfo) == 1 then return end
14 15
15 -local id = redis.call("HINCRBY", string.format("role:%d:autoincr", KEYS[1]), "email", 1)  
16 -redis.call("LPUSH", string.format("role:%d:emailIds", KEYS[1]), id)  
17 -local deleteIds = redis.call("LRANGE", string.format("role:%d:emailIds", KEYS[1]), 50, -1) 16 +local id = redis.call("HINCRBY", string.format("role:%d:autoincr", roleId), "email", 1)
  17 +redis.call("LPUSH", string.format("role:%d:emailIds", roleId), id)
  18 +local deleteIds = redis.call("LRANGE", string.format("role:%d:emailIds", roleId), EMAIL_LIMIT, -1)
18 for _, deleteId in ipairs(deleteIds) do 19 for _, deleteId in ipairs(deleteIds) do
19 - redis.call("DEL", string.format("email:%d:%d", KEYS[1], deleteId)) 20 + redis.call("DEL", string.format("email:%d:%d", roleId, deleteId))
20 end 21 end
21 22
22 -redis.call("LTRIM", string.format("role:%d:emailIds", KEYS[1]), 0, 49)  
23 -redis.call("HMSET", string.format("email:%d:%d", KEYS[1], id), "id", tostring(id), "emailId", KEYS[2],  
24 - "status", "0", "createtime", KEYS[3],  
25 - "con1", con1, "con2", con2, "con3", con3,  
26 - "att1", att1, "att2", att2, "att3", att3,  
27 - "title", title, "content", content, "attachments", attachments) 23 +redis.call("LTRIM", string.format("role:%d:emailIds", roleId), 0, EMAIL_LIMIT - 1)
  24 +redis.call("HMSET", string.format("email:%d:%d", roleId, id),
  25 + "id", tostring(id),
  26 + "emailId", emailId,
  27 + "status", "0",
  28 + "createtime", createTime,
  29 + "contentPms", con,
  30 + "rewardPms", att,
  31 + "title", title,
  32 + "content", content,
  33 + "attachments", attachments
  34 +)
src/rdsscripts/rankDetails.lua deleted
@@ -1,30 +0,0 @@ @@ -1,30 +0,0 @@
1 -local field = KEYS[1]  
2 -local roleId = tonumber(KEYS[2])  
3 -  
4 -local formationJson = redis.call("hget", string.format("role:%d", roleId), field .. "FormationJson")  
5 -  
6 -local formation = cjson.decode(formationJson)  
7 -  
8 -local response = {formation = {}, heros = {}}  
9 -  
10 -if formation.heros then  
11 - for _, hero in ipairs(formation.heros) do  
12 - table.insert(response.formation, hero.id)  
13 - end  
14 -end  
15 -  
16 -local heroIds = redis.call("smembers", string.format("role:%d:heroIds", roleId))  
17 -  
18 -local heroFields = {"type", "level", "star", "evolveCount", "wake", "breakLevel"}  
19 -for _, heroId in ipairs(heroIds) do  
20 - local heroId = tonumber(heroId)  
21 - local heroInfo = redis.call("hmget", string.format("hero:%d:%d", roleId, heroId), unpack(heroFields))  
22 -  
23 - local tb = {}  
24 - for k, v in ipairs(heroInfo) do  
25 - tb[heroFields[k]] = tonumber(v)  
26 - end  
27 - response.heros[heroId] = tb  
28 -end  
29 -  
30 -return cmsgpack.pack(response)  
31 \ No newline at end of file 0 \ No newline at end of file
src/rdsscripts/refreshAssist.lua deleted
@@ -1,58 +0,0 @@ @@ -1,58 +0,0 @@
1 -local roleId = tonumber(KEYS[1])  
2 -  
3 -local friendKey = "role:%d:friend"  
4 -local assistKey = "role:%d:assist"  
5 -  
6 -local function formatTable(tbl)  
7 - local t = {}  
8 - for _, id in ipairs(tbl) do  
9 - t[tonumber(id)] = 1  
10 - end  
11 - return t  
12 -end  
13 -  
14 -local friendIds = redis.call("smembers", friendKey:format(roleId))  
15 -local assistIds = formatTable(redis.call("smembers", assistKey:format(roleId)))  
16 -  
17 -local heroFields = {"type", "level", "star", "evolveCount", "wake", "breakLevel", "battleValue", "dress"}  
18 -local function getLeader(id, formation)  
19 - for _, hero in ipairs(formation.heros) do  
20 - if hero.leader then  
21 - local heroInfo = redis.call("hmget", string.format("hero:%d:%d", id, hero.id), unpack(heroFields))  
22 - return {  
23 - type = tonumber(heroInfo[1]),  
24 - level = tonumber(heroInfo[2]),  
25 - star = tonumber(heroInfo[3]),  
26 - evolveCount = tonumber(heroInfo[4]),  
27 - wake = tonumber(heroInfo[5]),  
28 - breakLevel = tonumber(heroInfo[6]),  
29 - battleValue = tonumber(heroInfo[7]),  
30 - dress = tonumber(heroInfo[8]),  
31 - }  
32 - end  
33 - end  
34 -end  
35 -  
36 -local response = {}  
37 -for _, id in ipairs(friendIds) do  
38 - id = tonumber(id)  
39 - local dtls = redis.call("hmget", string.format("role:%d", id),  
40 - "name", "level", "vip", "pveFormationJson")  
41 - local formation = cjson.decode(dtls[4])  
42 - local leader = getLeader(id, formation)  
43 - if leader then  
44 - table.insert(response, {  
45 - roleId = id,  
46 - name = dtls[1],  
47 - level = tonumber(dtls[2]),  
48 - vip = tonumber(dtls[3]),  
49 - leader = leader,  
50 - used = assistIds[id] or 0,  
51 - })  
52 - end  
53 -end  
54 -  
55 -return cmsgpack.pack(response)  
56 -  
57 -  
58 -  
src/services/agent_util.lua
@@ -84,7 +84,7 @@ function _M:update(agent) @@ -84,7 +84,7 @@ function _M:update(agent)
84 nextCheckTime = now + HEART_TIMER_INTERVAL 84 nextCheckTime = now + HEART_TIMER_INTERVAL
85 end 85 end
86 pcall(check_daily_reset, agent, now) 86 pcall(check_daily_reset, agent, now)
87 - -- pcall(role.onRecoverTimer, role, now) 87 + pcall(role.onRecoverTimer, role, now)
88 end 88 end
89 89
90 function _M:heart_beat(agent) 90 function _M:heart_beat(agent)
src/services/redisd.lua
@@ -13,17 +13,6 @@ function command.open(conf) @@ -13,17 +13,6 @@ function command.open(conf)
13 db = conf.redisdb or 0, 13 db = conf.redisdb or 0,
14 auth = conf.auth, 14 auth = conf.auth,
15 }) 15 })
16 -  
17 - --[[  
18 - local csvdata = require("csvdata.world_boss_battle")  
19 - for i=1, #csvdata do  
20 - for j=1, #csvdata[i] do  
21 - db:del(string.format("boss:%d:%d", i, j))  
22 - end  
23 - end  
24 - --]]  
25 - db:del("rtpvp")  
26 -  
27 end 16 end
28 17
29 skynet.start(function() 18 skynet.start(function()
src/shared/redisproxy.lua
@@ -51,21 +51,15 @@ function redisproxy:insertEmail(params) @@ -51,21 +51,15 @@ function redisproxy:insertEmail(params)
51 roleId = params.roleId, 51 roleId = params.roleId,
52 emailId = params.emailId, 52 emailId = params.emailId,
53 createtime = params.createtime or skynet.timex(), 53 createtime = params.createtime or skynet.timex(),
54 - con1 = params.con1 or "",  
55 - con2 = params.con2 or "",  
56 - con3 = params.con3 or "",  
57 - att1 = params.att1 or "",  
58 - att2 = params.att2 or "",  
59 - att3 = params.att3 or "", 54 + con = params.con or {},
  55 + att = params.att or {},
60 title = params.title or "", 56 title = params.title or "",
61 content = params.content or "", 57 content = params.content or "",
62 attachments = params.attachments or "", 58 attachments = params.attachments or "",
63 } 59 }
64 - self:runScripts("insertEmail", 12, 60 + self:runScripts("insertEmail", 9, EMAIL_LIMIT,
65 pms.roleId, pms.emailId, pms.createtime, 61 pms.roleId, pms.emailId, pms.createtime,
66 - pms.con1, pms.con2, pms.con3,  
67 - pms.att1, pms.att2, pms.att3,  
68 - pms.title, pms.content, pms.attachments) 62 + MsgPack.pack(pms.con), MsgPack.pack(pms.att), pms.title, pms.content, pms.attachments)
69 return true 63 return true
70 end 64 end
71 65