local code = require "code" local tokenUtil = require "utils.tokenUtil" local nodeUtil = require("utils.nodeUtil") local lib_game_mysql = require("lib_game_mysql") local lib_game_redis = require("lib_game_redis") local moduleData = require("data.module") local userData = require("data.user") local lib_logger = require("log.lib_logger") local logRegister = lib_logger:new("register") local logLogin = lib_logger:new("login") local root = {} -- uuid注册 local function l_uuid_register(msg) -- 是否第三方平台 local uuid = msg.uuid if is_empty(uuid) then return end -- 是否已绑定uid local sql = string.format("select max(uid) as uid from mdl_user where uuid = '%s';", uuid) local result = lib_game_mysql:query(sql) log.info("l_uuid_register uuid[%s] result[%s]", tostring(uuid), tostring(result)) if is_empty(result) then return end local uid = result[1]["uid"] if is_nil(uid) then return end uid = tonumber(uid) -- 账号状态 local status = moduleData:hget_int(uid, "user", "status") if status > 0 then return end -- 直接进行登陆 msg.uid = uid msg.password = moduleData:hget(uid, "password") local errCode, ret = root.login(msg) if code.is_ok(errCode) then ret.uid = msg.uid ret.password = msg.password else errCode = errCode or code.UNKNOWN ret = nil end return errCode, ret end -- 获取新uid local function l_get_register_uid() local uid = lib_game_redis:incrby("user:max:id", 1) if uid < 1000000 then uid = uid + 1000000 lib_game_redis:set("user:max:id", uid) end return uid end -- 快速注册 function root.register(msg) local errCode, ret = l_uuid_register(msg) if errCode then return errCode, ret end -- 正常注册 local uid = l_get_register_uid() userData:user_init_register_info(uid, msg) -- 注册埋点 local cntDatas = { uid, msg.channel, msg.version, msg.sysVer or "", msg.uuid, msg.udid, msg.ip } logRegister:raw(table.concat(cntDatas, ";")) msg.uid = uid msg.password = moduleData:hget_int(uid, "user", "password") errCode, ret = root.login(msg) if code.is_ok(errCode) then ret.uid = msg.uid ret.password = msg.password else errCode = errCode or code.UNKNOWN ret = nil end return errCode, ret end -- 快速登陆 function root.login(msg) log.info("login msg[%s]", tostring(msg)) local uid = msg.uid if is_empty(uid) or is_empty(msg.password) then return code.PARAMTER_ERROR end -- 密码检验 if not userData:user_is_match_password(msg.password) then return code.USR.LOGIN_PASSWORD_ERROR end -- 状态 local status = moduleData:hget_int(uid, "user", "status") if status > 0 then return code.USR.FORCE_OUT end -- 分配网关服务器 local nodeInfo = nodeUtil:user_dispatch_gate_node_and_agent(uid) if is_empty(nodeInfo) or is_empty(nodeInfo.ip) or is_empty(nodeInfo.wsPort) then return code.NOT_FOUND_SERVER end -- 暂存登陆数据 -- 登陆埋点 local cntDatas = { uid, msg.channel, msg.version, msg.sysVer or "", msg.operator, msg.network, msg.uuid, msg.udid, msg.ip } logLogin:raw(table.concat(cntDatas, ";")) local uuid = moduleData:hget_int(uid, "user", "uuid") local registerTime = moduleData:hget_int(uid, "user", "registerTime") local password = moduleData:hget_int(uid, "user", "password") local token = tokenUtil.create(uid, password) local ret = { sysTime = skynet_time(), ip = nodeInfo.ip, wsPort = nodeInfo.wsPort, token = token, registerTime = registerTime, isGuest = is_empty(uuid), uuid = uuid, uid = uid, password = password } log.info("login uid[%d] ret[%s]", tostring(uid), tostring(ret)) return code.OK, ret end return root