Commit 39bcd7ca0c7586e8f2403dd228d8d0188b4af7e5

Authored by zhouhaihai
1 parent a608cccb

LOG

src/actions/EmailAction.lua
@@ -53,7 +53,6 @@ function _M.listRpc(agent, data) @@ -53,7 +53,6 @@ function _M.listRpc(agent, data)
53 content = email.content, 53 content = email.content,
54 attachments = email.attachments 54 attachments = email.attachments
55 }) 55 })
56 - role:log("mail_action", {desc = "get_global", key1 = email.title, key2 = email.attachments})  
57 end 56 end
58 end 57 end
59 end 58 end
@@ -90,21 +89,17 @@ function _M.drawAllAttachRpc(agent, data) @@ -90,21 +89,17 @@ function _M.drawAllAttachRpc(agent, data)
90 local ids = {} 89 local ids = {}
91 90
92 local emails = loadEmails(roleId) 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 end 100 end
106 end 101 end
107 - end) 102 + end
108 reward, change = role:award(reward, {log = {desc = "draw_attach"}}) 103 reward, change = role:award(reward, {log = {desc = "draw_attach"}})
109 SendPacket(actionCodes.Email_drawAllAttachRpc, MsgPack.pack({ids = ids, reward = reward, change = change})) 104 SendPacket(actionCodes.Email_drawAllAttachRpc, MsgPack.pack({ids = ids, reward = reward, change = change}))
110 return true 105 return true
@@ -125,10 +120,10 @@ function _M.drawAttachRpc(agent, data) @@ -125,10 +120,10 @@ function _M.drawAttachRpc(agent, data)
125 if attachments == "" then return end 120 if attachments == "" then return end
126 121
127 local reward, change = role:award(attachments, {log = {desc = "draw_attach", int1 = emailId, key1 = email:getProperty("title")}}) 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 SendPacket(actionCodes.Email_drawAttachRpc, MsgPack.pack({reward = reward, change = change})) 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 return true 127 return true
133 end 128 end
134 129
@@ -139,11 +134,11 @@ function _M.checkRpc(agent, data) @@ -139,11 +134,11 @@ function _M.checkRpc(agent, data)
139 local msg = MsgPack.unpack(data) 134 local msg = MsgPack.unpack(data)
140 local id = msg.id 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 SendPacket(actionCodes.Email_checkRpc, '') 143 SendPacket(actionCodes.Email_checkRpc, '')
149 return true 144 return true
@@ -171,6 +166,7 @@ function _M.delRpc(agent, data) @@ -171,6 +166,7 @@ function _M.delRpc(agent, data)
171 attachments = emailData.attachment 166 attachments = emailData.attachment
172 end 167 end
173 if status == 2 or (status == 1 and attachments:len() == 0) then 168 if status == 2 or (status == 1 and attachments:len() == 0) then
  169 + email:log(role, 3)
