From 98cdae97c08a9542c2a23470d175ac10d43b45f0 Mon Sep 17 00:00:00 2001 From: Raphix Date: Fri, 25 Jul 2025 17:56:30 +0200 Subject: [PATCH] Version 1.1.0 - Refactor + Intergration Backend --- .../package-lock.json => package-lock.json | 8 +- backend/package.json => package.json | 2 +- {backend/src => src}/discord/Activity.js | 0 {backend/src => src}/discord/Bot.js | 143 +++++++++++++----- {backend/src => src}/discord/Button.js | 0 {backend/src => src}/discord/Command.js | 0 .../src => src}/discord/CommandUpdater.js | 0 .../src => src}/discord/Commands/About.js | 0 {backend/src => src}/discord/Commands/Help.js | 0 .../src => src}/discord/Commands/Invite.js | 0 .../src => src}/discord/Commands/Leave.js | 0 .../src => src}/discord/Commands/Media.js | 0 .../src => src}/discord/Commands/Pause.js | 0 {backend/src => src}/discord/Commands/Play.js | 0 .../src => src}/discord/Commands/Previous.js | 0 .../src => src}/discord/Commands/Queue.js | 0 .../src => src}/discord/Commands/Report.js | 0 .../src => src}/discord/Commands/Restart.js | 0 {backend/src => src}/discord/Commands/Skip.js | 0 .../src => src}/discord/Commands/State.js | 0 {backend/src => src}/discord/Commands/Web.js | 0 {backend/src => src}/discord/Embed.js | 0 {backend/src => src}/discord/MediaBase.js | 7 +- {backend/src => src}/discord/ReportSender.js | 0 {backend/src => src}/lyrics/Lyrics.js | 0 {backend/src => src}/lyrics/urls.json | 0 {backend/src => src}/main.js | 0 .../src => src}/media/MediaInformation.js | 0 .../media/SoundcloudInformation.js | 0 .../src => src}/media/SpotifyInformation.js | 0 .../src => src}/media/YoutubeInformation.js | 0 {backend/src => src}/player/Finder.js | 0 {backend/src => src}/player/List.js | 0 {backend/src => src}/player/Method/Media.js | 0 .../src => src}/player/Method/Soundcloud.js | 0 {backend/src => src}/player/Method/Youtube.js | 0 {backend/src => src}/player/Player.js | 4 +- {backend/src => src}/player/Song.js | 0 {backend/src => src}/player/SongCheck.js | 0 .../src => src}/playlists/Google/OAuth2.js | 0 .../playlists/Google/YoutubeList.js | 0 {backend/src => src}/playlists/History.js | 0 {backend/src => src}/playlists/Playlist.js | 0 .../src => src}/playlists/PlaylistManager.js | 0 {backend/src => src}/server/Server.js | 105 ++++++++++--- .../src => src}/server/auth/DiscordAuth.js | 3 +- {backend/src => src}/server/auth/Session.js | 0 {backend/src => src}/server/auth/User.js | 42 ++++- .../src => src}/utils/AudioBufferCheck.js | 0 .../utils/Database/Configuration.js | 0 .../src => src}/utils/Database/Database.js | 0 {backend/src => src}/utils/GlobalVars.js | 0 {backend/src => src}/utils/Links.js | 0 {backend/src => src}/utils/Maintenance.js | 0 {backend/src => src}/utils/QueryType.js | 0 {backend/src => src}/utils/Resolver.js | 0 {backend/src => src}/utils/TimeConverter.js | 0 {backend/src => src}/utils/TokenManager.js | 0 58 files changed, 244 insertions(+), 70 deletions(-) rename backend/package-lock.json => package-lock.json (99%) rename backend/package.json => package.json (97%) rename {backend/src => src}/discord/Activity.js (100%) rename {backend/src => src}/discord/Bot.js (52%) rename {backend/src => src}/discord/Button.js (100%) rename {backend/src => src}/discord/Command.js (100%) rename {backend/src => src}/discord/CommandUpdater.js (100%) rename {backend/src => src}/discord/Commands/About.js (100%) rename {backend/src => src}/discord/Commands/Help.js (100%) rename {backend/src => src}/discord/Commands/Invite.js (100%) rename {backend/src => src}/discord/Commands/Leave.js (100%) rename {backend/src => src}/discord/Commands/Media.js (100%) rename {backend/src => src}/discord/Commands/Pause.js (100%) rename {backend/src => src}/discord/Commands/Play.js (100%) rename {backend/src => src}/discord/Commands/Previous.js (100%) rename {backend/src => src}/discord/Commands/Queue.js (100%) rename {backend/src => src}/discord/Commands/Report.js (100%) rename {backend/src => src}/discord/Commands/Restart.js (100%) rename {backend/src => src}/discord/Commands/Skip.js (100%) rename {backend/src => src}/discord/Commands/State.js (100%) rename {backend/src => src}/discord/Commands/Web.js (100%) rename {backend/src => src}/discord/Embed.js (100%) rename {backend/src => src}/discord/MediaBase.js (96%) rename {backend/src => src}/discord/ReportSender.js (100%) rename {backend/src => src}/lyrics/Lyrics.js (100%) rename {backend/src => src}/lyrics/urls.json (100%) rename {backend/src => src}/main.js (100%) rename {backend/src => src}/media/MediaInformation.js (100%) rename {backend/src => src}/media/SoundcloudInformation.js (100%) rename {backend/src => src}/media/SpotifyInformation.js (100%) rename {backend/src => src}/media/YoutubeInformation.js (100%) rename {backend/src => src}/player/Finder.js (100%) rename {backend/src => src}/player/List.js (100%) rename {backend/src => src}/player/Method/Media.js (100%) rename {backend/src => src}/player/Method/Soundcloud.js (100%) rename {backend/src => src}/player/Method/Youtube.js (100%) rename {backend/src => src}/player/Player.js (99%) rename {backend/src => src}/player/Song.js (100%) rename {backend/src => src}/player/SongCheck.js (100%) rename {backend/src => src}/playlists/Google/OAuth2.js (100%) rename {backend/src => src}/playlists/Google/YoutubeList.js (100%) rename {backend/src => src}/playlists/History.js (100%) rename {backend/src => src}/playlists/Playlist.js (100%) rename {backend/src => src}/playlists/PlaylistManager.js (100%) rename {backend/src => src}/server/Server.js (89%) rename {backend/src => src}/server/auth/DiscordAuth.js (97%) rename {backend/src => src}/server/auth/Session.js (100%) rename {backend/src => src}/server/auth/User.js (90%) rename {backend/src => src}/utils/AudioBufferCheck.js (100%) rename {backend/src => src}/utils/Database/Configuration.js (100%) rename {backend/src => src}/utils/Database/Database.js (100%) rename {backend/src => src}/utils/GlobalVars.js (100%) rename {backend/src => src}/utils/Links.js (100%) rename {backend/src => src}/utils/Maintenance.js (100%) rename {backend/src => src}/utils/QueryType.js (100%) rename {backend/src => src}/utils/Resolver.js (100%) rename {backend/src => src}/utils/TimeConverter.js (100%) rename {backend/src => src}/utils/TokenManager.js (100%) diff --git a/backend/package-lock.json b/package-lock.json similarity index 99% rename from backend/package-lock.json rename to package-lock.json index b92a817..69156ab 100644 --- a/backend/package-lock.json +++ b/package-lock.json @@ -24,7 +24,7 @@ "libsodium-wrappers": "^0.7.15", "loguix": "^1.4.2", "mime-types": "^3.0.1", - "nodemon": "^3.1.9", + "nodemon": "^3.1.10", "pm2": "^5.4.3", "socket.io": "^4.8.1", "soundcloud.ts": "^0.6.3", @@ -4544,9 +4544,9 @@ } }, "node_modules/nodemon": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.9.tgz", - "integrity": "sha512-hdr1oIb2p6ZSxu3PB2JWWYS7ZQ0qvaZsc3hK8DR8f02kRzc8rjYmxAIvdz+aYC+8F2IjNaB7HMcSDg8nQpJxyg==", + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.10.tgz", + "integrity": "sha512-WDjw3pJ0/0jMFmyNDp3gvY2YizjLmmOUQo6DEBY+JgdvW/yQ9mEeSw6H5ythl5Ny2ytb7f9C2nIbjSxMNzbJXw==", "license": "MIT", "dependencies": { "chokidar": "^3.5.2", diff --git a/backend/package.json b/package.json similarity index 97% rename from backend/package.json rename to package.json index 3eb208c..70c9de1 100644 --- a/backend/package.json +++ b/package.json @@ -35,7 +35,7 @@ "libsodium-wrappers": "^0.7.15", "loguix": "^1.4.2", "mime-types": "^3.0.1", - "nodemon": "^3.1.9", + "nodemon": "^3.1.10", "pm2": "^5.4.3", "socket.io": "^4.8.1", "soundcloud.ts": "^0.6.3", diff --git a/backend/src/discord/Activity.js b/src/discord/Activity.js similarity index 100% rename from backend/src/discord/Activity.js rename to src/discord/Activity.js diff --git a/backend/src/discord/Bot.js b/src/discord/Bot.js similarity index 52% rename from backend/src/discord/Bot.js rename to src/discord/Bot.js index 7d0e0f4..1abd1b6 100644 --- a/backend/src/discord/Bot.js +++ b/src/discord/Bot.js @@ -6,15 +6,18 @@ const { LogType } = require("loguix") const config = require("../utils/Database/Configuration") const metric = require("webmetrik") const { Player } = require("../player/Player") -const {refreshAllUserInformation} = require("../server/auth/User") +const {refreshAllUserInformation, clearNeedUpdateForUsers} = require("../server/auth/User") const dlog = new LogType("Discord") +const glog = new LogType("GuildUpdater") dlog.log("Initialisation du Bot Discord") const membersVoices = new Map() const timers = new Map() const guilds = new Map() +var operational = false + const client = new Client({ intents:[GatewayIntentBits.Guilds, GatewayIntentBits.GuildVoiceStates, GatewayIntentBits.GuildMembers], }) @@ -33,6 +36,19 @@ function getMembersVoices() { return membersVoices } +function isReady() { + return operational +} + +function getGuildMembers(guildId) { + const guild = client.guilds.cache.get(guildId) + if(!guild) { + dlog.error("Guild not found: " + guildId) + return [] + } + return guild.members.cache.map(member => member.user.id) +} + function getChannel(guildId, channelId) { return client.guilds.cache.get(guildId).channels.cache.get(channelId) } @@ -40,40 +56,45 @@ function getChannel(guildId, channelId) { function init() { client.once('ready', async () => { - dlog.log("Connexion au Bot Discord réussi ! Connecté en tant que : " + client.user.tag) + dlog.log("Connexion au Bot Discord réussi ! Connecté en tant que : " + client.user.tag) - // Add all guilds to the guilds map - await client.guilds.cache.forEach(async guild => { - var guildMember = await guild.members.fetch() - guildMember = guildMember.map(member => member.user.id) - - await guilds.set(guild.id, { - id: guild.id, - name: guild.name, - members: guildMember, - }) - - }) - refreshAllUserInformation() - const Activity = require("./Activity") - Activity.idleActivity() - - const CommandUpdater = require("./CommandUpdater") - CommandUpdater.init() - - const commandManager = client.application.commands; - - if (!commandManager) { - dlog.error('Command manager not available.'); - - } else { - - commandManager.set([]); + for (const guild of client.guilds.cache.values()) { + const missingPermissions = checkRequiredPermission(guild.members.me) + if (missingPermissions.length > 0) { + dlog.error("Le bot n'a pas les permissions nécessaires pour rejoindre la guilde : " + guild.name) + dlog.error("Permissions manquantes : " + missingPermissions.join(", ")) + await guild.leave() + continue } - dlog.step.end("d_init") - - }); + var guildMember = await guild.members.fetch() + guildMember = guildMember.map(member => member.user.id) + guilds.set(guild.id, { + id: guild.id, + name: guild.name, + members: guildMember, + }) + glog.log("Guilde instanciée (démarrage) : " + guild.name + " (" + guild.id + ")") + } + + await refreshAllUserInformation() + + const Activity = require("./Activity") + Activity.idleActivity() + + const CommandUpdater = require("./CommandUpdater") + CommandUpdater.init() + + const commandManager = client.application.commands + if (!commandManager) { + dlog.error('Command manager not available.') + } else { + commandManager.set([]) + } + + dlog.step.end("d_init") + operational = true +}) client.on("interactionCreate", (interaction) => { @@ -100,13 +121,36 @@ function init() { }) // If a new guild is added, we will add it to the guilds map - client.on("guildCreate", (guild) => { - dlog.log("Nouvelle guilde ajoutée : " + guild.name) - guilds.set(guild.id, { - id: guild.id, - name: guild.name, - members: guild.members.cache.map(member => member.user.username), - }) + client.on("guildCreate", async (guild) => { + + const guildMember = guild.members.cache.get(client.user.id); + if (guildMember) { + const missingPermissions = checkRequiredPermission(guildMember) + if(missingPermissions.length > 0) { + dlog.error("Le bot n'a pas les permissions nécessaires pour rejoindre la guilde : " + guild.name) + guild.leave() + return + } + dlog.log("Nouvelle guilde ajoutée : " + guild.name) + var allMembersOfGuild = await guild.members.fetch() + allMembersOfGuild = allMembersOfGuild.map(member => member.user.id) + guilds.set(guild.id, { + id: guild.id, + name: guild.name, + members: allMembersOfGuild, + }) + glog.log("Guilde ajoutée : " + guild.name + " (" + guild.id + ")") + clearNeedUpdateForUsers() + process.emit("USERS_UPDATE") + } + }) + + client.on("guildDelete", (guild) => { + dlog.log("Guilde supprimée : " + guild.name) + guilds.delete(guild.id) + glog.log("Guilde supprimée : " + guild.name + " (" + guild.id + ")") + clearNeedUpdateForUsers() + process.emit("USERS_UPDATE") }) client.on("voiceStateUpdate", (oldMember, newMember) => { @@ -152,6 +196,25 @@ function init() { client.login(config.getToken()) } -module.exports = {init, getClient, getGuilds, getMembersVoices, getChannel} +function checkRequiredPermission(guildMember) { + const requiredPermissions = [ + 'CreateInstantInvite', 'AddReactions', + 'Stream', 'ViewChannel', + 'SendMessages', 'SendTTSMessages', + 'EmbedLinks', 'AttachFiles', + 'ReadMessageHistory', 'UseExternalEmojis', + 'Connect', 'Speak', + 'UseVAD', 'ChangeNickname', + 'UseApplicationCommands', 'RequestToSpeak', + 'CreatePublicThreads', 'CreatePrivateThreads', + 'UseExternalStickers', 'SendMessagesInThreads', + 'UseEmbeddedActivities', 'UseSoundboard', + 'UseExternalSounds', 'SendVoiceMessages', + 'SendPolls', 'UseExternalApps' + ] + return requiredPermissions.filter(permission => !guildMember.permissions.has(permission)); +} + +module.exports = {init, getClient, getGuilds, getMembersVoices, getChannel, getGuildMembers, isReady} diff --git a/backend/src/discord/Button.js b/src/discord/Button.js similarity index 100% rename from backend/src/discord/Button.js rename to src/discord/Button.js diff --git a/backend/src/discord/Command.js b/src/discord/Command.js similarity index 100% rename from backend/src/discord/Command.js rename to src/discord/Command.js diff --git a/backend/src/discord/CommandUpdater.js b/src/discord/CommandUpdater.js similarity index 100% rename from backend/src/discord/CommandUpdater.js rename to src/discord/CommandUpdater.js diff --git a/backend/src/discord/Commands/About.js b/src/discord/Commands/About.js similarity index 100% rename from backend/src/discord/Commands/About.js rename to src/discord/Commands/About.js diff --git a/backend/src/discord/Commands/Help.js b/src/discord/Commands/Help.js similarity index 100% rename from backend/src/discord/Commands/Help.js rename to src/discord/Commands/Help.js diff --git a/backend/src/discord/Commands/Invite.js b/src/discord/Commands/Invite.js similarity index 100% rename from backend/src/discord/Commands/Invite.js rename to src/discord/Commands/Invite.js diff --git a/backend/src/discord/Commands/Leave.js b/src/discord/Commands/Leave.js similarity index 100% rename from backend/src/discord/Commands/Leave.js rename to src/discord/Commands/Leave.js diff --git a/backend/src/discord/Commands/Media.js b/src/discord/Commands/Media.js similarity index 100% rename from backend/src/discord/Commands/Media.js rename to src/discord/Commands/Media.js diff --git a/backend/src/discord/Commands/Pause.js b/src/discord/Commands/Pause.js similarity index 100% rename from backend/src/discord/Commands/Pause.js rename to src/discord/Commands/Pause.js diff --git a/backend/src/discord/Commands/Play.js b/src/discord/Commands/Play.js similarity index 100% rename from backend/src/discord/Commands/Play.js rename to src/discord/Commands/Play.js diff --git a/backend/src/discord/Commands/Previous.js b/src/discord/Commands/Previous.js similarity index 100% rename from backend/src/discord/Commands/Previous.js rename to src/discord/Commands/Previous.js diff --git a/backend/src/discord/Commands/Queue.js b/src/discord/Commands/Queue.js similarity index 100% rename from backend/src/discord/Commands/Queue.js rename to src/discord/Commands/Queue.js diff --git a/backend/src/discord/Commands/Report.js b/src/discord/Commands/Report.js similarity index 100% rename from backend/src/discord/Commands/Report.js rename to src/discord/Commands/Report.js diff --git a/backend/src/discord/Commands/Restart.js b/src/discord/Commands/Restart.js similarity index 100% rename from backend/src/discord/Commands/Restart.js rename to src/discord/Commands/Restart.js diff --git a/backend/src/discord/Commands/Skip.js b/src/discord/Commands/Skip.js similarity index 100% rename from backend/src/discord/Commands/Skip.js rename to src/discord/Commands/Skip.js diff --git a/backend/src/discord/Commands/State.js b/src/discord/Commands/State.js similarity index 100% rename from backend/src/discord/Commands/State.js rename to src/discord/Commands/State.js diff --git a/backend/src/discord/Commands/Web.js b/src/discord/Commands/Web.js similarity index 100% rename from backend/src/discord/Commands/Web.js rename to src/discord/Commands/Web.js diff --git a/backend/src/discord/Embed.js b/src/discord/Embed.js similarity index 100% rename from backend/src/discord/Embed.js rename to src/discord/Embed.js diff --git a/backend/src/discord/MediaBase.js b/src/discord/MediaBase.js similarity index 96% rename from backend/src/discord/MediaBase.js rename to src/discord/MediaBase.js index 03ea395..e7a5607 100644 --- a/backend/src/discord/MediaBase.js +++ b/src/discord/MediaBase.js @@ -22,7 +22,12 @@ if(!config.getMediaGuildId() || !config.getMediaChannelId()) { var channel = null discordBot.getClient().on("ready", () => { - channel = discordBot.getChannel(config.getMediaGuildId(), config.getMediaChannelId()) + try { + channel = discordBot.getChannel(config.getMediaGuildId(), config.getMediaChannelId()) + } catch (e) { + + } + if(!channel) { wlog.warn("Le canal multimédia n'existe pas, vérifiez le fichier de configuration.") wlog.step.error("init_db","Impossible d'initialiser la base de données multimédia, vérifiez le fichier de configuration.") diff --git a/backend/src/discord/ReportSender.js b/src/discord/ReportSender.js similarity index 100% rename from backend/src/discord/ReportSender.js rename to src/discord/ReportSender.js diff --git a/backend/src/lyrics/Lyrics.js b/src/lyrics/Lyrics.js similarity index 100% rename from backend/src/lyrics/Lyrics.js rename to src/lyrics/Lyrics.js diff --git a/backend/src/lyrics/urls.json b/src/lyrics/urls.json similarity index 100% rename from backend/src/lyrics/urls.json rename to src/lyrics/urls.json diff --git a/backend/src/main.js b/src/main.js similarity index 100% rename from backend/src/main.js rename to src/main.js diff --git a/backend/src/media/MediaInformation.js b/src/media/MediaInformation.js similarity index 100% rename from backend/src/media/MediaInformation.js rename to src/media/MediaInformation.js diff --git a/backend/src/media/SoundcloudInformation.js b/src/media/SoundcloudInformation.js similarity index 100% rename from backend/src/media/SoundcloudInformation.js rename to src/media/SoundcloudInformation.js diff --git a/backend/src/media/SpotifyInformation.js b/src/media/SpotifyInformation.js similarity index 100% rename from backend/src/media/SpotifyInformation.js rename to src/media/SpotifyInformation.js diff --git a/backend/src/media/YoutubeInformation.js b/src/media/YoutubeInformation.js similarity index 100% rename from backend/src/media/YoutubeInformation.js rename to src/media/YoutubeInformation.js diff --git a/backend/src/player/Finder.js b/src/player/Finder.js similarity index 100% rename from backend/src/player/Finder.js rename to src/player/Finder.js diff --git a/backend/src/player/List.js b/src/player/List.js similarity index 100% rename from backend/src/player/List.js rename to src/player/List.js diff --git a/backend/src/player/Method/Media.js b/src/player/Method/Media.js similarity index 100% rename from backend/src/player/Method/Media.js rename to src/player/Method/Media.js diff --git a/backend/src/player/Method/Soundcloud.js b/src/player/Method/Soundcloud.js similarity index 100% rename from backend/src/player/Method/Soundcloud.js rename to src/player/Method/Soundcloud.js diff --git a/backend/src/player/Method/Youtube.js b/src/player/Method/Youtube.js similarity index 100% rename from backend/src/player/Method/Youtube.js rename to src/player/Method/Youtube.js diff --git a/backend/src/player/Player.js b/src/player/Player.js similarity index 99% rename from backend/src/player/Player.js rename to src/player/Player.js index a7b60fc..ca160a4 100644 --- a/backend/src/player/Player.js +++ b/src/player/Player.js @@ -240,7 +240,9 @@ class Player { process.emit("PLAYERS_UPDATE") return true } - + const { LogType } = require('loguix') + + } async leave() { diff --git a/backend/src/player/Song.js b/src/player/Song.js similarity index 100% rename from backend/src/player/Song.js rename to src/player/Song.js diff --git a/backend/src/player/SongCheck.js b/src/player/SongCheck.js similarity index 100% rename from backend/src/player/SongCheck.js rename to src/player/SongCheck.js diff --git a/backend/src/playlists/Google/OAuth2.js b/src/playlists/Google/OAuth2.js similarity index 100% rename from backend/src/playlists/Google/OAuth2.js rename to src/playlists/Google/OAuth2.js diff --git a/backend/src/playlists/Google/YoutubeList.js b/src/playlists/Google/YoutubeList.js similarity index 100% rename from backend/src/playlists/Google/YoutubeList.js rename to src/playlists/Google/YoutubeList.js diff --git a/backend/src/playlists/History.js b/src/playlists/History.js similarity index 100% rename from backend/src/playlists/History.js rename to src/playlists/History.js diff --git a/backend/src/playlists/Playlist.js b/src/playlists/Playlist.js similarity index 100% rename from backend/src/playlists/Playlist.js rename to src/playlists/Playlist.js diff --git a/backend/src/playlists/PlaylistManager.js b/src/playlists/PlaylistManager.js similarity index 100% rename from backend/src/playlists/PlaylistManager.js rename to src/playlists/PlaylistManager.js diff --git a/backend/src/server/Server.js b/src/server/Server.js similarity index 89% rename from backend/src/server/Server.js rename to src/server/Server.js index 34c2152..a517e3f 100644 --- a/backend/src/server/Server.js +++ b/src/server/Server.js @@ -1,6 +1,7 @@ const {LogType} = require('loguix') const wlog = new LogType("Server") +const fs = require("fs") const path = require("path") const {Server} = require('socket.io') const {createServer} = require('http') @@ -12,7 +13,7 @@ const discordBot = require("../discord/Bot") const discordAuth = require("../server/auth/DiscordAuth") const {Report} = require("../discord/ReportSender") const Finder = require("../player/Finder") -const fs = require("fs") + const {__glob} = require("../utils/GlobalVars") const playlists = require("../playlists/PlaylistManager") const history = require("../playlists/History") @@ -32,6 +33,8 @@ const allConnectedUsers = new Array() const guildConnectedUsers = new Map() const UsersBySocket = new Map() +//TODO: Refactor this file to implement the fact that server can be joined and leaved and all the events are now handled, so guildId is not required for every event + function init() { wlog.step.init("server_init", "Initialisation du serveur Socket.IO") @@ -60,6 +63,7 @@ function init() { process.on("USERS_UPDATE", () => { if(io) { + updateGuildConnectedUsers() // Get all players and send them to client subscribed to the guild for(var guild of discordBot.getGuilds().keys()) { if(guildConnectedUsers.has(guild)) { @@ -68,17 +72,17 @@ function init() { wlog.log("Envoi de la liste des utilisateurs connectés (" + guildConnectedUsers.get(guild).length +") à la guilde : " + guild + " à tous les utilisateurs connectés") } } + io.sockets.emit("/USER/READY") } }) - io.on("connection", async (socket) => { var socketUser; // Make sure Discord Bot is loaded and make an interruption until it is loaded - while(!discordBot.getClient().isReady()) { - wlog.warn("Attente de traitement : "+ socket.id + " : Le bot Discord n'est pas encore chargé, attente de 3 seconde... (Avoid Rate Limit)") - await new Promise(resolve => setTimeout(resolve, 3000)) + while(!await discordBot.isReady()) { + wlog.warn("Attente de traitement : "+ socket.id + " : Le bot Discord n'est pas encore chargé, attente de 0.5 seconde... (Avoid Rate Limit)") + await new Promise(resolve => setTimeout(resolve, 500)) } wlog.log(`Connexion d'un client : ${socket.id}`) @@ -102,6 +106,7 @@ function init() { var token = socket.handshake.auth.token var sessionId = socket.handshake.auth.sessionId var auth_code = socket.handshake.auth.auth_code + var inLogin = false if(sessionId) { if(!session.checkSession(sessionId)) { @@ -126,7 +131,8 @@ function init() { } const newToken = await loggedUser.createToken() socket.emit("NEW_TOKEN", newToken) - socket.disconnect() + token = newToken + inLogin = true wlog.log("Utilisateur Discord associé à la session : " + sessionId + " récupéré avec succès") } @@ -134,6 +140,7 @@ function init() { } else { wlog.warn("Code d'authentification manquant pour le client :" + socket.id) + socket.emit("AUTH_ERROR", "Code manquant invalide") socket.disconnect() return } @@ -142,6 +149,7 @@ function init() { if(!token) { wlog.warn("Token manquant pour le client :" + socket.id) + socket.emit("AUTH_ERROR", "Token invalide") sendSession() return } @@ -150,31 +158,42 @@ function init() { if(!socketUser) { wlog.warn("Token invalide pour le client :" + socket.id) + socket.emit("AUTH_ERROR", "Token invalide") sendSession() return } else { if(!socketUser.auth) { wlog.warn("L'utilisateur '" + socketUser.identity.username + "' n'a pas d'authentification Discord Valide") socketUser.clearToken() - socket.emit("AUTH_ERROR", "AUTH_ERROR") + socket.emit("AUTH_ERROR", "L'authentification Discord de l'utilisateur n'est pas valide") socket.disconnect() return } - if (!(await users.updateGuilds(socketUser.identity.id)) || !(await users.updateIdentity(socketUser.identity.id))) { - wlog.error("Erreur lors de la mise à jour des informations de l'utilisateur : " + socketUser.identity.id); - socket.emit("UPDATE_ERROR", "Error updating user information"); - wlog.log("Déconnexion de l'utilisateur : " + socketUser.identity.username + " (" + socketUser.identity.id + ") - Socket : " + socket.id) - socket.disconnect(); - return; + if(!inLogin) { + if(socketUser.needUpdate()) { + if (!(await users.updateGuilds(socketUser.identity.id)) || !(await users.updateIdentity(socketUser.identity.id))) { + wlog.error("Erreur lors de la mise à jour des informations de l'utilisateur : " + socketUser.identity.id); + socket.emit("AUTH_ERROR", "Mise à jour des informations de l'utilisateur impossible"); + wlog.log("Déconnexion de l'utilisateur : " + socketUser.identity.username + " (" + socketUser.identity.id + ") - Socket : " + socket.id) + socket.disconnect(); + return; + } + socketUser.justUpdated() + } else { + wlog.log("Pas de mise à jour des informations de l'utilisateur : " + socketUser.identity.id + " car l'utilisateur vient de se connecter") + } + + } else { + wlog.log("L'utilisateur '" + socketUser.identity.username + "' s'est connecté via la session : " + sessionId) } + } socketUser = users.getUserByToken(token) if(socketUser) { - - if(allConnectedUsers.includes(socketUser.identity.id)) { + if(allConnectedUsers.includes(socketUser.identity)) { wlog.warn("L'utilisateur '" + socketUser.identity.username + "' est déjà connecté sur un autre appareil") return } else { @@ -189,7 +208,7 @@ function init() { if(socketUser.isFullBanned()) { wlog.warn("Utilisateur banni : " + socketUser.identity.username + " (" + socketUser.identity.id + ") - Socket : " + socket.id) - socket.emit("BANNED") + socket.emit("AUTH_ERROR", "Vous êtes banni du serveur") socket.disconnect() } if(socketUser.isAdmin()) { @@ -197,6 +216,7 @@ function init() { wlog.log("Utilisateur admin identifié : " + socketUser.identity.username + " (" + socketUser.identity.id + ")") } + IOAnswer("/USER/READY", true) // USERS // CHECKED : 24/04/2025 @@ -204,9 +224,31 @@ function init() { var guildPresents = new Array(); var guildsOfBot = discordBot.getGuilds() for(var guild of guildsOfBot) { - if(guild[1].members.includes(socketUser.identity.id)) { - guildPresents.push(guild[1].id) + const guildData = socketUser.guilds.find(g => g.id == guild[0]) + guildData['members'] = new Array() + guildData.serverMember = guild[1].members.length + for(var user of guild[1].members) { + const userData = users.getUserById(user) + if(userData && userData.identity.id != socketUser.identity.id && allConnectedUsers.includes(userData.identity)) { + guildData.members.push({ + id: userData.identity.id, + username: userData.identity.username, + avatar: userData.identity.avatar, + isAdmin: userData.isAdmin(), + isOwner: userData.isOwner(guild[0]), + isMod: userData.isMod(guild[0]), + }) + } + } + + // Send if the bot is connected to the guild + if(players.getPlayer(guild[0]) && players.getPlayer(guild[0]).isConnected()) { + guildData.connected = true + } else { + guildData.connected = false + } + guildPresents.push(guildData) } } IOAnswer("/USER/INFO", { @@ -225,6 +267,7 @@ function init() { //CHECKED : 24/04/2025 IORequest("/USER/SIGNOUT", () => { socketUser.removeToken(token) + IOAnswer("/USER/SIGNOUT", true) socket.disconnect() }) @@ -660,7 +703,7 @@ function init() { if(userSocket) { const socket = io.sockets.sockets.get(userSocket) if(socket) { - socket.emit("DELETED") + socket.emit("AUTH_ERROR", "Votre compte a été supprimé") socket.disconnect() } } @@ -677,7 +720,10 @@ function init() { } IOAnswer("/ADMIN/PLAYER/GETALLSTATE", states) }) + + } + // CHECKED : 24/04/2025 IORequest("/OWNER/USERS/SWITCH_MOD", (data) => { @@ -801,7 +847,7 @@ function init() { } - + function handleDisconnect() { if(socketUser) { @@ -871,6 +917,25 @@ function init() { } } + function updateGuildConnectedUsers() { + guildConnectedUsers.clear() + // Get from discordBot + const guilds = discordBot.getGuilds() + for(var guild of guilds) { + const members = discordBot.getGuildMembers(guild[0]) + if(!members) continue + for(var member of members) { + const user = users.getUserById(member) + if(user && allConnectedUsers.includes(user.identity)) { + if(!guildConnectedUsers.has(guild[0])) { + guildConnectedUsers.set(guild[0], new Array()) + } + guildConnectedUsers.get(guild[0]).push(user) + } + } + } + } + } diff --git a/backend/src/server/auth/DiscordAuth.js b/src/server/auth/DiscordAuth.js similarity index 97% rename from backend/src/server/auth/DiscordAuth.js rename to src/server/auth/DiscordAuth.js index 6b1d3cc..fd33d79 100644 --- a/backend/src/server/auth/DiscordAuth.js +++ b/src/server/auth/DiscordAuth.js @@ -17,7 +17,7 @@ async function getDiscordUser(sessionId, auth_code) { params.append("client_secret", getClientSecret()); params.append("grant_type", "authorization_code"); params.append("code", auth_code); - params.append("redirect_uri", getWebsiteLink() + "/callback"); + params.append("redirect_uri", getWebsiteLink() + "/redirect"); params.append("scope", "identify guilds"); fetch("https://discord.com/api/oauth2/token", { @@ -112,6 +112,7 @@ function getUserGuilds(accessToken) { }).then(guildsResp => guildsResp.json()).then(guilds => { if (guilds.error) { dlog.error("Erreur lors de la récupération des guildes de l'utilisateur Discord : " + guilds.error + " : " + guilds.error_description); + dlog.log(accessToken.token_type + " " + accessToken.access_token ) resolve(null); return; } diff --git a/backend/src/server/auth/Session.js b/src/server/auth/Session.js similarity index 100% rename from backend/src/server/auth/Session.js rename to src/server/auth/Session.js diff --git a/backend/src/server/auth/User.js b/src/server/auth/User.js similarity index 90% rename from backend/src/server/auth/User.js rename to src/server/auth/User.js index 165c627..202c5cc 100644 --- a/backend/src/server/auth/User.js +++ b/src/server/auth/User.js @@ -158,8 +158,36 @@ class User { return this.labels.includes(ownerLabel); } - + justUpdated() { + const userInUserList = userList.find(user => user.identity.id === this.identity.id); + if (!userInUserList) { + clog.warn(`Utilisateur ${this.identity.username} non trouvé dans la liste des utilisateurs.`); + return false; + } + userInUserList.labels = userInUserList.labels.filter(label => !label.startsWith("UPDATED[")); + userInUserList.labels.push("UPDATED[" + new Date().toISOString() + "]"); + saveUsers(); + } + needUpdate() { + const userInUserList = userList.find(user => user.identity.id === this.identity.id); + if (!userInUserList) { + clog.warn(`Utilisateur ${this.identity.username} non trouvé dans la liste des utilisateurs.`); + return false; + } + const lastUpdate = userInUserList.labels.find(label => label.startsWith("UPDATED[")); + if (lastUpdate) { + const date = new Date(lastUpdate.replace("UPDATED[", "").replace("]", "")); + const now = new Date(); + const diff = now - date; + // Check for 30 seconds + clog.log(`Dernière mise à jour de l'utilisateur ${this.identity.username} : ${date.toISOString()} (${diff} ms) - Besoin de mise à jour : ${diff > 30000}`); + // If the difference is greater than 30 seconds, we need to update + return diff > 30000; // 30 seconds + } + clog.log(`Aucune mise à jour n'a été effectuée pour l'utilisateur ${this.identity.username}.`); + return true; + } } @@ -241,6 +269,7 @@ async function updateGuilds(id) { return null; } saveUsers(); + return user.guilds; } @@ -508,6 +537,14 @@ function saveUsers() { return loadUsers(); } +function clearNeedUpdateForUsers() { + userList.forEach(user => { + user.labels = user.labels.filter(label => !label.startsWith("UPDATED[")); + }); + saveUsers(); + clog.log("Nettoyage des mises à jour nécessaires pour tous les utilisateurs."); +} + module.exports = {User} module.exports = { @@ -528,5 +565,6 @@ module.exports = { updateCredientials, refreshAllUserInformation, updateGuilds, - updateIdentity + updateIdentity, + clearNeedUpdateForUsers }; diff --git a/backend/src/utils/AudioBufferCheck.js b/src/utils/AudioBufferCheck.js similarity index 100% rename from backend/src/utils/AudioBufferCheck.js rename to src/utils/AudioBufferCheck.js diff --git a/backend/src/utils/Database/Configuration.js b/src/utils/Database/Configuration.js similarity index 100% rename from backend/src/utils/Database/Configuration.js rename to src/utils/Database/Configuration.js diff --git a/backend/src/utils/Database/Database.js b/src/utils/Database/Database.js similarity index 100% rename from backend/src/utils/Database/Database.js rename to src/utils/Database/Database.js diff --git a/backend/src/utils/GlobalVars.js b/src/utils/GlobalVars.js similarity index 100% rename from backend/src/utils/GlobalVars.js rename to src/utils/GlobalVars.js diff --git a/backend/src/utils/Links.js b/src/utils/Links.js similarity index 100% rename from backend/src/utils/Links.js rename to src/utils/Links.js diff --git a/backend/src/utils/Maintenance.js b/src/utils/Maintenance.js similarity index 100% rename from backend/src/utils/Maintenance.js rename to src/utils/Maintenance.js diff --git a/backend/src/utils/QueryType.js b/src/utils/QueryType.js similarity index 100% rename from backend/src/utils/QueryType.js rename to src/utils/QueryType.js diff --git a/backend/src/utils/Resolver.js b/src/utils/Resolver.js similarity index 100% rename from backend/src/utils/Resolver.js rename to src/utils/Resolver.js diff --git a/backend/src/utils/TimeConverter.js b/src/utils/TimeConverter.js similarity index 100% rename from backend/src/utils/TimeConverter.js rename to src/utils/TimeConverter.js diff --git a/backend/src/utils/TokenManager.js b/src/utils/TokenManager.js similarity index 100% rename from backend/src/utils/TokenManager.js rename to src/utils/TokenManager.js