uniond.lua
3.6 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
require "shared.init"
require "utils.init"
require "ProtocolCode"
require "GlobalVar"
require "RedisKeys"
require "skynet.manager"
local sharedata = require "sharedata"
local redisproxy = require "shared.redisproxy"
local datacenter = require "datacenter"
local queue = require "skynet.queue"
skynet = require "skynet"
globalCsv = require "csvdata.GlobalDefine"
local table_pack = table.pack
local table_unpack = table.unpack
local string_format = string.format
local pairs = pairs
local ipairs = ipairs
local tonumber = tonumber
-- 维护在线状态
local unionInfo, CMD, cs = {}, {}
skynet.register_protocol {
name = "role",
id = 13,
pack = skynet.pack,
unpack = skynet.unpack,
}
local function handle_timeout()
local now = skynet.timex()
unionInfo:onTimer(now)
skynet.timeout(100, handle_timeout)
end
--[[
getProperties({"field1", "field2", ...})
return: {field1 = value1, field2 = value2, ...}
-------
setProperties({field1 = value1, field2 = value2, ...})
]]
function rpcRole(roleId, funcName, ...)
if not unionInfo.members[roleId] then return end
local serv = unionInfo.members[roleId].serv
if serv then
if funcName == "getProperties" then
return skynet.call(serv, "role", funcName, table_unpack(...))
else
return skynet.call(serv, "role", funcName, ...)
end
else
local rediskey = string_format("role:%d", roleId)
if funcName == "getProperty" then
return redisproxy:hget(rediskey, ...)
elseif funcName == "setProperty" then
return redisproxy:hset(rediskey, ...)
elseif funcName == "getProperties" then
local sRole = require "models.Role"
local fields = table_pack(...)
local rets = redisproxy:hmget(rediskey, table_unpack(fields, 1, fields.n))
local result = {}
for i=1, fields.n do
local typ = sRole.schema[fields[i]][1]
local def = sRole.schema[fields[i]][2]
if typ == "number" then
result[fields[i]] = tonumber(rets[i] or def)
else
result[fields[i]] = rets[i]
end
end
return result
elseif funcName == "setProperties" then
local fields = ...
local params = {}
for field, value in pairs(fields) do
params[#params+1] = field
params[#params+1] = value
end
return redisproxy:hmset(rediskey, table_unpack(params))
end
end
end
-- 加载联盟数据
function CMD.load(unionId)
unionInfo = require("models.Union").new({key = UNION_KEY:format(unionId)})
unionInfo:load()
unionInfo:loadMembers()
end
-- 创建一个联盟
function CMD.new(roleId)
local unionId = redisproxy:hincrby("autoincrement_set", "union", 1)
unionInfo = require("models.Union").new({
key = UNION_KEY:format(unionId),
master = roleId
})
unionInfo:create()
unionInfo:addMember(roleId, true)
redisproxy:sadd(UNION_SET, unionId)
return unionId
end
-- 登录/登出 需要向联盟服务报备
function CMD.sign(cmd, roleId, serv)
if not unionInfo.members[roleId] then return end
if cmd == "login" then
unionInfo.members[roleId].serv = serv
elseif cmd == "logout" then
unionInfo.members[roleId].serv = nil
end
end
local function __init__()
skynet.dispatch("lua", function(_, _, command, ...)
cs(function (...)
if CMD[command] then
skynet.ret(skynet.pack(CMD[command](...)))
return
else
if unionInfo and unionInfo[submethod] then
if command == 'dismiss' then
unionInfo:dismiss(...)
return
end
local result = unionInfo[submethod](unionInfo, ...)
skynet.ret(skynet.pack(result))
return
end
end
skynet.error("uniond commond error cmd=", command)
end)
end)
skynet.register("UNIOND")
csvdb = sharedata.query("csvdata")
cs = queue()
end
skynet.start(__init__)