НОВОЕ 📢 Ограниченное стартовое предложение: скидка до 70% на первый месяц для любой игры!Посмотреть тарифы

Как сделать тикет-бота для Discord (discord.js)

Хостинг Discord-ботовUpdated Oct 23, 20263 min read

Тикет-бот даёт участникам кнопку. Нажатие открывает закрытый канал, который видят только этот участник и ваша команда. Это руководство создаёт основу такого бота. Сначала вам нужен токен бота: Как создать Discord-бота и получить его токен.

Что вам нужно

  • Только интент Guilds. Привилегированные интенты не нужны.
  • Права для бота: Manage Channels, View Channels, Send Messages.
  • ID роли вашей команды. Включите Developer Mode в Discord, щёлкните роль правой кнопкой мыши и выберите Copy Role ID.

Код

index.js

const {
  Client, GatewayIntentBits, ChannelType, PermissionFlagsBits,
  ActionRowBuilder, ButtonBuilder, ButtonStyle, SlashCommandBuilder, REST, Routes,
} = require('discord.js');

const STAFF_ROLE_ID = process.env.STAFF_ROLE_ID;
const client = new Client({ intents: [GatewayIntentBits.Guilds] });

client.once('ready', async () => {
  const rest = new REST({ version: '10' }).setToken(process.env.DISCORD_TOKEN);
  const cmd = new SlashCommandBuilder().setName('ticketpanel').setDescription('Post the ticket button')
    .setDefaultMemberPermissions(PermissionFlagsBits.ManageGuild);
  await rest.put(Routes.applicationCommands(client.user.id), { body: [cmd.toJSON()] });
  console.log(`Logged in as ${client.user.tag}`);
});

client.on('interactionCreate', async (i) => {
  if (i.isChatInputCommand() && i.commandName === 'ticketpanel') {
    const row = new ActionRowBuilder().addComponents(
      new ButtonBuilder().setCustomId('open_ticket').setLabel('Open a ticket').setStyle(ButtonStyle.Primary));
    await i.channel.send({ content: 'Need help? Press the button to open a private ticket.', components: [row] });
    return i.reply({ content: 'Posted.', ephemeral: true });
  }

  if (i.isButton() && i.customId === 'open_ticket') {
    const channel = await i.guild.channels.create({
      name: `ticket-${i.user.username}`,
      type: ChannelType.GuildText,
      permissionOverwrites: [
        { id: i.guild.roles.everyone.id, deny: [PermissionFlagsBits.ViewChannel] },
        { id: i.user.id, allow: [PermissionFlagsBits.ViewChannel, PermissionFlagsBits.SendMessages] },
        { id: STAFF_ROLE_ID, allow: [PermissionFlagsBits.ViewChannel, PermissionFlagsBits.SendMessages] },
        { id: client.user.id, allow: [PermissionFlagsBits.ViewChannel, PermissionFlagsBits.SendMessages, PermissionFlagsBits.ManageChannels] },
      ],
    });
    await channel.send(`Hello ${i.user}, a member of staff will be with you soon.`);
    return i.reply({ content: `Your ticket: ${channel}`, ephemeral: true });
  }
});

client.login(process.env.DISCORD_TOKEN);

Добавьте "discord.js": "^14.16.0" в package.json. ID роли команды читается из STAFF_ROLE_ID: положите его в файл .env и добавьте пакет dotenv или впишите ID прямо в код на время тестов.

Запустите бота

Загрузите файлы на сервер бота и запустите его: Как запустить Discord-бота на Node.js. На своём сервере введите /ticketpanel в канале, где участники должны открывать тикеты.

Следующие шаги

  • Кнопка Close ticket, которая удаляет канал после сохранения стенограммы.
  • Ограничьте каждого участника одним открытым тикетом, проверяя, есть ли уже канал с таким именем.
  • Храните тикеты в базе данных: Как использовать базу данных с Discord-ботом.

Ваш сервер уже у другого хостинга? Перенесите его к нам

СОЗДАЙТЕ СВОЙ ИГРОВОЙ СЕРВЕР
ГОТОВЫ НАЧАТЬ?

Сэкономьте до 30% на вашем новом игровом сервере.
Премиальная производительность, мгновенная активация и непревзойдённая надёжность по лучшей цене.

ПОСЛЕДНИЕ БЛОГИ