From 530282d6366605e5592b0910e97aa384d804bf61 Mon Sep 17 00:00:00 2001 From: wzdwc Date: Thu, 2 Apr 2020 23:02:56 +0800 Subject: [PATCH] add broadcast --- README.md | 1 + src/app/controller/room.ts | 3 +- src/app/io/controller/game.ts | 29 +++++++++++ src/app/io/controller/nsp.ts | 17 +++++++ src/app/io/middleware/auth.ts | 96 ++++++++++++----------------------- src/app/router.ts | 1 + src/config/config.default.ts | 2 +- src/interface/IRoom.ts | 2 + src/interface/ITickMsg.ts | 4 ++ src/service/room.ts | 10 ++-- 10 files changed, 92 insertions(+), 73 deletions(-) create mode 100644 src/app/io/controller/game.ts create mode 100644 src/interface/ITickMsg.ts diff --git a/README.md b/README.md index eb361c5..a387dc7 100644 --- a/README.md +++ b/README.md @@ -52,6 +52,7 @@ yarn test └─controller ``` + [midway]: https://midwayjs.org [git-rules]: https://confluence.sui.work/pages/viewpage.action?pageId=51120607 [eggjs]: https://eggjs.org/zh-cn/ diff --git a/src/app/controller/room.ts b/src/app/controller/room.ts index 28c93e3..1f84363 100644 --- a/src/app/controller/room.ts +++ b/src/app/controller/room.ts @@ -30,8 +30,7 @@ export class RoomController extends BaseController { try { const { body } = this.getRequestBody(); const result = await this.roomService.findByRoomNumber(body.roomNumber); - console.log(result, 'roomNumber'); - this.success(result); + this.success({ hasRoom: result }); } catch (e) { this.fail('create room error'); console.log(e) diff --git a/src/app/io/controller/game.ts b/src/app/io/controller/game.ts new file mode 100644 index 0000000..eb18020 --- /dev/null +++ b/src/app/io/controller/game.ts @@ -0,0 +1,29 @@ +'use strict'; + +import { Controller } from 'egg'; + +class GameController extends Controller { + async play() { + const { ctx } = this; + const socket = ctx.socket as any; + const app = ctx.app as any; + const nsp = app.io.of('/socket'); + const { room } = socket.handshake.query; + console.log(room); + try { + nsp.adapter.clients([ room ], (err: any, clients: any) => { + // 广播信息 + nsp.to(room).emit('game', { + clients, + action: 'broadcast', + target: 'participator', + message: '', + }); + }); + } catch (error) { + app.logger.error(error); + } + } +} + +module.exports = GameController; diff --git a/src/app/io/controller/nsp.ts b/src/app/io/controller/nsp.ts index cc7bd32..d8f9ec0 100644 --- a/src/app/io/controller/nsp.ts +++ b/src/app/io/controller/nsp.ts @@ -4,6 +4,23 @@ import { Controller } from 'egg'; class NspController extends Controller { async exchange() { + const { ctx } = this; + const socket = ctx.socket as any; + const app = ctx.app as any; + const nsp = app.io.of('/socket'); + const message = ctx.args[0] || {}; + const client = socket.id; + try { + const { target, payload } = message; + if (!target) return; + const msg = ctx.helper.parseMsg('exchange', payload, { client, target }); + nsp.emit(target, msg); + } catch (error) { + app.logger.error(error); + } + } + + async broadcast() { const { ctx } = this; const socket = ctx.socket as any; const app = ctx.app as any; diff --git a/src/app/io/middleware/auth.ts b/src/app/io/middleware/auth.ts index d15f8aa..89c39ae 100644 --- a/src/app/io/middleware/auth.ts +++ b/src/app/io/middleware/auth.ts @@ -1,87 +1,55 @@ import {Context} from "midway"; +import { ITickMsg } from '../../../interface/ITickMsg'; -const PREFIX = 'room'; export default function auth(): any{ return async (ctx: Context, next: () => Promise) => { - const { logger, helper } = ctx; const socket = ctx.socket as any; - const app = ctx.app as any; const id = socket.id; + const app = ctx.app as any; const nsp = app.io.of('/socket'); + const roomService = await app.applicationContext.getAsync('RoomService'); const query = socket.handshake.query; // 用户信息 - const { room, userId } = query; - const rooms = [ room ]; - - console.log('#user_info', id, room, userId); - const tick = (id: string, msg: object) => { - console.log('#tick', id, msg); - - // 踢出用户前发送消息 - socket.emit(id, helper.parseMsg('deny', msg)); - - // 调用 adapter 方法踢出用户,客户端触发 disconnect 事件 - nsp.adapter.remoteDisconnect(id, true, (err: any) => { - logger.error(err); - }); - }; + const { room, userName } = query; // 检查房间是否存在,不存在则踢出用户 // 备注:此处 app.redis 与插件无关,可用其他存储代替 - const hasRoom = await app.redis.get(`${PREFIX}:${room}`); + const hasRoom = await roomService.findByRoomNumber(room); + function tick(id: Number, msg: ITickMsg, nsp: any, socket: any) { + // 踢出用户前发送消息 + socket.emit(id, ctx.helper.parseMsg('deny', msg)); + // 调用 adapter 方法踢出用户,客户端触发 disconnect 事件 + nsp.adapter.remoteDisconnect(id, true, (err: any) => { + ctx.logger.error('room service tick', err); + }); + } - console.log('#has_exist', hasRoom); + function join(roomNumber: string, userName: string, nsp: any, socket: any) { + socket.join(roomNumber); + updatePlayer(roomNumber, `User(${userName}) joined.`, nsp); + } + function updatePlayer(roomNumber: string, message: string, nsp: any) { + // 在线列表 + nsp.adapter.clients([roomNumber], (err: any, clients: any) => { + // 更新在线用户列表 + nsp.to(roomNumber).emit('online', { + clients, + action: 'join', + target: 'participator', + message, + }); + }); + } if (!hasRoom) { tick(id, { type: 'deleted', message: 'deleted, room has been deleted.', - }); + }, nsp, socket); return; } - - // 用户加入 - console.log('#join', room); - socket.join(room); - - // 在线列表 - nsp.adapter.clients(rooms, (err: any, clients: any) => { - console.log('#online_join', clients); - - // 更新在线用户列表 - nsp.to(room).emit('online', { - clients, - action: 'join', - target: 'participator', - message: `User(${id}) joined.`, - }); - }); - + join(room, userName, nsp, socket); await next(); - - // 用户离开 - console.log('#leave', room); - - // 在线列表 - nsp.adapter.clients(rooms, (err: any, clients: any) => { - console.log('#online_leave', clients); - - // 获取 client 信息 - // const clientsDetail = {}; - // clients.forEach(client => { - // const _client = app.io.sockets.sockets[client]; - // const _query = _client.handshake.query; - // clientsDetail[client] = _query; - // }); - - // 更新在线用户列表 - nsp.to(room).emit('online', { - clients, - action: 'leave', - target: 'participator', - message: `User(${id}) leaved.`, - }); - }); - + updatePlayer(room, userName, nsp); }; } diff --git a/src/app/router.ts b/src/app/router.ts index ef3e800..9131789 100644 --- a/src/app/router.ts +++ b/src/app/router.ts @@ -2,4 +2,5 @@ import { Application } from 'midway' export default function (app: Application) { app.io.of('/socket').route('exchange', app.io.controller.nsp.exchange); + app.io.of('/socket').route('broadcast', app.io.controller.nsp.broadcast); } diff --git a/src/config/config.default.ts b/src/config/config.default.ts index 22ce5a9..b36327a 100644 --- a/src/config/config.default.ts +++ b/src/config/config.default.ts @@ -39,7 +39,7 @@ export default (appInfo: EggAppInfo) => { credentials: true, origin(ctx: Context) { const origin: string = ctx.get('origin'); - // 允许*.ssjlicai.com域名访问 + // 允许*域名访问 if (origin.indexOf('172.22.88.118') > -1) { console.log('come in'); return origin; diff --git a/src/interface/IRoom.ts b/src/interface/IRoom.ts index b70facd..9e78191 100644 --- a/src/interface/IRoom.ts +++ b/src/interface/IRoom.ts @@ -6,4 +6,6 @@ export interface IRoomService { findById(uid: string): Promise; findByRoomNumber(roomNumber: number): Promise add(): Promise; + // join(roomNumber: string, userName: string): void; + // leave(roomNumber: string, message: string): void; } diff --git a/src/interface/ITickMsg.ts b/src/interface/ITickMsg.ts new file mode 100644 index 0000000..d8424d9 --- /dev/null +++ b/src/interface/ITickMsg.ts @@ -0,0 +1,4 @@ +export interface ITickMsg { + type: string, + message: string; +} diff --git a/src/service/room.ts b/src/service/room.ts index 8ef73f3..1c02109 100644 --- a/src/service/room.ts +++ b/src/service/room.ts @@ -19,21 +19,19 @@ export class RoomService extends BaseService { } async findByRoomNumber(number: string): Promise { - const redis = await this.redis.get(`room:${number}`); - console.log(redis, 'redis', number); - return redis + const roomNumber = await this.redis.get(`room:${number}`); + console.log(roomNumber, 'redis', number); + return !!roomNumber } - async add(expires: number = 10) { + async add(expires: number = 3600) { const number = Math.floor(Math.random() * (1000000 - 100000)) + 100000; const result = await this.mysql.insert(`room`, { room_number: number }); const roomRedis = await this.redis.set(`room:${number}`, `${number}`, 'ex', expires); - console.log(roomRedis, 'roomRedis-----------'); if(result.affectedRows === 1 && roomRedis === 'OK') { return { roomNumber: number } } else { throw 'room add error' } } - }