HttpAction.lua
5.97 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
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
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
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("错误")
]=]
--[=[
解码后
body = {
"src/csvdata/init.lua",
"unitCsv",
"story_cgCsv",
}
]=]
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
csvdb.hotfix(table.unpack(result))
return 'success'
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
-- 离线操作
local role = require("models.Role").new({key = string.format("%d", query.id)})
local ret = role:load()
if not ret then
return "角色不存在"
end
role:loadAll()
role:startActionUcode()
local status = gmFuncs[query.cmd](role, query)
role:endActionUcode()
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
role:loadAll()
role:startActionUcode()
local status = gmFuncs[query.cmd](role, query)
role:endActionUcode()
return status
end
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
local roleId = redisproxy:get(string.format("user:%s", string.upper(user)))
if not roleId then return "not found" end
return json.encode({roleId, user})
end
function _M.broadcast(query)
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
}
}
if not handle[query.cmd] then return "错误" end
handle[query.cmd].exec()
mcast_util.pub_world(handle[query.cmd].code, MsgPack.pack(msg))
return "广播成功"
end
function _M.endless_season_check()
mcast_util.pub_world(actionCodes.Sys_endlessSeason, "")
return "success"
end
function _M.online(query)
local count = datacenter.get("onlineCount") or 0
return count
end
function _M.dbqlen(query)
return skynet.call(redisd, "debug", "INFO")
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