You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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.presencenull而报错。我们可以优化成:

// 用可选链避免空值报错,找到第一个正在玩的活动
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

火山引擎 最新活动