EmailAction.lua 5.93 KB
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