From de3349e1c397906ba53171af5c97d9bbfae7a087 Mon Sep 17 00:00:00 2001 From: Xamora Date: Thu, 28 Dec 2023 19:26:57 +0100 Subject: [PATCH 1/4] tmp --- frontend/static/css/search.css | 17 ++++++- frontend/static/js/api/profiles.js | 4 -- frontend/static/js/views/Search.js | 75 ++++++++++++++++-------------- 3 files changed, 56 insertions(+), 40 deletions(-) diff --git a/frontend/static/css/search.css b/frontend/static/css/search.css index 5e1618d..46389d3 100644 --- a/frontend/static/css/search.css +++ b/frontend/static/css/search.css @@ -74,10 +74,10 @@ width: 100%; border: none; outline: none; - border-bottom: 0.2em solid green; + border-bottom: 0.15em solid green; caret-color: green; color: green; - font-size: 16px; + font-size: 0.8em; } #app #you { @@ -102,3 +102,16 @@ /* permet le retour à la ligne à la place de dépasser*/ word-wrap: break-word; } + +#app #invite { + position: relative; + background-color: green; + border: none; + color: white; + text-align: center; + text-decoration: none; + font-size: 0.8em; + height: 2em; + width: 4em; + cursor: pointer; +} diff --git a/frontend/static/js/api/profiles.js b/frontend/static/js/api/profiles.js index 19b7f3d..6845935 100644 --- a/frontend/static/js/api/profiles.js +++ b/frontend/static/js/api/profiles.js @@ -40,8 +40,6 @@ class Profiles }); let data = await response.json(); - console.log(response.status); - console.log(data); return data; } @@ -54,8 +52,6 @@ class Profiles }); let data = await response.json(); - console.log(response.status); - console.log(data); return data; } diff --git a/frontend/static/js/views/Search.js b/frontend/static/js/views/Search.js index 0cbd0ac..1d7db94 100644 --- a/frontend/static/js/views/Search.js +++ b/frontend/static/js/views/Search.js @@ -102,13 +102,12 @@ export default class extends AbstractView { let users = await client.profiles.all(); let logged = await client.isAuthentificate(); - /*let reload = document.getElementById("messages"); - if (reload != null) - reload.remove();*/ - let reload = document.getElementById("members"); - if (reload != null) - reload.remove(); + let reloads = ["members"]; + reloads.forEach(reload => { + if (document.getElementById(reload) != undefined) + document.getElementById(reload).remove(); + }); if (client.channel == undefined || !logged) return ; @@ -138,6 +137,8 @@ export default class extends AbstractView { client.channel.messages.forEach((message) => { if (messages.children[i] == null || message.content != messages.children[i].innerText) { let text = document.createElement("p"); + let date = new Date(message.time); + text.title = date.toLocaleString("fr-FR"); text.appendChild(document.createTextNode(message.content)); if (message.author_id == client.me.user_id) text.id = "you"; @@ -150,32 +151,30 @@ export default class extends AbstractView { }); // Input pour rentrer un message - if (document.getElementById("input_chat") == null) { - let chat_input = document.createElement("input"); - chat_input.id="input_chat"; - chat_input.type="text"; - chat_input.name="message"; - chat_input.placeholder="message bozo"; - chat_input.maxLength=255; - chat.appendChild(chat_input); - - chat_input.onkeydown = async () => { - if (event.keyCode == 13 && client.channel != undefined) { - //let chat_input = document.getElementById("input_chat"); - let chat_text = chat_input.value; + let chat_input = document.getElementById("input_chat") || document.createElement("input"); + chat_input.id="input_chat"; + chat_input.type="text"; + chat_input.name="message"; + chat_input.placeholder="message bozo"; + chat_input.maxLength=255; + chat.appendChild(chat_input); + + chat_input.onkeydown = async () => { + if (event.keyCode == 13 && client.channel != undefined) { + //let chat_input = document.getElementById("input_chat"); + let chat_text = chat_input.value; - let receivers_id = []; - client.channel.members_id.forEach((member_id) => { - if (member_id != client.me.user_id) - receivers_id.push(users.filter(user => user.user_id == member_id)[0].user_id); - }); - await client.channel.sendMessageChannel(chat_text, receivers_id) + let receivers_id = []; + client.channel.members_id.forEach((member_id) => { + if (member_id != client.me.user_id) + receivers_id.push(users.filter(user => user.user_id == member_id)[0].user_id); + }); + await client.channel.sendMessageChannel(chat_text, receivers_id) - // Reset - chat_input.value = ""; - } - }; - } + // Reset + chat_input.value = ""; + } + }; // nom des membres du chat let members = document.createElement("h2"); @@ -195,14 +194,22 @@ export default class extends AbstractView { // Scroll to the bottom of messages messages.scrollTop = messages.scrollHeight; + // Button to send invite to play + let invite = document.getElementById("invite") || document.createElement("button"); + invite.id = "invite"; + invite.innerText = "invite"; + chat.appendChild(invite); + } async hideChat() { - let close = document.getElementById("chat"); - if (close != null) - close.remove(); - + let closes = ["chat", "invite"] + closes.forEach(close => { + if (document.getElementById(close)) + document.getElementById(close).remove(); + + }); } async leavePage() { From 862b655dabaac0d691a755b438a9e99e97f378b0 Mon Sep 17 00:00:00 2001 From: Xamora Date: Tue, 2 Jan 2024 15:13:55 +0100 Subject: [PATCH 2/4] =?UTF-8?q?serveur=20down,=20tentative=20de=20r=C3=A9c?= =?UTF-8?q?up?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- chat/admin.py | 8 +- chat/consumers.py | 56 ++++++++------ chat/models.py | 19 +++-- chat/routing.py | 2 +- chat/serializers.py | 31 +++++++- chat/tests.py | 27 +++++++ chat/urls.py | 3 +- chat/views.py | 98 ++++++++----------------- frontend/static/js/api/chat/channel.js | 6 +- frontend/static/js/api/chat/channels.js | 14 ++-- frontend/static/js/views/Search.js | 3 + 11 files changed, 154 insertions(+), 113 deletions(-) diff --git a/chat/admin.py b/chat/admin.py index 8f38a1d..2778881 100644 --- a/chat/admin.py +++ b/chat/admin.py @@ -1,6 +1,6 @@ from django.contrib import admin -from .models import ChannelModel, MemberModel, MessageModel +from .models import ChatChannelModel, ChatMemberModel, ChatMessageModel -admin.site.register(ChannelModel) -admin.site.register(MemberModel) -admin.site.register(MessageModel) +admin.site.register(ChatChannelModel) +admin.site.register(ChatMemberModel) +admin.site.register(ChatMessageModel) diff --git a/chat/consumers.py b/chat/consumers.py index 9f07678..c230c6e 100644 --- a/chat/consumers.py +++ b/chat/consumers.py @@ -1,23 +1,26 @@ -import json from channels.generic.websocket import WebsocketConsumer from asgiref.sync import async_to_sync -from .models import MemberModel, MessageModel +from .models import ChatMemberModel, ChatMessageModel from profiles.models import BlockModel + import time +import json class ChatConsumer(WebsocketConsumer): def connect(self): - channel_id : str = self.scope['path'].split('/')[3] - - self.room_group_name = 'chat' + channel_id user = self.scope["user"] if (user.is_anonymous or not user.is_authenticated): return - if MemberModel.objects.filter(member_id=user.pk, channel_id=int(channel_id)).count() != 1: + + channel_id : int = int(self.scope['url_route']['kwargs']['chat_id']) + + if ChatMemberModel.objects.filter(member_id=user.pk, channel_id=int(channel_id)).count() != 1: return + self.room_group_name = f'chat{channel_id}' + if (self.channel_layer == None): return @@ -30,27 +33,33 @@ class ChatConsumer(WebsocketConsumer): def receive(self, text_data=None, bytes_data=None): + if text_data == None: return - text_data_json = json.loads(text_data) - message = text_data_json['message'] - receivers_id = text_data_json['receivers_id'] - - print(text_data) - - channel_id : int = int(self.scope['path'].split('/')[3]) user = self.scope["user"] if (user.is_anonymous or not user.is_authenticated): return - if MemberModel.objects.filter(member_id=user.pk, channel_id=channel_id).count() != 1: + text_data_json: dict = json.loads(text_data) + + message = text_data_json.get('message') + if (message is None): + return + + receivers_id = text_data_json.get('receivers_id') + if (receivers_id is None): + return + + channel_id : int = int(self.scope['url_route']['kwargs']['chat_id']) + + if ChatMemberModel.objects.filter(member_id=user.pk, channel_id=channel_id).count() != 1: return if (self.channel_layer == None): return - message_time : int = int(time.time() * 1000) + message_time: int = int(time.time() * 1000) if (len(receivers_id) == 1 and BlockModel.objects.filter(blocker=user.pk, blocked=receivers_id[0]) or @@ -68,22 +77,23 @@ class ChatConsumer(WebsocketConsumer): } ) - new_message = MessageModel() - new_message.channel_id = channel_id - new_message.author_id = user.pk - new_message.content = message - new_message.time = message_time - new_message.save() + new_message = ChatMessageModel( + channel_id = channel_id, + author_id = user.pk, + content = message, + time = message_time + ).save() def chat_message(self, event): - channel_id : int = int(self.scope['path'].split('/')[3]) user = self.scope["user"] if (user.is_anonymous or not user.is_authenticated): return - if MemberModel.objects.filter(member_id=user.pk, channel_id=channel_id).count() != 1: + channel_id: int = int(self.scope['url_route']['kwargs']['chat_id']) + + if ChatMemberModel.objects.filter(member_id=user.pk, channel_id=channel_id).count() != 1: return self.send(text_data=json.dumps({ diff --git a/chat/models.py b/chat/models.py index bc72b90..0ba4a7b 100644 --- a/chat/models.py +++ b/chat/models.py @@ -3,18 +3,27 @@ from django.db.models import IntegerField from django.contrib.auth.models import User from django.contrib import admin -# Create your models here. -class ChannelModel(models.Model): - pass +from typing import List -class MemberModel(models.Model): +# Create your models here. +class ChatChannelModel(models.Model): + + def create(self, users_id: List[int]): + self.save() + for user_id in users_id: + ChatMemberModel(channel_id = self.pk, member_id = user_id).save() + + def get_members_id(self): + return [member_channel.member_id for member_channel in ChatMemberModel.objects.filter(channel_id = self.pk)] + +class ChatMemberModel(models.Model): member_id = IntegerField(primary_key=False) channel_id = IntegerField(primary_key=False) def __str__(self): return "member_id: " + str(self.member_id) + ", channel_id: " + str(self.channel_id) -class MessageModel(models.Model): +class ChatMessageModel(models.Model): channel_id = IntegerField(primary_key=False) author_id = IntegerField(primary_key=False) content = models.CharField(max_length=255) diff --git a/chat/routing.py b/chat/routing.py index c799d8a..ddcf47d 100644 --- a/chat/routing.py +++ b/chat/routing.py @@ -2,5 +2,5 @@ from django.urls import re_path from . import consumers websocket_urlpatterns = [ - re_path(r'ws/chat/(?P\d+)/$', consumers.ChatConsumer.as_asgi()) + re_path(r'ws/chat/(?P\d+)$', consumers.ChatConsumer.as_asgi()) ] diff --git a/chat/serializers.py b/chat/serializers.py index 2d62490..f635b3e 100644 --- a/chat/serializers.py +++ b/chat/serializers.py @@ -1,8 +1,31 @@ from rest_framework import serializers -from .models import ChannelModel -class ChannelSerializer(serializers.ModelSerializer): +from profiles.models import ProfileModel + +from .models import ChatChannelModel, ChatMessageModel +from typing import List + +class ChatChannelSerializer(serializers.ModelSerializer): + + members_id = serializers.ListField(child = serializers.IntegerField()) class Meta: - model = ChannelModel - fields = [] + model = ChatChannelModel + fields = ["members_id", "pk"] + + def validate_members_id(self, value): + members_id: List[int] = value + if len(members_id) < 2: + raise serializers.ValidationError('Not enought members to create the channel') + if len(set(members_id)) != len(members_id): + raise serializers.ValidationError('Same member') + for member_id in members_id: + if not ProfileModel.objects.filter(pk = member_id).exists(): + raise serializers.ValidationError(f"The profile {member_id} doesn't exists.") + return members_id + +class ChatMessageSerializer(serializers.Serializer): + + class Meta: + model = ChatMessageModel + fields = ["channel_id", "author_id", "content", "time"] diff --git a/chat/tests.py b/chat/tests.py index 7ce503c..cf0ee9f 100644 --- a/chat/tests.py +++ b/chat/tests.py @@ -1,3 +1,30 @@ from django.test import TestCase +from django.test.client import Client +from django.http import HttpResponse, HttpRequest +from django.contrib.auth.models import User + # Create your tests here. +class ChatTest(TestCase): + def setUp(self): + self.client = Client() + + self.username='bozo1' + self.password='password' + + self.user: User = User.objects.create_user(username=self.username, password=self.password) + + self.dest: User = User.objects.create_user(username="bozo2", password=self.password) + + self.url = "/api/chat/" + + def test_create_chat(self): + self.client.login(username=self.username, password=self.password) + response: HttpResponse = self.client.post(self.url + str(self.user.pk), {"members_id": [self.user.pk, self.dest.pk]}) + response_dict: dict = eval(response.content) + self.assertDictEqual(response_dict, {}) + + def test_create_chat_unlogged(self): + response: HttpResponse = self.client.post(self.url + str(self.user.pk), {"members_id": [self.user.pk, self.dest.pk]}) + response_dict: dict = eval(response.content) + self.assertDictEqual(response_dict, {'detail': 'Authentication credentials were not provided.'}) diff --git a/chat/urls.py b/chat/urls.py index f6a905e..8c25ecc 100644 --- a/chat/urls.py +++ b/chat/urls.py @@ -5,6 +5,5 @@ from django.conf.urls.static import static from . import views urlpatterns = [ - path("", views.ChatView.as_view(), name="chat_page"), - path("", views.ChatsView.as_view(), name="chats_page"), + path("", views.ChannelView.as_view(), name="chats_page"), ] diff --git a/chat/views.py b/chat/views.py index 23e51ea..db1e650 100644 --- a/chat/views.py +++ b/chat/views.py @@ -1,79 +1,45 @@ from rest_framework.views import APIView from rest_framework.response import Response -from rest_framework import authentication, permissions, status +from rest_framework import permissions, status from rest_framework.authentication import SessionAuthentication -from .models import ChannelModel, MemberModel, MessageModel + +from django.http import HttpRequest +from django.contrib.auth import login +from django.db.models import QuerySet from django.core import serializers -class ChatView(APIView): + +from .models import ChatChannelModel, ChatMemberModel, ChatMessageModel +from .serializers import ChatChannelSerializer, ChatMessageSerializer + +class ChannelView(APIView): + + queryset = ChatChannelModel.objects + serializer_class = ChatChannelSerializer permission_classes = (permissions.IsAuthenticated,) - authentication_classes = (SessionAuthentication,) - - def get(self, request, pk): - if (ChannelModel.objects.filter(pk=pk)): - return Response({'channel_id': pk}, status=status.HTTP_200_OK) - else: - return Response("Channel doesn't exist", status=status.HTTP_404_NOT_FOUND) + authentication_classes = (SessionAuthentication,) - def delete(self, request, pk): - - ChannelModel.objects.filter(pk=pk).delete() - MessageModel.objects.filter(pk=pk).delete() - MemberModel.objects.filter(pk=pk).delete() - - return Response({'channel_id': pk}, status=status.HTTP_200_OK) - -class ChatsView(APIView): def post(self, request): - data: dict = request.data - users_id = request.data.get("users_id", []) - if len(users_id) < 2: - return Response('Not enought members to create the channel', status=status.HTTP_400_BAD_REQUEST) - if users_id[0] == users_id[1]: - return Response('Same member', status=status.HTTP_400_BAD_REQUEST) + serializer = self.serializer_class(data = request.data) + + serializer.is_valid(raise_exception=True) - for user_id1 in users_id: - for member1 in MemberModel.objects.filter(member_id=user_id1): - for user_id2 in users_id: - if user_id1 == user_id2: - continue - for member2 in MemberModel.objects.filter(member_id=user_id2): - if (member1.channel_id == member2.channel_id): - messages = MessageModel.objects.filter(channel_id=member1.channel_id).order_by("time") - messages = serializers.serialize("json", messages) - return Response({'channel_id': member1.channel_id, 'messages':messages}, status=status.HTTP_200_OK) - - new_channel = ChannelModel() - new_channel.save() + data: dict = serializer.validated_data - for user_id in users_id: + members_id = data.get("members_id") + if self.request.user.pk not in members_id: + return Response({"detail": "You are trying to create a chat group without you."}, status = status.HTTP_400_BAD_REQUEST) - new_member = MemberModel() - new_member.channel_id = new_channel.pk - new_member.member_id = user_id - new_member.save() + for member_channel in ChatMemberModel.objects.filter(member_id = members_id[0]): + channel_id: int = member_channel.channel_id + if not ChatChannelModel.objects.filter(pk = channel_id).exists(): + continue + channel: ChatChannelModel = ChatChannelModel.objects.get(pk = channel_id) + if set(channel.get_members_id()) == set(members_id): + messages = ChatMessageModel.objects.filter(channel_id = channel_id).order_by("time") + messages = serializers.serialize("json", messages) + return Response({'channel_id': channel_id, 'messages': messages}, status=status.HTTP_200_OK) - return Response({'channel_id': new_channel.pk}, status=status.HTTP_201_CREATED) - - def delete(self, request): - - data: dict = request.data - users_id = request.data.get("users_id", []) - - #print(list(MemberModel.objects.all())) - - for user_id1 in users_id: - for member1 in MemberModel.objects.filter(member_id=user_id1): - for user_id2 in users_id: - if user_id1 == user_id2: - break - for member2 in MemberModel.objects.filter(member_id=user_id2): - if (member1.channel_id == member2.channel_id): - MessageModel.objects.filter(channel_id=member1.channel_id).delete() - member1.delete() - member2.delete() - ChannelModel.objects.get(pk=member1.channel_id).delete() - return Response("Channel removed", status=status.HTTP_200_OK) - - return Response("Channel doesn't exist", status=status.HTTP_404_NOT_FOUND) + new_channel_id = ChatChannelModel().create(members_id) + return Response({'channel_id': new_channel_id}, status=status.HTTP_201_CREATED) diff --git a/frontend/static/js/api/chat/channel.js b/frontend/static/js/api/chat/channel.js index e1b7870..672a71e 100644 --- a/frontend/static/js/api/chat/channel.js +++ b/frontend/static/js/api/chat/channel.js @@ -14,7 +14,7 @@ class Channel { // reload = function to use when we receive a message async connect(reload) { - let url = `ws://${window.location.host}/ws/chat/${this.channel_id}/`; + let url = `${window.location.protocol[4] === 's' ? 'wss' : 'ws'}://${window.location.host}/ws/chat/${this.channel_id}`; this.chatSocket = new WebSocket(url); this.chatSocket.onmessage = (event) =>{ @@ -73,6 +73,10 @@ class Channel { return data; } + async sendInvite() { + + } + } export {Channel} diff --git a/frontend/static/js/api/chat/channels.js b/frontend/static/js/api/chat/channels.js index 5fad6fc..16ce742 100644 --- a/frontend/static/js/api/chat/channels.js +++ b/frontend/static/js/api/chat/channels.js @@ -6,18 +6,18 @@ class Channels { this.client = client; } - async createChannel(users_id, reload) { + async createChannel(members_id, reload) { let null_id = false; - users_id.forEach(user_id => { + members_id.forEach(user_id => { if (user_id == null) null_id = true; }); if (null_id) - return console.log(users_id, "createChannel error, null id;"); + return console.log(members_id, "createChannel error, null id;"); let response = await this.client._post("/api/chat/", { - users_id:users_id + members_id:members_id }); let data = await response.json(); @@ -28,12 +28,12 @@ class Channels { let messages = undefined; if (exit_code == 200) messages = data.messages; - return new Channel(this.client, data.channel_id, users_id, messages, reload); + return new Channel(this.client, data.channel_id, members_id, messages, reload); } - async deleteChannel(users_id) { + async deleteChannel(members_id) { let response = await this.client._delete("/api/chat/", { - users_id:users_id + members_id:members_id }); let data = await response.json(); diff --git a/frontend/static/js/views/Search.js b/frontend/static/js/views/Search.js index 1d7db94..fd8d3b9 100644 --- a/frontend/static/js/views/Search.js +++ b/frontend/static/js/views/Search.js @@ -198,6 +198,9 @@ export default class extends AbstractView { let invite = document.getElementById("invite") || document.createElement("button"); invite.id = "invite"; invite.innerText = "invite"; + invite.onclick = async () => { + + }; chat.appendChild(invite); } From 478456a1997ca31f5dbde348ba6ad817368bb171 Mon Sep 17 00:00:00 2001 From: Xamora Date: Mon, 8 Jan 2024 17:20:15 +0100 Subject: [PATCH 3/4] patch chat --- chat/models.py | 1 + chat/views.py | 3 +++ frontend/static/js/api/chat/channel.js | 1 - frontend/static/js/api/chat/channels.js | 7 ++++-- frontend/static/js/api/chat/notice.js | 0 frontend/static/js/api/profile.js | 2 +- frontend/static/js/views/Search.js | 32 ++++++++++++------------- profiles/views.py | 3 +-- 8 files changed, 27 insertions(+), 22 deletions(-) create mode 100644 frontend/static/js/api/chat/notice.js diff --git a/chat/models.py b/chat/models.py index 9710bc1..d8eb491 100644 --- a/chat/models.py +++ b/chat/models.py @@ -10,6 +10,7 @@ class ChatChannelModel(models.Model): self.save() for user_id in users_id: ChatMemberModel(channel_id = self.pk, member_id = user_id).save() + return self.pk def get_members_id(self): return [member_channel.member_id for member_channel in ChatMemberModel.objects.filter(channel_id = self.pk)] diff --git a/chat/views.py b/chat/views.py index db1e650..125d728 100644 --- a/chat/views.py +++ b/chat/views.py @@ -28,6 +28,9 @@ class ChannelView(APIView): data: dict = serializer.validated_data members_id = data.get("members_id") + if members_id == None: + return Response({"detail": "members_id is None."}, status = status.HTTP_400_BAD_REQUEST) + if self.request.user.pk not in members_id: return Response({"detail": "You are trying to create a chat group without you."}, status = status.HTTP_400_BAD_REQUEST) diff --git a/frontend/static/js/api/chat/channel.js b/frontend/static/js/api/chat/channel.js index 4ced5e6..be0ef2a 100644 --- a/frontend/static/js/api/chat/channel.js +++ b/frontend/static/js/api/chat/channel.js @@ -37,7 +37,6 @@ class Channel { updateMessages(messages) { - console.log(messages); messages = JSON.parse(messages); let new_messages = []; diff --git a/frontend/static/js/api/chat/channels.js b/frontend/static/js/api/chat/channels.js index 4d6bcc4..8739c93 100644 --- a/frontend/static/js/api/chat/channels.js +++ b/frontend/static/js/api/chat/channels.js @@ -1,9 +1,9 @@ import {Channel} from "./channel.js" -import {Message} from "./message.js" class Channels { constructor(client) { this.client = client; + this.channel = undefined; } async createChannel(members_id, reload) { @@ -29,7 +29,10 @@ class Channels { if (exit_code == 200) messages = data.messages; - return new Channel(this.client, data.channel_id, members_id, messages, reload); + console.log(response); + console.log(data); + this.channel = new Channel(this.client, data.channel_id, members_id, messages, reload); + return this.channel; } async deleteChannel(members_id) { diff --git a/frontend/static/js/api/chat/notice.js b/frontend/static/js/api/chat/notice.js new file mode 100644 index 0000000..e69de29 diff --git a/frontend/static/js/api/profile.js b/frontend/static/js/api/profile.js index b52314d..81b2a97 100644 --- a/frontend/static/js/api/profile.js +++ b/frontend/static/js/api/profile.js @@ -32,7 +32,7 @@ class Profile let block_response = await this.client._get("/api/profiles/block"); - if (block_response.status == 404) + if (block_response.status != 200) return let block_data = await block_response.json(); diff --git a/frontend/static/js/views/Search.js b/frontend/static/js/views/Search.js index fd8d3b9..348d704 100644 --- a/frontend/static/js/views/Search.js +++ b/frontend/static/js/views/Search.js @@ -54,22 +54,22 @@ export default class extends AbstractView { let add_chat = document.createElement("a"); add_chat.id = "add_chat_off"; add_chat.onclick = async () => { - if (client.channel != undefined) { - client.channel.members_id.forEach((member_id) => { + if (client.channels.channel != undefined) { + client.channels.channel.members_id.forEach((member_id) => { if (member_id == user.user_id) - client.channel = undefined; + client.channels.channel = undefined; }); - if (client.channel == undefined) { + if (client.channels.channel == undefined) { add_chat.id = "add_chat_off"; this.last_add_chat = undefined; - return this.hideChat(); + return await this.hideChat(); } - client.channel.disconnect(); + await client.channels.channel.disconnect(); } - client.channel = await client.channels.createChannel([client.me.user_id , user.user_id], this.chat); + client.channels.channel = await client.channels.createChannel([client.me.user_id , user.user_id], this.chat); this.chat(); if (this.last_add_chat != undefined) this.last_add_chat.id = "add_chat_off"; @@ -109,7 +109,7 @@ export default class extends AbstractView { document.getElementById(reload).remove(); }); - if (client.channel == undefined || !logged) + if (client.channels.channel == undefined || !logged) return ; let chats = document.getElementById("chats"); @@ -134,7 +134,7 @@ export default class extends AbstractView { // les messages, réecriture seulement du dernier let i = 0; - client.channel.messages.forEach((message) => { + client.channels.channel.messages.forEach((message) => { if (messages.children[i] == null || message.content != messages.children[i].innerText) { let text = document.createElement("p"); let date = new Date(message.time); @@ -160,16 +160,16 @@ export default class extends AbstractView { chat.appendChild(chat_input); chat_input.onkeydown = async () => { - if (event.keyCode == 13 && client.channel != undefined) { + if (event.keyCode == 13 && client.channels.channel != undefined) { //let chat_input = document.getElementById("input_chat"); let chat_text = chat_input.value; let receivers_id = []; - client.channel.members_id.forEach((member_id) => { + client.channels.channel.members_id.forEach((member_id) => { if (member_id != client.me.user_id) receivers_id.push(users.filter(user => user.user_id == member_id)[0].user_id); }); - await client.channel.sendMessageChannel(chat_text, receivers_id) + await client.channels.channel.sendMessageChannel(chat_text, receivers_id) // Reset chat_input.value = ""; @@ -180,7 +180,7 @@ export default class extends AbstractView { let members = document.createElement("h2"); members.id = "members"; let usernames = ""; - client.channel.members_id.forEach((member_id) => { + client.channels.channel.members_id.forEach((member_id) => { if (member_id != client.me.user_id) { if (usernames.length > 0) usernames += ", "; @@ -216,9 +216,9 @@ export default class extends AbstractView { } async leavePage() { - if (client.channel != undefined) - client.channel.disconnect(); - client.channel = undefined + if (client.channels.channel != undefined) + client.channels.channel.disconnect(); + client.channels.channel = undefined; } async getHtml() { diff --git a/profiles/views.py b/profiles/views.py index 06b5f0c..702e94f 100644 --- a/profiles/views.py +++ b/profiles/views.py @@ -26,8 +26,7 @@ class BlocksView(APIView): blocks = BlockModel.objects.filter(blocker=request.user.pk) if (blocks): return Response(serializers.serialize("json", BlockModel.objects.filter(blocker=request.user.pk)), status=status.HTTP_200_OK) - else: - return Response({}, status=status.HTTP_404_NOT_FOUND) + return Response({}, status=status.HTTP_204_NO_CONTENT) def post(self, request): data: dict = request.data From a7b5040ebcc9ffd33511e1dc0b9099b7d5db2346 Mon Sep 17 00:00:00 2001 From: Xamora Date: Mon, 8 Jan 2024 18:55:30 +0100 Subject: [PATCH 4/4] Add focus on chat input --- frontend/static/js/views/Search.js | 1 + 1 file changed, 1 insertion(+) diff --git a/frontend/static/js/views/Search.js b/frontend/static/js/views/Search.js index 348d704..ef55707 100644 --- a/frontend/static/js/views/Search.js +++ b/frontend/static/js/views/Search.js @@ -175,6 +175,7 @@ export default class extends AbstractView { chat_input.value = ""; } }; + chat_input.focus(); // nom des membres du chat let members = document.createElement("h2");