Mohab Posted April 8 Share Posted April 8 (edited) :جدول المُحتويات مقدمة تحليلية: كيف تُربط 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 يعرض الرسالة داخل القناة المحددة. تحليل الكود خطوة بخطوة: رابط الويب هوك local discordWebhook = "https://discord.com/api/webhooks/...." - هذا هو الرابط الأساسي. - Discord يوفّره لك لكل قناة تريد استقبال الرسائل فيها. - يتم تخزينه في متغير `discordWebhook` لاستخدامه لاحقًا عند الإرسال. دالة تنفيذ الأمر function sendMessageToDiscord(player, command, ...) - هذه الدالة يتم ربطها بالأمر `/discord`. - يتم تنفيذها تلقائيًا عندما يكتب اللاعب الأمر. - البراميتر `player` هو كائن اللاعب الذي نفّذ الأمر. - البراميتر `...` يمثل كل الكلمات التي كتبها اللاعب بعد الأمر. جمع الرسالة local message = table.concat({...}, " ") - يتم دمج الكلمات التي كتبها اللاعب إلى جملة واحدة. - مثلًا: `/discord السلام عليكم يا شباب` → تصبح `"السلام عليكم يا شباب"`. التحقق من وجود رسالة if message == "" then outputChatBox("اكتب رسالة! مثال: /discord مرحبا", player, 255, 0, 0) return end - إذا لم يكتب اللاعب أي شيء، يتم عرض تنبيه داخل اللعبة. - يتم إيقاف تنفيذ الدالة (باستخدام `return`). تجهيز بيانات الرسالة local playerName = getPlayerName(player) - نحصل على اسم اللاعب الذي كتب الرسالة. إعداد شكل الرسالة (باستخدام `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 | وقت الإرسال بشكل احترافي | +----------------+----------------------------------------+ إرسال البيانات باستخدام 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 على الطلب. التعامل مع النتيجة if responseInfo.success then outputChatBox("تم إرسال رسالتك إلى Discord!", player, 0, 255, 0) - إذا تم إرسال الرسالة بنجاح، يُبلغ اللاعب برسالة نجاح. التعامل مع الأخطاء else local statusCode = responseInfo.statusCode or "غير معروف" outputChatBox("فشل الإرسال! (الكود: " .. statusCode .. ")", player, 255, 0, 0) - إذا فشل الإرسال، يتم طباعة الكود الخطأ، مثل: 400: خطأ في البيانات (ربما الرسالة فارغة أو JSON غير صالح). 401 / 404: رابط Webhook غير صحيح أو تم حذفه. 429: تم إرسال عدد كبير جدًا من الرسائل (تم تجاوز الحد المسموح به). ربط الأمر مع الدالة addCommandHandler("discord", sendMessageToDiscord) - هذا السطر هو الذي يربط `/discord` مع الدالة التي كتبناها. - أي شخص يكتب هذا الأمر يتم تنفيذ الكود أعلاه له. خلاصة المنطق كاملًا: ملاحظات إضافية للمطور: - Webhooks يمكن استخدامها لعدة استخدامات مثل: - إرسال تنبيهات عند دخول أو خروج اللاعبين. - إرسال رسائل النظام. - تتبع الأخطاء في السكربتات. - يمكنك تحسين السكربت بإضافة: - صورة اللاعب. - أزرار تفاعلية (عبر Discord Buttons). - أكثر من Embed في نفس الرسالة. مصادر مهمة: - رابط السكريبت كامل على جيت هب مع الشرح - رابط السكربت على موقع المودات بالتوفيق لكم Edited April 8 by Mohab added thumbnail Link to comment
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now