Возможно ли, чтобы несколько коллекционеров собирали вещи одновременно?Javascript

Форум по Javascript
Ответить Пред. темаСлед. тема
Anonymous
 Возможно ли, чтобы несколько коллекционеров собирали вещи одновременно?

Сообщение Anonymous »


У меня есть бот Discord.js ("discord.js": "^14.11.0"), в котором администратор может добавлять игру, за которую другие пользователи могут голосовать, с помощью косой черты addgame . Другие пользователи могут голосовать за то, какая команда, по их мнению, выиграет и на сколько игр, по их мнению, пойдет набор. Затем администратор может использовать другую команду с косой чертой lockgame, чтобы заблокировать игру и исключить возможность голосования за нее, используя идентификатор сообщения с помощью сборщика для уникальной идентификации сообщения.

Вот код для addgame

const { SlashCommandBuilder, ButtonBuilder, ButtonStyle, ActionRowBuilder, ComponentType } = require('discord.js'); const {Client, GatewayIntentBits} = require('discord.js'); const { токен } = require('../config.json'); const { getTeams, castVote, addGame, seriesVote, logError } = require('../db'); // Создаем новый экземпляр клиента const client = new Client({intents: [GatewayIntentBits.Guilds, GatewayIntentBits.GuildMessages, GatewayIntentBits.GuildMessageReactions] }); client.login(токен); // Настраиваем роли // const AcceptRoles = ['Основатель', 'Правление', 'Менеджер сообщества', 'Сотрудники', 'Заместители модов', 'БотМастер']; // const AcceptedRoleIDs = ['761266506235379712', '761266861115441162', '1004747752980353084', '1029408764899635211', '1061776397091209387', '107 7611324793688094']; модуль.экспорт = { данные: новый SlashCommandBuilder() .setName('добавить игру') .setDescription('Настраивает игру для размещения ставок.') .addStringOption(опция => option.setName('команда1') .setDescription('Команда 1') .setRequired(истина) .addChoices( {name: «Bilibili Gaming», значение: «Bilibili Gaming»}, {name: «CTBC Flying Oyster», значение: «CTBC Flying Oyster»}, {имя: «Cloud9», значение: «Cloud9»}, {name: 'DetonatioN FocusMe', значение: 'DetonatioN FocusMe'}, {имя: «Dplus KIA», значение: «Dplus KIA»}, {имя: 'Fnatic', значение: 'Fnatic'}, {name: «G2 Esports», значение: «G2 Esports»}, {name: «GAM Esports», значение: «GAM Esports»}, {имя: 'Gen.G', значение: 'Gen.G'}, {name: «Золотые стражи», значение: «Золотые стражи»}, {имя: «JD Gaming», значение: «JD Gaming»}, {имя: «КТ Ролстер», значение: «КТ Ролстер»}, {name: «LNG Esports», значение: «LNG Esports»}, {имя: 'ГРОМКО', значение: 'ГРОМКО'}, {имя: 'MAD Lions', значение: 'MAD Lions'}, {имя: «Movistar R7», значение: «Movistar R7»}, {имя: 'NRG', значение: 'NRG'}, {name: «PSG Talon», значение: «PSG Talon»}, {имя: 'T1', значение: 'T1'}, {имя: «Команда BDS», значение: «Команда BDS»}, {name: «Team Liquid», значение: «Team Liquid»}, {name: «Команда китов», значение: «Команда китов»}, {name: «Weibo Gaming», значение: «Weibo Gaming»}, )) .addStringOption(опция => option.setName('команда2') .setDescription('Команда 2') .setRequired(истина) .addChoices( {name: «Bilibili Gaming», значение: «Bilibili Gaming»}, {name: «CTBC Flying Oyster», значение: «CTBC Flying Oyster»}, {имя: «Cloud9», значение: «Cloud9»}, {name: 'DetonatioN FocusMe', значение: 'DetonatioN FocusMe'}, {имя: «Dplus KIA», значение: «Dplus KIA»}, {имя: 'Fnatic', значение: 'Fnatic'}, {name: «G2 Esports», значение: «G2 Esports»}, {name: «GAM Esports», значение: «GAM Esports»}, {имя: 'Gen.G', значение: 'Gen.G'}, {name: «Золотые стражи», значение: «Золотые стражи»}, {имя: «JD Gaming», значение: «JD Gaming»}, {имя: «КТ Ролстер», значение: «КТ Ролстер»}, {name: «LNG Esports», значение: «LNG Esports»}, {имя: 'ГРОМКО', значение: 'ГРОМКО'}, {имя: 'MAD Lions', значение: 'MAD Lions'}, {имя: «Movistar R7», значение: «Movistar R7»}, {имя: 'NRG', значение: 'NRG'}, {name: «PSG Talon», значение: «PSG Talon»}, {имя: 'T1', значение: 'T1'}, {имя: «Команда BDS», значение: «Команда BDS»}, {name: «Team Liquid», значение: «Team Liquid»}, {name: «Команда китов», значение: «Команда китов»}, {name: «Weibo Gaming», значение: «Weibo Gaming»}, )) .addStringOption(опция => option.setName('серия') .setDescription('Количество игр') .setRequired(истина) .addChoices( {имя: '1', значение: '1'}, {имя: '3', значение: '3'}, { имя: '5', значение: '5'}, )), асинхронное выполнение (взаимодействие) { // Настройка информации о команде const teamList = ждут getTeams(); const команда1 = взаимодействие.опции.getString('команда1'); const Team2 = Interaction.options.getString('team2'); const teamArray = [команда1, команда2]; пусть teamMessage1 = ''; пусть teamMessage2 = ''; const team1Info = teamList.find(team => team.Name === teamArray[0]); const team2Info = teamList.find(team => team.Name === teamArray[1]); teamMessage1 = team1Info.Emoji + ' ' + team1Info.Name; teamMessage2 = team2Info.Name + ' ' + team2Info.Emoji; const series = experience.options.getString('series'); // Создание кнопок const team1Button = новый ButtonBuilder() .setCustomId('team1Button') .setStyle(ButtonStyle.Secondary) .setEmoji(team1Info.Emoji); const team2Button = новый ButtonBuilder() .setCustomId('team2Button') .setStyle(ButtonStyle.Secondary) .setEmoji(team2Info.Emoji); константная строка = новый ActionRowBuilder() .addComponents(team1Button, team2Button); // Кнопка создания серии если (серия === '3') { const button2 = новый ButtonBuilder() .setCustomId('button2') .setStyle(ButtonStyle.Secondary) .setEmoji("2️⃣"); const button3 = новый ButtonBuilder() .setCustomId('button3') .setStyle(ButtonStyle.Secondary) .setEmoji("3️⃣"); row.addComponents(button2, button3); } еще если (серия === '5') { const button3 = новый ButtonBuilder() .setCustomId('button3') .setStyle(ButtonStyle.Secondary) .setEmoji("3️⃣"); const button4 = новый ButtonBuilder() .setCustomId('button4') .setStyle(ButtonStyle.Secondary) .setEmoji("4️⃣"); const button5 = новый ButtonBuilder() .setCustomId('button5') .setStyle(ButtonStyle.Secondary) .setEmoji("5️⃣"); row.addComponents(button3, button4, button5); } // Отправляем сообщение и добавляем кнопки await Interaction.reply({content: 'Игра опубликована.' + team1Info.Emoji + ' ' + team2Info.Emoji, fetchReply: true}); const message2 = await client.channels.cache.get('1077612967639666738').send({ содержимое: teamMessage1 + ' vs ' + teamMessage2, компоненты: [строка], }); дождитесь addGame(команда1, команда2, серия, message2.id); const Collector = message2.createMessageComponentCollector({ComponentType: ComponentType.Button, time: 60000 }); Collector.on('collect', async i => { пусть команда = ''; пытаться { if (i.customId === 'team1Button') { команда = команда1; await castVote(team, i.user.username, i.message.id).then(() => { i.reply({ content: "Голосуйте за " + team1Info.Emoji + " отправлено.", ephemeral: true }); }) } else if (i.customId === 'team2Button') { команда = команда2; await castVote(team, i.user.username, i.message.id).then(() => { i.reply({ content: "Голосуйте за " + team2Info.Emoji + " отправлено.", ephemeral: true }); }) } else if (i.customId === 'button2') { await seriesVote('2', i.user.username, i.message.id).then(() => { i.reply({ content: «Проголосуйте за 2 представленные игры», ephemeral: true }); }) } else if (i.customId === 'button3') { await seriesVote('3', i.user.username, i.message.id).then(() => { i.reply({content: "Проголосуйте за 3 отправленные игры", ephemeral: true }); }) } else if (i.customId === 'button4') { await seriesVote('4', i.user.username, i.message.id).then(() => { i.reply({content: "Проголосуйте за 4 представленные игры", ephemeral: true }); }) } else if (i.customId === 'button5') { await seriesVote('5', i.user.username, i.message.id).then(() => { i.reply({content: «Проголосуйте за 5 отправленных игр.», ephemeral: true }); }) } } поймать (ошибка) { // Проверяем, содержит ли сообщение об ошибке «Нет документа для обновления» if (error.message.includes("Нет документа для обновления")) { // Если да, ответим специальным сообщением i.reply({ content: «Сначала вам нужно проголосовать за команду.», ephemeral: true }); } еще { // Если это какая-либо другая ошибка, ответьте сообщением об ошибке i.reply({ content: "Произошла ошибка: " + error.message + "\n" + "\nПожалуйста, повторите попытку.", ephemeral: true }); logError(ошибка, error.message, 'ZoeyOneOhOne'); } } }); CollectorMap.set(message2.id, коллектор); }, }; Вот lockgame, если вам нужно его увидеть:

