[英]How can I make it so that my bot gives a role to a user when they repeat a set of numbers?
我正在尝试制作一个机器人,使用户可以完全访问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));
}
});
我没有收到任何错误消息,该机器人也没有崩溃。 当我重复这个数字时,什么也没有发生。
在发送带有代码的消息后,您的客户端无法神奇地知道响应是什么。 但是,您的代码似乎假定了这一点; 您正在尝试在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
语句。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.