Discord Bot用户信息命令(userinfo)在用户未进行游戏时崩溃的问题求助
解决Discord.js Userinfo命令在用户未游戏时崩溃的问题
嘿,好久没碰discord.js确实容易踩些小坑,我帮你梳理下问题和修复方案:
1. 核心崩溃原因:错误调用User对象的属性
你代码里用了user.joinedAt,但**User对象根本没有joinedAt这个属性**——用户加入服务器的时间是GuildMember(也就是你定义的member变量)的专属属性,这是导致崩溃的关键之一。
把这段代码:
const joinServer = moment(user.joinedAt).format('llll');
改成:
const joinServer = moment(member.joinedAt).format('llll');
同时后面的服务器加入时间字段也要同步替换:
.addField("Joined The Server On:", `${moment.utc(member.joinedAt).format("dddd, MMMM Do YYYY")}`)
2. 处理无游戏活动的边界情况
当用户没在玩游戏时,user.presence.activities.filter(x=>x.type === "PLAYING")会返回空数组,直接塞到embed里不仅不美观,还可能因为用户隐私设置导致user.presence为null而报错。我们可以优化成:
// 用可选链避免空值报错,找到第一个正在玩的活动 const playingActivity = user.presence?.activities?.find(x => x.type === "PLAYING"); // 有活动就显示名称,没有就显示"None" const gameName = playingActivity ? playingActivity.name : "None";
然后把embed里的Game字段替换成:
.addField("Game:", `${gameName}`, true)
3. 额外的鲁棒性优化
给用户状态也加上空值保护,防止因为隐私设置导致user.presence.status取不到值:
.addField("Status:", `${user.presence?.status || "Unknown"}`, true)
修复后的完整代码
const Discord = require('discord.js'); const moment = require('moment'); module.exports = { name: "userinfo", aliases: ['ui', 'user', 'uinfo'], category: "info", description: "shows information of the user you mentioned", usage: "[command | alias]", run: async (client, message, args) => { const user = message.mentions.users.first() || message.author; const member = message.mentions.members.first() || message.member; const joinDiscord = moment(user.createdAt).format('llll'); const joinServer = moment(member.joinedAt).format('llll'); // 处理游戏活动,添加空值保护 const playingActivity = user.presence?.activities?.find(x => x.type === "PLAYING"); const gameName = playingActivity ? playingActivity.name : "None"; const embed = new Discord.MessageEmbed() .setColor('#724e72') .setTitle(`**Information for** ${user.tag}`) .setAuthor(`${message.author.tag}`, message.author.displayAvatarURL()) .setDescription('Shows information for mentioned user') .setThumbnail(user.displayAvatarURL()) .addField(`${user.tag}`, `${user}`, true) .addField("Nickname:", `${member.displayName}`, true) .addField("Status:", `${user.presence?.status || "Unknown"}`, true) .addField("Game:", `${gameName}`, true) .addField("Bot:", `${user.bot}`, true) .addField("Joined The Server On:", `${moment.utc(member.joinedAt).format("dddd, MMMM Do YYYY")}`) .addField("Account Created On:", `${moment.utc(user.createdAt).format("dddd, MMMM Do YYYY")}`, true) .addField("Roles:", member.roles.cache.map(r => '`'+r.name+'`').slice(0,-1)) .setTimestamp() .setFooter('a') message.channel.send(embed); } }
这样修改后,不管用户是否在玩游戏、是否隐藏了状态,机器人都不会崩溃,显示内容也更友好啦~
内容的提问来源于stack exchange,提问作者clxne




