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 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()
|
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. +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* 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 = '';
|
||||
|
@ -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 {
|
||||
|
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. +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* 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};
|
Reference in New Issue
Block a user