Какие проблемы возникли с ботом выдачи ролей?

Как создать бота Discord, который будет выдавать роли пользователям при их заходе и предоставлять им меню для выбора роли "семьюха" или "работник"? Требуется, чтобы только пользователь с ролью "помощник" мог выдавать роли.
  • 8 февраля 2024 г. 18:29
Ответы на вопрос 1
Для создания бота Discord, который будет выдавать роли пользователям, вам потребуется следующее:

1. Зарегистрировать бота на сайте Discord Developer Portal и получить токен для своего бота.
2. Использовать библиотеку для создания ботов, например, `discord.js` для Node.js.
3. Написать код бота с использованием этой библиотеки.
4. Предоставить боту соответствующие права на вашем Discord сервере.

Вот примерный код бота на `discord.js` v12, который выполняет задачи, которые вы описали:

```javascript
const Discord = require('discord.js');
const client = new Discord.Client();

const TOKEN = 'your-bot-token'; // Замените на токен вашего бота
const ROLE_HELPER = 'помощник'; // ID роли помощника
const ROLE_FAMILY = 'семьюха'; // ID роли семьюха
const ROLE_WORKER = 'работник'; // ID роли работника

client.on('ready', () => {
  console.log(`Logged in as ${client.user.tag}!`);
});

// Функция проверки наличия роли у пользователя
function hasHelperRole(member) {
  return member.roles.cache.some(role => role.name === ROLE_HELPER);
}

// Обработка команды для выдачи роли
client.on('message', async message => {
  // Игнорирование сообщений от ботов и не команд
  if (!message.content.startsWith('!') || message.author.bot) return;

  // Получение аргументов и команды
  const args = message.content.slice(1).trim().split(/ +/);
  const command = args.shift().toLowerCase();

  // Команда для выдачи меню выбора ролей
  if (command === 'role' && hasHelperRole(message.member)) {
    let embed = new Discord.MessageEmbed()
      .setTitle('Выберите вашу роль')
      .setDescription('Нажмите на соответствующую реакцию для выбора роли.')
      .setColor('#0099ff');
    
    let msgMenu = await message.channel.send(embed);
    await msgMenu.react('👪'); // Реакция для "семьюха"
    await msgMenu.react('💼'); // Реакция для "работник"

    // Фильтр для обработки реакций
    const filter = (reaction, user) => {
      return ['👪', '💼'].includes(reaction.emoji.name) && user.id === message.author.id;
    };

    msgMenu.awaitReactions(filter, { max: 1, time: 60000, errors: ['time'] })
      .then(collected => {
        const reaction = collected.first();

        if (reaction.emoji.name === '👪') {
          let role = message.guild.roles.cache.find(role => role.name === ROLE_FAMILY);
          message.member.roles.add(role).catch(console.error);
          message.reply(`вы выбрали роль ${ROLE_FAMILY}`);
        } else if (reaction.emoji.name === '💼') {
          let role = message.guild.roles.cache.find(role => role.name === ROLE_WORKER);
          message.member.roles.add(role).catch(console.error);
          message.reply(`вы выбрали роль ${ROLE_WORKER}`);
        }
      })
      .catch(() => {
        message.reply('время выбора истекло.');
      });
  }
});

client.login(TOKEN);
```

***Важно: Этот код рассчитан на `discord.js` версии 12, и если вы используете версию 13 или выше, код нужно будет адаптировать под новый API.***

Чтобы этот код работал, вам нужно:

- Заменить `'your-bot-token'` на реальный токен вашего бота.
- Задать правильные ID для ролей 'Помощник', 'Семьюха', и 'Работник'.
- Дать боту разрешения на управление ролями и на чтение/отправку сообщений в нужном канале.

Проблемы с ботами
Похожие вопросы