Commit 39bcd7ca0c7586e8f2403dd228d8d0188b4af7e5

Authored by zhouhaihai
1 parent a608cccb

LOG

src/actions/EmailAction.lua
... ... @@ -53,7 +53,6 @@ function _M.listRpc(agent, data)
53 53 content = email.content,
54 54 attachments = email.attachments
55 55 })
56   - role:log("mail_action", {desc = "get_global", key1 = email.title, key2 = email.attachments})
57 56 end
58 57 end
59 58 end
... ... @@ -90,21 +89,17 @@ function _M.drawAllAttachRpc(agent, data)
90 89 local ids = {}
91 90  
92 91 local emails = loadEmails(roleId)
93   - redisproxy:pipelining(function (red)
94   - for _, email in ipairs(emails) do
95   - local attachments = getEmailAttachments(email)
96   - if attachments ~= "" then
97   - local emailId = email:getProperty("id")
98   - ids[emailId] = 1
99   - red:hset(string.format(R_EMAIL_ITEM, roleId, emailId), "status", 2)
100   - role:log("mail_action", {desc = "draw_attach", int1 = emailId, key1 = email:getProperty("title"), key2 = attachments})
101   -
102   - for key, v in pairs(attachments:toNumMap()) do
103   - reward[key] = (reward[key] or 0) + v
104   - end
  92 + for _, email in ipairs(emails) do
  93 + local attachments = getEmailAttachments(email)
  94 + if attachments ~= "" then
  95 + email:setProperty("status", 2)
  96 + email:log(role, 2)
  97 + ids[emailId] = 1
  98 + for key, v in pairs(attachments:toNumMap()) do
  99 + reward[key] = (reward[key] or 0) + v
105 100 end
106 101 end
107   - end)
  102 + end
108 103 reward, change = role:award(reward, {log = {desc = "draw_attach"}})
109 104 SendPacket(actionCodes.Email_drawAllAttachRpc, MsgPack.pack({ids = ids, reward = reward, change = change}))
110 105 return true
... ... @@ -125,10 +120,10 @@ function _M.drawAttachRpc(agent, data)
125 120 if attachments == "" then return end
126 121  
127 122 local reward, change = role:award(attachments, {log = {desc = "draw_attach", int1 = emailId, key1 = email:getProperty("title")}})
128   - redisproxy:hset(rds, "status", 2) -- 领取标记
  123 + email:setProperty("status", 2)
  124 + email:log(role, 2)
129 125 SendPacket(actionCodes.Email_drawAttachRpc, MsgPack.pack({reward = reward, change = change}))
130 126  
131   - role:log("mail_action", {desc = "draw_attach", int1 = id, key1 = email:getProperty("title"), key2 = attachments})
132 127 return true
133 128 end
134 129  
... ... @@ -139,11 +134,11 @@ function _M.checkRpc(agent, data)
139 134 local msg = MsgPack.unpack(data)
140 135 local id = msg.id
141 136  
142   - local rds = string.format(R_EMAIL_ITEM, roleId, id)
143   - if not redisproxy:exists(rds) then return end
  137 + local email = require("models.Email").new({key = rds})
  138 + if not email:load() then return end
144 139  
145   - redisproxy:hset(rds, "status", 1)
146   - role:log("mail_action", {desc = "check_mail", int1 = id})
  140 + email:setProperty(rds, "status", 1)
  141 + email:log(role, 1)
147 142  
148 143 SendPacket(actionCodes.Email_checkRpc, '')
149 144 return true
... ... @@ -171,6 +166,7 @@ function _M.delRpc(agent, data)
171 166 attachments = emailData.attachment
172 167 end
173 168 if status == 2 or (status == 1 and attachments:len() == 0) then
  169 + email:log(role, 3)
174 170 red:lrem(rds, 0, id)
175 171 red:del(emailRds)
176 172 result[tonum(id)] = 1
... ... @@ -178,9 +174,6 @@ function _M.delRpc(agent, data)
178 174 end
179 175 end
180 176 end)
181   - for delId, _ in ipairs(result) do
182   - role:log("mail_action", {desc = "del_mail", int1 = delId})
183   - end
184 177 SendPacket(actionCodes.Email_delRpc, MsgPack.pack({result = result}))
185 178 return true
186 179 end
... ...
src/actions/RoleAction.lua
... ... @@ -99,6 +99,29 @@ function _M.loginRpc( agent, data )
99 99 role:reloadWhenLogin()
100 100 end
101 101  
  102 +
  103 + role.sysVersion = msg.sysVersion
  104 + role.ip = agent.ip:toArray(false, ":")[1]
  105 + role.clientVersion = msg.clientVersion
  106 + role.network = msg.network
  107 +
  108 + if msg.subId then
  109 + role:setProperty("sid", msg.subId)
  110 + end
  111 +
  112 + if msg.deviceMode then
  113 + local deviceMode = tostring(msg.deviceMode)
  114 + if role:getProperty("dmode") ~= deviceMode then
  115 + role:setProperty("dmode", deviceMode)
  116 + end
  117 + end
  118 + if msg.device then
  119 + local device = tostring(msg.device)
  120 + if role:getProperty("device") ~= device then
  121 + role:setProperty("device", device)
  122 + end
  123 + end
  124 +
102 125 if not msg.isGMlogin then
103 126 local banTime = role:getProperty("banTime")
104 127 if banTime > now then
... ... @@ -114,18 +137,7 @@ function _M.loginRpc( agent, data )
114 137 role:setBan(0)
115 138 end
116 139 end
117   - if msg.deviceMode then
118   - local deviceMode = tostring(msg.deviceMode)
119   - if role:getProperty("dmode") ~= deviceMode then
120   - role:setProperty("dmode", deviceMode)
121   - end
122   - end
123   - if msg.device then
124   - local device = tostring(msg.device)
125   - if role:getProperty("device") ~= device then
126   - role:setProperty("device", device)
127   - end
128   - end
  140 +
129 141  
130 142 SERV_OPEN = redisproxy:hget("autoincrement_set", "server_start")
131 143  
... ... @@ -266,7 +278,7 @@ function _M.loginRpc( agent, data )
266 278 role:savePvpHTeam()
267 279  
268 280 local hangPass = role:getProperty("hangPass")
269   - role:log("login", {key1 = agent.ip:toArray(false, ":")[1], int1 = hangPass[1] or 0})
  281 + role:log("onLogin")
270 282  
271 283 return true
272 284 end
... ... @@ -314,11 +326,20 @@ function _M.createRpc(agent, data)
314 326 return true
315 327 end
316 328 newRole:startActionUcode()
  329 + newRole.sysVersion = msg.sysVersion
  330 + newRole.ip = agent.ip:toArray(false, ":")[1]
  331 + newRole.clientVersion = msg.clientVersion
  332 + newRole.network = msg.network
  333 +
317 334 newRole:award(globalCsv.birthItem, {log = {desc = "birth"}, notNotify = true})
318 335 -- 欢迎邮件
319 336 redisproxy:insertEmail({roleId = roleId, emailId = 1})
320 337  
321   - newRole:log("create", {key1 = agent.ip:toArray(false, ":")[1]})
  338 + if msg.newuser then
  339 + newRole:log("onCreateAccount")
  340 + end
  341 + newRole:log("onCreateRole")
  342 +
