diff --git a/site/module_livechat/listError.txt b/site/module_livechat/listError.txt new file mode 100644 index 0000000..d450eca --- /dev/null +++ b/site/module_livechat/listError.txt @@ -0,0 +1,7 @@ +8000 ~ 8999 : Ok code + +9000 ~ 9999 : Error code +- 9000 : Invalid token +- 9001 : Token not found +- 9002 : Invalid json +- 9003 : Invalid path \ No newline at end of file diff --git a/site/module_livechat/note,txt b/site/module_livechat/note,txt new file mode 100644 index 0000000..515155f --- /dev/null +++ b/site/module_livechat/note,txt @@ -0,0 +1,68 @@ +# async def sendData(websocket): +# while True: +# try: +# await websocket.send(json.dumps({"message": "Hello client"})) +# except websockets.exceptions.ConnectionClosed as e: +# connected_clients.remove(websocket) +# print("Client disconnected with error :", e) +# break +# await asyncio.sleep(1) + +# async def receiveData(websocket): +# try : +# async for message in websocket: +# print(f"Message reçu : {message}") +# except websockets.exceptions.ConnectionClosed as e: +# print("Client disconnected with error :", e) + +# def verifyToken(websocket): +# try: +# token = websocket.request_headers["Sec-WebSocket-Protocol"] +# print(f"Token reçu : {token}") +# if token == validTokens: +# return True +# else: +# return False +# except KeyError as e: +# print(f"Error: {e}") +# return False + +# async def handler(websocket, path): +# print("client connected") +# connected_clients.add(websocket) +# websocket.request_headers["Sec-WebSocket-Protocol"] = "123456" +# await websocket.send("Connection established") + +# # try: +# # if path != "/": +# # print("client disconnected") +# # await websocket.send(json.dumps({"error": "Invalid path", "code": 9010})) +# # await websocket.close() +# # return +# # if verifyToken(websocket) == False: +# # print("client disconnected") +# # await websocket.send(json.dumps({"error": "Invalid token", "code": 9000})) +# # await websocket.close() +# # return + +# # send_task = asyncio.create_task(sendData(websocket)) +# # receive_task = asyncio.create_task(receiveData(websocket)) +# # await asyncio.gather(receive_task, send_task) +# # # except websockets.exceptions.ConnectionClosed as e: +# # # print("Client disconnected with error :", e) +# # # connected_clients.remove(websocket) +# # # return +# # # finally: +# # # connected_clients.remove(websocket) +# # # websocket.close() + + + +# try: +# start_server = websockets.serve(handler, "localhost", 8000, reuse_address=True) +# except OSError as e: +# print(f"Error: {e}") +# exit(1) +# asyncio.get_event_loop().run_until_complete(start_server) +# print("Server started") +# asyncio.get_event_loop().run_forever() \ No newline at end of file diff --git a/site/module_livechat/server/main.py b/site/module_livechat/server/main.py index 35cd68f..19cb653 100644 --- a/site/module_livechat/server/main.py +++ b/site/module_livechat/server/main.py @@ -1,37 +1,74 @@ +from typeRequets.getPrivateListUser import getPrivateListUser import asyncio import websockets import json -import time connected_clients = set() -validTokens = "123456" +userList = [ + { + "username": "user1", + "token": "123456", + "id": 1 + }, + { + "username": "user2", + "token": "789123", + "id": 2 + }, + { + "username": "user3", + "token": "456789", + "id": 3 + } +] -def sendData(websocket): - while True: - websocket.send("Heartbeat") - print("Heartbeat send") - time.sleep(5) +typeRequest = ["get_private_list_user"] +functionRequest = [getPrivateListUser] -async def handler(websocket, path): - print("New client connected to the server") - if path != "/": - print("client disconnected") - await websocket.send(json.dumps({"error": "Invalid path", "code": 9000})) - await websocket.close() +async def sendError(websocket, message, code): + jsonVar = {"type": "error", "content": message, "code": code} + await websocket.send(json.dumps(jsonVar)) + +async def sendInfoUser(websocket): + token = websocket.request_headers.get('Sec-WebSocket-Protocol') + user = [user for user in userList if user['token'] == token][0] + jsonVar = {"type": "login", "content": user} + await websocket.send(json.dumps(jsonVar)) + +async def isValidToken(websocket): + token = websocket.request_headers.get('Sec-WebSocket-Protocol') + # |TOM| Faire une requête à la base de données pour vérifier si le token est valide + if (token in [user['token'] for user in userList]): + await sendInfoUser(websocket) + return True + else: + return False + +async def handler(websocket, path): + if (not await isValidToken(websocket)): + await websocket.close(reason="Invalid token") return - connected_clients.add(websocket) - try : - async for message in websocket: - print(f"Message reçu : {message}") - except websockets.exceptions.ConnectionClosed as e: - print("Client disconnected with error :", e) - sendData(websocket) + try: + async for resquet in websocket: + try: + jsonRequest = json.loads(resquet) + except json.JSONDecodeError: + await sendError(websocket, "Invalid JSON", 9002) + continue + try: + if (jsonRequest["token"][0] != websocket.request_headers.get('Sec-WebSocket-Protocol')): + await sendError(websocket, "Invalid token", 9000) + continue + except: + await sendError(websocket, "Token not found", 9001) + continue + if (jsonRequest["type"] in typeRequest): + await functionRequest[typeRequest.index(jsonRequest["type"])](websocket) + + except websockets.ConnectionClosed: + print("Client déconnecté") + +start_server = websockets.serve(handler, "localhost", 8000, subprotocols=['123456']) -try: - start_server = websockets.serve(handler, "localhost", 8000, reuse_address=True) -except OSError as e: - print(f"Error: {e}") - exit(1) asyncio.get_event_loop().run_until_complete(start_server) -print("Server started") asyncio.get_event_loop().run_forever() \ No newline at end of file diff --git a/site/module_livechat/server/typeRequets/__pycache__/getPrivateListUser.cpython-312.pyc b/site/module_livechat/server/typeRequets/__pycache__/getPrivateListUser.cpython-312.pyc new file mode 100644 index 0000000..dd4e654 Binary files /dev/null and b/site/module_livechat/server/typeRequets/__pycache__/getPrivateListUser.cpython-312.pyc differ diff --git a/site/module_livechat/server/typeRequets/getPrivateListUser.py b/site/module_livechat/server/typeRequets/getPrivateListUser.py new file mode 100644 index 0000000..d141217 --- /dev/null +++ b/site/module_livechat/server/typeRequets/getPrivateListUser.py @@ -0,0 +1,44 @@ +import asyncio +import websockets +import json + +data = [ + { + "name": "Nessundorma", + "status": "online", + "pfp": "https://wallpapers-clan.com/wp-content/uploads/2023/05/cool-pfp-02.jpg" + }, + { + "name": "Succotash", + "status": "offline", + "pfp": "https://i.pinimg.com/200x/28/75/96/287596f98304bf1adc2c411619ae8fef.jpg" + }, + { + "name": "Astropower", + "status": "online", + "pfp": "https://ashisheditz.com/wp-content/uploads/2024/03/cool-anime-pfp-demon-slayer-HD.jpg" + }, + { + "name": "Assaultive", + "status": "offline", + "pfp": "https://i1.sndcdn.com/artworks-1Li0JIJrQGlojD3y-AEiNkw-t500x500.jpg" + }, + { + "name": "Redshock", + "status": "offline", + "pfp": "https://cdn.pfps.gg/pfps/7094-boy-pfp.png" + }, + { + "name": "Parley", + "status": "offline", + "pfp": "https://pbs.twimg.com/media/EscE6ckU0AA-Uhe.png" + }, +] + +async def getPrivateListUser(websocket): + # |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) + jsonVar = {"type": "private_list_user", "content": data} + print(jsonVar) + await websocket.send(json.dumps(jsonVar)) \ No newline at end of file diff --git a/site/module_livechat/site/main.js b/site/module_livechat/site/main.js index 897eac1..4ae6613 100644 --- a/site/module_livechat/site/main.js +++ b/site/module_livechat/site/main.js @@ -6,14 +6,15 @@ /* By: edbernar { - mainSocket(); liveChat(); }); @@ -23,51 +24,21 @@ function liveChat() { const topChatHomeCross = document.getElementById("topChatCross"); const privateButtonChatHome = document.getElementById("buttonTypeChatHome").getElementsByTagName("h2")[0]; const gameButtonChatHome= document.getElementById("buttonTypeChatHome").getElementsByTagName("h2")[1]; - let userList = [ - { - name: "Nessundorma", - status: "online", - pfp: "https://wallpapers-clan.com/wp-content/uploads/2023/05/cool-pfp-02.jpg" - }, - { - name: "Succotash", - status: "offline", - pfp: "https://i.pinimg.com/200x/28/75/96/287596f98304bf1adc2c411619ae8fef.jpg" - }, - { - name: "Astropower", - status: "online", - pfp: "https://ashisheditz.com/wp-content/uploads/2024/03/cool-anime-pfp-demon-slayer-HD.jpg" - }, - { - name: "Assaultive", - status: "offline", - pfp: "https://i1.sndcdn.com/artworks-1Li0JIJrQGlojD3y-AEiNkw-t500x500.jpg" - }, - { - name: "Redshock", - status: "offline", - pfp: "https://cdn.pfps.gg/pfps/7094-boy-pfp.png" - }, - { - name: "Parley", - status: "offline", - pfp: "https://pbs.twimg.com/media/EscE6ckU0AA-Uhe.png" - }, - ]; //Remplace temporairement la requete qui devra être de la meme forme - chatButton.addEventListener("click", () => { + chatButton.addEventListener("click", async () => { chatDiv.style.display = "flex"; + gameButtonChatHome.removeAttribute("id"); + privateButtonChatHome.setAttribute("id", "selected"); + await showListUserMessage(userList); }); topChatHomeCross.addEventListener("click", () => { chatDiv.style.display = "none"; }); - - showListUserMessage(userList); - privateButtonChatHome.addEventListener("click", () => { + + privateButtonChatHome.addEventListener("click", async () => { gameButtonChatHome.removeAttribute("id"); privateButtonChatHome.setAttribute("id", "selected"); - showListUserMessage(userList); + await showListUserMessage(userList); }); gameButtonChatHome.addEventListener("click", () => { privateButtonChatHome.removeAttribute("id"); @@ -76,10 +47,17 @@ function liveChat() { }); } -function showListUserMessage(userList) { +async function showListUserMessage(userList) { const divMessageListChatHome = document.getElementById("messageListChatHome"); let divUser; + socket.send(JSON.stringify({ + type: 'get_private_list_user', + token: token, + })); + + await waitForUserList(); + console.log(userList); divMessageListChatHome.style.height = "100%"; divMessageListChatHome.style.paddingBottom = "10px"; divMessageListChatHome.innerHTML = ''; diff --git a/site/module_livechat/site/style.css b/site/module_livechat/site/style.css index 9fd4fbf..a1301bc 100644 --- a/site/module_livechat/site/style.css +++ b/site/module_livechat/site/style.css @@ -6,7 +6,7 @@ /* By: edbernar { + if (userListAvailable) { + resolve(); + } else { + userListResolve = resolve; + } + }); +} + +function typePrivateListUser(list) { + userList = list; + userListAvailable = true; + if (userListResolve) { + userListResolve(); + userListResolve = null; + } +} + +export { userList, typePrivateListUser, waitForUserList }; \ No newline at end of file diff --git a/site/module_livechat/site/websocket.js b/site/module_livechat/site/websocket.js index d896bbb..c068ee6 100644 --- a/site/module_livechat/site/websocket.js +++ b/site/module_livechat/site/websocket.js @@ -6,17 +6,21 @@ /* By: edbernar { console.log('Connected'); - setInterval(() => { - socket.send("Heartbeat"); - }, 10000); }; socket.onmessage = (event) => { @@ -28,18 +32,20 @@ socket.onmessage = (event) => { return ; } if (response.code >= 9000 && response.code <= 9999) - { console.warn(response); - return ; + else + { + try { + functionResponse[typeResponse.indexOf(response.type)](response.content); + } + catch { + console.warn(response); + } } - console.log(response) }; + socket.onclose = () => { console.log('Disconnected'); }; -function mainSocket() { - -} - -export { mainSocket }; +export { socket, token}; \ No newline at end of file