diff --git a/osinaweb/db.sqlite3 b/osinaweb/db.sqlite3 index 20b52e67..e8acf2db 100644 Binary files a/osinaweb/db.sqlite3 and b/osinaweb/db.sqlite3 differ diff --git a/osinaweb/osichat/__pycache__/admin.cpython-310.pyc b/osinaweb/osichat/__pycache__/admin.cpython-310.pyc index 6e0809cb..ab534830 100644 Binary files a/osinaweb/osichat/__pycache__/admin.cpython-310.pyc and b/osinaweb/osichat/__pycache__/admin.cpython-310.pyc differ diff --git a/osinaweb/osichat/__pycache__/consumers.cpython-310.pyc b/osinaweb/osichat/__pycache__/consumers.cpython-310.pyc index 2bcaa00f..0641f80b 100644 Binary files a/osinaweb/osichat/__pycache__/consumers.cpython-310.pyc and b/osinaweb/osichat/__pycache__/consumers.cpython-310.pyc differ diff --git a/osinaweb/osichat/__pycache__/models.cpython-310.pyc b/osinaweb/osichat/__pycache__/models.cpython-310.pyc index 2323309b..1d729d5c 100644 Binary files a/osinaweb/osichat/__pycache__/models.cpython-310.pyc and b/osinaweb/osichat/__pycache__/models.cpython-310.pyc differ diff --git a/osinaweb/osichat/__pycache__/routing.cpython-310.pyc b/osinaweb/osichat/__pycache__/routing.cpython-310.pyc index 52d7d75f..4b85283d 100644 Binary files a/osinaweb/osichat/__pycache__/routing.cpython-310.pyc and b/osinaweb/osichat/__pycache__/routing.cpython-310.pyc differ diff --git a/osinaweb/osichat/admin.py b/osinaweb/osichat/admin.py index 44f8b1bf..50a8a297 100644 --- a/osinaweb/osichat/admin.py +++ b/osinaweb/osichat/admin.py @@ -1,7 +1,7 @@ from django.contrib import admin from .models import * # Register your models here. - +admin.site.register(Visitor) admin.site.register(ChatRoom) admin.site.register(ChatRoomGuest) admin.site.register(ChatMember) diff --git a/osinaweb/osichat/consumers.py b/osinaweb/osichat/consumers.py index f0c070e8..07b7edf2 100644 --- a/osinaweb/osichat/consumers.py +++ b/osinaweb/osichat/consumers.py @@ -6,6 +6,49 @@ from asgiref.sync import async_to_sync from django.shortcuts import get_object_or_404 +class OsitcomVisitor(WebsocketConsumer): + def connect(self): + self.accept() + 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'), + 'ip_address': text_data_json.get('ip_address'), + 'country': text_data_json.get('country'), + '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 = event['ip_address'], + country = event['country'], + url = event['url'], + visit_date = datetime.now(), + ) + self.visitor = visitor + + + + class OsitcomChatRoom(WebsocketConsumer): def connect(self): @@ -105,7 +148,6 @@ class OsitcomChatRoom(WebsocketConsumer): context = { 'chat_message': chat_message, } - print('lokf') html = render_to_string("partials/message.html", context=context) self.send(text_data=json.dumps({ 'event_type': 'send_message', diff --git a/osinaweb/osichat/migrations/0011_visitor_country.py b/osinaweb/osichat/migrations/0011_visitor_country.py new file mode 100644 index 00000000..6fde18b2 --- /dev/null +++ b/osinaweb/osichat/migrations/0011_visitor_country.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.5 on 2024-07-21 17:09 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('osichat', '0010_visitor_left_date_visitor_visit_date'), + ] + + operations = [ + migrations.AddField( + model_name='visitor', + name='country', + field=models.CharField(max_length=15, null=True), + ), + ] diff --git a/osinaweb/osichat/migrations/0012_alter_visitor_reference.py b/osinaweb/osichat/migrations/0012_alter_visitor_reference.py new file mode 100644 index 00000000..1935ef65 --- /dev/null +++ b/osinaweb/osichat/migrations/0012_alter_visitor_reference.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.5 on 2024-07-21 17:25 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('osichat', '0011_visitor_country'), + ] + + operations = [ + migrations.AlterField( + model_name='visitor', + name='reference', + field=models.URLField(blank=True, null=True), + ), + ] diff --git a/osinaweb/osichat/migrations/__pycache__/0011_visitor_country.cpython-310.pyc b/osinaweb/osichat/migrations/__pycache__/0011_visitor_country.cpython-310.pyc new file mode 100644 index 00000000..0c663675 Binary files /dev/null and b/osinaweb/osichat/migrations/__pycache__/0011_visitor_country.cpython-310.pyc differ diff --git a/osinaweb/osichat/migrations/__pycache__/0012_alter_visitor_reference.cpython-310.pyc b/osinaweb/osichat/migrations/__pycache__/0012_alter_visitor_reference.cpython-310.pyc new file mode 100644 index 00000000..cf306449 Binary files /dev/null and b/osinaweb/osichat/migrations/__pycache__/0012_alter_visitor_reference.cpython-310.pyc differ diff --git a/osinaweb/osichat/models.py b/osinaweb/osichat/models.py index 16b4eaf4..b06dc644 100644 --- a/osinaweb/osichat/models.py +++ b/osinaweb/osichat/models.py @@ -5,8 +5,9 @@ from osinacore.models import * class Visitor(models.Model): session_id = models.CharField(max_length=300) ip_address = models.CharField(max_length=300) + country = models.CharField(max_length=15, null=True) url = models.URLField() - reference = models.URLField() + reference = models.URLField(null=True, blank=True) visit_date = models.DateTimeField(null=True) left_date = models.DateTimeField(null=True) diff --git a/osinaweb/osichat/routing.py b/osinaweb/osichat/routing.py index 1d4d14d1..5439cef6 100644 --- a/osinaweb/osichat/routing.py +++ b/osinaweb/osichat/routing.py @@ -2,6 +2,7 @@ from django.urls import path from .consumers import * websocket_urlpatterns = [ + path("ws/osichat/visitors/", OsitcomVisitor.as_asgi()), path("ws/osichat//", OsitcomChatRoom.as_asgi()), ] \ No newline at end of file diff --git a/osinaweb/static/js/osichat/conversation.js b/osinaweb/static/js/osichat/conversation.js index a09e4ad3..b7062555 100644 --- a/osinaweb/static/js/osichat/conversation.js +++ b/osinaweb/static/js/osichat/conversation.js @@ -2,7 +2,6 @@ const chat_ws_scheme = window.location.protocol === "https:" ? "wss" : "ws"; const domain = "192.168.1.111:8000"; const sessionId = document.getElementById('session_id').textContent.trim(); -console.log(sessionId); const osichatSocketUrl = `${chat_ws_scheme}://${domain}/ws/osichat/${sessionId}/`; const osichatSocket = new WebSocket(osichatSocketUrl); diff --git a/osinaweb/static/js/osichat/visitors.js b/osinaweb/static/js/osichat/visitors.js new file mode 100644 index 00000000..eb4dc199 --- /dev/null +++ b/osinaweb/static/js/osichat/visitors.js @@ -0,0 +1,31 @@ + +const visitors_ws_scheme = window.location.protocol === "https:" ? "wss" : "ws"; +const my_domain = "192.168.1.111:8000"; +const session_id = document.getElementById('session_id').textContent.trim(); +const client_ip = document.getElementById('client_ip').textContent.trim(); +const client_country = document.getElementById('client_country').textContent.trim(); +const current_url = document.getElementById('current_url').textContent.trim(); +const visitorsSocketUrl = `${chat_ws_scheme}://${domain}/ws/osichat/visitors/`; +const visitorsSocket = new WebSocket(visitorsSocketUrl); + + +visitorsSocket.onopen = () => { + console.log('WebSocket connection to visitors established'); + const event_message = { + 'event_type': 'new_visitor', + 'session_id': session_id, + 'ip_address': client_ip, + 'country': client_country, + 'url': current_url + }; + visitorsSocket.send(JSON.stringify(event_message)); +}; + + +visitorsSocket.onclose = () => { + console.log('WebSocket connection to visitors closed'); +}; + +visitorsSocket.onerror = (error) => { + console.log('WebSocket error:', error); +};