322 343  
323 344 SendPacket(actionCodes.Role_createRpc, MsgPack.pack(response))
324 345 return true
... ... @@ -1011,6 +1032,7 @@ function _M.guideRpc(agent, data)
1011 1032 role:saveGuide(master, slave)
1012 1033 funcGuide = funcGuide:setv(master * 1000 + slave, 1)
1013 1034 role:updateProperty({field = "funcGuide", value = funcGuide})
  1035 + role:log("onGuidePoint", {guild_type = 0, guild_id = master, guild_point = slave, guild_pass = 0})
1014 1036 elseif cmdType == 2 then
1015 1037 -- 系统引导(玩家可选择是否进行)
1016 1038 if not msg.skip then return end
... ... @@ -1023,7 +1045,7 @@ function _M.guideRpc(agent, data)
1023 1045  
1024 1046 if msg.funcType then
1025 1047 funcGuide = funcGuide:setv(msg.funcType, 1)
1026   - role:log("guide", {desc = "guide_weak", int1 = msg.funcType})
  1048 + role:log("onGuidePoint", {guild_type = 2, guild_id = msg.funcType, guild_point = 0, guild_pass = 0})
1027 1049 end
1028 1050 role:updateProperty({field = "funcGuide", value = funcGuide})
1029 1051 elseif cmdType == 3 then
... ... @@ -1032,14 +1054,14 @@ function _M.guideRpc(agent, data)
1032 1054 role:saveGuide(csvdb["guide_unlockCsv"][msg.funcType].guideId,1)
1033 1055 funcGuide = funcGuide:setv(msg.funcType, 1)
1034 1056 role:updateProperty({field = "funcGuide", value = funcGuide})
1035   - role:log("guide", {desc = "guide_sys", int1 = funcIdx})
  1057 + role:log("onGuidePoint", {guild_type = 1, guild_id = msg.funcType, guild_point = 0, guild_pass = 0})
1036 1058 end
1037 1059 elseif cmdType == 4 then
1038 1060 -- 弹出一个tips(进入功能界面也许要自动弹说明,value要区分1、2)
1039 1061 if msg.funcType then
1040 1062 local value = msg.value or 1
1041 1063 for _, funcIdx in pairs(msg.funcType:toArray(true,"=")) do
1042   - role:log("guide", {desc = "guide_tips", int1 = funcIdx})
  1064 + role:log("onGuidePoint", {guild_type = 3, guild_id = funcIdx, guild_point = 0, guild_pass = 0})
1043 1065 funcGuide = funcGuide:setv(funcIdx, value)
1044 1066 end
1045 1067 role:updateProperty({field = "funcGuide", value = funcGuide})
... ...
src/actions/StoreAction.lua
... ... @@ -31,6 +31,7 @@ function _M.rechargeRpc(agent , data)
31 31 local partnerOrderId = makeOrder(roleId, id)
32 32 SendPacket(actionCodes.Store_rechargeRpc, MsgPack.pack({ order = partnerOrderId }))
33 33  
  34 +
