Commit 39bcd7ca0c7586e8f2403dd228d8d0188b4af7e5
1 parent
a608cccb
LOG
Showing
9 changed files
with
601 additions
and
285 deletions
Show diff stats
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 | ... | ... |