HttpAction.lua 3.52 KB

local skynet = require "skynet"
local sharedata = require "skynet.sharedata"
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




return _M