local codecache = require "skynet.codecache" -- 清空缓存用 local _M = {} --[=[使用python 调用的话eg: import requests @params 指处理方法中的 query @data 指处理方法中的 body @return 'success' 成功 status = requests.post("http://127.0.0.1:8001/clearcache", params = {"key": "zhaolu1234dangge"}, data = "", timeout = 300).text if status != 'success' : print("错误") ]=] -- 清空缓存 function _M.clearcache(query, body) skynet.error(string.format("clearcache time: %s", skynet.timex())) codecache.clear() return 'success' end --重新加载 需要修改的csvdb -- 单字段修改 优先使用hotfix_csvdata --[=[ eg: body = """ csvdb["itemCsv"][1]["name"] = "测试一下" """ ]=] function _M.reload_csvdata(query, body) if not body or body == "" then return 'no body' end local ok = pcall(load, body) if not ok then return "code error" end local ok, status = pcall(skynet.call, 'CSVDATA', "lua", "reload", body) if status == "ok" then skynet.error(string.format("reload_csvdata time: %s, code: %s", skynet.timex(), body)) return 'success' else return 'error update' end end --指定更新某个字段值 --[=[ 解码后 body = { {"itemCsv", 1, "name", "测试一下"}, {"itemCsv", 2, "name", "测试一下"} } ]=] function _M.hotfix_csvdata(query, body) if not body or body == "" then return 'no body' end local ok, result = pcall(json.decode, body) if not ok or type(result) ~= 'table' then return "decode error" end local ok, status = pcall(skynet.call, 'CSVDATA', "lua", "hotfix", result) if status == "ok" then skynet.error(string.format("hotfix_csvdata time: %s, code: %s", skynet.timex(), body)) return 'success' else return 'error update' end end -- 热更新代码 -- 针对 agent 执行发送过来的代码 -- 代码要规范~ --[=[ eg: 1. *Action body = """ _hotfixActions = _hotfixActions or {} _hotfixActions["Gm.clientRequest"] = function(agent, data) bin = MsgPack.pack({ cmd = "testtest" }) SendPacket(actionCodes.Gm_receiveResponse, bin) end """ 2. 修改 global 方法 和 变量 直接覆盖 body = """ function a() print(123) end globalCsv["asdasd"] = 12 HEHE = 123 """ 3. 修改 class 类 方法 1. 修改role的方法 body = """ local role = ... _hotfixClass = _hotfixClass or {} _hotfixClass["Role"] = _hotfixClass["Role"] or {} local hotfixFunc = function(hotfixclass) function hotfixclass:getItemCount(itemId) return self:getProperty("id") .. "__" .. self:getProperty("uid") .. "__" .. itemId end end table.insert(_hotfixClass["Role"], hotfixFunc) if role then hotfixFunc(role) end """ 2. 修改hero的方法 body = """ local role = ... _hotfixClass = _hotfixClass or {} _hotfixClass["Hero"] = _hotfixClass["Hero"] or {} local hotfixFunc = function(hotfixclass) function hotfixclass:getBattleValue() return self:getProperty("id") + "98700000000" end end table.insert(_hotfixClass["Hero"], hotfixFunc) if role and role.heros then for _, hero in pairs(role.heros) do hotfixFunc(hero) end end """ 3. 其他的类仿照上面的写法 ]=] function _M.hotfix_code(query, body) if not body or body == "" then return "no body" end local ok = pcall(load, body) if not ok then return "code error" end skynet.error(string.format("hotfix_code time: %s, code: %s", skynet.timex(), body)) pcall(skynet.call, 'WATCHDOG', "lua", "hotfix", body) return 'success' end local function proc_online(cmd, roleId, pms) local agent = datacenter.get("agent", roleId) if agent then local ok, result = pcall(skynet.call, agent.serv, "lua", cmd, pms) return ok and result or "指令在线失败" end return "not_online" end function _M.gm_action(query) local gmFuncs = require "actions.GmAction" if not query.cmd or not query.id or not gmFuncs[query.cmd] then return "指令不存在" end -- 在线操作 query.id = tonumber(query.id) local isOn = proc_online(query.cmd, query.id, query) if isOn ~= "not_online" then return isOn end -- 如果_M有直接操作,跳过load角色 if _M[query.cmd] then return _M[query.cmd](query) end -- 离线操作 local role = require("models.Role").new({key = string.format("role:%d", query.id)}) local ret = role:load() if not ret then return "角色不存在" end role:loadAll() return gmFuncs[query.cmd](role, query) end function _M.account_init(query, body) if not query.id or not body or body == "" then return "指令不存在" end local ok, result = pcall(json.decode, body) if not ok or type(result) ~= 'table' then return "decode body error" end query.id = tonumber(query.id) local agent = datacenter.get("agent", query.id) if agent and agent.serv then -- local ok, result = pcall(skynet.call, agent.serv, "role", "accountInit", result) -- return ok and result or "指令在线失败" skynet.call(agent.serv, "role", "accountInit", result) return "成功" else return "角色不在线" end end return _M