diff --git a/site/interface/listError.txt b/site/interface/listError.txt new file mode 100644 index 0000000..c78b396 --- /dev/null +++ b/site/interface/listError.txt @@ -0,0 +1,13 @@ +8000 ~ 8999 : Ok code + +9000 ~ 9999 : Error code +- 9000 : Invalid token +- 9001 : Token not found +- 9002 : Invalid json +- 9003 : Invalid path +- 9004 : Invalid type +- 9005 : Invalid request +- 9006 : Invalid login type +- 9007 : Invalid username or password +- 9008 : User not found +- 9009 : Invalid message sent \ No newline at end of file diff --git a/site/interface/server/Class/User.py b/site/interface/server/Class/User.py new file mode 100644 index 0000000..34b8e46 --- /dev/null +++ b/site/interface/server/Class/User.py @@ -0,0 +1,121 @@ +# **************************************************************************** # +# # +# ::: :::::::: # +# User.py :+: :+: :+: # +# +:+ +:+ +:+ # +# By: edbernar {"type" : "login", "content" : {"username": "". "token": "", "id": 0}} + +userList = [ + { + "username": "Nexalith", + "token": "IDSNCSDAd465sd13215421", + "mail": "eddy@ediwor.fr", + "password": "ABC123", + "id": 9999999 + }, + { + "username": "user2", + "token": "789123", + "mail": "bb@bb.fr", + "password": "DEF456", + "id": 2 + }, + { + "username": "user3", + "token": "456789", + "mail": "cc@cc,fr", + "password": "GHI789", + "id": 3 + } +] + +async def loginByToken(userClass, content): + # |TOM| Requete pour savoir si le token est valide + for user in userList: + if (user["token"] == content["token"]): + jsonVar = {"type": "login", "content": {"username": user["username"], "token": user["token"], "id": user["id"]}} + userClass.username = jsonVar["content"]["username"] + userClass.token = jsonVar["content"]["token"] + userClass.id = jsonVar["content"]["id"] + await userClass.send(jsonVar) + return + jsonVar = {"type": "error", "content": "Invalid token", "code": 9001} + await userClass.send(json.dumps(jsonVar)) + +async def loginByPass(userClass, content): + # |TOM| Requete pour savoir si le mail et le mot de passe sont valides + # et créer un token si celui-ci n'existe pas + for user in userList: + if (user["mail"] == content["mail"] and user["password"] == content["password"]): + jsonVar = {"type": "login", "content": {"username": user["username"], "token": user["token"], "id": user["id"]}} + userClass.username = jsonVar["content"]["username"] + userClass.token = jsonVar["content"]["token"] + userClass.id = jsonVar["content"]["id"] + await userClass.send(jsonVar) + return + await userClass.send({"type": "error", "content": "Invalid username or password", "code": 9007}) + +async def verifyToken42(token42): + url = "https://api.intra.42.fr/v2/me" + headers = { + "Authorization": f"Bearer {token42}" + } + response = requests.get(url, headers=headers) + # |Eddy| Regarder ce que renvoie la requete quand elle est valide pour savoir qui rechercher + # dans la base de données + return (response.status_code == 200) + +async def loginBy42(userClass, content): + # |TOM| Requete pour récuperer les informations de l'utilisateur selon l'intra de la personne + # et créer un token si celui-ci n'existe pas + for user in userList: + if (await verifyToken42(content["token42"])): + jsonVar = {"type": "login", "content": {"username": user["username"], "token": user["token"], "id": user["id"]}} + await userClass.send(json.dumps(jsonVar)) + return + jsonVar = {"type": "error", "content": "Invalid 42 token", "code": 9008} + await userClass.send(json.dumps(jsonVar)) + +async def login(userClass, content): + # |TOM| Faire 3 types de requêtes: + # - byToken: Récupérer les informations de l'utilisateur en fonction de son token + # - byPass: Récupérer les informations de l'utilisateur en fonction de mail et de son mot de passe + # - by42: Récupérer les informations de l'utilisateur en fonction de son token42 (qui sera different du token) + try: + if (content["type"] == "byToken"): + await loginByToken(userClass, content) + elif (content["type"] == "byPass"): + await loginByPass(userClass, content) + elif (content["type"] == "by42"): + await loginBy42(userClass, content) + else: + await userClass.sendError("Invalid login type", 9006) + except Exception as e: + await userClass.sendError("Invalid request", 9005, e) \ No newline at end of file diff --git a/site/interface/server/typeRequets/sendPrivateMessage.py b/site/interface/server/typeRequets/sendPrivateMessage.py new file mode 100644 index 0000000..f1e27af --- /dev/null +++ b/site/interface/server/typeRequets/sendPrivateMessage.py @@ -0,0 +1,35 @@ +# **************************************************************************** # +# # +# ::: :::::::: # +# sendPrivateMessage.py :+: :+: :+: # +# +:+ +:+ +:+ # +# By: edbernar + + + + + Chat + + + + + + + + +
+

