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