You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

171 lines
5.4 KiB
Python

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):
self.accept()
ip_address = self.scope.get('headers', {}).get('x-forwarded-for', None)
if ip_address:
self.visitor_ip = ip_address.split(',')[0].strip()
else:
self.visitor_ip = self.scope.get('client', [None])[0]
if self.visitor_ip:
response = requests.get(f'http://ipinfo.io/{self.visitor_ip}/json')
data = response.json()
self.visitor_country = data.get('country', 'Unknown')
async_to_sync(self.channel_layer.group_add)(
'ositcom_visitors', self.channel_name
)
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':
event = {
'type': 'new_visitor_handler',
'session_id': text_data_json.get('session_id'),
'referrer': text_data_json.get('referrer'),
'url': text_data_json.get('url'),
}
async_to_sync(self.channel_layer.group_send)(
'ositcom_visitors', event
)
def new_visitor_handler(self, event):
visitor = Visitor.objects.create(
session_id = event['session_id'],
ip_address = self.visitor_ip,
country = self.visitor_country,
referrer = event['referrer'],
url = event['url'],
visit_date = datetime.now(),
)
self.visitor = visitor
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()
self.load_chat()
def disconnect(self, close_code):
async_to_sync(self.channel_layer.group_discard)(
self.session_id, self.channel_name
)
def load_chat(self):
event = {
'type': 'load_chat_handler',
}
async_to_sync(self.channel_layer.group_send)(
self.session_id, event
)
def receive(self, text_data):
text_data_json = json.loads(text_data)
event_type = text_data_json.get('event_type')
if event_type == 'start_conversation':
event = {
'type': 'start_conversation_handler',
'guest_name': text_data_json.get('guest_name'),
'guest_mobile_number': text_data_json.get('guest_mobile_number'),
}
async_to_sync(self.channel_layer.group_send)(
self.session_id, event
)
if event_type == 'send_message':
event = {
'type': 'send_message_handler',
'body': text_data_json['message']
}
async_to_sync(self.channel_layer.group_send)(
self.session_id, event
)
def load_chat_handler(self, event):
chat_room = None
chat_room_messages = None
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
chat_room_messages = ChatMessage.objects.filter(room=chat_room).order_by('date_sent')
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 = ChatRoom.objects.create(
name=f"Support: {self.session_id}",
date_created = datetime.now()
)
chat_room_guest = ChatRoomGuest.objects.create(
room=chat_room,
name=event['guest_name'],
mobile_number= event['guest_mobile_number'],
session_id=self.session_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 = ChatMessage.objects.create(
room = self.chat_room,
content=event['body'],
date_sent = datetime.now()
)
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,
}))