CHAT

+
+
+
+

Chat

+
+

X

+
+
+
+

Private

+

Game

+
+
+
+
+ + \ No newline at end of file diff --git a/site/interface/site/liveChat/launchPrivateChat.js b/site/interface/site/liveChat/launchPrivateChat.js new file mode 100644 index 0000000..e821ace --- /dev/null +++ b/site/interface/site/liveChat/launchPrivateChat.js @@ -0,0 +1,125 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* launchPrivateChat.js :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: edbernar ${user.name} +

Return

+ `; + h2Button[0].style.cursor = "default"; + returnButton = document.getElementById("returnButton"); + returnButton.style.cursor = "pointer"; + returnButton.addEventListener("click", () => { + divButtonTypeChatHome.innerHTML = ` +

Private

+

Game

+ `; + infoPanel.isOpen = false; + showListUser(); + }); +} + +async function displayAllMessage(divMessageListChatHome) +{ + divMessageListChatHome.style.height = "230px"; + divMessageListChatHome.style.paddingBottom = "20px"; + divMessageListChatHome.innerHTML = ''; + messageList.forEach(element => { + divMessageListChatHome.innerHTML += ` +
+

${element.content}

+

${element.date}

+
+ `; + }); + divMessageListChatHome.scrollTop = divMessageListChatHome.scrollHeight; +} + +async function displayInputBar(divMessageListChatHome, user) +{ + let sendButton; + let inputMessage; + + divMessageListChatHome.innerHTML += ` +
+ +

\>

+
+ `; + sendButton = document.getElementById("sendButton"); + sendButton.style.cursor = "pointer"; + sendButton.addEventListener("click", () => { + sendMessage(user); + inputMessage.value = ""; + inputMessage.focus(); + }); + inputMessage = document.getElementById("inputMessage"); + inputMessage.addEventListener("keyup", (event) => { + if (event.key === "Enter" && !event.shiftKey && inputMessage.value.trim() !== "") + { + event.preventDefault(); + sendMessage(user); + inputMessage.value = ""; + inputMessage.focus(); + } + }); + inputMessage.addEventListener("keydown", (event) => { + if (event.key === "Enter") + event.preventDefault(); + }); + inputMessage.focus(); +} + +function sendMessage(user) { + const inputMessage = document.getElementById("inputMessage"); + let message; + + message = { + from: userMeInfo.id, + to: user.id, + content: inputMessage.value, + time: new Date() + }; + sendRequest("send_private_message", message); +} + +export { launchPrivateChat }; \ No newline at end of file diff --git a/site/interface/site/liveChat/main.js b/site/interface/site/liveChat/main.js new file mode 100644 index 0000000..de73027 --- /dev/null +++ b/site/interface/site/liveChat/main.js @@ -0,0 +1,53 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* main.js :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: edbernar { + chatDiv.style.display = "flex"; + gameButtonChatHome.removeAttribute("id"); + privateButtonChatHome.setAttribute("id", "selected"); + await showListUser(); + }); + topChatHomeCross.addEventListener("click", () => { + chatDiv.style.display = "none"; + infoPanel.isOpen = false; + }); + privateButtonChatHome.addEventListener("click", async () => { + gameButtonChatHome.removeAttribute("id"); + privateButtonChatHome.setAttribute("id", "selected"); + await showListUser(); + }); + gameButtonChatHome.addEventListener("click", () => { + privateButtonChatHome.removeAttribute("id"); + gameButtonChatHome.setAttribute("id", "selected"); + showActualGameMessage(); + }); +} + +export { liveChat }; \ No newline at end of file diff --git a/site/interface/site/liveChat/showActualGameMessage.js b/site/interface/site/liveChat/showActualGameMessage.js new file mode 100644 index 0000000..a00b1e6 --- /dev/null +++ b/site/interface/site/liveChat/showActualGameMessage.js @@ -0,0 +1,85 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* showActualGameMessage.js :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: edbernar { + divMessageListChatHome.innerHTML += ` +
+

