TicketWave Logo
Webhooks

مرجع الأحداث

كل نوع من أحداث الويب هوك والحمولة الدقيقة التي يرسلها TicketWave.

مرجع الأحداث

يمكن الاشتراك في ستة أنواع من الأحداث لكل نقطة نهاية. كل طلب يستخدم نفس الغلاف — event وtimestamp وguild_id وdata — ولا يختلف إلا كائن data.

EventFires when
ticket.createdيتم فتح تذكرة
ticket.closedيتم إغلاق تذكرة
ticket.updatedيتغير أي شيء آخر في تذكرة مفتوحة
message.sentيكتب عضو أو أحد الموظفين داخل تذكرة
blacklist.addedتتم إضافة عضو إلى القائمة السوداء
blacklist.removedتتم إزالة إدخال من القائمة السوداء

الحقول التي لا يمكن حلّها تُرسل على أنها null بدلًا من حذفها — لذلك يمكنك الاعتماد على وجود المفاتيح. يكون username بقيمة null عندما لا يعيد Discord المستخدم.

الحقول المشتركة

كل حدث من أحداث التذاكر يتضمن هذه الحقول:

FieldTypeDescription
ticket_idstringمعرّف التذكرة المقروء من النمط الخاص بك، مثل ticket-1042
ticket_num_idnumberرقم التذكرة المتسلسل، مثل 1042
channel_idstringقناة Discord الخاصة بالتذكرة
categorystring | nullاسم الفئة، أو null إذا لم تكن للتذكرة فئة
userobject | 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"
  }
}
FieldTypeDescription
closed_byobjectمن قام بإغلاقها. عمليات الإغلاق التلقائية تُسجّل البوت
reasonstring | 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

actionMeaningchanges 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"
  }
}
FieldTypeDescription
contentstringالنص الخام للرسالة. يكون فارغًا في الرسائل التي تحتوي على مرفقات فقط
authorobject{ id, username } الخاص بالمرسل
is_staffbooleantrue إذا كان لدى المرسل دور دعم مُعدّ مسبقًا

هذا هو الحدث الأعلى حجمًا بفارق كبير — فالسيرفر المزدحم ينتج طلبًا واحدًا لكل رسالة. اشترك فيه فقط إذا كنت تحتاج فعلًا إلى بيانات على مستوى الرسائل، وتأكد من أن المستقبِل يرد بسرعة.


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?