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





