Version 0.3.0 - Ajout de l'interface Web - First Steps to it
This commit is contained in:
		
							
								
								
									
										1
									
								
								data/betas.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								data/betas.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
["486943594893017119","442290526545510421"]
 | 
			
		||||
							
								
								
									
										16
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										16
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							@@ -6,7 +6,7 @@
 | 
			
		||||
  "packages": {
 | 
			
		||||
    "": {
 | 
			
		||||
      "name": "subsonics-web",
 | 
			
		||||
      "version": "0.2.2",
 | 
			
		||||
      "version": "0.2.3",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "cookie": "^0.5.0",
 | 
			
		||||
        "cookie-parser": "^1.4.6",
 | 
			
		||||
@@ -14,6 +14,7 @@
 | 
			
		||||
        "ejs": "^3.1.9",
 | 
			
		||||
        "erela.js": "^2.4.0",
 | 
			
		||||
        "express": "^4.18.2",
 | 
			
		||||
        "express-favicon": "^2.0.4",
 | 
			
		||||
        "nodemon": "^2.0.22",
 | 
			
		||||
        "socket.io": "^4.6.1",
 | 
			
		||||
        "uuid": "^9.0.0",
 | 
			
		||||
@@ -704,6 +705,14 @@
 | 
			
		||||
        "node": ">= 0.10.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/express-favicon": {
 | 
			
		||||
      "version": "2.0.4",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/express-favicon/-/express-favicon-2.0.4.tgz",
 | 
			
		||||
      "integrity": "sha512-JDGzumJdwF+WcJf+qwyhdpF1yzducuMCxZa+G6hxR3hor7ae/1CqpAPj8FXCGaGtqBA6ExDMfeszjuYRw5GUuQ==",
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">=4"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/fast-deep-equal": {
 | 
			
		||||
      "version": "3.1.3",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
 | 
			
		||||
@@ -2250,6 +2259,11 @@
 | 
			
		||||
        "vary": "~1.1.2"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "express-favicon": {
 | 
			
		||||
      "version": "2.0.4",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/express-favicon/-/express-favicon-2.0.4.tgz",
 | 
			
		||||
      "integrity": "sha512-JDGzumJdwF+WcJf+qwyhdpF1yzducuMCxZa+G6hxR3hor7ae/1CqpAPj8FXCGaGtqBA6ExDMfeszjuYRw5GUuQ=="
 | 
			
		||||
    },
 | 
			
		||||
    "fast-deep-equal": {
 | 
			
		||||
      "version": "3.1.3",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
{
 | 
			
		||||
  "name": "subsonics-web",
 | 
			
		||||
  "author": "Raphix",
 | 
			
		||||
  "version": "0.2.3",
 | 
			
		||||
  "version": "0.3.0",
 | 
			
		||||
  "nodemonConfig": {
 | 
			
		||||
    "ext": "js, html",
 | 
			
		||||
    "ignore": [
 | 
			
		||||
@@ -18,6 +18,7 @@
 | 
			
		||||
    "ejs": "^3.1.9",
 | 
			
		||||
    "erela.js": "^2.4.0",
 | 
			
		||||
    "express": "^4.18.2",
 | 
			
		||||
    "express-favicon": "^2.0.4",
 | 
			
		||||
    "nodemon": "^2.0.22",
 | 
			
		||||
    "socket.io": "^4.6.1",
 | 
			
		||||
    "uuid": "^9.0.0",
 | 
			
		||||
@@ -26,5 +27,6 @@
 | 
			
		||||
  "scripts": {
 | 
			
		||||
    "start": "nodemon src/main.js",
 | 
			
		||||
    "dev": "set DEV=true& nodemon src/main.js"
 | 
			
		||||
  }
 | 
			
		||||
  },
 | 
			
		||||
  "beta_on": true
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -6,6 +6,7 @@ const { __glob } = require("./global-variables")
 | 
			
		||||
const { LogType } = require("../modules/sub-log")
 | 
			
		||||
const { List } = require("./sub-list")
 | 
			
		||||
const nodeFinder = require("./nodes-finder")
 | 
			
		||||
const subplayer = require("./sub-player")
 | 
			
		||||
 | 
			
		||||
const client = new Client({
 | 
			
		||||
    intents:[GatewayIntentBits.Guilds, GatewayIntentBits.GuildVoiceStates, GatewayIntentBits.GuildMembers],
 | 
			
		||||
@@ -13,6 +14,11 @@ const client = new Client({
 | 
			
		||||
 | 
			
		||||
const membersVoices = new Map()
 | 
			
		||||
 | 
			
		||||
module.exports.getClient = function () {
 | 
			
		||||
 | 
			
		||||
    return client
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
module.exports.DiscordBot = class {
 | 
			
		||||
 | 
			
		||||
    constructor(config, dlog) {
 | 
			
		||||
@@ -192,6 +198,9 @@ function startErelaManager(dlog, config) {
 | 
			
		||||
        client.channels.fetch(player.options.voiceChannel).then(channel => {
 | 
			
		||||
            plog.log("Nouveau Player instancié dans : " + channel.name)
 | 
			
		||||
        })
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        process.emit("MUSIC_UPDATE_STATE")
 | 
			
		||||
   
 | 
			
		||||
    })
 | 
			
		||||
 | 
			
		||||
@@ -201,13 +210,16 @@ function startErelaManager(dlog, config) {
 | 
			
		||||
        client.channels.fetch(player.options.voiceChannel).then(channel => {
 | 
			
		||||
            plog.log("Player supprimé dans : " + channel.name)
 | 
			
		||||
        })
 | 
			
		||||
       
 | 
			
		||||
 
 | 
			
		||||
        process.emit("MUSIC_UPDATE_STATE")
 | 
			
		||||
 | 
			
		||||
    })
 | 
			
		||||
 | 
			
		||||
    client.manager.on("trackStart", (song) => {
 | 
			
		||||
        plog.log("Lecture de '" + song.queue.current.title + "' de '" + song.queue.current.author + "'")
 | 
			
		||||
        list.setCurrent(song)
 | 
			
		||||
 | 
			
		||||
        process.emit("MUSIC_UPDATE_STATE")
 | 
			
		||||
    })
 | 
			
		||||
 | 
			
		||||
    
 | 
			
		||||
@@ -222,6 +234,9 @@ function startErelaManager(dlog, config) {
 | 
			
		||||
            }
 | 
			
		||||
         
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        process.emit("MUSIC_UPDATE_STATE")
 | 
			
		||||
    })
 | 
			
		||||
 | 
			
		||||
    // Emitted whenever a node connects
 | 
			
		||||
@@ -235,6 +250,7 @@ function startErelaManager(dlog, config) {
 | 
			
		||||
       
 | 
			
		||||
    })
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    // THIS IS REQUIRED. Send raw events to Erela.js
 | 
			
		||||
    client.on("raw", d => client.manager.updateVoiceState(d));
 | 
			
		||||
}
 | 
			
		||||
@@ -5,12 +5,14 @@ const root = path.resolve(__dirname, '../../')
 | 
			
		||||
const __glob = {
 | 
			
		||||
    CONFIG:  root + path.sep + "data" + path.sep + "config.json",
 | 
			
		||||
    USERS:  root + path.sep + "data" + path.sep + "users.json",
 | 
			
		||||
    BETA_USERS:  root + path.sep + "data" + path.sep + "betas.json",
 | 
			
		||||
    ROOT: root,
 | 
			
		||||
    WEB_DIR: root + path.sep + "src" + path.sep + "web",
 | 
			
		||||
    COMMANDS: root + path.sep + "src" + path.sep + "commands",
 | 
			
		||||
    SUBLOG: root + path.sep + "src" + path.sep + "modules" + path.sep + "sub-log.js",
 | 
			
		||||
    SUBPLAYER: root + path.sep + "src" + path.sep + "modules" + path.sep + "sub-player.js",
 | 
			
		||||
    SUBLIST: root + path.sep + "src" + path.sep + "modules" + path.sep + "sub-list.js",
 | 
			
		||||
    DISCORDBOT: root + path.sep + "src" + path.sep + "modules" + path.sep + "discord-bot.js",
 | 
			
		||||
    PACKAGE: root + path.sep + "package.json",
 | 
			
		||||
    DATA:  root + path.sep + "data" + path.sep,
 | 
			
		||||
    NODES:  root + path.sep + "data" + path.sep + "nodes.json",
 | 
			
		||||
@@ -21,7 +23,8 @@ const __web = {
 | 
			
		||||
 | 
			
		||||
    ROUTER: webroot + "routes" + path.sep,
 | 
			
		||||
    PUBLIC: webroot + "public",
 | 
			
		||||
    TEMPLATES: webroot + "templates"
 | 
			
		||||
    TEMPLATES: webroot + "templates",  
 | 
			
		||||
    ICON: webroot + "public" + path.sep + "images" + path.sep + "logo.ico"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
module.exports = { __glob, __web };
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
const { resolve } = require("path");
 | 
			
		||||
const { __glob } = require("../modules/global-variables");
 | 
			
		||||
const { __glob, __web } = require("../modules/global-variables");
 | 
			
		||||
const { LogType } = require('./sub-log');
 | 
			
		||||
const fs = require("fs")
 | 
			
		||||
 | 
			
		||||
@@ -7,6 +7,9 @@ const alog = new LogType("Authentification")
 | 
			
		||||
 | 
			
		||||
var users = new Map()
 | 
			
		||||
var sessions = new Array()
 | 
			
		||||
var betausers = new Array()
 | 
			
		||||
 | 
			
		||||
var packageJson = JSON.parse(fs.readFileSync(__glob.PACKAGE))
 | 
			
		||||
 | 
			
		||||
updateUsers()
 | 
			
		||||
 | 
			
		||||
@@ -78,11 +81,31 @@ module.exports.getDiscordUser = function (code, session) {
 | 
			
		||||
                        reject("MIGRATE_ACCOUNT_ONLY")
 | 
			
		||||
 | 
			
		||||
                    } else {
 | 
			
		||||
                        user.auth = authorizationKey
 | 
			
		||||
                        Object.assign(user, userInfo)
 | 
			
		||||
 | 
			
		||||
                        if(packageJson.beta_on == false) {
 | 
			
		||||
                            user.auth = authorizationKey
 | 
			
		||||
                            Object.assign(user, userInfo)
 | 
			
		||||
        
 | 
			
		||||
        
 | 
			
		||||
                            resolve(user)
 | 
			
		||||
 | 
			
		||||
                        } else {
 | 
			
		||||
 | 
			
		||||
                            if(betausers.includes(userInfo.user.id)) {
 | 
			
		||||
 | 
			
		||||
                                user.beta = true
 | 
			
		||||
                                Object.assign(user, userInfo)
 | 
			
		||||
                                
 | 
			
		||||
        
 | 
			
		||||
                                resolve(user)
 | 
			
		||||
    
 | 
			
		||||
    
 | 
			
		||||
                        resolve(user)
 | 
			
		||||
                            } else {
 | 
			
		||||
 | 
			
		||||
                                reject("NOT_IN_BETA")
 | 
			
		||||
                            }
 | 
			
		||||
 | 
			
		||||
                        }
 | 
			
		||||
                        
 | 
			
		||||
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
@@ -172,18 +195,31 @@ module.exports.removeUser = function (token) {
 | 
			
		||||
 | 
			
		||||
function updateUsers() {
 | 
			
		||||
 | 
			
		||||
    
 | 
			
		||||
    if(!fs.existsSync(__glob.BETA_USERS)){
 | 
			
		||||
 | 
			
		||||
        fs.writeFileSync(__glob.BETA_USERS, '[]')
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if(!fs.existsSync(__glob.USERS)){
 | 
			
		||||
 | 
			
		||||
        fs.writeFileSync(__glob.USERS, '[]')
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    const userDB = JSON.parse(fs.readFileSync(__glob.USERS))
 | 
			
		||||
    const betausersDB = JSON.parse(fs.readFileSync(__glob.BETA_USERS))
 | 
			
		||||
 | 
			
		||||
    for (const user of userDB) {
 | 
			
		||||
        
 | 
			
		||||
        users.set(user.token, user)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    for (const id of betausersDB) {
 | 
			
		||||
        
 | 
			
		||||
        betausers.push(id)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    alog.log("Actualisation de " + userDB.length + " utilisateurs depuis : " + __glob.USERS)
 | 
			
		||||
    alog.log("Actualisation de " + betausersDB.length + " utilisateurs bêtas depuis : " + __glob.BETA_USERS)
 | 
			
		||||
}
 | 
			
		||||
@@ -14,6 +14,11 @@ module.exports.List = class {
 | 
			
		||||
        
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    getList() {
 | 
			
		||||
 | 
			
		||||
        return next
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    destroy() {
 | 
			
		||||
 | 
			
		||||
        next = new Array()
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,9 @@ const { SlashCommandBuilder, EmbedBuilder, DefaultWebSocketManagerOptions } = re
 | 
			
		||||
const { __glob } = require("../modules/global-variables");
 | 
			
		||||
const { LogType } = require("./sub-log");
 | 
			
		||||
const { List } = require("./sub-list")
 | 
			
		||||
var ytfps = require("ytfps")
 | 
			
		||||
const discord = require("./discord-bot")
 | 
			
		||||
var ytfps = require("ytfps");
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
const list = new List()
 | 
			
		||||
 | 
			
		||||
@@ -70,7 +72,8 @@ module.exports.play = async function (client, interaction) {
 | 
			
		||||
            // [A FINIR POUR WEB]
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
    process.emit("MUSIC_UPDATE_STATE")
 | 
			
		||||
        
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -116,9 +119,29 @@ module.exports.pause = function (client, interaction) {
 | 
			
		||||
 | 
			
		||||
    } else {
 | 
			
		||||
 | 
			
		||||
        // [A FINIR POUR WEB]
 | 
			
		||||
        if(!client) {
 | 
			
		||||
 | 
			
		||||
            client = discord.getClient()
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        let player = client.manager.players.get("137291455336022018")
 | 
			
		||||
 | 
			
		||||
        if(player) {
 | 
			
		||||
 | 
			
		||||
            if(player.playing) {
 | 
			
		||||
                player.pause(true)
 | 
			
		||||
            } else {
 | 
			
		||||
 | 
			
		||||
                player.pause(false)
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    process.emit("MUSIC_UPDATE_STATE")
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
module.exports.getState = function(client, interaction) {
 | 
			
		||||
@@ -149,6 +172,7 @@ module.exports.getState = function(client, interaction) {
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
   
 | 
			
		||||
        
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -193,12 +217,41 @@ module.exports.skip = function (client, interaction) {
 | 
			
		||||
        
 | 
			
		||||
    } else {
 | 
			
		||||
 | 
			
		||||
        // [A FINIR POUR WEB]
 | 
			
		||||
        if(!client) {
 | 
			
		||||
 | 
			
		||||
            client = discord.getClient()
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        let player = client.manager.players.get("137291455336022018")
 | 
			
		||||
 | 
			
		||||
        if(list.haveSongs()) {
 | 
			
		||||
            player.stop()
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
       
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    process.emit("MUSIC_UPDATE_STATE")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
module.exports.seek = function (data) {
 | 
			
		||||
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
    client = discord.getClient()
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    let player = client.manager.players.get("137291455336022018")
 | 
			
		||||
 | 
			
		||||
    player.seek(data)
 | 
			
		||||
 | 
			
		||||
    process.emit("MUSIC_UPDATE_STATE")
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
module.exports.previous = function (client, interaction) {
 | 
			
		||||
 | 
			
		||||
    if(interaction) {
 | 
			
		||||
@@ -238,8 +291,91 @@ module.exports.previous = function (client, interaction) {
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    } else {
 | 
			
		||||
 | 
			
		||||
        if(!client) {
 | 
			
		||||
 | 
			
		||||
            client = discord.getClient()
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        let player = client.manager.players.get("137291455336022018")
 | 
			
		||||
 | 
			
		||||
        if(list.havePreviousSongs()){
 | 
			
		||||
            list.__next_add(player.queue.current)
 | 
			
		||||
            player.play(list.previous())
 | 
			
		||||
        } 
 | 
			
		||||
 | 
			
		||||
       
 | 
			
		||||
    }
 | 
			
		||||
    process.emit("MUSIC_UPDATE_STATE")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const clog = new LogType("Actualisation")
 | 
			
		||||
 | 
			
		||||
module.exports.updateMusicState = function (client, action) {
 | 
			
		||||
 | 
			
		||||
    if(!client) {
 | 
			
		||||
 | 
			
		||||
        client = discord.getClient()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    let player = client.manager.players.get("137291455336022018")
 | 
			
		||||
    var currentTitle = "null"
 | 
			
		||||
 | 
			
		||||
    const data = {
 | 
			
		||||
        "playing": 0,
 | 
			
		||||
        "current":null,
 | 
			
		||||
        "isOnline": false,
 | 
			
		||||
        "queue": null,
 | 
			
		||||
        "loop": false,
 | 
			
		||||
        "durationNow": null,
 | 
			
		||||
        "durationAll": null,
 | 
			
		||||
        "volume": null
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if(player) {
 | 
			
		||||
 | 
			
		||||
        data["current"] = player.queue.current
 | 
			
		||||
  
 | 
			
		||||
        if(player.queueRepeat == true) {
 | 
			
		||||
 | 
			
		||||
            data["loop"] = true
 | 
			
		||||
        } 
 | 
			
		||||
 | 
			
		||||
        data["volume"] = player.volume * 10
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
        if(player.queue.current) {
 | 
			
		||||
            data["durationNow"] = player.position
 | 
			
		||||
            data["durationAll"] = player.queue.current.duration
 | 
			
		||||
            currentTitle = player.queue.current.title
 | 
			
		||||
        } 
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
        if(player.playing == true && player.paused == false) {
 | 
			
		||||
 | 
			
		||||
            data["playing"] = 1
 | 
			
		||||
        } else {
 | 
			
		||||
            data["playing"] = 0
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        data["queue"] = list.getList();
 | 
			
		||||
        data["isOnline"] = true
 | 
			
		||||
       
 | 
			
		||||
    }  
 | 
			
		||||
 | 
			
		||||
    
 | 
			
		||||
    if(action == "end") {
 | 
			
		||||
 | 
			
		||||
        data["current"] = null;
 | 
			
		||||
        data["isOnline"] = false
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    clog.log("Actualisation de tous les clients - Titre : " + currentTitle)
 | 
			
		||||
    return data
 | 
			
		||||
 | 
			
		||||
    
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// FINI
 | 
			
		||||
@@ -284,7 +420,9 @@ module.exports.leave = function (client, interaction) {
 | 
			
		||||
       
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    process.emit("MUSIC_UPDATE_STATE")
 | 
			
		||||
 | 
			
		||||
    
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -5,7 +5,7 @@ const log = require("./sub-log");
 | 
			
		||||
const auth = require("./sub-auth");
 | 
			
		||||
const cook = require("cookie")
 | 
			
		||||
const wlog = new LogType("Web")
 | 
			
		||||
 | 
			
		||||
const subplayer = require(__glob.SUBPLAYER);
 | 
			
		||||
module.exports.WebServer = class {
 | 
			
		||||
 | 
			
		||||
    constructor() {
 | 
			
		||||
@@ -23,6 +23,7 @@ function init() {
 | 
			
		||||
    const path = require('path');
 | 
			
		||||
    const cookieParser = require('cookie-parser');
 | 
			
		||||
    const http = require("http");
 | 
			
		||||
    const favicon = require('express-favicon');
 | 
			
		||||
 | 
			
		||||
    const app = express();
 | 
			
		||||
 | 
			
		||||
@@ -49,7 +50,7 @@ function init() {
 | 
			
		||||
    app.use('/', indexRouter);
 | 
			
		||||
    app.use('/login', loginRouter);
 | 
			
		||||
    app.use("/internal", internalRouter)
 | 
			
		||||
 | 
			
		||||
    app.use(favicon(__web.ICON));
 | 
			
		||||
 | 
			
		||||
    app.use(function (req, res, next) {
 | 
			
		||||
        next(createError(404));
 | 
			
		||||
@@ -134,15 +135,26 @@ function IOConnection(io) {
 | 
			
		||||
 | 
			
		||||
    const alog = log.getInstance("Authentification")
 | 
			
		||||
 | 
			
		||||
    process.on("MUSIC_UPDATE_STATE", () => {
 | 
			
		||||
    
 | 
			
		||||
        const data = subplayer.updateMusicState()
 | 
			
		||||
    
 | 
			
		||||
        io.sockets.emit("/ALWAYS/MUSIC_STATE", data)
 | 
			
		||||
    
 | 
			
		||||
    })
 | 
			
		||||
 | 
			
		||||
    io.on("connection", (socket) => {
 | 
			
		||||
 | 
			
		||||
        wlog.log("[SOCKET] - Nouvelle session : " + socket.id)
 | 
			
		||||
 | 
			
		||||
        socket.on("disconnect", () => {
 | 
			
		||||
 | 
			
		||||
           
 | 
			
		||||
            wlog.log("[SOCKET] - Fin de session : " + socket.id)
 | 
			
		||||
            
 | 
			
		||||
        })
 | 
			
		||||
 | 
			
		||||
        // SPECIAL
 | 
			
		||||
 | 
			
		||||
        socket.on("GET/DISCORD_LOGIN_LINK", () => {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -160,8 +172,54 @@ function IOConnection(io) {
 | 
			
		||||
            io.emit("ANSWER/GET/DISCORD_LOGIN_LINK", discordlink )
 | 
			
		||||
        })
 | 
			
		||||
 | 
			
		||||
        GetRequest(socket, "USER_INFO", () => {  
 | 
			
		||||
            var cookies = socket.handshake.headers.cookie
 | 
			
		||||
            cookies = cook.parse(cookies)
 | 
			
		||||
            var token = cookies.token
 | 
			
		||||
            
 | 
			
		||||
 | 
			
		||||
        socket.on("GET/USER_INFO", () => {
 | 
			
		||||
            const user = auth.getUser(token)
 | 
			
		||||
            alog.log("Envoi des informations Discord de '" + user.user.username + "' à '" + socket.id + "'" )
 | 
			
		||||
            socket.emit("ANSWER/GET/USER_INFO",user)
 | 
			
		||||
        })
 | 
			
		||||
 | 
			
		||||
        GetRequest(socket, "MUSIC_STATE", () => {  
 | 
			
		||||
            var cookies = socket.handshake.headers.cookie
 | 
			
		||||
            cookies = cook.parse(cookies)
 | 
			
		||||
            var token = cookies.token
 | 
			
		||||
            
 | 
			
		||||
 | 
			
		||||
            const data = subplayer.updateMusicState()
 | 
			
		||||
            const user = auth.getUser(token)
 | 
			
		||||
            socket.emit("ANSWER/GET/MUSIC_STATE", "Bienvenue " + user.user.username + " ! ")
 | 
			
		||||
            io.sockets.emit("/ALWAYS/MUSIC_STATE", data)
 | 
			
		||||
        })
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        GetRequest(socket, "PAUSE", () => {
 | 
			
		||||
            
 | 
			
		||||
            subplayer.pause()
 | 
			
		||||
            io.emit("ANSWER/GET/PAUSE", "OK")
 | 
			
		||||
        })
 | 
			
		||||
 | 
			
		||||
        
 | 
			
		||||
        GetRequest(socket, "BACKWARD", () => {
 | 
			
		||||
 | 
			
		||||
            subplayer.previous()
 | 
			
		||||
            io.emit("ANSWER/GET/BACKWARD", "OK")
 | 
			
		||||
        })
 | 
			
		||||
        
 | 
			
		||||
        GetRequest(socket, "FORWARD", () => {
 | 
			
		||||
 | 
			
		||||
            subplayer.skip()
 | 
			
		||||
            io.emit("ANSWER/GET/FORWARD", "OK")
 | 
			
		||||
        })
 | 
			
		||||
 | 
			
		||||
        // SEND REQUEST
 | 
			
		||||
 | 
			
		||||
        socket.on("SEND/SEEK", (data) => {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
            var cookies = socket.handshake.headers.cookie
 | 
			
		||||
@@ -173,24 +231,67 @@ function IOConnection(io) {
 | 
			
		||||
                 
 | 
			
		||||
                if(auth.checkUser(token)) {
 | 
			
		||||
 | 
			
		||||
                    const user = auth.getUser(token)
 | 
			
		||||
                    alog.log("Envoi des informations Discord de '" + user.user.username + "' à '" + socket.id + "'" )
 | 
			
		||||
                    socket.emit("ANSWER/GET/USER_INFO",user)
 | 
			
		||||
                    subplayer.seek(data)
 | 
			
		||||
                
 | 
			
		||||
                } else {
 | 
			
		||||
 | 
			
		||||
                    io.emit("ANSWER/GET/USER_INFO", {"error":"USER_DONT_EXIST"})
 | 
			
		||||
                    io.emit("ANSWER/SEND/SEEK", {"error":"USER_DONT_EXIST"})
 | 
			
		||||
                }
 | 
			
		||||
            } else {
 | 
			
		||||
                io.emit("ANSWER/GET/USER_INFO", {"error":"TOKEN_NOT_FINDED"})
 | 
			
		||||
                io.emit("ANSWER/SEND/SEEK", {"error":"TOKEN_NOT_FINDED"})
 | 
			
		||||
 | 
			
		||||
            }
 | 
			
		||||
         
 | 
			
		||||
           
 | 
			
		||||
 | 
			
		||||
        })
 | 
			
		||||
      
 | 
			
		||||
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
       
 | 
			
		||||
        
 | 
			
		||||
    })
 | 
			
		||||
 | 
			
		||||
   
 | 
			
		||||
 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
function GetRequest (socket, name, func) {
 | 
			
		||||
 | 
			
		||||
  
 | 
			
		||||
        socket.on("GET/" + name, () => {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
            var cookies = socket.handshake.headers.cookie
 | 
			
		||||
 | 
			
		||||
            if(cookies) {
 | 
			
		||||
 | 
			
		||||
                cookies = cook.parse(cookies)
 | 
			
		||||
                var token = cookies.token
 | 
			
		||||
                 
 | 
			
		||||
                if(auth.checkUser(token)) {
 | 
			
		||||
 | 
			
		||||
                    func()
 | 
			
		||||
                
 | 
			
		||||
                } else {
 | 
			
		||||
 | 
			
		||||
                    io.emit("ANSWER/GET/" + name, {"error":"USER_DONT_EXIST"})
 | 
			
		||||
                }
 | 
			
		||||
            } else {
 | 
			
		||||
                io.emit("ANSWER/GET/" + name, {"error":"TOKEN_NOT_FINDED"})
 | 
			
		||||
 | 
			
		||||
            }
 | 
			
		||||
         
 | 
			
		||||
           
 | 
			
		||||
 | 
			
		||||
        })
 | 
			
		||||
 | 
			
		||||
    
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										3
									
								
								src/web/public/images/black-image.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								src/web/public/images/black-image.svg
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
			
		||||
<svg width="100" height="100" xmlns="http://www.w3.org/2000/svg">
 | 
			
		||||
    <rect width="100" height="100" fill="black" />
 | 
			
		||||
</svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 123 B  | 
							
								
								
									
										
											BIN
										
									
								
								src/web/public/images/discord-logo-white.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								src/web/public/images/discord-logo-white.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 32 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src/web/public/images/logo.ico
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								src/web/public/images/logo.ico
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 204 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src/web/public/images/logo.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								src/web/public/images/logo.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 62 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src/web/public/images/title.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								src/web/public/images/title.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 13 KiB  | 
@@ -15,7 +15,7 @@ function get(request) {
 | 
			
		||||
    return new Promise((resolve, reject) => {
 | 
			
		||||
 | 
			
		||||
        socket.emit("GET/" + request)
 | 
			
		||||
        console.log("Envoi de la requête : " + request)
 | 
			
		||||
        console.log("Envoi de la requête GET : " + request)
 | 
			
		||||
        
 | 
			
		||||
        socket.once("ANSWER/GET/" + request, (answer) => {
 | 
			
		||||
            
 | 
			
		||||
@@ -28,3 +28,27 @@ function get(request) {
 | 
			
		||||
    })
 | 
			
		||||
    
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function send(request, data) {
 | 
			
		||||
 | 
			
		||||
    return new Promise((resolve, reject) => {
 | 
			
		||||
 | 
			
		||||
        socket.emit("SEND/" + request, data)
 | 
			
		||||
        console.log("Envoi de la requête SEND : " + request)
 | 
			
		||||
        
 | 
			
		||||
        socket.once("ANSWER/SEND/" + request, (answer) => {
 | 
			
		||||
            
 | 
			
		||||
            console.log("Réponse pour la requête : " + request)
 | 
			
		||||
            
 | 
			
		||||
            resolve(answer)
 | 
			
		||||
                    
 | 
			
		||||
        })
 | 
			
		||||
        
 | 
			
		||||
    })
 | 
			
		||||
    
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function getSocket() {
 | 
			
		||||
 | 
			
		||||
    return socket
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,243 @@
 | 
			
		||||
const userInfoDiv = document.getElementById("userInfo")
 | 
			
		||||
const userInfoPopup = document.getElementById("userPopup")
 | 
			
		||||
const userInfoglobal = document.getElementById("userInfoglobal")
 | 
			
		||||
 | 
			
		||||
const musicTitle = document.getElementById("music_title")
 | 
			
		||||
const musicURL = document.getElementById("music_img")
 | 
			
		||||
 | 
			
		||||
const durationBar = document.getElementById("duration")
 | 
			
		||||
const durationTextAct = document.getElementById("durationTextAct")
 | 
			
		||||
const durationTextTotal = document.getElementById("durationTextTotal")
 | 
			
		||||
 | 
			
		||||
const backward = document.getElementById("backward")
 | 
			
		||||
const play = document.getElementById("play")
 | 
			
		||||
const forward = document.getElementById("forward")
 | 
			
		||||
 | 
			
		||||
const settings_dialog = document.getElementById("SETTINGS_dialog")
 | 
			
		||||
const settings_close = document.getElementById("SETTINGS_close")
 | 
			
		||||
const settingsBtn = document.getElementById("settingsBtn")
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
const userInfo = get("USER_INFO")
 | 
			
		||||
 | 
			
		||||
settingsBtn.addEventListener("click", () => {
 | 
			
		||||
 | 
			
		||||
    settings_dialog.showModal()
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
settings_close.addEventListener("click",() => {
 | 
			
		||||
 | 
			
		||||
    settings_dialog.close()
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
var durationAll = 0
 | 
			
		||||
var durationProgress = 0
 | 
			
		||||
var isPlaying = false
 | 
			
		||||
let interval;
 | 
			
		||||
 | 
			
		||||
durationBar.addEventListener("change", () => {
 | 
			
		||||
 | 
			
		||||
    send("SEEK", durationBar.value)
 | 
			
		||||
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
userInfo.then(user => {
 | 
			
		||||
 | 
			
		||||
    userInfoDiv.innerHTML = "<img src='https://cdn.discordapp.com/avatars/" + user.user.id + "/" + user.user.avatar + "'><p>" + user.user.global_name + "</p><p>" + user.user.username + "</p>"
 | 
			
		||||
    var betastar = ""
 | 
			
		||||
    
 | 
			
		||||
    if(user.beta) {
 | 
			
		||||
 | 
			
		||||
        betastar = "<p class='beta'>BETA</p>"
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    userInfoDiv.innerHTML = "<div class='INDEX_userInfo_name'><p class='INDEX_gbname'>" + user.user.global_name + "</p><p class='INDEX_usrname'>" + user.user.username + "</p></div><div class='INDEX_picture'><img src='https://cdn.discordapp.com/avatars/" + user.user.id + "/" + user.user.avatar + "'>" + betastar + "</div>"
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
userInfoDiv.addEventListener("click", () => {
 | 
			
		||||
 | 
			
		||||
    
 | 
			
		||||
    userInfoPopup.classList.add("INDEX_userPopup_Visible")
 | 
			
		||||
    userInfoPopup.classList.remove("INDEX_userPopup")
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
userInfoglobal.addEventListener("mouseleave", () => {
 | 
			
		||||
 | 
			
		||||
    userInfoPopup.classList.add("INDEX_userPopup")
 | 
			
		||||
    userInfoPopup.classList.remove("INDEX_userPopup_Visible")
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
get("MUSIC_STATE").then(data => {
 | 
			
		||||
    console.log(data)
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
play.addEventListener('click', () => {
 | 
			
		||||
 | 
			
		||||
    get("PAUSE")
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
backward.addEventListener('click', () => {
 | 
			
		||||
 | 
			
		||||
    get("BACKWARD")
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
forward.addEventListener("click", () => {
 | 
			
		||||
 | 
			
		||||
    get("FORWARD")
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
socket.on("/ALWAYS/MUSIC_STATE", (data) => {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    stopInterval()
 | 
			
		||||
    console.log(data)
 | 
			
		||||
 | 
			
		||||
    durationAll = 0
 | 
			
		||||
    durationProgress = 0
 | 
			
		||||
    isPlaying = false
 | 
			
		||||
 | 
			
		||||
    if(data.current == null) {
 | 
			
		||||
 | 
			
		||||
        musicURL.innerHTML = '<img class="showPicture" src="images/black-image.svg">'
 | 
			
		||||
        musicTitle.innerHTML = "<p>Aucun titre joué</p>"
 | 
			
		||||
    } else {
 | 
			
		||||
 | 
			
		||||
        musicURL.innerHTML = '<img class="showPicture" src="' + data.current.thumbnail + '">'
 | 
			
		||||
        musicTitle.innerHTML = "<p>" + data.current.title + "</p>"
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if(data.durationAll) {
 | 
			
		||||
        durationBar.disabled = false
 | 
			
		||||
        durationBar.classList.remove("grised")
 | 
			
		||||
        setTime()
 | 
			
		||||
       
 | 
			
		||||
        durationAll = data.durationAll
 | 
			
		||||
        durationProgress = data.durationNow
 | 
			
		||||
        durationBar.value = durationProgress
 | 
			
		||||
        setTime()
 | 
			
		||||
 | 
			
		||||
    } else {
 | 
			
		||||
 | 
			
		||||
       
 | 
			
		||||
        isPlaying = false
 | 
			
		||||
        durationAll = 0
 | 
			
		||||
        durationProgress = 0
 | 
			
		||||
        durationBar.disabled = true
 | 
			
		||||
        durationBar.classList.add("grised")
 | 
			
		||||
        durationBar.value = 0
 | 
			
		||||
        durationTextAct.innerHTML = "-:--"
 | 
			
		||||
        durationTextTotal.innerHTML = "-:--"
 | 
			
		||||
        
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    if(data.playing == 1) {
 | 
			
		||||
        play.innerHTML = '<i class="fas fa-pause"></i>'
 | 
			
		||||
        isPlaying = true
 | 
			
		||||
        startInterval()
 | 
			
		||||
    } else {
 | 
			
		||||
        
 | 
			
		||||
        play.innerHTML = '<i class="fas fa-play"></i>'
 | 
			
		||||
        isPlaying = false
 | 
			
		||||
       
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
   
 | 
			
		||||
  
 | 
			
		||||
    if(data.current && data.playing == 0) {
 | 
			
		||||
        setTime()
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
function startInterval() {
 | 
			
		||||
    interval = setInterval(() => {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        if(isPlaying == true) {
 | 
			
		||||
            setTime()
 | 
			
		||||
    
 | 
			
		||||
        } 
 | 
			
		||||
    
 | 
			
		||||
    }, 1000)
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function stopInterval() {
 | 
			
		||||
    clearInterval(interval);
 | 
			
		||||
}
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
function setTime() {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    durationBar.max = durationAll
 | 
			
		||||
    durationProgress += 1000 
 | 
			
		||||
    durationBar.value = durationProgress
 | 
			
		||||
 | 
			
		||||
    
 | 
			
		||||
    const maxhours = Math.floor(durationAll / 3600000);
 | 
			
		||||
    const nowhours = Math.floor(durationProgress / 3600000);
 | 
			
		||||
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    var maxmin = Math.trunc(durationAll / 60000) - (Math.floor(durationAll / 60000 / 60) * 60);
 | 
			
		||||
    var maxsec = Math.floor(durationAll / 1000) - (Math.floor(durationAll / 1000 / 60) * 60);
 | 
			
		||||
    var nowmin = Math.trunc(durationProgress / 60000) - (Math.floor(durationProgress / 60000 / 60) * 60);
 | 
			
		||||
    var nowsec = Math.floor(durationProgress / 1000) - (Math.floor(durationProgress / 1000 / 60) * 60);
 | 
			
		||||
 | 
			
		||||
    console.log(durationAll)
 | 
			
		||||
    console.log(durationProgress)
 | 
			
		||||
    console.log("---------------------")
 | 
			
		||||
 | 
			
		||||
    var now = ""
 | 
			
		||||
    var max = ""
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    if (maxmin < 10) {
 | 
			
		||||
        maxmin = `0${maxmin}`;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (nowmin < 10) {
 | 
			
		||||
        nowmin = `0${nowmin}`;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (maxsec < 10) {
 | 
			
		||||
        maxsec = `0${maxsec}`;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (nowsec < 10) {
 | 
			
		||||
        nowsec = `0${nowsec}`;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if(maxhours != 0) {
 | 
			
		||||
       
 | 
			
		||||
        max =  maxhours + ":" + maxmin + ":" + maxsec
 | 
			
		||||
    } else {
 | 
			
		||||
        max =  maxmin + ":" + maxsec
 | 
			
		||||
       
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if(nowhours != 0) {
 | 
			
		||||
       
 | 
			
		||||
        now =  nowhours + ":" + nowmin + ":" + nowsec
 | 
			
		||||
    } else {
 | 
			
		||||
        now =  nowmin + ":" + nowsec
 | 
			
		||||
       
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
   durationTextAct.innerHTML = now
 | 
			
		||||
   durationTextTotal.innerHTML = max
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								src/web/public/stylesheets/gunship.ttf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								src/web/public/stylesheets/gunship.ttf
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							@@ -0,0 +1,451 @@
 | 
			
		||||
@font-face {
 | 
			
		||||
  font-family: 'Gunship';
 | 
			
		||||
  src: url(Gunship.ttf);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
html {
 | 
			
		||||
 | 
			
		||||
  min-height: 100%;
 | 
			
		||||
  min-width: 100%;
 | 
			
		||||
  margin: 0;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
body {
 | 
			
		||||
 | 
			
		||||
  background-color: black;
 | 
			
		||||
  color: white;
 | 
			
		||||
  font-family: 'Roboto', sans-serif;
 | 
			
		||||
 background:  linear-gradient(90deg, rgba(76,72,140,1) 0%, rgba(0,0,0,1) 100%),
 | 
			
		||||
               linear-gradient(90deg, rgb(101, 95, 185) 0%, rgb(48, 48, 48) 100%);
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*LOGIN PAGE*/
 | 
			
		||||
 | 
			
		||||
.LOGIN_Connexion {
 | 
			
		||||
 | 
			
		||||
    font-family: 'Gunship';
 | 
			
		||||
    font-size: 20px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.LOGIN_box {
 | 
			
		||||
 | 
			
		||||
  text-align: center;
 | 
			
		||||
  margin-top: 15vw;
 | 
			
		||||
  border-radius: 12px;
 | 
			
		||||
 | 
			
		||||
 /*
 | 
			
		||||
  background-color: #106f8b;
 | 
			
		||||
  opacity: 0.8;
 | 
			
		||||
  background-size: 6px 6px;
 | 
			
		||||
  background-image: linear-gradient(0deg, #106f8b 50%, #1F859E 50%);*/
 | 
			
		||||
  background: linear-gradient(90deg, #515151 0%, #2e2e2e 100%);
 | 
			
		||||
  align-items: center;
 | 
			
		||||
  padding: 5%;
 | 
			
		||||
  width: 500px;
 | 
			
		||||
  margin-right: auto;
 | 
			
		||||
  margin-left: auto;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.LOGIN_logopng {
 | 
			
		||||
 | 
			
		||||
  width: 60px;
 | 
			
		||||
  height: 60px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.LOGIN_DiscordBtn {
 | 
			
		||||
 | 
			
		||||
  padding: 8px;
 | 
			
		||||
  border-style: solid;
 | 
			
		||||
  border-color: #2c3df4;
 | 
			
		||||
  border-radius: 12px;
 | 
			
		||||
  background-color: #2c3df4;
 | 
			
		||||
  color: white;
 | 
			
		||||
  width: 160px;
 | 
			
		||||
  transition: all 0.2s ease 0s
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
.LOGIN_DiscordBtn:hover {
 | 
			
		||||
  box-shadow: #2c3df4 0px 0px 10px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.LOGIN_DiscordBtn:active {
 | 
			
		||||
  background-color: transparent;
 | 
			
		||||
  box-shadow: #2c3df4 0px 0px 10px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.LOGIN_DiscordBtn img {
 | 
			
		||||
 | 
			
		||||
  width: 125px;
 | 
			
		||||
  
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*Index Page*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
.INDEX_userInfo {
 | 
			
		||||
 | 
			
		||||
    display: flex;
 | 
			
		||||
    align-items: center;
 | 
			
		||||
    flex-direction: row;
 | 
			
		||||
    text-align: right;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.INDEX_userInfo:hover {
 | 
			
		||||
 | 
			
		||||
  cursor: pointer;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.INDEX_title {
 | 
			
		||||
 | 
			
		||||
  color:white;
 | 
			
		||||
  display: flex;
 | 
			
		||||
  justify-content: space-between;
 | 
			
		||||
 
 | 
			
		||||
  
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.INDEX_usrname {
 | 
			
		||||
 | 
			
		||||
  opacity: 0.8;
 | 
			
		||||
  font-size: 12px;
 | 
			
		||||
  margin: 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
.INDEX_gbname {
 | 
			
		||||
 | 
			
		||||
  margin: 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
.INDEX_userInfo img {
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
  width: 60px;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.INDEX_Content {
 | 
			
		||||
 | 
			
		||||
  padding: 2%;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
.INDEX_userPopup {
 | 
			
		||||
 | 
			
		||||
  display: none;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.INDEX_userPopup_Visible {
 | 
			
		||||
 | 
			
		||||
  display: flex;
 | 
			
		||||
  flex-direction: column;
 | 
			
		||||
  background-color: #2e2e2e;
 | 
			
		||||
  margin-top: 20px;
 | 
			
		||||
  font-size: 12px;
 | 
			
		||||
  text-align: center;
 | 
			
		||||
  color: white;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#userInfoglobal {
 | 
			
		||||
  
 | 
			
		||||
  align-items: right;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.INDEX_signout {
 | 
			
		||||
 | 
			
		||||
    width: 100%;
 | 
			
		||||
    color:  red;
 | 
			
		||||
    text-decoration: none;
 | 
			
		||||
    outline: none;
 | 
			
		||||
    padding: 10%;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.INDEX_signout:hover {
 | 
			
		||||
 | 
			
		||||
  background-color: red;
 | 
			
		||||
  color: white;
 | 
			
		||||
  cursor: pointer;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.INDEX_line {
 | 
			
		||||
 | 
			
		||||
  width: 100%;
 | 
			
		||||
  color:  rgb(155, 155, 155);
 | 
			
		||||
  text-decoration: none;
 | 
			
		||||
  outline: none;
 | 
			
		||||
  padding: 10%;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.INDEX_line:hover {
 | 
			
		||||
 | 
			
		||||
  background-color: rgb(255, 255, 255);
 | 
			
		||||
  color: rgb(0, 0, 0);
 | 
			
		||||
  cursor: pointer;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*PLAYER*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
.PLAYER_box {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  background-color: rgba(0, 0, 0, 0.655);
 | 
			
		||||
  display: flex;
 | 
			
		||||
  flex-direction: row;
 | 
			
		||||
  justify-content: space-between;
 | 
			
		||||
  padding: 1.5%;
 | 
			
		||||
  align-items: center;
 | 
			
		||||
  position: absolute;
 | 
			
		||||
  width: 100%;
 | 
			
		||||
  bottom: 0;
 | 
			
		||||
  color: white;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.PLAYER_middle {
 | 
			
		||||
 | 
			
		||||
  display: flex; 
 | 
			
		||||
  text-align: center;
 | 
			
		||||
  align-items: center;
 | 
			
		||||
  flex-direction: column;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
p {
 | 
			
		||||
 | 
			
		||||
  margin: 0 !important;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.PLAYER_durationbar {
 | 
			
		||||
 | 
			
		||||
  margin-top: 1vh;
 | 
			
		||||
  display: flex;
 | 
			
		||||
  flex-direction: row;
 | 
			
		||||
  align-items: center;
 | 
			
		||||
 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.PLAYER_title {
 | 
			
		||||
 | 
			
		||||
  display: flex;
 | 
			
		||||
  flex-direction: row;
 | 
			
		||||
  align-items: center;
 | 
			
		||||
  width: 30vw;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#duration {
 | 
			
		||||
 | 
			
		||||
  width: 25vw;
 | 
			
		||||
  margin-right: 0.5vw;
 | 
			
		||||
  margin-left: 0.5vw;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#music_img {
 | 
			
		||||
 | 
			
		||||
  margin-right: 1vw;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
.third {
 | 
			
		||||
 | 
			
		||||
  color: rgb(47, 47, 47);
 | 
			
		||||
  background-color: transparent;
 | 
			
		||||
  border: none;
 | 
			
		||||
  border-radius: 100%;
 | 
			
		||||
  text-shadow: 1px 1px 10px white;
 | 
			
		||||
  font-size: 0.9vw;
 | 
			
		||||
  margin-left: 0.8vw;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.primary {
 | 
			
		||||
 | 
			
		||||
  display: inline-block;
 | 
			
		||||
  background-color: #ffffff;
 | 
			
		||||
  color: rgb(0, 0, 0);
 | 
			
		||||
  border: none;
 | 
			
		||||
  border-radius: 100%; 
 | 
			
		||||
  width: 50px;
 | 
			
		||||
  height: 50px;
 | 
			
		||||
  font-size: 1vw;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.primary:active {
 | 
			
		||||
 | 
			
		||||
  scale: 0.95;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.secondary {
 | 
			
		||||
 | 
			
		||||
  color: rgb(178, 178, 178);
 | 
			
		||||
  border: none;
 | 
			
		||||
  background-color: transparent;
 | 
			
		||||
  width: 50px;
 | 
			
		||||
  height: 50px;
 | 
			
		||||
  font-size: 1vw;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.secondary:hover {
 | 
			
		||||
 | 
			
		||||
  color: white;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
.showPicture {
 | 
			
		||||
 | 
			
		||||
  margin: 0 !important;
 | 
			
		||||
  margin-bottom: 10px;
 | 
			
		||||
  width: 4vw;
 | 
			
		||||
  height: 4vw;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.title {
 | 
			
		||||
 | 
			
		||||
  width: 100%;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.PLAYER_actionbar {
 | 
			
		||||
  text-align: right;
 | 
			
		||||
  width: 30vw;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.grised {
 | 
			
		||||
 | 
			
		||||
  filter : invert(50%);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*SETTINGS*/
 | 
			
		||||
 | 
			
		||||
.SETTINGS_dialog {
 | 
			
		||||
 | 
			
		||||
  width: 40vw;
 | 
			
		||||
  height: 25vw;
 | 
			
		||||
  padding: 0;
 | 
			
		||||
  background:  linear-gradient(90deg, #515151 0%, #2e2e2e 100%);
 | 
			
		||||
  border: none;
 | 
			
		||||
  border-radius: 12px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.SETTINGS_content {
 | 
			
		||||
 | 
			
		||||
  display: flex;
 | 
			
		||||
  width: 100%;
 | 
			
		||||
  flex-direction: row;
 | 
			
		||||
  
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.ssidebar {
 | 
			
		||||
  width: 12vw;
 | 
			
		||||
  position: sticky;
 | 
			
		||||
  height: 25vw;
 | 
			
		||||
  background-color: #2d2d2d;
 | 
			
		||||
  border-radius: 12px 0 0 12px;
 | 
			
		||||
  display: flex; /* Ajout : pour aligner les éléments verticalement à l'intérieur */
 | 
			
		||||
  flex-direction: column; /* Ajout : pour aligner les éléments verticalement à l'intérieur */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.scontent {
 | 
			
		||||
  flex: 1;
 | 
			
		||||
  padding: 1vw;
 | 
			
		||||
  border-radius: 0 12px 12px 0;
 | 
			
		||||
 
 | 
			
		||||
 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.slineclose {
 | 
			
		||||
 | 
			
		||||
  width: 100%;
 | 
			
		||||
  text-align: right;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.SETTINGS_close {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.dialogTitle {
 | 
			
		||||
 | 
			
		||||
  color: white;
 | 
			
		||||
  font-family: 'Gunship', sans-serif;
 | 
			
		||||
  font-size: 0.85vw;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.ssidebar_line {
 | 
			
		||||
 | 
			
		||||
  color: white;
 | 
			
		||||
  width: 100%;
 | 
			
		||||
  text-align: left;
 | 
			
		||||
  transition: all 0.1s ease 0s;
 | 
			
		||||
  padding: 8%;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.ssidebar_line:hover {
 | 
			
		||||
 | 
			
		||||
    background-color: white;
 | 
			
		||||
    color: black;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
.ssidebar_content {
 | 
			
		||||
 | 
			
		||||
  height: 100%;
 | 
			
		||||
  display: flex;
 | 
			
		||||
  justify-content: center;
 | 
			
		||||
  align-items: center;
 | 
			
		||||
  flex-direction: column;
 | 
			
		||||
  cursor: pointer;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.beta {
 | 
			
		||||
 | 
			
		||||
  font-family: 'Gunship', sans-serif;
 | 
			
		||||
  font-size: 10px;
 | 
			
		||||
  position: fixed;
 | 
			
		||||
  width: 60px;
 | 
			
		||||
  transform: translateY(300%);
 | 
			
		||||
  background-color: rgb(48, 5, 77);
 | 
			
		||||
  
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
.INDEX_picture {
 | 
			
		||||
    padding-left: 10%;
 | 
			
		||||
    display: flex;
 | 
			
		||||
    flex-direction: column;
 | 
			
		||||
    text-align: center;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.SETTINGS_close {
 | 
			
		||||
  color: red;
 | 
			
		||||
  background-color: transparent;
 | 
			
		||||
  border-radius: 50vw;
 | 
			
		||||
  border-color: red;
 | 
			
		||||
  border-style: solid;
 | 
			
		||||
  padding: 5px;
 | 
			
		||||
  width: 40px;
 | 
			
		||||
  height: 40px;
 | 
			
		||||
  transition: all 0.2s ease 0s;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.SETTINGS_close:hover {
 | 
			
		||||
 | 
			
		||||
  color: white;
 | 
			
		||||
  background-color: red;
 | 
			
		||||
  cursor: pointer;
 | 
			
		||||
}
 | 
			
		||||
@@ -18,4 +18,5 @@ router.get('/', function(req, res, next) {
 | 
			
		||||
  
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
module.exports = router;
 | 
			
		||||
@@ -44,10 +44,16 @@ router.get('/redirect', function(req, res, next) {
 | 
			
		||||
                    alog.step.error("get_discord_info_" + req.cookies.session)
 | 
			
		||||
                    console.log(error)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                    if(error == "MIGRATE_ACCOUNT_ONLY") {
 | 
			
		||||
 | 
			
		||||
                        res.redirect('/login?error=MIGRATE_ACCOUNT_ONLY')
 | 
			
		||||
 | 
			
		||||
                    } else if(error == "NOT_IN_BETA") {
 | 
			
		||||
 | 
			
		||||
                        res.redirect('/login?error=NOT_IN_BETA')
 | 
			
		||||
                        
 | 
			
		||||
                    } else {
 | 
			
		||||
 | 
			
		||||
                        res.redirect('/login?error=CANCEL_LOGIN')
 | 
			
		||||
 
 | 
			
		||||
@@ -20,8 +20,40 @@ router.get('/', function(req, res, next) {
 | 
			
		||||
            res.cookie("session", session)
 | 
			
		||||
           
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        var error = ""
 | 
			
		||||
 | 
			
		||||
        if(req.query.error == "CANCEL_LOGIN") {
 | 
			
		||||
 | 
			
		||||
            error = "<p style='color:red; margin-bottom: 0.5vw !important;'>Une erreur est survenue lors de l'authentification !</p>"
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if(req.query.error == "MIGRATE_ACCOUNT_ONLY") {
 | 
			
		||||
 | 
			
		||||
            error = "<p style='color:red; margin-bottom: 0.5vw !important;'>Uniquement les comptes migrés sont accéptés !</p>"
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if(req.query.error == "IS_NOT_IN_CLP") {
 | 
			
		||||
 | 
			
		||||
            error = "<p style='color:red; margin-bottom: 0.5vw !important;'>Que fais-tu là ? Seul les membres du CLP peuvent contrôler le Bot</p>"
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if(req.query.error == "ACCOUNT_BANNED") {
 | 
			
		||||
 | 
			
		||||
            error = "<p style='color:red; margin-bottom: 0.5vw !important;'>Ton compte a été banni !</p>"
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if(req.query.error == "NOT_IN_BETA") {
 | 
			
		||||
 | 
			
		||||
            error = "<p style='color:red; margin-bottom: 0.5vw !important;'>Demande à Raphix pour t'inscrire à la Beta !</p>"
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
        res.render("login")
 | 
			
		||||
        res.render("login", {login: error})
 | 
			
		||||
    }
 | 
			
		||||
  
 | 
			
		||||
});
 | 
			
		||||
 
 | 
			
		||||
@@ -1,11 +1,49 @@
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<html lang="en">
 | 
			
		||||
<head>
 | 
			
		||||
    <meta charset="UTF-8">
 | 
			
		||||
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
 | 
			
		||||
<html>
 | 
			
		||||
  <head>
 | 
			
		||||
    <title>Subsonics - Error</title>
 | 
			
		||||
</head>
 | 
			
		||||
<body>
 | 
			
		||||
    <h1>ERROR !</h1>
 | 
			
		||||
</body>
 | 
			
		||||
</html>
 | 
			
		||||
    <link rel='stylesheet' href='/stylesheets/style.css'/>
 | 
			
		||||
    <style>
 | 
			
		||||
        body {
 | 
			
		||||
 | 
			
		||||
            padding: 2%;
 | 
			
		||||
            
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        div {
 | 
			
		||||
 | 
			
		||||
            background-color: rgb(32, 32, 32);
 | 
			
		||||
            border-radius: 1vw;
 | 
			
		||||
            padding: 2%;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        button {
 | 
			
		||||
            color: red;
 | 
			
		||||
            background-color: transparent;
 | 
			
		||||
            border-radius: 1vw;
 | 
			
		||||
            border-color: red;
 | 
			
		||||
            border-style: solid;
 | 
			
		||||
            padding: 10px;
 | 
			
		||||
            transition: all 0.2s ease 0s;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        button:hover {
 | 
			
		||||
 | 
			
		||||
            color: white;
 | 
			
		||||
            background-color: red;
 | 
			
		||||
            cursor: pointer;
 | 
			
		||||
        }
 | 
			
		||||
    </style>
 | 
			
		||||
  </head>
 | 
			
		||||
  <body>
 | 
			
		||||
    <div>
 | 
			
		||||
        <h1>Erreur</h1>
 | 
			
		||||
        <h2><%= message %> - <%= error.status %></h1>
 | 
			
		||||
        <pre><%= error.stack %></pre>
 | 
			
		||||
 | 
			
		||||
    </div>
 | 
			
		||||
    <br>
 | 
			
		||||
   <a href="/"><button>Revenir au concert</button></a>
 | 
			
		||||
  </body>
 | 
			
		||||
</html>
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -7,11 +7,83 @@
 | 
			
		||||
    <title>Subsonics - Web</title>
 | 
			
		||||
</head>
 | 
			
		||||
<body>
 | 
			
		||||
    <h1>Subsonics</h1>
 | 
			
		||||
    <div id="userInfo"></div>
 | 
			
		||||
    <a href="/internal/logout"><button>Disconnect</button></a>
 | 
			
		||||
    <div class="INDEX_Content">
 | 
			
		||||
        <div class="INDEX_title">
 | 
			
		||||
            <div class=" LOGIN_title">
 | 
			
		||||
                <img class="LOGIN_logopng" src="/images/logo.png">
 | 
			
		||||
                <img src="/images/title.png">
 | 
			
		||||
            </div>
 | 
			
		||||
            <div id="userInfoglobal">
 | 
			
		||||
                <div class="INDEX_userInfo" id="userInfo"></div>
 | 
			
		||||
                <div class="INDEX_userPopup" id="userPopup">
 | 
			
		||||
                    <div id="settingsBtn" class="INDEX_line"><i class="fa-solid fa-wrench"></i> Paramètres</div>
 | 
			
		||||
                    <a class="INDEX_signout" href="/internal/logout"><i class="fa fa-sign-out " aria-hidden="true"></i> Déconnexion</a>
 | 
			
		||||
                </div>
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>  
 | 
			
		||||
 | 
			
		||||
    </div>
 | 
			
		||||
       
 | 
			
		||||
                  
 | 
			
		||||
        <div class="PLAYER_box">
 | 
			
		||||
            <div class="PLAYER_title">
 | 
			
		||||
                <span id="music_img"><img class="showPicture" src="/images/black-image.svg"></span>
 | 
			
		||||
                <span id="music_title" class="title"><p>Aucun titre joué</p></span>
 | 
			
		||||
            </div>
 | 
			
		||||
      
 | 
			
		||||
            <div class="PLAYER_middle">
 | 
			
		||||
                <div class="playbar">
 | 
			
		||||
                    <button id="backward" class="secondary"><i class="fas fa-step-backward"></i></button>
 | 
			
		||||
                    <button id="play" class="primary"><i class="fas fa-play"></i></button>
 | 
			
		||||
                    <button id="forward" class="secondary"><i class="fas fa-step-forward"></i></button>
 | 
			
		||||
                </div>
 | 
			
		||||
                <div class="PLAYER_durationbar">
 | 
			
		||||
                    <p id="durationTextAct" class="durationText">0:00</p>
 | 
			
		||||
                    <input id="duration" type="range" value="0" max="100">
 | 
			
		||||
                    <p id="durationTextTotal" class="durationText">0:00</p>
 | 
			
		||||
                </div>
 | 
			
		||||
            </div>
 | 
			
		||||
            
 | 
			
		||||
            <div class="PLAYER_actionbar">
 | 
			
		||||
                <button id="heart" class="third"><i class="fa fa-heart"></i></button>
 | 
			
		||||
                <button id="vol" class="third"><i class="fa fa-volume-up"></i></button>
 | 
			
		||||
                <button id="loop" class="third"><i class="fa fa-retweet"></i></button>
 | 
			
		||||
                <button id="shuffle" class="third"><i class="fa fa-shuffle"></i></button>
 | 
			
		||||
                <button id="list" class="list third"><i class="fa fa-list-ol"><p class="number" id="listNumber"></p></i></button>
 | 
			
		||||
            </div>
 | 
			
		||||
           
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        <dialog class="SETTINGS_dialog" id="SETTINGS_dialog">
 | 
			
		||||
            <div class="SETTINGS_content">
 | 
			
		||||
                <div class="ssidebar">
 | 
			
		||||
                    <h2 style="  padding: 1vw; position: absolute;" class="dialogTitle"><i class="fa fa-wrench"></i> Paramètres</h2>
 | 
			
		||||
                    <div class="ssidebar_content">
 | 
			
		||||
                        <div class="ssidebar_line"><i class="fa-solid fa-newspaper"></i> Logs</div>
 | 
			
		||||
                        <div class="ssidebar_line"><i class="fa-solid fa-tower-cell"></i> Connexions</div>
 | 
			
		||||
                        <div class="ssidebar_line"><i class="fa-solid fa-people-group"></i> Gestion d'accès</div>
 | 
			
		||||
                        <div class="ssidebar_line"><i class="fa-solid fa-shield"></i> Bêta</div>
 | 
			
		||||
                    </div>
 | 
			
		||||
          
 | 
			
		||||
                </div>
 | 
			
		||||
                <div class="scontent">
 | 
			
		||||
                    <div class="slineclose">
 | 
			
		||||
                        <button id="SETTINGS_close" class="SETTINGS_close"><i class="fa-solid fa-xmark"></i></button>
 | 
			
		||||
                      
 | 
			
		||||
                    </div>
 | 
			
		||||
 | 
			
		||||
                    <p style="color: red; font-size: 72px; text-align: center; font-family: 'Gunship', sans-serif;" >NOT WORKING</p>
 | 
			
		||||
                   
 | 
			
		||||
                </div>
 | 
			
		||||
            </div>
 | 
			
		||||
        </dialog>
 | 
			
		||||
    
 | 
			
		||||
    
 | 
			
		||||
    <script src="/socket.io/socket.io.js"></script>
 | 
			
		||||
    <script src="/javascript/IO.js"></script>
 | 
			
		||||
    <script src="/javascript/__index_script.js"></script>
 | 
			
		||||
    <script defer src="https://use.fontawesome.com/releases/v6.4.2/js/all.js" crossorigin="anonymous"></script>
 | 
			
		||||
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
 | 
			
		||||
</body>
 | 
			
		||||
</html>
 | 
			
		||||
@@ -4,14 +4,26 @@
 | 
			
		||||
    <meta charset="UTF-8">
 | 
			
		||||
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
 | 
			
		||||
    <title>Subsonics - Login</title>
 | 
			
		||||
    <link rel='stylesheet' href='/stylesheets/style.css'/>
 | 
			
		||||
</head>
 | 
			
		||||
<body>
 | 
			
		||||
    <h1>Subsonics Login</h1>
 | 
			
		||||
    <button id="loginBtn">Connexion</button>
 | 
			
		||||
    <p>Fait avec le 💖 par Raphix</p>
 | 
			
		||||
    <div class="LOGIN_box">
 | 
			
		||||
        <div class="LOGIN_title">
 | 
			
		||||
            <img class="LOGIN_logopng" src="/images/logo.png">
 | 
			
		||||
            <img src="/images/title.png">
 | 
			
		||||
        </div>
 | 
			
		||||
        <h2 class="LOGIN_Connexion">Connexion</h2>
 | 
			
		||||
        <%- login %>
 | 
			
		||||
        <button class="LOGIN_DiscordBtn" id="loginBtn"><img src="/images/discord-logo-white.png"></button>
 | 
			
		||||
       
 | 
			
		||||
 | 
			
		||||
        <p style="padding: 20px;">Fait avec le 💖 par Raphix</p>
 | 
			
		||||
    </div>
 | 
			
		||||
    
 | 
			
		||||
    <script src="/socket.io/socket.io.js"></script>
 | 
			
		||||
    <script src="/javascript/IO.js"></script>
 | 
			
		||||
    <script src="/javascript/__login_script.js"></script>
 | 
			
		||||
  
 | 
			
		||||
    <script defer src="https://use.fontawesome.com/releases/v6.4.2/js/all.js" crossorigin="anonymous"></script>
 | 
			
		||||
 | 
			
		||||
</body>
 | 
			
		||||
</html>
 | 
			
		||||
		Reference in New Issue
	
	Block a user