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

133 lines
5.2 KiB
Lua

local skynet = require "skynet"
local oo = require "Class"
local log = require "Log"
local pb = require "pb"
local redisKeyUrl = require "RedisKeyUrl"
local sqlUrl = require "SqlUrl"
local dataType = require "DataType"
local json =require "json"
local errorInfo = require "ErrorInfo"
local Redeem = oo.class()
Redeem.RedeemOpType_1 = 1 --获取兑换列表
Redeem.RedeemOpType_2 = 2 --查阅/领取奖品
--[[
后台code
SUCCESS(200,"操作成功"),
REDEEM_CODE_NOT_NULL(601,"礼包ID或玩家ID不能为空"),
REDEEM_CODE_NOT_USE(602,"兑换码已停止使用"),
REDEEM_CODE_FULL_USE(603,"兑换码已全部兑换"),
REDEEM_CODE_TIME_FAILURE(604,"兑换码时间失效"),
REDEEM_CODE_PLAYER_USED(605,"该玩家已兑换"),
]]
function Redeem:Init()
end
--获取兑换历史
function Redeem:History( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SRedeemHistory", c2sData.data ))
local data = {}
data.historyInfo = {}
for k,v in pairs(player.gameData.redeem.redeemList) do
table.insert(data.historyInfo , { redeemCode = v.redeemCode , award = v.award , gainTime = v.gainTime})
end
s2cData.cmd = pb.enum("MsgType","CMD_S2C_RedeemHistory")
s2cData.data = assert(pb.encode("S2CRedeemHistory", data))
end
--兑换码领取奖励
function Redeem:Award( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SRedeemAward", c2sData.data ))
local data = {}
local redeemCode = c2sData.data.redeemCode
if not redeemCode then
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
else
data.redeemCode = redeemCode
--向后端请求
local param = { giftId = redeemCode ,playerId = player.userId }
local web = skynet.server.gameConfig.WebConfig.host .. ":" .. skynet.server.gameConfig.WebConfig.port
local url = skynet.server.common.redeemUrl
local status,body = skynet.server.httpClient:PostJson( web , url , json:encode(param),"http")
local newbody = json:decode(body)
if 200 == status and 200 == newbody.code then
self:Bonus( player , redeemCode , newbody.data , data)
else
if 605 == newbody.code then
s2cData.code = errorInfo.ErrorCode.AlreadyGet
s2cData.desc = errorInfo.ErrorMsg[s2cData.code]
elseif 604 == newbody.code then
s2cData.code = errorInfo.ErrorCode.RedeemOutDate
s2cData.desc = errorInfo.ErrorMsg[s2cData.code]
elseif 603 == newbody.code then
s2cData.code = errorInfo.ErrorCode.RedeemFullUse
s2cData.desc = errorInfo.ErrorMsg[s2cData.code]
elseif 602 == newbody.code then
s2cData.code = errorInfo.ErrorCode.NoRedeemID
s2cData.desc = errorInfo.ErrorMsg[s2cData.code]
end
end
end
s2cData.cmd = pb.enum("MsgType","CMD_S2C_RedeemAward")
s2cData.data = assert(pb.encode("S2CRedeemAward", data))
end
--发放兑换奖励
function Redeem:Bonus( player , redeemCode , bonus , data )
data.award = {}
for k, v in pairs(bonus) do
local goodsType = skynet.server.common:AwardTypeStrToInt(v.articlesType)
if goodsType >= dataType.GoodsType_Furniture and goodsType <= dataType.GoodsType_PetClothes then
skynet.server.bag:AddGoods( player , goodsType , v.articlesId, v.articlesNumber )
end
--货币直接发放相应数量就行
if goodsType == dataType.GoodsType_Init then
if dataType.GoodsType_Coin == v.articlesId then
player:MoneyChange( pb.enum("EnumGoodsType","Coin") , v.articlesNumber )
elseif dataType.GoodsType_Clovers == v.articlesId then
player:MoneyChange( pb.enum("EnumGoodsType","Clovers") , v.articlesNumber )
elseif dataType.GoodsType_Volute == v.articlesId then
player:MoneyChange( pb.enum("EnumGoodsType","VoluteCoin") , v.articlesNumber )
end
end
if goodsType == dataType.GoodsType_Init then
table.insert( data.award , { type = v.articlesId , count = v.articlesNumber } )
else
table.insert( data.award , { type = goodsType , id = v.articlesId , count = v.articlesNumber } )
end
log.info(string.format("玩家 %d 兑换码 %s 领取奖励 类型 %d ID %d 数量 %d" , player.userId , redeemCode , goodsType , v.articlesId , v.articlesNumber))
end
self:AddHistory( player , redeemCode , data.award )
end
--添加兑换码历史
function Redeem:AddHistory( player , redeemCode , award )
--插入到玩家兑换列表中
local curIndex = player.gameData.redeem.curIndex
player.gameData.redeem.redeemList[ curIndex ] = {}
player.gameData.redeem.redeemList[ curIndex ].redeemCode = redeemCode
player.gameData.redeem.redeemList[ curIndex ].award = award
player.gameData.redeem.redeemList[ curIndex ].gainTime = skynet.GetTime() -- skynet.server.common:GetStrTime(skynet.GetTime())
--玩家最多30条最近的兑换码记录
player.gameData.redeem.curIndex = player.gameData.redeem.curIndex + 1
if player.gameData.redeem.curIndex >= 30 then
player.gameData.redeem.curIndex = 1
end
end
skynet.server.redeem = Redeem
return Redeem