如何在discord.js中实现统计用户发消息数的斜杠命令?
实现Discord斜杠命令统计用户消息数
首先,你需要给命令添加用户选项来指定统计目标(默认可为调用者自身),再通过遍历服务器文本频道统计目标用户的消息数量。以下是完整实现方案:
核心步骤
- 给
SlashCommandBuilder添加可选用户参数,支持指定统计对象 - 在执行逻辑中获取目标用户,默认取命令调用者
- 遍历服务器所有文本频道,获取消息并过滤计数
- 处理权限不足等异常情况
完整代码
const { SlashCommandBuilder } = require("discord.js"); module.exports = { data: new SlashCommandBuilder() .setName("user") .setDescription("返回指定用户发送的消息数量") .addUserOption(option => option.setName("target") .setDescription("要统计消息数的用户(默认是你自己)") .setRequired(false)), async execute(interaction) { // 获取目标用户,默认指向命令调用者 const targetUser = interaction.options.getUser("target") || interaction.user; let messageCount = 0; // 筛选服务器内所有文本频道并遍历 for (const channel of interaction.guild.channels.cache.filter(c => c.isTextBased())) { try { // 分批获取频道最近100条消息(避免API限制) const messages = await channel.messages.fetch({ limit: 100 }); // 统计目标用户的消息数 messageCount += messages.filter(msg => msg.author.id === targetUser.id).size; } catch (err) { console.log(`无法读取频道 ${channel.name} 的消息历史:${err.message}`); } } await interaction.reply(`${targetUser.tag} 累计发送了 ${messageCount} 条消息`); }, };
注意要点
- 代码默认只统计每个频道最近100条消息,若需统计更早消息,需通过
before参数循环分页获取 - 确保机器人拥有
ViewChannel和ReadMessageHistory频道权限 - 大量获取消息可能触发Discord API速率限制,建议添加延迟或优化批量处理逻辑
内容的提问来源于stack exchange,提问作者Osemu Aimiosior
相关产品推荐
相关产品推荐

