actions.service.ts 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. import { InjectRedis } from '@liaoliaots/nestjs-redis';
  2. import { forwardRef, Inject, Injectable } from '@nestjs/common';
  3. import { Redis } from 'ioredis';
  4. import { Socket } from 'socket.io';
  5. import { RoomService } from '../room.service';
  6. import { UsersService } from '../users/users.service';
  7. @Injectable()
  8. export class ActionsService {
  9. constructor(
  10. @InjectRedis() private readonly redis: Redis,
  11. @Inject(forwardRef(() => RoomService))
  12. private roomService: RoomService,
  13. @Inject(forwardRef(() => UsersService))
  14. private userService: UsersService,
  15. ) {}
  16. async handleAllAction(socket: Socket, data: ActionsParams): Promise<void> {
  17. const isSocketLeader = () => {
  18. return socket.data.user?.Role === 'leader';
  19. };
  20. switch (data.type) {
  21. case 'danmumsg':
  22. const params = {} as DanmakuDataType;
  23. params.mode = data.data.mode;
  24. params.nickname = data.data.Nickname;
  25. params.text = data.data.text;
  26. params.userId = data.data.UserId;
  27. this.handleDanmaku(params);
  28. break;
  29. case 'users-muted':
  30. const mutedParams = data as any as MutedStateType;
  31. isSocketLeader() && (await this.handleMutedState(mutedParams));
  32. break;
  33. case 'users-words':
  34. const typingParams = data as any as TypingStateType;
  35. isSocketLeader() && (await this.handleTypingState(typingParams));
  36. break;
  37. case 'users-kicked':
  38. const kickParams = data as any as KickStateType;
  39. // console.log('kickParams', socket.data.user, kickParams);
  40. isSocketLeader() && (await this.handleKickState(socket, kickParams));
  41. break;
  42. default:
  43. break;
  44. }
  45. socket.broadcast.emit('action', data);
  46. }
  47. // answer(data: any) {
  48. // this.roomService.socketGateway._socket.broadcast.emit('action', data);
  49. // }
  50. async handleDanmaku(data: DanmakuDataType) {
  51. console.log('data', data);
  52. const roomId = this.roomService._userInfo.RoomId;
  53. const time = Date.now();
  54. if (roomId) {
  55. this.redis.hset(
  56. `kankan:socket:roomMsg:${roomId}`,
  57. time,
  58. JSON.stringify(data),
  59. );
  60. } else {
  61. this.roomService.logger.warn(
  62. 'handleDanmaku missing roomId ',
  63. 'ActionsService',
  64. );
  65. }
  66. }
  67. async handleMutedState(data: MutedStateType) {
  68. if (data) {
  69. const roomId = this.roomService._userInfo.RoomId;
  70. const userId = data.userId;
  71. const mutedState = data.muted;
  72. await this.userService.updateUserMicState(roomId, userId, mutedState);
  73. }
  74. }
  75. async handleTypingState(data: TypingStateType) {
  76. if (data) {
  77. const roomId = this.roomService._userInfo.RoomId;
  78. const userId = data.userId;
  79. const wordsState = data.words;
  80. await this.userService.updateUserTypingState(roomId, userId, wordsState);
  81. }
  82. }
  83. async handleKickState(socket: Socket, data: KickStateType) {
  84. if (data) {
  85. const roomId = socket.data.user.RoomId || '';
  86. const userId = data.userId;
  87. await this.roomService.handleKickAction(roomId, userId);
  88. }
  89. }
  90. }