HomeServer/lualib-src/Server-main/AllServer/MultiServer/RedeemManage.lua

229 lines
8.6 KiB
Lua
Raw Permalink Normal View History

2024-11-20 15:41:09 +08:00
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