如何为我的机器人编写带有原因功能的踢球
How to write a kick with reason function for my bot
我试图让我的代码有理由地踢人,并私信他们说他们因 <reason>
被踢出了 <server>
。目前它没有发送原因。
查看了在线教程,但没有成功。我也问过一些人,他们也不知道。似乎没有多少人使用 discord.js,任何帮助将不胜感激。 =)
Message Bot Sends Message I Sent
const Discord = require('discord.js');
const { token } = require('./config.json');
var { prefix, logchannel } = require('./config.json');
const client = new Discord.Client();
client.once('ready', () => {
console.log('Bot loaded!');
client.user.setActivity('SUPPORT: !info', {
type: 'PLAYING'
});
})
client.on('message', message => {
if (message.content === `${prefix}ping`) {
message.channel.send('Pong.');
console.log(`COMMAND: ${message.member.displayName} issued ping command.`);
} else if (message.content === `${prefix}info`) {
message.channel.send(`This server's name is: ${message.guild.name}
It has ${message.guild.memberCount} total members.
It is running **WastefulBot** by **USER HIDDEN**
For support please join LINK HIDDEN`);
console.log(`COMMAND: ${message.member.displayName} issued info command.`);
} else if (message.content === `${prefix}help`) {
console.log(`COMMAND: ${message.member.displayName} issued help command.`);
message.delete();
message.channel.send('Please check your dm\'s.');
message.member.send(`__**WastefulBot Help**__
!ping | Pong.
!info | Returns information on the server and how to get support for the bot.
!donate | Get information on how to donate.
!help | Shows this information.
__**Administration Commands**__
(Please note these commands require corresponding permissions)
!kick <@user> | Kicks the specified user.
!ban <@user> | Bans the specified user.
__**Management Commands**__
(Please note these commands require corresponding permissions)
!staff | Grants a user staff. (WIP - May not work on most servers.)
`);
}
if (message.content === (`${prefix}setlog`)) {
if (message.member.hasPermission("MANAGE_CHANNEL")) {
message.channel.send('Sorry. This command is currently WIP.');
console.log(`WARNING: ${message.member.displayName} issued setlog command, this command is WIP and does not work.`);
}
}
if (message.content === (`${prefix}donate`)) {
message.channel.send('You can donate at ``https://www.patreon.com/wasteful_development``');
}
//KICK COMMAND STARTS HERE
else if (message.content.startsWith(`${prefix}kick`)) {
if (message.member.hasPermission("KICK_MEMBERS")) {
if (!message.mentions.users.size) {
return message.reply('You must tag 1 user.');
} else {
let member = message.mentions.members.first();
let reason = message.content.split(" ").slice(22);
if (member.kickable == false) {
message.channel.send("That user cannot be kicked!");
return;
} else {
member.send(`You have been kicked from \`\`${message.guild.name}\`\` for the reason ${reason}.`).then((message) => {
member.kick(reason).then((member) => {
message.channel.send(" " + member.displayName + " has been kicked!");
console.log(`KICK: ${message.member.displayName} successfully executed kick command.`);
});
});
}
}
} else {
message.channel.send("You do not have permission to use kick.");
return;
}
}
//End of kick mthd
else if (message.content.startsWith(`${prefix}staff`)) {
if (message.member.hasPermission("MANAGE_ROLES")) {
if (!message.mentions.users.size) {
return message.reply('You must tag 1 user.');
} else {
let member = message.mentions.members.first();
member.addRole("569174153337503804");
message.channel.send(`Granted ${member.displayName} staff!`);
message.channel.send(`Warning this command will not have worked on most servers as it is WIP.`);
console.log(`STAFF: ${message.member.displayName} successfully granted ${member.displayName} staff .`);
}
} else {
message.channel.send("**You do not have permission to grant users staff.**");
return;
}
}
});
client.login(token);
由于用户的隐私设置而被踢出后,您的机器人可能无法向用户发送 DM。因为用户被踢了,他们不再与机器人共享服务器(除非它是一个非常全球使用的机器人,这会增加用户在使用该机器人的多个服务器中的几率),这意味着该机器人的可能性无法向该用户发送 DM,是非常高的。
以下不是答案,用户和会员都有.send()
您的代码中的错误是 member.send()
。你看,member
and user
是两个不同的东西。
.send()
仅适用于 user
, so you should do member.user.send()
,它会起作用。
此外,您将需要捕获该承诺,因此如果该用户禁用了 DM,因为如果禁用了该机器人,则机器人无法 DM 用户。类似于:
await member.user.send(`You have been kicked!`)
.catch(() => message.channel.send("User seems to have DMs disabled!"));
await member.kick("reason")
.then(member => message.channel.send(`${member.displayName} has been kicked!`))
.catch(e => console.error(e.stack));
请记住,await
是 another way 异步函数中的链接 then
。
解释:
查看您的错误,这是问题的时间表。
- 这一切的根源在于,由于公会 (here) 中的隐私设置,机器人无法向成员发送 DM。这导致
member.send(...)
被拒绝。
- 由于没有捕获到这个被拒绝的承诺,代码继续
.then()
没有返回预期的 message
参数。
- 当您尝试读取
message.member
的 displayName
属性 时,它会抛出错误,因为您的参数 message
从未返回。
解决方案:
实施 .catch()
方法来 处理拒绝承诺的可能性。
请记住,您必须将函数声明为异步才能使用 await
:
client.on('message', async message => { // ES6
然后,在你的命令中:
await member.send(`You have been kicked from \`${message.guild.name}\`. Reason: \`${reason}\``)
.catch(err => message.channel.send(`⚠ Unable to alert ${member} of reason.`));
await member.kick(reason);
await message.channel.send(` ${member} has been kicked!`);
console.log(`${message.author.tag} kicked ${member.user.tag} from '${message.guild.name}'.`);
您的原因代码应该是:
const reason = message.content.split(' ').splice(2)
数字 3 代表命令中原因开始的单词。
例如>踢@原因
因此 >kick
将变为 0
,然后 @<user>
将变为 1
,而 reason
将变为 2
, 所以基本上 splice 是它停止的词,2 之后的每个词都是你的原因,如果有意义的话包括 2。
我尽力解释了:)
我试图让我的代码有理由地踢人,并私信他们说他们因 <reason>
被踢出了 <server>
。目前它没有发送原因。
查看了在线教程,但没有成功。我也问过一些人,他们也不知道。似乎没有多少人使用 discord.js,任何帮助将不胜感激。 =)
Message Bot Sends Message I Sent
const Discord = require('discord.js');
const { token } = require('./config.json');
var { prefix, logchannel } = require('./config.json');
const client = new Discord.Client();
client.once('ready', () => {
console.log('Bot loaded!');
client.user.setActivity('SUPPORT: !info', {
type: 'PLAYING'
});
})
client.on('message', message => {
if (message.content === `${prefix}ping`) {
message.channel.send('Pong.');
console.log(`COMMAND: ${message.member.displayName} issued ping command.`);
} else if (message.content === `${prefix}info`) {
message.channel.send(`This server's name is: ${message.guild.name}
It has ${message.guild.memberCount} total members.
It is running **WastefulBot** by **USER HIDDEN**
For support please join LINK HIDDEN`);
console.log(`COMMAND: ${message.member.displayName} issued info command.`);
} else if (message.content === `${prefix}help`) {
console.log(`COMMAND: ${message.member.displayName} issued help command.`);
message.delete();
message.channel.send('Please check your dm\'s.');
message.member.send(`__**WastefulBot Help**__
!ping | Pong.
!info | Returns information on the server and how to get support for the bot.
!donate | Get information on how to donate.
!help | Shows this information.
__**Administration Commands**__
(Please note these commands require corresponding permissions)
!kick <@user> | Kicks the specified user.
!ban <@user> | Bans the specified user.
__**Management Commands**__
(Please note these commands require corresponding permissions)
!staff | Grants a user staff. (WIP - May not work on most servers.)
`);
}
if (message.content === (`${prefix}setlog`)) {
if (message.member.hasPermission("MANAGE_CHANNEL")) {
message.channel.send('Sorry. This command is currently WIP.');
console.log(`WARNING: ${message.member.displayName} issued setlog command, this command is WIP and does not work.`);
}
}
if (message.content === (`${prefix}donate`)) {
message.channel.send('You can donate at ``https://www.patreon.com/wasteful_development``');
}
//KICK COMMAND STARTS HERE
else if (message.content.startsWith(`${prefix}kick`)) {
if (message.member.hasPermission("KICK_MEMBERS")) {
if (!message.mentions.users.size) {
return message.reply('You must tag 1 user.');
} else {
let member = message.mentions.members.first();
let reason = message.content.split(" ").slice(22);
if (member.kickable == false) {
message.channel.send("That user cannot be kicked!");
return;
} else {
member.send(`You have been kicked from \`\`${message.guild.name}\`\` for the reason ${reason}.`).then((message) => {
member.kick(reason).then((member) => {
message.channel.send(" " + member.displayName + " has been kicked!");
console.log(`KICK: ${message.member.displayName} successfully executed kick command.`);
});
});
}
}
} else {
message.channel.send("You do not have permission to use kick.");
return;
}
}
//End of kick mthd
else if (message.content.startsWith(`${prefix}staff`)) {
if (message.member.hasPermission("MANAGE_ROLES")) {
if (!message.mentions.users.size) {
return message.reply('You must tag 1 user.');
} else {
let member = message.mentions.members.first();
member.addRole("569174153337503804");
message.channel.send(`Granted ${member.displayName} staff!`);
message.channel.send(`Warning this command will not have worked on most servers as it is WIP.`);
console.log(`STAFF: ${message.member.displayName} successfully granted ${member.displayName} staff .`);
}
} else {
message.channel.send("**You do not have permission to grant users staff.**");
return;
}
}
});
client.login(token);
由于用户的隐私设置而被踢出后,您的机器人可能无法向用户发送 DM。因为用户被踢了,他们不再与机器人共享服务器(除非它是一个非常全球使用的机器人,这会增加用户在使用该机器人的多个服务器中的几率),这意味着该机器人的可能性无法向该用户发送 DM,是非常高的。
以下不是答案,用户和会员都有.send()
您的代码中的错误是 member.send()
。你看,member
and user
是两个不同的东西。
.send()
仅适用于 user
, so you should do member.user.send()
,它会起作用。
此外,您将需要捕获该承诺,因此如果该用户禁用了 DM,因为如果禁用了该机器人,则机器人无法 DM 用户。类似于:
await member.user.send(`You have been kicked!`)
.catch(() => message.channel.send("User seems to have DMs disabled!"));
await member.kick("reason")
.then(member => message.channel.send(`${member.displayName} has been kicked!`))
.catch(e => console.error(e.stack));
请记住,await
是 another way 异步函数中的链接 then
。
解释:
查看您的错误,这是问题的时间表。
- 这一切的根源在于,由于公会 (here) 中的隐私设置,机器人无法向成员发送 DM。这导致
member.send(...)
被拒绝。 - 由于没有捕获到这个被拒绝的承诺,代码继续
.then()
没有返回预期的message
参数。 - 当您尝试读取
message.member
的displayName
属性 时,它会抛出错误,因为您的参数message
从未返回。
解决方案:
实施 .catch()
方法来 处理拒绝承诺的可能性。
请记住,您必须将函数声明为异步才能使用 await
:
client.on('message', async message => { // ES6
然后,在你的命令中:
await member.send(`You have been kicked from \`${message.guild.name}\`. Reason: \`${reason}\``)
.catch(err => message.channel.send(`⚠ Unable to alert ${member} of reason.`));
await member.kick(reason);
await message.channel.send(` ${member} has been kicked!`);
console.log(`${message.author.tag} kicked ${member.user.tag} from '${message.guild.name}'.`);
您的原因代码应该是:
const reason = message.content.split(' ').splice(2)
数字 3 代表命令中原因开始的单词。 例如>踢@原因
因此 >kick
将变为 0
,然后 @<user>
将变为 1
,而 reason
将变为 2
, 所以基本上 splice 是它停止的词,2 之后的每个词都是你的原因,如果有意义的话包括 2。
我尽力解释了:)