一段时间以来,我一直在制作Discord Node.JS机器人,我正在使用“ unban”命令,但是我遇到的问题是两个问题,首先,即使他们未被禁止,它也会尝试禁止成员,第二个是最大的,client.fetchUser(toUnban)
无法解析“ .username”和“ .avatarURL”之类的内容。
我已经尝试制作一个单独的系统来收集此数据(因为它起作用了),并且只能在函数中使用它。不在外面。
client.fetchUser(toUnban)
.then(user => console.log(user.username))
.then(user => usersname = user.username)
.catch(console.error)
console.log(usersname)
将打印(例如)
Clichefoox
如果在此函数之外调用,它将不打印任何内容。如果在内部调用它将打印一些内容。问题是我正在尝试使其获得avatarURL AND用户名。因此,我不知道如何在一个RichEmbed中实现两者。
完整代码:
const Discord = require('discord.js')
exports.run = (client, message, args) => {
if (!message.member.hasPermission("BAN_MEMBERS") || !message.author == message.guild.owner) return message.channel.send("You don't have access to this command. :x:")
if (!message.guild.me.hasPermission("ADMINISTRATOR")) return message.channel.send(`${message.guild.owner} did not give me permission to do this! If you are the owner, please run this command \`${client.config.PREFIX}fixserver\`!`)
let toUnban = args[0]
if (!toUnban) return message.channel.send("You did not give a User ID!")
if (toUnban.includes("@")) { return message.channel.send("That is not a User ID!") }
let reason = args.slice(1).join(" ")
if (!reason) reason = "No reason."
var Embed = new Discord.RichEmbed()
.setColor('#ebe234')
.setTimestamp()
.setDescription(`**${client.fetchUser(toUnban).username}** has been unbanned from the server!`)
.setFooter(`V${client.config.VERSION} | ${toUnban}`, client.user.displayAvatarURL)
.setAuthor("Unbanned", client.fetchUser(toUnban).avatarURL)
.addField("User", message.author.tag, true)
.addField("Reason", reason, true)
var cEmbed = new Discord.RichEmbed()
.setColor('#2b2b2b')
.setTimestamp()
.setDescription(`**${client.fetchUser(toUnban).username}** has been unbanend.`)
.setAuthor("Unbanned", client.fetchUser(toUnban).avatarURL)
.addField("Reason", reason)
try {
message.guild.unban(toUnban, reason)
} catch(e) {
return message.reply("This user isn't banned!")
}
message.channel.send({embed: cEmbed})
try {
var logChannel = message.guild.channels.find(c => c.name === "bot-logs")
logChannel.send({embed: Embed})
} catch(e) {
message.guild.createChannel("bot-logs", {
type: 'text',
permissionOverwrites: [{
id: message.guild.id,
deny: ['READ_MESSAGES', 'SEND_MESSAGES']
}]
})
setTimeout(function(){
var logChannel = message.guild.channels.find(c => c.name === "bot-logs")
logChannel.send({embed: Embed})
}, client.ping*2.5)
}
}
预期的结果是,它会根据Client#FetchUser来理解用户名,它会传递“ User”类,因此我尝试将其称为普通User类,但没有收到错误或输出,只是空白。
答案 0 :(得分:2)
.then(user => console.log(user.username))
告诉代码接受用户,打印user.username,然后返回console.log的返回值,该值未定义。
尝试
.then(user => {
console.log(user.username);
return user;
}
或更简洁地
.then(user => console.log(user.username) || user)
答案 1 :(得分:0)
为有此问题的其他人提供此答案,但是Client#fetchUser确实不值得使用。相反,我将使用
let user = client.users.get(toUnban);
为什么?-因为这不像Client#fetchUser那样麻烦。
client.user上的文档及其传递的内容:Client#Users,它传递了User
类,该类可用于通过ID来获取用户,这就是我正在做的事情。也可以用于按名称搜索。
此外,在尝试取消禁止成员之前,我将用于检查成员是否被禁止的方法看起来像这样:
try {
const banList = await message.guild.fetchBans();
const bannedUser = banList.find(user => user.id === toUnban);
if (!bannedUser) return message.channel.send("This user is not banned!");
} catch(e) {
console.log(e);
};
从Stackoverflow提供的代码示例
您需要将您的exports.run
部分放入 async 中,因为它会唤醒 guild#fetchBans,因为它会返回有关Promise的有关异步/等待的更多信息可用的here,如下所示:
exports.run = async (client, message, args) => {
// your code
};
这仅仅是比我在互联网上发现的更多的理解。