You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 11:09:25