0
votes

Comment détecter quand un utilisateur quitte un canal vocal dans Discord avec discord.js V12

Je crée un Bot Discord.js sur la v12 qui inclut une commande mute, qui coupe tout le canal vocal dans lequel vous vous trouvez. Le problème est que lorsque quelqu'un quitte le canal, il reste muet. J'essaie de résoudre ce problème avec un simple événement pour réactiver le son de la personne, mais je ne comprends pas VoiceStateUpdate et OldState et NewState . J'ai beaucoup cherché, mais je ne peux en trouver qu'un pour rejoindre un vc, ne pas partir. Voici ce que j'ai obtenu jusqu'à présent:

Commande Mute:

client.on('voiceStateUpdate', (oldState, newState) => {
    if (oldState.member.user.bot) return;

    if (oldState.member.user !== newState.member.user) member.voice.setMute(false);
});

Réactiver l'événement:

    else if (command === 'mute') {
        message.delete()
        if (!message.member.roles.cache.has('') && !message.member.roles.cache.has('')) {
            message.reply('You don\'t have permission to use this commmand!')
            .then(message => {
                message.delete({ timeout: 5000 })
            }).catch();
            return;
        }
        if (message.member.voice.channel) {
            let channel = message.guild.channels.cache.get(message.member.voice.channel.id);
            for (const [memberID, member] of channel.members) {
            member.voice.setMute(true);
            }
        } else {
            message.reply('You need to join a voice channel first!')
            .then(message => {
                message.delete({ timeout: 5000 })
            }).catch();
        }
    }

Merci d'avoir pris votre temps pour m'aider! :)


1 commentaires

Edit: Comme l'a dit une personne ci-dessous, cela ne fonctionnera pas de changer l'état de l'utilisateur déjà laissé, nous pourrons donc le faire lorsqu'un utilisateur rejoint un canal vocal, si vous pouvez m'aider avec cela?


4 Réponses :


0
votes

selon ce lien (et je n'ai pas testé cela), vous avez besoin de quelque chose comme ceci:

const Discord = require("discord.js")
const bot = new Discord.Client()

bot.login('*token*')

bot.on('voiceStateUpdate', (oldState, newState) => {
  let newUserChannel = newState.voiceChannel
  let oldUserChannel = oldState.voiceChannel


  if(oldUserChannel === undefined && newUserChannel !== undefined) {

     // User Joins a voice channel

  } else if(newUserChannel === undefined){

    // User leaves a voice channel

  }
})


1 commentaires

cela ne fonctionnera que si quelqu'un rejoint un canal vocal pour la première fois et non s'il passe d'un VC à l'autre.



1
votes

Eh bien, vous êtes déjà sur la bonne voie. Ce que vous devez faire est de vérifier si quelqu'un est mis en sourdine quand il quitte un canal vocal, puis de le supprimer.

Alors allons-y.

Nous vérifions d'abord si la personne quitte le canal vocal. C'est important parce que l'événement voiceStateUpdate est déclenché chaque fois que certains font quelque chose à leur voix, c'est-à-dire couper ou rejoindre. Nous faisons cela en vérifiant si oldState.channelID est null ou undefined car cela indique une jointure.

client.on('voiceStateUpdate', (oldState, newState) => {
    if (oldState.channelID === null || typeof oldState.channelID == 'undefined') return;
    if (!oldState.member.voice.mute) return;
    oldState.member.voice.setMute(false);
});

Ensuite, nous devons vérifier si la personne qui part est en sourdine et revenir sinon.

oldState.member.voice.setMute(false);

Et enfin nous supprimons le muet.

if (!oldState.member.voice.mute) return;

Donc, toute votre voiceStateUpdate devrait ressembler à quelque chose comme ça.

if (oldState.channelID === null || typeof oldState.channelID == 'undefined') return;


1 commentaires

Quelque chose ne fonctionne pas correctement: (. J'ai essayé votre méthode, mais cela ne me réactive pas lorsque je laisse le VC en sourdine et cela interfère avec la commande / mute car elle me rétablit instantanément après cela. J'ai essayé de faire un si - retour mais je n'arrive pas à le faire fonctionner. Version complète: 12.4.1



0
votes
client.on('voiceStateUpdate', (oldMember, newMember) => {
  const oldUserChannel = oldMember.voice.channelID
  const newUserChannel = newMember.voice.channelID

 if (oldUserChannel === 'MUTED CHANNEL ID' && newUserChannel !== 'MUTED CHANNEL ID') {
    newMember.voice.setMute(false);
  }
});
You can write in a json file the id of the muted channel and take it from there, I can't think of another way, sorry :(

2 commentaires

cela ne fonctionne que si vous savez dans quel canal se trouve la personne qui quitte. De plus, vous avez oublié de définir newUserChannel .


Je pense que cela fonctionnera, mais ce n'est pas ce dont j'ai besoin. Merci pour votre temps et vos efforts :)



0
votes

Vous ne pouvez pas manipuler l'état de la voix d'une personne qui n'est pas sur un canal vocal, cela provoquerait une DiscordAPIError: Target user is not connected to voice. , et même si vous le pouviez, vous ne voudriez probablement toujours pas, car même si vous n'obtenez pas une autre erreur de promesse non gérée, vous obtiendrez probablement toujours une boucle infinie en vérifiant si le canal du nouvel état est nul, car il déclencherait un autre événement avec un canal nul dès que vous réactiveriez le son de la personne et ainsi de suite.

Donc, la façon dont je le vois en ce moment, une solution possible à votre problème, est de réactiver le son chaque fois que l'utilisateur rejoint un canal. Il ne sera peut-être pas nécessaire d'être de cette façon si quelqu'un peut trouver une meilleure façon de vérifier si c'est un canal qui quitte ce qui se produit autrement qu'en utilisant newState.channel === null . Quoi qu'il en soit, si vous pouvez réactiver le son lors de la jointure, vous pouvez le faire de cette façon:

client.on('voiceStateUpdate', (oldState, newState) => {
  if (oldState.channel === null && newState.channel !== null) {
    newState.setMute(false);
  }
});

Notez cependant que cela pourrait poser problème si quelqu'un rejoint le canal exactement après l'avoir quitté, sinon vous ne devriez pas avoir de problèmes.


2 commentaires

Merci d'avoir répondu! Cela pourrait fonctionner lorsque vous rejoignez un VC pour réactiver l'utilisateur ...


Merci beaucoup! Cela fonctionne parfaitement bien et comme vous l'avez dit, cela ne réactivera pas le son de la personne quand il rejoindra le VC immédiatement et c'est tout simplement parfait pour moi! Merci encore :)