34 35 -- 测试的 直接发奖励了
35 36 skynet.timeout(10, function ()
36 37 role:handlePurchase({
... ... @@ -164,6 +165,22 @@ function _M.purchaseOrderResult(agent, data)
164 165  
165 166 if msg.status == "success" then
166 167 orderObject:setProperty("transactionId", msg.platformOrder or "")
  168 + local rechargeId = orderObject:getProperty("rechargeId")
  169 + local dataSet = csvdb["shop_rechargeCsv"][rechargeId]
  170 +
  171 + role:log("setOrder", {
  172 + order_status = 100, -- "订单状态:100 - 开始下单(玩家还未开始付费行为记录)200 - 支付完成并发货(SDK通知可以发货时记录),300 - 订单被取消,1000 - 其他"
  173 + item_id = rechargeId, -- 道具id
  174 + item_type = dataSet.type, -- 购买的道具类型,具体见"onItems"方法中道具类型枚举表
  175 + item_name = dataSet.title, -- 购买的道具名
  176 + item_number = 1, -- 购买的道具数量
  177 + item_level = 1, -- 购买的道具等级
  178 + order_cost = dataSet.rmb * 100, -- 此次消费的现金金额(单位:分),如 51800即未518元,对应客户端SDK传入的'total_fee'
  179 + order_currency = "CNY", -- 货币类型,默认为"CNY"(人民币),遵循ISO 4217规范
  180 + order_type = self.getProperty("rmbC") > 0 and 0 or 1, -- 订单类型,首充记录为1,否则为0
  181 + order_id = msg.platformOrder, -- 本条记录的订单号,对应客户端SDK返回的'bs_trade_no'
  182 + })
  183 +
167 184 return true
168 185 end
169 186  
... ...
src/agent.lua
... ... @@ -282,7 +282,7 @@ function CMD.close()
282 282 mcast_util.usub_union()
283 283 local role = agentInfo.role
284 284 if not role then return end
285   - role:log("logout", {int1 = skynet.timex()-role:getProperty("ltime")})
  285 + role:log("onLogout", {logtime = skynet.timex()-role:getProperty("ltime")})
286 286 role:onOfflineEvent()
287 287 end
288 288  
... ...
src/models/Email.lua
... ... @@ -18,6 +18,23 @@ Email.schema = {
18 18 rewardPms = {"table", {}},
19 19 }
20 20  
  21 +function Email:log(role, action)
  22 + role:log("onMail", {
  23 + mail_action_type = action, -- 操作(1=收,2=领,3=删)
  24 + mail_receivetime = self:getProperty("createtime"), -- 收件时间
  25 + mail_textid = self:getProperty("emailId"), -- 邮件文本ID
  26 + mial_title = self:getProperty("title"), -- 邮件标题参数
  27 + mail_content = json.encode(self:getProperty("contentPms")), -- 邮件内容参数
  28 + mail_attach = self:getProperty("attachments"), -- 邮件附件
  29 + mail_reason = self:getProperty("stitle"), -- 原因
  30 + mail_readstatus = self:getProperty("status") >= 1 and 1 or 0, -- 邮件读取状态
  31 + mail_attachstatus = self:getProperty("status") >= 2 and 1 or 0, -- 邮件附件状态
  32 + mail_timeout = 0, -- 邮件超时时间
  33 + mail_friend_id = 0, -- 收件方账号id
  34 + mail_friend_roleid = 0, -- 收件方角色id
  35 + })
  36 +end
  37 +
21 38 function Email:data()
22 39 local emailId = self:getProperty("emailId")
23 40 local title = self:getProperty("title")
... ...
src/models/RoleLog.lua
  1 +local server_id = (skynet.getenv("serverType") or "localtest") .. "_" .. skynet.getenv("servId")
1 2  
2   --- logType
3   -local LogType = {
4   - create = "common",
5   - login = "common",
6   - logout = "common",
7   - guide = "common",
  3 +--[[
  4 + 100 购买/兑换行为
  5 + 200 交易行为(与其他玩家)
  6 + 300 通过关卡产出或消耗
  7 + 400 通过任务产出或消耗
  8 + 500 通过公会产出或消耗
  9 + 600 通过成就产出或消耗
  10 + 700 通过邮件产出或消耗
  11 + 1000 其他行为
  12 +--]]
  13 +local ItemReason = {
  14 + advWheelSurf = 101, -- 资助
  15 + advRepayWheelSurf = 102, -- 资助回馈
  16 + saleEquip = 103, -- 卖装备
  17 + saleRune = 104, -- 卖铭文
  18 + drawHero = 105, -- 抽卡
  19 + pvpShop = 106, -- pvp商店
  20 + saleItem = 107, -- 售卖道具
  21 + openItem = 108, -- 打开箱子
  22 + openTimeBox = 109, -- 打开时间箱
  23 + speedUpBox = 110, -- 速度箱
  24 + dailyShop = 111, -- 每日商城
  25 + dinershop = 112, -- 餐厅商店
  26 + goldBuy = 113, -- 购买金币
  27 + buyAdvCount = 114, -- 购买冒险次数
  28 + advReSupport = 115, -- 刷新拾荒支援技
  29 + advQuickHang = 116, -- 冒险快速挂机
  30 + makePotion = 117, -- 制造药剂
  31 + equipUp = 118, -- 装备升级
  32 + runeUp = 119, -- 符文升级
  33 + talentUp = 120, -- 天赋升级
  34 + buyBonusCount = 121, -- 购买奖励副本次数
  35 + bagField = 122, -- 背包栏位
  36 + buyPvpKey = 123, -- 购买pvp钥匙
  37 + startPvp = 124, -- 开始pvp
  38 + unlockStory = 125, -- 解锁剧情
  39 + towerCount = 126, -- 电波塔次数
  40 +
  41 + advHang = 301, -- 拾荒挂机
  42 + hangBattle = 302, -- 挂机战斗
  43 + hangReward = 303, -- 挂机奖励
  44 + quickHang = 304, -- 快速挂机
  45 + bonusBattle = 305, -- 奖励副本
  46 + hangGift = 306, -- 奖励关卡奖励
  47 + pvpBattleC = 307, -- pvp战斗普通
  48 + pvpBattleH = 308, -- pvp战斗高级
  49 + pvpDivisionH = 309, -- pvp高级段位奖励
  50 + towerBattle = 310, -- 电波塔战斗
  51 + advOver = 311, -- 冒险结算
  52 + advUnlock = 312, -- 拾荒解锁
8 53  
9   - in_item = "common",
10   - out_item = "common",
11   - in_diamond = "common",
12   - out_diamond = "common",
13   - in_hero = "common",
14   - out_hero = "common",
15   - in_equip = "common",
16   - out_equip = "common",
17   - in_rune = "common",
18   - out_rune = "common",
19   - player_exp = "common",
20   - func_open = "common",
21   - in_adv = "common",
22   - out_adv = "common",
23   - in_artifact = "common",
24   -
25   - mail_action = "common",
26   - role_action = "common",
27   - hang_action = "common",
28   - hero_action = "common",
29   - adv_action = "common",
30   - rune_action = "common",
31   - pvp_action = "common",
32   - diner_action = "common",
33   - tower_action = "common",
34   - gm_action = "common",
35   - act_action = "common",
  54 + dinerFinishTask = 401, -- 餐厅完成任务
  55 + storybookReward = 402, -- 剧情奖励
  56 + finishTask = 403, -- 任务
  57 + taskActive = 404, -- 完成活跃任务
  58 + advMainTask = 405, -- 拾荒主线
  59 +
  60 + finishAchive = 601, -- 完成成就
  61 + advAchiev = 602, -- 拾荒成就
  62 + advAchievReward = 603, -- 拾慌成就奖励
  63 +
  64 + draw_attach = 701, -- 邮件奖励
  65 +
  66 + gm = 1000, -- 获取途径:GM
  67 +
  68 + -- 活动
  69 + sudoku = 1001, -- 九宫格
  70 + sudokuR = 1002, -- 九宫格连线奖励
  71 + sudokuRP = 1003, -- 九宫格阶段奖励
  72 + sign = 1004, -- 签到
  73 + friendPoint = 1005, -- 友情
  74 + birth = 1006, -- 出生奖励
  75 +
  76 + -- 餐厅
  77 + greenHourse = 1101, -- 食材获得
  78 + dinerEntrus = 1102, -- 餐厅委托
  79 + dinerCollect = 1103, -- 餐厅小人收集
  80 + dinerCombo = 1104, -- 小人组合
  81 + dinerSkillUp = 1105, -- 餐厅技能升级
  82 + dinerReTask = 1106, -- 餐厅刷新任务
  83 + addSell = 1107, -- 餐厅贩卖
  84 + dinerBuildUp = 1108, -- 建筑升级
  85 + removeSell = 1109, -- 移除售卖
  86 + dinerSell = 1110, -- 餐饮售卖
  87 +
  88 + -- 英雄
  89 + heroLevelUp = 1201, -- 英雄升级
  90 + heroBreak = 1202, -- 英雄突破
  91 + heroWake = 1203, -- 英雄觉醒
  92 + heroTalent = 1204, -- 英雄天赋
  93 + createHero = 1205, -- 碎片合成
  94 + createHeroRandom = 1206, -- 随机合成
  95 + resetHero = 1207, -- 重置养成
36 96 }
37 97  
38   --- 如要修改 要提前修改 _template mapping -- 对应 mapping 为 gamelog-*
39   -local Mapping = {
40   - -- 预留一些数据格式 担心integer 范围不够用 将 通用的int* 全部换为long
41   - common = {
42   - desc = "keyword",--索引的短字符串
43   - ucode = "keyword",--关联日志对应ucode
44   - key1 = "keyword", --可索引的短字符串
45   - key2 = "keyword", --可索引的短字符串
46   - -- 几乎不用的长文本
47   - text1 = "text", --长字符串不索引的类型
48   - -- 五个不同类型的数字 基本上满足数量要求 尽量从低到高用
49   - short1 = "short",
50   - int1 = "long",
51   - int2 = "long",
52   - long1 = "long",
53   - float1 = "float",
54   -
55   - -- 底层使用的 一些参数
56   - cint1 = "long",
57   - cint2 = "long",
58   - cint3 = "long",
59   - }
  98 +
  99 +--[[
  100 +100 教学
  101 +200 主线
  102 +300 日常
  103 +400 周常
  104 +500 联盟
  105 +1000 限时任务
  106 +2000 其他
  107 +--]]
  108 +local TaskType = {
  109 +
60 110 }
61 111  
62   --- 所有的日志都包括的部分 role 里面的信息 -- mapping 信息在 gamelog-role
63   -local commonRoleField = {
64   - name = "keyword",
65   - id = "integer",
66   - uid = "keyword",
67   - sid = "short",
68   - device = "keyword",
69   - ctime = "integer",
70   - ltime = "integer",
71   - level = "short",
72   - rmbC = "integer",
  112 +
  113 +local MethodType = {
  114 + onCreateAccount = {}, -- 创建游戏账号
  115 + onCreateRole = {}, -- 创建游戏角色
  116 + onLogin = {}, -- 玩家登录
  117 + onLogout = { -- 登出
  118 + logtime = true, --登录时长
  119 + },
  120 + setLevel = { -- 设置等级 --TODO
  121 + level_before = true, -- 变动前的等级,可以跳级
  122 + level_changemain = true, -- 等级变动原因,副本通关:mission,领取奖励:reward
  123 + level_changedetail = true, -- 等级变动原因明细,副本通关则记录关卡ID,领取奖励则记录奖励ID
  124 + level_reward = true, -- 等级变动奖励,json格式记录,{道具ID1:道具数量,道具ID2:道具数量}
  125 + },
  126 + onGuidePoint = { --游戏引导
  127 + guild_type = true, --引导类型,新手引导:0,系统引导:1,弱引导:2
  128 + guild_id = true, --节点ID
  129 + guild_point = true, --步骤ID
  130 + guild_pass = true, --正常操作:0,自动播放:1,跳过:2
  131 + },
  132 + setOrder = { --玩家订单记录
  133 + order_status = true, -- "订单状态:100 - 开始下单(玩家还未开始付费行为记录)200 - 支付完成并发货(SDK通知可以发货时记录),300 - 订单被取消,1000 - 其他"
  134 + item_id = true, -- 道具id
  135 + item_type = true, -- 购买的道具类型,具体见"onItems"方法中道具类型枚举表
  136 + item_name = true, -- 购买的道具名
  137 + item_number = true, -- 购买的道具数量
  138 + item_level = true, -- 购买的道具等级
  139 + order_cost = true, -- 此次消费的现金金额(单位:分),如 51800即未518元,对应客户端SDK传入的'total_fee'
  140 + order_currency = true, -- 货币类型,默认为"CNY"(人民币),遵循ISO 4217规范
  141 + order_type = true, -- 订单类型,首充记录为1,否则为0
  142 + order_id = true, -- 本条记录的订单号,对应客户端SDK返回的'bs_trade_no'
  143 + },
  144 + onMail = { --玩家邮件操作
  145 + mail_action_type = true, -- 操作(1=收,2=领,3=删)
  146 + mail_receivetime = true, -- 收件时间
  147 + mail_textid = true, -- 邮件文本ID
  148 + mial_title = true, -- 邮件标题参数
  149 + mail_content = true, -- 邮件内容参数
  150 + mail_attach = true, -- 邮件附件
  151 + mail_reason = true, -- 原因
  152 + mail_readstatus = true, -- 邮件读取状态
  153 + mail_attachstatus = true, -- 邮件附件状态
  154 + mail_timeout = true, -- 邮件超时时间
  155 + mail_friend_id = true, -- 收件方账号id
  156 + mail_friend_roleid = true, -- 收件方角色id
  157 + },
  158 + onItems = { --道具流通 --TODO
  159 + item_id = true, -- 道具id
  160 + item_sequenceid = "ucode", -- 道具变动关联ID,用于关联一次动作产生多条不同类型的日志,如一个礼包多个物品等情形
  161 + item_type = true, -- 道具类型,具体见枚举表中道具类型枚举表
  162 + item_level = true, -- 道具等级
  163 + item_number = true, -- 道具变化数量的绝对值
  164 + action_type = true, -- 变化类型(玩家获取:1,玩家消耗:0)
  165 + item_before = true, -- 道具变化前的数量
  166 + item_after = true, -- 道具变化后的数量
  167 + item_reason = true, -- 道具流动一级原因,如抽卡、装备强化、副本掉落,可参考道具动作类型枚举表
  168 + item_subreason = true, -- 道具流动二级原因,抽卡:卡池ID,装备强化:装备ID,副本掉落:副本ID
  169 + item_other = true, -- 其他(可包含阶数,强化等级,随机属性)
  170 + },
  171 + mission = { --玩家副本完成情况 --TODO
  172 + mission_threadid = true, -- 大关卡ID
  173 + mission_id = true, -- 关卡ID
  174 + mission_type = true, -- 关卡类型,见关卡类型枚举表
  175 + mission_sequenceid = "ucode", -- 本次对战ID,用于关联一次动作产生多条不同类型的日志
  176 + mission_herolist = true, -- 英雄ID,排序以玩家出战设置为准,PVP多个队伍则记录多个列表。示例:[[1,2,3],[456]]
  177 + mission_heroscore = true, -- 编队总评分
  178 + mission_enemylist = true, -- 地方英雄ID,排序以玩家出战设置为准,PVP多个队伍则记录多个列表。示例:[[1,2,3],[456]]
  179 + mission_damage = true, -- 英雄输出值。示例:{'heroid1':1000,'heroid2':2000,………..}
  180 + mission_ultskill = true, -- 大招使用情况。示例:{'heroid1':1000,'heroid2':2000,………..}
  181 + mission_reward = true, -- 获得奖励,建议使用json格式记录。示例:{ "XX": "1", "XXX": "3"}
  182 + mission_starttime = true, -- 战斗开始时间,格式 unixtime 秒级
  183 + mission_roundtime = true, -- 对局时长(秒)
  184 + mission_result = true, -- 战斗结果(0-无效,1-胜利,2-失败)
  185 + mission_star = true, -- 战斗完成星数,无星级的话填写0
  186 + mission_restriction = true, -- 周期内参与限制(0表示没有上限)
  187 + mission_difficulty = true, -- 关卡困难度,无难度区分的话填写0
  188 + mission_strength = true, -- 消耗的体力或次数
  189 + mission_score = true, -- 本局分数,PVP玩法记录为对战后积分,无得分的填0
  190 + mission_cleartype = true, -- 1正常通关;2代理拾荒
  191 + mission_rank = true, -- 对战后排名,适用于PVP玩法和电波塔,其他玩法留空
  192 + misson_monsterkill = true, -- 击杀怪物ID和数量,建议使用json格式记录。示例:{ "XX": "1", "XXX": "3"}
  193 + misson_teamskill = true, -- 编队支援技能和技能等级情况,json格式记录,{"teamskill1":1,"teamskill2":2,………..}
  194 + misson_teambond = true, -- 编队羁绊和羁绊等级,json格式记录,{"bondid1":1,"bondid2":2,………..}
  195 + },
  196 + residence_reward = { --玩家挂机或排名奖励 --TODO
  197 + mission_threadid = true, --大关卡ID
  198 + mission_id = true, --关卡ID
  199 + mission_type = true, --关卡类型,见关卡类型枚举表
  200 + residence_reward_type = true, --领取奖励方式,快速(超前领取)记录为1,正常领取记录为0
  201 + residence_time = true, --挂机或排名时长
  202 + residence_reward = true, --获得奖励,建议使用json格式记录。示例:{ "XX": "1", "XXX": "3"}
  203 + },
  204 + hero_rise = { --英雄觉醒 --TODO
  205 + hero_id = true, --英雄ID
  206 + hero_rise_cost = true, --英雄觉醒消耗,json格式记录,{道具ID1:消耗数量1,道具ID2:消耗数量2,………...}
  207 + hero_rise_score = true, --英雄觉醒后评分提升
  208 + hero_rise_result = true, --英雄觉醒效果,可记录效果ID,或json格式记录提升效果,{攻击:20,闪避:20,……..}
  209 + },
  210 + hero_upgrade = { --英雄升级 --TODO
  211 + hero_id = true, -- 英雄ID
  212 + hero_upgrade_cost = true, -- 英雄升级消耗,json格式记录,{道具ID1:消耗数量1,道具ID2:消耗数量2,………...}
  213 + hero_upgrade_result = true, -- 英雄升级效果,可记录效果ID,或json格式记录提升效果,{攻击:20,闪避:20,……..}
  214 + hero_upgrade_type = true, -- 英雄升级方式,连续升级:1,单击升级:0
  215 + hero_upgrade_score = true, -- 英雄升级后评分
  216 + hero_upgrade_scoreget = true, -- 通过英雄升级提升的评分
  217 + },
  218 + hero_break = { --英雄突破 --TODO
  219 + hero_id = true, -- 英雄ID
  220 + hero_break_cost = true, -- 英雄突破消耗,json格式记录,{道具ID1:消耗数量1,道具ID2:消耗数量2,………...}
  221 + hero_break_result = true, -- 英雄突破效果,可记录效果ID,或json格式记录提升效果,{攻击:20,闪避:20,……..}
  222 + hero_break_level = true, -- 英雄突破后等级上限
  223 + },
  224 + hero_talent = { --英雄天赋升级 --TODO
  225 + hero_id = true, -- 英雄ID
  226 + hero_talent_cost = true, -- 英雄天赋升级消耗,json格式记录,{道具ID1:消耗数量1,道具ID2:消耗数量2,………...}
  227 + hero_talent_levelbef = true, -- 英雄技能升级前等级
  228 + hero_talent_level = true, -- 英雄技能升级后等级
  229 + },
  230 + hero_jewel = { --英雄铭文 --TODO
  231 + hero_id = true, -- 英雄ID
  232 + hero_jewel_sequence = true, -- 铭文装备编号,用以关联一次装备时产生的多条日志
  233 + hero_jewel_id = true, -- 铭文ID
  234 + hero_jewel_part = true, -- 铭文装备部位
  235 + hero_jewel_score = true, -- 铭文装备后的英雄分值
  236 + hero_jewel_scorebefore = true, -- 铭文装备前的英雄分值
  237 + hero_jewel_result = true, -- 铭文装备后效果,可记录效果ID,或json格式记录提升效果,{攻击:20,闪避:20,……..}
  238 + },
  239 + hero_note = { --英雄评价 --TODO
  240 + hero_id = true, -- 英雄ID
  241 + hero_note_action = true, -- 英雄评价界面操作,发布评论:0,点赞:1,反对:2
  242 + hero_note_id = true, -- 操作的评价ID
  243 + hero_note_text = true, -- 操作的评价内容
  244 + },
  245 + hero_show = { --展示英雄 --TODO
  246 + hero_id = true, -- 英雄ID
  247 + },
  248 + hero_recycle = { --英雄回收
  249 + hero_recycle_list = true, -- 回收的英雄id列表,建议使用json格式记录。示例:{ "XX": "1", "XXX": "3"}
  250 + hero_recycle_reward = true, -- 回收后获得的奖励,建议使用json格式记录。示例:{ "XX": "1", "XXX": "3"}
  251 + hero_recycle_cnt = true, -- 总回收英雄量
  252 + },
  253 + gacha = { --英雄招募 --TODO
  254 + gacha_id = true, -- 卡池ID
  255 + gacha_type = true, -- 卡池类型
  256 + gacha_up = true, -- 卡池UP角色
  257 + gacha_times = true, -- 抽卡次数
  258 + gacha_reward = true, -- 抽卡结果,建议使用json格式记录。示例:{ "XX": "1", "XXX": "3"}
  259 + currency_type = true, -- 购买道具消耗的货币类型,记录货币ID
  260 + gacha_current = true, -- 购买道具消耗的货币数量
  261 + gacha_cnt = true, -- 此卡池内的计数器
  262 + },
  263 + equip_wear = { --装备穿戴与卸载 --TODO
  264 + hero_id = true, --英雄ID
  265 + equip_id = true, --装备ID
  266 + equip_wear_action = true, --装备操作类型:装备:0,卸载:1
  267 + equip_wear_part = true, --装备部位,记录部位ID
  268 + equip_wear_result = true, --装备操作后结果,记录属性变化,json格式记录,{“aa”:1234,"bb":4567}
  269 + equip_wear_change = true, --装备操作变化值,记录属性变化,记录正负值,json格式记录,{“aa”:1234,"bb":-45}
  270 + equip_wear_mode = true, --用以区分自动装备还是手动装备,自动记录为0,手动记录为1
  271 + equip_wear_seqid = true, --自动穿戴时记录的系列ID,用以关联一次性装备时候产生的多条记录
  272 + },
  273 + equip_upgrade = { --装备升级 --TODO
  274 + hero_id = true, -- 英雄ID
  275 + equip_upgrade_part = true, -- 升级部位,记录部位ID
  276 + equip_id = true, -- 升级后的装备ID
  277 + equip_upgrade_amount = true, -- 升级获取的装备数量
  278 + equip_upgrade_usedid = true, -- 升级消耗的装备ID
  279 + equip_upgrade_cost = true, -- 升级操作消耗装备数量
  280 + equip_upgrade_currentid = true, -- 升级消耗的货币类型
  281 + equip_upgrade_current = true, -- 升级操作消耗货币数量
  282 + },
  283 + carriage_dismantle = { --物资拆解 --TODO
  284 + item_id = true, -- 道具id
  285 + item_sequenceid = "ucode", -- 道具变动关联ID,用于关联一次动作产生多条不同类型的日志,如一个礼包多个物品等情形
  286 + item_type = true, -- 道具类型,具体见枚举表中道具类型枚举表
  287 + item_level = true, -- 道具等级
  288 + item_number = true, -- 道具变化数量的绝对值
  289 + carriage_dismantle_type = true, -- 拆解方式,时间到期:0,钥匙开启:1
  290 + carriage_dismantle_time = true, -- 拆解耗时,填写实际耗时
  291 + carriage_dismantle_cost = true, -- 拆解花费钥匙数量,未使用填写0
  292 + carriage_dismantle_rwd = true, -- 拆解获得物资,json格式记录,{'itemid1':2,'itemid2':3,…………..}
  293 + },
  294 + carriage_logistics = { --后勤室 --TODO
  295 + carriage_logistics_type = true, -- 后勤室制作类型ID,变异:0,通常:1,魔法:2
  296 + carriage_logistics_itemid = true, -- 后勤室升级物品或技能ID
  297 + carriage_logistics_itemlv = true, -- 升级后物品或技能等级
  298 + carriage_logistics_gear = true, -- 后勤室升级花费齿轮数量
  299 + carriage_logistics_coin = true, -- 后勤室升级花费美食币数量
  300 + },
  301 + carriage_decals = { --贴纸拆解 --TODO
  302 + item_id = true, --道具id
  303 + item_sequenceid = "ucode", --道具变动关联ID,用于关联一次动作产生多条不同类型的日志,如一个礼包多个物品等情形
  304 + item_type = true, --道具类型,具体见枚举表中道具类型枚举表
  305 + item_level = true, --道具等级
  306 + item_number = true, --道具变化数量的绝对值
  307 + carriage_decals_rwdid = true, --拆解获得物资ID
  308 + carriage_decals_rwdnum = true, --拆解获得物资数量
  309 + },
  310 + carriage_video = { --放映室 --TODO
  311 + carriage_video_type = true, --放映室类型,剧情CG:0, 角色CG:1, 主线剧情:2, 角色剧情:3, 活动剧情:4, 图鉴:5
  312 + carriage_video_id = true, --放映室片段ID
  313 + carriage_video_coinid = true, --放映奖励货币类型,无奖励则填写0
  314 + carriage_video_coinnum = true, --放映奖励货币数量,无奖励则填写0
  315 + carriage_video_item = true, --放映奖励其他物品数量,json格式记录,{'itemid1':10,'itemid2':5,…………..},无奖励则填写0
  316 + },
  317 + carriage_cook = { --调理室 --TODO
  318 + item_id = true, -- 道具id
  319 + item_level = true, -- 道具等级
  320 + item_type = true, -- 道具类型,具体见枚举表中道具类型枚举表
  321 + carriage_cook_amount = true, -- 制作总量
  322 + carriage_cook_cost = true, -- 制作消耗道具,json格式记录,{'itemid1':10,'itemid2':5,…………..}
  323 + },
  324 + activity = { --活动或指南奖励 --TODO
  325 + activity_id = true, -- 活动ID(或活动指定任务的ID)
  326 + activity_type = true, -- 活动类型,见活动类型枚举表
  327 + activity_reward = true, -- 活动奖励,json格式记录,{'itemid1':123,'itemid2':456,………...}
  328 + },
  329 + task_reward = { --任务奖励 --TODO
  330 + task_reward_id = true, --任务奖励ID
  331 + task_reward_type = true, --任务奖励类型,见 任务奖励类型枚举表
  332 + task_reward_detail = true, --任务奖励,json格式记录,{'itemid1':123,'itemid2':456,………...}
  333 + },
  334 + shop_purchase = { --商店购买行为 --TODO
  335 + item_id = true, -- 道具id
  336 + item_sequenceid = "ucode", -- 道具变动关联ID,用于关联一次动作产生多条不同类型的日志,如一个购买礼包多个物品等情形
  337 + item_type = true, -- 道具类型,具体见枚举表中道具类型枚举表
  338 + item_level = true, -- 道具等级
  339 + item_cnt = true, -- 购买数量技术
  340 + currency_type = true, -- 购买道具消耗的货币类型,记录货币ID
  341 + shop_purchase_current = true, -- 购买道具消耗的货币数量
  342 + shop_id = true, -- 商店ID
  343 + },
  344 + friend_opt = { --好友操作 --TODO
  345 + friend_opt_type = true, -- 好友操作类型,见枚举表中 好友操作类型枚举表
  346 + friend_accountid = true, -- 好友账户id
  347 + friend_roleid = true, -- 好友账户下的角色id
  348 + friend_cnt = true, -- 操作后好友数量
  349 + },
  350 + friend_list = { --好友列表 --TODO
  351 + friend_accountid = true, --好友账户id
  352 + friend_roleid = true, --好友账户下的角色id
  353 + },
  354 + friend_black = { --黑名单列表 --TODO
  355 + friend_accountid = true, -- 好友账户id
  356 + friend_roleid = true, -- 好友账户下的角色id
  357 + },
  358 + communication = { --玩家发言 --TODO
  359 + publish_type = true, --发言类型,全部:0,公告:1,世界:2,联盟:3,私聊:4
  360 + publish_status = true, --发送状态,发送成功:0,发送失败:1,被屏蔽:2,其他:3
  361 + publish_receive_accid = true, --接收者账户ID
  362 + publish_receive_roleid = true, --接收者角色ID
  363 + publish_text = true, --发言内容
  364 + },
  365 + restaurant_up = { --摊位升级 --TODO
  366 + restaurant_up_type = true, --升级部件类型,店面:0, 接客:1, 满意度:2, 宣传:3, 广告:4, 周边:5
  367 + restaurant_up_gear = true, --消耗齿轮数量
  368 + restaurant_up_coin = true, --花费美食币数量
  369 + restaurant_up_effectbef = true, --升级前加成
  370 + restaurant_up_effect = true, --升级后加成
  371 + },
  372 + restaurant_sale = { --摊位售卖 --TODO
  373 + item_id = true, -- 售卖物品ID
  374 + restaurant_sale_seat = true, -- 售卖物品所在位置
  375 + restaurant_sale_time = true, -- 售卖时长
  376 + restaurant_sale_type = true, -- 售卖方式,正常售卖:0, 加速:1,移除售卖:2
  377 + restaurant_sale_coin = true, -- 售卖获得美食币
  378 + restaurant_sale_gear = true, -- 售卖获得齿轮
  379 + },
  380 + restaurant_material = { --食材获取 --TODO
  381 + item_id = true, -- 获取物品ID
  382 + restaurant_material_seqid = true, -- 道具变动关联ID,用于关联一次动作产生多条不同类型的日志,如一次获取两件道具情况
  383 + restaurant_material_start = true, -- 申请获取时间
  384 + restaurant_material_time = true, -- 申请到领取耗时
  385 + restaurant_material_num = true, -- 获取物品数量
  386 + },
  387 + restaurant_order = { --订单任务 --TODO
  388 + restaurant_order_id = true, -- 订单任务ID
  389 + restaurant_order_status = true, -- 订单任务状态,接受:0, 拒绝:1, 完成:2
  390 + restaurant_order_start = true, -- 订单接收时间,timestamp格式记录
  391 + restaurant_order_rwd = true, -- 订单完成奖励,json格式记录,{"itemid1":123,"itemid2":12,……….}
  392 + restaurant_order_lv = true, -- 订单品质等级,普通:0, 稀有:1, 顶级:2, 豪华:3
  393 + },
  394 + restaurant_collect = { --餐厅顾客图谱 --TODO
  395 + restaurant_collect_id = true, -- 图谱收集ID
  396 + restaurant_collect_rwd = true, -- 订单完成奖励,json格式记录,{"itemid1":123,"itemid2":12,……….}
  397 + restaurant_collect_plan = true, -- 收集进度,即解锁顾客,数字表示
  398 + },
  399 + achievement = { --成就达成 --TODO
  400 + achievement_id = true, -- 成就id
  401 + achievement_type = true, -- 成就类型,具体枚举表中成就类型枚举表
  402 + achievement_name = true, -- 成就名称
  403 + achievement_score = true, -- 领取成就后成就点数
  404 + achievement_subscore = true, -- 领取成就后小类成就点数
  405 + achievement_reward = true, -- 达成成就奖励,json格式记录,{"itemid1":123,"itemid2":12,……….}
  406 + },
  407 + get_gift = { --礼包兑换 --TODO
  408 + gift_id = true, -- 礼包ID
  409 + gift_key = true, -- 礼包key
  410 + gift_reward = true, -- 礼包奖励,json格式记录,{"itemid1":123,"itemid2":12,……….}
  411 + gift_name = true, -- 礼包名称
  412 + gift_reason = true, -- 礼包发放原因,见发放原因枚举表
  413 + },
73 414 }
74 415  
75   -local function printError(info)
76   - print(info)
77   - print(debug.traceback())
  416 +local function isIos(self)
  417 + local sid = self:getProperty("sid")
  418 + return sid == 2
78 419 end
79 420  
80   -local function checkType(logType, field, value, ctype)
81   - local typecheckfunc = {
82   - keyword = function()
83   - --长度不超过256
84   - if type(value) ~= "string" then
85   - value = tostring(value)
86   - printError(string.format("LOG ERROR: logType [%s] field [%s] isn't [keyword], value : %s", logType, field, value))
87   - else
88   - if #value > 256 then
89   - printError(string.format("LOG ERROR: logType [%s] field [%s] [keyword] type to long. value : %s", logType, field, value))
90   - end
91   - end
92   - return value
93   - end,
94   - text = function()
95   - if type(value) ~= "string" then
96   - value = tostring(value)
97   - printError(string.format("LOG ERROR: logType [%s] field [%s] isn't [text], value : %s", logType, field, value))
98   - end
99   - return value
100   - end,
101   - integer = function()
102   - if type(value) ~= "number" then
103   - value = tonumber(value)
104   - printError(string.format("LOG ERROR: logType [%s] field [%s] isn't [integer], value : %s", logType, field, value))
105   - end
106   - if value then
107   - if math.type(value) ~= "integer" then
108   - local oldValue = value
109   - value = math.floor(value)
110   - if value ~= oldValue then
111   - printError(string.format("LOG ERROR: logType [%s] field [%s] isn't [integer], is float, value : %s", logType, field, value))
112   - end
113   - end
114   - if -2147483648 > value or value > 2147483647 then
115   - printError(string.format("LOG ERROR: logType [%s] field [%s] isn't [integer], too big, value : %s", logType, field, value))
116   - value = nil
117   - end
118   - end
119   - return value
120   - end,
121   - short = function()
122   - if type(value) ~= "number" then
123   - value = tonumber(value)
124   - printError(string.format("LOG ERROR: logType [%s] field [%s] isn't [short], value : %s", logType, field, value))
125   - end
126   - if value then
127   - if math.type(value) ~= "integer" then
128   - local oldValue = value
129   - value = math.floor(value)
130   - if value ~= oldValue then
131   - printError(string.format("LOG ERROR: logType [%s] field [%s] isn't [short], is float, value : %s", logType, field, value))
132   - end
133   - end
134   -
135   - if -32768 > value or value > 32768 then
136   - printError(string.format("LOG ERROR: logType [%s] field [%s] isn't [short], too big, value : %s", logType, field, value))
137   - value = nil
138   - end
139   - end
140   - return value
141   - end,
142   - long = function()
143   - if type(value) ~= "number" then
144   - value = tonumber(value)
145   - printError(string.format("LOG ERROR: logType [%s] field [%s] isn't [long], value : %s", logType, field, value))
146   - end
147   - if value then
148   - if math.type(value) ~= "integer" then
149   - local oldValue = value
150   - value = math.floor(value)
151   - if type(value) ~= "integer" then
152   - printError(string.format("LOG ERROR: logType [%s] field [%s] isn't [long], too big, value : %s", logType, field, value))
153   - value = nil
154   - elseif value ~= oldValue then
155   - printError(string.format("LOG ERROR: logType [%s] field [%s] isn't [long], is float, value : %s", logType, field, value))
156   - end
157   - end
158   - end
159   - return value
160   - end,
161   - float = function()
162   - if type(value) ~= "number" then
163   - value = tonumber(value)
164   - printError(string.format("LOG ERROR: logType [%s] field [%s] isn't [float], value : %s", logType, field, value))
165   - end
166   - return value
167   - end,
  421 +local appid, sdkId
  422 +local function getBaseLog(self)
  423 + local uid = self:getProperty("uid")
  424 + if not appid then
  425 + appid, sdkId = string.match(uid, "(.*)_(.*)")
  426 + if not appid then
  427 + sdkId = uid
  428 + appid = 0
  429 + end
  430 + end
  431 + local log = {
  432 + server_id = server_id,
  433 + timestamp = skynet.timex(),
  434 + app_id = appid,
  435 + plat_id = isIos(self) and 0 or 1,
  436 + sdk_uid = sdkId,
  437 + account_id = uid,
  438 + role_id = self:getProperty("id"),
  439 + role_name = self:getProperty("name"),
  440 + level = self:getProperty("level"),
  441 + vip = 0,
  442 + device_id = self:getProperty("device"),
  443 + device_model = self:getProperty("dmode"),
  444 + version = "v2.0.1",
  445 + client_version = self.clientVersion or "1.0.0",
  446 + sys_version = self.sysVersion or "unknow",
  447 + ip = self.ip or "0.0.0.0",
  448 + network = self.network or "unknow",
  449 + record_date = os.date("%Y%m%d"),
168 450 }
  451 + return log
  452 +end
169 453  
170   - if typecheckfunc[ctype] then
171   - return typecheckfunc[ctype]()
172   - else
173   - printError(string.format("LOG ERROR: logType [%s] field [%s] have a new type [%s] need add check.", logType, field, ctype))
174   - return nil
175   - end
  454 +local function printError(info)
  455 + print(info)
  456 + print(debug.traceback())
176 457 end
177 458  
178 459 local RoleLog = {}
179 460 function RoleLog.bind(Role)
180   - function Role:log(logType, contents)
  461 +
  462 + function Role:log()
  463 + end
  464 +
  465 + function Role:log_new(logType, contents)
181 466 contents = contents or {}
182   - local _logType = LogType[logType]
183   - if not _logType then
184   - printError(string.format("LOG ERROR: new logType [%s] need Add Maping.", logType))
  467 + local schema = MethodType[logType]
  468 + if not schema then
  469 + printError(string.format("LOG ERROR: new logType [%s].", logType))
185 470 return
186 471 end
187   - local doc = {}
188   - for field, ctype in pairs(commonRoleField) do
189   - if contents[field] then
190   - printError(string.format("LOG ERROR: logType [%s] had field [%s] overwrite default.", logType, field))
191   - end
192   - doc[field] = checkType("commonRoleField", field, self:getProperty(field), ctype)
193   - end
  472 + local doc = getBaseLog(self)
194 473  
195   - local mapping = Mapping[_logType]
196   - if mapping["ucode"] and not contents["ucode"] then
197   - contents["ucode"] = self:getActionUcode()
  474 + doc["method"] = logType
  475 + for field, value in pairs(contents) do
  476 + if not schema[ftype] then
  477 + printError(string.format("LOG ERROR: logType [%s] have new field [%s], call yunying.", logType, field))
  478 + end
198 479 end
199 480  
200   - for field, value in pairs(contents) do
201   - local ftype = mapping[field]
202   - if ftype then
203   - doc[field] = checkType(logType, field, value, ftype)
204   - else
205   - printError(string.format("LOG ERROR: logType [%s] have new field [%s] no type in mapping.", logType, field))
  481 + for field, tag in pairs(schema) do
  482 + if not contents[field] then
  483 + if tag == "ucode" then
  484 + contents[field] = self:getActionUcode()
  485 + else
  486 + printError(string.format("LOG ERROR: logType [%s] lose field [%s].", logType, field))
  487 + end
206 488 end
207 489 end
208 490 if not logd then return end
209   - pcall(skynet.send, logd, "lua", "log", logType, doc, _logType)
  491 + pcall(skynet.send, logd, "lua", "log", doc)
210 492 end
211 493  
  494 +
212 495 function Role:startActionUcode()
213 496 if not self._uniqueCount then
214 497 self._uniqueCount = 0
... ... @@ -225,7 +508,8 @@ function RoleLog.bind(Role)
225 508  
226 509 function Role:getActionUcode()
227 510 return self._actionUcode
228   - end
  511 + end
  512 +
229 513  
230 514 end
231 515 return RoleLog
232 516 \ No newline at end of file
... ...
src/models/RolePlugin.lua
... ... @@ -207,6 +207,7 @@ function RolePlugin.bind(Role)
207 207  
208 208 function Role:addPlayExp(addExp, params)
209 209 local level = self:getProperty("level")
  210 + local oldLevel = level
210 211 if not csvdb["player_expCsv"][level + 1] then
211 212 return
212 213 end
... ... @@ -222,20 +223,13 @@ function RolePlugin.bind(Role)
222 223 newExp = csvdb["player_expCsv"][level].exp - 1 -- 没有下一级了 经验溢出太多 扣除
223 224 end
224 225 end
225   -
226   - if params.log then
227   - local log = clone(params.log)
228   - if log["cint1"] or log["cint2"] then
229   - print("addPlayExp error log have cint1 or cint2 or cint3", debug.traceback())
230   - end
231   -
232   - log["cint1"] = addExp
233   - log["cint2"] = newExp
234   - log["cint3"] = level
235   -
236   - self:log("player_exp", log)
237   - else
238   - print("addPlayExp no log ", debug.traceback())
  226 + if level > oldLevel then
  227 + self:log("setLevel", {
  228 + level_before = oldLevel,
  229 + level_changemain = params.level_changemain,
  230 + level_changedetail = 0,
  231 + level_reward = "{}",
  232 + })
239 233 end
240 234  
241 235 self:updateProperties({level = level, exp = newExp})
... ... @@ -1511,8 +1505,8 @@ function RolePlugin.bind(Role)
1511 1505 SendPacket(actionCodes.Store_ayncPurchaseRpc, MsgPack.pack({ result = "handled" }))
1512 1506 return
1513 1507 end
1514   -
1515   - local rechargeData = csvdb["shop_rechargeCsv"][orderObject:getProperty("rechargeId")]
  1508 + local rechargeId = orderObject:getProperty("rechargeId")
  1509 + local rechargeData = csvdb["shop_rechargeCsv"][rechargeId]
1516 1510 if rechargeData.rmb ~= tonumber(params.amount) then
1517 1511 skynet.error(string.format("fake order: %s, roleId: %d, order: %s, rmb %s, get %s",
1518 1512 params.transactionId, roleId, partnerOrderStr, rechargeData.rmb, params.amount
... ... @@ -1520,16 +1514,34 @@ function RolePlugin.bind(Role)
1520 1514 return
1521 1515 end
1522 1516  
1523   - local reward = self:recharge({
1524   - id = orderObject:getProperty("rechargeId"),
1525   - transactionId = params.transactionId,
1526   - pay_time = params.pay_time,
1527   - order = partnerOrderStr
  1517 + local order_type = self.getProperty("rmbC") > 0 and 0 or 1
  1518 + local status, reward = self:recharge({
  1519 + id = rechargeId
1528 1520 })
1529 1521 orderObject:setProperty("finishTime", skynet.time())
1530 1522 orderObject:setProperty("status", "finish")
1531 1523  
1532 1524 redisproxy:srem(string.format("role:%d:orders", roleId), partnerOrderStr)
  1525 +
  1526 + if not status then
  1527 + status = 200
  1528 + else
  1529 + status = 1000 + status
  1530 + end
  1531 + role:log("setOrder", {
  1532 + order_status = status, -- "订单状态:100 - 开始下单(玩家还未开始付费行为记录)200 - 支付完成并发货(SDK通知可以发货时记录),300 - 订单被取消,1000 - 其他"
  1533 + item_id = rechargeId, -- 道具id
  1534 + item_type = rechargeData.type, -- 购买的道具类型,具体见"onItems"方法中道具类型枚举表
  1535 + item_name = rechargeData.title, -- 购买的道具名
  1536 + item_number = 1, -- 购买的道具数量
  1537 + item_level = 1, -- 购买的道具等级
  1538 + order_cost = rechargeData.rmb * 100, -- 此次消费的现金金额(单位:分),如 51800即未518元,对应客户端SDK传入的'total_fee'
  1539 + order_currency = "CNY", -- 货币类型,默认为"CNY"(人民币),遵循ISO 4217规范
  1540 + order_type = order_type, -- 订单类型,首充记录为1,否则为0
  1541 + order_id = params.transactionId, -- 本条记录的订单号,对应客户端SDK返回的'bs_trade_no'
  1542 + })
  1543 + if status ~= 200 then return end
  1544 +
1533 1545 SendPacket(actionCodes.Store_ayncPurchaseRpc, MsgPack.pack({ order = partnerOrderStr,
1534 1546 result = "success", reward = reward}))
1535 1547  
... ... @@ -1542,11 +1554,11 @@ function RolePlugin.bind(Role)
1542 1554 local rechargeData = csvdb["shop_rechargeCsv"][id]
1543 1555 if not rechargeData then
1544 1556 skynet.error("recharge id not exist", id)
1545   - return
  1557 + return 1
1546 1558 end
1547 1559  
1548 1560 if not self.storeData:checkRechargeRecord(rechargeData.limit, id) then
1549   - return 1
  1561 + return 2
1550 1562 end
1551 1563  
1552 1564 local diamondCount = 0
... ... @@ -1561,13 +1573,13 @@ function RolePlugin.bind(Role)
1561 1573 end
1562 1574 self:gainDiamond({count = diamondCount, isRecharge = true, log = {desc = "recharge", int1 = id}})
1563 1575 elseif rechargeData.shop == 2 then --通行证商店
1564   - reward, _ = self:award(rechargeData.itemFirst, {log = {desc = "recharge", int1 = id}})
  1576 + reward, _ = self:award(rechargeData.itemFirst, {isRecharge = true, log = {desc = "recharge", int1 = id}})
1565 1577 self.storeData:onBuyCard(rechargeData.type, rechargeData.time)
1566 1578 elseif rechargeData.shop == 3 then -- 礼包商店
1567   - reward, _ = self:award(rechargeData.itemFirst, {log = {desc = "recharge", int1 = id}})
  1579 + reward, _ = self:award(rechargeData.itemFirst, {isRecharge = true, log = {desc = "recharge", int1 = id}})
1568 1580 else
1569 1581 skynet.error("invalid recharge shop type " .. id)
1570   - return
  1582 + return 3
1571 1583 end
1572 1584  
1573 1585 if diamondCount > 0 then
... ... @@ -1577,10 +1589,8 @@ function RolePlugin.bind(Role)
1577 1589 -- 累充
1578 1590 local rmb = rechargeData.rmb
1579 1591 self:updateProperty({field = "rmbC", delta = rmb})
1580   -
1581   - self:log("role_action", {desc = "recharge", int1 = id, int2 = rmb, key1 = params.transactionId, key2 = params.order, long1 = params.pay_time})
1582 1592  
1583   - return reward
  1593 + return nil, reward
1584 1594 end
1585 1595  
1586 1596 --直接给玩家发送邮件,立即推送小红点
... ...
src/services/agent_ctrl.lua
... ... @@ -128,7 +128,7 @@ function _M:check_agent_status()
128 128 next_log_time = now + 60
129 129 local count = table_nums(self.u2f)
130 130 datacenter.set("onlineCount", count)
131   - pcall(skynet.send, logd, "lua", "log", "online", {count = count}, "online")
  131 + -- pcall(skynet.send, logd, "lua", "log", "online", {count = count}, "online")
132 132 end
133 133 end
134 134  
... ...
src/services/logd.lua
... ... @@ -55,38 +55,11 @@ skynet.register_protocol {
55 55 end
56 56 }
57 57  
58   -
59   -
60   --- 日志 index 不包含 日期的 index_suffix
61   -local IndexNoDate = {
62   - online = true,
63   -}
64   --- 不走 role log 的日志都要自行注意 mapping 设置【重要】
65   --- index_suffix index 后缀 默认为 common
66   -function CMD.log(logType, doc, index_suffix)
67   - index_suffix = index_suffix or "common"
68   - if index_suffix == "common" then
69   - doc["@type"] = logType
70   - else
71   - if logType ~= index_suffix then -- 定制后缀 不一定有type 不相等时才有type
72   - doc["@type"] = logType
73   - end
74   - end
75   -
76   - local now = skynet.timex()
77   - doc["timestamp"] = now
78   - doc["timestamp_f"] = os.date("%Y-%m-%d %H:%M:%S", now)
79   - doc["server"] = serverId
80   -
81   - -- 自己加好 index
82   - if IndexNoDate[index_suffix] then
83   - doc["@index"] = string.format("gamelog-%s", index_suffix)
84   - else
85   - doc["@index"] = string.format("gamelog-%s-%s", os.date("%Y%m%d", now), index_suffix)
86   - end
  58 +function CMD.log(doc)
87 59 if not socketdriver.send(log_fd, json.encode(doc) .. "\n") then
88 60 if not connecting then
89 61 CMD.open() -- 连一下试试
  62 + socketdriver.send(log_fd, json.encode(doc) .. "\n")
90 63 end
91 64 end
92 65 end
... ...