Bonjour,

Voila je rencontre un petit problème avec mon code. Il se trouve que je n'arrives pas à faire fonctionne PlayFile correctement.
Mon Bot, dès qu'il est prêt, il se met automatiquement dans une chaîne vocale (Et il y reste comme convenu).

Lecture d'un fichier .wav

Voici mon code actuel :

client.on('ready', () => {
    console.log('L\'Aubergiste est là !')
    const channel = client.channels.get("*ID DE MON CHANNEL*");
    if (!channel) return console.error("The channel does not exist!");
    channel.join().then(connection => {
        // Rejoint la taverne
        console.log("Taverne rejointe.");
    }).catch(e => {
        // Impossible de rejoindre la taverne
        console.error(e);
    }); 
});

client.on('voiceStateUpdate', (oldmember, newmember)=>{
    let oldvoice = oldmember.voiceChannel;
    let newvoice = newmember.voiceChannel;
    if (oldvoice && newvoice && oldvoice.id != newvoice.id) {
        try {
            playFile(newUserChannel,'./bienvenue.wav');
        } catch(error) {
            console.error(error);
        }
    } 
});

Ce que je veux

Dès qu'un utilisateur entre dans le chat vocal, j'aimerais que mon bot lise un simple fichier .wav...

Ce que j'obtiens

J'ai essayé déjà de formuler différement playFile(newUserChannel,'./bienvenue.wav'); mais il se trouve que mon problème persiste. Cela débauche toujours sur la même erreur : « playFile is undefined ».

► Pourtant mon fichier est bien à la racine (Afin d'éviter d'autres erreurs au cas où).

J'ai installer bien tous les packages nécessaires mais sans succès.

Quelqu'un aurait une solution ?

Merci d'avance,
Bien Cordialement.

Simon

20 réponses


SimonDlgs
Auteur
Réponse acceptée

Bonjour à tous, vous qui cherchez la solution.

Après s'être lancer dans une quête à la recherche des bugs durant des minutes, des heures et des jours, avec flo3376, nous avons finalement réussit à réunir toutes les conditions afin de régler tous les problèmes de compatibilité de DiscordJS et NodeJS.

En effet, nous avons constaté qu'il était préférable d'avoir des versions spécifiques pour une utilisation optimale. Voici donc les versions où nous-nous somme arrêtés :

NodeJS : 13.13.0

Packages

@discordjs/opus@0.1.0
discord.js@12.2.0
erlpack@0.1.3
ffmpeg@0.0.4
ffmpeg-static@4.2.0 //Afin de réglé le bug « Error: FFmpeg/avconv not found! »
fluent-ffmpeg@2.1.2
utf-8-validate@5.0.2
ytdl-core@2.1.0

Pour ce qui est du code, le voici :

let voiceChannel = client.channels.cache.get("632250212491984936");
            voiceChannel.join().then((c)=>c.play(`./audio/bienvenue.mp3`));

Encore un grand merci à flo3376 pour son aide !

Un mystère de l'univers enfin résolu.

Bonjour.
Ton problème semble se situer au niveau de l'importation du module, il serait donc plus judicieux que tu nous montre également la partie qui concerne l'importation/inclusion du module, soit en général le haut du fichier.

Bonjour Lartak,

Veux-tu parler de ça ?

const Discord = require('discord.js')
const client = new Discord.Client()
const tokenBot = '*MON TOKEN*';

const CMDS = require('./commands/commands.js') /* Fichier des commandes pour mon bot */
const INTERRACT = require('./interractions/interractions.js') /* Autres interractions possibles avec mon bot */

Je penses normalement que playFile fait directement parti de discord.js si je ne me trompe pas ?

As-tu bien regardé dans la documentation ?
Exemple :

// Play files natively
const broadcast = client.createVoiceBroadcast();

