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 = 12, 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__)