Jump to content

[شرح] ربط اللعبة مع ديسكورد باستخدام الويب هوك


Recommended Posts

 arHxAiY.png

:جدول المُحتويات

🎯 مقدمة تحليلية: كيف تُربط MTA:SA مع Discord باستخدام Webhook؟‬
🧠 المفهوم العام (اللوجيك الأساسي)‬
🧩 تحليل الكود خطوة بخطوة‬
✅ خلاصة المنطق كاملًا‬
💡 ملاحظات إضافية للمطور‬
☝️ مصادر مهمة

 


🎯 مقدمة تحليلية: كيف تُربط MTA:SA مع Discord باستخدام Webhook؟
‫‬
السلام عليكم ورحمة الله وبركاته

في هذا المشروع، نريد تمكين اللاعب من إرسال رسالة من داخل اللعبة إلى قناة في Discord. لتحقيق هذا سنستخدم:
‫‬
‫- أمر داخل اللعبة (command)‬
‫- كود Lua في سيرفر MTA‬
‫- خدمة Webhook من Discord‬
‫- دالة `fetchRemote` في MTA لإرسال البيانات إلى Discord‬


🧠 المفهوم العام (اللوجيك الأساسي):
‫‬
‫1. اللاعب يكتب أمر داخل اللعبة مثل `/discord مرحباً`.‬
‫2. السكربت يقرأ هذا الأمر ويستخرج الرسالة.‬
‫3. السكربت يُنشئ رسالة منسّقة (باستخدام JSON).‬
‫4. يتم إرسال هذه الرسالة إلى Discord عبر رابط Webhook.‬
‫5. Discord يعرض الرسالة داخل القناة المحددة.‬


🧩 تحليل الكود خطوة بخطوة:
‫‬
1️⃣ رابط الويب هوك

local discordWebhook = "https://discord.com/api/webhooks/...."


‫- هذا هو الرابط الأساسي.‬
‫- Discord يوفّره لك لكل قناة تريد استقبال الرسائل فيها.‬
‫- يتم تخزينه في متغير `discordWebhook` لاستخدامه لاحقًا عند الإرسال.‬
‫‬



‫‬
2️⃣ دالة تنفيذ الأمر

function sendMessageToDiscord(player, command, ...)‬


‫‬
‫- هذه الدالة يتم ربطها بالأمر `/discord`.‬
‫- يتم تنفيذها تلقائيًا عندما يكتب اللاعب الأمر.‬
‫- البراميتر `player` هو كائن اللاعب الذي نفّذ الأمر.‬
‫- البراميتر `...` يمثل كل الكلمات التي كتبها اللاعب بعد الأمر.‬
‫‬



‫‬
3️⃣ جمع الرسالة

local message = table.concat({...}, " ")

‬‫
‫- يتم دمج الكلمات التي كتبها اللاعب إلى جملة واحدة.‬
‫- مثلًا: `/discord السلام عليكم يا شباب` → تصبح `"السلام عليكم يا شباب"`.‬
‫‬


4️⃣ التحقق من وجود رسالة

if message == "" then
    outputChatBox("اكتب رسالة! مثال: /discord مرحبا", player, 255, 0, 0)
    return
end


‫- إذا لم يكتب اللاعب أي شيء، يتم عرض تنبيه داخل اللعبة.‬
‫- يتم إيقاف تنفيذ الدالة (باستخدام `return`).‬
‫‬


5️⃣ تجهيز بيانات الرسالة

local playerName = getPlayerName(player)‬


‫- نحصل على اسم اللاعب الذي كتب الرسالة.‬
‫‬


6️⃣ إعداد شكل الرسالة (باستخدام `embeds`)

local webhookData = {
    username = "MTA:SA Server", -- اسم البوت في Discord
    embeds = {{
        title = "رسالة من اللاعب",
        description = message,
        color = 3447003, -- لون الشريط (أزرق)
        author = {name = playerName},
        footer = {text = "MTA:SA Discord Bot"},
        timestamp = os.date("!%Y-%m-%dT%H:%M:%SZ") -- وقت الإرسال بصيغة ISO
    }}
}


