add broadcast
This commit is contained in:
@@ -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/
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
};
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
export interface ITickMsg {
|
||||
type: string,
|
||||
message: string;
|
||||
}
|
||||
+4
-6
@@ -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'
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user