From b0e61fc7f873f5d0fdb70cf46f6539da66d10a89 Mon Sep 17 00:00:00 2001 From: Raphix Date: Wed, 6 Sep 2023 20:27:36 +0200 Subject: [PATCH] Version 0.7.3 - Ajout de la modification des nodes --- data/nodes.json | 32 ++- data/playlist.json | 11 + package.json | 5 +- src/modules/discord-bot.js | 11 +- src/modules/nodes-finder.js | 167 ++++++++++++- src/modules/sub-web.js | 116 ++++++++- .../public/javascript/__settings_script.js | 230 ++++++++++++++++-- src/web/public/stylesheets/style.css | 60 ++++- 8 files changed, 609 insertions(+), 23 deletions(-) diff --git a/data/nodes.json b/data/nodes.json index c51a570..d3568e4 100644 --- a/data/nodes.json +++ b/data/nodes.json @@ -4,5 +4,35 @@ "password": "horizxon.studio", "port": 80, "secure": false + }, + { + "host": "ssl.horizxon.studio", + "password": "horizxon.studio", + "port": 443, + "secure": true + }, + { + "host": "suki.nathan.to", + "password": "adowbongmanacc", + "port": 443, + "secure": true + }, + { + "host": "lavalink.lexnet.cc", + "password": "lexn3tl@val!nk", + "port": 443, + "secure": true + }, + { + "host": "eu-lavalink.lexnet.cc", + "port": 443, + "password": "lexn3tl@val!nk", + "retryAmount": 1 + }, + { + "host": "narco.buses.rocks", + "port": 2269, + "password": "glasshost1984", + "retryAmount": 1 } -] +] \ No newline at end of file diff --git a/data/playlist.json b/data/playlist.json index f51cafb..85a4cc4 100644 --- a/data/playlist.json +++ b/data/playlist.json @@ -132,6 +132,17 @@ "isStream": false, "uri": "https://www.youtube.com/watch?v=vx2u5uUu3DE", "thumbnail": "https://img.youtube.com/vi/vx2u5uUu3DE/default.jpg" + }, + { + "track": "QAAAlwIAMllvdXNzb3UgTidEb3VyIC0gNyBTZWNvbmRzIChSYWRpbyBFZGl0KSBbQXVkaW8gSFFdAAtHb2xkZW5NdXNpYwAAAAAAA9hgAAtDaGlyZU5pcXhUbwABACtodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PUNoaXJlTmlxeFRvAAd5b3V0dWJlAAAAAAAAAAA=", + "title": "Youssou N'Dour - 7 Seconds (Radio Edit) [Audio HQ]", + "identifier": "ChireNiqxTo", + "author": "GoldenMusic", + "duration": 252000, + "isSeekable": true, + "isStream": false, + "uri": "https://www.youtube.com/watch?v=ChireNiqxTo", + "thumbnail": "https://img.youtube.com/vi/ChireNiqxTo/default.jpg" } ] } diff --git a/package.json b/package.json index d7977ce..44f6513 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "subsonics-web", "author": "Raphix", - "version": "0.7.2", + "version": "0.7.3", "nodemonConfig": { "ext": "js, html", "ignore": [ @@ -29,7 +29,8 @@ "scripts": { "start": "nodemon src/main.js", "dev": "set DEV=true& nodemon src/main.js", - "stop": "ssh raphix@raphix.fr sudo -S -u gitlab-ci pm2 stop 'SubSonics - Bot Discord'" + "stop": "ssh raphix@raphix.fr sudo -S -u gitlab-ci pm2 stop 'SubSonics - Bot Discord'", + "restart": "ssh raphix@raphix.fr sudo -S -u gitlab-ci pm2 start 'SubSonics - Bot Discord'" }, "beta_on": false } diff --git a/src/modules/discord-bot.js b/src/modules/discord-bot.js index a67bfd8..d64f85a 100644 --- a/src/modules/discord-bot.js +++ b/src/modules/discord-bot.js @@ -253,12 +253,21 @@ function startErelaManager(dlog, config) { // Emitted whenever a node connects client.manager.on("nodeConnect", node => { elog.log(`Connecté au serveur Lavalink : "${node.options.identifier}"` ) + nodeFinder.setNodeState(node.options.identifier, true) + + }) // Emitted whenever a node encountered an error client.manager.on("nodeError", (node, error) => { elog.warn(`Node "${node.options.identifier}" encountered an error: ${error.message}.`) - + + }) + + client.manager.on("nodeDisconnect", (node) => { + + nodeFinder.setNodeState(node.options.identifier, false) + }) diff --git a/src/modules/nodes-finder.js b/src/modules/nodes-finder.js index 9467a62..120fd61 100644 --- a/src/modules/nodes-finder.js +++ b/src/modules/nodes-finder.js @@ -1,9 +1,12 @@ const { __glob } = require("./global-variables") const { LogType } = require("../modules/sub-log") const fs = require("fs") +const discord = require("./discord-bot") const nlog = new LogType("Node-Finder") +const nodesState = new Map() + module.exports.getNodes = function () { nlog.step.init("find_nodes", "Récupération des nodes de la base de donnée") @@ -13,9 +16,9 @@ module.exports.getNodes = function () { var nodes_data = JSON.parse(fs.readFileSync(__glob.NODES)) const nodes_array = new Array() - for(node of nodes_data) { + for(var node of nodes_data) { nodes_array.push(node) - + nodesState.set(node.host, false) } nlog.log("Récupération de " + nodes_array.length + " nodes dans la base de donnée !") @@ -45,6 +48,48 @@ module.exports.getNodes = function () { } +module.exports.getNodesData = function () { + nlog.step.init("findu_nodes", "Récupération des nodes pour envoi d'informations!") + + if(fs.existsSync(__glob.NODES)) { + try { + + var nodes_data = JSON.parse(fs.readFileSync(__glob.NODES)) + const nodes_array = new Array() + + for(var node of nodes_data) { + node.state = nodesState.get(node.host) + nodes_array.push(node) + + } + + nlog.log("Récupération de " + nodes_array.length + " nodes pour envoi d'informations!") + nlog.step.end("findu_nodes") + return nodes_array + } catch(error) { + nlog.step.error("findu_nodes", error) + + } + } else { + + nlog.warn("Fichier de configuration introuvable !") + + try { + var nodes = {} + + + fs.writeFileSync(__glob.NODES, JSON.stringify(nodes, null, 2)) + nlog.log("Création d'un fichier de base de donnée de nodes ! Redémarrage de l'application nécéssaire !") + nlog.step.error("find_nodes", "Redémarrage requis pour lire la nouvelle base de donnée des nodes !") + process.exit(0) + } catch(error) { + nlog.step.error("find_nodes", "Tentative de création du fichier de base de donnée nodes échoué !" + error) + + } + } + +} + module.exports.addNodes = function (data) { nlog.step.init("add_nodes", "Ajout d'un nouveau noeud dans la base de donnée de nodes : " + data.host) @@ -59,6 +104,20 @@ module.exports.addNodes = function (data) { nlog.step.end("add_nodes") + const client = discord.getClient() + + if(client.manager) { + const nodesPresent = client.manager.nodes + + if(!nodesPresent.get(data.host)) { + + client.manager.createNode(data) + } + + client.manager.nodes.get(data.host).connect() + + } + } catch(error) { nlog.step.error("add_nodes", error) @@ -83,3 +142,107 @@ module.exports.addNodes = function (data) { } } +module.exports.deleteNode = function (data) { + + nlog.step.init("deleteNodes", "Supression d'un noeud dans la base de donnée de nodes : " + data.host) + + if(fs.existsSync(__glob.NODES)) { + try { + + var nodes_data = JSON.parse(fs.readFileSync(__glob.NODES)) + + var nodeIndex = -1 + + for(var node of nodes_data) { + + if(node.host == data.host) { + + nodeIndex = nodes_data.indexOf(node) + + } + + } + + + nodes_data.splice(nodeIndex, 1) + + const client = discord.getClient() + + if(client.manager) { + const nodesPresent = client.manager.nodes + + if(nodesPresent.get(data.host)) { + + client.manager.destroyNode(data.host) + } + + } + + fs.writeFileSync(__glob.NODES, JSON.stringify(nodes_data, null, 2)) + + nlog.step.end("deleteNodes") + + + } catch(error) { + nlog.step.error("deleteNodes", error) + + } + } else { + + nlog.warn("Fichier de configuration introuvable !") + + try { + var nodes = [] + + + fs.writeFileSync(__glob.NODES, JSON.stringify(nodes, null, 2)) + nlog.log("Création d'un fichier de base de donnée de nodes ! Redémarrage de l'application nécéssaire !") + nlog.step.error("deleteNodes", "Redémarrage requis pour lire la nouvelle base de donnée des nodes !") + process.exit(0) + } catch(error) { + nlog.step.error("deleteNodes", "Tentative de création du fichier de nodes échoué !" + error) + + } + } +} + +module.exports.reloadNode = function (data) { + + const client = discord.getClient() + + if(client.manager) { + const nodesPresent = client.manager.nodes + + if(nodesPresent.get(data.host)) { + + client.manager.destroyNode(data.host) + } + nlog.log("Redémarrage de la node : " + data.host) + + client.manager.createNode(data) + client.manager.nodes.get(data.host).connect() + + } + +} + + + + +/** + * Ajout de l'état des nodes + * @param {string} node + * @param {boolean} state + */ + +module.exports.setNodeState = function(node, state) { + + nodesState.set(node, state) + process.emit("UPDATE_NODES") +} + +module.exports.getNodesStates = function() { + + return nodesState +} + diff --git a/src/modules/sub-web.js b/src/modules/sub-web.js index 395e896..cfc81db 100644 --- a/src/modules/sub-web.js +++ b/src/modules/sub-web.js @@ -5,9 +5,10 @@ const log = require("./sub-log"); const auth = require("./sub-auth"); const cook = require("cookie") const wlog = new LogType("Web") -const subplayer = require(__glob.SUBPLAYER); +const subplayer = require('./sub-player'); const { List } = require("./sub-list") const subplaylist = require("./sub-playlist") +const nodesfinder = require("./nodes-finder") var fs = require("fs") var path = require("path") @@ -140,6 +141,19 @@ function IOConnection(io) { const alog = log.getInstance("Authentification") + process.on("UPDATE_NODES", () => { + + if(io) { + + const data = nodesfinder.getNodesData() + + io.sockets.emit("ALWAYS/NODES", data) + } + + + + }) + process.on("MUSIC_UPDATE_STATE", () => { const data = subplayer.updateMusicState() @@ -317,6 +331,14 @@ function IOConnection(io) { }) + GetRequest(io, socket, "NODES", () => { + + process.emit("UPDATE_NODES") + + + }) + + @@ -336,8 +358,100 @@ function IOConnection(io) { }) + + // SEND REQUEST + socket.on("SEND/NODES/ADD", (data) => { + + + var cookies = socket.handshake.headers.cookie + + if(cookies) { + + cookies = cook.parse(cookies) + var token = cookies.token + + const user = auth.getUser(token) + + + if(user.admin == true) { + + nodesfinder.addNodes(data) + + socket.emit("ANSWER/SEND/NODES/ADD", "OK") + process.emit("UPDATE_NODES") + } + + } else { + io.emit("ANSWER/SEND/USERS/ADD", {"error":"TOKEN_NOT_FINDED"}) + + } + + + + }) + + socket.on("SEND/NODES/DELETE", (data) => { + + + var cookies = socket.handshake.headers.cookie + + if(cookies) { + + cookies = cook.parse(cookies) + var token = cookies.token + + const user = auth.getUser(token) + + + if(user.admin == true) { + + nodesfinder.deleteNode(data) + + socket.emit("ANSWER/SEND/NODES/DELETE", "OK") + process.emit("UPDATE_NODES") + } + + } else { + io.emit("ANSWER/SEND/USERS/ADMIN", {"error":"TOKEN_NOT_FINDED"}) + + } + + + + }) + + socket.on("SEND/NODES/RELOAD", (data) => { + + + var cookies = socket.handshake.headers.cookie + + if(cookies) { + + cookies = cook.parse(cookies) + var token = cookies.token + + const user = auth.getUser(token) + + + if(user.admin == true) { + + nodesfinder.reloadNode(data) + + socket.emit("ANSWER/SEND/NODES/RELOAD", "OK") + process.emit("UPDATE_NODES") + } + + } else { + io.emit("ANSWER/SEND/NODES/RELOAD", {"error":"TOKEN_NOT_FINDED"}) + + } + + + + }) + socket.on("SEND/USERS/ADMIN", (data) => { diff --git a/src/web/public/javascript/__settings_script.js b/src/web/public/javascript/__settings_script.js index 899323f..774519e 100644 --- a/src/web/public/javascript/__settings_script.js +++ b/src/web/public/javascript/__settings_script.js @@ -1,3 +1,5 @@ +var wasOnNodes = false + settingsBtn.addEventListener("click", () => { mainView.innerHTML = ` @@ -22,15 +24,17 @@ settingsBtn.addEventListener("click", () => { settings_logs.addEventListener("click", () => { loadLogs() + wasOnNodes = false }) settings_connexion.addEventListener("click", () => { loadConnexion() + wasOnNodes = true }) settings_users.addEventListener("click", () => { loadUsers() - + wasOnNodes = false }) settings_logs.style.color = "white" @@ -38,19 +42,13 @@ settingsBtn.addEventListener("click", () => { function loadUsers() { socket.emit("GET/USERS") - - - - - + } function loadLogs() { settings_content.innerHTML = `
@@ -144,9 +142,9 @@ settingsBtn.addEventListener("click", () => { } function loadConnexion() { - settings_content.innerHTML = ` -

Connexions

- ` + + + socket.emit("GET/NODES") } @@ -168,8 +166,6 @@ settingsBtn.addEventListener("click", () => { }) - - socket.on("ALWAYS/USERS",(data) => { const settings_content = document.getElementById("settings_content") @@ -236,4 +232,210 @@ socket.on("ALWAYS/USERS",(data) => { +}) + +socket.on("ALWAYS/NODES",(data) => { + + /*settings_content.innerHTML = ` +
+ +
+
+
+
+ +

lava2.horizxon.studio

+

Connecté

+
+
+ + +
+ +
+
+
+ +

lava2.horizxon.studio

+

Connecté

+
+
+ + +
+ +
+
+
+ +

lava2.horizxon.studio

+

Déconnecté

+
+
+ + +
+ +
+
+
+ +

lava2.horizxon.studio

+

Déconnecté

+
+
+ + +
+ +
+ + `*/ + + const settings_content = document.getElementById("settings_content") + + if(settings_content && wasOnNodes) { + + var dataToPush = new Array() + + dataToPush.push(`
+

`) + + dataToPush.push(` + +
+

Ajout d'une connexion Lavalink

+ +
+

+ +
+

Host

+ +

Port

+ +

Mot de passe

+ + +
+
+ + + `) + + console.log(data) + + for(var node of data) { + + var stateInput = "

Déconnecté

" + + if(node.state == true) { + + stateInput = "

Connecté

" + } + + dataToPush.push(` +
+
+ +

${node.host}

+ ${stateInput} +
+
+ + +
+
`) + + } + + settings_content.innerHTML = dataToPush.join("") + + const an_dialog = document.getElementById("an_dialog") + const an_close = document.getElementById("an_close") + const an_add = document.getElementById("an_add") + const an_host = document.getElementById("an_host") + const an_port = document.getElementById("an_port") + const an_password = document.getElementById("an_password") + const an_send = document.getElementById("an_send") + const an_info = document.getElementById("an_info") + + an_add.addEventListener("click", () => { + an_info.innerHTML = "" + an_dialog.showModal() + }) + + an_close.addEventListener("click", () => { + an_info.innerHTML = "" + an_dialog.close() + }) + + an_send.addEventListener("click", () => { + an_info.innerHTML = "" + + + if(an_host.value != '' && an_port.value != '' && an_password.value != '' ) { + + + var data = { + "host":an_host.value.replace(" ", ""), + 'port': parseInt(an_port.value), + "password": an_password.value, + "retryAmount": 1 + } + + send("NODES/ADD", data) + + an_dialog.close() + + } else { + + + an_info.innerHTML = "Remplissez toutes les cases !" + } + + + + }) + + for(var node of data) { + + let reloadBtn = document.getElementById(data.indexOf(node) + "_reload") + let deleteBtn = document.getElementById(data.indexOf(node) + "_delete") + + reloadBtn.addEventListener("click", () => { + send("NODES/RELOAD", data[reloadBtn.id.replace("_reload", "")]) + + }) + + deleteBtn.addEventListener("click", () => { + console.log(deleteBtn) + console.log(data[reloadBtn.id.replace("_reload", "")]) + send("NODES/DELETE", data[reloadBtn.id.replace("_reload", "")]) + + }) + + } + + + + + + + } + + + + + }) \ No newline at end of file diff --git a/src/web/public/stylesheets/style.css b/src/web/public/stylesheets/style.css index 6f6f363..a4a4418 100644 --- a/src/web/public/stylesheets/style.css +++ b/src/web/public/stylesheets/style.css @@ -1070,7 +1070,63 @@ p { .set_user_info img { - width: 3.5vw; + width: 3vw; margin-right: 10%; -} \ No newline at end of file +} + +.connexion_div { + + display: flex; + justify-content: space-between; + align-items: center; + width: 100%; + text-align: center; +} + +.connexion_info { + + display: flex; + width: 20%; + gap: 5%; + align-items: center; +} + +.connexion_title { + display: flex; + justify-content: center; + align-items: center; +} + +.connexion_logo { + + font-size: 200%; +} + + + +.connexion_logo_on { + + display: flex; + justify-content: center; + align-items: center; + font-family: 'Gunship', sans-serif; + font-size: 10px; + border-radius: 10px; + background-color: #287e00; + height: 10%; + padding: 2%; +} + +.connexion_logo_off { + + display: flex; + justify-content: center; + align-items: center; + font-family: 'Gunship', sans-serif; + font-size: 10px; + border-radius: 10px; + background-color: #7e0000; + height: 10%; + padding: 2%; +}