const { SlashCommandBuilder } = require('discord.js'); const {collectorMap} = require('../collectorManager'); const {Client, GatewayIntentBits} = require('discord.js'); const { токен } = require('../config.json'); // Создаем новый экземпляр клиента const client = new Client({intents: [GatewayIntentBits.Guilds, GatewayIntentBits.GuildMessages, GatewayIntentBits.GuildMessageReactions] }); client.login(токен); модуль.экспорт = { данные: новый SlashCommandBuilder() .setName('lockgame') .setDescription('Блокирует игру по заданному идентификатору') .addStringOption(опция => option.setName('идентификатор-сообщения') .setDescription('Идентификатор сообщения') .setRequired(истина) ), асинхронное выполнение (взаимодействие) { const messageId = взаимодействия.options.getString('идентификатор-сообщения'); // Извлекаем коллектор с карты const Collector = CollectorMap.get(messageId); если (сборщик) { // Остановим сборщик и удалим его с карты коллектор.стоп(); // CollectorMap.delete(messageId); пытаться { const targetChannel = client.channels.cache.get('1077612967639666738'); если (!targetChannel) { await Interaction.reply('Целевой канал не найден.'); возвращаться; } // Получаем сообщение по его идентификатору const message = await targetChannel.messages.fetch(messageId); если (сообщение) { // Отредактируйте содержимое сообщения, добавив «(заблокировано)» await message.edit(`${message.content} (LOCKED 🔒)`); await Interaction.reply('Игра заблокирована, сообщение обновлено.'); } еще { await Interaction.reply('Игра найдена, но сообщение не найдено.'); } } поймать (ошибка) { console.error(ошибка); await Interaction.reply('Произошла ошибка при блокировке игры и обновлении сообщения.'); } } еще { await Interaction.reply('Игра не найдена.'); } }, }; Сейчас все это отлично работает для одиночной игры. Проблема в том, что мне нужно более одной игры, чтобы можно было голосовать одновременно. Одновременно может быть до 5 игр, которые будут заблокированы в разное время. Сейчас каждая игра сохраняется в базе данных Firebase каждый раз, когда игра добавляется с помощью addgame, а идентификатором игры является messageId, который идентифицирует сообщение с правильными кнопками.

