Сбор первого ответившего userID

Недавно я сделал эту команду, где у пользователей есть 15 секунд, чтобы ввести «поймать», чтобы выиграть монеты. Единственная проблема в том, что я не уверен, как сделать так, чтобы монеты доставались тому, кто первым набрал «поймать». Сейчас он настроен так, что монеты всегда достаются тому, кто запустил команду. Я пытался использовать руководство discord.js для коллекционеров, но продолжал получать ошибки. Я все еще довольно новичок в этом, что-нибудь поможет, спасибо.

const profileModel = require("../models/profileSchema");

module.exports = {
    name: "catch",
    description: "users must type catch first to catch the animal",
    async execute(client, message, msg, args, cmd, Discord, profileData) {
        
        const prey = [
            "rabbit",
            "rat",
            "bird",
        ];

        const caught = [
            "catch",
        ];

        const chosenPrey = prey.sort(() => Math.random() - Math.random()).slice(0, 1);
        const whenCaught = caught.sort(() => Math.random() - Math.random()).slice(0, 1);
        const earnings = Math.floor(Math.random() * (20 - 5 + 1)) + 5;

        const filter = ({ content }) => whenCaught.some((caught) => caught.toLowerCase() == content.toLowerCase());

        const collector = message.channel.createMessageCollector({ max: 1, filter, time: 15000 });

        collector.on('collect', async (m) => {
            if (m.content?.toLowerCase() === 'catch') {
                message.channel.send(`You caught the ${chosenPrey}! You gained ${earnings} coins.`);
            }
            
            await profileModel.findOneAndUpdate(
                {
                    userID: message.author.id,
                },
                {
                    $inc: {
                        coins: earnings,
                    },
                }
            );
        });

        collector.on('end', (collected, reason) => {
            if (reason == "time") {
                message.channel.send('Too slow');
            }
        });

        message.channel.send(`Look out, a ${chosenPrey}! Type CATCH before it gets away!`);
    }
}

Схема профиля на всякий случай

const profileModel = require("../../models/profileSchema");

const cooldowns = new Map();
module.exports = async (Discord, client, message) => {

    let profileData;
    try {
        profileData = await profileModel.findOne({ userID: message.author.id });
        if (!profileData){
            let profile = await profileModel.create({
                name: message.member.user.tag,
                userID: message.author.id, 
                serverID: message.guild.id, 
                coins: 0,
            });
            profile.save();
        }
    } catch (err) {
      console.info(err);
    }
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
33
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Похоже, ваш сборщик использует две разные переменные для сообщения:

        collector.on('collect', async (m) => {
            if (m.content?.toLowerCase() === 'catch') {
                message.channel.send(`You caught the ${chosenPrey}! You gained ${earnings} coins.`);
            }
            
            await profileModel.findOneAndUpdate(
                {
                    userID: message.author.id,
                },
                {
                    $inc: {
                        coins: earnings,
                    },
                }
            );
        });

Вы проверяете, содержит ли сообщение m (собранное вашим сборщиком) содержимое 'catch', а затем находите идентификатор пользователя, который проверяет автора message (из ваших параметров execute() вверху, поэтому сообщение которая вызвала эту команду), когда вы должны использовать m.

Итак, чтобы исправить это, вы должны изменить userID: message.author.id на userID: m.author.id

Другие вопросы по теме