import { STATUS } from './../../../consts/statusCode'; import { EquipModel } from './../../../db/Equip'; import { RoleModel } from './../../../db/Role'; import { UserModel } from '../../../db/User'; import { GMUserModel } from '../../../db/GMUser'; import { Application, Session } from 'pinus'; import {FrontendSession} from 'pinus'; import { HeroModel } from './../../../db/Hero'; import { resResult } from '../../../pubUtils/util'; import { startEvent } from '../../../services/eventSercive'; import { EVENT_START_LV } from '../../../consts/consts'; import { getAp } from '../../../services/actionPointService'; export default function (app: Application) { return new EntryHandler(app); } export class EntryHandler { constructor(private app: Application) { } /** * New client entry chat server. * * @param {Object} msg request message * @param {Object} session current session object */ async enter(msg: { token: string, serverId: number }, session: FrontendSession) { let self = this; let serverId = msg.serverId; let sessionService = self.app.get('sessionService'); let user = await UserModel.findUserByToken(msg.token); if (!user) { console.log('user token not found'); return resResult(STATUS.TOKEN_ERR); } let role = await RoleModel.findByUid(user.uid, serverId); if (!role) { return resResult(STATUS.ROLE_NOT_FOUND); } // duplicate log in if (!!sessionService.getByUid(role.roleId)) { console.log('duplicate log in', role.roleId); return resResult(STATUS.DUP_LOGIN); } await session.abind(role.roleId); session.set('uid', role.roleId); session.set('roleId', role.roleId); session.set('roleName', role.roleName); session.set('eventStatus', role.eventStatus); session.set('sid', self.app.get('serverId')); session.push('sid', () => {}); session.push('roleId', () => {}); session.push('roleName', () => {}); session.push('eventStatus', () => {}); // session.push('rid', function (err) { // if (err) { // console.error('set rid for session service failed! error is : %j', err.stack); // } // }); session.on('closed', this.onUserLeave.bind(this)); if(role.lv >= EVENT_START_LV && !role.eventStatus) { startEvent(self.app, session); } let channelService = self.app.get('channelService'); let channel = channelService.getChannel(role.roleId, true); if (channel.getMembers().indexOf(role.roleId) === -1) { channel.add(role.roleId, self.app.get('serverId')); } // put user into channel await self.app.rpc.battle.eventBattleRemote.add.route(session)(role.roleId, self.app.get('serverId'), true); // let users = await self.app.rpc.chat.chatRemote.add.route(session)(role.roleId, self.app.get('serverId'), rid, true); let heros = await HeroModel.findByRole(role.roleId); let equips = await EquipModel.findbyRole(role.roleId); role['heros'] = heros; role['equips'] = equips; let apJson = await getAp(Date.now(), role.roleId); role['apJson'] = apJson; return resResult(STATUS.SUCCESS, { role }); } /** * User log out handler * * @param {Object} app current application * @param {Object} session current session object * */ onUserLeave(session: FrontendSession) { if (!session || !session.uid) { return; } let roleId = session.get('roleId'); let sid = session.get('sid'); let channelService = this.app.get('channelService'); let channel = channelService.getChannel(roleId, true); channel.leave(roleId, sid); this.app.rpc.battle.eventBattleRemote.kick.route(session)(roleId, this.app.get('serverId')); // this.app.rpc.chat.chatRemote.kick.route(session, true)(session.uid, this.app.get('serverId'), session.get('rid')); } /** * New client entry chat server. * * @param {Object} msg request message * @param {Object} session current session object */ async gmEnter(msg: { token: string, serverId: number }, session: FrontendSession) { let self = this; let user = await GMUserModel.getGmAccountByToken(msg.token); if (!user) { console.log('user token not found'); return resResult(STATUS.TOKEN_ERR); } console.log(self.app.get('serverId')); await session.abind(user.username); session.set('uid', user.uid); session.set('roleId', user.username); session.set('roleName', user.name); session.set('eventStatus', 0); session.set('sid', self.app.get('serverId')); session.push('sid', () => {}); session.push('roleId', () => {}); session.push('roleName', () => {}); session.push('eventStatus', () => {}); // session.push('rid', function (err) { // if (err) { // console.error('set rid for session service failed! error is : %j', err.stack); // } // }); session.on('closed', this.onUserLeave.bind(this)); // put user into channel return resResult(STATUS.SUCCESS); } }