Blame view

src/actions/HttpAction.lua 6.17 KB
222a7d5f   zhouhaihai   httpGm
1
  
3fe4471e   zhouhaihai   热更新 demo
2
3
  local _M = {}
  
2d392ede   zhouhaihai   热更新 最终版
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
  
  --[=[使用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("错误")
  ]=]
  
  
2d392ede   zhouhaihai   热更新 最终版
20
21
22
  --[=[
  	解码后
  	body = {
a5486ede   zhouhaihai   csvdata 修改为 share...
23
24
25
  		"src/csvdata/init.lua",
  		"unitCsv",
  		"story_cgCsv",
2d392ede   zhouhaihai   热更新 最终版
26
27
28
29
30
31
32
33
34
35
36
  	}
  ]=]
  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
2d392ede   zhouhaihai   热更新 最终版
37
  
a5486ede   zhouhaihai   csvdata 修改为 share...
38
39
40
  	csvdb.hotfix(table.unpack(result))
  
  	return 'success'
2d392ede   zhouhaihai   热更新 最终版
41
  end
3fe4471e   zhouhaihai   热更新 demo
42
43
44
45
  
  -- 热更新代码  -- 针对 agent 执行发送过来的代码 -- 代码要规范~ 
  
  --[=[ eg:
5e5d7680   zhouhaihai   热更新 优化
46
47
48
49
50
51
52
53
  1. *Action 
  	body = """
  		_hotfixActions = _hotfixActions or {}
  		_hotfixActions["Gm.clientRequest"] = function(agent, data)
  			bin = MsgPack.pack({ cmd = "testtest" })
  			SendPacket(actionCodes.Gm_receiveResponse, bin)
  		end
  	"""
3fe4471e   zhouhaihai   热更新 demo
54
55
56
57
58
59
  
  2. 修改 global 方法  变量 直接覆盖
  	body = """
  		function a()
  			print(123)
  		end
5e5d7680   zhouhaihai   热更新 优化
60
61
62
63
  
  		globalCsv["asdasd"] = 12
  
  		HEHE = 123
3fe4471e   zhouhaihai   热更新 demo
64
65
  	"""
  
2d392ede   zhouhaihai   热更新 最终版
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
  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的方法
3fe4471e   zhouhaihai   热更新 demo
83
  	body = """
2d392ede   zhouhaihai   热更新 最终版
84
85
86
87
88
89
90
91
92
93
94
95
96
97
  		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
3fe4471e   zhouhaihai   热更新 demo
98
  	"""
2d392ede   zhouhaihai   热更新 最终版
99
100
  
  	3. 其他的类仿照上面的写法
3fe4471e   zhouhaihai   热更新 demo
101
102
  ]=]
  
2d392ede   zhouhaihai   热更新 最终版
103
  function _M.hotfix_code(query, body)
3fe4471e   zhouhaihai   热更新 demo
104
  	if not body or body == "" then
2d392ede   zhouhaihai   热更新 最终版
105
  		return "no body"
3fe4471e   zhouhaihai   热更新 demo
106
  	end
3fe4471e   zhouhaihai   热更新 demo
107
  	local ok = pcall(load, body)
2d392ede   zhouhaihai   热更新 最终版
108
109
110
  	if not ok then 
  		return "code error"
  	end
5e5d7680   zhouhaihai   热更新 优化
111
  
2d392ede   zhouhaihai   热更新 最终版
112
  	skynet.error(string.format("hotfix_code time: %s, code: %s", skynet.timex(), body))
5e5d7680   zhouhaihai   热更新 优化
113
  	
a5486ede   zhouhaihai   csvdata 修改为 share...
114
  	pcall(skynet.call, '.watchdog', "lua", "hotfix", body)
3fe4471e   zhouhaihai   热更新 demo
115
116
117
  	return 'success'
  end
  
222a7d5f   zhouhaihai   httpGm
118
119
120
121
122
123
124
125
  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
3fe4471e   zhouhaihai   热更新 demo
126
  
222a7d5f   zhouhaihai   httpGm
127
128
129
130
131
132
133
134
135
  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
222a7d5f   zhouhaihai   httpGm
136
  	-- 离线操作
0de80321   liuzujun   创建游戏数据库,role对应mys...
137
  	local role = require("models.Role").new({key = string.format("%d", query.id)})
222a7d5f   zhouhaihai   httpGm
138
139
140
141
  	local ret = role:load()
  	if not ret then
  		return "角色不存在"
  	end
