Bonjour, je suis un petit développeur qui a construit un petit bot discord. Je le code en javascrip avec Visual Studio Code et je tente de l'héberger avec Heroku.
Mais malheureusement les problèmes commencent. Mon bot fonctionne totallement en debug sur VSC mais non pas sur l'hébergement fait de Héroku.
Je vous laisse si dessous le code de chaque dossier (avec le token caché bien sur). Je crois que Heroku ne host pas vraiment bien (sachant que certaines commande sont désactivés par Héroku mais non par le debug de VSC).
Index.js :

const config = require('./config.json');
const prefix = "!";
const ytdl            = require("ytdl-core");
require("dotenv").config();

const client = new Discord.Client();

const queue = new Map();
client.login("TOKEN");

client.once("ready", () => {
        console.log("Ready!");
        client.user.setActivity("Developped by Aiiryy⌛");
});

client.once("reconnecting", () => {
        console.log("Reconnecting!");
});

client.once("disconnect", () => {
        console.log("Disconnect!");

});

client.on("message", async message => {
        if (message.author.bot) {
                return;
        }
        if (!message.content.startsWith(prefix)) {
                return;
        }

        const serverQueue = queue.get(message.guild.id);

        if (message.content.startsWith(`${prefix}play`)) {
                execute(message, serverQueue); // On appel execute qui soit initialise et lance la musique soit ajoute à la queue la musique
                return;
        }
        else if (message.content.startsWith(`${prefix}skip`)) {
                skip(message, serverQueue); // Permettra de passer à la musique suivante
                return;
        }
        else if (message.content.startsWith(`${prefix}stop`)) {
                stop(message, serverQueue); // Permettra de stopper la lecture
                return;

        }
        else {
                message.channel.send("You need to enter a valid command!");
        }

});

async function execute(message, serverQueue) {
        const args = message.content.split(" "); // On récupère les arguments dans le message pour la suite

        const voiceChannel = message.member.voice.channel;
        if (!voiceChannel) // Si l'utilisateur n'est pas dans un salon vocal
        {
                return message.channel.send(
                    "Vous devez être dans un salon vocal!"
                );
        }
        const permissions = voiceChannel.permissionsFor(message.client.user); // On récupère les permissions du bot pour le salon vocal
        if (!permissions.has("CONNECT") || !permissions.has("SPEAK")) { // Si le bot n'a pas les permissions
                return message.channel.send(
                    "J'ai besoin des permissions pour rejoindre le salon et pour y jouer de la musique!"
                );
        }

        const songInfo = await ytdl.getInfo(args[1]);
        const song = {
        title: songInfo.videoDetails.title,
        url : songInfo.videoDetails.video_url,
        };

        if (!serverQueue) {
                const queueConstruct = {
                        textChannel : message.channel,
                        voiceChannel: voiceChannel,
                        connection  : null,
                        songs       : [],
                        volume      : 0.00000000001,
                        playing     : true,
                };

                // On ajoute la queue du serveur dans la queue globale:
                queue.set(message.guild.id, queueConstruct);
                // On y ajoute la musique
                queueConstruct.songs.push(song);

                try {
                        // On connecte le bot au salon vocal et on sauvegarde l'objet connection
                        var connection           = await voiceChannel.join();
                        queueConstruct.connection = connection;
                        // On lance la musique
                        play(message.guild, queueConstruct.songs[0]);
                }
                catch (err) {
                        //On affiche les messages d'erreur si le bot ne réussi pas à se connecter, on supprime également la queue de lecture
                        console.log(err);
                        queue.delete(message.guild.id);
                        return message.channel.send(err);
                }
        }
        else {
                serverQueue.songs.push(song);
                console.log(serverQueue.songs);
                return message.channel.send(`${song.title} has been added to the queue!`);
        }

}

