local _M = {} local tarr2tab = table.array2Table local function loadEmails(roleId) local emails = {} local rds = string.format(R_EMAIL, roleId) local ids = redisproxy:lrange(rds, 0, EMAIL_LIMIT - 1) local redret = redisproxy:pipelining(function (red) for _, id in ipairs(ids) do red:hgetall(string.format("email:%d:%s", roleId, id)) end end) for index, id in ipairs(ids) do local email = require("models.Email").new({key = string.format("email:%d:%s", roleId, id)}) if email:load(tarr2tab(redret[index])) then table.insert(emails, email) end end return emails end function _M.listRpc(agent, data) local role = agent.role local roleId = role:getProperty("id") local now = skynet.timex() local result = {} local mid = role:getProperty("sid") local globalEmail = redisproxy:hget("autoincrement_set", "email") globalEmail = tonum(globalEmail) local emailSync = role:getProperty("emailSync") if globalEmail > emailSync then role:setProperty("emailSync", globalEmail) emailSync = math.max(emailSync + 1, globalEmail - EMAIL_LIMIT + 1) local result = redisproxy:pipelining(function (red) for id = emailSync, globalEmail do red:hgetall(string.format("globalEmail:%s", id)) end end) local count = 1 for _, data in ipairs(result) do local email = tarr2tab(data) -- 0 需要判斷創角時間小於郵件創建時間 1 只需要在時間段內登陸即可領取 local delayType = tonum(email.delayType) local flag = false if delayType == 1 then flag = skynet.timex() > tonum(email.createtime) else flag = tonum(email.createtime) > role:getProperty("ctime") end if flag and ( not email.mid or tonum(email.mid) == mid ) and ( not email.endtime or tonum(email.endtime) > now )then local time = math.max(tonum(email.timestamp, 0) , tonum(email.createtime)) redisproxy:insertEmail({ roleId = roleId, emailId = 0, createtime = time, title = email.title, stitle = email.stitle, content = email.content, attachments = email.attachments }) role:mylog("mail_action", {desc = "get_global", key1 = email.title, key2 = email.attachments}) end end end local emails = loadEmails(roleId) for _, email in ipairs(emails) do table.insert(result, email:data()) end SendPacket(actionCodes.Email_listRpc, MsgPack.pack({list = result})) return true end local function getEmailAttachments( email ) if email:getProperty("status") == 2 then return "" end local attachments = email:getProperty("attachments") if attachments:len() == 0 then local rewardPms = email:getProperty("rewardPms") local emailData = csvdb["emailCsv"][email:getProperty("emailId")] if emailData then attachments = emailData.attachment:format(table.unpack(rewardPms)) end end return attachments end function _M.drawAllAttachRpc(agent, data) local role = agent.role local roleId = role:getProperty("id") local reward, change = {} local ids = {} local emails = loadEmails(roleId) for _, email in ipairs(emails) do local attachments = getEmailAttachments(email) if attachments ~= "" then email:setProperty("status", 2) email:log(role, 2) ids[email:getProperty("id")] = 1 for key, v in pairs(attachments:toNumMap()) do reward[key] = (reward[key] or 0) + v end role:mylog("mail_action", {desc = "draw_attach", int1 = email:getProperty("emailId"), key1 = email:getProperty("title"), key2 = attachments}) end end reward, change = role:award(reward, {log = {desc = "draw_attach"}}) SendPacket(actionCodes.Email_drawAllAttachRpc, MsgPack.pack({ids = ids, reward = reward, change = change})) return true end function _M.drawAttachRpc(agent, data) local role = agent.role local roleId = role:getProperty("id") local msg = MsgPack.unpack(data) local id = msg.id local rds = string.format(R_EMAIL_ITEM, roleId, id) local email = require("models.Email").new({key = rds}) if not email:load() then return end local attachments = getEmailAttachments(email) if attachments == "" then return end local reward, change = role:award(attachments, {log = {desc = "draw_attach", int1 = id}}) email:setProperty("status", 2) email:log(role, 2) SendPacket(actionCodes.Email_drawAttachRpc, MsgPack.pack({reward = reward, change = change})) role:mylog("mail_action", {desc = "draw_attach", int1 = id, key1 = email:getProperty("title"), key2 = attachments}) return true end function _M.checkRpc(agent, data) local role = agent.role local roleId = role:getProperty("id") local msg = MsgPack.unpack(data) local id = msg.id local emailRds = string.format("email:%d:%s", roleId, id) local email = require("models.Email").new({key = emailRds}) if not email:load() then return end email:setProperty("status", 1) email:log(role, 1) role:mylog("mail_action", {desc = "check_mail", int1 = id}) SendPacket(actionCodes.Email_checkRpc, '') return true end function _M.delRpc(agent, data) local role = agent.role local roleId = role:getProperty("id") local rds = string.format(R_EMAIL, roleId) local ids = redisproxy:lrange(rds, 0, EMAIL_LIMIT - 1) local now = skynet.timex() local result = {} local emailSet = csvdb["emailCsv"] redisproxy:pipelining(function (red) for _, id in ipairs(ids) do local emailRds = string.format("email:%d:%s", roleId, id) local email = require("models.Email").new({key = emailRds}) if email:load() then local status = email:getProperty("status") local attachments = email:getProperty("attachments") local emailData = emailSet[email:getProperty("emailId")] if emailData and attachments:len() == 0 then attachments = emailData.attachment end if status == 2 or (status == 1 and attachments:len() == 0) then email:log(role, 3) red:lrem(rds, 0, id) red:del(emailRds) result[tonum(id)] = 1 end end end end) for delId, _ in ipairs(result) do role:mylog("mail_action", {desc = "del_mail", int1 = delId}) end SendPacket(actionCodes.Email_delRpc, MsgPack.pack({result = result})) return true end return _M