如何用Discord.js非斜杠命令实现频道固定消息自动重发功能?
Discord.js 非斜杠命令实现固定消息自动重发功能
核心逻辑
通过存储目标频道ID、固定消息内容以及机器人发送的固定消息ID,监听频道新消息事件,当非机器人用户发送消息时,删除原固定消息并重新发送,同时更新存储的消息ID。
实现步骤及代码示例
1. 初始化存储结构
在代码顶部定义一个对象,用来保存各个频道的固定消息配置:
// 存储固定消息配置:key为频道ID,value为{ content: 消息内容, messageId: 机器人发送的消息ID } const stickyMessages = {};
2. 编写设置固定消息的命令
实现一个非斜杠命令(比如!setsticky),让管理员指定目标频道和消息内容:
client.on('messageCreate', async (message) => { // 忽略机器人消息 if (message.author.bot) return; // 仅允许管理员执行设置命令 if (!message.member.permissions.has('ADMINISTRATOR')) return; // 解析命令:!setsticky #频道 消息内容(支持换行) const args = message.content.split(/\s+/); if (args[0] !== '!setsticky') return; // 获取目标频道 const targetChannel = message.mentions.channels.first() || client.channels.cache.get(args[1]); if (!targetChannel || targetChannel.type !== 'GUILD_TEXT') { return message.reply('请指定有效的文本频道'); } // 获取消息内容(保留换行格式) const content = message.content.slice(args[0].length + (targetChannel.id.length + 2)); // 在目标频道发送固定消息并保存ID const sentMessage = await targetChannel.send(content); stickyMessages[targetChannel.id] = { content: content, messageId: sentMessage.id }; message.reply(`已在${targetChannel}设置固定消息`); });
3. 监听频道消息实现自动重发
添加消息监听逻辑,当目标频道有新消息时触发重发:
client.on('messageCreate', async (message) => { // 忽略机器人消息(避免死循环) if (message.author.bot) return; // 检查当前频道是否有配置的固定消息 const stickyConfig = stickyMessages[message.channel.id]; if (!stickyConfig) return; try { // 删除原固定消息 const oldMessage = await message.channel.messages.fetch(stickyConfig.messageId); await oldMessage.delete(); // 重新发送固定消息并更新存储的消息ID const newMessage = await message.channel.send(stickyConfig.content); stickyMessages[message.channel.id].messageId = newMessage.id; } catch (err) { // 处理原消息已被删除的情况,直接重新发送 const newMessage = await message.channel.send(stickyConfig.content); stickyMessages[message.channel.id].messageId = newMessage.id; } });
注意事项
- 权限控制:确保只有管理员能执行
!setsticky命令,避免普通用户随意修改固定消息。 - 消息格式:如果需要发送带Markdown格式的消息(比如示例中的加粗、换行),直接在命令中输入对应格式即可,Discord.js会自动解析。
- 持久化:如果机器人重启后需要保留配置,需要将
stickyMessages数据写入本地文件或数据库(比如JSON文件、SQLite),重启时读取加载。
内容的提问来源于stack exchange,提问作者Ethan Cook
相关产品推荐
相关产品推荐

