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:
7
site/module_livechat/listError.txt
Normal file
7
site/module_livechat/listError.txt
Normal 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
|
68
site/module_livechat/note,txt
Normal file
68
site/module_livechat/note,txt
Normal 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()
|
@ -1,37 +1,74 @@
|
|||||||
|
from typeRequets.getPrivateListUser import getPrivateListUser
|
||||||
import asyncio
|
import asyncio
|
||||||
import websockets
|
import websockets
|
||||||
import json
|
import json
|
||||||
import time
|
|
||||||
|
|
||||||
connected_clients = set()
|
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):
|
typeRequest = ["get_private_list_user"]
|
||||||
while True:
|
functionRequest = [getPrivateListUser]
|
||||||
websocket.send("Heartbeat")
|
|
||||||
print("Heartbeat send")
|
async def sendError(websocket, message, code):
|
||||||
time.sleep(5)
|
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):
|
async def handler(websocket, path):
|
||||||
print("New client connected to the server")
|
if (not await isValidToken(websocket)):
|
||||||
if path != "/":
|
await websocket.close(reason="Invalid token")
|
||||||
print("client disconnected")
|
|
||||||
await websocket.send(json.dumps({"error": "Invalid path", "code": 9000}))
|
|
||||||
await websocket.close()
|
|
||||||
return
|
return
|
||||||
connected_clients.add(websocket)
|
try:
|
||||||
try :
|
async for resquet in websocket:
|
||||||
async for message in websocket:
|
try:
|
||||||
print(f"Message reçu : {message}")
|
jsonRequest = json.loads(resquet)
|
||||||
except websockets.exceptions.ConnectionClosed as e:
|
except json.JSONDecodeError:
|
||||||
print("Client disconnected with error :", e)
|
await sendError(websocket, "Invalid JSON", 9002)
|
||||||
sendData(websocket)
|
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)
|
asyncio.get_event_loop().run_until_complete(start_server)
|
||||||
print("Server started")
|
|
||||||
asyncio.get_event_loop().run_forever()
|
asyncio.get_event_loop().run_forever()
|
Binary file not shown.
@ -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))
|
@ -6,14 +6,15 @@
|
|||||||
/* By: edbernar <edbernar@student.42angouleme. +#+ +:+ +#+ */
|
/* By: edbernar <edbernar@student.42angouleme. +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2024/07/30 13:50:35 by edbernar #+# #+# */
|
/* 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', () => {
|
document.addEventListener('DOMContentLoaded', () => {
|
||||||
mainSocket();
|
|
||||||
liveChat();
|
liveChat();
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -23,51 +24,21 @@ function liveChat() {
|
|||||||
const topChatHomeCross = document.getElementById("topChatCross");
|
const topChatHomeCross = document.getElementById("topChatCross");
|
||||||
const privateButtonChatHome = document.getElementById("buttonTypeChatHome").getElementsByTagName("h2")[0];
|
const privateButtonChatHome = document.getElementById("buttonTypeChatHome").getElementsByTagName("h2")[0];
|
||||||
const gameButtonChatHome= document.getElementById("buttonTypeChatHome").getElementsByTagName("h2")[1];
|
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";
|
chatDiv.style.display = "flex";
|
||||||
|
gameButtonChatHome.removeAttribute("id");
|
||||||
|
privateButtonChatHome.setAttribute("id", "selected");
|
||||||
|
await showListUserMessage(userList);
|
||||||
});
|
});
|
||||||
topChatHomeCross.addEventListener("click", () => {
|
topChatHomeCross.addEventListener("click", () => {
|
||||||
chatDiv.style.display = "none";
|
chatDiv.style.display = "none";
|
||||||
});
|
});
|
||||||
|
|
||||||
showListUserMessage(userList);
|
privateButtonChatHome.addEventListener("click", async () => {
|
||||||
privateButtonChatHome.addEventListener("click", () => {
|
|
||||||
gameButtonChatHome.removeAttribute("id");
|
gameButtonChatHome.removeAttribute("id");
|
||||||
privateButtonChatHome.setAttribute("id", "selected");
|
privateButtonChatHome.setAttribute("id", "selected");
|
||||||
showListUserMessage(userList);
|
await showListUserMessage(userList);
|
||||||
});
|
});
|
||||||
gameButtonChatHome.addEventListener("click", () => {
|
gameButtonChatHome.addEventListener("click", () => {
|
||||||
privateButtonChatHome.removeAttribute("id");
|
privateButtonChatHome.removeAttribute("id");
|
||||||
@ -76,10 +47,17 @@ function liveChat() {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function showListUserMessage(userList) {
|
async function showListUserMessage(userList) {
|
||||||
const divMessageListChatHome = document.getElementById("messageListChatHome");
|
const divMessageListChatHome = document.getElementById("messageListChatHome");
|
||||||
let divUser;
|
let divUser;
|
||||||
|
|
||||||
|
socket.send(JSON.stringify({
|
||||||
|
type: 'get_private_list_user',
|
||||||
|
token: token,
|
||||||
|
}));
|
||||||
|
|
||||||
|
await waitForUserList();
|
||||||
|
console.log(userList);
|
||||||
divMessageListChatHome.style.height = "100%";
|
divMessageListChatHome.style.height = "100%";
|
||||||
divMessageListChatHome.style.paddingBottom = "10px";
|
divMessageListChatHome.style.paddingBottom = "10px";
|
||||||
divMessageListChatHome.innerHTML = '';
|
divMessageListChatHome.innerHTML = '';
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
/* By: edbernar <edbernar@student.42angouleme. +#+ +:+ +#+ */
|
/* By: edbernar <edbernar@student.42angouleme. +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2024/07/30 13:53:39 by edbernar #+# #+# */
|
/* 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;
|
display: flex;
|
||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
border-bottom: 1px solid #484848;
|
|
||||||
padding-bottom: 10px;
|
padding-bottom: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -80,7 +79,6 @@ body {
|
|||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: 50% 50%;
|
grid-template-columns: 50% 50%;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
border-bottom: 1px solid #484848;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#buttonTypeChatHome h2 {
|
#buttonTypeChatHome h2 {
|
||||||
|
18
site/module_livechat/site/typeResponse/typeLogin.js
Normal file
18
site/module_livechat/site/typeResponse/typeLogin.js
Normal 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 };
|
@ -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 };
|
@ -6,17 +6,21 @@
|
|||||||
/* By: edbernar <edbernar@student.42angouleme. +#+ +:+ +#+ */
|
/* By: edbernar <edbernar@student.42angouleme. +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2024/07/31 22:17:24 by edbernar #+# #+# */
|
/* 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 = () => {
|
socket.onopen = () => {
|
||||||
console.log('Connected');
|
console.log('Connected');
|
||||||
setInterval(() => {
|
|
||||||
socket.send("Heartbeat");
|
|
||||||
}, 10000);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
socket.onmessage = (event) => {
|
socket.onmessage = (event) => {
|
||||||
@ -28,18 +32,20 @@ socket.onmessage = (event) => {
|
|||||||
return ;
|
return ;
|
||||||
}
|
}
|
||||||
if (response.code >= 9000 && response.code <= 9999)
|
if (response.code >= 9000 && response.code <= 9999)
|
||||||
{
|
|
||||||
console.warn(response);
|
console.warn(response);
|
||||||
return ;
|
else
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
functionResponse[typeResponse.indexOf(response.type)](response.content);
|
||||||
|
}
|
||||||
|
catch {
|
||||||
|
console.warn(response);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
console.log(response)
|
|
||||||
};
|
};
|
||||||
|
|
||||||
socket.onclose = () => {
|
socket.onclose = () => {
|
||||||
console.log('Disconnected');
|
console.log('Disconnected');
|
||||||
};
|
};
|
||||||
|
|
||||||
function mainSocket() {
|
export { socket, token};
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
export { mainSocket };
|
|
Reference in New Issue
Block a user