${element.content}

+

${element.date}

+
+ `; + }); + divMessageListChatHome.scrollTop = divMessageListChatHome.scrollHeight; + divMessageListChatHome.innerHTML += ` +
+ +

\>

+
+ `; +} + +export { showActualGameMessage }; \ No newline at end of file diff --git a/site/interface/site/liveChat/showUserList.js b/site/interface/site/liveChat/showUserList.js new file mode 100644 index 0000000..881c70a --- /dev/null +++ b/site/interface/site/liveChat/showUserList.js @@ -0,0 +1,50 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* showUserList.js :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: edbernar { + divMessageListChatHome.innerHTML += ` +
+
+ +
+

${element.name}

+
+ `; + }); + } + divMessageListChatHome.innerHTML += "

New conversation +

"; + divUser = document.getElementsByClassName("user"); + for (let i = 0; i < divUser.length; i++) { + divUser[i].addEventListener("click", async () => { + await launchPrivateChat(userList[i]); + }); + } +} + +export { showListUser }; \ No newline at end of file diff --git a/site/interface/site/main.js b/site/interface/site/main.js new file mode 100644 index 0000000..1cecbda --- /dev/null +++ b/site/interface/site/main.js @@ -0,0 +1,17 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* main.js :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: edbernar { + liveChat(); +}); diff --git a/site/interface/site/style/style.css b/site/interface/site/style/style.css new file mode 100644 index 0000000..a1301bc --- /dev/null +++ b/site/interface/site/style/style.css @@ -0,0 +1,243 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* style.css :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: edbernar +

${content.content}

+

${content.date}

+ + `); + infoPanel.divMessage.scrollTop = infoPanel.divMessage.scrollHeight; + } +} + +export { typeNewPrivateMessage }; \ No newline at end of file diff --git a/site/interface/site/typeResponse/typePrivateListMessage.js b/site/interface/site/typeResponse/typePrivateListMessage.js new file mode 100644 index 0000000..eb75aa1 --- /dev/null +++ b/site/interface/site/typeResponse/typePrivateListMessage.js @@ -0,0 +1,43 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* typePrivateListMessage.js :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: edbernar { + + if (messageListAvailable) + resolve(); + else + messageListResolve = resolve; + }); +} + +function typePrivateListMessage(list) { + messageList = list; + messageListAvailable = true; + if (messageListResolve) + { + messageListResolve(); + messageListResolve = null; + messageListAvailable = false; + } +} + +export { messageList, infoPanel, typePrivateListMessage, waitForMessageList }; \ No newline at end of file diff --git a/site/interface/site/typeResponse/typePrivateListUser.js b/site/interface/site/typeResponse/typePrivateListUser.js new file mode 100644 index 0000000..e8e4df1 --- /dev/null +++ b/site/interface/site/typeResponse/typePrivateListUser.js @@ -0,0 +1,36 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* typePrivateListUser.js :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* 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/interface/site/websocket.js b/site/interface/site/websocket.js new file mode 100644 index 0000000..6131732 --- /dev/null +++ b/site/interface/site/websocket.js @@ -0,0 +1,77 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* websocket.js :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: edbernar { + console.log('Connected'); + if (token) + sendRequest("login", {"type": "byToken", "token": token}); + +}; + +socket.onmessage = (event) => { + let response; + + try { + response = JSON.parse(event.data); + } catch { + return ; + } + if (response.code >= 9000 && response.code <= 9999) + console.warn(response); + else + { + try { + functionResponse[typeResponse.indexOf(response.type)](response.content); + } + catch { + console.warn(response); + } + } +}; + +socket.onclose = () => { + console.log('Disconnected'); +}; + +function sendRequest(type, content) { + let coc = null; + + if (content instanceof Object) + coc = JSON.stringify(content); + else + coc = content; + socket.send(JSON.stringify({ + type: type, + token: token, + content: content + })); +} + +export { socket, token, sendRequest }; \ No newline at end of file