Node.js:如何避免Discord机器人重复发送名言
实现Discord机器人不重复发送名言的方案
要实现名言不重复发送,核心是维护一个可用名言的动态列表,每次发送后移除已选中的名言,直到列表为空时重置。以下是修改后的完整代码:
const Discord = require('discord.js'); require('dotenv').config(); const client = new Discord.Client(); const config = require("./config.json"); const quotes = [ { id: "1", quote: "This is quote 1" }, { id: "2", quote: "This is quote 2" }, { id: "3", quote: "This is quote 3" }, { id: "4", quote: "This is quote 4" }, { id: "5", quote: "This is quote 5" }, ]; // 初始化可用名言列表,复制原数组避免修改数据源 let availableQuotes = [...quotes]; client.on('message', (msg) => { if (msg.content.startsWith("T!quote")) { // 如果可用列表为空,重置为原名言数组的副本 if (availableQuotes.length === 0) { availableQuotes = [...quotes]; msg.channel.send("所有名言已轮播完毕,重新开始!"); } // 从可用列表中随机选取索引 const randomIndex = Math.floor(Math.random() * availableQuotes.length); const selectedQuote = availableQuotes[randomIndex]; // 发送名言 msg.channel.send(`${selectedQuote.quote} Quote #: ${selectedQuote.id}`); // 从可用列表中移除已发送的名言 availableQuotes.splice(randomIndex, 1); } }); // 登录机器人(原代码缺失,补充完整) client.login(process.env.DISCORD_TOKEN);
关键改动说明:
availableQuotes动态列表:用扩展运算符([...quotes])复制原名言数组,作为可操作的动态列表,避免修改原始数据源。- 空列表重置逻辑:每次触发命令前检查可用列表是否为空,若为空则重新复制原数组,并提示用户轮播完毕。
- 移除已发送名言:用
splice()方法从可用列表中删除已选中的名言,确保下次不会重复选取。
这种方法的优势:
- 保证一轮内所有名言只发送一次
- 一轮结束后自动重置,支持无限循环
- 不破坏原始的名言数组
内容的提问来源于stack exchange,提问作者Trader
相关产品推荐
相关产品推荐

