summaryrefslogtreecommitdiffstats
path: root/chat/consumers.py
diff options
context:
space:
mode:
Diffstat (limited to 'chat/consumers.py')
-rw-r--r--chat/consumers.py65
1 files changed, 65 insertions, 0 deletions
diff --git a/chat/consumers.py b/chat/consumers.py
new file mode 100644
index 0000000..bfba381
--- /dev/null
+++ b/chat/consumers.py
@@ -0,0 +1,65 @@
1import json
2
3from asgiref.sync import async_to_sync
4from channels.generic.websocket import WebsocketConsumer
5
6
7class ChatConsumer(WebsocketConsumer):
8 def connect(self):
9 self.room_name = self.scope["url_route"]["kwargs"]["room_name"]
10 self.room_group_name = f"chat_{self.room_name}"
11 self.username = "Anonymous"
12
13 async_to_sync(self.channel_layer.group_add)(
14 self.room_group_name, self.channel_name
15 )
16 self.accept()
17
18 def disconnect(self, close_code):
19 async_to_sync(self.channel_layer.group_discard)(
20 self.room_group_name, self.channel_name
21 )
22 async_to_sync(self.channel_layer.group_send)(
23 self.room_group_name,
24 {"type": "system.message", "text": f"{self.username} left the chat"},
25 )
26
27 def receive(self, text_data):
28 text_data_json = json.loads(text_data)
29 msg_type = text_data_json.get("type", "message")
30
31 if msg_type == "join":
32 self.username = text_data_json.get("username", "Anonymous")
33 async_to_sync(self.channel_layer.group_send)(
34 self.room_group_name,
35 {"type": "system.message", "text": f"{self.username} joined the chat"},
36 )
37 return
38
39 if msg_type == "rename":
40 old_name = self.username
41 self.username = text_data_json.get("username", self.username)
42 async_to_sync(self.channel_layer.group_send)(
43 self.room_group_name,
44 {"type": "system.message", "text": f"{old_name} is now known as {self.username}"},
45 )
46 return
47
48 message = text_data_json["message"]
49 username = text_data_json.get("username", self.username)
50 async_to_sync(self.channel_layer.group_send)(
51 self.room_group_name,
52 {"type": "chat.message", "message": message, "username": username},
53 )
54
55 def chat_message(self, event):
56 self.send(text_data=json.dumps({
57 "message": event["message"],
58 "username": event["username"],
59 }))
60
61 def system_message(self, event):
62 self.send(text_data=json.dumps({
63 "type": "system",
64 "text": event["text"],
65 }))