在大多数情况下,我尝试执行userinfo命令,但我似乎无法从下面的状态字段中获取状态字段,它说:“当我联机时脱机,并且不管我尝试什么权限,它都发送给我一个终端错误,上面写着未定义,对于昵称字段,它在嵌入中给了我未定义的字段。
const Discord = require('discord.js');
module.exports = {
name: 'user',
description: 'Get your or someone else\'s user info',
aliases: ['u',],
cooldown: 2,
execute(message) {
if (!message.mentions.users.size) {
const embed = new Discord.MessageEmbed()
.setTitle(message.author.username)
.addField('Created',message.author.createdAt)
.addField('ID',message.author.id)
.addField('Nickname',message.author.nickname, true)
.addField("Status",`${ message.author.presence.status}`, true)
.addField('Joined current server on', message.member.joinedAt)
.addField('Currently in', message.guild.name)
.addField('Roles', `<@&${message.guild.member(message.author)._roles.join('> <@&')}>`, true)
.addField('Permissions',`${message.author.permissions}` )
.addField('Status',message.author.presence.status)
.setColor(0x00ffff)
.setThumbnail(message.author.displayAvatarURL({ format: 'png' }))
.setFooter(`Requested By:${message.author.username}`)
.setTimestamp();
return message.channel.send(embed);发布于 2020-10-29 12:07:11
这段代码有几处问题。首先,Message.author返回一个没有nickname的User。因为每个服务器都可以修改昵称,所以您需要一个GuildMember。
此外,如果GuildMember.nickname实际上没有昵称,GuildMember将返回未定义的昵称。有几种方法你可以修复它。您可以使用GuildMember.displayName,这将尝试显示昵称,但如果找不到用户名,则显示用户名,或者您可以使用逻辑或运算符||来处理它。
// method 1:
.addField('Nickname', message.author.displayName, true)
// method 2:
.addField('Nickname', message.author.nickname || 'This user has no nickname', true)谈到GuildMembers和Users,您正在使用一种非常复杂的方法来获取作者的GuildMember实例:
message.guild.member(message.author);实际上,有一种更容易使用的方法:Message.member。它与Message.author相同,但返回一个GuildMember。另外,我不知道为什么要使用_roles getter而不是效率更高的roles。
message.author.permissions也有同样的问题,因为每个行会都会修改权限,并且没有一个全局值。即使如此,它仍将返回[object Object]。即使没有,它也可能返回一般不和谐用户无法保存的位域表示。
相反,您应该使用Permissions.toArray()方法,它将根据可用位(所有成员的权限)返回一个位字段名数组。它看起来可能有点像这样:
[
CREATE_INSTANT_INVITE,
ADD_REACTIONS,
STREAM,
VIEW_CHANNEL,
SEND_MESSAGES,
EMBED_LINKS,
ATTACH_FILES,
READ_MESSAGE_HISTORY,
USE_EXTERNAL_EMOJIS,
CONNECT,
SPEAK,
USE_VAD,
CHANGE_NICKNAME,
];您可以使用Array.prototype.join()通过换行、逗号和空格等方式连接这些元素。
另外,您不应该使用模板文本,除非您想要向一个带有其他字符/模板文本的字符串中添加一个变量,或者您需要强制该变量的数据类型为string。例如,message.author.presence.status已经是一个字符串,因此:
- `${ message.author.presence.status}`
+ message.author.presence.statusPresence.status返回“脱机”是因为you don't have the GUILD_PRESENCES intent enabled
https://stackoverflow.com/questions/64585850
复制相似问题