174 red:lrem(rds, 0, id) 170 red:lrem(rds, 0, id)
175 red:del(emailRds) 171 red:del(emailRds)
176 result[tonum(id)] = 1 172 result[tonum(id)] = 1
@@ -178,9 +174,6 @@ function _M.delRpc(agent, data) @@ -178,9 +174,6 @@ function _M.delRpc(agent, data)
178 end 174 end
179 end 175 end
180 end) 176 end)
181 - for delId, _ in ipairs(result) do  
182 - role:log("mail_action", {desc = "del_mail", int1 = delId})  
183 - end  
184 SendPacket(actionCodes.Email_delRpc, MsgPack.pack({result = result})) 177 SendPacket(actionCodes.Email_delRpc, MsgPack.pack({result = result}))
185 return true 178 return true
186 end 179 end
src/actions/RoleAction.lua
@@ -99,6 +99,29 @@ function _M.loginRpc( agent, data ) @@ -99,6 +99,29 @@ function _M.loginRpc( agent, data )
99 role:reloadWhenLogin() 99 role:reloadWhenLogin()
100 end 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 if not msg.isGMlogin then 125 if not msg.isGMlogin then
103 local banTime = role:getProperty("banTime") 126 local banTime = role:getProperty("banTime")
104 if banTime > now then 127 if banTime > now then
@@ -114,18 +137,7 @@ function _M.loginRpc( agent, data ) @@ -114,18 +137,7 @@ function _M.loginRpc( agent, data )
114 role:setBan(0) 137 role:setBan(0)
115 end 138 end
116 end 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 SERV_OPEN = redisproxy:hget("autoincrement_set", "server_start") 142 SERV_OPEN = redisproxy:hget("autoincrement_set", "server_start")
131 143
@@ -266,7 +278,7 @@ function _M.loginRpc( agent, data ) @@ -266,7 +278,7 @@ function _M.loginRpc( agent, data )
266 role:savePvpHTeam() 278 role:savePvpHTeam()
267 279
268 local hangPass = role:getProperty("hangPass") 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 return true 283 return true
272 end 284 end
@@ -314,11 +326,20 @@ function _M.createRpc(agent, data) @@ -314,11 +326,20 @@ function _M.createRpc(agent, data)
314 return true 326 return true
315 end 327 end
316 newRole:startActionUcode() 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 newRole:award(globalCsv.birthItem, {log = {desc = "birth"}, notNotify = true}) 334 newRole:award(globalCsv.birthItem, {log = {desc = "birth"}, notNotify = true})
318 -- 欢迎邮件 335 -- 欢迎邮件
319 redisproxy:insertEmail({roleId = roleId, emailId = 1}) 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 SendPacket(actionCodes.Role_createRpc, MsgPack.pack(response)) 344 SendPacket(actionCodes.Role_createRpc, MsgPack.pack(response))
324 return true 345 return true
@@ -1011,6 +1032,7 @@ function _M.guideRpc(agent, data) @@ -1011,6 +1032,7 @@ function _M.guideRpc(agent, data)
1011 role:saveGuide(master, slave) 1032 role:saveGuide(master, slave)
1012 funcGuide = funcGuide:setv(master * 1000 + slave, 1) 1033 funcGuide = funcGuide:setv(master * 1000 + slave, 1)
1013 role:updateProperty({field = "funcGuide", value = funcGuide}) 1034 role:updateProperty({field = "funcGuide", value = funcGuide})
  1035 + role:log("onGuidePoint", {guild_type = 0, guild_id = master, guild_point = slave, guild_pass = 0})
1014 elseif cmdType == 2 then 1036 elseif cmdType == 2 then
1015 -- 系统引导(玩家可选择是否进行) 1037 -- 系统引导(玩家可选择是否进行)
1016 if not msg.skip then return end 1038 if not msg.skip then return end
@@ -1023,7 +1045,7 @@ function _M.guideRpc(agent, data) @@ -1023,7 +1045,7 @@ function _M.guideRpc(agent, data)
1023 1045
1024 if msg.funcType then 1046 if msg.funcType then
1025 funcGuide = funcGuide:setv(msg.funcType, 1) 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 end 1049 end
1028 role:updateProperty({field = "funcGuide", value = funcGuide}) 1050 role:updateProperty({field = "funcGuide", value = funcGuide})
1029 elseif cmdType == 3 then 1051 elseif cmdType == 3 then
@@ -1032,14 +1054,14 @@ function _M.guideRpc(agent, data) @@ -1032,14 +1054,14 @@ function _M.guideRpc(agent, data)
1032 role:saveGuide(csvdb["guide_unlockCsv"][msg.funcType].guideId,1) 1054 role:saveGuide(csvdb["guide_unlockCsv"][msg.funcType].guideId,1)
1033 funcGuide = funcGuide:setv(msg.funcType, 1) 1055 funcGuide = funcGuide:setv(msg.funcType, 1)
1034 role:updateProperty({field = "funcGuide", value = funcGuide}) 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 end 1058 end
1037 elseif cmdType == 4 then 1059 elseif cmdType == 4 then
1038 -- 弹出一个tips(进入功能界面也许要自动弹说明,value要区分1、2) 1060 -- 弹出一个tips(进入功能界面也许要自动弹说明,value要区分1、2)
1039 if msg.funcType then 1061 if msg.funcType then
1040 local value = msg.value or 1 1062 local value = msg.value or 1
1041 for _, funcIdx in pairs(msg.funcType:toArray(true,"=")) do 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 funcGuide = funcGuide:setv(funcIdx, value) 1065 funcGuide = funcGuide:setv(funcIdx, value)
1044 end 1066 end
1045 role:updateProperty({field = "funcGuide", value = funcGuide}) 1067 role:updateProperty({field = "funcGuide", value = funcGuide})
src/actions/StoreAction.lua
@@ -31,6 +31,7 @@ function _M.rechargeRpc(agent , data) @@ -31,6 +31,7 @@ function _M.rechargeRpc(agent , data)
31 local partnerOrderId = makeOrder(roleId, id) 31 local partnerOrderId = makeOrder(roleId, id)
32 SendPacket(actionCodes.Store_rechargeRpc, MsgPack.pack({ order = partnerOrderId })) 32 SendPacket(actionCodes.Store_rechargeRpc, MsgPack.pack({ order = partnerOrderId }))
33 33
  34 +
