【问题标题】:Discord bot with multiple messages when detected a word检测到一个单词时带有多条消息的不和谐机器人
【发布时间】:2021-09-26 22:48:14
【问题描述】:

我有一个不和谐的机器人,当说一个词时会触发它,我最初让它只说一件事(原帖在这里供参考:Discord bot unintentionally spamming messages after user response)但我现在希望它有多个说法,所以我用带有由随机数生成器函数生成的随机数的 switch 语句,它在 switch 语句中被调用以用于消息输出。由于某种原因,我的代码不起作用,我不确定为什么。

                let Discord;
                let Database;
                if(typeof window !== "undefined"){
                    Discord = DiscordJS;
                    Database = EasyDatabase;
                } else {
                    Discord = require("discord.js");
                    Database = require("easy-json-database");
                }
                const delay = (ms) => new Promise((resolve) => setTimeout(() => resolve(), ms));
                const s4d = {
                    Discord,
                    client: null,
                    tokenInvalid: false,
                    reply: null,
                    joiningMember: null,
                    database: new Database("./db.json"),
                    checkMessageExists() {
                        if (!s4d.client) throw new Error('You cannot perform message operations without a Discord.js client')
                        if (!s4d.client.readyTimestamp) throw new Error('You cannot perform message operations while the bot is not connected to the Discord API')
                    }
                };
                s4d.client = new s4d.Discord.Client({
                    fetchAllMembers: true
                });
                s4d.client.on('raw', async (packet) => {
                    if(['MESSAGE_REACTION_ADD', 'MESSAGE_REACTION_REMOVE'].includes(packet.t)){
                        const guild = s4d.client.guilds.cache.get(packet.d.guild_id);
                        if(!guild) return;
                        const member = guild.members.cache.get(packet.d.user_id) || guild.members.fetch(d.user_id).catch(() => {});
                        if(!member) return;
                        const channel = s4d.client.channels.cache.get(packet.d.channel_id);
                        if(!channel) return;
                        const message = channel.messages.cache.get(packet.d.message_id) || await channel.messages.fetch(packet.d.message_id).catch(() => {});
                        if(!message) return;
                        s4d.client.emit(packet.t, guild, channel, message, member, packet.d.emoji.name);
                    }
                });
                s4d.client.login('TOKEN').catch((e) => { s4d.tokenInvalid = true; s4d.tokenError = e; });


function GetRandomInteger(a, b){

    if (a > b){
        small = b;
        large = a;
    }
    else{
        small = a;
        large = b;
    }


s4d.client.on('message', async (s4dmessage) => {
    if (s4dmessage.author.bot) return;
  if (s4dmessage.content.includes('apples')) {
    switch(GetRandomInteger(1,5)){
        case 1: s4dmessage.channel.send(String('yum I love apples!')); break;
        case 2: s4dmessage.channel.send(String('apples are the best')); break;
        case 3: s4dmessage.channel.send(String('did someone say apples?')); break;
        case 4: s4dmessage.channel.send(String('apples are great!')); break;
        case 5: s4dmessage.channel.send(String('yum yum!')); break;
    }


  }


});

s4d;
        

【问题讨论】:

  • GetRandomInteger 函数中缺少一个 },这样它就变成了一个递归函数
  • 这就是你的GetRandomInteger() 功能吗?正如法比奥所提到的,缺少一个大括号,但该函数不会返回任何内容,不确定你想用它做什么。还有,你为什么用String构造函数?

标签: javascript discord discord.js switch-statement case


【解决方案1】:

正如 Fabio 所说,GetRandomInteger() 函数后面缺少一个大括号,但该函数不会返回任何内容。

您可以简单地将响应存储在一个数组中并随机选择其中一个,而不是生成一个随机整数并与 switch 语句作斗争。

这样的东西应该可以工作,而且代码少很多:

s4d.client.on('message', async (s4dmessage) => {
  if (s4dmessage.author.bot) return;
  let responses = [
    'yum I love apples!',
    'apples are the best',
    'did someone say apples?',
    'apples are great!',
    'yum yum!',
  ];

  if (s4dmessage.content.includes('apples')) {
    s4dmessage.channel.send(getRandom(responses));
  }
});

function getRandom(arr) {
  let index = Math.floor(Math.random() * arr.length);
  return arr[index];
}

您甚至可以更进一步,将您的响应数组添加到对象中的不同水果,其中键是水果名称,值是响应。这样,您可以检查消息是否包含密钥,并从数组中发送随机响应,其中密钥是找到的水果名称。

如果要添加新水果,只需将其添加到 responses 对象中,如果要添加/删除/更新响应,则可以编辑相应的数组。

看看下面的例子:

s4d.client.on('message', async (s4dmessage) => {
  if (s4dmessage.author.bot) return;
  let responses = {
    apples: [
      'yum I love apples!',
      'apples are the best',
      'did someone say apples?',
      'apples are great!',
      'yum yum!',
    ],
    kiwi: [
      '??? simply the best.. ???',
      'yummmy',
      'kiwi, kiwi, get in my belly',
      'am I the only one who loves kiwi?'
    ],
    oranges: [
      'yum I love oranges!',
      'I love eating oranges!',
      'did someone mention oranges?',
      '??? love them',
      'yummmm!',
    ],
  };

  // check if the message contains any of the keys of responses
  // returns the key if found, undefined otherwise
  let firstKeyword = Object.keys(responses).find((str) =>
    s4dmessage.content.includes(str),
  );

  if (firstKeyword) {
    s4dmessage.channel.send(getRandom(responses[firstKeyword]));
  } else {
    // message contains no apples, kiwi, or oranges
  }
});

function getRandom(arr) {
  let index = Math.floor(Math.random() * arr.length);
  return arr[index];
}

【讨论】:

  • 这是最翔实的答案,非常感谢!
  • 我很高兴它有帮助 ;)
猜你喜欢
  • 1970-01-01
  • 2022-11-02
  • 2020-10-03
  • 2018-11-19
  • 2020-03-26
  • 1970-01-01
  • 2018-06-23
  • 2020-04-21
  • 1970-01-01
相关资源
最近更新 更多