function skip(message, serverQueue) {
        if (!message.member.voice.channel) // on vérifie que l'utilisateur est bien dans un salon vocal pour skip
        {
                return message.channel.send(
                    "Vous devez être dans un salon vocal pour passer une musique!"
                );
        }
        if (!serverQueue) // On vérifie si une musique est en cours
        {
                return message.channel.send("Aucune lecture de musique en cours !");
        }
        serverQueue.connection.dispatcher.end(); // On termine la musique courante, ce qui lance la suivante grâce à l'écoute d'événement
                                                 // finish
}

function stop(message, serverQueue) {
        if (!message.member.voice.channel) // on vérifie que l'utilisateur est bien dans un salon vocal pour skip
        {
                return message.channel.send(
                    "Vous devez être dans un salon vocal pour stopper la lecture!"
                );
        }
        if (!serverQueue) // On vérifie si une musique est en cours
        {
                return message.channel.send("Aucune lecture de musique en cours !");
        }
        serverQueue.songs = [];
        serverQueue.connection.dispatcher.end();
}

function play(guild, song) {
        console.log(song);
        const serverQueue = queue.get(guild.id); // On récupère la queue de lecture
        if (!song) { // Si la musique que l'utilisateur veux lancer n'existe pas on annule tout et on supprime la queue de lecture
                serverQueue.voiceChannel.leave();
                queue.delete(guild.id);
                return;
        }

        const dispatcher = serverQueue.connection
            .play(ytdl(song.url, { filter: 'audioonly' }))
            .on("finish", () => { // 
                    serverQueue.songs.shift(); // 
                    play(guild, serverQueue.songs[0]);
            })
            .on("error", error => console.error(error));
        dispatcher.setVolume(0.1); 
        serverQueue.textChannel.send(`Démarrage de la musique: **${song.title}**`);
}

Pour le config.json :

    "prefix": "!",
    "token": "TOKEN"
  }

et ceci dans le procfile (important pour pouvoir host sur Héroku)
worker: node index.js
Si je pourrais enfin trouver la solution pour pouvoir lancer mon bot discord musique à temps plein.. Merci beaucoup d'avance pour vos réponses. Je suis à disposition pour répondre à d'eventuelles questions.

9 réponses


  1. Ton fichier procfile, c'est avec un "p" majuscule qu'il faut l'écrire
  2. Tu n'importe même pas Discord ! (const Discord = require("discord.js");)
Aiiryy
Auteur

Oui c'est une erreur de ma part sur le post je l'ai belle et bien mit, et le P majuscule est bien mis sur le dossier

Aiiryy
Auteur

Voici un lien github avec le code tout entier sans faute avec les tokens retirés https://github.com/Aiiryy/testbotcode.git

404... il doit être privé

Aiiryy
Auteur

je suis bête... normalement ça devrait être bon https://github.com/Aiiryy/testbotcode.git

Euh... y'a des petits problèmes :

  1. Le fichier ok.env, c'est juste .env qu'il devrait s'appeller
  2. C'est client.on(...) et pas client.once(...)
  3. Tu fais un const config = require("./config.json") mais tu ne l'utilise pas. Utilise config.token pour le token (ou process.env.TOKEN, si tu mets ton token dans le .env - recommandé) et config.prefix pour le préfix, etc.
Aiiryy
Auteur

Bonjour, merci de vouloir m'aider, malgré toutes les indications que j'ai suivis, le bot a toujours le meme problème. Le host fonctionne et mon bot se connecte bien mais aucun son ne sort du bot lorsque qu'il est hebergé (alors que avec le Debug de VSC tout marche bien). j'ai mis a jour le code du github si vous voulez reverifier. Merci de votre aide

Bonjour,

Pour une meuilleure utilisation, vous pouvez utiliser Glitch (éditeur HTML/CSS/JS en ligne avec sauvegardes) + UptimeRobot.

PS : si y'a besoin de plus d'explications, me mp sur DIscord : UnMecBanal#1117
PS 2 : j'ai fait des pull requests sur GitHub, à vous de voir ;)

Sinon je suis désolé mais je ne peux pas plus vous aider.