Как ограничить количество клиентов в комнате каналов 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
(полезно, когда много пользователей пытаются подключиться одновременно)