uniond.lua 3.6 KB
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__)