Version 0.3.0 - Ajout de l'interface Web - First Steps to it
This commit is contained in:
parent
d6fb056096
commit
5b2b444b02
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": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "subsonics-web",
|
"name": "subsonics-web",
|
||||||
"version": "0.2.2",
|
"version": "0.2.3",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"cookie": "^0.5.0",
|
"cookie": "^0.5.0",
|
||||||
"cookie-parser": "^1.4.6",
|
"cookie-parser": "^1.4.6",
|
||||||
@ -14,6 +14,7 @@
|
|||||||
"ejs": "^3.1.9",
|
"ejs": "^3.1.9",
|
||||||
"erela.js": "^2.4.0",
|
"erela.js": "^2.4.0",
|
||||||
"express": "^4.18.2",
|
"express": "^4.18.2",
|
||||||
|
"express-favicon": "^2.0.4",
|
||||||
"nodemon": "^2.0.22",
|
"nodemon": "^2.0.22",
|
||||||
"socket.io": "^4.6.1",
|
"socket.io": "^4.6.1",
|
||||||
"uuid": "^9.0.0",
|
"uuid": "^9.0.0",
|
||||||
@ -704,6 +705,14 @@
|
|||||||
"node": ">= 0.10.0"
|
"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": {
|
"node_modules/fast-deep-equal": {
|
||||||
"version": "3.1.3",
|
"version": "3.1.3",
|
||||||
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
|
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
|
||||||
@ -2250,6 +2259,11 @@
|
|||||||
"vary": "~1.1.2"
|
"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": {
|
"fast-deep-equal": {
|
||||||
"version": "3.1.3",
|
"version": "3.1.3",
|
||||||
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
|
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "subsonics-web",
|
"name": "subsonics-web",
|
||||||
"author": "Raphix",
|
"author": "Raphix",
|
||||||
"version": "0.2.3",
|
"version": "0.3.0",
|
||||||
"nodemonConfig": {
|
"nodemonConfig": {
|
||||||
"ext": "js, html",
|
"ext": "js, html",
|
||||||
"ignore": [
|
"ignore": [
|
||||||
@ -18,6 +18,7 @@
|
|||||||
"ejs": "^3.1.9",
|
"ejs": "^3.1.9",
|
||||||
"erela.js": "^2.4.0",
|
"erela.js": "^2.4.0",
|
||||||
"express": "^4.18.2",
|
"express": "^4.18.2",
|
||||||
|
"express-favicon": "^2.0.4",
|
||||||
"nodemon": "^2.0.22",
|
"nodemon": "^2.0.22",
|
||||||
"socket.io": "^4.6.1",
|
"socket.io": "^4.6.1",
|
||||||
"uuid": "^9.0.0",
|
"uuid": "^9.0.0",
|
||||||
@ -26,5 +27,6 @@
|
|||||||
"scripts": {
|
"scripts": {
|
||||||
"start": "nodemon src/main.js",
|
"start": "nodemon src/main.js",
|
||||||
"dev": "set DEV=true& 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 { LogType } = require("../modules/sub-log")
|
||||||
const { List } = require("./sub-list")
|
const { List } = require("./sub-list")
|
||||||
const nodeFinder = require("./nodes-finder")
|
const nodeFinder = require("./nodes-finder")
|
||||||
|
const subplayer = require("./sub-player")
|
||||||
|
|
||||||
const client = new Client({
|
const client = new Client({
|
||||||
intents:[GatewayIntentBits.Guilds, GatewayIntentBits.GuildVoiceStates, GatewayIntentBits.GuildMembers],
|
intents:[GatewayIntentBits.Guilds, GatewayIntentBits.GuildVoiceStates, GatewayIntentBits.GuildMembers],
|
||||||
@ -13,6 +14,11 @@ const client = new Client({
|
|||||||
|
|
||||||
const membersVoices = new Map()
|
const membersVoices = new Map()
|
||||||
|
|
||||||
|
module.exports.getClient = function () {
|
||||||
|
|
||||||
|
return client
|
||||||
|
}
|
||||||
|
|
||||||
module.exports.DiscordBot = class {
|
module.exports.DiscordBot = class {
|
||||||
|
|
||||||
constructor(config, dlog) {
|
constructor(config, dlog) {
|
||||||
@ -192,6 +198,9 @@ function startErelaManager(dlog, config) {
|
|||||||
client.channels.fetch(player.options.voiceChannel).then(channel => {
|
client.channels.fetch(player.options.voiceChannel).then(channel => {
|
||||||
plog.log("Nouveau Player instancié dans : " + channel.name)
|
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 => {
|
client.channels.fetch(player.options.voiceChannel).then(channel => {
|
||||||
plog.log("Player supprimé dans : " + channel.name)
|
plog.log("Player supprimé dans : " + channel.name)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
process.emit("MUSIC_UPDATE_STATE")
|
||||||
|
|
||||||
})
|
})
|
||||||
|
|
||||||
client.manager.on("trackStart", (song) => {
|
client.manager.on("trackStart", (song) => {
|
||||||
plog.log("Lecture de '" + song.queue.current.title + "' de '" + song.queue.current.author + "'")
|
plog.log("Lecture de '" + song.queue.current.title + "' de '" + song.queue.current.author + "'")
|
||||||
list.setCurrent(song)
|
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
|
// Emitted whenever a node connects
|
||||||
@ -235,6 +250,7 @@ function startErelaManager(dlog, config) {
|
|||||||
|
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
// THIS IS REQUIRED. Send raw events to Erela.js
|
// THIS IS REQUIRED. Send raw events to Erela.js
|
||||||
client.on("raw", d => client.manager.updateVoiceState(d));
|
client.on("raw", d => client.manager.updateVoiceState(d));
|
||||||
}
|
}
|
@ -5,12 +5,14 @@ const root = path.resolve(__dirname, '../../')
|
|||||||
const __glob = {
|
const __glob = {
|
||||||
CONFIG: root + path.sep + "data" + path.sep + "config.json",
|
CONFIG: root + path.sep + "data" + path.sep + "config.json",
|
||||||
USERS: root + path.sep + "data" + path.sep + "users.json",
|
USERS: root + path.sep + "data" + path.sep + "users.json",
|
||||||
|
BETA_USERS: root + path.sep + "data" + path.sep + "betas.json",
|
||||||
ROOT: root,
|
ROOT: root,
|
||||||
WEB_DIR: root + path.sep + "src" + path.sep + "web",
|
WEB_DIR: root + path.sep + "src" + path.sep + "web",
|
||||||
COMMANDS: root + path.sep + "src" + path.sep + "commands",
|
COMMANDS: root + path.sep + "src" + path.sep + "commands",
|
||||||
SUBLOG: root + path.sep + "src" + path.sep + "modules" + path.sep + "sub-log.js",
|
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",
|
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",
|
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",
|
PACKAGE: root + path.sep + "package.json",
|
||||||
DATA: root + path.sep + "data" + path.sep,
|
DATA: root + path.sep + "data" + path.sep,
|
||||||
NODES: root + path.sep + "data" + path.sep + "nodes.json",
|
NODES: root + path.sep + "data" + path.sep + "nodes.json",
|
||||||
@ -21,7 +23,8 @@ const __web = {
|
|||||||
|
|
||||||
ROUTER: webroot + "routes" + path.sep,
|
ROUTER: webroot + "routes" + path.sep,
|
||||||
PUBLIC: webroot + "public",
|
PUBLIC: webroot + "public",
|
||||||
TEMPLATES: webroot + "templates"
|
TEMPLATES: webroot + "templates",
|
||||||
|
ICON: webroot + "public" + path.sep + "images" + path.sep + "logo.ico"
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = { __glob, __web };
|
module.exports = { __glob, __web };
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
const { resolve } = require("path");
|
const { resolve } = require("path");
|
||||||
const { __glob } = require("../modules/global-variables");
|
const { __glob, __web } = require("../modules/global-variables");
|
||||||
const { LogType } = require('./sub-log');
|
const { LogType } = require('./sub-log');
|
||||||
const fs = require("fs")
|
const fs = require("fs")
|
||||||
|
|
||||||
@ -7,6 +7,9 @@ const alog = new LogType("Authentification")
|
|||||||
|
|
||||||
var users = new Map()
|
var users = new Map()
|
||||||
var sessions = new Array()
|
var sessions = new Array()
|
||||||
|
var betausers = new Array()
|
||||||
|
|
||||||
|
var packageJson = JSON.parse(fs.readFileSync(__glob.PACKAGE))
|
||||||
|
|
||||||
updateUsers()
|
updateUsers()
|
||||||
|
|
||||||
@ -78,11 +81,31 @@ module.exports.getDiscordUser = function (code, session) {
|
|||||||
reject("MIGRATE_ACCOUNT_ONLY")
|
reject("MIGRATE_ACCOUNT_ONLY")
|
||||||
|
|
||||||
} else {
|
} 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)
|
||||||
|
|
||||||
|
} else {
|
||||||
resolve(user)
|
|
||||||
|
reject("NOT_IN_BETA")
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -172,18 +195,31 @@ module.exports.removeUser = function (token) {
|
|||||||
|
|
||||||
function updateUsers() {
|
function updateUsers() {
|
||||||
|
|
||||||
|
|
||||||
|
if(!fs.existsSync(__glob.BETA_USERS)){
|
||||||
|
|
||||||
|
fs.writeFileSync(__glob.BETA_USERS, '[]')
|
||||||
|
}
|
||||||
|
|
||||||
if(!fs.existsSync(__glob.USERS)){
|
if(!fs.existsSync(__glob.USERS)){
|
||||||
|
|
||||||
fs.writeFileSync(__glob.USERS, '[]')
|
fs.writeFileSync(__glob.USERS, '[]')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
const userDB = JSON.parse(fs.readFileSync(__glob.USERS))
|
const userDB = JSON.parse(fs.readFileSync(__glob.USERS))
|
||||||
|
const betausersDB = JSON.parse(fs.readFileSync(__glob.BETA_USERS))
|
||||||
|
|
||||||
for (const user of userDB) {
|
for (const user of userDB) {
|
||||||
|
|
||||||
users.set(user.token, user)
|
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 " + 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() {
|
destroy() {
|
||||||
|
|
||||||
next = new Array()
|
next = new Array()
|
||||||
|
@ -2,7 +2,9 @@ const { SlashCommandBuilder, EmbedBuilder, DefaultWebSocketManagerOptions } = re
|
|||||||
const { __glob } = require("../modules/global-variables");
|
const { __glob } = require("../modules/global-variables");
|
||||||
const { LogType } = require("./sub-log");
|
const { LogType } = require("./sub-log");
|
||||||
const { List } = require("./sub-list")
|
const { List } = require("./sub-list")
|
||||||
var ytfps = require("ytfps")
|
const discord = require("./discord-bot")
|
||||||
|
var ytfps = require("ytfps");
|
||||||
|
|
||||||
|
|
||||||
const list = new List()
|
const list = new List()
|
||||||
|
|
||||||
@ -70,7 +72,8 @@ module.exports.play = async function (client, interaction) {
|
|||||||
// [A FINIR POUR WEB]
|
// [A FINIR POUR WEB]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
process.emit("MUSIC_UPDATE_STATE")
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -116,9 +119,29 @@ module.exports.pause = function (client, interaction) {
|
|||||||
|
|
||||||
} else {
|
} 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) {
|
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 {
|
} 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) {
|
module.exports.previous = function (client, interaction) {
|
||||||
|
|
||||||
if(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
|
// 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 auth = require("./sub-auth");
|
||||||
const cook = require("cookie")
|
const cook = require("cookie")
|
||||||
const wlog = new LogType("Web")
|
const wlog = new LogType("Web")
|
||||||
|
const subplayer = require(__glob.SUBPLAYER);
|
||||||
module.exports.WebServer = class {
|
module.exports.WebServer = class {
|
||||||
|
|
||||||
constructor() {
|
constructor() {
|
||||||
@ -23,6 +23,7 @@ function init() {
|
|||||||
const path = require('path');
|
const path = require('path');
|
||||||
const cookieParser = require('cookie-parser');
|
const cookieParser = require('cookie-parser');
|
||||||
const http = require("http");
|
const http = require("http");
|
||||||
|
const favicon = require('express-favicon');
|
||||||
|
|
||||||
const app = express();
|
const app = express();
|
||||||
|
|
||||||
@ -49,7 +50,7 @@ function init() {
|
|||||||
app.use('/', indexRouter);
|
app.use('/', indexRouter);
|
||||||
app.use('/login', loginRouter);
|
app.use('/login', loginRouter);
|
||||||
app.use("/internal", internalRouter)
|
app.use("/internal", internalRouter)
|
||||||
|
app.use(favicon(__web.ICON));
|
||||||
|
|
||||||
app.use(function (req, res, next) {
|
app.use(function (req, res, next) {
|
||||||
next(createError(404));
|
next(createError(404));
|
||||||
@ -134,15 +135,26 @@ function IOConnection(io) {
|
|||||||
|
|
||||||
const alog = log.getInstance("Authentification")
|
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) => {
|
io.on("connection", (socket) => {
|
||||||
|
|
||||||
wlog.log("[SOCKET] - Nouvelle session : " + socket.id)
|
wlog.log("[SOCKET] - Nouvelle session : " + socket.id)
|
||||||
|
|
||||||
socket.on("disconnect", () => {
|
socket.on("disconnect", () => {
|
||||||
|
|
||||||
wlog.log("[SOCKET] - Fin de session : " + socket.id)
|
wlog.log("[SOCKET] - Fin de session : " + socket.id)
|
||||||
|
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// SPECIAL
|
||||||
|
|
||||||
socket.on("GET/DISCORD_LOGIN_LINK", () => {
|
socket.on("GET/DISCORD_LOGIN_LINK", () => {
|
||||||
|
|
||||||
|
|
||||||
@ -160,8 +172,54 @@ function IOConnection(io) {
|
|||||||
io.emit("ANSWER/GET/DISCORD_LOGIN_LINK", discordlink )
|
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
|
var cookies = socket.handshake.headers.cookie
|
||||||
@ -173,24 +231,67 @@ function IOConnection(io) {
|
|||||||
|
|
||||||
if(auth.checkUser(token)) {
|
if(auth.checkUser(token)) {
|
||||||
|
|
||||||
const user = auth.getUser(token)
|
subplayer.seek(data)
|
||||||
alog.log("Envoi des informations Discord de '" + user.user.username + "' à '" + socket.id + "'" )
|
|
||||||
socket.emit("ANSWER/GET/USER_INFO",user)
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
io.emit("ANSWER/GET/USER_INFO", {"error":"USER_DONT_EXIST"})
|
io.emit("ANSWER/SEND/SEEK", {"error":"USER_DONT_EXIST"})
|
||||||
}
|
}
|
||||||
} else {
|
} 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) => {
|
return new Promise((resolve, reject) => {
|
||||||
|
|
||||||
socket.emit("GET/" + request)
|
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) => {
|
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 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")
|
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 => {
|
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;
|
module.exports = router;
|
@ -44,10 +44,16 @@ router.get('/redirect', function(req, res, next) {
|
|||||||
alog.step.error("get_discord_info_" + req.cookies.session)
|
alog.step.error("get_discord_info_" + req.cookies.session)
|
||||||
console.log(error)
|
console.log(error)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if(error == "MIGRATE_ACCOUNT_ONLY") {
|
if(error == "MIGRATE_ACCOUNT_ONLY") {
|
||||||
|
|
||||||
res.redirect('/login?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 {
|
} else {
|
||||||
|
|
||||||
res.redirect('/login?error=CANCEL_LOGIN')
|
res.redirect('/login?error=CANCEL_LOGIN')
|
||||||
|
@ -20,8 +20,40 @@ router.get('/', function(req, res, next) {
|
|||||||
res.cookie("session", session)
|
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>
|
<!DOCTYPE html>
|
||||||
<html lang="en">
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
||||||
<title>Subsonics - Error</title>
|
<title>Subsonics - Error</title>
|
||||||
</head>
|
<link rel='stylesheet' href='/stylesheets/style.css'/>
|
||||||
<body>
|
<style>
|
||||||
<h1>ERROR !</h1>
|
body {
|
||||||
</body>
|
|
||||||
</html>
|
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>
|
<title>Subsonics - Web</title>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<h1>Subsonics</h1>
|
<div class="INDEX_Content">
|
||||||
<div id="userInfo"></div>
|
<div class="INDEX_title">
|
||||||
<a href="/internal/logout"><button>Disconnect</button></a>
|
<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="/socket.io/socket.io.js"></script>
|
||||||
<script src="/javascript/IO.js"></script>
|
<script src="/javascript/IO.js"></script>
|
||||||
<script src="/javascript/__index_script.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>
|
</body>
|
||||||
</html>
|
</html>
|
@ -4,14 +4,26 @@
|
|||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<title>Subsonics - Login</title>
|
<title>Subsonics - Login</title>
|
||||||
|
<link rel='stylesheet' href='/stylesheets/style.css'/>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<h1>Subsonics Login</h1>
|
<div class="LOGIN_box">
|
||||||
<button id="loginBtn">Connexion</button>
|
<div class="LOGIN_title">
|
||||||
<p>Fait avec le 💖 par Raphix</p>
|
<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="/socket.io/socket.io.js"></script>
|
||||||
<script src="/javascript/IO.js"></script>
|
<script src="/javascript/IO.js"></script>
|
||||||
<script src="/javascript/__login_script.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>
|
</body>
|
||||||
</html>
|
</html>
|
Loading…
x
Reference in New Issue
Block a user