From 80dfe70e05f21fac5cee74dc153ff973f0740836 Mon Sep 17 00:00:00 2001 From: Kum1ta Date: Fri, 2 Aug 2024 03:10:12 +0200 Subject: [PATCH] Websocket : - Log in is ok with token - Making people appear in chat but only works when you press private a second time --- site/module_livechat/listError.txt | 7 ++ site/module_livechat/note,txt | 68 +++++++++++++ site/module_livechat/server/main.py | 89 +++++++++++++----- .../getPrivateListUser.cpython-312.pyc | Bin 0 -> 1319 bytes .../server/typeRequets/getPrivateListUser.py | 44 +++++++++ site/module_livechat/site/main.js | 60 ++++-------- site/module_livechat/site/style.css | 4 +- .../site/typeResponse/typeLogin.js | 18 ++++ .../site/typeResponse/typePrivateListUser.js | 36 +++++++ site/module_livechat/site/websocket.js | 32 ++++--- 10 files changed, 275 insertions(+), 83 deletions(-) create mode 100644 site/module_livechat/listError.txt create mode 100644 site/module_livechat/note,txt create mode 100644 site/module_livechat/server/typeRequets/__pycache__/getPrivateListUser.cpython-312.pyc create mode 100644 site/module_livechat/server/typeRequets/getPrivateListUser.py create mode 100644 site/module_livechat/site/typeResponse/typeLogin.js create mode 100644 site/module_livechat/site/typeResponse/typePrivateListUser.js 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 0000000000000000000000000000000000000000..dd4e654115d0704c98b15d07d00cc322c27245da GIT binary patch literal 1319 zcmaJ7%Q6rS;}f8r!<6On{+XnI08Xg#)LCoxn=rU`{oLP!Y*3#l6KjO}&SJIl^& z%(|rtw1NuE&XhYR=mBfPjSJj@!U5&P+jTZYATiRs`QFUD_kHip{4hP8 zM=<_e{JQlZ=T|aNGiLfEZ%fM$Pexn>hAU%@j*9jp;1?Kw}w}Ww{tlz+OH^ zldv}xqiI0rVsswRg$Q*rO^wamM@>Dzh1uUD!p(4UlS}D4On7}7W`tu~4j;bMRmzpm z5i+2*?NXO}(lBl66iv}51J^Kxqqw7p@7jVgNh+nvGAY%FDTHmfZPzGOiaobe&_dmz zeI90{qRN+{24~^KP2V(yqOu!iMY|mnUP}nAqH8%;zY{Z6N~L#6WsR)XNPPvsYOTJ~ zuCFbZs;zdJGP7b<%jK1Fo$|FdZ%2$_z9E$-TruF@a3@I$RF>>=W~t%-R8S?Q<#7cR z6!5qX#{0rCq)h|v885FV6q5S3viA7!YC>U^i_&2x8@GshY9PE_X_RkRrR%R;_ujZ> zi{AQjU^F(Y&E0{aYET-?IALy^Guaj9?y!)gixNSvWU59q;-9$mXZx=ZmgKQJEca$*y-{p(8Q-7En3nr@4-C&1k9@lM;{L> zz~jME4^r=8r6v9y{MBhRMt4vzivHJ7*<_=aOVH!>aeR{J9(?fIkpJ`4f%aiK4GIFZ ziat(%qYZFD+YD!1&)TDk-?A;KZuydXg;c1kz~y1~^b;1+q0XqHVH)l_D%2%+Sg7}; zaKbe6`>uqLi2-j(=rC7dHadBWdNKvVE?+)*n{-8=6V6yb)`jW!;bTj3RWMGr-h6F? zNK0|j7tFUK6?@$5Qbj<>9`{HjWShU^bBO40wKW!d1GMhIjiMWbv;W=po&w^hVah6) z-_T$C=qQKgp80nD$I1Hs!Y??pKe&Hsl)doL-S_W)#twR)_P$tnG+%g>UHTa>{e+iJ zjiHS z+~{THZ7@d~#`qAOJ47>wXcDANT^vo%jq=-nWOYqHnnF_xqv`ok{^ptgWPDEl>BIT! gXa0PAzjo$75&O@N{n}zKwXYw)h%@+E?-KC;4MFLC2mk;8 literal 0 HcmV?d00001 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