Compare commits
36 Commits
Author | SHA1 | Date | |
---|---|---|---|
b18703d760 | |||
0fb1d23184 | |||
28ec915144 | |||
9c5ade930c | |||
a4a34e83ec | |||
59b5c07da6 | |||
8add3c13b7 | |||
6aec5ec3b6 | |||
ea26cb9514 | |||
d136ae9c50 | |||
354a475954 | |||
ad084e3555 | |||
1be1f65453 | |||
e9c35e11bd | |||
0c791c2b45 | |||
99734aa619 | |||
b755e989cd | |||
3aa775d81b | |||
d801f02978 | |||
87787abff7 | |||
c4fbc3338a | |||
67af38c9f4 | |||
7fbba2fdb9 | |||
a43fd09e9b | |||
244ecae5b7 | |||
ecdcb3c11c | |||
d99783dec5 | |||
ec561101cc | |||
811937a4ab | |||
5e8656fbc8 | |||
39068afce4 | |||
3091ecf074 | |||
d8c11761cd | |||
31ba11951b | |||
2a62ebc2f6 | |||
ffeef2df90 |
1
.gitignore
vendored
1
.gitignore
vendored
@ -36,6 +36,7 @@ build/Release
|
||||
node_modules/
|
||||
jspm_packages/
|
||||
|
||||
|
||||
# Typescript v1 declaration files
|
||||
typings/
|
||||
|
||||
|
33
Jenkinsfile
vendored
Normal file
33
Jenkinsfile
vendored
Normal file
@ -0,0 +1,33 @@
|
||||
pipeline {
|
||||
agent any
|
||||
|
||||
stages {
|
||||
stage('[Subsonics] - Test') {
|
||||
steps {
|
||||
script {
|
||||
echo "[Subsonics-Deploy] - Test Stage"
|
||||
sh "rm -rf bot"
|
||||
sh "git clone https://git.raphix.fr/subsonics/bot.git"
|
||||
sh "cd bot"
|
||||
sh "npm i"
|
||||
sh "ENV='TEST' node src/main.js"
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
stage('[Subsonics] - Déploiement') {
|
||||
steps {
|
||||
script {
|
||||
|
||||
echo "[Subsonics-Deploy] - Deploy Stage"
|
||||
sh "ssh raphix@raphix.fr sudo apt update -y"
|
||||
sh "ssh raphix@raphix.fr sudo apt upgrade -y"
|
||||
sh "ssh raphix@raphix.fr sudo -S -u gitlab-ci /home/gitlab-ci/subsonics_deploy.sh"
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
1532
package-lock.json
generated
1532
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
20
package.json
20
package.json
@ -1,13 +1,27 @@
|
||||
{
|
||||
"name": "subsonics-discord",
|
||||
"author": "Raphix",
|
||||
"version": "1.0.0",
|
||||
"version": "6.0",
|
||||
"nodemonConfig": {
|
||||
"ext": "js, html",
|
||||
"ignore": [
|
||||
"*.json",
|
||||
"*.html"
|
||||
],
|
||||
"delay": "2"
|
||||
},
|
||||
"dependencies": {
|
||||
"cookie-parser": "^1.4.6",
|
||||
"discord.js": "^14.9.0",
|
||||
"erela.js": "^2.4.0",
|
||||
"nodemon": "^2.0.22"
|
||||
"express": "^4.18.2",
|
||||
"nodemon": "^2.0.22",
|
||||
"socket.io": "^4.6.1",
|
||||
"uuid": "^9.0.0",
|
||||
"ytfps": "^1.1.0"
|
||||
},
|
||||
"scripts": {
|
||||
"start": "nodemon src/main.js"
|
||||
"start": "nodemon src/main.js",
|
||||
"dev": "set DEV=true& nodemon src/main.js"
|
||||
}
|
||||
}
|
||||
|
12
src/close.html
Normal file
12
src/close.html
Normal file
@ -0,0 +1,12 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Submanager - </title>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
</body>
|
||||
</html>
|
95
src/commands/back.js
Normal file
95
src/commands/back.js
Normal file
@ -0,0 +1,95 @@
|
||||
const { SlashCommandBuilder, EmbedBuilder } = require("discord.js");
|
||||
const log = require("../sublog")
|
||||
|
||||
module.exports = {
|
||||
|
||||
data: new SlashCommandBuilder()
|
||||
.setName("back")
|
||||
.setDescription("Permet de revenir à la musique précédente !"),
|
||||
|
||||
async execute(client, interaction) {
|
||||
|
||||
if(client.dictator == true ) {
|
||||
|
||||
if((interaction.member._roles.includes("397725956598530050") == true | interaction.member.user.id == "486943594893017119")) {
|
||||
|
||||
makeAction()
|
||||
} else {
|
||||
|
||||
const embed = new EmbedBuilder()
|
||||
.setColor(0xff0303)
|
||||
.setTitle('Mode Dictateur')
|
||||
.setTimestamp();
|
||||
const song_show = {name: "Le mode dictateur est actif !", value: "Demande au grand roi !"}
|
||||
|
||||
embed.addFields(song_show)
|
||||
interaction.reply({embeds: [embed]})
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
makeAction();
|
||||
}
|
||||
|
||||
async function makeAction() {
|
||||
|
||||
|
||||
let embed = new EmbedBuilder()
|
||||
.setColor(0xe033ff)
|
||||
.setTitle('Liste de lecture')
|
||||
.setDescription("Les musiques vont défiler dans cet ordre !")
|
||||
.setTimestamp();
|
||||
|
||||
let player = client.manager.players.get(interaction.guild.id)
|
||||
|
||||
|
||||
|
||||
if(!player) {
|
||||
|
||||
embed = new EmbedBuilder()
|
||||
.setColor(0xff0303)
|
||||
.setTitle('Erreur : Back')
|
||||
.setTimestamp();
|
||||
const song_show = {name: "Aucune chanson n'a été joué précédemment !", value: "Changement impossible !"}
|
||||
|
||||
embed.addFields(song_show)
|
||||
interaction.reply({embeds: [embed]})
|
||||
} else {
|
||||
|
||||
|
||||
let queue = client.manager.players.get(interaction.guild.id).queue;
|
||||
|
||||
|
||||
if(queue.previous == null){
|
||||
|
||||
embed = new EmbedBuilder()
|
||||
.setColor(0xff0303)
|
||||
.setTitle('Erreur : Back')
|
||||
.setTimestamp();
|
||||
const song_show = {name: "Aucune chanson n'a été joué précédemment !", value: "Changement impossible !"}
|
||||
|
||||
embed.addFields(song_show)
|
||||
interaction.reply({embeds: [embed]})
|
||||
} else {
|
||||
|
||||
embed = new EmbedBuilder()
|
||||
.setColor(0x03ff2d)
|
||||
.setTitle('Retour vers le passé !!!')
|
||||
.setDescription("**Ok, On est reparti avec "+ player.queue.previous.title +" et c'est demandée par " + interaction.member.user.username + "**")
|
||||
.setTimestamp();
|
||||
|
||||
player.stop()
|
||||
player.play(queue.previous)
|
||||
|
||||
|
||||
interaction.reply({embeds: [embed]})
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
process.emit("discordDoing")
|
||||
|
||||
}
|
||||
}
|
||||
}
|
59
src/commands/dictator.js
Normal file
59
src/commands/dictator.js
Normal file
@ -0,0 +1,59 @@
|
||||
const { SlashCommandBuilder, EmbedBuilder } = require("discord.js");
|
||||
const log = require("../sublog")
|
||||
|
||||
module.exports = {
|
||||
|
||||
data: new SlashCommandBuilder()
|
||||
.setName("dictator")
|
||||
.setDescription("Active ou désactive le mode dictateur !"),
|
||||
|
||||
async execute(client, interaction) {
|
||||
|
||||
|
||||
|
||||
if(interaction.member._roles.includes("397725956598530050") == true | interaction.member.user.id == "486943594893017119") {
|
||||
if(client.dictator == true) {
|
||||
client.dictator = false;
|
||||
|
||||
const embed = new EmbedBuilder()
|
||||
.setColor(0x3b3b3b)
|
||||
.setTitle('Mode Dictateur Inactif !')
|
||||
.setDescription("Le pouvoir du peuple est restauré !")
|
||||
.setTimestamp();
|
||||
|
||||
|
||||
interaction.reply({embeds: [embed]})
|
||||
} else {
|
||||
|
||||
const embed = new EmbedBuilder()
|
||||
.setColor(0xfff200)
|
||||
.setTitle('Mode Dictateur Actif!')
|
||||
.setDescription("Notre bon roi a désormais le seul droit sur la musique !")
|
||||
.setTimestamp();
|
||||
|
||||
|
||||
interaction.reply({embeds: [embed]})
|
||||
|
||||
client.dictator = true;
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
const embed = new EmbedBuilder()
|
||||
.setColor(0xff0303)
|
||||
.setTitle('Erreur : Mode Dictateur')
|
||||
.setTimestamp();
|
||||
const song_show = {name: "Tu n'as pas la permission de faire cela !", value: "Verbotten !"}
|
||||
|
||||
embed.addFields(song_show)
|
||||
interaction.reply({embeds: [embed]})
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
process.emit("discordDoing")
|
||||
|
||||
}
|
||||
}
|
37
src/commands/help.js
Normal file
37
src/commands/help.js
Normal file
@ -0,0 +1,37 @@
|
||||
const { SlashCommandBuilder, EmbedBuilder } = require("discord.js");
|
||||
const log = require("../sublog")
|
||||
|
||||
module.exports = {
|
||||
|
||||
data:new SlashCommandBuilder()
|
||||
.setName("help")
|
||||
.setDescription("Faire partir le meilleur groupe du monde !"),
|
||||
|
||||
async execute(client, interaction) {
|
||||
|
||||
|
||||
|
||||
const embed = new EmbedBuilder()
|
||||
.setColor(0x03ff2d)
|
||||
.setTitle('Comment assister au concert ?')
|
||||
.setDescription("**Eh ! Tu as eu ton ticket ? Tant mieux ! Voici la liste des commandes à utiliser dans le salon <#664355637685256203>**")
|
||||
.addFields({name: "/play <nom>", value: "Cette commande te permet de lire depuis Youtube, n'importe quel musique !"},
|
||||
{name: "/leave", value: "Si tu ne veux plus du meilleur groupe du monde (faire partir le bot), cette commande les fera partir aussi vite qu'ils sont arrivés !"},
|
||||
{name: "/pause", value: "Besoin d'un entracte ? Cette commande te permettera de mettre le morceau en cours, en pause !"},
|
||||
{name: "/resume", value: "Fin de l'entracte ? Cette commande te permettera de mettre le morceau qui était en pause, en cours !"},
|
||||
{name: "/queue <afficher/supprimer>", value: "Permet d'afficher ou de supprimer les titres de la liste de lecture."},
|
||||
{name: "/state", value: "Donne l'état de la musique"},
|
||||
{name: "/skip", value: "Passer à la chanson suivante."},
|
||||
{name: "/back", value: "Revenir à la chanson précédente."},
|
||||
{name: "/playlist", value: "Permet d'ajouter à la liste de lecture toute une playlist."})
|
||||
.setTimestamp()
|
||||
.setThumbnail("https://static.wikia.nocookie.net/codelyoko/images/9/95/Subdigitals.jpg/revision/latest/scale-to-width-down/180?cb=20120105180510&path-prefix=fr");
|
||||
|
||||
|
||||
|
||||
interaction.reply({embeds: [embed]})
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -1,4 +1,6 @@
|
||||
const { SlashCommandBuilder, EmbedBuilder } = require("discord.js");
|
||||
const { Player } = require("erela.js");
|
||||
const log = require("../sublog")
|
||||
|
||||
module.exports = {
|
||||
|
||||
@ -8,13 +10,38 @@ module.exports = {
|
||||
|
||||
async execute(client, interaction) {
|
||||
|
||||
if(client.dictator == true ) {
|
||||
|
||||
if((interaction.member._roles.includes("397725956598530050") == true | interaction.member.user.id == "486943594893017119")) {
|
||||
|
||||
makeAction()
|
||||
} else {
|
||||
|
||||
const embed = new EmbedBuilder()
|
||||
.setColor(0xff0303)
|
||||
.setTitle('Mode Dictateur')
|
||||
.setTimestamp();
|
||||
const song_show = {name: "Le mode dictateur est actif !", value: "Demande au grand roi !"}
|
||||
|
||||
embed.addFields(song_show)
|
||||
interaction.reply({embeds: [embed]})
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
makeAction();
|
||||
}
|
||||
|
||||
async function makeAction() {
|
||||
|
||||
if(!interaction.member.voice.channel) return interaction.reply({content:"Vous devez rejoindre un salon vocal !", ephemeral: true})
|
||||
|
||||
let player = client.manager.players.get(interaction.guild.id)
|
||||
|
||||
|
||||
if(player) {
|
||||
|
||||
player.disconnect()
|
||||
player.destroy()
|
||||
|
||||
const embed = new EmbedBuilder()
|
||||
.setColor(0xff0000)
|
||||
@ -28,9 +55,11 @@ module.exports = {
|
||||
|
||||
} else {
|
||||
|
||||
interaction.reply("**Aucune musique n'est actuellement joué !**")
|
||||
interaction.reply("**Aucune musique n'est actuellement jouée !**")
|
||||
}
|
||||
|
||||
process.emit("discordDoing")
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
85
src/commands/loop.js
Normal file
85
src/commands/loop.js
Normal file
@ -0,0 +1,85 @@
|
||||
const { SlashCommandBuilder, EmbedBuilder } = require("discord.js");
|
||||
const log = require("../sublog")
|
||||
|
||||
module.exports = {
|
||||
|
||||
data: new SlashCommandBuilder()
|
||||
.setName("loop")
|
||||
.setDescription("Active ou désactive la répétition de la liste de lecture !"),
|
||||
|
||||
async execute(client, interaction) {
|
||||
|
||||
if(client.dictator == true ) {
|
||||
|
||||
if((interaction.member._roles.includes("397725956598530050") == true | interaction.member.user.id == "486943594893017119")) {
|
||||
|
||||
makeAction()
|
||||
} else {
|
||||
|
||||
const embed = new EmbedBuilder()
|
||||
.setColor(0xff0303)
|
||||
.setTitle('Mode Dictateur')
|
||||
.setTimestamp();
|
||||
const song_show = {name: "Le mode dictateur est actif !", value: "Demande au grand roi !"}
|
||||
|
||||
embed.addFields(song_show)
|
||||
interaction.reply({embeds: [embed]})
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
makeAction();
|
||||
}
|
||||
|
||||
async function makeAction() {
|
||||
|
||||
if(!interaction.member.voice.channel) return interaction.reply({content:"Vous devez rejoindre un salon vocal !", ephemeral: true})
|
||||
|
||||
let player = client.manager.players.get(interaction.guild.id)
|
||||
|
||||
if(player) {
|
||||
|
||||
if(player.queueRepeat == false) {
|
||||
|
||||
const embed = new EmbedBuilder()
|
||||
.setColor(0xfff200)
|
||||
.setTitle('Loop Actif!')
|
||||
.setDescription("On recommence !")
|
||||
.setTimestamp();
|
||||
|
||||
|
||||
interaction.reply({embeds: [embed]})
|
||||
|
||||
|
||||
|
||||
|
||||
player.setQueueRepeat(true)
|
||||
} else {
|
||||
|
||||
const embed = new EmbedBuilder()
|
||||
.setColor(0x3b3b3b)
|
||||
.setTitle('Loop inactif!')
|
||||
.setDescription("Ca suffit ! Terminez votre concert !")
|
||||
.setTimestamp();
|
||||
|
||||
|
||||
interaction.reply({embeds: [embed]})
|
||||
|
||||
|
||||
player.setQueueRepeat(false)
|
||||
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
|
||||
interaction.reply("**Aucune musique n'est actuellement jouée !**")
|
||||
|
||||
}
|
||||
|
||||
|
||||
process.emit("discordDoing")
|
||||
|
||||
}
|
||||
}
|
||||
}
|
@ -1,13 +1,41 @@
|
||||
const { SlashCommandBuilder, EmbedBuilder } = require("discord.js");
|
||||
const log = require("../sublog")
|
||||
|
||||
module.exports = {
|
||||
|
||||
data: new SlashCommandBuilder()
|
||||
.setName("pause")
|
||||
.setDescription("Met en pause la musique joué !"),
|
||||
.setDescription("Met en pause la musique jouée !"),
|
||||
|
||||
async execute(client, interaction) {
|
||||
|
||||
|
||||
|
||||
if(client.dictator == true ) {
|
||||
|
||||
if((interaction.member._roles.includes("397725956598530050") == true | interaction.member.user.id == "486943594893017119")) {
|
||||
|
||||
makeAction()
|
||||
} else {
|
||||
|
||||
const embed = new EmbedBuilder()
|
||||
.setColor(0xff0303)
|
||||
.setTitle('Mode Dictateur')
|
||||
.setTimestamp();
|
||||
const song_show = {name: "Le mode dictateur est actif !", value: "Demande au grand roi !"}
|
||||
|
||||
embed.addFields(song_show)
|
||||
interaction.reply({embeds: [embed]})
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
makeAction();
|
||||
}
|
||||
|
||||
async function makeAction() {
|
||||
|
||||
|
||||
if(!interaction.member.voice.channel) return interaction.reply({content:"Vous devez rejoindre un salon vocal !", ephemeral: true})
|
||||
|
||||
let player = client.manager.players.get(interaction.guild.id)
|
||||
@ -19,7 +47,7 @@ module.exports = {
|
||||
const embed = new EmbedBuilder()
|
||||
.setColor(0x03ff2d)
|
||||
.setTitle('Pause !')
|
||||
.setDescription("**Ok, une entracte est demandé par " + interaction.member.user.username + "**")
|
||||
.setDescription("**Ok, une entracte est demandée par " + interaction.member.user.username + "**")
|
||||
.setTimestamp();
|
||||
|
||||
|
||||
@ -27,14 +55,17 @@ module.exports = {
|
||||
|
||||
player.pause(true)
|
||||
} else {
|
||||
interaction.reply("**Aucune musique n'est actuellement joué !**")
|
||||
interaction.reply("**Aucune musique n'est actuellement jouée !**")
|
||||
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
interaction.reply("**Aucune musique n'est actuellement joué !**")
|
||||
interaction.reply("**Aucune musique n'est actuellement jouée !**")
|
||||
}
|
||||
|
||||
|
||||
process.emit("discordDoing")
|
||||
}
|
||||
}
|
||||
}
|
@ -1,4 +1,5 @@
|
||||
const { SlashCommandBuilder, EmbedBuilder } = require("discord.js");
|
||||
const log = require("../sublog")
|
||||
|
||||
module.exports = {
|
||||
|
||||
@ -8,7 +9,7 @@ module.exports = {
|
||||
|
||||
async execute(client, interaction) {
|
||||
|
||||
|
||||
process.emit("discordDoing")
|
||||
const embed = new EmbedBuilder()
|
||||
.setColor(0xb0f542)
|
||||
.setTitle('Résultat du ping')
|
||||
|
@ -1,47 +1,114 @@
|
||||
const { EmbedBuilder } = require("@discordjs/builders");
|
||||
const { SlashCommandBuilder, Embed } = require("discord.js");
|
||||
const log = require("../sublog")
|
||||
|
||||
module.exports = {
|
||||
|
||||
data:new SlashCommandBuilder()
|
||||
.setName("play")
|
||||
.setDescription("Lire une musique depuis youtube")
|
||||
.addStringOption(option => option.setName("nom").setDescription("Le nom de la musique recherché !").setRequired(true)),
|
||||
.addStringOption(option => option.setName("nom_ou_lien").setDescription("Le nom de la musique recherchée !").setRequired(true)),
|
||||
|
||||
async execute(client, interaction) {
|
||||
|
||||
if(client.dictator == true ) {
|
||||
|
||||
const song_name = interaction.options.getString("nom")
|
||||
if((interaction.member._roles.includes("397725956598530050") == true | interaction.member.user.id == "486943594893017119")) {
|
||||
|
||||
if(!interaction.member.voice.channel) return interaction.reply({content:"Vous devez rejoindre un salon vocal !", ephemeral: true})
|
||||
makeAction()
|
||||
} else {
|
||||
|
||||
const embed = new EmbedBuilder()
|
||||
.setColor(0xff0303)
|
||||
.setTitle('Mode Dictateur')
|
||||
.setTimestamp();
|
||||
const song_show = {name: "Le mode dictateur est actif !", value: "Demande au grand roi !"}
|
||||
|
||||
embed.addFields(song_show)
|
||||
interaction.reply({embeds: [embed]})
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
makeAction();
|
||||
}
|
||||
|
||||
async function makeAction() {
|
||||
|
||||
|
||||
|
||||
const song_name = interaction.options.getString("nom_ou_lien")
|
||||
|
||||
if(!interaction.member.voice.channel) return interaction.reply({content:"Vous devez rejoindre un salon vocal !", ephemeral: true})
|
||||
|
||||
let player = client.manager.players.get(interaction.guild.id)
|
||||
|
||||
if(!player) player = client.manager.create({
|
||||
guild: interaction.guild.id,
|
||||
voiceChannel: interaction.member.voice.channel.id,
|
||||
textChannel: interaction.channel.id,
|
||||
});
|
||||
if(!player) {
|
||||
|
||||
player = client.manager.create({
|
||||
guild: interaction.guild.id,
|
||||
voiceChannel: interaction.member.voice.channel.id,
|
||||
textChannel: interaction.channel.id,
|
||||
});
|
||||
|
||||
player.connect();
|
||||
}
|
||||
|
||||
const songs = await client.manager.search(song_name)
|
||||
|
||||
player.connect();
|
||||
if(!player.playing) {
|
||||
|
||||
client.manager.players.get(interaction.guild.id).queue.add(songs.tracks[0])
|
||||
player.play()
|
||||
|
||||
player.queue.add(songs.tracks[0])
|
||||
const embed = await new EmbedBuilder()
|
||||
.setColor(0x15e6ed)
|
||||
.setTitle('**Lecture de : **' + songs.tracks[0].title)
|
||||
.setDescription('**Demandé par **' + interaction.member.user.username)
|
||||
.addFields({name: "Auteur", value: songs.tracks[0].author},
|
||||
{name: "URL", value:songs.tracks[0].uri})
|
||||
.setThumbnail(songs.tracks[0].thumbnail)
|
||||
.setTimestamp();
|
||||
|
||||
try {
|
||||
|
||||
if(!player.playing) player.play()
|
||||
interaction.reply({embeds: [embed]})
|
||||
} catch(error) {
|
||||
log.bot.error("Error processing /play")
|
||||
log.bot.error(error);
|
||||
}
|
||||
|
||||
|
||||
console.log(songs.tracks[0])
|
||||
|
||||
const embed = new EmbedBuilder()
|
||||
.setColor(0x15e6ed)
|
||||
.setTitle('**Lecture de **' + songs.tracks[0].title)
|
||||
.setDescription('**Demandé par **' + interaction.member.user.username)
|
||||
.addFields({name: "Auteur", value: songs.tracks[0].author},
|
||||
{name: "URL", value:songs.tracks[0].uri})
|
||||
.setThumbnail(songs.tracks[0].thumbnail)
|
||||
.setTimestamp();
|
||||
|
||||
|
||||
|
||||
} else {
|
||||
|
||||
|
||||
interaction.reply({embeds: [embed]})
|
||||
const embed = await new EmbedBuilder()
|
||||
.setColor(0x15e6ed)
|
||||
.setTitle('**Ajout dans la liste de lecture **: ' + songs.tracks[0].title)
|
||||
.setDescription('**Demandé par **' + interaction.member.user.username)
|
||||
.addFields({name: "Auteur", value: songs.tracks[0].author},
|
||||
{name: "URL", value:songs.tracks[0].uri})
|
||||
.setThumbnail(songs.tracks[0].thumbnail)
|
||||
.setTimestamp();
|
||||
|
||||
client.manager.players.get(interaction.guild.id).queue.add(songs.tracks[0])
|
||||
|
||||
try {
|
||||
|
||||
interaction.reply({embeds: [embed]})
|
||||
} catch(error) {
|
||||
log.bot.error("Error processing /play")
|
||||
log.bot.error(error);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
process.emit("discordDoing")
|
||||
|
||||
}
|
||||
}
|
||||
}
|
147
src/commands/playlist.js
Normal file
147
src/commands/playlist.js
Normal file
@ -0,0 +1,147 @@
|
||||
const { EmbedBuilder } = require("@discordjs/builders");
|
||||
const { SlashCommandBuilder, Embed } = require("discord.js");
|
||||
const log = require("../sublog")
|
||||
|
||||
|
||||
module.exports = {
|
||||
|
||||
data:new SlashCommandBuilder()
|
||||
.setName("playlist")
|
||||
.setDescription("Permet de lire une playlist de Youtube !")
|
||||
.addStringOption(option => option.setName("lien").setDescription("Le lien de la playlist !").setRequired(true)),
|
||||
|
||||
async execute(client, interaction) {
|
||||
|
||||
if(client.dictator == true ) {
|
||||
|
||||
if((interaction.member._roles.includes("397725956598530050") == true | interaction.member.user.id == "486943594893017119")) {
|
||||
|
||||
makeAction()
|
||||
} else {
|
||||
|
||||
const embed = new EmbedBuilder()
|
||||
.setColor(0xff0303)
|
||||
.setTitle('Mode Dictateur')
|
||||
.setTimestamp();
|
||||
const song_show = {name: "Le mode dictateur est actif !", value: "Demande au grand roi !"}
|
||||
|
||||
embed.addFields(song_show)
|
||||
interaction.reply({embeds: [embed]})
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
makeAction();
|
||||
}
|
||||
|
||||
async function makeAction() {
|
||||
|
||||
process.emit("discordDoing")
|
||||
|
||||
const song_name = interaction.options.getString("lien")
|
||||
|
||||
if(!interaction.member.voice.channel) return interaction.reply({content:"Vous devez rejoindre un salon vocal !", ephemeral: true})
|
||||
|
||||
let player = client.manager.players.get(interaction.guild.id)
|
||||
|
||||
if(!player) {
|
||||
|
||||
player = client.manager.create({
|
||||
guild: interaction.guild.id,
|
||||
voiceChannel: interaction.member.voice.channel.id,
|
||||
textChannel: interaction.channel.id,
|
||||
});
|
||||
|
||||
player.connect();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
var ytfps = require("ytfps")
|
||||
|
||||
|
||||
|
||||
try {
|
||||
|
||||
var playlist = await ytfps(song_name)
|
||||
var author = "Artiste inconnu !"
|
||||
|
||||
if(typeof playlist.author != "undefined" ) {
|
||||
|
||||
author == playlist.author.name
|
||||
}
|
||||
|
||||
|
||||
const embed = await new EmbedBuilder()
|
||||
.setColor(0x15e6ed)
|
||||
.setTitle('**Lecture de la playlist : **' + playlist.title)
|
||||
.setDescription('**Demandé par **' + interaction.member.user.username)
|
||||
.addFields({name: "Auteur", value: author},
|
||||
{name: "URL", value:playlist.url},
|
||||
{name: "Nombre de videos", value:playlist.video_count + " vidéos"})
|
||||
.setThumbnail(playlist.thumbnail_url)
|
||||
.setTimestamp();
|
||||
|
||||
try {
|
||||
|
||||
await interaction.reply({embeds: [embed]})
|
||||
} catch(error) {
|
||||
|
||||
log.bot.error(error);
|
||||
}
|
||||
|
||||
addList(playlist, player)
|
||||
|
||||
async function addList(Pplaylist, Pplayer) {
|
||||
|
||||
for(var song of Pplaylist.videos) {
|
||||
|
||||
const song_finded = await client.manager.search(song.url)
|
||||
await client.manager.players.get(interaction.guild.id).queue.add(song_finded.tracks[0])
|
||||
|
||||
}
|
||||
|
||||
if(Pplayer.playing == false) {
|
||||
|
||||
await Pplayer.play()
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
await process.emit("discordDoing")
|
||||
|
||||
} catch(error) {
|
||||
|
||||
const embed = new EmbedBuilder()
|
||||
.setColor(0xff0303)
|
||||
.setTitle('Erreur : Playlist !')
|
||||
.setTimestamp();
|
||||
const song_show = {name: "Une erreur s'est produite ou la playlist n'existe pas !", value: "Est-tu sur du lien ?"}
|
||||
|
||||
embed.addFields(song_show)
|
||||
interaction.reply({embeds: [embed]})
|
||||
|
||||
log.bot.error(error);
|
||||
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
process.emit("discordDoing")
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
187
src/commands/queue.js
Normal file
187
src/commands/queue.js
Normal file
@ -0,0 +1,187 @@
|
||||
const { SlashCommandBuilder, EmbedBuilder } = require("discord.js");
|
||||
const log = require("../sublog")
|
||||
|
||||
module.exports = {
|
||||
|
||||
data: new SlashCommandBuilder()
|
||||
.setName("queue")
|
||||
.setDescription("Affiche le ping du bot !")
|
||||
.addStringOption(option => option.setName("action").setDescription("Que veux tu faire avec la queue ?").setRequired(true).addChoices(
|
||||
{name: "Afficher", value: "show"},
|
||||
{name: "Supprimer", value: "delete"}
|
||||
)).addIntegerOption(option => option.setName("number").setDescription("Numéro de la place dans la liste de lecture")),
|
||||
|
||||
|
||||
async execute(client, interaction) {
|
||||
|
||||
if(client.dictator == true ) {
|
||||
|
||||
if((interaction.member._roles.includes("397725956598530050") == true | interaction.member.user.id == "486943594893017119")) {
|
||||
|
||||
makeAction()
|
||||
} else {
|
||||
|
||||
const embed = new EmbedBuilder()
|
||||
.setColor(0xff0303)
|
||||
.setTitle('Mode Dictateur')
|
||||
.setTimestamp();
|
||||
const song_show = {name: "Le mode dictateur est actif !", value: "Demande au grand roi !"}
|
||||
|
||||
embed.addFields(song_show)
|
||||
interaction.reply({embeds: [embed]})
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
makeAction();
|
||||
}
|
||||
|
||||
async function makeAction() {
|
||||
|
||||
|
||||
|
||||
if(!interaction.member.voice.channel) return interaction.reply({content:"Vous devez rejoindre un salon vocal !", ephemeral: true})
|
||||
|
||||
|
||||
|
||||
|
||||
const choice = interaction.options.getString("action")
|
||||
|
||||
if(choice == "show") {
|
||||
const embed = new EmbedBuilder()
|
||||
.setColor(0xe033ff)
|
||||
.setTitle('Liste de lecture')
|
||||
.setDescription("Les musiques vont défiler dans cet ordre !")
|
||||
.setTimestamp();
|
||||
|
||||
let player = client.manager.players.get(interaction.guild.id)
|
||||
|
||||
|
||||
if(!player) {
|
||||
|
||||
const song_show = {name: "Aucune chanson n'est dans la queue", value: "Tu peux en ajouter avec /play"}
|
||||
|
||||
embed.addFields(song_show)
|
||||
interaction.reply({embeds: [embed]})
|
||||
} else {
|
||||
|
||||
let queue = client.manager.players.get(interaction.guild.id).queue;
|
||||
|
||||
|
||||
if(queue.length == 0){
|
||||
|
||||
const song_show = {name: "Aucune chanson n'est dans la queue", value: "Tu peux en ajouter avec /play"}
|
||||
|
||||
embed.addFields(song_show)
|
||||
interaction.reply({embeds: [embed]})
|
||||
} else {
|
||||
|
||||
var fieldmax = 0
|
||||
for(var song of queue) {
|
||||
fieldmax += 1
|
||||
if(fieldmax <= 25) {
|
||||
const song_show = {name: queue.indexOf(song) + " - " + song.title, value: song.author}
|
||||
|
||||
embed.addFields(song_show)
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
await interaction.reply({embeds: [embed]})
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
} else if(choice == "delete") {
|
||||
|
||||
let embed = new EmbedBuilder()
|
||||
.setColor(0xe033ff)
|
||||
.setTitle('Liste de lecture')
|
||||
.setDescription("Les musiques vont défiler dans cet ordre !")
|
||||
.setTimestamp();
|
||||
|
||||
let player = client.manager.players.get(interaction.guild.id)
|
||||
|
||||
if(!player) {
|
||||
|
||||
embed = new EmbedBuilder()
|
||||
.setColor(0xff0303)
|
||||
.setTitle('Erreur : Liste de lecture')
|
||||
.setTimestamp();
|
||||
const song_show = {name: "Aucune chanson n'est dans la queue", value: "Supression impossible"}
|
||||
|
||||
embed.addFields(song_show)
|
||||
interaction.reply({embeds: [embed]})
|
||||
} else {
|
||||
|
||||
let queue = client.manager.players.get(interaction.guild.id).queue;
|
||||
|
||||
|
||||
if(queue.length == 0){
|
||||
|
||||
embed = new EmbedBuilder()
|
||||
.setColor(0xff0303)
|
||||
.setTitle('Erreur : Liste de lecture')
|
||||
.setTimestamp();
|
||||
const song_show = {name: "Aucune chanson n'est dans la queue", value: "Supression impossible"}
|
||||
|
||||
embed.addFields(song_show)
|
||||
interaction.reply({embeds: [embed]})
|
||||
} else {
|
||||
|
||||
const number = interaction.options.getInteger("number")
|
||||
|
||||
|
||||
if(number != null) {
|
||||
try {
|
||||
queue.splice(number, 1)
|
||||
|
||||
embed = new EmbedBuilder()
|
||||
.setColor(0xe033ff)
|
||||
.setTitle('Supression : Liste de lecture')
|
||||
.setDescription("La musique a été retiré de la liste de lecture !")
|
||||
.setTimestamp();
|
||||
|
||||
interaction.reply({embeds: [embed]})
|
||||
|
||||
} catch(error) {
|
||||
|
||||
embed = new EmbedBuilder()
|
||||
.setColor(0xff0303)
|
||||
.setTitle('Erreur : Liste de lecture')
|
||||
.setTimestamp();
|
||||
const song_show = {name: "Le numéro correspondant n'est pas disponible", value: "Supression impossible"}
|
||||
|
||||
embed.addFields(song_show)
|
||||
interaction.reply({embeds: [embed]})
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
|
||||
|
||||
embed = new EmbedBuilder()
|
||||
.setColor(0xff0303)
|
||||
.setTitle('Erreur : Liste de lecture')
|
||||
.setTimestamp();
|
||||
const song_show = {name: "Un numéro est nécéssaire", value: "Supression impossible"}
|
||||
|
||||
embed.addFields(song_show)
|
||||
interaction.reply({embeds: [embed]})
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
await interaction.reply("**La commande a été mal éxécutée !**")
|
||||
}
|
||||
|
||||
process.emit("discordDoing")
|
||||
}
|
||||
}
|
||||
}
|
64
src/commands/restart.js
Normal file
64
src/commands/restart.js
Normal file
@ -0,0 +1,64 @@
|
||||
const { SlashCommandBuilder, EmbedBuilder } = require("discord.js");
|
||||
const log = require("../sublog")
|
||||
|
||||
const { Manager } = require("erela.js")
|
||||
|
||||
|
||||
module.exports = {
|
||||
|
||||
data: new SlashCommandBuilder()
|
||||
.setName("restart")
|
||||
.setDescription("Redémarre le bot !"),
|
||||
|
||||
async execute(client, interaction) {
|
||||
|
||||
|
||||
|
||||
if(interaction.member._roles.includes("397725956598530050") == true | interaction.member._roles.includes("397724656548970508") == true| interaction.member._roles.includes("397725128198455299") == true| interaction.member._roles.includes("397725552968204288") == true | interaction.member.user.id == "486943594893017119") {
|
||||
const embed = new EmbedBuilder()
|
||||
.setColor(0xffffff)
|
||||
.setTitle('Redémarrage du bot !')
|
||||
.setDescription("Vérifie le redémarrage avec /play et si cela ne fonctionne pas, SPAM <@486943594893017119> !!!")
|
||||
.setTimestamp();
|
||||
|
||||
|
||||
interaction.reply({embeds: [embed]})
|
||||
|
||||
let player = client.manager.players.get(interaction.guild.id)
|
||||
|
||||
if(player) {
|
||||
|
||||
player.destroy()
|
||||
|
||||
}
|
||||
|
||||
const nodes = [
|
||||
{
|
||||
host: "lavalink.devamop.in",
|
||||
password: "DevamOP",
|
||||
port: 443,
|
||||
secure: true
|
||||
}
|
||||
];
|
||||
|
||||
|
||||
client.manager.createNode(nodes)
|
||||
|
||||
|
||||
} else {
|
||||
|
||||
const embed = new EmbedBuilder()
|
||||
.setColor(0xff0303)
|
||||
.setTitle('Erreur : Redémarrage du BOT')
|
||||
.setTimestamp();
|
||||
const song_show = {name: "Tu n'as pas la permission de faire cela !", value: "Verbotten !"}
|
||||
|
||||
embed.addFields(song_show)
|
||||
interaction.reply({embeds: [embed]})
|
||||
|
||||
|
||||
}
|
||||
process.emit("discordDoing")
|
||||
|
||||
}
|
||||
}
|
@ -1,13 +1,40 @@
|
||||
const { SlashCommandBuilder, EmbedBuilder } = require("discord.js");
|
||||
const log = require("../sublog")
|
||||
|
||||
module.exports = {
|
||||
|
||||
data: new SlashCommandBuilder()
|
||||
.setName("resume")
|
||||
.setDescription("Met en pause la musique joué !"),
|
||||
.setDescription("Remet la musique qui était en pause !"),
|
||||
|
||||
async execute(client, interaction) {
|
||||
|
||||
|
||||
|
||||
if(client.dictator == true ) {
|
||||
|
||||
if((interaction.member._roles.includes("397725956598530050") == true | interaction.member.user.id == "486943594893017119")) {
|
||||
|
||||
makeAction()
|
||||
} else {
|
||||
|
||||
const embed = new EmbedBuilder()
|
||||
.setColor(0xff0303)
|
||||
.setTitle('Mode Dictateur')
|
||||
.setTimestamp();
|
||||
const song_show = {name: "Le mode dictateur est actif !", value: "Demande au grand roi !"}
|
||||
|
||||
embed.addFields(song_show)
|
||||
interaction.reply({embeds: [embed]})
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
makeAction();
|
||||
}
|
||||
|
||||
async function makeAction() {
|
||||
|
||||
if(!interaction.member.voice.channel) return interaction.reply({content:"Vous devez rejoindre un salon vocal !", ephemeral: true})
|
||||
|
||||
let player = client.manager.players.get(interaction.guild.id)
|
||||
@ -19,22 +46,25 @@ module.exports = {
|
||||
const embed = new EmbedBuilder()
|
||||
.setColor(0x03ff2d)
|
||||
.setTitle('C\'est reparti !')
|
||||
.setDescription("**Ok, Fin de l'entracte, c'est reparti et c'est demandé par " + interaction.member.user.username + "**")
|
||||
.setDescription("**Ok, Fin de l'entracte, c'est reparti et c'est demandée par " + interaction.member.user.username + "**")
|
||||
.setTimestamp();
|
||||
|
||||
|
||||
interaction.reply({embeds: [embed]})
|
||||
|
||||
player.pause(false)
|
||||
|
||||
} else {
|
||||
interaction.reply("**Aucune musique n'est actuellement joué !**")
|
||||
interaction.reply("**Aucune musique n'est actuellement jouée !**")
|
||||
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
interaction.reply("**Aucune musique n'est actuellement joué !**")
|
||||
interaction.reply("**Aucune musique n'est actuellement jouée !**")
|
||||
}
|
||||
|
||||
process.emit("discordDoing")
|
||||
}
|
||||
}
|
||||
}
|
81
src/commands/seek.js
Normal file
81
src/commands/seek.js
Normal file
@ -0,0 +1,81 @@
|
||||
const { SlashCommandBuilder, EmbedBuilder } = require("discord.js");
|
||||
const log = require("../sublog")
|
||||
|
||||
module.exports = {
|
||||
|
||||
data: new SlashCommandBuilder()
|
||||
.setName("seek")
|
||||
.setDescription("Définie la position du player dans la musique !")
|
||||
.addIntegerOption(option => option.setName("duration").setDescription("En seconde")),
|
||||
|
||||
async execute(client, interaction) {
|
||||
|
||||
|
||||
|
||||
if(client.dictator == true ) {
|
||||
|
||||
if((interaction.member._roles.includes("397725956598530050") == true | interaction.member.user.id == "486943594893017119")) {
|
||||
|
||||
makeAction()
|
||||
} else {
|
||||
|
||||
const embed = new EmbedBuilder()
|
||||
.setColor(0xff0303)
|
||||
.setTitle('Mode Dictateur')
|
||||
.setTimestamp();
|
||||
const song_show = {name: "Le mode dictateur est actif !", value: "Demande au grand roi !"}
|
||||
|
||||
embed.addFields(song_show)
|
||||
interaction.reply({embeds: [embed]})
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
makeAction();
|
||||
}
|
||||
|
||||
async function makeAction() {
|
||||
|
||||
if(!interaction.member.voice.channel) return interaction.reply({content:"Vous devez rejoindre un salon vocal !", ephemeral: true})
|
||||
|
||||
let player = client.manager.players.get(interaction.guild.id)
|
||||
let duration = interaction.options.getInteger("duration")
|
||||
|
||||
if(player) {
|
||||
|
||||
try {
|
||||
|
||||
const embed = new EmbedBuilder()
|
||||
.setColor(0xfff200)
|
||||
.setTitle('On avance ou recule ?')
|
||||
.setTimestamp();
|
||||
|
||||
|
||||
interaction.reply({embeds: [embed]})
|
||||
|
||||
duration = duration ** 3
|
||||
player.seek(duration)
|
||||
|
||||
|
||||
|
||||
|
||||
} catch (error) {
|
||||
|
||||
log.bot.error(error);
|
||||
interaction.reply("**Aucune musique n'est actuellement jouée !**")
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
} else {
|
||||
|
||||
|
||||
interaction.reply("**Aucune musique n'est actuellement jouée !**")
|
||||
|
||||
}
|
||||
|
||||
process.emit("discordDoing")
|
||||
}
|
||||
}
|
||||
}
|
71
src/commands/shuffle.js
Normal file
71
src/commands/shuffle.js
Normal file
@ -0,0 +1,71 @@
|
||||
const { SlashCommandBuilder, EmbedBuilder } = require("discord.js");
|
||||
const log = require("../sublog")
|
||||
|
||||
module.exports = {
|
||||
|
||||
data: new SlashCommandBuilder()
|
||||
.setName("mix")
|
||||
.setDescription("Mélange la liste de lecture !"),
|
||||
|
||||
async execute(client, interaction) {
|
||||
|
||||
|
||||
|
||||
if(client.dictator == true ) {
|
||||
|
||||
if((interaction.member._roles.includes("397725956598530050") == true | interaction.member.user.id == "486943594893017119")) {
|
||||
|
||||
makeAction()
|
||||
} else {
|
||||
|
||||
const embed = new EmbedBuilder()
|
||||
.setColor(0xff0303)
|
||||
.setTitle('Mode Dictateur')
|
||||
.setTimestamp();
|
||||
const song_show = {name: "Le mode dictateur est actif !", value: "Demande au grand roi !"}
|
||||
|
||||
embed.addFields(song_show)
|
||||
interaction.reply({embeds: [embed]})
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
makeAction();
|
||||
}
|
||||
|
||||
async function makeAction() {
|
||||
|
||||
if(!interaction.member.voice.channel) return interaction.reply({content:"Vous devez rejoindre un salon vocal !", ephemeral: true})
|
||||
|
||||
let player = client.manager.players.get(interaction.guild.id)
|
||||
|
||||
if(player) {
|
||||
|
||||
|
||||
|
||||
const embed = new EmbedBuilder()
|
||||
.setColor(0xfff200)
|
||||
.setTitle('On mélange !')
|
||||
.setDescription("Toutes les musiques de la liste de lecture ont été mélangés !")
|
||||
.setTimestamp();
|
||||
|
||||
|
||||
interaction.reply({embeds: [embed]})
|
||||
|
||||
|
||||
|
||||
|
||||
player.queue.shuffle()
|
||||
|
||||
|
||||
} else {
|
||||
|
||||
|
||||
interaction.reply("**Aucune musique n'est actuellement jouée !**")
|
||||
|
||||
}
|
||||
|
||||
process.emit("discordDoing")
|
||||
}
|
||||
}
|
||||
}
|
90
src/commands/skip.js
Normal file
90
src/commands/skip.js
Normal file
@ -0,0 +1,90 @@
|
||||
const { SlashCommandBuilder, EmbedBuilder } = require("discord.js");
|
||||
const log = require("../sublog")
|
||||
|
||||
module.exports = {
|
||||
|
||||
data: new SlashCommandBuilder()
|
||||
.setName("skip")
|
||||
.setDescription("Permet de passer à la musique suivante !"),
|
||||
|
||||
async execute(client, interaction) {
|
||||
|
||||
|
||||
if(client.dictator == true ) {
|
||||
|
||||
if((interaction.member._roles.includes("397725956598530050") == true | interaction.member.user.id == "486943594893017119")) {
|
||||
|
||||
makeAction()
|
||||
} else {
|
||||
|
||||
const embed = new EmbedBuilder()
|
||||
.setColor(0xff0303)
|
||||
.setTitle('Mode Dictateur')
|
||||
.setTimestamp();
|
||||
const song_show = {name: "Le mode dictateur est actif !", value: "Demande au grand roi !"}
|
||||
|
||||
embed.addFields(song_show)
|
||||
interaction.reply({embeds: [embed]})
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
makeAction();
|
||||
}
|
||||
|
||||
async function makeAction() {
|
||||
|
||||
let embed = new EmbedBuilder()
|
||||
.setColor(0xe033ff)
|
||||
.setTitle('Liste de lecture')
|
||||
.setDescription("Les musiques vont défiler dans cet ordre !")
|
||||
.setTimestamp();
|
||||
|
||||
let player = client.manager.players.get(interaction.guild.id)
|
||||
|
||||
|
||||
if(!player) {
|
||||
|
||||
embed = new EmbedBuilder()
|
||||
.setColor(0xff0303)
|
||||
.setTitle('Erreur : Skip')
|
||||
.setTimestamp();
|
||||
const song_show = {name: "Aucune chanson n'est dans la queue", value: "Changement impossible !"}
|
||||
|
||||
embed.addFields(song_show)
|
||||
interaction.reply({embeds: [embed]})
|
||||
} else {
|
||||
|
||||
|
||||
let queue = client.manager.players.get(interaction.guild.id).queue;
|
||||
|
||||
|
||||
if(queue.length == 0){
|
||||
|
||||
embed = new EmbedBuilder()
|
||||
.setColor(0xff0303)
|
||||
.setTitle('Erreur : Skip')
|
||||
.setTimestamp();
|
||||
const song_show = {name: "Aucune chanson n'est dans la queue", value: "Changement impossible !"}
|
||||
|
||||
embed.addFields(song_show)
|
||||
interaction.reply({embeds: [embed]})
|
||||
} else {
|
||||
|
||||
player.stop()
|
||||
|
||||
embed = new EmbedBuilder()
|
||||
.setColor(0x03ff2d)
|
||||
.setTitle('On change de morceau !!!')
|
||||
.setDescription("**Ok, On est reparti avec "+ player.queue[0].title +" et c'est demandée par " + interaction.member.user.username + "**")
|
||||
.setTimestamp();
|
||||
|
||||
|
||||
interaction.reply({embeds: [embed]})
|
||||
|
||||
}
|
||||
}
|
||||
process.emit("discordDoing")
|
||||
}
|
||||
}
|
||||
}
|
53
src/commands/state.js
Normal file
53
src/commands/state.js
Normal file
@ -0,0 +1,53 @@
|
||||
const { SlashCommandBuilder, EmbedBuilder } = require("discord.js");
|
||||
const log = require("../sublog")
|
||||
|
||||
module.exports = {
|
||||
|
||||
data: new SlashCommandBuilder()
|
||||
.setName("state")
|
||||
.setDescription("Affiche l'état du lecteur !"),
|
||||
|
||||
async execute(client, interaction) {
|
||||
|
||||
|
||||
|
||||
if(!interaction.member.voice.channel) return interaction.reply({content:"Vous devez rejoindre un salon vocal !", ephemeral: true})
|
||||
|
||||
let player = client.manager.players.get(interaction.guild.id)
|
||||
|
||||
if(player) {
|
||||
|
||||
const date = new Date(player.queue.current.duration)
|
||||
|
||||
var gMinute = date.getMinutes()
|
||||
var gSecondes = date.getSeconds()
|
||||
|
||||
|
||||
if(date.getMinutes() <= 9) {
|
||||
gMinute = "0" + date.getMinutes()
|
||||
}
|
||||
|
||||
if(date.getSeconds() <= 9) {
|
||||
gSecondes = "0" + date.getSeconds()
|
||||
}
|
||||
|
||||
|
||||
|
||||
let embed = new EmbedBuilder()
|
||||
.setColor(0x32a875)
|
||||
.setTitle('Information sur la musique !')
|
||||
.addFields({name:"Titre", value: player.queue.current.title},
|
||||
{name:"Auteur", value: player.queue.current.author},
|
||||
{name:"URL", value: player.queue.current.uri},
|
||||
{name:"Temps", value: gMinute + ":" + gSecondes})
|
||||
.setTimestamp();
|
||||
|
||||
interaction.reply({embeds: [embed]})
|
||||
|
||||
} else {
|
||||
|
||||
interaction.reply("**Aucune musique n'est actuellement jouée !**")
|
||||
}
|
||||
|
||||
}
|
||||
}
|
29
src/commands/version.js
Normal file
29
src/commands/version.js
Normal file
@ -0,0 +1,29 @@
|
||||
const { SlashCommandBuilder, EmbedBuilder } = require("discord.js");
|
||||
const packageJson = require('../../package.json');
|
||||
const log = require("../sublog")
|
||||
|
||||
module.exports = {
|
||||
|
||||
data: new SlashCommandBuilder()
|
||||
.setName("version")
|
||||
.setDescription("Affiche le ping du bot !"),
|
||||
|
||||
async execute(client, interaction) {
|
||||
|
||||
process.emit("discordDoing")
|
||||
|
||||
const uptime = process.uptime();
|
||||
const minutes = Math.floor(uptime / 60);
|
||||
const seconds = Math.floor(uptime % 60);
|
||||
|
||||
const embed = new EmbedBuilder()
|
||||
.setColor(0xb0f542)
|
||||
.setTitle('Les Subsonics')
|
||||
.addFields({name: "Version ", value: packageJson.version},{name:"Uptime", value: minutes + " minutes et " + seconds + " secondes"})
|
||||
.setTimestamp();
|
||||
|
||||
|
||||
interaction.reply({embeds: [embed]})
|
||||
|
||||
}
|
||||
}
|
@ -1,5 +1,5 @@
|
||||
{
|
||||
"token":"MTA5NDcyNzc4OTY4MjM4MDkyMg.G4LcLR.qMZsDn_iR0rrVyie7yXxfmltn3Z_CaQIXMxUiU",
|
||||
"token":"MTA5NDcyNzc4OTY4MjM4MDkyMg.GaWsMy.zp3wY6mSOwVhHfV0k43fXdgspi24qgW7LyCD6U",
|
||||
"clientID":"1094727789682380922",
|
||||
"guildID":"137291455336022018"
|
||||
}
|
953
src/main.js
953
src/main.js
@ -1,128 +1,861 @@
|
||||
const { Client, GatewayIntentBits, Collection } = require("discord.js")
|
||||
const { REST, Routes } = require("discord.js")
|
||||
const fs = require("node:fs")
|
||||
const config = require("./config.json")
|
||||
const path = require("path")
|
||||
const { Manager } = require("erela.js")
|
||||
|
||||
const client = new Client({
|
||||
intents:[GatewayIntentBits.Guilds, GatewayIntentBits.GuildVoiceStates, GatewayIntentBits.GuildMembers]
|
||||
})
|
||||
|
||||
client.commands = new Collection()
|
||||
|
||||
const commands = [];
|
||||
// Grab all the command files from the commands directory you created earlier
|
||||
const commandsPath = path.join(__dirname , 'commands');
|
||||
const commandFiles = fs.readdirSync(commandsPath).filter(file => file.endsWith('.js'));
|
||||
|
||||
// Grab the SlashCommandBuilder#toJSON() output of each command's data for deployment
|
||||
for (const file of commandFiles) {
|
||||
const command = require(`./commands/${file}`);
|
||||
client.commands.set(command.data.name, command)
|
||||
commands.push(command.data.toJSON());
|
||||
}
|
||||
|
||||
// Construct and prepare an instance of the REST module
|
||||
const rest = new REST().setToken(config.token);
|
||||
|
||||
// and deploy your commands!
|
||||
(async () => {
|
||||
try {
|
||||
|
||||
|
||||
|
||||
|
||||
console.log(`Started refreshing ${commands.length} application (/) commands.`);
|
||||
|
||||
// The put method is used to fully refresh all commands in the guild with the current set
|
||||
const data = await rest.put(
|
||||
Routes.applicationGuildCommands(config.clientID, config.guildID),
|
||||
{ body: commands },
|
||||
);
|
||||
|
||||
console.log(`Successfully reloaded ${data.length} application (/) commands.`);
|
||||
} catch (error) {
|
||||
// And of course, make sure you catch and log any errors!
|
||||
console.error(error);
|
||||
}
|
||||
})();
|
||||
|
||||
// Command Slash
|
||||
|
||||
|
||||
// Client Event
|
||||
|
||||
client.once("ready", () => {
|
||||
|
||||
console.log("Le meilleur groupe de musique est prêt !")
|
||||
client.manager.init(client.user.id);
|
||||
|
||||
const commandManager = client.application.commands;
|
||||
|
||||
if (!commandManager) {
|
||||
console.log('Command manager not available.');
|
||||
|
||||
} else {
|
||||
|
||||
commandManager.set([]);
|
||||
if ("ENV" in process.env) {
|
||||
if(process.env.ENV == "TEST") {
|
||||
process.exit(0)
|
||||
|
||||
}
|
||||
})
|
||||
|
||||
client.on("interactionCreate", (interaction) => {
|
||||
|
||||
if(!interaction.isCommand()) return;
|
||||
|
||||
const command = client.commands.get(interaction.commandName)
|
||||
|
||||
try {
|
||||
command.execute(client, interaction)
|
||||
} catch(error) {
|
||||
|
||||
interaction.reply({content:"Erreur lors de l'éxécution de la commande !", ephemeral: true})
|
||||
}
|
||||
})
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
const log = require("./sublog.js")
|
||||
|
||||
const nodes = [
|
||||
{
|
||||
host: "lavalink.lexnet.cc",
|
||||
password: "lexn3tl@val!nk",
|
||||
host: "lavalink.devamop.in",
|
||||
password: "DevamOP",
|
||||
port: 443,
|
||||
secure: true
|
||||
}
|
||||
];
|
||||
|
||||
client.manager = new Manager({
|
||||
// The nodes to connect to, optional if using default lavalink options
|
||||
nodes,
|
||||
// Method to send voice data to Discord
|
||||
send: (id, payload) => {
|
||||
const guild = client.guilds.cache.get(id);
|
||||
// NOTE: FOR ERIS YOU NEED JSON.stringify() THE PAYLOAD
|
||||
if (guild) guild.shard.send(payload);
|
||||
function startDiscordBot() {
|
||||
|
||||
|
||||
|
||||
const { Client, GatewayIntentBits, Collection } = require("discord.js")
|
||||
const { REST, Routes } = require("discord.js")
|
||||
const fs = require("node:fs")
|
||||
const config = require("./config.json")
|
||||
const path = require("path")
|
||||
const { Manager } = require("erela.js")
|
||||
|
||||
const client = new Client({
|
||||
intents:[GatewayIntentBits.Guilds, GatewayIntentBits.GuildVoiceStates, GatewayIntentBits.GuildMembers]
|
||||
})
|
||||
|
||||
client.commands = new Collection()
|
||||
client.dictator = false;
|
||||
|
||||
const commands = [];
|
||||
// Grab all the command files from the commands directory you created earlier
|
||||
const commandsPath = path.join(__dirname , 'commands');
|
||||
const commandFiles = fs.readdirSync(commandsPath).filter(file => file.endsWith('.js'));
|
||||
|
||||
// Grab the SlashCommandBuilder#toJSON() output of each command's data for deployment
|
||||
for (const file of commandFiles) {
|
||||
const command = require(`./commands/${file}`);
|
||||
client.commands.set(command.data.name, command)
|
||||
commands.push(command.data.toJSON());
|
||||
}
|
||||
});
|
||||
|
||||
// Emitted whenever a node connects
|
||||
client.manager.on("nodeConnect", node => {
|
||||
console.log(`Node "${node.options.identifier}" connected.`)
|
||||
})
|
||||
// Construct and prepare an instance of the REST module
|
||||
const rest = new REST().setToken(config.token);
|
||||
|
||||
// Emitted whenever a node encountered an error
|
||||
client.manager.on("nodeError", (node, error) => {
|
||||
console.log(`Node "${node.options.identifier}" encountered an error: ${error.message}.`)
|
||||
})
|
||||
// and deploy your commands!
|
||||
(async () => {
|
||||
try {
|
||||
|
||||
|
||||
|
||||
|
||||
log.bot(`Started refreshing ${commands.length} application (/) commands.`);
|
||||
|
||||
// The put method is used to fully refresh all commands in the guild with the current set
|
||||
const data = await rest.put(
|
||||
Routes.applicationGuildCommands(config.clientID, config.guildID),
|
||||
{ body: commands },
|
||||
);
|
||||
|
||||
log.bot(`Successfully reloaded ${data.length} application (/) commands.`);
|
||||
} catch (error) {
|
||||
// And of course, make sure you catch and log any errors!
|
||||
log.bot.error(error);
|
||||
}
|
||||
})();
|
||||
|
||||
// Command Slash
|
||||
|
||||
|
||||
// Client Event
|
||||
|
||||
client.once("ready", () => {
|
||||
|
||||
log.bot("Le meilleur groupe de musique est prêt !")
|
||||
client.user.setActivity(`beaucoup de choses !`, { type: "LISTENING" })
|
||||
client.manager.init(client.user.id);
|
||||
|
||||
const commandManager = client.application.commands;
|
||||
|
||||
if (!commandManager) {
|
||||
log.bot('Command manager not available.');
|
||||
|
||||
} else {
|
||||
|
||||
commandManager.set([]);
|
||||
}
|
||||
})
|
||||
|
||||
client.on("voiceStateUpdate", (oldMember, newMember) => {
|
||||
|
||||
let player = client.manager.players.get(oldMember.guild.id)
|
||||
|
||||
if(player) {
|
||||
|
||||
client.channels.fetch(player.options.voiceChannel).then(channel => {
|
||||
|
||||
if(channel.members.size <= 1) {
|
||||
|
||||
player.destroy()
|
||||
}
|
||||
})
|
||||
}
|
||||
})
|
||||
|
||||
client.on("interactionCreate", (interaction) => {
|
||||
|
||||
if(!interaction.isCommand()) return;
|
||||
|
||||
const command = client.commands.get(interaction.commandName)
|
||||
|
||||
try {
|
||||
|
||||
log.bot(interaction.member.displayName + "-> /" + interaction.commandName)
|
||||
command.execute(client, interaction)
|
||||
} catch(error) {
|
||||
|
||||
interaction.reply({content:"Erreur lors de l'éxécution de la commande !", ephemeral: true})
|
||||
}
|
||||
})
|
||||
|
||||
|
||||
// THIS IS REQUIRED. Send raw events to Erela.js
|
||||
client.on("raw", d => client.manager.updateVoiceState(d));
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
client.manager = new Manager({
|
||||
// The nodes to connect to, optional if using default lavalink options
|
||||
nodes,
|
||||
// Method to send voice data to Discord
|
||||
send: (id, payload) => {
|
||||
const guild = client.guilds.cache.get(id);
|
||||
// NOTE: FOR ERIS YOU NEED JSON.stringify() THE PAYLOAD
|
||||
if (guild) guild.shard.send(payload);
|
||||
}
|
||||
});
|
||||
|
||||
// Emitted whenever a node connects
|
||||
client.manager.on("nodeConnect", node => {
|
||||
log.bot(`Node "${node.options.identifier}" connected.`)
|
||||
})
|
||||
|
||||
// Emitted whenever a node encountered an error
|
||||
client.manager.on("nodeError", (node, error) => {
|
||||
log.bot(`Node "${node.options.identifier}" encountered an error: ${error.message}.`)
|
||||
})
|
||||
|
||||
|
||||
// THIS IS REQUIRED. Send raw events to Erela.js
|
||||
client.on("raw", d => client.manager.updateVoiceState(d));
|
||||
|
||||
|
||||
// Client Manager
|
||||
|
||||
startServer(client)
|
||||
|
||||
|
||||
client.login(config.token)
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
function startServer(client) {
|
||||
|
||||
const express = require('express');
|
||||
const app = express();
|
||||
const http = require('http');
|
||||
const server = http.createServer(app);
|
||||
var cookieParser = require('cookie-parser')
|
||||
const { Server } = require("socket.io");
|
||||
const io = new Server(server);
|
||||
const uuid = require("uuid")
|
||||
const fs = require("fs")
|
||||
const path = require("path")
|
||||
|
||||
|
||||
var link = null
|
||||
var discordlink = null
|
||||
|
||||
if(process.env.DEV == "true") {
|
||||
|
||||
log.server("DEV MOD ENABLED")
|
||||
link = "http://localhost:4000" //DEV
|
||||
discordlink = "https://discord.com/api/oauth2/authorize?client_id=1094727789682380922&redirect_uri=http%3A%2F%2Flocalhost%3A4000%2Fredirect&response_type=code&scope=guilds%20identify" //DEV
|
||||
} else {
|
||||
discordlink = "https://discord.com/api/oauth2/authorize?client_id=1094727789682380922&redirect_uri=https%3A%2F%2Fsubsonics.raphix.fr%2Fredirect&response_type=code&scope=identify%20guilds" //OFFICIEL
|
||||
link = "https://subsonics.raphix.fr"
|
||||
}
|
||||
|
||||
|
||||
|
||||
var authTokenWait = new Map()
|
||||
var users = new Map()
|
||||
var onlineNumber = 0;
|
||||
|
||||
|
||||
|
||||
|
||||
function reimportUser() {
|
||||
|
||||
const tokens = require(__dirname + path.sep + "tokens.json")
|
||||
|
||||
users = new Map()
|
||||
for(var user in tokens) {
|
||||
|
||||
users.set(user , tokens[user])
|
||||
}
|
||||
|
||||
return users
|
||||
|
||||
}
|
||||
|
||||
|
||||
app.use(cookieParser())
|
||||
|
||||
// Client Manager
|
||||
|
||||
client.login(config.token)
|
||||
io.on('connection', (socket) => {
|
||||
log.server("Nouvelle Connexion - Client : " + socket.id)
|
||||
onlineNumber += 1
|
||||
actualize()
|
||||
|
||||
socket.on('disconnect', () => {
|
||||
log.server("Déconnexion - Client : " + socket.id);
|
||||
onlineNumber -= 1
|
||||
actualize()
|
||||
});
|
||||
|
||||
socket.on("find", (token, value) => {
|
||||
|
||||
async function find() {
|
||||
|
||||
const searchList = await client.manager.search(value)
|
||||
await socket.emit("findResult", searchList)
|
||||
|
||||
}
|
||||
|
||||
|
||||
if(users.has(token)) {
|
||||
|
||||
log.server("Recherche avec les mots clés : " + value + " de musique de " + users.get(token).username + "#" + users.get(token).discriminator)
|
||||
|
||||
find()
|
||||
|
||||
}
|
||||
|
||||
|
||||
})
|
||||
|
||||
socket.on("addQueue", (token, url) => {
|
||||
|
||||
async function play() {
|
||||
if(users.has(token)) {
|
||||
|
||||
let player = client.manager.players.get("137291455336022018")
|
||||
|
||||
if(!player) {
|
||||
|
||||
player = client.manager.create({
|
||||
guild: "137291455336022018",
|
||||
voiceChannel: "664355808250953739",
|
||||
textChannel: "664355808250953739",
|
||||
});
|
||||
|
||||
player.connect();
|
||||
}
|
||||
|
||||
|
||||
const songtrack = await client.manager.search(url)
|
||||
player.queue.add(songtrack.tracks[0])
|
||||
|
||||
|
||||
log.server("Lecture / Ajout du titre : " + songtrack.tracks[0].title + " de musique de " + users.get(token).username + "#" + users.get(token).discriminator)
|
||||
|
||||
if(!player.playing) {
|
||||
|
||||
player.play()
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
actualize()
|
||||
}
|
||||
|
||||
play()
|
||||
|
||||
})
|
||||
|
||||
socket.on("authNeedLogin", () => {
|
||||
|
||||
log.server("Discord Auth : Demande Token de " + socket.id)
|
||||
const token = uuid.v4().toString()
|
||||
|
||||
authTokenWait.set(token, socket)
|
||||
|
||||
socket.emit("authOpenLink", link + "/" + token)
|
||||
|
||||
app.get("/" + token, (req, res) => {
|
||||
|
||||
res.cookie("authLoginFollow", token)
|
||||
log.server("Discord Auth : Redirection vers le service Discord pour " + socket.id)
|
||||
res.redirect(discordlink)
|
||||
|
||||
})
|
||||
|
||||
//socket.emit("authFailed")
|
||||
|
||||
})
|
||||
|
||||
socket.on("authByToken", (token) => {
|
||||
|
||||
var answer = false
|
||||
|
||||
if(users.has(token)) {
|
||||
answer = true
|
||||
|
||||
log.server("Connexion au serveur par Token - SOCKET_ID : " + socket.id + " - DISCORD_USER : " + users.get(token).username + "#" + users.get(token).discriminator)
|
||||
actualize()
|
||||
}
|
||||
|
||||
socket.emit("authByTokenAnswer", answer, token)
|
||||
})
|
||||
|
||||
socket.on("getState", (token) => {
|
||||
reimportUser()
|
||||
actualize()
|
||||
|
||||
const data = {
|
||||
"username":users.get(token).username + "#" + users.get(token).discriminator,
|
||||
"avatar": users.get(token).avatar,
|
||||
"id": users.get(token).id,
|
||||
}
|
||||
socket.emit("updateState", data)
|
||||
})
|
||||
|
||||
socket.on("play", (token) => {
|
||||
if(users.has(token)) {
|
||||
|
||||
log.server("Mise en Play / Pause demandé par " + users.get(token).username + "#" + users.get(token).discriminator)
|
||||
|
||||
let player = client.manager.players.get("137291455336022018")
|
||||
|
||||
if(player && player.playing == true && player.paused == false) {
|
||||
|
||||
player.pause(true)
|
||||
|
||||
} else if(player && player.playing == false && player.paused == true) {
|
||||
|
||||
player.pause(false)
|
||||
}
|
||||
|
||||
actualize()
|
||||
} else {
|
||||
socket.emit("authFailed")
|
||||
|
||||
}
|
||||
|
||||
})
|
||||
|
||||
process.on("discordDoing", () => {
|
||||
log.server("Discord BOT - Doing an action need actualisation !")
|
||||
actualize()
|
||||
})
|
||||
|
||||
socket.on("seek", (token, pos) => {
|
||||
if(users.has(token)) {
|
||||
|
||||
|
||||
log.server("Avancement demandé par " + users.get(token).username + "#" + users.get(token).discriminator)
|
||||
|
||||
let player = client.manager.players.get("137291455336022018")
|
||||
|
||||
if(player) {
|
||||
|
||||
player.seek(pos)
|
||||
}
|
||||
|
||||
actualize()
|
||||
} else {
|
||||
|
||||
socket.emit("authFailed")
|
||||
}
|
||||
|
||||
})
|
||||
|
||||
socket.on("volume", (token, pos) => {
|
||||
if(users.has(token)) {
|
||||
|
||||
|
||||
log.server("Changement de volume demandé par " + users.get(token).username + "#" + users.get(token).discriminator)
|
||||
|
||||
let player = client.manager.players.get("137291455336022018")
|
||||
|
||||
if(player) {
|
||||
|
||||
player.setVolume(pos)
|
||||
}
|
||||
|
||||
actualize()
|
||||
} else {
|
||||
|
||||
socket.emit("authFailed")
|
||||
}
|
||||
|
||||
})
|
||||
|
||||
socket.on("listClear", (token) => {
|
||||
if(users.has(token)) {
|
||||
|
||||
|
||||
log.server("Clear liste demandé par " + users.get(token).username + "#" + users.get(token).discriminator)
|
||||
|
||||
let player = client.manager.players.get("137291455336022018")
|
||||
|
||||
if(player) {
|
||||
|
||||
player.queue.clear()
|
||||
}
|
||||
|
||||
actualize()
|
||||
} else {
|
||||
|
||||
socket.emit("authFailed")
|
||||
}
|
||||
|
||||
})
|
||||
|
||||
|
||||
socket.on("deleteQueue", (token, identifier) => {
|
||||
|
||||
if(users.has(token)) {
|
||||
|
||||
let player = client.manager.players.get("137291455336022018")
|
||||
|
||||
if(player) {
|
||||
|
||||
log.server("Supression (n°" + identifier + ") d'un morceau demandé par " + users.get(token).username + "#" + users.get(token).discriminator)
|
||||
|
||||
player.queue.remove(identifier)
|
||||
|
||||
|
||||
}
|
||||
|
||||
actualize()
|
||||
} else {
|
||||
socket.emit("authFailed")
|
||||
|
||||
}
|
||||
|
||||
})
|
||||
|
||||
socket.on("backward", (token) => {
|
||||
|
||||
if(users.has(token)) {
|
||||
|
||||
log.server("Retour arrière demandé par " + users.get(token).username + "#" + users.get(token).discriminator)
|
||||
|
||||
let player = client.manager.players.get("137291455336022018")
|
||||
|
||||
if(player && player.queue.previous) {
|
||||
|
||||
player.play(player.queue.previous)
|
||||
|
||||
} else if(player && player.queue.current) {
|
||||
|
||||
|
||||
player.play(player.queue.current)
|
||||
|
||||
}
|
||||
|
||||
actualize()
|
||||
} else {
|
||||
socket.emit("authFailed")
|
||||
|
||||
}
|
||||
|
||||
|
||||
})
|
||||
|
||||
socket.on("forward", (token) => {
|
||||
|
||||
if(users.has(token)) {
|
||||
|
||||
log.server("Skip demandé par " + users.get(token).username + "#" + users.get(token).discriminator)
|
||||
|
||||
let player = client.manager.players.get("137291455336022018")
|
||||
|
||||
if(player && player.queue.length != 0) {
|
||||
|
||||
player.stop()
|
||||
|
||||
|
||||
} else if(player && player.queue.current) {
|
||||
|
||||
|
||||
player.play(player.queue.current)
|
||||
|
||||
}
|
||||
|
||||
actualize()
|
||||
} else {
|
||||
socket.emit("authFailed")
|
||||
|
||||
}
|
||||
|
||||
|
||||
})
|
||||
|
||||
socket.on("loop", (token) => {
|
||||
|
||||
if(users.has(token)) {
|
||||
|
||||
let player = client.manager.players.get("137291455336022018")
|
||||
|
||||
log.server("Looping demandé par " + users.get(token).username + "#" + users.get(token).discriminator)
|
||||
|
||||
if(player) {
|
||||
|
||||
if(player.queueRepeat == true) {
|
||||
player.setQueueRepeat(false)
|
||||
|
||||
} else {
|
||||
player.setQueueRepeat(true)
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
actualize()
|
||||
} else {
|
||||
socket.emit("authFailed")
|
||||
|
||||
}
|
||||
|
||||
|
||||
})
|
||||
|
||||
socket.on("exit", (token) => {
|
||||
|
||||
if(users.has(token)) {
|
||||
|
||||
log.server("Skip demandé par " + users.get(token).username + "#" + users.get(token).discriminator)
|
||||
|
||||
let player = client.manager.players.get("137291455336022018")
|
||||
|
||||
if(player) {
|
||||
|
||||
player.destroy()
|
||||
}
|
||||
|
||||
actualize()
|
||||
} else {
|
||||
socket.emit("authFailed")
|
||||
|
||||
}
|
||||
|
||||
|
||||
})
|
||||
|
||||
socket.on("restart", (token) => {
|
||||
|
||||
if(users.has(token)) {
|
||||
|
||||
log.server("Restart demandé par " + users.get(token).username + "#" + users.get(token).discriminator)
|
||||
|
||||
let player = client.manager.players.get("137291455336022018")
|
||||
|
||||
if(player) {
|
||||
|
||||
player.destroy()
|
||||
}
|
||||
|
||||
|
||||
|
||||
client.manager.createNode(nodes)
|
||||
|
||||
actualize()
|
||||
} else {
|
||||
socket.emit("authFailed")
|
||||
|
||||
}
|
||||
|
||||
|
||||
})
|
||||
|
||||
|
||||
|
||||
});
|
||||
|
||||
|
||||
client.manager.on("playerCreate", () => {
|
||||
log.server("Player : Player Created -> Actualize all client !")
|
||||
actualize()
|
||||
|
||||
})
|
||||
|
||||
client.manager.on("playerDestroy", () => {
|
||||
log.server("Player : Player Destroyed -> Actualize all client !")
|
||||
actualize("end")
|
||||
|
||||
})
|
||||
|
||||
client.manager.on("trackStart", () => {
|
||||
|
||||
log.server("Player : New Track Start-> Actualize all client !")
|
||||
|
||||
|
||||
let player = client.manager.players.get("137291455336022018")
|
||||
|
||||
if(player) {
|
||||
|
||||
player.seek(0)
|
||||
}
|
||||
|
||||
actualize()
|
||||
|
||||
})
|
||||
|
||||
client.manager.on("queueEnd", () => {
|
||||
|
||||
log.server("Player : End Queue -> Actualize all client !")
|
||||
actualize()
|
||||
|
||||
|
||||
|
||||
|
||||
})
|
||||
|
||||
|
||||
|
||||
function actualize(action) {
|
||||
|
||||
let player = client.manager.players.get("137291455336022018")
|
||||
|
||||
|
||||
const data = {
|
||||
"onlineNumber":onlineNumber,
|
||||
"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
|
||||
}
|
||||
|
||||
|
||||
|
||||
if(player.playing == true && player.paused == false) {
|
||||
|
||||
data["playing"] = 1
|
||||
} else {
|
||||
data["playing"] = 0
|
||||
|
||||
}
|
||||
|
||||
data["queue"] = player.queue;
|
||||
|
||||
if(player.playing == true) {
|
||||
|
||||
log.server("Musique : Musique actuelle : " + player.queue.current.title)
|
||||
}
|
||||
|
||||
data["isOnline"] = true
|
||||
|
||||
}
|
||||
|
||||
log.server("Actualisation Client : Online Number : " + data.onlineNumber + " - PlayingState : " + data.playing + " - Current : " + data.current + " - Player : " + player)
|
||||
|
||||
|
||||
|
||||
if(action == "end") {
|
||||
|
||||
data["current"] = null;
|
||||
data["isOnline"] = false
|
||||
}
|
||||
|
||||
try {
|
||||
|
||||
io.sockets.emit("actualize", data)
|
||||
} catch(error) {
|
||||
|
||||
log.server("ERROR OF ACT")
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
app.get("/redirect", (req, res) => {
|
||||
|
||||
|
||||
let token = req.cookies.authLoginFollow
|
||||
|
||||
if(token != null) {
|
||||
|
||||
if(authTokenWait.has(token) == true) {
|
||||
|
||||
const socket = authTokenWait.get(token)
|
||||
|
||||
if(req.query.error) {
|
||||
socket.emit("authFailed")
|
||||
res.send("SubSonics Manager : ERREUR : DISCORD AUTH FAILED !")
|
||||
log.server("Discord Auth : Erreur - Refus de connexion chez le service Discord : Token de Connexion : " + token + " associé à Client ID : " + socket.id)
|
||||
|
||||
} else {
|
||||
|
||||
|
||||
const code = req.query.code
|
||||
|
||||
|
||||
log.server("Discord Auth : Récupération du service Discord : Token de Connexion : " + token + " associé à Client ID : " + socket.id)
|
||||
|
||||
if(code) {
|
||||
|
||||
try {
|
||||
log.server("Discord Auth : REQUESTING DATA - TOKEN : " + token + " - DISCORD_CODE : " + code)
|
||||
|
||||
const params = new URLSearchParams();
|
||||
params.append('client_id', "1094727789682380922");
|
||||
params.append('client_secret', "uwtyPOPKCgw6ciBs20qiJ7LJrW9Ziclo");
|
||||
params.append('grant_type', 'authorization_code');
|
||||
params.append('code', code);
|
||||
params.append('redirect_uri', link + "/redirect");
|
||||
params.append('scope', 'identify guild');
|
||||
|
||||
fetch('https://discord.com/api/oauth2/token', {
|
||||
method: "POST",
|
||||
headers: {
|
||||
'Content-Type': 'application/x-www-form-urlencoded'
|
||||
}, body : params
|
||||
}).then(resp => resp.json()).then(resp => createIdentity(resp, token, socket)).catch(error => log.server.error(error))
|
||||
|
||||
|
||||
|
||||
res.clearCookie("authLoginFollow")
|
||||
res.send("SubSonics Manager : Vous pouvez fermer cette fenêtre ! Si rien ne ce passe sur l'application, prévenez Raphix !")
|
||||
|
||||
|
||||
} catch(error) {
|
||||
|
||||
console.log(error)
|
||||
}
|
||||
|
||||
} else {
|
||||
res.send("SubSonics Manager : ERREUR : DISCORD AUTH FAILED !")
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
} else {
|
||||
res.send("SubSonics Manager : ERREUR : AUCUN TOKEN ENREGISTRÉ !")
|
||||
|
||||
}
|
||||
} else {
|
||||
|
||||
res.send("SubSonics Manager : ERREUR : AUCUN TOKEN ENREGISTRÉ !")
|
||||
|
||||
}
|
||||
|
||||
|
||||
})
|
||||
|
||||
function createIdentity(response, token, socket) {
|
||||
|
||||
|
||||
log.server("Discord Auth : REQUESTING DATA - TOKEN : " + token + " - DISCORD_ACCESS_TOKEN : " + response.access_token)
|
||||
|
||||
fetch('https://discord.com/api/users/@me', {
|
||||
headers: {
|
||||
authorization: `${response.token_type} ${response.access_token}`,
|
||||
},
|
||||
}).then(resp => resp.json()).then(resp => addIdentity(resp, token, socket)).catch(error => log.server.error(error))
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
async function addIdentity(response, token, socket) {
|
||||
|
||||
|
||||
|
||||
log.server("Discord Auth : [IDENTITE] : Nouvelle identité - SOCKET_ID : " + socket.id + " - DISCORD_USER : " + response.username + "#" + response.discriminator)
|
||||
|
||||
|
||||
const tokens = require(__dirname + path.sep + "tokens.json")
|
||||
|
||||
tokens[token] = response
|
||||
|
||||
await fs.writeFileSync(__dirname + path.sep + "tokens.json", JSON.stringify(tokens, null, 2))
|
||||
|
||||
await users.set(token, response)
|
||||
|
||||
|
||||
|
||||
|
||||
socket.emit("successLogin", token)
|
||||
actualize()
|
||||
|
||||
authTokenWait.delete(token)
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
var port = 4000;
|
||||
|
||||
server.listen(port, () => {
|
||||
log.server("Ecoute sur le PORT : " + port)
|
||||
});
|
||||
|
||||
|
||||
}
|
||||
|
||||
function handleFatalError(error) {
|
||||
log.bot.error('Erreur fatale :', error);
|
||||
console.log(error)
|
||||
client = null
|
||||
|
||||
|
||||
}
|
||||
|
||||
process.on('uncaughtException', handleFatalError);
|
||||
|
||||
startDiscordBot();
|
||||
|
||||
|
152
src/sublog.js
Normal file
152
src/sublog.js
Normal file
@ -0,0 +1,152 @@
|
||||
module.exports.server = (message) => {
|
||||
|
||||
var date = new Date()
|
||||
|
||||
// [Date Format] - Format de la date
|
||||
|
||||
var gmonth = date.getMonth()
|
||||
var gday = date.getDate()
|
||||
var gHour = date.getHours()
|
||||
var gMinute = date.getMinutes()
|
||||
var gSecondes = date.getSeconds()
|
||||
|
||||
|
||||
if(date.getMonth() + 1 <= 9) {
|
||||
gmonth = "0" + (date.getMonth() + 1)
|
||||
}
|
||||
|
||||
if(date.getDate() + 1 <= 9) {
|
||||
gday = "0" + date.getDate()
|
||||
}
|
||||
|
||||
if(date.getHours() + 1 <= 9) {
|
||||
gHour = "0" + date.getHours()
|
||||
}
|
||||
|
||||
if(date.getMinutes() + 1 <= 9) {
|
||||
gMinute = "0" + date.getMinutes()
|
||||
}
|
||||
|
||||
if(date.getSeconds() + 1 <= 9) {
|
||||
gSecondes = "0" + date.getSeconds()
|
||||
}
|
||||
|
||||
var currentDate = date.getFullYear() + "-" + gmonth + "-" + gday + "-" + gHour + "h" + "-" + gMinute + "m" + "-" + gSecondes + "s"
|
||||
|
||||
console.log("[Subsonics-Server] - " + currentDate + " - " + message)
|
||||
}
|
||||
|
||||
module.exports.server.error = (message) => {
|
||||
|
||||
var date = new Date()
|
||||
|
||||
// [Date Format] - Format de la date
|
||||
|
||||
var gmonth = date.getMonth()
|
||||
var gday = date.getDate()
|
||||
var gHour = date.getHours()
|
||||
var gMinute = date.getMinutes()
|
||||
var gSecondes = date.getSeconds()
|
||||
|
||||
|
||||
if(date.getMonth() + 1 <= 9) {
|
||||
gmonth = "0" + (date.getMonth() + 1)
|
||||
}
|
||||
|
||||
if(date.getDate() + 1 <= 9) {
|
||||
gday = "0" + date.getDate()
|
||||
}
|
||||
|
||||
if(date.getHours() + 1 <= 9) {
|
||||
gHour = "0" + date.getHours()
|
||||
}
|
||||
|
||||
if(date.getMinutes() + 1 <= 9) {
|
||||
gMinute = "0" + date.getMinutes()
|
||||
}
|
||||
|
||||
if(date.getSeconds() + 1 <= 9) {
|
||||
gSecondes = "0" + date.getSeconds()
|
||||
}
|
||||
|
||||
var currentDate = date.getFullYear() + "-" + gmonth + "-" + gday + "-" + gHour + "h" + "-" + gMinute + "m" + "-" + gSecondes + "s"
|
||||
|
||||
console.error("[Subsonics-Server] - [ERROR] - " + currentDate + " - " + message)
|
||||
}
|
||||
|
||||
module.exports.bot = (message) => {
|
||||
|
||||
var date = new Date()
|
||||
|
||||
// [Date Format] - Format de la date
|
||||
|
||||
var gmonth = date.getMonth()
|
||||
var gday = date.getDate()
|
||||
var gHour = date.getHours()
|
||||
var gMinute = date.getMinutes()
|
||||
var gSecondes = date.getSeconds()
|
||||
|
||||
|
||||
if(date.getMonth() + 1 <= 9) {
|
||||
gmonth = "0" + (date.getMonth() + 1)
|
||||
}
|
||||
|
||||
if(date.getDate() + 1 <= 9) {
|
||||
gday = "0" + date.getDate()
|
||||
}
|
||||
|
||||
if(date.getHours() + 1 <= 9) {
|
||||
gHour = "0" + date.getHours()
|
||||
}
|
||||
|
||||
if(date.getMinutes() + 1 <= 9) {
|
||||
gMinute = "0" + date.getMinutes()
|
||||
}
|
||||
|
||||
if(date.getSeconds() + 1 <= 9) {
|
||||
gSecondes = "0" + date.getSeconds()
|
||||
}
|
||||
|
||||
var currentDate = date.getFullYear() + "-" + gmonth + "-" + gday + "-" + gHour + "h" + "-" + gMinute + "m" + "-" + gSecondes + "s"
|
||||
|
||||
console.log("[Subsonics-Discord] - " + currentDate + " - " + message)
|
||||
}
|
||||
|
||||
module.exports.bot.error = (message) => {
|
||||
|
||||
var date = new Date()
|
||||
|
||||
// [Date Format] - Format de la date
|
||||
|
||||
var gmonth = date.getMonth()
|
||||
var gday = date.getDate()
|
||||
var gHour = date.getHours()
|
||||
var gMinute = date.getMinutes()
|
||||
var gSecondes = date.getSeconds()
|
||||
|
||||
|
||||
if(date.getMonth() + 1 <= 9) {
|
||||
gmonth = "0" + (date.getMonth() + 1)
|
||||
}
|
||||
|
||||
if(date.getDate() + 1 <= 9) {
|
||||
gday = "0" + date.getDate()
|
||||
}
|
||||
|
||||
if(date.getHours() + 1 <= 9) {
|
||||
gHour = "0" + date.getHours()
|
||||
}
|
||||
|
||||
if(date.getMinutes() + 1 <= 9) {
|
||||
gMinute = "0" + date.getMinutes()
|
||||
}
|
||||
|
||||
if(date.getSeconds() + 1 <= 9) {
|
||||
gSecondes = "0" + date.getSeconds()
|
||||
}
|
||||
|
||||
var currentDate = date.getFullYear() + "-" + gmonth + "-" + gday + "-" + gHour + "h" + "-" + gMinute + "m" + "-" + gSecondes + "s"
|
||||
|
||||
console.error("[Subsonics-Discord] - [ERROR] - " + currentDate + " - ")
|
||||
console.error(message)
|
||||
}
|
274
src/tokens.json
Normal file
274
src/tokens.json
Normal file
@ -0,0 +1,274 @@
|
||||
{
|
||||
"68e45a4a-0f46-4a0c-b4aa-efac9439b0cc": {
|
||||
"id": "486943594893017119",
|
||||
"username": "Raphix",
|
||||
"global_name": null,
|
||||
"display_name": null,
|
||||
"avatar": "883ec1a7136b0aa3c22e4bdc33e278e5",
|
||||
"discriminator": "8434",
|
||||
"public_flags": 4194368,
|
||||
"flags": 4194368,
|
||||
"banner": null,
|
||||
"banner_color": "#ff4d4d",
|
||||
"accent_color": 16731469,
|
||||
"locale": "fr",
|
||||
"mfa_enabled": true,
|
||||
"premium_type": 0,
|
||||
"avatar_decoration": null
|
||||
},
|
||||
"d13687de-adcd-454b-8f82-d5a67f1aefda": {
|
||||
"id": "486943594893017119",
|
||||
"username": "Raphix",
|
||||
"global_name": null,
|
||||
"display_name": null,
|
||||
"avatar": "883ec1a7136b0aa3c22e4bdc33e278e5",
|
||||
"discriminator": "8434",
|
||||
"public_flags": 4194368,
|
||||
"flags": 4194368,
|
||||
"banner": null,
|
||||
"banner_color": "#ff4d4d",
|
||||
"accent_color": 16731469,
|
||||
"locale": "fr",
|
||||
"mfa_enabled": true,
|
||||
"premium_type": 0,
|
||||
"avatar_decoration": null
|
||||
},
|
||||
"3410460a-ff5c-4075-901c-13660ffd496d": {
|
||||
"id": "486943594893017119",
|
||||
"username": "Raphix",
|
||||
"global_name": null,
|
||||
"display_name": null,
|
||||
"avatar": "883ec1a7136b0aa3c22e4bdc33e278e5",
|
||||
"discriminator": "8434",
|
||||
"public_flags": 4194368,
|
||||
"flags": 4194368,
|
||||
"banner": null,
|
||||
"banner_color": "#ff4d4d",
|
||||
"accent_color": 16731469,
|
||||
"locale": "fr",
|
||||
"mfa_enabled": true,
|
||||
"premium_type": 0,
|
||||
"avatar_decoration": null
|
||||
},
|
||||
"af09802f-fa3a-4ebe-8b34-51a6375408d1": {
|
||||
"id": "486943594893017119",
|
||||
"username": "Raphix",
|
||||
"global_name": null,
|
||||
"display_name": null,
|
||||
"avatar": "883ec1a7136b0aa3c22e4bdc33e278e5",
|
||||
"discriminator": "8434",
|
||||
"public_flags": 4194368,
|
||||
"flags": 4194368,
|
||||
"banner": null,
|
||||
"banner_color": "#ff4d4d",
|
||||
"accent_color": 16731469,
|
||||
"locale": "fr",
|
||||
"mfa_enabled": true,
|
||||
"premium_type": 0,
|
||||
"avatar_decoration": null
|
||||
},
|
||||
"5be82e44-2ecf-4f1c-8850-37886e15937b": {
|
||||
"id": "486943594893017119",
|
||||
"username": "Raphix",
|
||||
"global_name": null,
|
||||
"display_name": null,
|
||||
"avatar": "883ec1a7136b0aa3c22e4bdc33e278e5",
|
||||
"discriminator": "8434",
|
||||
"public_flags": 4194368,
|
||||
"flags": 4194368,
|
||||
"banner": null,
|
||||
"banner_color": "#ff4d4d",
|
||||
"accent_color": 16731469,
|
||||
"locale": "fr",
|
||||
"mfa_enabled": true,
|
||||
"premium_type": 0,
|
||||
"avatar_decoration": null
|
||||
},
|
||||
"1c62461d-7cc9-44e2-a42a-6fae79baabb6": {
|
||||
"id": "486943594893017119",
|
||||
"username": "Raphix",
|
||||
"global_name": null,
|
||||
"display_name": null,
|
||||
"avatar": "883ec1a7136b0aa3c22e4bdc33e278e5",
|
||||
"discriminator": "8434",
|
||||
"public_flags": 4194368,
|
||||
"flags": 4194368,
|
||||
"banner": null,
|
||||
"banner_color": "#ff4d4d",
|
||||
"accent_color": 16731469,
|
||||
"locale": "fr",
|
||||
"mfa_enabled": true,
|
||||
"premium_type": 0,
|
||||
"avatar_decoration": null
|
||||
},
|
||||
"cdba02f4-3473-4c76-8567-ef8965e0c211": {
|
||||
"id": "486943594893017119",
|
||||
"username": "Raphix",
|
||||
"global_name": null,
|
||||
"display_name": null,
|
||||
"avatar": "883ec1a7136b0aa3c22e4bdc33e278e5",
|
||||
"discriminator": "8434",
|
||||
"public_flags": 4194368,
|
||||
"flags": 4194368,
|
||||
"banner": null,
|
||||
"banner_color": "#ff4d4d",
|
||||
"accent_color": 16731469,
|
||||
"locale": "fr",
|
||||
"mfa_enabled": true,
|
||||
"premium_type": 0,
|
||||
"avatar_decoration": null
|
||||
},
|
||||
"73f031a3-6280-4836-89d1-09080d1a74c2": {
|
||||
"id": "486943594893017119",
|
||||
"username": "Raphix",
|
||||
"global_name": null,
|
||||
"display_name": null,
|
||||
"avatar": "883ec1a7136b0aa3c22e4bdc33e278e5",
|
||||
"discriminator": "8434",
|
||||
"public_flags": 4194368,
|
||||
"flags": 4194368,
|
||||
"banner": null,
|
||||
"banner_color": "#ff4d4d",
|
||||
"accent_color": 16731469,
|
||||
"locale": "fr",
|
||||
"mfa_enabled": true,
|
||||
"premium_type": 0,
|
||||
"avatar_decoration": null
|
||||
},
|
||||
"c3b40227-5112-421d-8f2b-46a30a87cbca": {
|
||||
"id": "486943594893017119",
|
||||
"username": "Raphix",
|
||||
"global_name": null,
|
||||
"display_name": null,
|
||||
"avatar": "883ec1a7136b0aa3c22e4bdc33e278e5",
|
||||
"discriminator": "8434",
|
||||
"public_flags": 4194368,
|
||||
"flags": 4194368,
|
||||
"banner": null,
|
||||
"banner_color": "#ff4d4d",
|
||||
"accent_color": 16731469,
|
||||
"locale": "fr",
|
||||
"mfa_enabled": true,
|
||||
"premium_type": 0,
|
||||
"avatar_decoration": null
|
||||
},
|
||||
"599c640c-b8bd-44b1-9b27-d87a5ab68cf7": {
|
||||
"id": "486943594893017119",
|
||||
"username": "Raphix",
|
||||
"global_name": null,
|
||||
"display_name": null,
|
||||
"avatar": "883ec1a7136b0aa3c22e4bdc33e278e5",
|
||||
"discriminator": "8434",
|
||||
"public_flags": 4194368,
|
||||
"flags": 4194368,
|
||||
"banner": null,
|
||||
"banner_color": "#ff4d4d",
|
||||
"accent_color": 16731469,
|
||||
"locale": "fr",
|
||||
"mfa_enabled": true,
|
||||
"premium_type": 0,
|
||||
"avatar_decoration": null
|
||||
},
|
||||
"a078d4ab-28c5-4b01-b3f8-c6b29f4c4141": {
|
||||
"id": "486943594893017119",
|
||||
"username": "Raphix",
|
||||
"global_name": null,
|
||||
"display_name": null,
|
||||
"avatar": "883ec1a7136b0aa3c22e4bdc33e278e5",
|
||||
"discriminator": "8434",
|
||||
"public_flags": 4194368,
|
||||
"flags": 4194368,
|
||||
"banner": null,
|
||||
"banner_color": "#ff4d4d",
|
||||
"accent_color": 16731469,
|
||||
"locale": "fr",
|
||||
"mfa_enabled": true,
|
||||
"premium_type": 0,
|
||||
"avatar_decoration": null
|
||||
},
|
||||
"5283c6a7-11b2-4454-b6a5-afecb7169d7f": {
|
||||
"id": "486943594893017119",
|
||||
"username": "Raphix",
|
||||
"global_name": null,
|
||||
"display_name": null,
|
||||
"avatar": "883ec1a7136b0aa3c22e4bdc33e278e5",
|
||||
"discriminator": "8434",
|
||||
"public_flags": 4194368,
|
||||
"flags": 4194368,
|
||||
"banner": null,
|
||||
"banner_color": "#ff4d4d",
|
||||
"accent_color": 16731469,
|
||||
"locale": "fr",
|
||||
"mfa_enabled": true,
|
||||
"premium_type": 0,
|
||||
"avatar_decoration": null
|
||||
},
|
||||
"8e4dec3f-82c0-4bd2-a9fb-9ecf64f8aac3": {
|
||||
"id": "486943594893017119",
|
||||
"username": "Raphix",
|
||||
"global_name": null,
|
||||
"display_name": null,
|
||||
"avatar": "883ec1a7136b0aa3c22e4bdc33e278e5",
|
||||
"discriminator": "8434",
|
||||
"public_flags": 4194368,
|
||||
"flags": 4194368,
|
||||
"banner": null,
|
||||
"banner_color": "#ff4d4d",
|
||||
"accent_color": 16731469,
|
||||
"locale": "fr",
|
||||
"mfa_enabled": true,
|
||||
"premium_type": 0,
|
||||
"avatar_decoration": null
|
||||
},
|
||||
"629133a4-f205-4401-a026-639aee65695d": {
|
||||
"id": "486943594893017119",
|
||||
"username": "Raphix",
|
||||
"global_name": null,
|
||||
"display_name": null,
|
||||
"avatar": "883ec1a7136b0aa3c22e4bdc33e278e5",
|
||||
"discriminator": "8434",
|
||||
"public_flags": 4194368,
|
||||
"flags": 4194368,
|
||||
"banner": null,
|
||||
"banner_color": "#ff4d4d",
|
||||
"accent_color": 16731469,
|
||||
"locale": "fr",
|
||||
"mfa_enabled": true,
|
||||
"premium_type": 0,
|
||||
"avatar_decoration": null
|
||||
},
|
||||
"002e5b9d-4b23-4444-97f0-4bd46ac6f36e": {
|
||||
"id": "486943594893017119",
|
||||
"username": "Raphix",
|
||||
"global_name": null,
|
||||
"display_name": null,
|
||||
"avatar": "883ec1a7136b0aa3c22e4bdc33e278e5",
|
||||
"discriminator": "8434",
|
||||
"public_flags": 4194368,
|
||||
"flags": 4194368,
|
||||
"banner": null,
|
||||
"banner_color": "#ff4d4d",
|
||||
"accent_color": 16731469,
|
||||
"locale": "fr",
|
||||
"mfa_enabled": true,
|
||||
"premium_type": 0,
|
||||
"avatar_decoration": null
|
||||
},
|
||||
"4a94dd0d-d022-499e-acdf-396d9a1c3291": {
|
||||
"id": "486943594893017119",
|
||||
"username": "Raphix",
|
||||
"global_name": null,
|
||||
"display_name": null,
|
||||
"avatar": "883ec1a7136b0aa3c22e4bdc33e278e5",
|
||||
"discriminator": "8434",
|
||||
"public_flags": 4194368,
|
||||
"flags": 4194368,
|
||||
"banner": null,
|
||||
"banner_color": "#ff4d4d",
|
||||
"accent_color": 16731469,
|
||||
"locale": "fr",
|
||||
"mfa_enabled": true,
|
||||
"premium_type": 0,
|
||||
"avatar_decoration": null
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user