Discord v13 获取服务器所有者用户名及修复region返回undefined问题
Discord.js v13 serverinfo命令问题修复方案
1. 服务器所有者信息获取失败问题
原因
Discord.js v13 为了优化性能,取消了 Guild 实例上默认挂载的 owner 属性,仅保留 ownerId 字段存储所有者ID,需要主动调用接口拉取完整的所有者成员信息。
解决方法
在构建嵌入之前调用异步方法 message.guild.fetchOwner() 获取所有者的 GuildMember 实例,即可通过实例的 user 属性获取用户名、tag等信息:
// 新增在siEmbed定义之前 const owner = await message.guild.fetchOwner();
对应的嵌入字段修改为:
.addField("Server Owner", `• \`${owner.user.tag} (${message.guild.ownerId})\``, inline)
注意:如果拉取失败请检查Discord开发者后台中你的机器人是否开启了
GUILDS网关意图。
2. guild.region返回undefined问题
原因
Discord官方在v9版本API中废弃了服务器全局区域设置,区域属性改为每个语音频道单独配置,因此Guild实例上的region属性已被完全移除,访问该字段自然返回undefined。
解决方法
目前主流的serverinfo命令都已取消全局服务器区域展示,你可以直接删除该字段。如果确实需要展示区域相关内容,可以统计服务器内语音频道的区域分布:
// 统计所有语音频道的区域,去重后展示 const voiceRegions = [...new Set(message.guild.channels.cache.filter(ch => ch.type === 'GUILD_VOICE').map(ch => ch.rtcRegion || '自动'))]; .addField("语音频道区域", `• \`${voiceRegions.join('、')}\``, inline)
完整修改后代码
const { MessageEmbed } = require("discord.js"); const config = require("../../botconfig"); module.exports = { name: "serverinfo", aliases: ["si", "server-info", "server-Info"], description: "Shows info on a server!", usage: `serverinfo`, run: async (client, message, args) => { const inline = true; let members = message.guild.memberCount; // 拉取服务器所有者信息 const owner = await message.guild.fetchOwner(); // 统计语音频道区域(不需要可以删除) const voiceRegions = [...new Set(message.guild.channels.cache.filter(ch => ch.type === 'GUILD_VOICE').map(ch => ch.rtcRegion || '自动'))]; const siEmbed = new MessageEmbed() .setAuthor(message.guild.name, message.guild.iconURL()) .setThumbnail(message.guild.iconURL()) .addField("服务器创建时间", `<t:${~~(message.channel.guild.createdAt / 1000)}:R>`, true) .addField("服务器所有者", `• \`${owner.user.tag} (${message.guild.ownerId})\``, inline) // 替换原来的region字段,不需要可以删掉这行 .addField("语音区域", `• \`${voiceRegions.join('、')}\``, inline) .addField("总成员数", `• \`${members.toLocaleString()}\``, inline) .addField("文字频道数", `• \`${message.guild.channels.cache.filter(ch => ch.type === "GUILD_TEXT").size}\``, inline) .addField("语音频道数", `• \`${message.guild.channels.cache.filter(ch => ch.type === "GUILD_VOICE").size}\``, inline) .addField("总角色数", `• \`${message.guild.roles.cache.size}\``, inline) .setColor("#FFA500") .setFooter(`服务器ID: ${message.guild.id}`) .setTimestamp() message.reply({ embeds: [siEmbed] }); } };
额外提示:v13中频道类型枚举值也有调整,原来的
voice要改为GUILD_VOICE,text要改为GUILD_TEXT,避免筛选结果不准确。
内容的提问来源于stack exchange,提问作者Roman Beard
相关产品推荐
相关产品推荐

