🎟️ بوت تذاكر احترافي. قائمة اختيار + نموذج، تحكّم كامل (Claim/Close/Reopen/Delete)، ماكروز، حالات (Waiting User/Staff)، ترانسكربت HTML، حدود ذكية، تقارير أسبوعية.
- سريع، واضح، يعتمد SQLite بلا تعقيد.
- واجهة حديثة: Select + Modal + Buttons + Slash.
- متوافق مع Node 18.17+ / 20+ و discord.js v14.
تنبيه: استخدام البوت للدعم والتنظيم داخل سيرفرك فقط.
- أنواع التذاكر: 🛠️ Support • 💳 Billing • 🖥️ Technical • 📢 Partnership • 🚨 Report
- تحكّم فوري: Claim • Close (مع سبب) • Reopen (بحد) • Delete
- حالات: Waiting on User / Waiting on Staff
- ماكروز: ترحيب — طلب تفاصيل — تبديل حالة
- حدود وكوابح: حدّ لكل نوع، حدّ عام، حدّ يومي، كولداون بين الفتحات
- إغلاق تلقائي: Auto-Close للتذاكر الخاملة بعد N ساعات
- تقارير أسبوعية: فتح/إغلاق/متوسط زمن المعالجة
- سجلات وترانسكربت: HTML Transcript مرفق في قناة اللوق عند الإغلاق
- ترجمة (i18n): ملفات JSON (ar/en)
- Node.js: 18.17+ أو 20+
- صلاحيات البوت: Manage Channels, Read/Send, Read History, Attach Files, Use App Commands
أول تشغيل: لو قناة اللوحة
panelChannelIdفاضية، ينشر البوت لوحة فتح التذاكر تلقائيًا.
/add user:<عضو>— إضافة عضو للتذكرة الحالية/remove user:<عضو>— إزالة عضو من التذكرة/move type:<support|billing|technical|partnership|report>— نقل نوع التذكرة (يعدل الاسم والصلاحيات)/note text:<نص>— ملاحظة للطاقم (Embed)/stats— إجمالي/مفتوح/مغلق/مستلم
- Claim — استلام التذكرة
- Close — إغلاق مع سبب (Modal)
- Reopen — إعادة فتح ضمن الحد
- Delete — حذف نهائي (بعد الإغلاق)
- Waiting User / Waiting Staff — تبديل الحالة
- Macros — (greet / more-info / switch-state)
ردود الإدارة “خفية” باستخدام
MessageFlags.Ephemeral(لا تزعج القناة).
ضع IDs صحيحة للقنوات/التصنيفات/الأدوار. أي حقل ناقص = سلوك غير متوقع.
token: توكن البوت من Developer Portal.clientId: Application (Client) ID.guildId: السيرفر الهدف لتسجيل أوامر السلاش.
lang:"ar"أو"en". أضف ملفًا لـlocales/en.jsonلو حبيت.
panelChannelId: القناة التي تُعرض فيها لوحة فتح التذاكر. اقتراحي: خصّص قناة ثابتة “🎟️・open-ticket”.logChannelId: قناة اللوق (فتح/إغلاق/حذف + ترانسكربت).ticketsCategoryId: تصنيف التذاكر المفتوحة.archiveCategoryId: تصنيف الأرشيف (اختياري؛ تُنقل له القنوات بعد الإغلاق).weeklyReportChannelId: قناة التقرير الأسبوعي.
-
supportTeamRoleId: رول افتراضي لو نوع التذكرة ما له رول خاص. -
typeRoleIds: ماب يربط كل نوع رول معيّن، مثال:"typeRoleIds": { "support": "ROLE_SUPPORT", "billing": "ROLE_BILLING", "technical": "ROLE_TECH", "partnership": "ROLE_PARTNER", "report": "ROLE_REPORT" }
-
أدوار الإدارة:
claimRoleId: من يقدر يستلم/يدير التذاكر.closeRoleId: من يقدر يغلق.reopenRoleId: من يقدر يعيد فتح.deleteRoleId: من يقدر يحذف نهائي.bypassLimitRoleId: يتجاوز حدود الفتح/الكولداون.
اقتراحي: خلي رول “Management” يمتلك كل الأذونات أعلاه، و“Moderation” يمتلك Claim/Close فقط.
perTypeLimit: أقصى تذاكر مفتوحة للمستخدم الواحد لكل نوع (افترح: 1).globalOpenLimit: أقصى تذاكر مفتوحة للمستخدم الواحد على كل الأنواع (افترح: 2).dailyOpenLimit: أقصى تذاكر جديدة باليوم للمستخدم (افترح: 3).openCooldownSec: كولداون بين عمليات الفتح (بالثواني) (افترح: 120).reopenLimit: مرات إعادة الفتح لنفس التذكرة (افترح: 1).idleAutoCloseHours: إغلاق تلقائي للتذاكر الخاملة بعد ساعات (افترح: 48).dmOnClose: إرسال رسالة خاص للمستخدم عند الإغلاق (true/false).
-
weeklyReport: كائن باليوم/الساعة (UTC):"weeklyReport": { "day": 0, "hour": 20 } // الأحد 20:00 UTC
{
"token": "BOT_TOKEN",
"clientId": "APP_ID",
"guildId": "GUILD_ID",
"lang": "ar",
"panelChannelId": "CHANNEL_ID",
"logChannelId": "CHANNEL_ID",
"ticketsCategoryId": "CATEGORY_ID",
"archiveCategoryId": "CATEGORY_ID",
"weeklyReportChannelId": "CHANNEL_ID",
"supportTeamRoleId": "ROLE_FALLBACK_ID",
"typeRoleIds": {
"support": "ROLE_ID",
"billing": "ROLE_ID",
"technical": "ROLE_ID",
"partnership": "ROLE_ID",
"report": "ROLE_ID"
},
"claimRoleId": "ROLE_ID",
"closeRoleId": "ROLE_ID",
"reopenRoleId": "ROLE_ID",
"deleteRoleId": "ROLE_ID",
"bypassLimitRoleId": "ROLE_ID",
"perTypeLimit": 1,
"globalOpenLimit": 2,
"dailyOpenLimit": 3,
"openCooldownSec": 120,
"reopenLimit": 1,
"idleAutoCloseHours": 48,
"dmOnClose": true,
"weeklyReport": { "day": 0, "hour": 20 }
}اقتراحاتي العملية:
- استخدم تصنيفين واضحين:
🎫 Ticketsو🗄️ Tickets Archive. - اجعل اللوحة مقفلة للكتابة (View فقط) حتى تكون نظيفة.
- ضع البوت أعلى من رتب الطاقم التي يحتاج يمنحها.
- في اللوق: فعّل Slowmode بسيط (5s) حتى لا تتكدس رسائل الماكروز.
-
SQLite بملف
tickets.db(WAL مفعّل للأداء). -
الجداول:
tickets(id, channelId, userId, type, status, state, createdAt, lastActivityAt, claimedBy, closedAt, reopenedCount)actions(id, ticketId, at, action, byUser, data)
-
الترانسكربت: يتم توليد
transcript-<ID>.htmlعند الإغلاق ويُرسل لقناة اللوق كمرفق.
نصائح:
- نسخ احتياطي دوري لملف
tickets.db. - عند النقل لخادم جديد: أوقف البوت → انسخ
tickets.dbوالريبو → شغّل.
-
تحقّق من:
- نسخة Node 18.17+ / 20+
- صلاحيات البوت في القنوات
- IDs صحيحة في
config.json - أن تصنيف التذاكر موجود وله صلاحيات إنشاء قنوات
لو احتجت مراجعة إعداداتك، أرسل لقطة من
config.json(مع إخفاء التوكن).