جديد 📢 عرض الإطلاق لفترة محدودة: خصم حتى 70% على شهرك الأول في كل لعبة.عرض الباقات

كيف تصنع بوت تذاكر لـ Discord (discord.js)

استضافة بوتات DiscordUpdated Oct 22, 20263 min read

يعطي بوت التذاكر الأعضاء زرًّا. الضغط عليه يفتح قناة خاصة لا يراها إلا ذلك العضو وفريقك. يبني هذا الدليل أساس بوت كهذا. تحتاج أولًا إلى رمز بوت: كيف تنشئ بوت Discord وتحصل على رمزه.

ما الذي تحتاج إليه

  • الـ intent المسماة Guilds فقط. لا يلزم أي intent مميز.
  • أذونات البوت: Manage Channels وView Channels وSend Messages.
  • معرّف رتبة فريقك. فعّل 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. يُقرأ معرّف رتبة الفريق من STAFF_ROLE_ID: ضعه في ملف .env وأضف الحزمة dotenv، أو اكتب المعرّف في الكود أثناء الاختبار.

شغّله

ارفع الملفات إلى سيرفر البوت وشغّله: كيف تستضيف بوت Discord بلغة Node.js. وفي سيرفرك اكتب /ticketpanel في القناة التي يفتح فيها الأعضاء التذاكر.

الخطوات التالية

  • زر Close ticket يحذف القناة بعد حفظ نسخة من المحادثة.
  • حدّ كل عضو بتذكرة مفتوحة واحدة بالتحقق من وجود قناة بالاسم نفسه.
  • خزّن التذاكر في قاعدة بيانات: كيف تستخدم قاعدة بيانات مع بوت Discord.

تستضيفه في مكان آخر بالفعل؟ انقل سيرفرك إلينا

أنشئ سيرفر ألعابك
جاهز للبدء؟

وفّر حتى 30% على سيرفر ألعابك الجديد.
أداء ممتاز وتفعيل فوري واعتمادية عالية، كل ذلك بسعر أفضل.

أحدث مقالات المدونة