Relance music si crash/reboot + Réécriture /amp

This commit is contained in:
Zachary Guénot
2023-05-28 20:39:11 +02:00
parent f6bf2f8616
commit d02dd5bace
15 changed files with 234 additions and 108 deletions

View File

@@ -1,82 +1,124 @@
const { SlashCommandBuilder, EmbedBuilder } = require('discord.js')
require('dotenv').config()
require('require-all')(__dirname + '/../../utilsAMP')
const { SlashCommandBuilder, EmbedBuilder, inlineCode } = require('discord.js')
let dotenv = require('dotenv')
dotenv.config()
const appDir = require('path').dirname(require.main.filename)
const API = require('require-all')(appDir + '/utilsAMP')
function failMsg(data) { return `La commande a échouée !\n${inlineCode(`${data.Title}: ${data.Message}`)}` }
function errorMsg(data) { return `Y'a eu une erreur !\n${inlineCode(`${data.error_code}`)}` }
module.exports = {
data: new SlashCommandBuilder().setName('amp').setDescription('Accède à mon panel de jeu AMP !')
//.addSubcommand(subcommand => subcommand.setName('api_info').setDescription('Prints info about the API.'))
.addSubcommand(subcommand => subcommand.setName('login').setDescription("Connectez-vous avant d'effectuer une autre commande !")
.addStringOption(option => option.setName('username').setDescription("Nom d'Utilisateur").setRequired(true))
.addStringOption(option => option.setName('password').setDescription('Mot de Passe').setRequired(true))
.addBooleanOption(option => option.setName('remember').setDescription('Mémoriser les identifiants').setRequired(true))
.addStringOption(option => option.setName('otp').setDescription('Code de double authentification')))
.addSubcommandGroup(subcommandgroup => subcommandgroup.setName('instances').setDescription('Intéragir avec les instances AMP.')
.addSubcommand(subcommand => subcommand.setName('list').setDescription('Liste toutes les instances disponibles.'))
.addSubcommand(subcommand => subcommand.setName('manage').setDescription('Gérer une instance.')
.addStringOption(option => option.setName('name').setDescription("Nom de l'instance").setRequired(true)))
.addSubcommand(subcommand => subcommand.setName('list').setDescription('Liste toutes les instances disponibles.'))
.addSubcommand(subcommand => subcommand.setName('restart').setDescription('Redémarre une instance.')
.addStringOption(option => option.setName('name').setDescription("Nom de l'instance").setRequired(true)))),
async execute(interaction) {
const base_url = process.env.AMP_HOST + '/API'
// Let the user login
if (interaction.options.getSubcommand() == 'login') {
// Get a SessionID and a RememberMeToken if wanted
await interaction.deferReply({ ephemeral: true })
let result = await login(base_url, interaction.options)
if (result.status === 'success') return await interaction.editReply(`You are successfully logged in as **${result.data.userInfo.Username}** !`)
else if (result.status === 'fail') return await interaction.editReply(`Sorry, something bad happened ! (${result.data.Message})`)
else if (result.status === 'error') return await interaction.editReply(`Sorry, there has been an error ! (${result.data.error_code})`)
}
else if (interaction.options.getSubcommandGroup() == 'instances') {
if (interaction.options.getSubcommand() == 'list') {
await interaction.deferReply()
let details = {
username: interaction.options.getString('username'),
password: interaction.options.getString('password'),
token: interaction.options.getString('otp') || '',
rememberMe: interaction.options.getBoolean('remember')
}
let result = await getInstances(base_url)
if (result.status === 'success') {
let fields = []
result.instances.forEach(instance => {
fields.push({
name: instance.FriendlyName,
value: `**ID:** ${instance.InstanceID}
**Running:** ${instance.Running}
**IP:** ${instance.IP}
**Port:** ${instance.Port}
**Module:** ${instance.Module}`,
inline: true
})
})
let embed = new EmbedBuilder()
.setTitle('Instances')
.setDescription('Liste de toutes les instances disponibles.')
.setColor(interaction.guild.members.me.displayColor)
.setTimestamp()
.setFields(fields)
return await interaction.followUp({ embeds: [embed] })
let result = await API.Core.Login(details)
if (result.status === 'success') return await interaction.followUp(`Tu es connecté au panel sous **${result.data.userInfo.Username}** !`)
else if (result.status === 'fail') return await interaction.followUp(failMsg(result.data))
else if (result.status === 'error') return await interaction.followUp(errorMsg(result.data))
}
await interaction.deferReply()
// Check if the SessionID is still valid
let sessionID = dotenv.config().parsed.AMP_SESSIONID
let session = await API.CheckSession(sessionID)
if (session.status === 'fail') {
console.log(session)
if (process.env.AMP_REMEMBER_TOKEN) {
// Refresh the SessionID if the RememberMeToken is available
let details = {
username: process.env.AMP_USERNAME,
password: '',
token: process.env.AMP_REMEMBER_TOKEN,
rememberMe: true
}
let result = await API.Core.Login(details)
console.log(result)
if (result.status === 'success') sessionID = result.data.sessionID
else if (result.status === 'fail') return await interaction.followUp(failMsg(result.data))
else if (result.status === 'error') return await interaction.followUp(errorMsg(result.data))
}
else {
// If no RememberMeToken is available, ask to login
return await interaction.followUp(`Tu dois te connecter avant d'effectuer une autre commande !`)
}
}
else if (session.status === 'error') return await interaction.followUp(errorMsg(session.data))
if (interaction.options.getSubcommandGroup() == 'instances') {
if (interaction.options.getSubcommand() == 'list') {
let result = await API.ADSModule.GetInstances(sessionID)
if (result.status === 'success') {
await interaction.followUp({ content: `${result.data.result.length} hôtes trouvés !` })
result.data.result.forEach(async host => {
let fields = []
host.AvailableInstances.forEach(instance => {
fields.push({
name: instance.FriendlyName,
value: `**ID:** ${instance.InstanceID}
**Running:** ${instance.Running}
**IP:** ${instance.IP}
**Port:** ${instance.Port}
**Module:** ${instance.Module}`,
inline: true
})
})
let embed = new EmbedBuilder()
.setTitle('Instances')
.setDescription(`Liste des instances de l'hôte **${host.FriendlyName}** :`)
.setColor(interaction.guild.members.me.displayColor)
.setTimestamp()
.setFields(fields)
return await interaction.channel.send({ embeds: [embed] })
})
}
else if (result.status === 'fail') return await interaction.followUp(failMsg(result.data))
else if (result.status === 'error') return await interaction.followUp(errorMsg(result.data))
}
else if (interaction.options.getSubcommand() == 'manage') {
await interaction.deferReply()
let result = await manageInstance(base_url, interaction.options.getString('name'))
let query = interaction.options.getString('name')
let result = await API.ADSModule.ManageInstance(sessionID, query)
if (result.status === 'success') return await interaction.followUp(`Ok !`)
else if (result.status === 'fail') return await interaction.followUp(failMsg(result.data))
else if (result.status === 'error') return await interaction.followUp(errorMsg(result.data))
}
else if (interaction.options.getSubcommand() == 'restart') {
await interaction.deferReply()
let query = interaction.options.getString('name')
let result = await API.ADSModule.RestartInstance(sessionID, query)
let result = await restartInstance(base_url, interaction.options.getString('name'))
if (result.status === 'success') return await interaction.followUp(`Ok !`)
else if (result.status === 'fail') return await interaction.followUp(failMsg(result.data))
else if (result.status === 'error') return await interaction.followUp(errorMsg(result.data))
}
/*else if (interaction.options.getSubcommand() == 'api_info') {
await interaction.deferReply()
let url = `${base_url}/Core/GetAPISpec`
let headers = { headers: { SESSIONID: localStorage.getItem("AMP_sessionID") } }
try {
let response = await axios.post(url, headers)
console.log(response.data)
await interaction.editReply('Ok !')
} catch (error) { console.log(error), await interaction.editReply("HTTP Error !") }
}*/
}
}
}

View File

@@ -1,6 +1,8 @@
const { SlashCommandBuilder } = require('discord.js')
const fs = require('fs')
require('require-all')(__dirname + '/../../utilsCrack')
const appDir = require('path').dirname(require.main.filename)
require('require-all')(appDir + '/utilsCrack')
var headers1 = {
"content-type": "application/x-www-form-urlencoded; charset=UTF-8",

View File

@@ -70,6 +70,12 @@ module.exports = {
await entry.getTask()
queue.addTrack(track)
// Write the values in the .env file to recover the player if the bot restarts
writeEnv('DISCORD_MUSIC_TEXTCHANNEL_ID', interaction.channel.id)
writeEnv('DISCORD_MUSIC_VOICECHANNEL_ID', voiceChannel.id)
writeEnv('DISCORD_MUSIC_CURRENT_TRACK', track.url)
writeEnv('DISCORD_MUSIC_CURRENT_PROGRESS', 0)
try {
if (!queue.isPlaying()) await queue.node.play()
track.source = track.source === 'youtube' ? 'Youtube' : track.source === 'spotify' ? 'Spotify' : 'Inconnu'

View File

@@ -1,5 +1,7 @@
const { SlashCommandBuilder } = require('discord.js')
const generatePlayer = require('../../utilsPlayer/generate.js')
const appDir = require('path').dirname(require.main.filename)
const generatePlayer = require(appDir + '/utilsPlayer/generate.js')
module.exports = {
data: new SlashCommandBuilder()

View File

@@ -8,6 +8,12 @@ module.exports = {
async execute(interaction) {
let queue = useQueue(interaction.guild.id)
queue.delete()
writeEnv('DISCORD_MUSIC_TEXTCHANNEL_ID', '')
writeEnv('DISCORD_MUSIC_VOICECHANNEL_ID', '')
writeEnv('DISCORD_MUSIC_CURRENT_TRACK', '')
writeEnv('DISCORD_MUSIC_CURRENT_PROGRESS', '')
return await interaction.reply('Musique arrêtée !')
}
}