如何检查某个用户的某个频道/角色

时间:2019-07-21 04:16:01

标签: javascript discord.js commando

我希望我的机器人能够检查...

  • 如果我的漫游器创建的频道与某个名称匹配... 或
  • 如果我的机器人所扮演的角色与某个名称匹配...

之后

机器人将返回带有消息Mod mail is already activated here!

的操作

这是我的代码

var mg = message.guild

const mythings = mg.channels.filter(chane => chane.client.user.id === `595840576386236437` && chane.name === 'modmail' &&chane.type === `text`);
const mythings2 = mg.channels.filter(chane => chane.client.user.id === `595840576386236437` && chane.name === 'qanda' &&chane.type === `text`);
const mythings3 = mg.roles.filter(role => role.client.user.id === `595840576386236437` && role.name === 'ModMail');

console.log(mythings)

if(mythings)  return message.channel.send(`Rejected! There's possible fragments of modmail already set up here!`)
if(mythings2) return message.channel.send(`Rejected! There's possible fragments of modmail already set up here!`)
if(!mythings3) return message.channel.send(`Rejected! There's possible fragments of modmail already set up here!`)

注意

我在 discord.js-commando 中进行此操作,而不是 discord.js 不在我的index.js文件中,所以我唯一的限制是我无法引用客户端变量。目录是〜/ commands / extras / modmail.js / 而不是〜/ index.js / 我的意思是我不能以client开头变量,因为它会以未定义的形式返回给我,但是允许使用channel.client之类的东西,因为它定义了发送信息的渠道的创建者。

出了什么问题

这是哪里出了毛病。

  1. 找不到频道频道
  2. 退货

OR

  1. Bot查找频道
  2. Bot继续担任所有渠道和角色。

我希望:Bot可以在行会中搜索符合client.id和名称期望的频道,然后返回。此外,Bot可以在行会中搜索与所有者(我(指我是机器人)(我(是指我是机器人))的ID和名称相遇的角色,然后还返回。

实际结果是机器人在不应该的时候返回,例如Bot在应该创建频道时找不到频道时会返回。 (虽然我剪掉了代码)

1 个答案:

答案 0 :(得分:0)

Collection.filter()将始终返回新的收藏集。因此,由于变量存在,因此您的第一个条件始终是返回true并执行return语句。

要么检查Collection的size属性,要么使用Collection.find(),它仅在谓词函数返回true时才返回元素。

const myChannels = mg.channels.filter(c => c.client.user.id === '595840576386236437' && ['modmail', 'qanda'].includes(c.name) && c.type === 'text');
const myRole = mg.roles.find(r => r.client.user.id === '595840576386236437' && r.name === 'ModMail');

if (myChannels.size !== 0 || myRole) {
  return message.channel.send('Rejected! There\'s possible fragments of modmail already set up here!')
    .catch(console.error);
}