Commit 2d392edea40830da215800daa51b8e5aebde2e50

Authored by zhouhaihai
1 parent a5b025b0

热更新 最终版

src/actions/GmAction.lua
... ... @@ -16,7 +16,7 @@ function _M.clientRequest(agent, data)
16 16 end
17 17  
18 18 function _M.testhotfix(role, pms)
19   - return csvdb["itemCsv"][1]["name"]
  19 + return csvdb["itemCsv"][1]["name"] .. " -=- " .. csvdb["itemCsv"][2]["name"] .. " -=- " .. role:getItemCount(123) .. " -=- " .. table.pack(next(role.heros))[2]:getBattleValue()
20 20 end
21 21  
22 22 function _M.hero(role, pms)
... ...
src/actions/HttpAction.lua
... ... @@ -5,6 +5,22 @@ local codecache = require "skynet.codecache" -- 清空缓存用
5 5  
6 6 local _M = {}
7 7  
  8 +
  9 +--[=[使用python 调用的话eg:
  10 +
  11 + import requests
  12 +
  13 + @params 指处理方法中的 query
  14 + @data 指处理方法中的 body
  15 + @return 'success' 成功
  16 +
  17 + status = requests.post("http://127.0.0.1:8001/clearcache", params = {"key": "zhaolu1234dangge"}, data = "", timeout = 300).text
  18 +
  19 + if status != 'success' :
  20 + print("错误")
  21 +]=]
  22 +
  23 +
8 24 -- 清空缓存
9 25 function _M.clearcache(query, body)
10 26 skynet.error(string.format("clearcache time: %s", skynet.timex()))
... ... @@ -12,7 +28,7 @@ function _M.clearcache(query, body)
12 28 return 'success'
13 29 end
14 30  
15   ---重新加载 需要修改的csvdb
  31 +--重新加载 需要修改的csvdb -- 单字段修改 优先使用hotfix_csvdata
16 32 --[=[ eg:
17 33 body = """
18 34 csvdb["itemCsv"][1]["name"] = "测试一下"
... ... @@ -21,20 +37,49 @@ end
21 37  
22 38 function _M.reload_csvdata(query, body)
23 39 if not body or body == "" then
24   - return
  40 + return 'no body'
25 41 end
26 42  
27 43 local ok = pcall(load, body)
28   - if not ok then return end
29   -
30   - skynet.error(string.format("reload_csvdata time: %s, code: %s", skynet.timex(), body))
  44 + if not ok then
  45 + return "code error"
  46 + end
31 47  
32   - local status = skynet.call('CSVDATA', "lua", "reload", body)
  48 + local ok, status = pcall(skynet.call, 'CSVDATA', "lua", "reload", body)
33 49 if status == "ok" then
  50 + skynet.error(string.format("reload_csvdata time: %s, code: %s", skynet.timex(), body))
34 51 return 'success'
  52 + else
  53 + return 'error update'
35 54 end
36 55 end
37 56  
  57 +--指定更新某个字段值
  58 +--[=[
  59 + 解码后
  60 + body = {
  61 + {"itemCsv", 1, "name", "测试一下"},
  62 + {"itemCsv", 2, "name", "测试一下"}
  63 + }
  64 +]=]
  65 +function _M.hotfix_csvdata(query, body)
  66 + if not body or body == "" then
  67 + return 'no body'
  68 + end
  69 +
  70 + local ok, result = pcall(json.decode, body)
  71 + if not ok or type(result) ~= 'table' then
  72 + return "decode error"
  73 + end
  74 + local ok, status = pcall(skynet.call, 'CSVDATA', "lua", "hotfix", result)
  75 +
  76 + if status == "ok" then
  77 + skynet.error(string.format("hotfix_csvdata time: %s, code: %s", skynet.timex(), body))
  78 + return 'success'
  79 + else
  80 + return 'error update'
  81 + end
  82 +end
38 83  
39 84 -- 热更新代码 -- 针对 agent 执行发送过来的代码 -- 代码要规范~
40 85  
... ... @@ -59,21 +104,53 @@ end
59 104 HEHE = 123
60 105 """
61 106  
62   -3. 修改 role 方法(待定)
63   -
  107 +3. 修改 class 类 方法
  108 + 1. 修改role的方法
  109 + body = """
  110 + local role = ...
  111 + _hotfixClass = _hotfixClass or {}
  112 + _hotfixClass["Role"] = _hotfixClass["Role"] or {}
  113 + local hotfixFunc = function(hotfixclass)
  114 + function hotfixclass:getItemCount(itemId)
  115 + return self:getProperty("id") .. "__" .. self:getProperty("uid") .. "__" .. itemId
  116 + end
  117 + end
  118 + table.insert(_hotfixClass["Role"], hotfixFunc)
  119 + if role then
  120 + hotfixFunc(role)
  121 + end
  122 + """
  123 + 2. 修改hero的方法
64 124 body = """
65   -
  125 + local role = ...
  126 + _hotfixClass = _hotfixClass or {}
  127 + _hotfixClass["Hero"] = _hotfixClass["Hero"] or {}
  128 + local hotfixFunc = function(hotfixclass)
  129 + function hotfixclass:getBattleValue()
  130 + return self:getProperty("id") + "98700000000"
  131 + end
  132 + end
  133 + table.insert(_hotfixClass["Hero"], hotfixFunc)
  134 + if role and role.heros then
  135 + for _, hero in pairs(role.heros) do
  136 + hotfixFunc(hero)
  137 + end
  138 + end
66 139 """
  140 +
  141 + 3. 其他的类仿照上面的写法
67 142 ]=]
68 143  
69   -function _M.hotfix(query, body)
  144 +function _M.hotfix_code(query, body)
