import { InjectRedis } from '@liaoliaots/nestjs-redis'; import { forwardRef, Inject, Injectable } from '@nestjs/common'; import { Redis } from 'ioredis'; import { Socket } from 'socket.io'; import { RoomService } from '../room.service'; import { UsersService } from '../users/users.service'; @Injectable() export class ActionsService { constructor( @InjectRedis() private readonly redis: Redis, @Inject(forwardRef(() => RoomService)) private roomService: RoomService, @Inject(forwardRef(() => UsersService)) private userService: UsersService, ) {} async handleAllAction(socket: Socket, data: ActionsParams): Promise { const isSocketLeader = () => { return socket.data.user?.Role === 'leader'; }; switch (data.type) { case 'danmumsg': const params = {} as DanmakuDataType; params.mode = data.data.mode; params.nickname = data.data.Nickname; params.text = data.data.text; params.userId = data.data.UserId; this.handleDanmaku(params); break; case 'users-muted': const mutedParams = data as any as MutedStateType; isSocketLeader() && (await this.handleMutedState(mutedParams)); break; case 'users-words': const typingParams = data as any as TypingStateType; isSocketLeader() && (await this.handleTypingState(typingParams)); break; case 'users-kicked': const kickParams = data as any as KickStateType; // console.log('kickParams', socket.data.user, kickParams); isSocketLeader() && (await this.handleKickState(socket, kickParams)); break; default: break; } socket.broadcast.emit('action', data); } // answer(data: any) { // this.roomService.socketGateway._socket.broadcast.emit('action', data); // } async handleDanmaku(data: DanmakuDataType) { console.log('data', data); const roomId = this.roomService._userInfo.RoomId; const time = Date.now(); if (roomId) { this.redis.hset( `kankan:socket:roomMsg:${roomId}`, time, JSON.stringify(data), ); } else { this.roomService.logger.warn( 'handleDanmaku missing roomId ', 'ActionsService', ); } } async handleMutedState(data: MutedStateType) { if (data) { const roomId = this.roomService._userInfo.RoomId; const userId = data.userId; const mutedState = data.muted; await this.userService.updateUserMicState(roomId, userId, mutedState); } } async handleTypingState(data: TypingStateType) { if (data) { const roomId = this.roomService._userInfo.RoomId; const userId = data.userId; const wordsState = data.words; await this.userService.updateUserTypingState(roomId, userId, wordsState); } } async handleKickState(socket: Socket, data: KickStateType) { if (data) { const roomId = socket.data.user.RoomId || ''; const userId = data.userId; await this.roomService.handleKickAction(roomId, userId); } } }