Files
chuanqi-server-instance/LogicServer/data/functions/ActorSystems/Common/Cdkey.lua
2024-12-16 20:45:03 +08:00

321 lines
9.4 KiB
Lua
Executable File
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.

--[[
激活码功能
个人数据CdKeyData
{
lastTime,上次使用时间
codeTimes =
{
[id1], 礼包id1的使用次数
[id2],
}
}
[60] = {
Id = 60,
awards = {{type=0,id=1270,count=1},{type=0,id=1271,count=1}},
limits = 1,
mailtitle = "VIP进游礼包",
mailcontent = "礼包兑换成功,这是为您准备的礼包,请收好",
switch = 1,
},
[61] = {
Id = 61,
awards = {{type=0,id=1242,count=33},{type=0,id=388,count=1},{type=0,id=1248,count=10}},
limits = 1,
mailtitle = "特权资源礼包",
mailcontent = "礼包兑换成功,这是为您准备的礼包,请收好",
switch = 1,
},
]]
local CODE_SUCCESS = 0 -- 成功
local CODE_INVALID = 1 -- 已被使用
local CODE_NOTEXIST = 2 -- 不存在
local CODE_USED = 3 -- 已使用过同类型
local CODE_ERR = 4 -- SQL查询错误
local CODE_TIME = 5 -- 未到使用时间
local CODE_TIMEEXPIRE = 6 -- 礼包码过期了
local CODE_HTTP = 11 -- HTTP接口错误
local CODE_PF = 12 -- 非本平台礼包码
local CODE_LIMIT = 13 -- 使用次数超过限制
local PfId = System.getPfId()
local SrvId = System.getServerId()
local ServiceConf = CdkeyServiceConf[PfId]
--配置的服务检测
function OnCheckCanPlatform()
-- 平台验证
if not PfId then
print("[ERR][CdKey old]0 load CdkeyServiceConfig error! ")
return false
end
if ServiceConf == nil then
print("[ERR][CdKey old]1 load CdkeyServiceConfig error! ")
return false
end
if ServiceConf.host == nil then
print("[ERR][CdKey old]2 load CdkeyServiceConfig error! ")
return false
end
if ServiceConf.port == nil then
print("[ERR][CdKey old]3 load CdkeyServiceConfig error! ")
return false
end
if ServiceConf.url == nil then
print("[ERR][CdKey old]4 load CdkeyServiceConfig error! ")
return false
end
return true
end
-- 根据 CDKey 获取礼包码id
local function getCodeId(code)
local len = string.byte(string.sub(code, -1)) - 97
local pos = string.byte(string.sub(code, -2,-2)) - 97
local str = string.sub(code, pos + 1, pos + len)
--print("gift code len :"..tostring(len))
---print("gift code pos :"..tostring(pos))
--print("gift code str :"..tostring(str))
local id = 0
for i=1, string.len(str) do
id = id * 10 + (math.abs(string.byte(string.sub(str, i, i)) - 97))
end
return id
end
-- 检测平台号
local function checkPfid(code)
local pos = string.byte(string.sub(code, -2,-2)) - 97
local str = string.sub(code, 1, pos)
return str == PfId
end
-- 获取玩家的 CDKey 数据
local function getActorData(pActor)
if Actor.getEntityType(pActor) ~= enActor then
assert(false)
end
local var = Actor.getStaticVar(pActor);
if var.CdKeyData == nil then
var.CdKeyData = {}
end
if not var.CdKeyData.codeTimes then
var.CdKeyData.codeTimes = {}
end
return var.CdKeyData
end
-- 获取玩家的 CDKey 数据
function getActorCdkData(pActor)
if Actor.getEntityType(pActor) ~= enActor then
assert(false)
end
local var = Actor.getStaticVar(pActor);
if var.CdKeyData == nil then
var.CdKeyData = {}
end
if not var.CdKeyData.codeTimes then
var.CdKeyData.codeTimes = {}
end
if not var.CdKeyData.codeTypeTimes then
var.CdKeyData.codeTypeTimes = {}
end
return var.CdKeyData
end
-- 检测完CDKey后的回调
local function AfterCheckCDkey(paramPack,content,result)
print("[TIP] AfterCheckCDkey : content("..content.."), result: "..result)
local aid = paramPack[1]
local id = paramPack[2]
local pActor = Actor.getActorById(aid)
local res = CODE_SUCCESS
local giftid = id
if pActor and (result == 0) then
-- 获取结果
res,giftid = string.match(content, "(%d+),(%d+)")
res = tonumber(res)
giftid = tonumber(giftid)
if res ~= nil then
if res == CODE_SUCCESS then
-- 发派奖励
local conf = CDKeyConf[id]
SendMail(aid, conf.mailtitle or "兑换码", conf.mailcontent or "兑换码兑换成功!", conf.awards)
-- 记录使用
local data = getActorData(pActor)
data.codeTimes[id] = (data.codeTimes[id] or 0) + 1
if not data.codeTypeTimes then
data.codeTypeTimes = {}
end
data.codeTypeTimes[giftid] = (data.codeTypeTimes[giftid] or 0) + 1
end
else
res = CODE_HTTP
print("[ERROR] AfterCheckCDkey : res("..res.."), content: "..content)
end
else
res = CODE_HTTP
print("[ERROR] AfterCheckCDkey : result("..result.."), content: "..content)
end
-- 回复使用结果
local npack = DataPack.allocPacket(pActor, enMiscSystemID, sUseCdkey)
if npack then
DataPack.writeByte(npack, res)
DataPack.flush(npack)
end
end
--使用激活码
function UseCDKey(pActor, code)
print("[DEBUG] UseCDKey, code="..code)
local ServiceHost = ServiceConf.host
local ServicePort = ServiceConf.port
local ServiceUrl = ServiceConf.url
if checkPfid(code) == false then
--Actor.sendTipmsg(pActor,"非本平台的礼包码!")
-- 回复使用结果
local npack = DataPack.allocPacket(pActor, enMiscSystemID, sUseCdkey)
if npack then
DataPack.writeByte(npack, CODE_PF)
DataPack.flush(npack)
end
return
end
local data = getActorData(pActor)
local time = System.getCurrMiniTime()
if data.lastTime and data.lastTime >= time then
Actor.sendTipmsg(pActor,"请求过快!")
return
end
local id = getCodeId(code)
if CDKeyConf[id] == nil then
Actor.sendTipmsg(pActor, "礼包码错误02")
print("[ERROR] getCodeId error : code = " .. code.."id = " .. id.." name="..Actor.getName(pActor))
return
end
local limit = CDKeyConf[id].limits or 1 --礼包码限制数量
if data.codeTimes[id] then
if data.codeTimes[id] >= limit then
--Actor.sendTipmsg(pActor,"使用次数超过限制!")
-- 回复使用结果
local npack = DataPack.allocPacket(pActor, enMiscSystemID, sUseCdkey)
if npack then
DataPack.writeByte(npack, CODE_LIMIT)
DataPack.flush(npack)
end
return
end
end
--加入异步工作
local account = Actor.getAccount(pActor)
local aid = Actor.getActorId(pActor)
local req = ServiceUrl..'?pfid='..PfId..'&cdkey='..code..'&aid='..aid..'&sid='..SrvId..'&account='..account..'&limit='..limit
print("[TIP] [CdKey] GetHttpContent -------------------------ServiceHost:"..tostring(ServiceHost))
print("[TIP] [CdKey] GetHttpContent -------------------------ServicePort:"..tostring(ServicePort))
print("[TIP] [CdKey] GetHttpContent -------------------------req:"..tostring(req))
print("[TIP] getCodeId error : code = " .. code.."id = " .. id.." name="..Actor.getName(pActor))
AsyncWorkDispatcher.Add(
{'GetHttpContent', ServiceHost, ServicePort, req},
AfterCheckCDkey,
{aid,id}
)
end
--使用通码
function UseCommonCDKey(pActor, code)
print("[DEBUG] UseCommonCDKey, code="..code)
local data = getActorData(pActor)
local time = System.getCurrMiniTime()
if data.lastTime and data.lastTime >= time then
Actor.sendTipmsg(pActor,"请求过快!")
return
end
if CommonCDKeyConf[code].switch == 0 then
local npack = DataPack.allocPacket(pActor, enMiscSystemID, sUseCdkey)
if npack then
DataPack.writeByte(npack, CODE_TIMEEXPIRE)
DataPack.flush(npack)
end
return
end
-- 使用次数超过限制
if data.codeTimes[code] then
if data.codeTimes[code] >= 1 then
local npack = DataPack.allocPacket(pActor, enMiscSystemID, sUseCdkey)
if npack then
DataPack.writeByte(npack, CODE_LIMIT)
DataPack.flush(npack)
end
return
end
end
-- 发派奖励
local conf = CommonCDKeyConf[code]
local aid = Actor.getActorId(pActor)
SendMail(aid, conf.mailtitle or "兑换码", conf.mailcontent or "兑换码兑换成功!", conf.awards)
-- 记录使用
local data = getActorData(pActor)
data.codeTimes[code] = (data.codeTimes[code] or 0) + 1
-- 回复使用结果
local npack = DataPack.allocPacket(pActor, enMiscSystemID, sUseCdkey)
if npack then
DataPack.writeByte(npack, CODE_SUCCESS)
DataPack.flush(npack)
end
end
--是否是通码
function isCommonKey(code)
if CommonCDKeyConf and CommonCDKeyConf[code] then
return true
end
return false
end
-- 客户端请求使用激活码
function OnUseCDKey(pActor, packet)
print("[DEBUG] OnUseCDKey, PfId="..PfId)
if OnCheckCanPlatform() == false then
print("[DEBUG] OnUseCDKey, OnCheckCanPlatform() == false")
return
end
local code = DataPack.readString(packet)
print("[DEBUG][Tip] OnUseCDKey: code = " .. code)
if isCommonKey(code) then
UseCommonCDKey(pActor, code)
else
UseCDKey(pActor,code)
end
end
NetmsgDispatcher.Reg(enMiscSystemID, cUseCdkey, OnUseCDKey)