34 -- 测试的 直接发奖励了 35 -- 测试的 直接发奖励了
35 skynet.timeout(10, function () 36 skynet.timeout(10, function ()
36 role:handlePurchase({ 37 role:handlePurchase({
@@ -164,6 +165,22 @@ function _M.purchaseOrderResult(agent, data) @@ -164,6 +165,22 @@ function _M.purchaseOrderResult(agent, data)
164 165
165 if msg.status == "success" then 166 if msg.status == "success" then
166 orderObject:setProperty("transactionId", msg.platformOrder or "") 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 return true 184 return true
168 end 185 end
169 186
@@ -282,7 +282,7 @@ function CMD.close() @@ -282,7 +282,7 @@ function CMD.close()
282 mcast_util.usub_union() 282 mcast_util.usub_union()
283 local role = agentInfo.role 283 local role = agentInfo.role
284 if not role then return end 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 role:onOfflineEvent() 286 role:onOfflineEvent()
287 end 287 end
288 288
src/models/Email.lua
@@ -18,6 +18,23 @@ Email.schema = { @@ -18,6 +18,23 @@ Email.schema = {
18 rewardPms = {"table", {}}, 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 function Email:data() 38 function Email:data()
22 local emailId = self:getProperty("emailId") 39 local emailId = self:getProperty("emailId")
23 local title = self:getProperty("title") 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 end 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 end 457 end
177 458
178 local RoleLog = {} 459 local RoleLog = {}
179 function RoleLog.bind(Role) 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 contents = contents or {} 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 return 470 return
186 end 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 end 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 end 488 end
207 end 489 end
208 if not logd then return end 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 end 492 end
211 493
  494 +
212 function Role:startActionUcode() 495 function Role:startActionUcode()
213 if not self._uniqueCount then 496 if not self._uniqueCount then
214 self._uniqueCount = 0 497 self._uniqueCount = 0
@@ -225,7 +508,8 @@ function RoleLog.bind(Role) @@ -225,7 +508,8 @@ function RoleLog.bind(Role)
225 508
226 function Role:getActionUcode() 509 function Role:getActionUcode()
227 return self._actionUcode 510 return self._actionUcode
228 - end 511 + end
  512 +
229 513
230 end 514 end
231 return RoleLog 515 return RoleLog
232 \ No newline at end of file 516 \ No newline at end of file
src/models/RolePlugin.lua
@@ -207,6 +207,7 @@ function RolePlugin.bind(Role) @@ -207,6 +207,7 @@ function RolePlugin.bind(Role)
207 207
208 function Role:addPlayExp(addExp, params) 208 function Role:addPlayExp(addExp, params)
209 local level = self:getProperty("level") 209 local level = self:getProperty("level")
  210 + local oldLevel = level
210 if not csvdb["player_expCsv"][level + 1] then 211 if not csvdb["player_expCsv"][level + 1] then
211 return 212 return
212 end 213 end
@@ -222,20 +223,13 @@ function RolePlugin.bind(Role) @@ -222,20 +223,13 @@ function RolePlugin.bind(Role)
222 newExp = csvdb["player_expCsv"][level].exp - 1 -- 没有下一级了 经验溢出太多 扣除 223 newExp = csvdb["player_expCsv"][level].exp - 1 -- 没有下一级了 经验溢出太多 扣除
223 end 224 end
224 end 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 end 233 end
240 234
241 self:updateProperties({level = level, exp = newExp}) 235 self:updateProperties({level = level, exp = newExp})
@@ -1511,8 +1505,8 @@ function RolePlugin.bind(Role) @@ -1511,8 +1505,8 @@ function RolePlugin.bind(Role)
1511 SendPacket(actionCodes.Store_ayncPurchaseRpc, MsgPack.pack({ result = "handled" })) 1505 SendPacket(actionCodes.Store_ayncPurchaseRpc, MsgPack.pack({ result = "handled" }))
1512 return 1506 return
1513 end 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 if rechargeData.rmb ~= tonumber(params.amount) then 1510 if rechargeData.rmb ~= tonumber(params.amount) then
1517 skynet.error(string.format("fake order: %s, roleId: %d, order: %s, rmb %s, get %s", 1511 skynet.error(string.format("fake order: %s, roleId: %d, order: %s, rmb %s, get %s",
1518 params.transactionId, roleId, partnerOrderStr, rechargeData.rmb, params.amount 1512 params.transactionId, roleId, partnerOrderStr, rechargeData.rmb, params.amount
@@ -1520,16 +1514,34 @@ function RolePlugin.bind(Role) @@ -1520,16 +1514,34 @@ function RolePlugin.bind(Role)
1520 return 1514 return
1521 end 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 orderObject:setProperty("finishTime", skynet.time()) 1521 orderObject:setProperty("finishTime", skynet.time())
1530 orderObject:setProperty("status", "finish") 1522 orderObject:setProperty("status", "finish")
1531 1523
1532 redisproxy:srem(string.format("role:%d:orders", roleId), partnerOrderStr) 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 SendPacket(actionCodes.Store_ayncPurchaseRpc, MsgPack.pack({ order = partnerOrderStr, 1545 SendPacket(actionCodes.Store_ayncPurchaseRpc, MsgPack.pack({ order = partnerOrderStr,
1534 result = "success", reward = reward})) 1546 result = "success", reward = reward}))
1535 1547
@@ -1542,11 +1554,11 @@ function RolePlugin.bind(Role) @@ -1542,11 +1554,11 @@ function RolePlugin.bind(Role)
1542 local rechargeData = csvdb["shop_rechargeCsv"][id] 1554 local rechargeData = csvdb["shop_rechargeCsv"][id]
1543 if not rechargeData then 1555 if not rechargeData then
1544 skynet.error("recharge id not exist", id) 1556 skynet.error("recharge id not exist", id)
1545 - return 1557 + return 1
1546 end 1558 end
1547 1559
1548 if not self.storeData:checkRechargeRecord(rechargeData.limit, id) then 1560 if not self.storeData:checkRechargeRecord(rechargeData.limit, id) then
1549 - return 1 1561 + return 2
1550 end 1562 end
1551 1563
1552 local diamondCount = 0 1564 local diamondCount = 0
@@ -1561,13 +1573,13 @@ function RolePlugin.bind(Role) @@ -1561,13 +1573,13 @@ function RolePlugin.bind(Role)
1561 end 1573 end
1562 self:gainDiamond({count = diamondCount, isRecharge = true, log = {desc = "recharge", int1 = id}}) 1574 self:gainDiamond({count = diamondCount, isRecharge = true, log = {desc = "recharge", int1 = id}})
1563 elseif rechargeData.shop == 2 then --通行证商店 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 self.storeData:onBuyCard(rechargeData.type, rechargeData.time) 1577 self.storeData:onBuyCard(rechargeData.type, rechargeData.time)
1566 elseif rechargeData.shop == 3 then -- 礼包商店 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 else 1580 else
1569 skynet.error("invalid recharge shop type " .. id) 1581 skynet.error("invalid recharge shop type " .. id)
1570 - return 1582 + return 3
1571 end 1583 end
1572 1584
1573 if diamondCount > 0 then 1585 if diamondCount > 0 then
@@ -1577,10 +1589,8 @@ function RolePlugin.bind(Role) @@ -1577,10 +1589,8 @@ function RolePlugin.bind(Role)
1577 -- 累充 1589 -- 累充
1578 local rmb = rechargeData.rmb 1590 local rmb = rechargeData.rmb
1579 self:updateProperty({field = "rmbC", delta = rmb}) 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 end 1594 end
1585 1595
1586 --直接给玩家发送邮件,立即推送小红点 1596 --直接给玩家发送邮件,立即推送小红点
src/services/agent_ctrl.lua
@@ -128,7 +128,7 @@ function _M:check_agent_status() @@ -128,7 +128,7 @@ function _M:check_agent_status()
128 next_log_time = now + 60 128 next_log_time = now + 60
129 local count = table_nums(self.u2f) 129 local count = table_nums(self.u2f)
130 datacenter.set("onlineCount", count) 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 end 132 end
133 end 133 end
134 134
src/services/logd.lua
@@ -55,38 +55,11 @@ skynet.register_protocol { @@ -55,38 +55,11 @@ skynet.register_protocol {
55 end 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 if not socketdriver.send(log_fd, json.encode(doc) .. "\n") then 59 if not socketdriver.send(log_fd, json.encode(doc) .. "\n") then
88 if not connecting then 60 if not connecting then
89 CMD.open() -- 连一下试试 61 CMD.open() -- 连一下试试
  62 + socketdriver.send(log_fd, json.encode(doc) .. "\n")
90 end 63 end
91 end 64 end
92 end 65 end