from channels.generic.websocket import WebsocketConsumer from .models import * import json from django.template.loader import render_to_string from asgiref.sync import async_to_sync from django.shortcuts import get_object_or_404 import requests class OsitcomVisitor(WebsocketConsumer): def connect(self): async_to_sync(self.channel_layer.group_add)( 'ositcom_visitors', self.channel_name ) self.accept() self.visitor = None def disconnect(self, close_code): if self.visitor: self.visitor.left_date = datetime.now() self.visitor.save() async_to_sync(self.channel_layer.group_discard)( 'ositcom_visitors', self.channel_name ) def receive(self, text_data): text_data_json = json.loads(text_data) event_type = text_data_json.get('event_type') if event_type == 'new_visitor': self.visitor = Visitor.objects.create( session_id = text_data_json.get('session_id'), ip_address = text_data_json.get('client_ip'), referrer = text_data_json.get('referrer'), country = text_data_json.get('client_country'), url = text_data_json.get('url'), ) class OsitcomChatRoom(WebsocketConsumer): def connect(self): self.session_id = self.scope['url_route']['kwargs']['session_id'] async_to_sync(self.channel_layer.group_add)( self.session_id, self.channel_name ) self.accept() chat_room_guest = ChatRoomGuest.objects.filter(session_id=self.session_id).last() if chat_room_guest: chat_room = chat_room_guest.room self.chat_room = chat_room else: self.chat_room = None def disconnect(self, close_code): async_to_sync(self.channel_layer.group_discard)( self.session_id, self.channel_name ) def receive(self, text_data): text_data_json = json.loads(text_data) event_type = text_data_json.get('event_type') if event_type == 'load_chat': event = { 'type': 'load_chat_handler', } async_to_sync(self.channel_layer.group_send)( self.session_id, event ) if event_type == 'start_conversation': chat_room = ChatRoom.objects.create( name=f"Support: {self.session_id}", date_created = datetime.now() ) chat_room_guest = ChatRoomGuest.objects.create( room=chat_room, name= text_data_json.get('guest_name'), mobile_number= text_data_json.get('guest_mobile_number'), session_id=self.session_id ) self.chat_room = chat_room event = { 'type': 'start_conversation_handler', 'chat_room_id': chat_room.id } async_to_sync(self.channel_layer.group_send)( self.session_id, event ) if event_type == 'send_message': if text_data_json.get('user_id'): member = get_object_or_404(User, id=text_data_json.get('user_id')) else: member = None chat_message = ChatMessage.objects.create( member = member, room = self.chat_room, content=text_data_json.get('message'), date_sent = datetime.now() ) event = { 'type': 'send_message_handler', 'chat_message_id': chat_message.id } async_to_sync(self.channel_layer.group_send)( self.session_id, event ) def load_chat_handler(self, event): if self.chat_room: chat_room = self.chat_room chat_room_messages = ChatMessage.objects.filter(room=chat_room).order_by('date_sent') else: chat_room = None chat_room_messages = None context = { 'chat_room': chat_room, 'chat_room_messages': chat_room_messages, } html = render_to_string("chat-widget.html", context=context) self.send(text_data=json.dumps({ 'event_type': 'load_chat', 'html': html, })) def start_conversation_handler(self, event): chat_room = get_object_or_404(ChatRoom, id=event['chat_room_id']) context = { 'chat_room': chat_room, 'session_id':self.session_id } html = render_to_string("conversation.html", context=context) self.send(text_data=json.dumps({ 'event_type': 'start_conversation', 'html': html, })) def send_message_handler(self, event): chat_message = get_object_or_404(ChatMessage, id=event['chat_message_id']) context = { 'chat_message': chat_message, } html = render_to_string("partials/message.html", context=context) self.send(text_data=json.dumps({ 'event_type': 'send_message', 'html': html, }))