Можно ли одновременно использовать несколько сборщиков? Как и всякий раз, когда добавляется игра, я мог бы создать для нее новый сборщик и добавить его в Map, в котором messageID был ключом, а коллектор — значением. Но даже если бы я это сделал, как бы я справился с этой частью addgame:

collector.on('collect', async i => { пусть команда = ''; пытаться { if (i.customId === 'team1Button') { команда = команда1; await castVote(team, i.user.username, i.message.id).then(() => { i.reply({ content: "Голосуйте за " + team1Info.Emoji + " отправлено.", ephemeral: true }); }) } else if (i.customId === 'team2Button') { команда = команда2; await castVote(team, i.user.username, i.message.id).then(() => { i.reply({ content: "Голосуйте за " + team2Info.Emoji + " отправлено.", ephemeral: true }); }) } else if (i.customId === 'button2') { await seriesVote('2', i.user.username, i.message.id).then(() => { i.reply({ content: «Проголосуйте за 2 представленные игры», ephemeral: true }); }) } else if (i.customId === 'button3') { await seriesVote('3', i.user.username, i.message.id).then(() => { i.reply({content: "Проголосуйте за 3 отправленные игры", ephemeral: true }); }) } else if (i.customId === 'button4') { await seriesVote('4', i.user.username, i.message.id).then(() => { i.reply({content: "Проголосуйте за 4 представленные игры", ephemeral: true }); }) } else if (i.customId === 'button5') { await seriesVote('5', i.user.username, i.message.id).then(() => { i.reply({content: «Проголосуйте за 5 отправленных игр.», ephemeral: true }); }) } } поймать (ошибка) { // Проверяем, содержит ли сообщение об ошибке «Нет документа для обновления» if (error.message.includes("Нет документа для обновления")) { // Если да, ответим специальным сообщением i.reply({ content: «Сначала вам нужно проголосовать за команду.», ephemeral: true }); } еще { // Если это какая-либо другая ошибка, ответьте сообщением об ошибке i.reply({ content: "Произошла ошибка: " + error.message + "\n" + "\nПожалуйста, повторите попытку.", ephemeral: true }); logError(ошибка, error.message, 'ZoeyOneOhOne'); } } }); Это реалистичный подход? Как я мог это осуществить? Если это не сработает, есть другой способ, я открыт для предложений.
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Javascript»