voiceChannel.join()
  .then(connection => {
    broadcast.playFile('C:/Users/Discord/Desktop/music.mp3');
    const dispatcher = connection.playBroadcast(broadcast);
  })
  .catch(console.error);

Source: VoiceBroadcast.
Comme tu peux le voir, playFile ne s'utilise pas directement, mais sur un objet parent.
Pour faire simple, playFile n'est pas un objet, mais une méthode.

Merci Lartak pour ta réponse, mais malheureusement cette solution affecte uniquement l'entrée du bot sur un salon vocal.

Cependant je cherche à jouer un son quand c'est l'utilisateur qui rejoint le canal vocal où se trouve le tavernier.

Du coup, impossible pour moi d'utiliser :

const dispatcher = connection.playBroadcast(broadcast);

Merci d'avance. :)

En fait voici un peu près ce que je cherches avec ta méthode mais adapter à ma situation :

voiceChannel.userJoined().then(connection => {
  // Joue le son quand un utilisateur rentre sur le salon:
  const dispatcher = connection.playFile('./file.mp3');
});

Ce n'était qu'un exemple.
Tu as par exemple aussi :

Play the given file in the voice connection.

// Play files natively
voiceChannel.join()
  .then(connection => {
    const dispatcher = connection.playFile('C:/Users/Discord/Desktop/music.mp3');
  })
  .catch(console.error);

Source: VoiceConnection.
Dans tous les cas, comme tu peux le voir, playFile ne s'utilise pas directement, mais en tant que méthode d'un autre objet.

Ça ne fonctionne pas, la librairie DiscordJS est en carton ! J'ai perdu 3 soirées de ma vie pour rien.

Merci quand même.. :)

je comprend ce que tu peux ressentir, celà fais une semaine que je galére avec leur doc,
je viens de le tester à l'instant, il me manque plus que l'auto déconnection

const voiceChannel = message.member.voice.channel;
voiceChannel.join()
     .then(connection => {
        const dispatcher = connection.play('./mp3/genial-si-tu-veux-devenir-miss-amerique.mp3', { volume: 0.5 });
     })
     .catch(console.error);

Bonjour flo3376,

Ton fichier se lis bien dans le salon voal ? J'ai essayé de mon coter mais voici l'erreur que ça me balance :

(node:3061692) UnhandledPromiseRejectionWarning: TypeError: connection.play is not a function

Cette histoire deviens de plus en plus bizarre...

peut tu m expliquer suite quoi le bot dois jouer un fichier.

reaction a un message. arrivzr d une personne dans un channel....

Pour ma part j'essaye de lancer la lecture du fichier dès qu'une personne rejoint un salon vocal. Dans mon cas j'ai créer un salon qui s'appelle "Taverne" et où se trouve un bot qui s'appelle "Aubergiste". Le fichier local est une réplique de l'aubergiste dans Hearthstone.

Du coup dès qu'une personne rejoint, le fichier est bien présent par vérification du chemin mais n'est pas lancé avec la fonction connection.play

Voici un extrait de mon code source :

/* ------------------------------------------------- */
/* Quand un user rejoint ou part d'une chaîne vocale */
/* ------------------------------------------------- */
client.on('voiceStateUpdate', (oldmember, newmember)=>{
    let oldvoice = oldmember.voiceChannel;
    let newvoice = newmember.voiceChannel;
    if (oldvoice && newvoice && oldvoice.id != newvoice.id) {
        let voiceChannel = client.channels.get("632250212491984936");
        voiceChannel.join().then(connection => {
            const dispatcher = connection.play('./audio/bienvenue.mp3', { volume: 0.5 }); /*  Ici se trouve le code qui ne fonctionne pas */
        })
        console.log('Un utilisateur rejoint la taverne.');
    }
});

concretement la version de voice_channel que tu as récupéré n as pas la capacité (methode). play.
il faudrait que tu essaies de le récupérer autrement, peut être en passant par le joueur
il faudrait que tu recupere l id de ton joueur et ensuite tu essaie de faire

