当有人加入或离开其语音频道时,让机器人向文本频道发送消息

Posted

技术标签:

【中文标题】当有人加入或离开其语音频道时,让机器人向文本频道发送消息【英文标题】:Make a bot send a message to a text channel when somebody joins or leaves its voice channel 【发布时间】:2019-04-07 14:03:39 【问题描述】:

我想让我的机器人向刚刚进入其语音通道或刚刚离开其语音通道的文本通道发送消息。我是编码新手,但我已经尝试过,但它不起作用。

bot.on('voiceStateUpdate', (oldMember, newMember) => 
  let newUserChannel = newMember.voiceChannel;
  let oldUserChannel = oldMember.voiceChannel;
  if (oldUserChannel === undefined && newUserChannel !== undefined) 
    if (newUserChannel === bot.voiceChannel) 
      console.log("Hello");
    
   else if (newUserChannel === undefined) 
  
);

控制台中甚至什么都没有显示。

【问题讨论】:

【参考方案1】:

我认为这不起作用,因为您使用的是 bot.voiceChannel,但它不存在:.voiceChannelGuildMember 的属性,因此您需要先获取成员。 我会这样做:

bot.on('voiceStateUpdate', (oldMember, newMember) => 
  // Here I'm storing the IDs of their voice channels, if available
  let oldChannel = oldMember.voiceChannel ? oldMember.voiceChannel.id : null;
  let newChannel = newMember.voiceChannel ? newMember.voiceChannel.id : null;
  if (oldChannel == newChannel) return; // If there has been no change, exit

  // Here I'm getting the bot's channel (bot.voiceChannel does not exist)
  let botMember = oldMember.guild.member(bot.user),
    botChannel = botMember ? botMember.voiceChannel.id : null;

  // Here I'm getting the channel, just replace VVV this VVV with the channel's ID
  let textChannel = oldMember.guild.channels.get('CHANNEL_ID_HERE');
  if (!textChannel) throw new Error("That channel does not exist.");

  // Here I don't need to check if they're the same, since it would've exit before
  if (newChannel == botChannel) 
    // console.log("A user joined.");
    textChannel.send(`$newMember has joined the voice channel.`);
   else if (oldChannel == botChannel) 
    // console.log("A user left.");
    textChannel.send(`$newMember has left the voice channel.`);
  
);

【讨论】:

如果用户已加入,我如何向文本频道发送消息? 我编辑了我的答案。您需要先获取您要发送消息的频道,然后您可以使用TextChannel.send() 最后一件事,我将如何获得加入的用户名。 newMemer.username 似乎不起作用 我编辑了我的答案:如果您想@提及用户,请使用我现在回答中的代码(当您将 GuildMember 转换为字符串时,它会成为提及)。如果您只想使用usernametag 或其他User 属性,只需使用newMember.user -> newMember.user.usernamenewMember.user.tag 等等... 非常感谢!

以上是关于当有人加入或离开其语音频道时,让机器人向文本频道发送消息的主要内容,如果未能解决你的问题,请参考以下文章

Discord.js 尝试在用户加入语音频道时发送消息

如何向特定频道发送加入/离开消息

如何确定用户是不是加入/切换/离开了语音频道?

Discord.js 机器人无法离开语音频道

Discord 机器人不离开语音频道

如何使用 Discord.py Cogs 使 Discord Bot 加入语音频道并在成员加入频道时播放音频文件