Merge branch 'main' of github.com:Kum1ta/PTME_Transcendence

This commit is contained in:
Kum1ta
2024-09-28 21:50:47 +02:00
6 changed files with 82 additions and 22 deletions

View File

@ -18,6 +18,7 @@ class Message(models.Model):
date = models.DateTimeField(auto_now_add=True)
sender = models.ForeignKey("User",on_delete=models.SET_NULL, null=True, related_name="sender")
to = models.ForeignKey("User", on_delete=models.CASCADE, related_name="to")
read = models.BooleanField(default=False)
content = models.TextField()
class GameResults(models.Model):

View File

@ -6,32 +6,34 @@
# By: edbernar <edbernar@student.42.fr> +#+ +:+ +#+ #
# +#+#+#+#+#+ +#+ #
# Created: 2024/08/03 15:10:23 by edbernar #+# #+# #
# Updated: 2024/09/14 18:31:45 by tomoron ### ########.fr #
# Updated: 2024/09/28 20:42:02 by tomoron ### ########.fr #
# #
# **************************************************************************** #
import asyncio
import json
from ..models import Message, User
from django.db.models import Q
from asgiref.sync import sync_to_async
@sync_to_async
def getPrivateListUser(socket, content=None):
# |TOM| Faire une requête à la base de données pour récupérer la liste des
# utilisateurs qui doivent apparaitre dans la liste du chat privé
# (ceux qui ont eu conversation avec l'utilisateur)
# Si user existe pas, faire ça : socket.sendError("User not found", 9008)
id = socket.id
request = """
SELECT DISTINCT server_user.id AS id, username, pfp
FROM server_user
LEFT JOIN server_message AS sended ON sended.to_id=server_user.id
LEFT JOIN server_message AS received ON received.sender_id=server_user.id
WHERE sended.sender_id=%s OR received.to_id=%s;
"""
res = User.objects.raw(request,[id,id])
data = []
for x in res:
status = "online" if x.id in socket.onlinePlayers else "offline"
data.append({"name":x.username, "status": status, "pfp":x.pfp, "id":x.id})
socket.sync_send(json.dumps({"type": "private_list_user", "content": data}))
try:
uid = socket.id
request = """
SELECT DISTINCT server_user.id AS id, username, pfp
FROM server_user
LEFT JOIN server_message AS sended ON sended.to_id=server_user.id
LEFT JOIN server_message AS received ON received.sender_id=server_user.id
WHERE sended.sender_id=%s OR received.to_id=%s;
"""
res = User.objects.raw(request,[uid,uid])
socketUser = User.objects.get(id=uid)
data = []
for x in res:
unread = Message.objects.filter(Q(sender=x) & Q(to=socketUser) & Q(read=False)).exists()
status = "online" if x.id in socket.onlinePlayers else "offline"
data.append({"name":x.username, "status": status, "pfp":x.pfp, "id":x.id,"haveUnread":unread})
socket.sync_send(json.dumps({"type": "private_list_user", "content": data}))
except Exception as e:
socket.sendError("Invalid request", 9005, e)

View File

@ -0,0 +1,30 @@
# **************************************************************************** #
# #
# ::: :::::::: #
# readMessage.py :+: :+: :+: #
# +:+ +:+ +:+ #
# By: tomoron <tomoron@student.42.fr> +#+ +:+ +#+ #
# +#+#+#+#+#+ +#+ #
# Created: 2024/09/28 21:03:27 by tomoron #+# #+# #
# Updated: 2024/09/28 21:18:29 by tomoron ### ########.fr #
# #
# **************************************************************************** #
from django.db.models import Q
from asgiref.sync import sync_to_async
from ..models import User, Message
@sync_to_async
def readMessage(socket, content):
try:
if("id" not in content):
socket.sendError("Missing field", 9034)
dbUser = User.objects.filter(id=content["id"])
if(not dbUser.exists):
socket.sendError("User not found", 9008)
return
dbUser = dbUser[0]
dbSocketUser = User.objects.get(id=socket.id)
Message.objects.filter(Q(to=dbSocketUser) & Q(sender=dbUser) & Q(read=False)).update(read=True)
except Exception as e:
socket.sendError("Invalid request", 9005, e)

View File

@ -0,0 +1,24 @@
# **************************************************************************** #
# #
# ::: :::::::: #
# statusMessage.py :+: :+: :+: #
# +:+ +:+ +:+ #
# By: tomoron <tomoron@student.42.fr> +#+ +:+ +#+ #
# +#+#+#+#+#+ +#+ #
# Created: 2024/09/28 20:03:49 by tomoron #+# #+# #
# Updated: 2024/09/28 20:20:12 by tomoron ### ########.fr #
# #
# **************************************************************************** #
from django.db.models import Q
from ..models import User, Message
from asgiref.sync import sync_to_async
@sync_to_async
def statusMessage(socket,content):
try:
user = User.objects.get(id=socket.id)
haveUnread = Message.objects.filter(Q(to=user) & Q(read=False)).exists()
socket.sync_send({"type":"status_message","content":{"haveUnread" : haveUnread}})
except Exception as e:
socket.sendError("Invalid request", 9005, e)

View File

@ -6,7 +6,7 @@
# By: edbernar <edbernar@student.42angouleme. +#+ +:+ +#+ #
# +#+#+#+#+#+ +#+ #
# Created: 2024/09/09 14:31:30 by tomoron #+# #+# #
# Updated: 2024/09/28 03:19:46 by tomoron ### ########.fr #
# Updated: 2024/09/28 21:03:10 by tomoron ### ########.fr #
# #
# **************************************************************************** #
@ -32,16 +32,18 @@ from .typeRequests.getUserInfo import getUserInfo
from .typeRequests.getPrivateInfo import getPrivateInfo
from .typeRequests.changePrivateInfo import changePrivateInfo
from .typeRequests.changePfp import changePfp
from .typeRequests.statusMessage import statusMessage
from .typeRequests.readMessage import readMessage
typeRequest = ["login", "get_private_list_user", "get_private_list_message",
"send_private_message", "create_account", "get_all_list_user", "game",
"search_user", "get_user_info", "change_pfp", "change_banner",
"get_private_info", "change_private_info"
"get_private_info", "change_private_info","status_message", "read_message"
]
functionRequest = [login, getPrivateListUser, getPrivateListMessage,
sendPrivateMessage, createAccount, getAllListUser, gameRequest,
searchUser, getUserInfo, changePfp, changeBanner,
getPrivateInfo, changePrivateInfo
getPrivateInfo, changePrivateInfo, statusMessage, readMessage
]
from random import randint

View File

@ -35,6 +35,7 @@
- 9031 : You can't set or change this field if you have a 42 account
- 9032 : Your opponent isn't online
- 9033 : Skin id out of range
- 9034 : missing field
- 9100 : Action out of range
- 9101 : No game started