Version 0.7.3 - Ajout de la modification des nodes

This commit is contained in:
CICD - Pipeline 2023-09-06 20:27:36 +02:00
parent 8e167da16f
commit b0e61fc7f8
8 changed files with 609 additions and 23 deletions

View File

@ -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
}
]

View File

@ -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"
}
]
}

View File

@ -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
}

View File

@ -253,6 +253,9 @@ 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
@ -261,6 +264,12 @@ function startErelaManager(dlog, config) {
})
client.manager.on("nodeDisconnect", (node) => {
nodeFinder.setNodeState(node.options.identifier, false)
})
// THIS IS REQUIRED. Send raw events to Erela.js
client.on("raw", d => client.manager.updateVoiceState(d));

View File

@ -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
}

View File

@ -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) => {

View File

@ -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"
@ -39,18 +43,12 @@ settingsBtn.addEventListener("click", () => {
socket.emit("GET/USERS")
}
function loadLogs() {
settings_content.innerHTML = `
<select id="logs_selection">
<option>Test</option>
<option>Test</option>
<option>Test</option>
<option>NOT CONNECTED</option>
</select>
</div>
<div id="logs_content" class="logs_content">
@ -144,9 +142,9 @@ settingsBtn.addEventListener("click", () => {
}
function loadConnexion() {
settings_content.innerHTML = `
<p>Connexions</p>
`
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 = `
<div style='width: 100%; text-align: right;'>
<button class='primary'><i class='fa fa-plus'></i></button>
</div>
<hr>
<div class='connexion_div'>
<div class='connexion_info'>
<div class='connexion_logo'>
<i class='fa fa-wifi'></i>
</div>
<p class='connexion_title'>lava2.horizxon.studio</p>
<p class='connexion_logo_on'>Connecté</p>
</div>
<div>
<button class='list_upSong'><i class="fa-solid fa-rotate-right"></i></button>
<button class='list_delete'><i class='fa fa-trash'></i></button>
</div>
</div>
<div class='connexion_div'>
<div class='connexion_info'>
<div class='connexion_logo'>
<i class='fa fa-wifi'></i>
</div>
<p class='connexion_title'>lava2.horizxon.studio</p>
<p class='connexion_logo_on'>Connecté</p>
</div>
<div>
<button class='list_upSong'><i class="fa-solid fa-rotate-right"></i></button>
<button class='list_delete'><i class='fa fa-trash'></i></button>
</div>
</div>
<div class='connexion_div'>
<div class='connexion_info'>
<div class='connexion_logo'>
<i class='fa fa-wifi'></i>
</div>
<p class='connexion_title'>lava2.horizxon.studio</p>
<p class='connexion_logo_off'>Déconnecté</p>
</div>
<div>
<button class='list_upSong'><i class="fa-solid fa-rotate-right"></i></button>
<button class='list_delete'><i class='fa fa-trash'></i></button>
</div>
</div>
<div class='connexion_div'>
<div class='connexion_info'>
<div class='connexion_logo'>
<i class='fa fa-wifi'></i>
</div>
<p class='connexion_title'>lava2.horizxon.studio</p>
<p class='connexion_logo_off'>Déconnecté</p>
</div>
<div>
<button class='list_upSong'><i class="fa-solid fa-rotate-right"></i></button>
<button class='list_delete'><i class='fa fa-trash'></i></button>
</div>
</div>
`*/
const settings_content = document.getElementById("settings_content")
if(settings_content && wasOnNodes) {
var dataToPush = new Array()
dataToPush.push(`<div style='width: 100%; text-align: right;'>
<button id='an_add' class='primary'><i class='fa fa-plus'></i></button></div><hr>`)
dataToPush.push(`
<dialog class="report_dialog" id="an_dialog">
<div class="rlineclose">
<p class="rtitle"><i class="fa fa-wifi"></i> Ajout d'une connexion Lavalink</p>
<button id="an_close" class="report_close"><i class="fa-solid fa-xmark"></i></button>
</div>
<p id='an_info' style='text-align: center; color: red;'></p>
<div class="rcontent">
<p class="runder">Host</p>
<input type='text' id="an_host">
<p class="runder">Port</p>
<input type='number' id="an_port">
<p class="runder">Mot de passe</p>
<input type='text' id="an_password">
<button id="an_send" class="rsend"><i class="fa-solid fa-plus"></i> Ajouter</button>
</div>
</dialog>
`)
console.log(data)
for(var node of data) {
var stateInput = "<p class='connexion_logo_off'>Déconnecté</p>"
if(node.state == true) {
stateInput = "<p class='connexion_logo_on'>Connecté</p>"
}
dataToPush.push(`
<div class='connexion_div'>
<div class='connexion_info'>
<div class='connexion_logo'>
<i class='fa fa-wifi'></i>
</div>
<p class='connexion_title'>${node.host}</p>
${stateInput}
</div>
<div>
<button id='${data.indexOf(node)}_reload' class='list_upSong'><i class="fa-solid fa-rotate-right"></i></button>
<button id='${data.indexOf(node)}_delete' class='list_delete'><i class='fa fa-trash'></i></button>
</div>
</div>`)
}
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", "")])
})
}
}
})

View File

@ -1070,7 +1070,63 @@ p {
.set_user_info img {
width: 3.5vw;
width: 3vw;
margin-right: 10%;
}
.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%;
}