HomeServer/lualib-src/Server-main/AllServer/MultiServer/RedeemManage.lua
2024-11-20 15:41:37 +08:00

229 lines
8.6 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

local skynet = require "skynet"
local oo = require "Class"
local log = require "Log"
local redisKeyUrl = require "RedisKeyUrl"
local sqlUrl = require "SqlUrl"
local json =require "json"
local errorInfo = require "ErrorInfo"
local dataType = require "DataType"
local RedeemManage = oo.class()
RedeemManage.Type_Test = 1 --春节兑换码
RedeemManage.Status_NoBonus = 1 --未发货
RedeemManage.Status_StartBonus = 2 --开始发货
RedeemManage.Status_AlreadyBonus = 3 --已发货
RedeemManage.Status_OutDate = 4 --兑换码过期
RedeemManage.OpType_Add = 1 --新建
RedeemManage.OpType_Modify = 2 --修改
RedeemManage.OpType_Delete = 3 --删除
function RedeemManage:Init()
self.redeemList = {} --兑换码列表
self:LoadDB()
end
function RedeemManage:OnNewDay() --跨天
end
--每5秒调一次
function RedeemManage:On5SecTimer()
self:Refresh()
end
--从DB中载入数据
function RedeemManage:LoadDB()
--加载兑换码列表
local sql = string.format(sqlUrl.selectInfoFromRedeemList , self.Status_StartBonus )
local queryData = skynet.server.db:Query( "game" , sql )
for k, v in pairs(queryData) do
self:NewRedeemListRecord( v.Code , v.Status , v.BonusPlayerCount , json:decode(v.Data))
log.info(string.format("加载兑换码信息 兑换码Code %s " , v.Code ))
end
end
--保存数据到DB
function RedeemManage:SaveDB()
local sql = nil
local queryData = nil
--保存兑换码列表
for k, v in pairs(self.redeemList) do
sql = string.format(sqlUrl.updateDataToRedeemList , json:encode(v.data) , v.redeemCode )
queryData = skynet.server.db:Query( "game" , sql )
if 1 ~= queryData.affected_rows then
log.info("修改兑换码数据失败不存在该Code" , v.redeemCode )
else
log.info("成功保存兑换码列表" , v.redeemCode )
end
end
end
--查询兑换码
function RedeemManage:QueryRedeemList( c2sData , s2cData )
end
--新增兑换码
function RedeemManage:Add( c2sData , s2cData )
--获取兑换码ID
local redeemCode = skynet.server.common:RandRedeemCode()
local sql = string.format(sqlUrl.insertInfoToRedeemList , redeemCode , self.Status_NoBonus , json:encode(c2sData.data))
local queryData = skynet.server.db:Query( "game" , sql )
if 1 ~= queryData.affected_rows then
log.info("新增兑换码列表失败" , redeemCode )
s2cData.code = errorInfo.ErrorCode.NewRedeemFailed
return false
end
self:NewRedeemListRecord( redeemCode , self.Status_NoBonus , 0 , c2sData.data )
s2cData.redeemCode = redeemCode
log.info(string.format("新增兑换码信息 兑换码Code %s " , redeemCode ))
return true
end
--修改兑换码
function RedeemManage:Modify( c2sData , s2cData )
local redeemCode = c2sData.redeemCode
local data = json:encode(c2sData.data)
local sql = string.format(sqlUrl.updateDataToRedeemList , data , redeemCode )
local queryData = skynet.server.db:Query( "game" , sql )
if 1 ~= queryData.affected_rows then
log.info("修改兑换码数据失败不存在该Code" , redeemCode )
s2cData.code = errorInfo.ErrorCode.NoRedeemID
return false
end
self.redeemList[ redeemCode ].data = json:decode(data)
s2cData.redeemCode = redeemCode
log.info(string.format("成功修改兑换码信息 Code %s" , redeemCode ))
end
--删除兑换码
function RedeemManage:Delete( c2sData , s2cData )
local redeemCode = c2sData.redeemCode
local sql = string.format(sqlUrl.deleteInfoFromMailList , redeemCode )
local queryData = skynet.server.db:Query( "game" , sql )
if 1 ~= queryData.affected_rows then
log.info("删除兑换码数据失败不存在该Code" , redeemCode )
s2cData.code = errorInfo.ErrorCode.NoRedeemID
return false
end
if self.redeemList[ redeemCode ] then
self.redeemList[ redeemCode ].data = nil
self.redeemList[ redeemCode ] = nil
end
s2cData.redeemCode = redeemCode
log.info(string.format("成功删除兑换码信息 Code %s" , redeemCode ))
end
--刷新
function RedeemManage:Refresh()
local sql = nil
local c2sData = {}
local startTime,endTime = nil ,nil
for k, v in pairs(self.redeemList) do
--将2023-01-01 00:00:00 转化为时间戳
startTime = skynet.server.common:GetTime( v.data.startTime )
endTime = skynet.server.common:GetTime( v.data.endTime )
if self.Status_NoBonus == v.status and skynet.GetTime() >= startTime and skynet.GetTime() <= endTime then --兑换码列表中有兑换码可以生效,并将列表中的数据推向各游戏服
self:UpdateStatus( v.redeemCode , self.Status_StartBonus , 0 )
elseif self.Status_AlreadyBonus == v.status then --兑换码列表中有兑换码已经过期,并通知所有游戏服删除该兑换码
elseif skynet.GetTime() >= endTime then --兑换码列表中有兑换码已经发放完,并通知所有游戏服删除该兑换码
self:UpdateStatus( v.redeemCode , self.Status_OutDate , v.bonusPlayerCount )
end
end
--对于已经发放结束和过期的兑换码删除
for k, v in pairs(self.redeemList) do
if self.Status_AlreadyBonus == v.status or self.Status_OutDate == v.status then
self.redeemList[ k ].data= nil
self.redeemList[ k ]= nil
end
end
end
--新增邮件记录
function RedeemManage:NewRedeemListRecord( redeemCode , status , bonusPlayerCount, record )
if not self.redeemList[ redeemCode ] then
self.redeemList[ redeemCode ] = {}
end
self.redeemList[ redeemCode ].redeemCode = redeemCode
self.redeemList[ redeemCode ].status = status
self.redeemList[ redeemCode ].bonusPlayerCount = bonusPlayerCount
self.redeemList[ redeemCode ].data = record
end
--获得奖励
function RedeemManage:GetBonus( c2sData , s2cData )
local redeemCode = c2sData.redeemCode
local userId = c2sData.userId
local appVersion = c2sData.appVersion
local channel = c2sData.channel
--参数检查
if not redeemCode or not userId or not appVersion or not channel then
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
return
end
if not self.redeemList[ redeemCode ] then
s2cData.code = errorInfo.ErrorCode.NoRedeemID
end
local redeemData = self.redeemList[ redeemCode ]
if self.Status_StartBonus == redeemData.status then
--玩家的APP版本是否符合
--[[if appVersion < redeemData.data.appVersion then
s2cData.code = errorInfo.ErrorCode.VersionTooLow
return
end]]
--玩家的渠道是否符合
if channel ~= redeemData.data.channel and "all" ~= redeemData.data.channel then
s2cData.code = errorInfo.ErrorCode.ErrorChannel
return
end
if redeemData.bonusPlayerCount <= redeemData.data.redeemCount then
--只有发奖状态并且小于领取人数才能去领取
self.redeemList[ redeemCode ].bonusPlayerCount = self.redeemList[ redeemCode ].bonusPlayerCount + 1
s2cData.redeemCode = redeemCode
s2cData.bonus = redeemData.data.bonus
local lastPlayerCount = self.redeemList[ redeemCode ].bonusPlayerCount
if lastPlayerCount == redeemData.data.redeemCount then
self:UpdateStatus(redeemCode , self.Status_AlreadyBonus , lastPlayerCount)
end
else
s2cData.code = errorInfo.ErrorCode.EnoughPlayer
end
else
s2cData.code = errorInfo.ErrorCode.NoStartBonus
end
end
--更新状态
function RedeemManage:UpdateStatus( redeemCode , status , bonusPlayerCount )
--更新状态到DB
local sql = string.format(sqlUrl.updateStatusToRedeemList , status , bonusPlayerCount , redeemCode )
local queryData = skynet.server.db:Query( "game" , sql )
if 1 ~= queryData.affected_rows then
log.info(string.format("兑换 Code %s 更新状态 %d 失败" , redeemCode , status ))
return false
else
self.redeemList[ redeemCode ].status = status
log.info(string.format("兑换 Code %s 更新状态 %d 成功" , redeemCode , status ))
return true
end
end
skynet.server.redeemManage = RedeemManage
return RedeemManage