Websocket :

- Log in is ok with token
    - Making people appear in chat but only works when you press private a second time
This commit is contained in:
Kum1ta
2024-08-02 03:10:12 +02:00
parent 60dce87251
commit 1de491b958
10 changed files with 275 additions and 83 deletions

View File

@ -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

View File

@ -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()

View File

@ -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()

View File

@ -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))

View File

@ -6,14 +6,15 @@
/* By: edbernar <edbernar@student.42angouleme. +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/07/30 13:50:35 by edbernar #+# #+# */
/* Updated: 2024/07/31 22:26:47 by edbernar ### ########.fr */
/* Updated: 2024/08/02 03:09:12 by edbernar ### ########.fr */
/* */
/* ************************************************************************** */
import { mainSocket } from "./websocket.js";
import { socket, token } from "./websocket.js";
import { userList, waitForUserList } from "./typeResponse/typePrivateListUser.js";
// Peut etre faire une fonction pour faire les requetes pour ne pas à avoir à ramener token partout
document.addEventListener('DOMContentLoaded', () => {
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 = '';

View File

@ -6,7 +6,7 @@
/* By: edbernar <edbernar@student.42angouleme. +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/07/30 13:53:39 by edbernar #+# #+# */
/* Updated: 2024/07/31 00:37:48 by edbernar ### ########.fr */
/* Updated: 2024/08/01 23:25:38 by edbernar ### ########.fr */
/* */
/* ************************************************************************** */
@ -72,7 +72,6 @@ body {
display: flex;
flex-direction: row;
justify-content: space-between;
border-bottom: 1px solid #484848;
padding-bottom: 10px;
}
@ -80,7 +79,6 @@ body {
display: grid;
grid-template-columns: 50% 50%;
width: 100%;
border-bottom: 1px solid #484848;
}
#buttonTypeChatHome h2 {

View File

@ -0,0 +1,18 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* typeLogin.js :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: edbernar <edbernar@student.42angouleme. +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/08/02 00:39:53 by edbernar #+# #+# */
/* Updated: 2024/08/02 00:46:21 by edbernar ### ########.fr */
/* */
/* ************************************************************************** */
function typeLogin(content)
{
console.log("Welcome " + content.username + "\nYou're id is " + content.id);
}
export { typeLogin };

View File

@ -0,0 +1,36 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* typePrivateListUser.js :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: edbernar <edbernar@student.42angouleme. +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/08/02 01:56:15 by edbernar #+# #+# */
/* Updated: 2024/08/02 03:09:04 by edbernar ### ########.fr */
/* */
/* ************************************************************************** */
let userList = [];
let userListAvailable = false;
let userListResolve = null;
function waitForUserList() {
return new Promise((resolve) => {
if (userListAvailable) {
resolve();
} else {
userListResolve = resolve;
}
});
}
function typePrivateListUser(list) {
userList = list;
userListAvailable = true;
if (userListResolve) {
userListResolve();
userListResolve = null;
}
}
export { userList, typePrivateListUser, waitForUserList };

View File

@ -6,17 +6,21 @@
/* By: edbernar <edbernar@student.42angouleme. +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/07/31 22:17:24 by edbernar #+# #+# */
/* Updated: 2024/07/31 23:40:05 by edbernar ### ########.fr */
/* Updated: 2024/08/02 03:00:42 by edbernar ### ########.fr */
/* */
/* ************************************************************************** */
const socket = new WebSocket('ws://localhost:8000/');
import { typeLogin } from "./typeResponse/typeLogin.js";
import { typePrivateListUser } from "./typeResponse/typePrivateListUser.js";
const token = ['123456'];
const socket = new WebSocket('ws://localhost:8000/', token);
const typeResponse = ["login", "private_list_user"];
const functionResponse = [typeLogin, typePrivateListUser];
socket.onopen = () => {
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};