Как ограничить количество клиентов в комнате каналов django

Я хочу ограничить количество пользователей в комнате до 2, потому что я делаю игру с сокетами. в которой два игрока могут играть в игру "крестики-нолики" или "коннект-4", поэтому я пытаюсь найти способ ограничить только 2 игроков в одной комнате.

Ниже приведен мой comsumers.py

from channels.generic.websocket import WebsocketConsumer
from asgiref.sync import async_to_sync
import json


class GameRoom(WebsocketConsumer):

    def connect(self):
        self.room_name = self.scope['url_route']['kwargs']['room_code']
        self.room_group_name = 'room_%s' % self.room_name
        print(self.room_group_name)
        async_to_sync(self.channel_layer.group_add)(
            self.room_group_name,
            self.channel_name
        )

        self.accept()

Я удалил некоторые менее необходимые методы из этого вопроса

Вы должны создать модель room в вашем проекте и сохранить в ней подключенных пользователей, затем вы можете добавить validation в ваш метод connect, что-то вроде этого:

def connect(self):
    self.room_name = self.scope['url_route']['kwargs']['room_code']
    
    self.room = Room.objects.get(code=self.room_name)
    if self.room.connected_user >= 2:
        return self.close()
    else:
        self.room.connected_user = self.room.connected_user + 1
        self.room.save(update_fields=['connected_user'])

        self.room_group_name = 'room_%s' % self.room_name
        print(self.room_group_name)
        async_to_sync(self.channel_layer.group_add)(
            self.room_group_name,
            self.channel_name
        )

        self.accept()


def disconnect(self):
    ...
    self.room.connected_user = self.room.connected_user - 1 
    self.room.save(update_fields=['connected_user'])
  • Extra:

    и, конечно, вы можете использовать функцию F(), и сделать производительность лучше в connect и disconnect (полезно, когда много пользователей пытаются подключиться одновременно)

Вернуться на верх