مرجع الأحداث
كل نوع من أحداث الويب هوك والحمولة الدقيقة التي يرسلها TicketWave.
مرجع الأحداث
يمكن الاشتراك في ستة أنواع من الأحداث لكل نقطة نهاية. كل طلب يستخدم نفس الغلاف — event وtimestamp وguild_id وdata — ولا يختلف إلا كائن data.
| Event | Fires when |
|---|---|
ticket.created | يتم فتح تذكرة |
ticket.closed | يتم إغلاق تذكرة |
ticket.updated | يتغير أي شيء آخر في تذكرة مفتوحة |
message.sent | يكتب عضو أو أحد الموظفين داخل تذكرة |
blacklist.added | تتم إضافة عضو إلى القائمة السوداء |
blacklist.removed | تتم إزالة إدخال من القائمة السوداء |
الحقول التي لا يمكن حلّها تُرسل على أنها null بدلًا من حذفها — لذلك يمكنك الاعتماد على وجود المفاتيح. يكون username بقيمة null عندما لا يعيد Discord المستخدم.
الحقول المشتركة
كل حدث من أحداث التذاكر يتضمن هذه الحقول:
| Field | Type | Description |
|---|---|---|
ticket_id | string | معرّف التذكرة المقروء من النمط الخاص بك، مثل ticket-1042 |
ticket_num_id | number | رقم التذكرة المتسلسل، مثل 1042 |
channel_id | string | قناة Discord الخاصة بالتذكرة |
category | string | null | اسم الفئة، أو null إذا لم تكن للتذكرة فئة |
user | object | null | مالك التذكرة بصيغة { id, username } |
ticket.created
يُرسل مباشرة بعد إنشاء قناة التذكرة.
{
"event": "ticket.created",
"timestamp": "2026-08-26T08:23:11.000Z",
"guild_id": "123456789012345678",
"data": {
"ticket_id": "ticket-1042",
"ticket_num_id": 1042,
"channel_id": "998877665544332211",
"category": "🤖 Support",
"user": { "id": "987654321098765432", "username": "Luna" },
"created_at": "2026-08-26T08:23:11.000Z"
}
}يحدث هذا عند فتح التذكرة، أي قبل أن يكتب العضو أي شيء. إذا كنت تحتاج إلى الرسالة الأولى، فاستمع أيضًا إلى message.sent.
ticket.closed
{
"event": "ticket.closed",
"timestamp": "2026-08-26T07:45:02.000Z",
"guild_id": "123456789012345678",
"data": {
"ticket_id": "ticket-1041",
"ticket_num_id": 1041,
"channel_id": "998877665544332211",
"category": "💸 Payment",
"user": { "id": "987654321098765432", "username": "Luna" },
"closed_by": { "id": "112233445566778899", "username": "Staff_01" },
"reason": "Issue resolved",
"closed_at": "2026-08-26T07:45:02.000Z"
}
}| Field | Type | Description |
|---|---|---|
closed_by | object | من قام بإغلاقها. عمليات الإغلاق التلقائية تُسجّل البوت |
reason | string | null | سبب الإغلاق، أو null إذا لم يُذكر سبب |
ticket.updated
الحدث الشامل لأي تغييرات على تذكرة مفتوحة. يوضح لك action ما الذي تغيّر، بينما يحمل changes تفاصيل ذلك الإجراء المحدد.
{
"event": "ticket.updated",
"timestamp": "2026-08-26T14:02:19.000Z",
"guild_id": "123456789012345678",
"data": {
"ticket_id": "ticket-1038",
"ticket_num_id": 1038,
"channel_id": "998877665544332211",
"category": "🤖 Support",
"user": { "id": "987654321098765432", "username": "Luna" },
"action": "ticket_priority:add",
"changes": { "priority": "high" },
"reason": null,
"updated_by": { "id": "112233445566778899", "username": "Staff_01" }
}
}القيم الممكنة لـ action
action | Meaning | changes contains |
|---|---|---|
ticket_claim:add | قام أحد الموظفين بالمطالبة بالتذكرة | (empty) |
ticket_unclaim:add | تم إلغاء المطالبة | (empty) |
ticket_priority:add | تم تغيير الأولوية | priority |
ticket_rename:add | تمت إعادة تسمية القناة | new_name |
ticket_remind:add | تم إرسال تذكير | (empty) |
ticket_feedback:add | قيّم العضو التذكرة | star_count, feedback |
ticket_schedule_close:add | تمت جدولة الإغلاق | duration, schedule_time |
ticket_request_close:add | طلب الموظف من العضو إغلاق التذكرة | duration, request_duration_time |
ticket_request_close_accept:add | وافق العضو | (empty) |
ticket_request_close_deny:add | رفض العضو | (empty) |
ticket_close_cancel:add | تم إلغاء إغلاق جارٍ | (empty) |
ticket_additional_access:add | تمت إضافة مستخدم أو دور إلى التذكرة | entity_type, entity_id, reason |
ticket_additional_access:remove | تمت إزالة مستخدم أو دور | entity_type, entity_id, reason |
تعامل مع هذه القائمة على أنها مفتوحة النهاية. تُضاف إجراءات جديدة مع نمو TicketWave، وتصل على هيئة ticket.updated. اعتمد على الإجراءات التي تهمك وتجاهل الباقي بدلًا من رمي خطأ عند القيم غير المعروفة.
الإجابة على خطوة في التذكرة لا تُنتج حدثًا. وإلا فإن تذكرة تحتوي على خطوات كثيرة ستغرق نقطة النهاية لديك بينما لا يزال العضو يملأ النموذج.
message.sent
يُرسل لكل رسالة بشرية داخل تذكرة مفتوحة. تُتخطى رسائل البوتات — بما فيها TicketWave نفسه.
{
"event": "message.sent",
"timestamp": "2026-08-26T22:10:55.000Z",
"guild_id": "123456789012345678",
"data": {
"ticket_id": "ticket-1040",
"ticket_num_id": 1040,
"channel_id": "998877665544332211",
"message_id": "1234567890123456789",
"content": "Hello, how can I help you?",
"author": { "id": "112233445566778899", "username": "Staff_01" },
"is_staff": true,
"sent_at": "2026-08-26T22:10:55.000Z"
}
}| Field | Type | Description |
|---|---|---|
content | string | النص الخام للرسالة. يكون فارغًا في الرسائل التي تحتوي على مرفقات فقط |
author | object | { id, username } الخاص بالمرسل |
is_staff | boolean | true إذا كان لدى المرسل دور دعم مُعدّ مسبقًا |
هذا هو الحدث الأعلى حجمًا بفارق كبير — فالسيرفر المزدحم ينتج طلبًا واحدًا لكل رسالة. اشترك فيه فقط إذا كنت تحتاج فعلًا إلى بيانات على مستوى الرسائل، وتأكد من أن المستقبِل يرد بسرعة.
blacklist.added
غير مرتبط بتذكرة، لذا لا تحتوي هذه الحمولة على ticket_id.
{
"event": "blacklist.added",
"timestamp": "2026-08-26T18:33:47.000Z",
"guild_id": "123456789012345678",
"data": {
"user": { "id": "111223344556677889", "username": "BadActor" },
"reason": "Spam",
"added_by": { "id": "112233445566778899", "username": "Staff_01" }
}
}blacklist.removed
{
"event": "blacklist.removed",
"timestamp": "2026-08-26T18:40:12.000Z",
"guild_id": "123456789012345678",
"data": {
"user": { "id": "111223344556677889", "username": "BadActor" },
"removed_by": { "id": "112233445566778899", "username": "Staff_01" }
}
}أحداث الاختبار
زر Send test event يرسل طلبًا حقيقيًا وموقّعًا، وتكون data الخاصة به فقط:
{
"event": "ticket.created",
"timestamp": "2026-08-26T12:00:00.000Z",
"guild_id": "123456789012345678",
"data": { "test": true }
}يكون event هو أول نوع اشترك فيه نقطة النهاية. تحقّق من data.test إذا كنت تريد تجاهل عمليات التسليم التجريبية في منطق الإنتاج.
الخطوات التالية
- Example Server (التعامل مع هذه الحمولات في Express)
- Webhooks (التوقيع، وإعادة المحاولة، وسجل التسليم)
How is this guide?
