diff --git a/chat/consumers.py b/chat/consumers.py index 9ac7d9d..69a9d37 100644 --- a/chat/consumers.py +++ b/chat/consumers.py @@ -1,6 +1,5 @@ from channels.generic.websocket import WebsocketConsumer from asgiref.sync import async_to_sync - from .models import ChatMemberModel, ChatMessageModel from profiles.models import BlockModel @@ -10,7 +9,7 @@ import json class ChatConsumer(WebsocketConsumer): def connect(self): - + user = self.scope["user"] if (user.is_anonymous or not user.is_authenticated): return @@ -22,6 +21,8 @@ class ChatConsumer(WebsocketConsumer): 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 @@ -78,7 +79,12 @@ class ChatConsumer(WebsocketConsumer): } ) - new_message = ChatMessageModel(channel_id = channel_id, author_id = user.pk, content = message, time = message_time).save() + new_message = ChatMessageModel( + channel_id = channel_id, + author_id = user.pk, + content = message, + time = message_time + ).save() def chat_message(self, event): @@ -86,9 +92,9 @@ class ChatConsumer(WebsocketConsumer): if (user.is_anonymous or not user.is_authenticated): return - channel_id : int = int(self.scope['url_route']['kwargs']['chat_id']) + 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: + 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 852ced7..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)] @@ -28,4 +29,4 @@ class ChatMessageModel(models.Model): time = IntegerField(primary_key=False) def __str__(self): - return "author_id: " + str(self.author_id) + ", channel_id: " + str(self.channel_id) + ", content: " + self.content \ No newline at end of file + return "author_id: " + str(self.author_id) + ", channel_id: " + str(self.channel_id) + ", content: " + self.content diff --git a/chat/serializers.py b/chat/serializers.py index 3eedadf..14d3aec 100644 --- a/chat/serializers.py +++ b/chat/serializers.py @@ -27,4 +27,4 @@ class ChatMessageSerializer(serializers.Serializer): class Meta: model = ChatMessageModel - fields = ["channel_id", "author_id", "content", "time"] \ No newline at end of file + fields = ["channel_id", "author_id", "content", "time"] diff --git a/chat/views.py b/chat/views.py index bdee932..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) @@ -42,4 +45,4 @@ class ChannelView(APIView): return Response({'channel_id': channel_id, 'messages': messages}, status=status.HTTP_200_OK) new_channel_id = ChatChannelModel().create(members_id) - return Response({'channel_id': new_channel_id}, status=status.HTTP_201_CREATED) \ No newline at end of file + return Response({'channel_id': new_channel_id}, status=status.HTTP_201_CREATED) 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/chat/channel.js b/frontend/static/js/api/chat/channel.js index 881b0bd..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 = []; @@ -75,6 +74,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 5737ac3..249a79b 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) { @@ -28,7 +28,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 f728ee2..b3f1b15 100644 --- a/frontend/static/js/api/profile.js +++ b/frontend/static/js/api/profile.js @@ -34,8 +34,8 @@ class Profile let block_response = await this.client._get("/api/profiles/block"); - if (block_response.status == 404) - return; + if (block_response.status != 200) + return let block_data = await block_response.json(); let block_list = JSON.parse(block_data); diff --git a/frontend/static/js/api/profiles.js b/frontend/static/js/api/profiles.js index 2d59e70..177f5a0 100644 --- a/frontend/static/js/api/profiles.js +++ b/frontend/static/js/api/profiles.js @@ -41,8 +41,6 @@ class Profiles }); let data = await response.json(); - console.log(response.status); - console.log(data); return data; } @@ -55,8 +53,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 6c22325..bdcf548 100644 --- a/frontend/static/js/views/Search.js +++ b/frontend/static/js/views/Search.js @@ -55,22 +55,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 (member_id == user.id) - client.channel = undefined; + if (client.channels.channel != undefined) { + client.channels.channel.members_id.forEach((member_id) => { + if (member_id == user.user_id) + 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.id , 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"; @@ -99,17 +99,16 @@ export default class extends AbstractView { } - async chat(logged, profiles) { + async chat(logged, profiles) + { - /*let reload = document.getElementById("messages"); - if (reload != null) - reload.remove();*/ + let reloads = ["members"]; + reloads.forEach(reload => { + if (document.getElementById(reload) != undefined) + document.getElementById(reload).remove(); + }); - let reload = document.getElementById("members"); - if (reload != null) - reload.remove(); - - if (client.channel == undefined || !logged) + if (client.channels.channel == undefined || !logged) return ; let chats = document.getElementById("chats"); @@ -134,9 +133,11 @@ 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); + text.title = date.toLocaleString("fr-FR"); text.appendChild(document.createTextNode(message.content)); if (message.author_id == client.me) text.id = "you"; @@ -149,19 +150,18 @@ 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.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) => { @@ -170,18 +170,18 @@ export default class extends AbstractView { }); await client.channel.sendMessageChannel(chat_text, receivers_id) - // Reset - chat_input.value = ""; - } - }; - } + // Reset + chat_input.value = ""; + } + }; + chat_input.focus(); // nom des membres du chat let members = document.createElement("h2"); members.id = "members"; let usernames = ""; - client.channel.members_id.forEach((member_id) => { - if (member_id != client.me) { + client.channels.channel.members_id.forEach((member_id) => { + if (member_id != client.me.user_id) { if (usernames.length > 0) usernames += ", "; usernames += (profiles.filter(user => user.id == member_id)[0].username); @@ -194,20 +194,31 @@ 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"; + invite.onclick = async () => { + + }; + 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() { - 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 e32a8cf..dbcbcab 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