我正在尝试创建一个使用户具有完全访问Discord服务器权限的机器人。
我已经让漫游器提供了一个随机数,并在用户加入时给用户一个来宾角色,但是当他们重复该数字时,我需要我的漫游器为他们赋予成员角色。
这是我的代码:
let code;
client.on('guildMemberAdd', member => {
const channel = member.guild.channels.find(ch => ch.name === 'captcha');
if (!channel) return;
member.addRole(member.guild.roles.find("name", "Guest"));
code = Math.floor(Math.random() + Math.random() + Math.random() + Math.random() * 992875 + Math.random());
channel.send('Welcome, ' + member.toString() + '! Please repeat these numbers to get access to this server: ' + code);
if (message.content == code) {
member.addRole(member.guild.roles.find("name", "Member"));
code = -1;
}
});
client.on('message', async message => {
if (message.content === 'fakeJoin--') {
client.emit('guildMemberAdd', message.member || await message.guild.fetchMember(message.author));
}
});
我没有收到任何错误消息,机器人也没有崩溃。当我重复号码时什么也没发生。
答案 0 :(得分:0)
在发送带有代码的消息后,您的客户无法神奇地知道响应是什么。但是,您的代码似乎假定了这一点;您尝试在guildMemberAdd
事件中没有任何消息的情况下阅读message.content
。
要解决此问题,您需要捕获通道中发送的消息,然后阅读用户的响应。
选项A:邮件收集器
可以创建MessageCollector来收集(您猜对了!)通道中发送的消息。根据您的情况,您可以创建一个,在收集时检查消息,然后将内容与正确的代码进行比较。
client.on('guildMemberAdd', async member => {
if (member.user.bot) return;
const channel = member.guild.channels.find(c => c.type === 'text' && c.name === 'captcha');
const guestRole = member.guild.roles.find(r => r.name === 'Guest');
const memebrRole = member.guild.roles.find(r => r.name === 'Member');
try {
await member.addRole(guestRole);
let code = '';
for (let i = 0; i < 6; i++) code += `${Math.floor(Math.random() * 10)}`;
await channel.send(`Welcome, ${member}. Please repeat this code to continue: \`${code}\``);
const collector = channel.createMessageCollector(message => message.author.id === member.id, { maxMatches: 1 });
collector.on('collect', async message => {
if (message.content === code) {
await channel.send('Thank you. You may now continue into the server.');
await member.removeRole(guestRole);
await member.addRole(memberRole);
} else await member.kick('Failed verification.');
});
} catch(err) {
console.error(err);
}
});
选项B:等待消息
TextChannel.awaitMessages
是消息收集器的异步等效项。但是,Promise始终以Collection进行解析。
client.on('guildMemberAdd', async member => {
if (member.user.bot) return;
const channel = member.guild.channels.find(c => c.type === 'text' && c.name === 'captcha');
const guestRole = member.guild.roles.find(r => r.name === 'Guest');
const memebrRole = member.guild.roles.find(r => r.name === 'Member');
try {
await member.addRole(guestRole);
let code = '';
for (let i = 0; i < 6; i++) code += `${Math.floor(Math.random() * 10)}`;
await channel.send(`Welcome, ${member}. Please repeat this code to continue: \`${code}\``);
const collected = await channel.awaitMessages(message => message.author.id === member.id, { maxMatches: 1 });
const message = collected.first(); // The only message in the returned Collection.
if (message.content === code) {
await channel.send('Thank you. You may now continue into the server.');
await member.removeRole(guestRole);
await member.addRole(memberRole);
} else await member.kick('Failed verification.');
} catch(err) {
console.error(err);
}
});
您会注意到我对基本代码进行了一些更改。我想解释其中的一些改进。
await
。MANAGE_SERVER
权限才能首先添加它。Collection.find()
。try...catch
语句。