From 3e20f499d99e9fa79f308bca77f153733b9a9957 Mon Sep 17 00:00:00 2001 From: saicom <307836273@qq.com> Date: Wed, 5 Aug 2020 11:08:01 +0800 Subject: [PATCH] 完善商城相关协议 --- src/ProtocolCode.lua | 4 ++++ src/actions/GmAction.lua | 8 ++++++++ src/actions/RoleAction.lua | 2 +- src/actions/StoreAction.lua | 114 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---- src/csvdata | 2 +- src/models/RolePlugin.lua | 23 ++++++++++++----------- src/models/Store.lua | 120 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------------------------------------------- 7 files changed, 206 insertions(+), 67 deletions(-) diff --git a/src/ProtocolCode.lua b/src/ProtocolCode.lua index ab9e589..58ba452 100644 --- a/src/ProtocolCode.lua +++ b/src/ProtocolCode.lua @@ -184,6 +184,10 @@ actionCodes = { Store_myCardRechargeRpc = 556, Store_iosRechargeRpc = 557, Store_shopBuyRpc = 558, + Store_updateproperty = 559, + Store_getFreeChectRpc = 559, + Store_getGrowFundRewardRpc = 560, --成长助力奖励 + Store_getBattlePassRewardRpc = 561, --赛季卡奖励 Email_listRpc = 600, diff --git a/src/actions/GmAction.lua b/src/actions/GmAction.lua index ec349a1..cc85f9a 100644 --- a/src/actions/GmAction.lua +++ b/src/actions/GmAction.lua @@ -512,6 +512,14 @@ function _M.helpRpc(agent, data) return true end +table.insert(helpDes, {"测试", "test", ""}) +function _M.test(role, pms) + local id = tonum(pms.pm1, 0) + local a = require("actions.StoreAction") + a.getGrowFundRewardRpc({role=role}, MsgPack.pack({id=id})) + return "成功" +end + -- 充值回调 function _M.ayncPurchase(role, params) return role:handlePurchase(params) or "" diff --git a/src/actions/RoleAction.lua b/src/actions/RoleAction.lua index 3aa965e..d142698 100644 --- a/src/actions/RoleAction.lua +++ b/src/actions/RoleAction.lua @@ -128,7 +128,7 @@ function _M.loginRpc( agent, data ) redisproxy:zadd(FRIEND_RECOMMEND, now, roleId) - for _, name in ipairs({"dailyData", "dinerData", "activity"}) do + for _, name in ipairs({"dailyData", "dinerData", "activity", "storeData"}) do response[name] = role[name]:data() end diff --git a/src/actions/StoreAction.lua b/src/actions/StoreAction.lua index 5364f7b..6e124e1 100644 --- a/src/actions/StoreAction.lua +++ b/src/actions/StoreAction.lua @@ -263,8 +263,11 @@ function _M.shopBuyRpc(agent , data) local dataSet = csvdb["shop_normalCsv"][id] if not dataSet then return end - local buyRecord = role.storeData:getProperty("Store_buyRecord") - if math.illegalNum(count, 1, (dataSet.limit == 0 and math.huge or dataSet.limit - (buyRecord[id] or 0))) then return 1 end + local buyRecord = role.storeData:getProperty("buyR") + if math.illegalNum(count, 1, (dataSet.limit == 0 and math.huge or dataSet.limit - (buyRecord[id] or 0))) then + skynet.error(string.format("shop buy over limit, user_id:%d, goods_id:%d", role:getProperty("id"), id)) + return 1 + end local cost = {[dataSet.icon] = dataSet.cost * count} @@ -285,9 +288,8 @@ function _M.shopBuyRpc(agent , data) if dataSet.limit ~= 0 then buyRecord[id] = (buyRecord[id] or 0) + count - role.storeData:updateProperty({field = "Store_buyRecord", value = buyRecord}) + role.storeData:updateProperty({field = "buyR", value = buyRecord}) end - role:costItems(cost, {log = {desc = desc, int1 = id, int2 = count}}) local gift = {} @@ -302,4 +304,108 @@ function _M.shopBuyRpc(agent , data) return true end +function _M.getFreeCheckRpc(agent, data) + local role = agent.role + local msg = MsgPack.unpack(data) + local id = msg.id + + local config = csvdb["shop_rechargeCsv"][id] + if not config then return end + + local rechargeRecord = role.storeData:getProperty("payR") + local getCount = (rechargeRecord[id] or 0) + if getCount >= config.limit then + return 1 + end + local reward, _ = role:award(rechargeData.itemFirst, {log = {desc = "freeGift", int1 = id}}) + + rechargeRecord[id] = getCount + 1 + role.storeData:updateProperty({field = "payR", value = rechargeRecord}) + + SendPacket(actionCodes.Store_getFreeChectRpc, MsgPack.pack({reward = reward})) +end + +function _M.getGrowFundRewardRpc(agent, data) + local role = agent.role + local msg = MsgPack.unpack(data) + local id = msg.id + + local config = csvdb["reward_newbeeCsv"][id] + if not config then return end + + local growFundFlag = role.storeData:getProperty("growFund") + local growFundRecord = role.storeData:getProperty("growFundR") + + if growFundFlag == 0 then + skynet.error("user do not buy grow fund") + return 1 + end + + if not role:checkHangPass(config.condition) then + skynet.error(string.format("user do not finish hang pass, user_id:%d", role:getProperty("id"))) + return 1 + end + + local b = string.getbit(growFundRecord, id) + if string.char(b) == "1" then + return 1 + end + + growFundRecord = string.setbit(growFundRecord, id) + role.storeData:updateProperty({field = "growFundR", value = growFundRecord}) + + local gift = config.giftFree .. " " .. config.giftLimit + local reward, _ = role:award(gift, {log = {desc = "grownFund", int1 = id}}) + + SendPacket(actionCodes.Store_getGrowFundRewardRpc, MsgPack.pack({reward = reward})) +end + +function _M.getBattlePassRewardRpc(agent, data) + local role = agent.role + local msg = MsgPack.unpack(data) + local id = msg.id + + local config = csvdb["reward_battlepassCsv"][id] + if not config then return end + + local timeNow = skynet.timex() + local battleCardExTs = role.storeData:getProperty("battleCardEx") + local battleCardFreeRecord = role.storeData:getProperty("battleFR") + local battleCardLimitRecord = role.storeData:getProperty("battleLR") + + local freeFlag = string.char(string.getbit(battleCardFreeRecord, id)) + local limitFlag = string.char(string.getbit(battleCardLimitRecord, id)) + + if freeFlag == "1" and limitFlag == "1" then + skynet.error("user already get battle pass reward") + return 1 + end + + if battleCardExTs < timeNow and freeFlag == "1" then + return 1 + end + + local gift = "" + if freeFlag == "0" then + gift = config.giftFree + + battleCardFreeRecord = string.setbit(battleCardFreeRecord, id) + role.storeData:updateProperty({field = "battleFR", value = battleCardFreeRecord}) + end + + if battleCardExTs > timeNow and limitFlag == "0" then + if gift ~= "" then + gift = gift .. " " + end + gift = gift .. config.giftLimit + + battleCardLimitRecord = string.setbit(battleCardLimitRecord, id) + role.storeData:updateProperty({field = "battleFR", value = battleCardLimitRecord}) + end + + local reward, _ = role:award(gift, {log = {desc = "battleCard", int1 = id}}) + + SendPacket(actionCodes.Store_getBattlePassRewardRpc, MsgPack.pack({reward = reward})) +end + return _M \ No newline at end of file diff --git a/src/csvdata b/src/csvdata index a09b1fc..12409da 160000 --- a/src/csvdata +++ b/src/csvdata @@ -1 +1 @@ -Subproject commit a09b1fc2fc76e793675b45b1ab28a6c98b18ce9b +Subproject commit 12409daded138b2934c0741b15b2e0de305bb109 diff --git a/src/models/RolePlugin.lua b/src/models/RolePlugin.lua index 048b5d0..86f960a 100644 --- a/src/models/RolePlugin.lua +++ b/src/models/RolePlugin.lua @@ -145,7 +145,6 @@ function RolePlugin.bind(Role) end end end - return reward, allChange --实际获得的奖励 和 最高级奖励转化过程 end @@ -1507,7 +1506,7 @@ function RolePlugin.bind(Role) return end - local diamond = self:recharge({ + local reward = self:recharge({ id = orderObject:getProperty("rechargeId"), transactionId = params.transactionId, pay_time = params.pay_time, @@ -1518,7 +1517,7 @@ function RolePlugin.bind(Role) redisproxy:srem(string.format("role:%d:orders", roleId), partnerOrderStr) SendPacket(actionCodes.Store_ayncPurchaseRpc, MsgPack.pack({ order = partnerOrderStr, - result = "success", diamond = diamond})) + result = "success", reward = reward})) return orderObject:getProperty("rechargeId") end @@ -1532,7 +1531,7 @@ function RolePlugin.bind(Role) return end - if not role.storeData:checkRechargeRecord(rechargeData.limit, id) then + if not self.storeData:checkRechargeRecord(rechargeData.limit, id) then return 1 end @@ -1547,25 +1546,27 @@ function RolePlugin.bind(Role) self:updateProperty({field = "rechargeF", value = rechargeF}) end self:gainDiamond({count = diamondCount, isRecharge = true, log = {desc = "recharge", int1 = id}}) - elseif rechargeData.shop == 1 then --通行证商店 - reward = self:award(rechargeData.itemFirst, {log = {desc = "recharge", int1 = id}}) + elseif rechargeData.shop == 2 then --通行证商店 + reward, _ = self:award(rechargeData.itemFirst, {log = {desc = "recharge", int1 = id}}) self.storeData:onBuyCard(rechargeData.type, rechargeData.time) - return - elseif rechargeData.shop == 2 then -- 礼包商店 - reward = self:award(rechargeData.itemFirst, {log = {desc = "recharge", int1 = id}}) - return + elseif rechargeData.shop == 3 then -- 礼包商店 + reward, _ = self:award(rechargeData.itemFirst, {log = {desc = "recharge", int1 = id}}) else skynet.error("invalid recharge shop type " .. id) return end + if diamondCount > 0 then + reward[Itemid.Diamond] = (reward[Itemid.Diamond] or 0) + diamondCount + end + -- 累充 local rmb = rechargeData.rmb self:updateProperty({field = "rmbC", delta = rmb}) self:log("role_action", {desc = "recharge", int1 = id, int2 = rmb, key1 = params.transactionId, key2 = params.order, long1 = params.pay_time}) - return diamondCount, reward + return reward end end diff --git a/src/models/Store.lua b/src/models/Store.lua index 294f395..66752d3 100644 --- a/src/models/Store.lua +++ b/src/models/Store.lua @@ -7,38 +7,39 @@ function Store:ctor(properties) end Store.schema = { - Store_buyRecord = {"table", {}}, -- 购买商品记录 {id=count} - Store_rechargeRecord = {"table", {}}, -- 充值记录 {id=count} - Store_growFund = {"number", 0}, -- 成长基金 - Store_growFundRecord = {"table", {}}, -- 成长基金领取记录 - Store_monthCardExTs = {"number", 0}, -- 月卡过期时间戳 - Store_smonthCardExTs = {"number", 0}, -- 超级月卡过期时间戳 - Store_battleCardExTs = {"number", 0}, -- 赛季卡过期时间戳 - Store_battleCardRecord = {"table", {}}, -- 赛季卡领取记录 + buyR = {"table", {}}, -- 购买商品记录 {id=count} + payR = {"table", {}}, -- 充值记录 {id=count} + growFund = {"number", 0}, -- 成长基金 + growFundR = {"string", ""}, -- 成长基金领取记录 + monthCardEx = {"number", 0}, -- 月卡过期时间戳 + smonthCardEx = {"number", 0}, -- 超级月卡过期时间戳 + battleCardEx = {"number", 0}, -- 赛季卡过期时间戳 + battleFR = {"string", ""}, -- 免费赛季卡领取记录 + battleLR = {"string", ""}, -- 付费赛季卡领取记录 + limitTPack = {"table", {}} -- 限时礼包 {id=expire_ts} } function Store:updateProperty(params) - local type, default = table.unpack(self.schema[params.field]) - - if params.delta then - self:incrProperty(params.field, params.delta) - if not params.notNotify then - self.owner:notifyUpdateProperty(params.field, self:getProperty(params.field)) - end - return true + params = params or {} + if not self.schema[params.field] then + return end + local oldValue = self:getProperty(params.field) if params.value then self:setProperty(params.field, params.value) - if not params.notNotify then - self.owner:notifyUpdateProperty(params.field, self:getProperty(params.field)) - end - return true + elseif params.delta then + self:incrProperty(params.field, params.delta) + else + return + end + local newValue = self:getProperty(params.field) + if not params.notNotify then + self:notifyUpdateProperty(params.field, newValue, oldValue) end - return false end function Store:refreshData(notify, refreshType) - local buyRecord = self:getProperty("Store_buyRecord") + local buyRecord = self:getProperty("buyR") local result = {} for id, data in pairs(csvdb["shop_normalCsv"]) do if data.shop == 1 and refreshType == RefreshType.RefreshType_Daily then @@ -48,66 +49,85 @@ function Store:refreshData(notify, refreshType) buyRecord[id] = nil end end - self:setProperty("Store_buyRecord", buyRecord) + self:setProperty("buyR", buyRecord) if notify then - --self.owner:notifyUpdateProperties(self:data()) - self:notifyUpdateProperty({field="Store_buyRecord", value=buyRecord}) + self:notifyUpdateProperty({field="buyR", value=buyRecord}) end end function Store:refreshPvpBuyRecord(notify) - local buyRecord = self:getProperty("Store_buyRecord") + local buyRecord = self:getProperty("buyR") for id, data in pairs(csvdb["shop_normalCsv"]) do if data.shop == 3 then buyRecord[id] = nil end end - self:setProperty("Store_buyRecord", buyRecord) + self:setProperty("buyR", buyRecord) if notify then - self:notifyUpdateProperty({field="Store_buyRecord", value=buyRecord}) + self:notifyUpdateProperty({field="buyR", value=buyRecord}) end end -- 发送月卡邮件 function Store:sendMonthCardEmail() + local monthCardEx = self:getProperty("monthCardEx") + local smonthCardEx = self:getProperty("smonthCardEx") + local timeNow = skynet.timex() + if monthCardEx < timeNow then + redisproxy:insertEmail({roleId = self.owner:getProperty("id"), emailId = 19}) + end + if smonthCardEx < timeNow then + redisproxy:insertEmail({roleId = self.owner:getProperty("id"), emailId = 20}) + end end -- 购买通行证 -function onBuyCard(type, duration) +function Store:onBuyCard(type, duration) + duration = duration == "" and 0 or tonumber(duration) local timeNow = skynet.timex() - if rechargeData.type == CardType.NormalMonthCard then - self:updateProperty({field = "Store_monthCardExTs", value = timeNow + duration}) - elseif rechargeData.type == CardType.SuperMonthCard then - self:updateProperty({field = "Store_smonthCardExTs", value = timeNow + duration}) - elseif rechargeData.type == CardType.PrivilegeCard then - elseif rechargeData.type == CardType.GrowFund then - self:updateProperty({field = "Store_growFundRecord", 1}) - elseif rechargeData.type == CardType.BattleCard then - self:updateProperty({field = "Store_battleCardRecord", 1}) + if type == CardType.NormalMonthCard then + self:updateProperty({field = "monthCardEx", value = timeNow + duration}) + elseif type == CardType.SuperMonthCard then + self:updateProperty({field = "smonthCardEx", value = timeNow + duration}) + elseif type == CardType.PrivilegeCard then + elseif type == CardType.GrowFund then + self:updateProperty({field = "growFund", value = 1}) + elseif type == CardType.BattleCard then + self:updateProperty({field = "battleCardEx", value = timeNow + duration}) end end -function checkRechargeRecord(limit, id) - local rechargeRecord = self:getProperty("Store_rechargeRecord") +function Store:checkRechargeRecord(limit, id) + local rechargeRecord = self:getProperty("payR") if limit ~= 0 and limit <= (rechargeRecord[id] or 0) then skynet.error(string.format("recharge id:%d count over limit, user id:%d", id, self.owner:getProperty("id"))) return false end - rechargeRecord[id] = rechargeRecord[id] + 1 - self:updateProperty({field = "Store_rechargeRecord", value = rechargeRecord[id]}) + rechargeRecord[id] = (rechargeRecord[id] or 0) + 1 + self:updateProperty({field = "payR", value = rechargeRecord}) return true end +function Store:notifyUpdateProperty(field, newValue, oldValue) + local datas = { + key = field, + newValue = newValue, + oldValue = oldValue, + } + SendPacket(actionCodes.Store_updateproperty, MsgPack.pack(datas)) +end + function Store:data() return { - Store_buyRecord = self:getProperty("Store_buyRecord"), - Store_rechargeRecord = self:getProperty("Store_rechargeRecord"), - Store_growFund = self:getProperty("Store_growFund"), - Store_growFundRecord = self:getProperty("Store_growFundRecord"), - Store_monthCardExTs = self:getProperty("Store_monthCardExTs"), - Store_smonthCardExTs = self:getProperty("Store_smonthCardExTs"), - Store_battleCardExTs = self:getProperty("Store_battleCardExTs"), - Store_battleCardRecord = self:getProperty("Store_battleCardRecord"), + buyR = self:getProperty("buyR"), + payR = self:getProperty("payR"), + growFund = self:getProperty("growFund"), + growFundR = self:getProperty("growFundR"), + monthCardEx = self:getProperty("monthCardEx"), + smonthCardEx = self:getProperty("smonthCardEx"), + battleCardEx = self:getProperty("battleCardEx"), + battleCardR = self:getProperty("battleCardR"), + limitTPack = self:getProperty("limitTPack"), } end -- libgit2 0.21.2