import { EquipModel } from './../../../db/Equip'; import { RoleModel } from './../../../db/Role'; import { UserModel } from '../../../db/User'; import { Application, Session } from 'pinus'; import {FrontendSession} from 'pinus'; import { HeroModel } from './../../../db/Hero'; 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: { rid: string, username: string, token: string, serverId: number }, session: FrontendSession) { let self = this; let rid = msg.rid; let serverId = msg.serverId; let uid = msg.username + '*' + rid; let sessionService = self.app.get('sessionService'); let user = await UserModel.findUserByToken(msg.token); if (!user) { console.log('user token not found'); return { code: 500, error: true, data: 'user token not found' }; } let role = await RoleModel.findByUid(user.uid, serverId); if (!role) { return { code: 201, error: true, data: '用户还未创建角色', } } // duplicate log in if (!!sessionService.getByUid(role.roleId)) { console.log('uid not found'); return { code: 500, error: true }; } await session.abind(role.roleId); session.set('rid', rid); session.set('uid', role.roleId); session.set('roleId', role.roleId); session.set('roleName', role.roleName); session.set('sid', self.app.get('serverId')); session.push('sid', () => {}); session.push('roleId', () => {}); session.push('roleName', () => {}); 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 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; return { status: 200, users: users, role }; } /** * User log out handler * * @param {Object} app current application * @param {Object} session current session object * */ onUserLeave(session: FrontendSession) { if (!session || !session.uid) { return; } this.app.rpc.chat.chatRemote.kick.route(session, true)(session.uid, this.app.get('serverId'), session.get('rid')); } }