let users = client.users.cache;
console.log(client.users);
let user=users.get(<id du joueur>);
console.log(user);
let voice_channel = user.voice......

c'est une approche que je te suggére mais je ne sais pas pour le moment si elle est viable.
Navré de ne peux pas etre plus precis pour le moment car je suis dans un train
N'hésite pas à utiliser allégrement les console.log pour voir le contenu de tes objets, tu n'aura pas les méthodes, mais tu apercevra peut être des élément interressant comme les info channel, guild ....

tiens nous au courrant

Bonjour flo3376,

Merci pour ton conseil je vais tanter ça et je te dit où ça me mènera lol

des news?

Honnêtemnt rien de concluant, ça me met un array des détails de chacun de mes salon mais aucune précision sur les fonctions à utiliser. J'ai beau me gratter le cerveau mais je ne comprends pas du tout... lol

croises les doigts j'ai besoin d'un truc du genre, si je trouve je te fait signe

//si il y a un mouvement dans les salons
client.on('voiceStateUpdate', (oldMember, newMember) => {
    let quit_channel=false;
    //si l'on détecte un mouvement de sortie de salon
    if(oldMember)
    {
        quit_channel=true;

    }
    //si l'on détecte un mouvement de rentré de salon
    if(newMember)
    {
        console.log("Mouvement entrant d'un salon")

        if(newMember.channel)
        {
            if(newMember.channel.id === '704788656896081990' && quit_channel===true)
            {
                quit_channel=false;
                //console.log(newMember.channel);
                console.log('maintenant')
                let voiceChannel = client.channels.cache.get("704788656896081990");
                //console.log(voiceChannel);
                voiceChannel.join().then(connection => {
                    const dispatcher = connection.play('./mp3/Thème_musicaux/Avenger-style.mp3', { volume: 0.1 }); 
                })
            }

        }

    }
})

voici la version alléger

tu vas pouvoir reprendre ton fichier de départ et juste rajouter ceci dedans

il y a toujours ce soucis de rebond sur cette version

voilà la version tester et debugguer, pas de rebond et pas de bug

client.on('voiceStateUpdate', (oldMember, newMember) => {
    let last_channel_id="";
    //si l'on détecte un mouvement de sortie de salon
    if(oldMember)
    {
        console.log("Mouvement sortant possible d'un salon")

        let old_user_id = oldMember.id
        let old_username = oldMember.member.nickname;
        console.log("info du joueur : ")
        console.log(member_id2[old_user_id])

        //on vérifie que le channel id exsite, sinon le joueur vient de faire une connection au serveur
        if(oldMember.channel!==null)
        {
            //on mémorise d'ou vient de partir le membre
            last_channel_id=oldMember.channel.id;
            console.log("id du salon : ")
            console.log(oldMember.channel.id)
        }
    }
    //si l'on détecte un mouvement de rentré de salon
    if(newMember)
    {
        console.log("Mouvement entrant possible d'un salon")

        //on vérifie que le channel id exsite, sinon le joueur vient de faire une déconnection du serveur
        if(newMember.channel!==null)
        {
            console.log("id du salon : ")
            console.log(newMember.channel.id)

            //si l'id de lancien channel et bien différent du nouveau, c'est qu'il s'agit d'un mouvement réelle
            if(last_channel_id !== newMember.channel.id)
            {
                console.log("Il y a bien eu mouvement");
                if(newMember.channel.id === '704788656896081990')
                {
                    //console.log(newMember.channel);
                    console.log('maintenant')
                    let voiceChannel = client.channels.cache.get("704788656896081990");
                    //console.log(voiceChannel);
                    voiceChannel.join().then(connection => {
                        const dispatcher = connection.play('./mp3/Thème_musicaux/Avenger-style.mp3', { volume: 0.2 }); 
                    })
                }
            }
            else{
                console.log("Il n'y a pas eu mouvement")
            }
        }
    }
};