913e070e   liuzujun   添加订单表,全局id定时回写数据库
142
143
144
145
  	role:loadAll()
  	role:startActionUcode()
  	local status = gmFuncs[query.cmd](role, query)
  	role:endActionUcode()
5c8c3b70   liuzujun   离线角色强制保存
146
      role:saveRoleData()
913e070e   liuzujun   添加订单表,全局id定时回写数据库
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
  	
  	return status
  end
  
  function _M.pay_action(query)
  	local gmFuncs = require "actions.GmAction"
  	if not query.cmd or not query.order or not gmFuncs[query.cmd] then return "指令不存在" end
  	local mysqlproxy = require "shared.mysqlproxy"
  	local res = mysqlproxy:query(string.format("SELECT roleid FROM `Order` WHERE `id` = %s", query.order))
  	if res[1] then 
  		query.id = res[1]["roleid"]
  	else
  		return "订单非法"
  	end
  	-- 在线操作
  	query.id = tonumber(query.id)
  	local isOn = proc_online(query.cmd, query.id, query)
  	if isOn ~= "not_online" then
  		return isOn
  	end
  	-- 离线操作
  	local role = require("models.Role").new({key = string.format("%d", query.id)})
  	local ret = role:load()
  	if not ret then
  		return "角色不存在"
  	end
222a7d5f   zhouhaihai   httpGm
173
  	role:loadAll()
3133cb76   zhouhaihai   日志
174
175
176
  	role:startActionUcode()
  	local status = gmFuncs[query.cmd](role, query)
  	role:endActionUcode()
5c8c3b70   liuzujun   离线角色强制保存
177
      role:saveRoleData()
3133cb76   zhouhaihai   日志
178
179
  	
  	return status
222a7d5f   zhouhaihai   httpGm
180
  end
3fe4471e   zhouhaihai   热更新 demo
181
  
b23cd820   zhouhaihai   查询角色
182
183
184
185
  function _M.query_role(query)
  	if not query.uid then return "not found" end
  	local user = redisproxy:get(string.format("uid:%s", query.uid))
  	if not user then return "not found" end
3fdfef30   zhouhaihai   httpweb
186
  	local roleId = redisproxy:get(string.format("user:%s", string.upper(user)))
b23cd820   zhouhaihai   查询角色
187
188
189
190
  	if not roleId then return "not found" end
  	return json.encode({roleId, user})
  end
  
c763e563   zhouhaihai   删除NGX
191
  function _M.broadcast(query)
5a7e4d88   zhouhaihai   自定义维护公告
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
  	local msg = {}
  	local handle = {
  		["common"] = {
  			code = actionCodes.Sys_commonNotice,
  			exec = function()
  				msg["body"] = query.content
  			end
  		},
  		["maintain"] = {
  			code = actionCodes.Sys_maintainNotice,
  			exec = function()
  				msg["body"] = query.content
  			end
  		},
  		["custom"] = {
  			code = actionCodes.Sys_customNotice,
  			exec = function()
  				msg["title"] = query.title
  				msg["body"] = query.content
  				msg["logout"] = query.logout
  			end
e84a1beb   liuzujun   gm后台查询日志,公告相关协议
213
214
215
216
217
218
219
220
  		},
  		["game"] = {
  			code = actionCodes.Sys_gameNotice,
  			exec = function()
  				msg["new"] = query.status
  				msg["channels"] = query.channels
  			end
  		},
c763e563   zhouhaihai   删除NGX
221
  	}
5a7e4d88   zhouhaihai   自定义维护公告
222
223
224
  	if not handle[query.cmd] then return "错误" end
  	handle[query.cmd].exec()
  	mcast_util.pub_world(handle[query.cmd].code, MsgPack.pack(msg))
c763e563   zhouhaihai   删除NGX
225
226
227
  	return "广播成功"
  end
  
59acc11e   zhouhaihai   赛季更新
228
229
230
231
232
  function _M.endless_season_check()
  	mcast_util.pub_world(actionCodes.Sys_endlessSeason, "")
  	return "success"
  end
  
c763e563   zhouhaihai   删除NGX
233
234
235
236
237
  function _M.online(query)
  	local count = datacenter.get("onlineCount") or 0
  	return count
  end
  
3b903aa0   zhouhaihai   队列长度
238
239
240
  function _M.dbqlen(query)
  	return skynet.call(redisd, "debug", "INFO")
  end
c763e563   zhouhaihai   删除NGX
241
  
c7ecb87f   zhouhaihai   添加 测试账号 方法
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
  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
3fe4471e   zhouhaihai   热更新 demo
260
261
  
  return _M