1

I have been working on the Quick Math command, it works like this: I execute it, it sends a problem in chat, and whoever sends the correct answer wins. Preview of the problem

But as you can see, it doesn't see my 46 message, ignores it, and after 30 seconds sends "No one answered!"

My code is:

const { MessageEmbed } = require('discord.js');
const Discord = require("discord.js")

module.exports = {
  name: "game",
  description: "smth",
  aliases: ["gamestart", "startgame"],
  permissions: ["MANAGE_MESSAGES"],
  timeout: 10000,
execute: async (client, message, args) => {
    var a = Math.floor(Math.random() * 50) + 1
    var b = Math.floor(Math.random() * 50) + 1
    var ab = await a + b
    console.log(ab)
    let embed = new MessageEmbed()
    .setTitle(":chart_with_downwards_trend: Quick Math")
    .setDescription(`Solve the problem below and get XP.\n\n\`${a}\` + \`${b}\` = **???**`)
    .setFooter("123")

    const msg = await message.channel.send(embed)

    try {
      let filter = (m) => {
        if (m.author.bot) return;
        if (m.channel.id == msg.channel.id && m.content === ab) return true;
        else {
          return false;
        }
      };
      let res = await msg.channel.awaitMessages(filter, {
        time: 30000,
        errors: ["time"],
      });
      if (res) {
        let embed = new MessageEmbed()
        .setTitle(":chart_with_downwards_trend: Quick Math")
        .setDescription(`The correct answer was \`${ab}\`\n\nThe winner is **you**!`)
        .setFooter("123")
        msg.channel.send(embed)
      }
    } catch (err) {
      console.log(err)
      msg.channel.send(
        "No one answered!"
      );
    }
}
}

The console gives no error and looks like this: 46

This is really weird and I ask for your help. Thanks in advance.

Update: (after changing === to ==)

Console logs:

49
Collection [Map] {
  '903319414777188413' => ExtendedMessage {
    channel: ExtendedTextChannel {
      type: 'text',
      deleted: false,
      id: '859482526364336160',
      name: 'rice-bot-testing',
      rawPosition: 37,
      parentID: '836281677994786846',
      permissionOverwrites: [Collection [Map]],
      topic: null,
      nsfw: false,
      lastMessageID: '903319414777188413',
      rateLimitPerUser: 5,
      lastPinTimestamp: 1624987887000,
      guild: [Guild],
      messages: [MessageManager],
      _typing: Map {}
    },
    deleted: false,
    id: '903319414777188413',
    type: 'DEFAULT',
    system: false,
    content: '49',
    author: User {
      id: '713008151661772812',
      system: null,
      locale: null,
      flags: [UserFlags],
      username: '8less',
      bot: false,
      discriminator: '8719',
      avatar: 'fb2c5843579f14c38b542349cfa5a256',
      lastMessageID: '903319414777188413',
      lastMessageChannelID: '859482526364336160'
    },
    pinned: false,
    tts: false,
    nonce: '903319413787197440',
    embeds: [],
    attachments: Collection [Map] {},
    createdTimestamp: 1635438531346,
    editedTimestamp: 0,
    reactions: ReactionManager {
      cacheType: [class Collection extends Collection],
      cache: Collection [Map] {},
      message: [Circular]
    },
    mentions: MessageMentions {
      everyone: false,
      users: Collection [Map] {},
      roles: Collection [Map] {},
      _members: Collection [Map] {},
      _channels: Collection [Map] {},
      crosspostedChannels: Collection [Map] {}
    },
    webhookID: null,
    application: null,
    activity: null,
    _edits: [],
    flags: MessageFlags { bitfield: 0 },
    reference: null,
    components: []
  }
}

Make sure that Collection [Map] {} part is logged after 30000 ms is out.

Problem Preview after Update

8less
  • 71
  • 3
  • 19
  • Does this answer your question? [Which equals operator (== vs ===) should be used in JavaScript comparisons?](https://stackoverflow.com/questions/359494/which-equals-operator-vs-should-be-used-in-javascript-comparisons) – MrMythical Oct 28 '21 at 11:48
  • 1
    [Sample code](https://stackoverflow.com/help/mcve) (and data) should be *minimal*, complete and representative. – outis Oct 29 '21 at 04:15

1 Answers1

3

Guess the problem is that at this line:

if (m.channel.id == msg.channel.id && m.content === ab) return true;

you're searching for a message that has it's content (a string of course) strict equals to the result you calculated before (a number) and the === doesn't check only the content of a variable, it checks also the type of the variable so: '46' === 46 will return false. What you can do is:

  • Use the double equals operator (not recommended) => '46' == 46 returns true
  • Parse the incoming message in Number => Number('46') === 46 returns true

Additionally i would prefer using the cleanContent property of the message, just to make sure to retrieve only the effective content of the message and not alterate it. Hope it was helpful :D

EDIT: Just saw you're importing two times the discord.js library, instead of doing that you can just simply extract the MessageEmbed from the Discord module:

const Discord = require('discord.js');
const { MessageEmbed } = Discord;
Staxlinou
  • 1,351
  • 1
  • 5
  • 20
eroironico
  • 1,159
  • 1
  • 15
  • 1
    Sorry but i was busy, i can see that the return value of the `awaitMessages` method is a map and not an object. Guess you should write: `const res = await msg.channel.awaitMessages(/* stuff */)` and then acces the messages that were filtered with `res.get()`. Not only that of course but the return value is a normal map so you will be able to use all standard methods of a map. Just in case you don't know a map is a collection of `key - value` pairs and you can access values via `map.get(key)`. It also supports loops. Hope it was helpful – eroironico Oct 28 '21 at 19:50
  • Also if you just want the first message that matched the filter check you can use the `map.first()` method to just get the first value that should also be the first message that matched your conditions – eroironico Oct 28 '21 at 19:54