You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
117 lines
3.6 KiB
117 lines
3.6 KiB
import json
|
|
|
|
from asgiref.sync import async_to_sync
|
|
from channels.generic.websocket import WebsocketConsumer
|
|
from channels.layers import get_channel_layer
|
|
from collections import defaultdict
|
|
import threading
|
|
|
|
class UserConsumer(WebsocketConsumer):
|
|
def connect(self):
|
|
self.user_id = self.scope["url_route"]["kwargs"]["user_id"]
|
|
self.group_name = f"sync_{self.user_id}"
|
|
|
|
# Join room group
|
|
async_to_sync(self.channel_layer.group_add)(
|
|
self.group_name, self.channel_name
|
|
)
|
|
|
|
self.accept()
|
|
|
|
def disconnect(self, close_code):
|
|
# Leave room group
|
|
async_to_sync(self.channel_layer.group_discard)(
|
|
self.group_name, self.channel_name
|
|
)
|
|
|
|
# Receive message from WebSocket
|
|
def receive(self, data):
|
|
# text_data_json = json.loads(text_data)
|
|
# message = text_data_json["message"]
|
|
print(f'received: {data}')
|
|
|
|
# Send message to room group
|
|
async_to_sync(self.channel_layer.group_send)(
|
|
self.group_name, {"type": "sync.update", "message": data} # sync.update calls the method below
|
|
)
|
|
|
|
# Receive message from room group
|
|
def sync_update(self, event):
|
|
message = event["message"]
|
|
# print(f'event = {event}')
|
|
|
|
# Send message to WebSocket
|
|
self.send(text_data=message)
|
|
|
|
class StatusConsumer(WebsocketConsumer):
|
|
# Class variable to track connections
|
|
connections = defaultdict(int)
|
|
connections_lock = threading.Lock()
|
|
|
|
def connect(self):
|
|
self.accept()
|
|
with self.connections_lock:
|
|
StatusConsumer.connections[self.channel_name] = 1
|
|
self.send_status_update()
|
|
|
|
def disconnect(self, close_code):
|
|
with self.connections_lock:
|
|
StatusConsumer.connections.pop(self.channel_name, None)
|
|
self.send_status_update()
|
|
|
|
def send_status_update(self):
|
|
channel_layer = get_channel_layer()
|
|
async_to_sync(channel_layer.group_send)(
|
|
"status_group",
|
|
{
|
|
"type": "status_message",
|
|
"message": {
|
|
"active_connections": len(StatusConsumer.connections),
|
|
"channel_layer_type": channel_layer.__class__.__name__
|
|
}
|
|
}
|
|
)
|
|
|
|
def receive(self, text_data):
|
|
# Handle any incoming messages if needed
|
|
pass
|
|
|
|
def status_message(self, event):
|
|
self.send(text_data=json.dumps(event["message"]))
|
|
|
|
# class ChatConsumer(WebsocketConsumer):
|
|
# def connect(self):
|
|
# self.room_name = 'main'
|
|
# self.room_group_name = f"chat_{self.room_name}"
|
|
|
|
# # Join room group
|
|
# async_to_sync(self.channel_layer.group_add)(
|
|
# self.room_group_name, self.channel_name
|
|
# )
|
|
|
|
# self.accept()
|
|
|
|
# def disconnect(self, close_code):
|
|
# # Leave room group
|
|
# async_to_sync(self.channel_layer.group_discard)(
|
|
# self.room_group_name, self.channel_name
|
|
# )
|
|
|
|
# # Receive message from WebSocket
|
|
# def receive(self, text_data):
|
|
# # text_data_json = json.loads(text_data)
|
|
# # message = text_data_json["message"]
|
|
# print(f'received {text_data}')
|
|
|
|
# # Send message to room group
|
|
# # chat.message calls the chat_message method
|
|
# async_to_sync(self.channel_layer.group_send)(
|
|
# self.room_group_name, {"type": "chat.message", "message": text_data}
|
|
# )
|
|
|
|
# # Receive message from room group
|
|
# def chat_message(self, event):
|
|
# message = event["message"]
|
|
|
|
# # Send message to WebSocket
|
|
# self.send(text_data=message)
|
|
|