61 lines
1.8 KiB
Python
61 lines
1.8 KiB
Python
from asgiref.sync import async_to_sync
|
|
from channels.generic.websocket import WebsocketConsumer
|
|
import json
|
|
from .models import Lobby
|
|
|
|
class ChatConsumer(WebsocketConsumer):
|
|
def connect(self):
|
|
self.room_name = self.scope['url_route']['kwargs']['room_name']
|
|
self.room_group_name = f'chat_{self.room_name}'
|
|
|
|
checkSave = False
|
|
for lobby in Lobby.objects.all():
|
|
if lobby.name == self.room_name:
|
|
lobby.userCount = lobby.userCount + 1
|
|
Lobby.save(lobby)
|
|
checkSave = True
|
|
break
|
|
if checkSave == False:
|
|
lobbyRegister = Lobby()
|
|
lobbyRegister.name= self.room_name
|
|
lobbyRegister.userCount = 1
|
|
Lobby.save(lobbyRegister)
|
|
|
|
async_to_sync(self.channel_layer.group_add)(
|
|
self.room_group_name,
|
|
self.channel_name
|
|
)
|
|
|
|
self.accept()
|
|
|
|
def disconnect(self, close_code):
|
|
|
|
updateCountOfUsers = Lobby.objects.get(name = self.room_name)
|
|
updateCountOfUsers.userCount = updateCountOfUsers.userCount - 1
|
|
if updateCountOfUsers.userCount == 0:
|
|
Lobby.delete(updateCountOfUsers)
|
|
else:
|
|
Lobby.save(updateCountOfUsers)
|
|
|
|
async_to_sync(self.channel_layer.group_discard)(
|
|
self.room_group_name,
|
|
self.channel_name
|
|
)
|
|
|
|
def receive(self, text_data):
|
|
text_data_json = json.loads(text_data)
|
|
message = text_data_json
|
|
|
|
async_to_sync(self.channel_layer.group_send)(
|
|
self.room_group_name,
|
|
{
|
|
'type': 'chat_message',
|
|
'message': message
|
|
}
|
|
)
|
|
|
|
def chat_message(self, event):
|
|
message = event['message']
|
|
|
|
# Send message to WebSocket
|
|
self.send(text_data=json.dumps(message)) |