gemercheung 2 年 前
コミット
890cd17dd1
3 ファイル変更24 行追加4 行削除
  1. 11 2
      src/room/delay/delay.service.ts
  2. 6 2
      src/room/room.service.ts
  3. 7 0
      src/socket/socket.gateway.ts

+ 11 - 2
src/room/delay/delay.service.ts

@@ -21,7 +21,7 @@ export class DelayService {
     @Inject(forwardRef(() => RoomService))
     public readonly roomService: RoomService,
     public readonly tempService: TempService,
-  ) {}
+  ) { }
 
   async init(): Promise<void> {
     const redisDB = this.configService.get<string>('REDIS_DB');
@@ -49,7 +49,10 @@ export class DelayService {
       case this.isContainKeys(key, 'kankan:socket:tempRoom'):
         this.handleTempRoomExpiredSubscribe(key);
         break;
-
+      //限制重复登录去除
+      case this.isContainKeys(key, 'kankan:socket:devices:delay'):
+        this.handleLimitDevicesClear(key);
+        break;
       default:
         break;
     }
@@ -59,6 +62,12 @@ export class DelayService {
     return key.indexOf(exist) > -1;
   }
 
+  async handleLimitDevicesClear(key: string) {
+    const flagKey = key.replace('kankan:socket:devices:delay:', '');
+    const originKey = `kankan:socket:deviceId`;
+    await this.redis.hdel(originKey, flagKey);
+  }
+
   async handleTempRoomExpiredSubscribe(key: string) {
     const tKey = key.replace('kankan:socket:tempRoom:', '');
     // const params = tKey.split(':');

+ 6 - 2
src/room/room.service.ts

@@ -17,7 +17,7 @@ export class RoomService {
     private readonly actionsService: ActionsService,
     private readonly delayService: DelayService,
     private readonly tempService: TempService,
-  ) {}
+  ) { }
   public readonly logger = new Logger('user');
   public _sleep = (ms: number) => new Promise((r) => setTimeout(r, ms));
   public _userInfo = {} as UserInfoType;
@@ -58,7 +58,8 @@ export class RoomService {
 
   async handleUserOffline(socket: Socket) {
     await this._sleep(500);
-    if (socket.data?.user) {
+    // banning 离线过滤通知
+    if (socket.data?.user && !socket.data.banning) {
       this.delayService.handleOffline(socket);
       const { RoomId, UserId, Role } = socket.data.user;
       await this.userService.setRoomEntranceLog(RoomId, UserId, 1);
@@ -136,6 +137,7 @@ export class RoomService {
       // console.log('isMaxRoom', isMax);
       if (isMax && Role !== 'leader' && !isExist) {
         this.logger.warn(`308:room-maxing`, 'join-error');
+        socket.data.banning = true;
         socket.emit('manager-error', {
           type: 'room-maxing',
           code: 308,
@@ -147,6 +149,7 @@ export class RoomService {
       if (!blockJoin) {
         if (!isExist) {
           await this.userService.insertUser(socket.data.user);
+          socket.data.banning = false;
         } else {
           const updated = await this.userService.updateUsers(socket.data.user);
           if (!updated) {
@@ -158,6 +161,7 @@ export class RoomService {
               `same userId in room not matchRole `,
               'join-error',
             );
+            socket.data.banning = true;
             socket.disconnect(true);
             return;
           }

+ 7 - 0
src/socket/socket.gateway.ts

@@ -126,6 +126,13 @@ export class SocketGateway
       });
       this.logger.warn(`306:${message.userId}`, 'repeat-login');
       // 出现repeat-login 5min deviceId
+      const delayTime = 60 * 5;
+      this.redis.set(
+        `kankan:socket:devices:delay:${flag}`,
+        '',
+        'EX',
+        delayTime,
+      );
       return Promise.resolve(true);
     }
   }