add broadcast

This commit is contained in:
wzdwc
2020-04-02 23:02:56 +08:00
parent 9ea7aeac52
commit 530282d636
10 changed files with 92 additions and 73 deletions
+1
View File
@@ -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/
+1 -2
View File
@@ -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)
+29
View File
@@ -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;
+17
View File
@@ -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;
+32 -64
View File
@@ -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<any>) => {
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);
};
}
+1
View File
@@ -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);
}
+1 -1
View File
@@ -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;
+2
View File
@@ -6,4 +6,6 @@ export interface IRoomService {
findById(uid: string): Promise<IRoom>;
findByRoomNumber(roomNumber: number): Promise<boolean>
add(): Promise<any>;
// join(roomNumber: string, userName: string): void;
// leave(roomNumber: string, message: string): void;
}
+4
View File
@@ -0,0 +1,4 @@
export interface ITickMsg {
type: string,
message: string;
}
+4 -6
View File
@@ -19,21 +19,19 @@ export class RoomService extends BaseService {
}
async findByRoomNumber(number: string): Promise<boolean> {
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'
}
}
}