watchdog.lua 3 KB
local skynet = require "skynet"
local redisproxy = require "shared.redisproxy"
local socket = require "skynet.socket"
local netpack = require "skynet.netpack"
local datacenter = require "skynet.datacenter"
local snax = require "skynet.snax"
local agent_ctrl = require "services.agent_ctrl"
local xxtea = require "xxtea"
local mc = require "skynet.multicast"

require "ProtocolCode"
require "GlobalVar"
require "shared.init"
require "utils.init"

local CMD, SOCKET = {}, {}
local globald

local pool_size = tonumber(...)

function SOCKET.open(fd, addr)
	skynet.call(gate_serv, "lua", "accept" , fd)
	agent_ctrl:socket_open(fd, addr)
end

function SOCKET.close(fd)
	print("socket close", fd)
	agent_ctrl:socket_close(fd)
end

function SOCKET.error(fd, msg)
	print("socket error",fd, msg)
	agent_ctrl:socket_error(fd)
end

function SOCKET.data(fd, msg)
	local cmd = string.unpack("H", string.sub(msg, 1, 2))
	if cmd == actionCodes.Role_queryLoginRpc then
		local data = MsgPack.unpack(xxtea.decrypt(string.sub(msg, 3), XXTEA_KEY))
		-- TODO: 先检测uid的合法性
		if not data or not data.uid then return end
		agent_ctrl:query_agent(fd, data.uid)
 	end
end

local use_logd = tonumber(skynet.getenv "logd")

-- @desc: agent状态定时检测
function check_agent_status()
	pcall(agent_ctrl.check_agent_status, agent_ctrl)
	skynet.timeout(1, check_agent_status)
end

-- 创建world以及union channel 用于广播
function create_mutilcast()
	for i = 1, 10 do
		local chan_w = mc:new()
		datacenter.set("MC_W_CHANNEL" .. i, chan_w.channel)
	end
end

function CMD.start(conf)
	skynet.call(gate_serv, "lua", "open" , conf)
	skynet.call(redisd, "lua", "open", conf)

	if use_logd == 1 then
		skynet.call(logd, "lua", "open", conf)
	end
	-- 开启agent状态检测定时器
	check_agent_status()
	-- 创建广播服务
	create_mutilcast()

	skynet.call(conf.ngxd, "lua", "start")

	-- roomServer = skynet.newservice("services/roomServer")
	-- skynet.call(roomServer, "lua", "start")

	globald = skynet.newservice("services/globald")
	skynet.call(globald, "lua", "start")

	skynet.newservice("services/dbseed")

end

function CMD.forceClose(fd)
	agent_ctrl:exit_agent(fd)
end

skynet.start(function()
	skynet.dispatch("lua", function(session, source, cmd, subcmd, ...)
		if cmd == "socket" then
			local f = SOCKET[subcmd]
			f(...)
			-- socket api don't need return
		else
			local f = assert(CMD[cmd])
			skynet.ret(skynet.pack(f(subcmd, ...)))
		end
	end)
	-- 数据库服务
	redisd = skynet.newservice("services/redisd")

	-- load all csv data
	skynet.newservice("services/csvdatad")
	print("launch csvdatad ...")

	-- 日志服务
	if use_logd == 1 then
		logd = skynet.newservice("services/logd")
	end
	
	local poold = skynet.newservice("services/poold")
	local obj = skynet.call(poold, "lua", "start", pool_size)

	agent_ctrl:init(obj, poold)

	print(string.format("launch %d agent at the beginning", pool_size))

	-- 全局工具函数
	skynet.newservice("services/named")
	skynet.newservice("services/chated")
	-- 网关服务
	gate_serv = skynet.newservice("gate")
end)