70 145 if not body or body == "" then
71   - return
  146 + return "no body"
72 147 end
73 148 local ok = pcall(load, body)
74   - if not ok then return end
  149 + if not ok then
  150 + return "code error"
  151 + end
75 152  
76   - skynet.error(string.format("hotfix time: %s, code: %s", skynet.timex(), body))
  153 + skynet.error(string.format("hotfix_code time: %s, code: %s", skynet.timex(), body))
77 154  
78 155 pcall(skynet.call, 'WATCHDOG', "lua", "hotfix", body)
79 156 return 'success'
... ...
src/agent.lua
... ... @@ -24,6 +24,7 @@ local agentInfo = {} -- { client_fd, role, gate_serv, open_timer}
24 24 local agent_util, cs
25 25  
26 26 _hotfixActions = _hotfixActions or {}
  27 +_hotfixClass = _hotfixClass or {}
27 28  
28 29 --- {{{ 定时器相关
29 30 local function handle_timeout()
... ... @@ -286,10 +287,10 @@ end
286 287 function CMD.hotfix(code)
287 288 local ok, func = pcall(load, code)
288 289 if ok then
289   - ok = pcall(func)
  290 + ok = pcall(func, agentInfo.role)
290 291 end
291 292 if not ok then
292   - skynet.error("hotfix error by code " .. code)
  293 + skynet.error("hotfix_code error by code " .. code)
293 294 end
294 295 end
295 296  
... ...
src/services/csvdatad.lua
... ... @@ -61,8 +61,8 @@ end
61 61  
62 62  
63 63 local CMD = {}
  64 +
64 65 function CMD.reload(code)
65   - -- 重新加载 csvdata
66 66 csvdb = csvdb or {}
67 67  
68 68 local ok, func = pcall(load, code)
... ... @@ -78,6 +78,29 @@ function CMD.reload(code)
78 78 return 'ok'
79 79 end
80 80  
  81 +--更新已经存在的
  82 +function CMD.hotfix(fieldss)
  83 + csvdb = csvdb or {}
  84 + for _, fields in ipairs(fieldss) do
  85 + if #fields >= 3 and (type(fields[#fields]) == 'number' or type(fields[#fields]) == 'string') then
  86 + local temp = csvdb
  87 + local ok = false
  88 + for i = 1, #fields - 1 do
  89 + if type(temp) ~= 'table' then break end
  90 + if type(fields[i]) ~= 'number' and type(fields[i]) ~= 'string' then break end
  91 + if i == #fields - 1 then
  92 + if type(temp[fields[i]]) ~= 'number' and type(temp[fields[i]]) ~= 'string' then break end
  93 + temp[fields[i]] = fields[#fields]
  94 + else
  95 + temp = temp[fields[i]]
  96 + end
  97 + end
  98 + end
  99 + end
  100 + sharedata.update("csvdata", csvdb)
  101 + return 'ok'
  102 +end
  103 +
81 104 skynet.start(function ()
82 105 travCsv("src/csvdata", file2timeMap)
83 106 sharedata.new("csvdata", csvdb)
... ...
src/shared/functions.lua
... ... @@ -215,6 +215,17 @@ function class(classname, super)
215 215 -- copy fields from class to native object
216 216 for k,v in pairs(cls) do instance[k] = v end
217 217 instance.class = cls
  218 +
  219 + -- 覆盖热更新的方法
  220 + pcall(function()
  221 + if _hotfixClass and _hotfixClass[cls.__cname] then
  222 + for _, func in ipairs(_hotfixClass[cls.__cname]) do
  223 + func(instance) -- 绑定新的方法
  224 + end
  225 + end
  226 + end)
  227 +
  228 +
218 229 instance:ctor(...)
219 230 return instance
220 231 end
... ... @@ -235,6 +246,16 @@ function class(classname, super)
235 246 function cls.new(...)
236 247 local instance = setmetatable({}, cls)
237 248 instance.class = cls
  249 +
  250 + -- 覆盖热更新的方法
  251 + pcall(function()
  252 + if _hotfixClass and _hotfixClass[cls.__cname] then
  253 + for _, func in ipairs(_hotfixClass[cls.__cname]) do
  254 + func(instance) -- 绑定新的方法
  255 + end
  256 + end
  257 + end)
  258 +
238 259 instance:ctor(...)
239 260 return instance
240 261 end
... ...