From 76465732d1c9d065e3c1dde0b2d28e382e6697de Mon Sep 17 00:00:00 2001 From: NigeParis Date: Tue, 16 Dec 2025 18:32:42 +0100 Subject: [PATCH 1/6] Error with Master pino creahes changed to pino-pretty --- frontend/src/pages/login/login.ts | 1 - frontend/src/pages/root/pong_box_image.png | Bin 0 -> 25973 bytes frontend/src/pages/root/root.ts | 1 - src/auth/src/run.ts | 2 +- src/chat/src/run.ts | 2 +- src/user/src/run.ts | 2 +- 6 files changed, 3 insertions(+), 5 deletions(-) create mode 100644 frontend/src/pages/root/pong_box_image.png diff --git a/frontend/src/pages/login/login.ts b/frontend/src/pages/login/login.ts index f128455..352aba5 100644 --- a/frontend/src/pages/login/login.ts +++ b/frontend/src/pages/login/login.ts @@ -96,7 +96,6 @@ async function handleOtp( } } } - inputs[0].focus(); } diff --git a/frontend/src/pages/root/pong_box_image.png b/frontend/src/pages/root/pong_box_image.png new file mode 100644 index 0000000000000000000000000000000000000000..b9a870ea7987c8c53b0c207e245053b9b23d4e7e GIT binary patch literal 25973 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 D2Y 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�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 literal 0 HcmV?d00001 diff --git a/frontend/src/pages/root/root.ts b/frontend/src/pages/root/root.ts index 3b0b7df..2c42480 100644 --- a/frontend/src/pages/root/root.ts +++ b/frontend/src/pages/root/root.ts @@ -11,7 +11,6 @@ addRoute('/', async (_: string): Promise => { return page; }, { bypass_auth: true }) - addRoute('/with_title/:title', (_: string, args: RouteHandlerParams) => { setTitle(args.title) console.log(`title should be '${args.title}'`); diff --git a/src/auth/src/run.ts b/src/auth/src/run.ts index 1e8f129..d3d410f 100644 --- a/src/auth/src/run.ts +++ b/src/auth/src/run.ts @@ -7,7 +7,7 @@ const start = async () => { const envToLogger = { development: { transport: { - target: 'pino', + target: 'pino-pretty', options: { translateTime: 'HH:MM:ss Z', ignore: 'pid,hostname', diff --git a/src/chat/src/run.ts b/src/chat/src/run.ts index f7b78ca..d9f1e2a 100644 --- a/src/chat/src/run.ts +++ b/src/chat/src/run.ts @@ -7,7 +7,7 @@ const start = async () => { const envToLogger = { development: { transport: { - target: 'pino', + target: 'pino-pretty', options: { translateTime: 'HH:MM:ss Z', ignore: 'pid,hostname', diff --git a/src/user/src/run.ts b/src/user/src/run.ts index 1e8f129..d3d410f 100644 --- a/src/user/src/run.ts +++ b/src/user/src/run.ts @@ -7,7 +7,7 @@ const start = async () => { const envToLogger = { development: { transport: { - target: 'pino', + target: 'pino-pretty', options: { translateTime: 'HH:MM:ss Z', ignore: 'pid,hostname', From 4e4ad367c21a874ee425f9295d2da9219a1e4613 Mon Sep 17 00:00:00 2001 From: NigeParis Date: Wed, 17 Dec 2025 09:57:41 +0100 Subject: [PATCH 2/6] WIP Blocked users and clean up obj { } its in constitant --- frontend/src/pages/chat/chat.ts | 103 ++++++++----------------- frontend/src/pages/chat/types_front.ts | 1 + src/chat/src/app.ts | 100 ++++++++++++++++++++++-- src/chat/src/chat_types.ts | 1 + 4 files changed, 129 insertions(+), 76 deletions(-) diff --git a/frontend/src/pages/chat/chat.ts b/frontend/src/pages/chat/chat.ts index ac10778..985216a 100644 --- a/frontend/src/pages/chat/chat.ts +++ b/frontend/src/pages/chat/chat.ts @@ -23,6 +23,14 @@ export const color = { reset: '', }; + +export type blockedUnBlocked = +{ + userState: string, + userTarget: string, + by: string, +}; + // get the name of the machine used to connect const machineHostName = window.location.hostname; console.log('connect to login at %chttps://' + machineHostName + ':8888/app/login',color.yellow); @@ -64,22 +72,6 @@ function actionBtnPopUpInvite(invite: ClientProfil, senderSocket: Socket) { }, 0) }; -// async function windowStateHidden() { -// const socketId = __socket || undefined; -// // let oldName = localStorage.getItem("oldName") ?? undefined; -// let oldName: string; -// if (socketId === undefined) return; -// let userName = await updateUser(); -// oldName = userName?.name ?? ""; -// if (oldName === "") return; -// localStorage.setItem('oldName', oldName); -// socketId.emit('client_left', { -// user: userName?.name, -// why: 'tab window hidden - socket not dead', -// }); -// return; -// }; - async function windowStateVisable() { const buddies = document.getElementById('div-buddies') as HTMLDivElement; @@ -141,36 +133,6 @@ function parseCmdMsg(msgText: string): string[] | undefined { return command; } -// async function listBuddies(socket: Socket, buddies: HTMLDivElement, listBuddies: string) { - -// if (!buddies) return; -// const sendtextbox = document.getElementById('t-chat-window') as HTMLButtonElement; -// const buddiesElement = document.createElement("div-buddies-list"); -// buddiesElement.textContent = listBuddies + '\n'; -// const user = getUser()?.name ?? ""; -// buddies.appendChild(buddiesElement); -// buddies.scrollTop = buddies.scrollHeight; -// console.log(`Added buddies: ${listBuddies}`); - -// buddiesElement.style.cursor = "pointer"; -// buddiesElement.addEventListener("click", () => { -// navigator.clipboard.writeText(listBuddies); -// if (listBuddies !== user && user !== "") { -// sendtextbox.value = `@${listBuddies}: `; -// console.log("Copied to clipboard:", listBuddies); -// sendtextbox.focus(); -// } -// }); - -// buddiesElement.addEventListener("dblclick", () => { -// console.log("Open profile:", listBuddies); -// getProfil(socket, listBuddies); -// sendtextbox.value = ""; -// }); - -// } - - function waitSocketConnected(socket: Socket): Promise { return new Promise(resolve => { if (socket.connected) return resolve(); @@ -270,30 +232,6 @@ async function whoami(socket: Socket) { } }; -// async function openProfilePopup(profil: ClientProfil) { - - -// const modalname = document.getElementById("modal-name") ?? null; -// if (modalname) -// modalname.innerHTML = ` -//
-// Profil of ${profil.user}
-// Login Name: '${profil.loginName ?? 'Guest'}' -//
-// Login ID: '${profil.userID ?? ''}' -//
-// -// -// -//
About: '${profil.text}'
-// -// `; -// const profilList = document.getElementById("profile-modal") ?? null; -// if (profilList) -// profilList.classList.remove("hidden"); -// // The popup now exists → attach the event -// } - let count = 0; function incrementCounter(): number { count += 1; @@ -336,6 +274,7 @@ function handleChat(_url: string, _args: RouteHandlerParams): RouteHandlerReturn await waitSocketConnected(socket); console.log("I AM Connected to the server:", socket.id); const user = getUser()?.name; + const userID = getUser()?.id; // Ensure we have a user AND socket is connected if (!user || !socket.connected) return; const message = { @@ -347,6 +286,8 @@ function handleChat(_url: string, _args: RouteHandlerParams): RouteHandlerReturn text: " has Just ARRIVED in the chat", timestamp: Date.now(), SenderWindowID: socket.id, + SenderID: userID, + }; socket.emit('message', JSON.stringify(message)); const messageElement = document.createElement("div"); @@ -397,7 +338,12 @@ function handleChat(_url: string, _args: RouteHandlerParams): RouteHandlerReturn }); socket.on('profilMessage', (profil: ClientProfil) => { + profil.SenderID = getUser()?.id ?? ""; + profil.SenderName = getUser()?.name ?? ""; openProfilePopup(profil); + console.log(`DEBUG LOG: userId:${profil.userID}: senderID ${profil.SenderID}' senderID:${getUser()?.id}`); + console.log(`DEBUG LOG: user:${profil.user}: sender:${profil.SenderName}' senderID:${getUser()?.name}`); + socket.emit('check_Block_button', profil); actionBtnPopUpClear(profil, socket); actionBtnPopUpInvite(profil, socket); actionBtnPopUpBlock(profil, socket); @@ -416,13 +362,25 @@ function handleChat(_url: string, _args: RouteHandlerParams): RouteHandlerReturn let icon = '⛔'; const chatWindow = document.getElementById("t-chatbox") as HTMLDivElement; const messageElement = document.createElement("div"); - if (`${blocked.text}` === '\'I have un-blocked you\'' ) { icon = '💚'}; + if (`${blocked.text}` === 'I have un-blocked you' ) { icon = '💚'}; messageElement.innerText =`${icon}${blocked.SenderName}: ${blocked.text}`; chatWindow.appendChild(messageElement); chatWindow.scrollTop = chatWindow.scrollHeight; }); + socket.on('blockBtn', (data: blockedUnBlocked) => { + const blockUserBtn = document.querySelector("#popup-b-block"); + if (blockUserBtn) { + + console.log(' =================== >>> User State:', data.userState); + console.log(' =================== >>> UserTarget:', data.userTarget); + console.log(' =================== >>> By:', data.by); + let message = ""; + if (data.userState === "block") {message = "un-block"} else{message = "block"} + blockUserBtn.textContent = message; + } + }); socket.on('logout', () => { @@ -553,6 +511,7 @@ function handleChat(_url: string, _args: RouteHandlerParams): RouteHandlerReturn break; default: const user = getUser()?.name; + const userID = getUser()?.id; // Ensure we have a user AND socket is connected if (!user || !socket.connected) return; const message = { @@ -564,6 +523,8 @@ function handleChat(_url: string, _args: RouteHandlerParams): RouteHandlerReturn text: msgCommand[1], timestamp: Date.now(), SenderWindowID: socket.id, + SenderID: userID, + }; //socket.emit('MsgObjectServer', message); socket.emit('privMessage', JSON.stringify(message)); diff --git a/frontend/src/pages/chat/types_front.ts b/frontend/src/pages/chat/types_front.ts index 807d071..913095a 100644 --- a/frontend/src/pages/chat/types_front.ts +++ b/frontend/src/pages/chat/types_front.ts @@ -18,6 +18,7 @@ export type ClientProfil = { timestamp: number, SenderWindowID:string, SenderName: string, + SenderID: string, Sendertext: string, innerHtml?: string, }; \ No newline at end of file diff --git a/src/chat/src/app.ts b/src/chat/src/app.ts index e348ecd..7f9e5c5 100644 --- a/src/chat/src/app.ts +++ b/src/chat/src/app.ts @@ -39,6 +39,32 @@ interface ClientInfo { lastSeen: number; } + +export type blockedUnBlocked = +{ + userState: string, + userTarget: string, + by: string, +}; + + +export type obj = +{ + command: string, + destination: string, + type: string, + user: string, + frontendUserName: string, + frontendUser: string, + token: string, + text: string, + timestamp: number, + SenderWindowID: string, + Sendertext: string, +}; + + + // function setAboutPlayer(about: string): string { // if (!about) { // about = 'Player is good Shape - This is a default description'; @@ -107,10 +133,45 @@ declare module 'fastify' { client_left: (userName: string, why: string) => void; list: (oldUser: string, user: string) => void; updateClientName: (oldUser: string, user: string) => void; + blockBtn: (data: blockedUnBlocked) => void; + check_Block_button: (data: blockedUnBlocked) => void; }>; } } + + +/** + * function get the object user in an array of users[] by name + * @param users + * @param name + * @returns + */ +function getUserById(users: User[], id: string) { + return users.find(user => user.id === id) || null; +}; + +function isUser_BlockedBy_me(fastify: FastifyInstance, blockedBy_Id : string, isBlocked_Id: string): string { + const users: User[] = fastify.db.getAllUsers() ?? []; + if (!users) return ''; + const UserToBlock: User | null = getUserById(users, `${isBlocked_Id}`); + const UserAskingToBlock: User | null = getUserById(users, `${blockedBy_Id}`); + if (!UserToBlock) {console.log(color.blue, `'User: ${UserAskingToBlock?.id} has not blocked' ${isBlocked_Id}`); return ""}; + if (!UserAskingToBlock) {console.log(color.blue, `'User: ${UserToBlock?.id} has not blocked by' ${blockedBy_Id}`); return ""}; + const usersBlocked: BlockedData[] = fastify.db.getAllBlockedUsers() ?? []; + const userAreBlocked: boolean = isBlocked(UserAskingToBlock, UserToBlock, usersBlocked); + if (userAreBlocked) { + console.log(color.yellow, `'User :${UserAskingToBlock.name}) Hhas UN blocked ${UserToBlock.name}`) + return UserAskingToBlock.name; + } + console.log(color.blue, `'User :${UserAskingToBlock.name}) has BBBblocked ${UserToBlock.name}`) + + return ""; +}; + + + + async function onReady(fastify: FastifyInstance) { @@ -141,6 +202,8 @@ async function onReady(fastify: FastifyInstance) { list_SocketListener(fastify, socket); + + // socket.on('list', (object) => { // const userFromFrontend = object || null; @@ -264,15 +327,18 @@ async function onReady(fastify: FastifyInstance) { ); if (clientName !== null) { - const obj = { + const obj: obj = { command: prvMessage.command, destination: 'privateMsg', type: 'chat', user: clientName, token: '', text: prvMessage.text, + frontendUserName: '', + frontendUser: '', timestamp: Date.now(), SenderWindowID: socket.id, + Sendertext: '', }; // console.log(color.blue, 'DEBUG LOG: PRIV MESSAGE OUT :', obj.SenderWindowID); sendPrivMessage(fastify, obj, obj.SenderWindowID); @@ -309,6 +375,8 @@ async function onReady(fastify: FastifyInstance) { } }); + + socket.on('blockUser', async (data: string) => { const clientName: string = clientChat.get(socket.id)?.user || ''; const profilBlock: ClientProfil = JSON.parse(data) || ''; @@ -320,10 +388,13 @@ async function onReady(fastify: FastifyInstance) { console.log(color.yellow, UserToBlock); console.log(color.yellow, `user Asking to block: ${profilBlock.SenderName}`); console.log(color.yellow, UserAskingToBlock); + console.log(color.red, clientName); const usersBlocked: BlockedData[] = fastify.db.getAllBlockedUsers() ?? []; if (!UserAskingToBlock || !UserToBlock || !usersBlocked) return; const userAreBlocked: boolean = isBlocked(UserAskingToBlock, UserToBlock, usersBlocked); + isUser_BlockedBy_me(fastify, UserAskingToBlock!.id, UserToBlock!.id); + if (userAreBlocked) { console.log(color.green, 'Both users are blocked as requested'); @@ -333,17 +404,19 @@ async function onReady(fastify: FastifyInstance) { console.log(color.red, 'ALL BLOCKED USERS:', usersBlocked); fastify.db.removeBlockedUserFor(UserAskingToBlock!.id, UserToBlock!.id); const usersBlocked2 = fastify.db.getAllBlockedUsers(); - console.log(color.green, 'remove ALL BLOCKED USERS:', usersBlocked2); + console.log(color.green, 'remove A BLOCKED USER:', usersBlocked2); if (clientName !== null) { const blockedMessage = 'I have un-blocked you'; if (clientName !== null) { - const obj = { + const obj: obj = { command: 'message', destination: 'privateMsg', type: 'chat', user: clientName, token: '', text: '', + frontendUserName: '', + frontendUser: '', timestamp: Date.now(), SenderWindowID: socket.id, Sendertext: 'You have un-blocked', @@ -354,6 +427,14 @@ async function onReady(fastify: FastifyInstance) { } // profilBlock.Sendertext = `'You have un-blocked '`; sendBlocked(fastify, blockedMessage, profilBlock); + const message: blockedUnBlocked = + { + userState: "un-block", + userTarget: "", + by: "", + + }; + socket.emit('blockBtn', message); } } else { @@ -367,7 +448,7 @@ async function onReady(fastify: FastifyInstance) { const blockedMessage = 'I have blocked you'; profilBlock.Sendertext = 'You have blocked '; if (clientName !== null) { - const obj = { + const obj: obj = { command: 'message', destination: 'privateMsg', type: 'chat', @@ -383,6 +464,14 @@ async function onReady(fastify: FastifyInstance) { // clientChat.delete(obj.user); } sendBlocked(fastify, blockedMessage, profilBlock); + const message: blockedUnBlocked = + { + userState: "block", + userTarget: UserToBlock.name, + by: UserAskingToBlock.name, + + }; + socket.emit('blockBtn', message); } } }); @@ -416,7 +505,7 @@ async function onReady(fastify: FastifyInstance) { `Client entered the Chat: ${clientName} (${socket.id})`, ); if (clientName !== null) { - const obj = { + const obj: obj = { command: '', destination: 'system-info', type: 'chat', @@ -427,6 +516,7 @@ async function onReady(fastify: FastifyInstance) { text: text, timestamp: Date.now(), SenderWindowID: socket.id, + Sendertext: "", }; broadcast(fastify, obj, obj.SenderWindowID); } diff --git a/src/chat/src/chat_types.ts b/src/chat/src/chat_types.ts index 5ed14f9..0377659 100644 --- a/src/chat/src/chat_types.ts +++ b/src/chat/src/chat_types.ts @@ -17,6 +17,7 @@ export type ClientProfil = { timestamp: number, SenderWindowID:string, SenderName: string, + SenderID: string, Sendertext: string, innerHtml?: string, From fb68487786c15fbb051d2ffd2d88444791757268 Mon Sep 17 00:00:00 2001 From: NigeParis Date: Wed, 17 Dec 2025 10:20:07 +0100 Subject: [PATCH 3/6] Cleaned un the type obj - now consistant through out --- frontend/src/pages/chat/chat.ts | 19 +++++++++++++++++-- src/chat/src/app.ts | 21 +++++++++++++++------ 2 files changed, 32 insertions(+), 8 deletions(-) diff --git a/frontend/src/pages/chat/chat.ts b/frontend/src/pages/chat/chat.ts index 985216a..2790626 100644 --- a/frontend/src/pages/chat/chat.ts +++ b/frontend/src/pages/chat/chat.ts @@ -31,6 +31,21 @@ export type blockedUnBlocked = by: string, }; +export type obj = +{ + command: string, + destination: string, + type: string, + user: string, + frontendUserName: string, + frontendUser: string, + token: string, + text: string, + timestamp: number, + SenderWindowID: string, + Sendertext: string, +}; + // get the name of the machine used to connect const machineHostName = window.location.hostname; console.log('connect to login at %chttps://' + machineHostName + ':8888/app/login',color.yellow); @@ -242,7 +257,7 @@ async function openMessagePopup(message: string) { const modalmessage = document.getElementById("modal-message") ?? null; if(!message) return - const obj:any = JSON.parse(message); + const obj:string = JSON.parse(message); if (modalmessage) { const messageElement = document.createElement("div"); messageElement.innerHTML = ` @@ -341,7 +356,7 @@ function handleChat(_url: string, _args: RouteHandlerParams): RouteHandlerReturn profil.SenderID = getUser()?.id ?? ""; profil.SenderName = getUser()?.name ?? ""; openProfilePopup(profil); - console.log(`DEBUG LOG: userId:${profil.userID}: senderID ${profil.SenderID}' senderID:${getUser()?.id}`); + console.log(`DEBUG LOG: userId:${profil.userID}: senderID${profil.SenderID}' senderID:${getUser()?.id}`); console.log(`DEBUG LOG: user:${profil.user}: sender:${profil.SenderName}' senderID:${getUser()?.name}`); socket.emit('check_Block_button', profil); actionBtnPopUpClear(profil, socket); diff --git a/src/chat/src/app.ts b/src/chat/src/app.ts index 7f9e5c5..bf27c55 100644 --- a/src/chat/src/app.ts +++ b/src/chat/src/app.ts @@ -189,7 +189,7 @@ async function onReady(fastify: FastifyInstance) { socket.on('message', (message: string) => { // console.info(color.blue, 'DEBUG LOG: Socket connected!', color.reset, socket.id); // console.log( color.blue, 'DEBUG LOG: Received message from client', color.reset, message); - const obj: ClientMessage = JSON.parse(message) as ClientMessage; + const obj: obj = JSON.parse(message) as ClientMessage; clientChat.set(socket.id, { user: obj.user, lastSeen: Date.now() }); // console.log(color.green, 'DEBUG LOG: Message from client', color.reset, `Sender: login name: ${obj.user} - windowID ${obj.SenderWindowID} - text message: ${obj.text}`); socket.emit('welcome', { msg: 'Welcome to the chat! : ' }); @@ -247,15 +247,18 @@ async function onReady(fastify: FastifyInstance) { if (!clientName) return; console.log(color.green, `Client logging out: ${clientName} (${socket.id})`); - const obj = { + const obj: obj = { command: '', destination: 'system-info', type: 'chat' as const, user: clientName, token: '', text: 'LEFT the chat', - timestamp: Date.now(), - SenderWindowID: socket.id, + frontendUserName: '', + frontendUser: '', + timestamp: Date.now(), + SenderWindowID: socket.id, + Sendertext: '', }; broadcast(fastify, obj, socket.id); // Optional: remove from map @@ -274,15 +277,18 @@ async function onReady(fastify: FastifyInstance) { if (reason === 'transport error') return; if (clientName !== null) { - const obj = { + const obj: obj = { command: '', destination: 'system-info', type: 'chat', user: clientName, token: '', text: 'LEFT the chat', + frontendUserName: '', + frontendUser: '', timestamp: Date.now(), SenderWindowID: socket.id, + Sendertext: '', }; broadcast(fastify, obj, obj.SenderWindowID); @@ -299,15 +305,18 @@ async function onReady(fastify: FastifyInstance) { ); if (clientName !== null) { - const obj = { + const obj: obj = { command: '', destination: 'system-info', type: 'chat', user: clientName, token: '', text: 'LEFT the chat but the window is still open', + frontendUserName: '', + frontendUser: '', timestamp: Date.now(), SenderWindowID: socket.id, + Sendertext: '', }; // console.log(color.blue, 'DEBUG LOG: BROADCASTS OUT :', obj.SenderWindowID); From eb1b3472cbeba885a853d2d0654c4a53bdcc42f4 Mon Sep 17 00:00:00 2001 From: NigeParis Date: Wed, 17 Dec 2025 12:03:28 +0100 Subject: [PATCH 4/6] clean up obj --- Docker.mk | 5 ++--- src/chat/src/app.ts | 2 ++ 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Docker.mk b/Docker.mk index e6f820b..f63b928 100644 --- a/Docker.mk +++ b/Docker.mk @@ -3,10 +3,10 @@ # ::: :::::::: # # Docker.mk :+: :+: :+: # # +:+ +:+ +:+ # -# By: maiboyer +#+ +:+ +#+ # +# By: nrobinso +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2025/06/11 18:10:26 by maiboyer #+# #+# # -# Updated: 2025/12/12 14:56:10 by maiboyer ### ########.fr # +# Updated: 2025/12/17 11:34:56 by nrobinso ### ########.fr # # # # **************************************************************************** # @@ -21,7 +21,6 @@ DOCKER_SERVICE= \ nginx \ user \ - all: build docker compose up -d $(DOCKER_SERVICE) diff --git a/src/chat/src/app.ts b/src/chat/src/app.ts index bf27c55..c0860fb 100644 --- a/src/chat/src/app.ts +++ b/src/chat/src/app.ts @@ -465,6 +465,8 @@ async function onReady(fastify: FastifyInstance) { token: '', text: '', timestamp: Date.now(), + frontendUserName: '', + frontendUser: '', SenderWindowID: socket.id, Sendertext: 'You have blocked', }; From a1d6c4ae9cef5a28d27f0b78476ac0cb2206bab8 Mon Sep 17 00:00:00 2001 From: NigeParis Date: Wed, 17 Dec 2025 13:20:01 +0100 Subject: [PATCH 5/6] block button in profil toggles with block or un blocked --- .../src/pages/chat/actionBtnPopUpBlock.ts | 2 +- frontend/src/pages/chat/chat.ts | 10 +- src/chat/src/app.ts | 121 ++++++++++++------ 3 files changed, 86 insertions(+), 47 deletions(-) diff --git a/frontend/src/pages/chat/actionBtnPopUpBlock.ts b/frontend/src/pages/chat/actionBtnPopUpBlock.ts index 0e65bcb..1c12b9d 100644 --- a/frontend/src/pages/chat/actionBtnPopUpBlock.ts +++ b/frontend/src/pages/chat/actionBtnPopUpBlock.ts @@ -6,7 +6,7 @@ export function actionBtnPopUpBlock(block: ClientProfil, senderSocket: Socket) { setTimeout(() => { const blockUserBtn = document.querySelector("#popup-b-block"); blockUserBtn?.addEventListener("click", () => { - block.text = ''; + block.text = ''; blockUser(block, senderSocket); }); }, 0) diff --git a/frontend/src/pages/chat/chat.ts b/frontend/src/pages/chat/chat.ts index 2790626..fe31df4 100644 --- a/frontend/src/pages/chat/chat.ts +++ b/frontend/src/pages/chat/chat.ts @@ -261,8 +261,8 @@ async function openMessagePopup(message: string) { if (modalmessage) { const messageElement = document.createElement("div"); messageElement.innerHTML = ` -
-
Next Game Message ${incrementCounter()}: ${obj.link}
+
Next Game Message ${incrementCounter()}: ${obj}
`; modalmessage.appendChild(messageElement); modalmessage.scrollTop = modalmessage.scrollHeight; @@ -356,6 +356,7 @@ function handleChat(_url: string, _args: RouteHandlerParams): RouteHandlerReturn profil.SenderID = getUser()?.id ?? ""; profil.SenderName = getUser()?.name ?? ""; openProfilePopup(profil); + socket.emit('isBlockdBtn', profil); console.log(`DEBUG LOG: userId:${profil.userID}: senderID${profil.SenderID}' senderID:${getUser()?.id}`); console.log(`DEBUG LOG: user:${profil.user}: sender:${profil.SenderName}' senderID:${getUser()?.name}`); socket.emit('check_Block_button', profil); @@ -375,9 +376,10 @@ function handleChat(_url: string, _args: RouteHandlerParams): RouteHandlerReturn socket.on('blockUser', (blocked: ClientProfil) => { let icon = '⛔'; + const chatWindow = document.getElementById("t-chatbox") as HTMLDivElement; const messageElement = document.createElement("div"); - if (`${blocked.text}` === 'I have un-blocked you' ) { icon = '💚'}; + if (`${blocked.text}` === 'I have un-blocked you' ) {icon = '💚'}; messageElement.innerText =`${icon}${blocked.SenderName}: ${blocked.text}`; chatWindow.appendChild(messageElement); chatWindow.scrollTop = chatWindow.scrollHeight; @@ -418,7 +420,7 @@ function handleChat(_url: string, _args: RouteHandlerParams): RouteHandlerReturn setTimeout(() => { connected(socket); - }, 0); + }, 16); if (window.location.pathname === '/app/chat') { console.log('%cWindow is focused on /chat:' + socket.id, color.green); if (socket.id) { diff --git a/src/chat/src/app.ts b/src/chat/src/app.ts index c0860fb..8ee238e 100644 --- a/src/chat/src/app.ts +++ b/src/chat/src/app.ts @@ -134,6 +134,7 @@ declare module 'fastify' { list: (oldUser: string, user: string) => void; updateClientName: (oldUser: string, user: string) => void; blockBtn: (data: blockedUnBlocked) => void; + isBlockdBtn: (data: blockedUnBlocked) => void; check_Block_button: (data: blockedUnBlocked) => void; }>; } @@ -189,7 +190,7 @@ async function onReady(fastify: FastifyInstance) { socket.on('message', (message: string) => { // console.info(color.blue, 'DEBUG LOG: Socket connected!', color.reset, socket.id); // console.log( color.blue, 'DEBUG LOG: Received message from client', color.reset, message); - const obj: obj = JSON.parse(message) as ClientMessage; + const obj: ClientMessage = JSON.parse(message) as ClientMessage; clientChat.set(socket.id, { user: obj.user, lastSeen: Date.now() }); // console.log(color.green, 'DEBUG LOG: Message from client', color.reset, `Sender: login name: ${obj.user} - windowID ${obj.SenderWindowID} - text message: ${obj.text}`); socket.emit('welcome', { msg: 'Welcome to the chat! : ' }); @@ -202,27 +203,6 @@ async function onReady(fastify: FastifyInstance) { list_SocketListener(fastify, socket); - - - // socket.on('list', (object) => { - - // const userFromFrontend = object || null; - // const client = clientChat.get(socket.id) || null; - - // //console.log(color.red, 'DEBUG LOG: list activated', userFromFrontend, color.reset, socket.id); - - // if (userFromFrontend.oldUser !== userFromFrontend.user) { - // //console.log(color.red, 'DEBUG LOG: list activated', userFromFrontend.oldUser, color.reset); - // // if (client?.user === null) { - // // console.log('ERROR: clientName is NULL'); - // // return; - // // }; - // if (client) { - // client.user = userFromFrontend.user; - // } - // } - // connectedUser(fastify.io, socket.id); - // }); socket.on('updateClientName', (object) => { const userFromFrontend = object || null; @@ -384,6 +364,42 @@ async function onReady(fastify: FastifyInstance) { } }); + socket.on('isBlockdBtn', async (data: ClientProfil) => { + const profilBlock: ClientProfil = data || ''; + const users: User[] = fastify.db.getAllUsers() ?? []; + const UserToBlock: User | null = getUserByName(users, `${profilBlock.user}`); + const UserAskingToBlock: User | null = getUserByName(users, `${profilBlock.SenderName}`); + + console.log(color.yellow, `user to block: ${profilBlock.user}`); + console.log(color.yellow, UserToBlock); + console.log(color.yellow, `user Asking to block: ${profilBlock.SenderName}`); + console.log(color.yellow, UserAskingToBlock); + + if (!UserAskingToBlock || !UserToBlock) return; + + if(isUser_BlockedBy_me(fastify, UserAskingToBlock!.id, UserToBlock!.id)) { + const message: blockedUnBlocked = + { + userState: "block", + userTarget: UserToBlock.name, + by: UserAskingToBlock.name, + + + }; + socket.emit('blockBtn', message); + } else { + + const message: blockedUnBlocked = + { + userState: "un-block", + userTarget: UserToBlock.name, + by: UserAskingToBlock.name, + + }; + socket.emit('blockBtn', message); + + + } }); socket.on('blockUser', async (data: string) => { @@ -393,16 +409,37 @@ async function onReady(fastify: FastifyInstance) { const UserToBlock: User | null = getUserByName(users, `${profilBlock.user}`); const UserAskingToBlock: User | null = getUserByName(users, `${profilBlock.SenderName}`); - console.log(color.yellow, `user to block: ${profilBlock.user}`); - console.log(color.yellow, UserToBlock); - console.log(color.yellow, `user Asking to block: ${profilBlock.SenderName}`); - console.log(color.yellow, UserAskingToBlock); - console.log(color.red, clientName); + // console.log(color.yellow, `user to block: ${profilBlock.user}`); + // console.log(color.yellow, UserToBlock); + // console.log(color.yellow, `user Asking to block: ${profilBlock.SenderName}`); + // console.log(color.yellow, UserAskingToBlock); + // console.log(color.red, clientName); const usersBlocked: BlockedData[] = fastify.db.getAllBlockedUsers() ?? []; if (!UserAskingToBlock || !UserToBlock || !usersBlocked) return; const userAreBlocked: boolean = isBlocked(UserAskingToBlock, UserToBlock, usersBlocked); - isUser_BlockedBy_me(fastify, UserAskingToBlock!.id, UserToBlock!.id); + if(isUser_BlockedBy_me(fastify, UserAskingToBlock!.id, UserToBlock!.id)) { + const message: blockedUnBlocked = + { + userState: "un-block", + userTarget: "", + by: "", + + }; + socket.emit('blockBtn', message); + } else { + + const message: blockedUnBlocked = + { + userState: "block", + userTarget: UserToBlock.name, + by: UserAskingToBlock.name, + + }; + socket.emit('blockBtn', message); + + + } if (userAreBlocked) { @@ -436,14 +473,14 @@ async function onReady(fastify: FastifyInstance) { } // profilBlock.Sendertext = `'You have un-blocked '`; sendBlocked(fastify, blockedMessage, profilBlock); - const message: blockedUnBlocked = - { - userState: "un-block", - userTarget: "", - by: "", + // const message: blockedUnBlocked = + // { + // userState: "un-block", + // userTarget: "", + // by: "", - }; - socket.emit('blockBtn', message); + // }; + // socket.emit('blockBtn', message); } } else { @@ -475,14 +512,14 @@ async function onReady(fastify: FastifyInstance) { // clientChat.delete(obj.user); } sendBlocked(fastify, blockedMessage, profilBlock); - const message: blockedUnBlocked = - { - userState: "block", - userTarget: UserToBlock.name, - by: UserAskingToBlock.name, + // const message: blockedUnBlocked = + // { + // userState: "block", + // userTarget: UserToBlock.name, + // by: UserAskingToBlock.name, - }; - socket.emit('blockBtn', message); + // }; + // socket.emit('blockBtn', message); } } }); From 637229c8c873cedca4858615cd45ba201f9e972c Mon Sep 17 00:00:00 2001 From: NigeParis Date: Wed, 17 Dec 2025 17:21:06 +0100 Subject: [PATCH 6/6] Work in progress - blocage working on it ./app 206 --- frontend/src/pages/chat/broadcastMsg.ts | 14 ++++-- frontend/src/pages/chat/chat.ts | 44 ++++++++++--------- frontend/src/pages/chat/types_front.ts | 11 ++++- src/chat/src/app.ts | 57 ++++++++++++++++++++++--- src/chat/src/broadcast.ts | 3 ++ src/chat/src/chat_types.ts | 14 +++++- src/chat/src/color.ts | 8 ++++ src/chat/src/filter_Blocked_user.ts | 39 +++++++++++++++++ src/chat/src/getUserById.ts | 10 +++++ src/chat/src/isUser_BlockedBy_me.ts | 32 ++++++++++++++ src/chat/src/routes/broadcast.ts | 2 +- 11 files changed, 201 insertions(+), 33 deletions(-) create mode 100644 src/chat/src/color.ts create mode 100644 src/chat/src/filter_Blocked_user.ts create mode 100644 src/chat/src/getUserById.ts create mode 100644 src/chat/src/isUser_BlockedBy_me.ts diff --git a/frontend/src/pages/chat/broadcastMsg.ts b/frontend/src/pages/chat/broadcastMsg.ts index 51a1130..586243b 100644 --- a/frontend/src/pages/chat/broadcastMsg.ts +++ b/frontend/src/pages/chat/broadcastMsg.ts @@ -1,7 +1,7 @@ import { addMessage } from "./addMessage"; import { Socket } from 'socket.io-client'; import { getUser } from "@app/auth"; - +import type { ClientMessage } from "./types_front"; /** * function sends socket.emit to the backend to active and broadcast a message to all sockets * echos the message with addMessage to the sender @@ -13,15 +13,21 @@ export function broadcastMsg (socket: Socket, msgCommand: string[]): void { addMessage(msgText); const user = getUser(); if (user && socket?.connected) { - const message = { - command: msgCommand, + const message: ClientMessage = { + command: msgCommand[0], destination: '', type: "chat", user: user.name, token: document.cookie, text: msgText, timestamp: Date.now(), - SenderWindowID: socket.id, + SenderWindowID: socket.id ?? "", + SenderUserName: user.name, + SenderUserID: user.id, + userID: '', + frontendUserName: '', + frontendUser: '', + Sendertext: '', }; socket.emit('message', JSON.stringify(message)); } diff --git a/frontend/src/pages/chat/chat.ts b/frontend/src/pages/chat/chat.ts index fe31df4..65f4b3a 100644 --- a/frontend/src/pages/chat/chat.ts +++ b/frontend/src/pages/chat/chat.ts @@ -193,6 +193,7 @@ function logout(socket: Socket) { async function connected(socket: Socket): Promise { + setTimeout(async () => { try { const buddies = document.getElementById('div-buddies') as HTMLDivElement; const loggedIn = isLoggedIn(); @@ -201,24 +202,23 @@ async function connected(socket: Socket): Promise { let oldUser = localStorage.getItem("oldName") ?? ""; console.log('%coldUser:',color.yellow, oldUser); if (loggedIn?.name === undefined) {console.log('');return ;} - setTimeout(() => { oldUser = loggedIn.name ?? ""; - }, 0); - // const res = await client.guestLogin(); - let user = await updateUser(); - console.log('%cUser?name:',color.yellow, user?.name); - localStorage.setItem("oldName", oldUser); - buddies.textContent = ""; - socket.emit('list', { - oldUser: oldUser, - user: user?.name, - }); - } catch (e) { - console.error("Login error:", e); - showError('Failed to login: Unknown error'); - } -}; - + // const res = await client.guestLogin(); + let user = await updateUser(); + console.log('%cUser?name:',color.yellow, user?.name); + localStorage.setItem("oldName", oldUser); + buddies.textContent = ""; + socket.emit('list', { + oldUser: oldUser, + user: user?.name, + }); + } catch (e) { + console.error("Login error:", e); + showError('Failed to login: Unknown error'); + } + }, 16); + }; + async function whoami(socket: Socket) { try { const chatWindow = document.getElementById("t-chatbox") as HTMLDivElement; @@ -281,6 +281,8 @@ function handleChat(_url: string, _args: RouteHandlerParams): RouteHandlerReturn let socket = getSocket(); + let blockMessage: boolean; + setTimeout(async () => { // Listen for the 'connect' event socket.on("connect", async () => { @@ -310,6 +312,7 @@ function handleChat(_url: string, _args: RouteHandlerParams): RouteHandlerReturn systemWindow.appendChild(messageElement); systemWindow.scrollTop = systemWindow.scrollHeight; }); +}, 0); // Listen for messages from the server "MsgObjectServer" socket.on("MsgObjectServer", (data: { message: ClientMessage}) => { @@ -321,8 +324,8 @@ function handleChat(_url: string, _args: RouteHandlerParams): RouteHandlerReturn if (bconnected) { connected(socket); } - - if (chatWindow && data.message.destination === "") { + console.log('stahe eeee :', blockMessage); + if (chatWindow && data.message.destination === "" && !blockMessage) { const messageElement = document.createElement("div"); messageElement.textContent = `${data.message.user}: ${data.message.text}`; chatWindow.appendChild(messageElement); @@ -394,7 +397,7 @@ function handleChat(_url: string, _args: RouteHandlerParams): RouteHandlerReturn console.log(' =================== >>> UserTarget:', data.userTarget); console.log(' =================== >>> By:', data.by); let message = ""; - if (data.userState === "block") {message = "un-block"} else{message = "block"} + if (data.userState === "block") {message = "un-block", blockMessage = true} else{message = "block", blockMessage = false} blockUserBtn.textContent = message; } }); @@ -587,5 +590,6 @@ function handleChat(_url: string, _args: RouteHandlerParams): RouteHandlerReturn }); } } + }; addRoute('/chat', handleChat, { bypass_auth: true }); \ No newline at end of file diff --git a/frontend/src/pages/chat/types_front.ts b/frontend/src/pages/chat/types_front.ts index 913095a..93f9ab6 100644 --- a/frontend/src/pages/chat/types_front.ts +++ b/frontend/src/pages/chat/types_front.ts @@ -1,9 +1,18 @@ export type ClientMessage = { command: string destination: string; + type: string, user: string; + userID: string, + token: string + frontendUserName: string, + frontendUser: string, text: string; - SenderWindowID: string; + SenderWindowID: string, + SenderUserName: string, + SenderUserID: string, + timestamp: number, + Sendertext: string, }; diff --git a/src/chat/src/app.ts b/src/chat/src/app.ts index 8ee238e..fac6cb4 100644 --- a/src/chat/src/app.ts +++ b/src/chat/src/app.ts @@ -20,6 +20,7 @@ import { sendProfil } from './sendProfil'; import { setGameLink } from './setGameLink'; import { nextGame_SocketListener } from './nextGame_SocketListener'; import { list_SocketListener } from './list_SocketListener'; +import { filter_Blocked_user } from './filter_Blocked_user' // colors for console.log export const color = { @@ -196,6 +197,37 @@ async function onReady(fastify: FastifyInstance) { socket.emit('welcome', { msg: 'Welcome to the chat! : ' }); // Send object directly — DO NOT wrap it in a string broadcast(fastify, obj, obj.SenderWindowID); + + const users: User[] = fastify.db.getAllUsers() ?? []; + console.log('DEBUG: senderWindow :', getUserById(users, obj.SenderUserID)?.name); + + + + + fastify.io.fetchSockets().then((sockets) => { + for (const socket of sockets) { + const clientInfo = clientChat.get(socket.id); + if (!clientInfo?.user) { + console.log(color.yellow, `Skipping socket ${socket.id} (no user found)`); + continue; + } + console.log('DEBUG: UserIDWindow :', getUserByName(users, clientInfo.user)?.id); + const IDUser = getUserByName(users, clientInfo.user)?.id; + + console.log(filter_Blocked_user(fastify, obj, IDUser?? "")); + + + } + }); + + + + + + + + + // console.log(color.red, 'DEBUG LOG: connected in the Chat :', connectedUser(fastify.io), color.reset); }); @@ -227,7 +259,7 @@ async function onReady(fastify: FastifyInstance) { if (!clientName) return; console.log(color.green, `Client logging out: ${clientName} (${socket.id})`); - const obj: obj = { + const obj: ClientMessage = { command: '', destination: 'system-info', type: 'chat' as const, @@ -239,6 +271,9 @@ async function onReady(fastify: FastifyInstance) { timestamp: Date.now(), SenderWindowID: socket.id, Sendertext: '', + userID: '', + SenderUserName: '', + SenderUserID: '', }; broadcast(fastify, obj, socket.id); // Optional: remove from map @@ -257,7 +292,7 @@ async function onReady(fastify: FastifyInstance) { if (reason === 'transport error') return; if (clientName !== null) { - const obj: obj = { + const obj: ClientMessage = { command: '', destination: 'system-info', type: 'chat', @@ -269,6 +304,9 @@ async function onReady(fastify: FastifyInstance) { timestamp: Date.now(), SenderWindowID: socket.id, Sendertext: '', + userID: '', + SenderUserName: '', + SenderUserID: '', }; broadcast(fastify, obj, obj.SenderWindowID); @@ -285,7 +323,7 @@ async function onReady(fastify: FastifyInstance) { ); if (clientName !== null) { - const obj: obj = { + const obj: ClientMessage = { command: '', destination: 'system-info', type: 'chat', @@ -297,6 +335,9 @@ async function onReady(fastify: FastifyInstance) { timestamp: Date.now(), SenderWindowID: socket.id, Sendertext: '', + userID: '', + SenderUserName: '', + SenderUserID: '', }; // console.log(color.blue, 'DEBUG LOG: BROADCASTS OUT :', obj.SenderWindowID); @@ -316,7 +357,7 @@ async function onReady(fastify: FastifyInstance) { ); if (clientName !== null) { - const obj: obj = { + const obj: ClientMessage = { command: prvMessage.command, destination: 'privateMsg', type: 'chat', @@ -328,6 +369,9 @@ async function onReady(fastify: FastifyInstance) { timestamp: Date.now(), SenderWindowID: socket.id, Sendertext: '', + userID: '', + SenderUserName: '', + SenderUserID:'', }; // console.log(color.blue, 'DEBUG LOG: PRIV MESSAGE OUT :', obj.SenderWindowID); sendPrivMessage(fastify, obj, obj.SenderWindowID); @@ -553,7 +597,7 @@ async function onReady(fastify: FastifyInstance) { `Client entered the Chat: ${clientName} (${socket.id})`, ); if (clientName !== null) { - const obj: obj = { + const obj: ClientMessage = { command: '', destination: 'system-info', type: 'chat', @@ -565,6 +609,9 @@ async function onReady(fastify: FastifyInstance) { timestamp: Date.now(), SenderWindowID: socket.id, Sendertext: "", + userID: '', + SenderUserName: '', + SenderUserID: '', }; broadcast(fastify, obj, obj.SenderWindowID); } diff --git a/src/chat/src/broadcast.ts b/src/chat/src/broadcast.ts index 1d697fa..e028d7d 100644 --- a/src/chat/src/broadcast.ts +++ b/src/chat/src/broadcast.ts @@ -1,6 +1,7 @@ import type { ClientMessage } from './chat_types'; import { clientChat, color } from './app'; import { FastifyInstance } from 'fastify'; +import { getUserById } from './getUserById'; export function broadcast(fastify: FastifyInstance, data: ClientMessage, sender?: string) { fastify.io.fetchSockets().then((sockets) => { @@ -13,6 +14,8 @@ export function broadcast(fastify: FastifyInstance, data: ClientMessage, sender? console.log(color.yellow, `Skipping socket ${socket.id} (no user found)`); continue; } + // console.log('BLOCKED MAYBE', getUserById(sender)); + // console.log('TARGET',socket.id ); // Emit structured JSON object socket.emit('MsgObjectServer', { message: data }); // Debug logs diff --git a/src/chat/src/chat_types.ts b/src/chat/src/chat_types.ts index 0377659..05a938e 100644 --- a/src/chat/src/chat_types.ts +++ b/src/chat/src/chat_types.ts @@ -1,11 +1,21 @@ export type ClientMessage = { command: string destination: string; + type: string, user: string; + userID: string, + token: string + frontendUserName: string, + frontendUser: string, text: string; - SenderWindowID: string; + SenderWindowID: string, + SenderUserName: string, + SenderUserID: string, + timestamp: number, + Sendertext: string, }; + export type ClientProfil = { command: string, destination: string, @@ -21,4 +31,4 @@ export type ClientProfil = { Sendertext: string, innerHtml?: string, -}; \ No newline at end of file +}; diff --git a/src/chat/src/color.ts b/src/chat/src/color.ts new file mode 100644 index 0000000..cb87c2c --- /dev/null +++ b/src/chat/src/color.ts @@ -0,0 +1,8 @@ +// colors for console.log +export const color = { + red: '\x1b[31m', + green: '\x1b[32m', + yellow: '\x1b[33m', + blue: '\x1b[34m', + reset: '\x1b[0m', +}; \ No newline at end of file diff --git a/src/chat/src/filter_Blocked_user.ts b/src/chat/src/filter_Blocked_user.ts new file mode 100644 index 0000000..3f96bef --- /dev/null +++ b/src/chat/src/filter_Blocked_user.ts @@ -0,0 +1,39 @@ +import type { ClientMessage, ClientProfil } from './chat_types'; +import { FastifyInstance } from 'fastify'; +import type { User } from '@shared/database/mixin/user'; +import { getUserById } from './getUserById'; +import { isUser_BlockedBy_me } from './isUser_BlockedBy_me'; + +/** + * function to check if blocked or not - checks with ID + * @param fastify + * @param data + * @returns true or false - true if blocked user by a user + */ + +export function filter_Blocked_user(fastify: FastifyInstance, data: ClientMessage, id: string): boolean { + + const users: User[] = fastify.db.getAllUsers() ?? []; + const UserToBlock: string = id; + const UserAskingToBlock: User | null = getUserById(users,`${data.SenderUserID}`); + if (!UserAskingToBlock ) { + // console.log('SOMETHING NULL', data); + // console.log('UsetToBlock', UserToBlock?.id); + // console.log('UsetToBlock', UserToBlock?.name); + // console.log('UsetAskingToBlock', UserAskingToBlock?.id); + // console.log('UsetAskingToBlock', UserAskingToBlock?.name); + console.log(''); + + + return false; + } + if(isUser_BlockedBy_me(fastify, UserAskingToBlock!.id, UserToBlock)) + { + return true; + } + else + { + return false; + } +} + diff --git a/src/chat/src/getUserById.ts b/src/chat/src/getUserById.ts new file mode 100644 index 0000000..a276238 --- /dev/null +++ b/src/chat/src/getUserById.ts @@ -0,0 +1,10 @@ +import type { User } from '@shared/database/mixin/user'; +/** + * function get the object user in an array of users[] by name + * @param users + * @param name + * @returns + */ +export function getUserById(users: User[], id: string) { + return users.find(user => user.id === id) || null; +}; diff --git a/src/chat/src/isUser_BlockedBy_me.ts b/src/chat/src/isUser_BlockedBy_me.ts new file mode 100644 index 0000000..dcd7bb4 --- /dev/null +++ b/src/chat/src/isUser_BlockedBy_me.ts @@ -0,0 +1,32 @@ +import { FastifyInstance } from 'fastify'; +import type { User } from '@shared/database/mixin/user'; +import type { BlockedData } from '@shared/database/mixin/blocked'; +import { isBlocked } from './isBlocked'; +import { getUserById } from './getUserById'; +import { color } from './color'; + +/** + * checks the Db for the two matching Ids + * @param fastify + * @param blockedBy_Id + * @param isBlocked_Id + * @returns Null if not blocked + */ + +export function isUser_BlockedBy_me(fastify: FastifyInstance, blockedBy_Id : string, isBlocked_Id: string): string { + const users: User[] = fastify.db.getAllUsers() ?? []; + if (!users) return ''; + const UserToBlock: User | null = getUserById(users, `${isBlocked_Id}`); + const UserAskingToBlock: User | null = getUserById(users, `${blockedBy_Id}`); + if (!UserToBlock) {console.log(color.blue, `'User: ${UserAskingToBlock?.id} has not blocked' ${isBlocked_Id}`); return ""}; + if (!UserAskingToBlock) {console.log(color.blue, `'User: ${UserToBlock?.id} has not blocked by' ${blockedBy_Id}`); return ""}; + const usersBlocked: BlockedData[] = fastify.db.getAllBlockedUsers() ?? []; + const userAreBlocked: boolean = isBlocked(UserAskingToBlock, UserToBlock, usersBlocked); + if (userAreBlocked) { + console.log(color.yellow, `'User :${UserAskingToBlock.name}) Hhas UN blocked ${UserToBlock.name}`) + return UserAskingToBlock.name; + } + console.log(color.blue, `'User :${UserAskingToBlock.name}) has BBBblocked ${UserToBlock.name}`) + + return ""; +}; diff --git a/src/chat/src/routes/broadcast.ts b/src/chat/src/routes/broadcast.ts index 9bd0ec2..de46038 100644 --- a/src/chat/src/routes/broadcast.ts +++ b/src/chat/src/routes/broadcast.ts @@ -19,7 +19,7 @@ const route: FastifyPluginAsync = async (fastify): Promise => { config: { requireAuth: false }, }, async function(req, res) { - broadcast(this, { command: '', destination: '', user: 'CMwaLeSever!!', text: req.body.message, SenderWindowID: 'server' }); + //broadcast(this, { command: '', destination: '', user: 'CMwaLeSever!!', text: req.body.message, SenderWindowID: 'server' }); void res; }, );