🔍 هذا الجزء هو أهم جزء، لأن Discord يستخدم ما يسمى بـ `embeds` لتنسيق الرسائل، ويتضمن:‬
‫‬
+----------------+----------------------------------------+‬
‫| العنصر         | وظيفته                                 |‬
‫+----------------+----------------------------------------+‬
‫| username       | اسم البوت في الديسكورد                 |‬
‫| title          | عنوان الرسالة داخل الـ Embed           |‬
‫| description    | نص الرسالة الحقيقي                     |‬
‫| color          | لون الشريط الجانبي (بالـ Hex)          |‬
‫| author.name    | اسم مرسل الرسالة (اللاعب)             |‬
‫| footer.text    | تذييل صغير                             |‬
‫| timestamp      | وقت الإرسال بشكل احترافي               |‬
‫+----------------+----------------------------------------+‬
‫‬


7️⃣ إرسال البيانات باستخدام fetchRemote
‫‬

fetchRemote(discordWebhook, {
    method = "POST",
    headers = {["Content-Type"] = "application/json"},
    postData = toJSON(webhookData):sub(2, -2)
}, function(responseData, responseInfo)
    ...
end)


‫ ما الذي يحدث هنا بالضبط؟‬
‫‬

‫‫fetchRemote: دالة من MTA لإرسال طلب HTTP إلى عنوان خارجي (هنا Discord).‬
method = "POST": نوع الطلب الذي نستخدمه لإرسال بيانات إلى الخادم (Discord في هذه الحالة).‬
headers: نقوم بإخبار Discord بأن نوع البيانات التي نرسلها هي JSON.‬
postData: نقوم بتحويل البيانات إلى JSON باستخدام دالة toJSON، ثم نحذف الأقواس الزائدة [] باستخدام :sub(2, -2) لتهيئة البيانات بشكل صحيح.‬
function(responseData, responseInfo): هذه دالة "رد الفعل"، التي تُنفذ عندما يرد Discord على الطلب.

‫‬


8️⃣ التعامل مع النتيجة

if responseInfo.success then
    outputChatBox("تم إرسال رسالتك إلى Discord!", player, 0, 255, 0)


‫- إذا تم إرسال الرسالة بنجاح، يُبلغ اللاعب برسالة نجاح.‬
‫‬


9️⃣ التعامل مع الأخطاء

else
    local statusCode = responseInfo.statusCode or "غير معروف"
    outputChatBox("فشل الإرسال! (الكود: " .. statusCode .. ")", player, 255, 0, 0)


‫- إذا فشل الإرسال، يتم طباعة الكود الخطأ، مثل:‬
‫‬
400: خطأ في البيانات (ربما الرسالة فارغة أو JSON غير صالح).‬
401 / 404: رابط Webhook غير صحيح أو تم حذفه.‬
429: تم إرسال عدد كبير جدًا من الرسائل (تم تجاوز الحد المسموح به).
‬‬


🔟 ربط الأمر مع الدالة
‫‬

addCommandHandler("discord", sendMessageToDiscord)

‫‬
‫- هذا السطر هو الذي يربط `/discord` مع الدالة التي كتبناها.‬
‫- أي شخص يكتب هذا الأمر يتم تنفيذ الكود أعلاه له.‬
‫‬



‫‬
✅ خلاصة المنطق كاملًا:‬
‫‬
‫‬
1LUkLXL.png
‫‬


💡 ملاحظات إضافية للمطور:
‫‬
‫- Webhooks يمكن استخدامها لعدة استخدامات مثل:‬
‫  - إرسال تنبيهات عند دخول أو خروج اللاعبين.‬
‫  - إرسال رسائل النظام.‬
‫  - تتبع الأخطاء في السكربتات.

 ‬
‫‬
‫- يمكنك تحسين السكربت بإضافة:‬
‫  - صورة اللاعب.‬
‫  - أزرار تفاعلية (عبر Discord Buttons).‬
‫  - أكثر من Embed في نفس الرسالة.‬
‫‬


☝️ مصادر مهمة:
‫- رابط السكريبت كامل على جيت هب مع الشرح
‫- رابط السكربت على موقع المودات
‫‬
‫بالتوفيق لكم 💕✅

 

Edited by Mohab
added thumbnail
Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...