جاهز للرسائل المباشرة وقنوات النقابة عبر Gateway الرسمي لـ Discord.Documentation Index
Fetch the complete documentation index at: https://docs.openclaw.ai/llms.txt
Use this file to discover all available pages before exploring further.
الإقران
أوامر الشرطة المائلة
استكشاف أخطاء القنوات وإصلاحها
الإعداد السريع
ستحتاج إلى إنشاء تطبيق جديد مع روبوت، وإضافة الروبوت إلى خادمك، وإقرانه بـ OpenClaw. نوصي بإضافة روبوتك إلى خادمك الخاص. إذا لم يكن لديك واحد بعد، أنشئ واحدًا أولًا (اختر Create My Own > For me and my friends).إنشاء تطبيق وروبوت Discord
تمكين النوايا ذات الامتيازات
- Message Content Intent (مطلوب)
- Server Members Intent (موصى به؛ مطلوب لقوائم السماح بالأدوار ومطابقة الاسم بالمعرّف)
- Presence Intent (اختياري؛ مطلوب فقط لتحديثات الحضور)
نسخ رمز الروبوت
إنشاء عنوان URL للدعوة وإضافة الروبوت إلى خادمك
botapplications.commands
- عرض القنوات أذونات النص
- إرسال الرسائل
- قراءة سجل الرسائل
- تضمين الروابط
- إرفاق الملفات
- إضافة التفاعلات (اختياري)
تمكين وضع المطور وجمع معرّفاتك
- انقر على User Settings (أيقونة الترس بجانب صورتك الرمزية) → Advanced → فعّل Developer Mode
- انقر بزر الماوس الأيمن على أيقونة الخادم في الشريط الجانبي → Copy Server ID
- انقر بزر الماوس الأيمن على صورتك الرمزية → Copy User ID
السماح بالرسائل المباشرة من أعضاء الخادم
ضبط رمز الروبوت بأمان (لا ترسله في الدردشة)
openclaw gateway run وإعادة تشغيلها.
بالنسبة لتثبيتات الخدمة المُدارة، شغّل openclaw gateway install من صدفة يكون فيها DISCORD_BOT_TOKEN موجودًا، أو خزّن المتغير في ~/.openclaw/.env، حتى تتمكن الخدمة من حل env SecretRef بعد إعادة التشغيل.
إذا كان مضيفك محظورًا أو محدود المعدل بسبب بحث تطبيق بدء التشغيل في Discord، فاضبط معرّف تطبيق/عميل Discord من Developer Portal حتى يتمكن بدء التشغيل من تخطي استدعاء REST هذا. استخدم channels.discord.applicationId للحساب الافتراضي، أو channels.discord.accounts.<accountId>.applicationId عند تشغيل عدة روبوتات Discord.تكوين OpenClaw والإقران
- اسأل وكيلك
- CLI / التكوين
“لقد ضبطت بالفعل رمز روبوت Discord الخاص بي في التكوين. يُرجى إكمال إعداد Discord باستخدام User ID<user_id>و Server ID<server_id>.”
الموافقة على أول إقران برسالة مباشرة
- اسأل وكيلك
- CLI
“وافق على رمز إقران Discord هذا: <CODE>”
DISCORD_BOT_TOKEN للحساب الافتراضي فقط.
إذا تم حل حسابي Discord ممكّنين إلى رمز الروبوت نفسه، يبدأ OpenClaw مراقب Gateway واحدًا فقط لذلك الرمز. الرمز القادم من التكوين يتقدم على رجوع env الافتراضي؛ وإلا يفوز أول حساب ممكّن ويتم الإبلاغ عن الحساب المكرر كمعطّل.
بالنسبة للاستدعاءات الصادرة المتقدمة (أداة الرسائل/إجراءات القنوات)، يُستخدم token صريح لكل استدعاء لذلك الاستدعاء. ينطبق هذا على إجراءات الإرسال والقراءة/الفحص (على سبيل المثال read/search/fetch/thread/pins/permissions). لا تزال إعدادات سياسة الحساب/إعادة المحاولة تأتي من الحساب المحدد في لقطة وقت التشغيل النشطة.موصى به: إعداد مساحة عمل للنقابة
بعد أن تعمل الرسائل المباشرة، يمكنك إعداد خادم Discord الخاص بك كمساحة عمل كاملة حيث تحصل كل قناة على جلسة وكيل خاصة بها بسياقها الخاص. يوصى بهذا للخوادم الخاصة التي تضمك أنت وروبوتك فقط.إضافة خادمك إلى قائمة السماح للنقابة
- اسأل وكيلك
- التكوين
“أضف Discord Server ID <server_id> الخاص بي إلى قائمة السماح للنقابة”
السماح بالردود بدون @mention
message، حتى يتمكن الوكيل من المراقبة افتراضيًا والنشر فقط عندما يقرر أن ردًا في القناة مفيد.يعني هذا أن النموذج المحدد يجب أن يستدعي الأدوات بموثوقية. إذا أظهر Discord حالة الكتابة وأظهرت السجلات استخدام الرموز ولكن لم تُنشر أي رسالة، فتحقق من سجل الجلسة بحثًا عن نص المساعد مع didSendViaMessagingTool: false. يعني هذا أن النموذج أنشأ إجابة نهائية خاصة بدلًا من استدعاء message(action=send). انتقل إلى نموذج أقوى في استدعاء الأدوات، أو استخدم التكوين أدناه لاستعادة الردود النهائية التلقائية القديمة.- اسأل وكيلك
- التكوين
“اسمح لوكيلي بالرد على هذا الخادم بدون الحاجة إلى أن تتم الإشارة إليه بـ @”
#coding أو #home أو #research أو أي شيء يناسب سير عملك.
نموذج وقت التشغيل
- يملك Gateway اتصال Discord.
- توجيه الردود حتمي: تعود الردود الواردة من Discord إلى Discord.
- تُضاف بيانات تعريف خادم/قناة Discord إلى موجّه النموذج كسياق غير موثوق به، وليس كبادئة رد مرئية للمستخدم. إذا نسخ نموذج ذلك الغلاف مرة أخرى، يزيل OpenClaw بيانات التعريف المنسوخة من الردود الصادرة ومن سياق إعادة التشغيل المستقبلي.
- افتراضيًا (
session.dmScope=main)، تشارك المحادثات المباشرة جلسة الوكيل الرئيسية (agent:main:main). - قنوات الخوادم هي مفاتيح جلسات معزولة (
agent:<agentId>:discord:channel:<channelId>). - تُتجاهل الرسائل المباشرة الجماعية افتراضيًا (
channels.discord.dm.groupEnabled=false). - تعمل أوامر slash الأصلية في جلسات أوامر معزولة (
agent:<agentId>:discord:slash:<userId>)، مع الاستمرار في حملCommandTargetSessionKeyإلى جلسة المحادثة الموجّهة. - يستخدم تسليم إعلانات cron/heartbeat النصية فقط إلى Discord الإجابة النهائية المرئية للمساعد مرة واحدة. تبقى حمولات الوسائط والمكوّنات المهيكلة متعددة الرسائل عندما يصدر الوكيل عدة حمولات قابلة للتسليم.
قنوات المنتديات
تقبل قنوات المنتديات والوسائط في Discord منشورات السلاسل فقط. يدعم OpenClaw طريقتين لإنشائها:- أرسل رسالة إلى أصل المنتدى (
channel:<forumId>) لإنشاء سلسلة تلقائيًا. يستخدم عنوان السلسلة أول سطر غير فارغ من رسالتك. - استخدم
openclaw message thread createلإنشاء سلسلة مباشرة. لا تمرّر--message-idلقنوات المنتديات.
channel:<threadId>).
المكوّنات التفاعلية
يدعم OpenClaw حاويات مكوّنات Discord v2 لرسائل الوكيل. استخدم أداة الرسائل مع حمولةcomponents. تُوجَّه نتائج التفاعل مرة أخرى إلى الوكيل كرسائل واردة عادية وتتبع إعدادات Discord replyToMode الحالية.
الكتل المدعومة:
text,section,separator,actions,media-gallery,file- تسمح صفوف الإجراءات بما يصل إلى 5 أزرار أو قائمة اختيار واحدة
- أنواع الاختيار:
string,user,role,mentionable,channel
components.reusable=true للسماح باستخدام الأزرار والاختيارات والنماذج عدة مرات حتى تنتهي صلاحيتها.
لتقييد من يمكنه النقر على زر، عيّن allowedUsers على ذلك الزر (معرّفات مستخدمي Discord أو الوسوم أو *). عند التهيئة، يتلقى المستخدمون غير المطابقين رفضًا عابرًا.
تفتح أوامر slash /model و/models منتقي نماذج تفاعليًا مع قوائم منسدلة لمزوّد الخدمة والنموذج وبيئة التشغيل المتوافقة، إضافة إلى خطوة إرسال. أصبح /models add مهمَلًا، ويعيد الآن رسالة إهمال بدلًا من تسجيل النماذج من الدردشة. يكون رد المنتقي عابرًا ولا يمكن استخدامه إلا للمستخدم الذي استدعاه. قوائم اختيار Discord محدودة بـ 25 خيارًا، لذا أضف إدخالات provider/* إلى agents.defaults.models عندما تريد أن يعرض المنتقي النماذج المكتشفة ديناميكيًا فقط لمزوّدي خدمات محددين مثل openai-codex أو vllm.
مرفقات الملفات:
- يجب أن تشير كتل
fileإلى مرجع مرفق (attachment://<filename>) - وفّر المرفق عبر
media/path/filePath(ملف واحد)؛ استخدمmedia-galleryلعدة ملفات - استخدم
filenameلتجاوز اسم الرفع عندما يجب أن يطابق مرجع المرفق
- أضف
components.modalمع ما يصل إلى 5 حقول - أنواع الحقول:
text,checkbox,radio,select,role-select,user-select - يضيف OpenClaw زر تشغيل تلقائيًا
التحكم في الوصول والتوجيه
- DM policy
- Access groups
- Guild policy
- Mentions and group DMs
channels.discord.dmPolicy في الوصول إلى الرسائل المباشرة. channels.discord.allowFrom هي قائمة السماح الأساسية للرسائل المباشرة.pairing(افتراضي)allowlistopen(يتطلب أن يتضمنchannels.discord.allowFromالقيمة"*")disabled
pairing).أسبقية الحسابات المتعددة:- ينطبق
channels.discord.accounts.default.allowFromفقط على حسابdefault. - لحساب واحد، يكون لـ
allowFromأسبقية علىdm.allowFromالقديم. - ترث الحسابات المسماة
channels.discord.allowFromعندما لا تكون قيمتاallowFromالخاصة بها وdm.allowFromالقديمة معيّنتين. - لا ترث الحسابات المسماة
channels.discord.accounts.default.allowFrom.
channels.discord.dm.policy وchannels.discord.dm.allowFrom القديمتان تُقرآن للتوافق. يرحّلهما openclaw doctor --fix إلى dmPolicy وallowFrom عندما يستطيع فعل ذلك دون تغيير الوصول.تنسيق هدف الرسائل المباشرة للتسليم:user:<id>- إشارة
<@id>
allowFrom الفعّالة للرسائل المباشرة في الحساب تُعامل كأهداف رسائل مباشرة للمستخدمين لأغراض التوافق.توجيه الوكلاء المستند إلى الأدوار
استخدمbindings[].match.roles لتوجيه أعضاء خوادم Discord إلى وكلاء مختلفين حسب معرّف الدور. تقبل الارتباطات المستندة إلى الأدوار معرّفات الأدوار فقط، وتُقيَّم بعد ارتباطات النظير أو النظير الأصل وقبل ارتباطات الخادم فقط. إذا عيّن ارتباط حقول مطابقة أخرى أيضًا (مثلًا peer + guildId + roles)، فيجب أن تتطابق كل الحقول المهيأة.
الأوامر الأصلية ومصادقة الأوامر
- يتم تعيين القيمة الافتراضية لـ
commands.nativeإلى"auto"ويكون مفعلا لـ Discord. - التجاوز لكل قناة:
channels.discord.commands.native. - يؤدي
commands.native=falseإلى تخطي تسجيل أوامر الشرطة المائلة في Discord وتنظيفها أثناء بدء التشغيل. قد تبقى الأوامر المسجلة سابقا مرئية في Discord إلى أن تزيلها من تطبيق Discord. - تستخدم مصادقة الأوامر الأصلية قوائم السماح/السياسات نفسها في Discord مثل معالجة الرسائل العادية.
- قد تظل الأوامر مرئية في واجهة Discord للمستخدمين غير المصرح لهم؛ لكن التنفيذ يظل يفرض مصادقة OpenClaw ويعيد “غير مصرح”.
ephemeral: true
تفاصيل الميزة
وسوم الرد والردود الأصلية
وسوم الرد والردود الأصلية
[[reply_to_current]][[reply_to:<id>]]
channels.discord.replyToMode:off(الافتراضي)firstallbatched
off تسلسل الردود الضمني. تظل وسوم [[reply_to_*]] الصريحة محترمة.
يرفق first دائما مرجع الرد الأصلي الضمني بأول رسالة صادرة في Discord لذلك الدور.
لا يرفق batched مرجع الرد الأصلي الضمني في Discord إلا عندما يكون
الدور الوارد دفعة مؤجلة من رسائل متعددة. يكون هذا مفيدا
عندما تريد الردود الأصلية أساسا للمحادثات المتدفقة الملتبسة، وليس لكل
دور ذي رسالة واحدة.تظهر معرفات الرسائل في السياق/السجل حتى يتمكن الوكلاء من استهداف رسائل محددة.معاينة البث المباشر
معاينة البث المباشر
channels.discord.streaming القيم off | partial | block | progress (الافتراضي). يحتفظ progress بمسودة حالة واحدة قابلة للتعديل ويحدثها بتقدم الأدوات حتى التسليم النهائي؛ تسمية البدء المشتركة سطر متحرك، لذلك تختفي بالتمرير مثل البقية بمجرد ظهور عمل كاف. streamMode اسم مستعار قديم وقت التشغيل. شغل openclaw doctor --fix لإعادة كتابة الإعدادات المحفوظة إلى المفتاح القانوني.عيّن channels.discord.streaming.mode إلى off لتعطيل تعديلات معاينة Discord. إذا تم تفعيل بث كتل Discord صراحة، يتخطى OpenClaw بث المعاينة لتجنب البث المزدوج.- يعدل
partialرسالة معاينة واحدة مع وصول الرموز. - يصدر
blockأجزاء بحجم المسودة (استخدمdraftChunkلضبط الحجم ونقاط الفصل، مع تقييدها إلىtextChunkLimit). - تؤدي نهائيات الوسائط والأخطاء والردود الصريحة إلى إلغاء تعديلات المعاينة المعلقة.
- يتحكم
streaming.preview.toolProgress(الافتراضيtrue) فيما إذا كانت تحديثات الأداة/التقدم تعيد استخدام رسالة المعاينة. - تعرض صفوف الأداة/التقدم كرمز تعبيري مضغوط + عنوان + تفاصيل عند توفرها، مثلا
🛠️ Bash: run testsأو🔎 Web Search: for "query". - يتحكم
streaming.preview.commandText/streaming.progress.commandTextفي تفاصيل الأمر/التنفيذ في أسطر التقدم المضغوطة:raw(الافتراضي) أوstatus(تسمية الأداة فقط).
block صراحة، يتخطى OpenClaw بث المعاينة لتجنب البث المزدوج.السجل والسياق وسلوك سلاسل المحادثة
السجل والسياق وسلوك سلاسل المحادثة
- الافتراضي
channels.discord.historyLimitهو20 - البديل:
messages.groupChat.historyLimit 0يعطل
channels.discord.dmHistoryLimitchannels.discord.dms["<user_id>"].historyLimit
- يتم توجيه سلاسل Discord كجلسات قناة وترث إعدادات القناة الأصلية ما لم يتم تجاوزها.
- ترث جلسات سلسلة المحادثة اختيار
/modelعلى مستوى جلسة القناة الأصلية كبديل خاص بالنموذج فقط؛ تظل اختيارات/modelالمحلية للسلسلة ذات أولوية، ولا يتم نسخ سجل النصوص الأصلي ما لم يتم تفعيل وراثة النصوص. - يختار
channels.discord.thread.inheritParent(الافتراضيfalse) سلاسل المحادثة التلقائية الجديدة لتهيئتها من نص القناة الأصلية. توجد التجاوزات لكل حساب ضمنchannels.discord.accounts.<id>.thread.inheritParent. - يمكن لتفاعلات أداة الرسائل حل أهداف الرسائل الخاصة
user:<id>. - يتم الحفاظ على
guilds.<guild>.channels.<channel>.requireMention: falseأثناء بديل تفعيل مرحلة الرد.
جلسات مرتبطة بسلسلة المحادثة للوكلاء الفرعيين
جلسات مرتبطة بسلسلة المحادثة للوكلاء الفرعيين
/focus <target>ربط سلسلة المحادثة الحالية/الجديدة بهدف وكيل فرعي/جلسة/unfocusإزالة ربط سلسلة المحادثة الحالية/agentsعرض التشغيلات النشطة وحالة الربط/session idle <duration|off>فحص/تحديث إلغاء التركيز التلقائي عند الخمول للارتباطات المركزة/session max-age <duration|off>فحص/تحديث الحد الأقصى الصارم للعمر للارتباطات المركزة
- يحدد
session.threadBindings.*القيم الافتراضية العامة. - يتجاوز
channels.discord.threadBindings.*سلوك Discord. - يتحكم
spawnSessionsفي الإنشاء/الربط التلقائي لسلاسل المحادثة لـsessions_spawn({ thread: true })وعمليات إنشاء سلاسل ACP. الافتراضي:true. - يتحكم
defaultSpawnContextفي سياق الوكيل الفرعي الأصلي لعمليات الإنشاء المرتبطة بسلسلة المحادثة. الافتراضي:"fork". - يتم ترحيل مفاتيح
spawnSubagentSessions/spawnAcpSessionsالمهملة بواسطةopenclaw doctor --fix. - إذا كانت ارتباطات سلاسل المحادثة معطلة لحساب، فإن
/focusوعمليات ربط سلاسل المحادثة ذات الصلة لا تكون متاحة.
ارتباطات قنوات ACP المستمرة
ارتباطات قنوات ACP المستمرة
bindings[]معtype: "acp"وmatch.channel: "discord"
- يربط
/acp spawn codex --bind hereالقناة أو سلسلة المحادثة الحالية في مكانها ويحافظ على الرسائل المستقبلية في جلسة ACP نفسها. ترث رسائل سلسلة المحادثة ربط القناة الأصلية. - في قناة أو سلسلة محادثة مرتبطة، يعيد
/newو/resetضبط جلسة ACP نفسها في مكانها. يمكن لارتباطات سلسلة المحادثة المؤقتة تجاوز حل الهدف أثناء نشاطها. - يتحكم
spawnSessionsفي إنشاء/ربط سلاسل المحادثة الفرعية عبر--thread auto|here.
إشعارات التفاعلات
إشعارات التفاعلات
offown(الافتراضي)allallowlist(يستخدمguilds.<id>.users)
تفاعلات الإقرار
تفاعلات الإقرار
ackReaction رمزا تعبيريا للإقرار أثناء معالجة OpenClaw لرسالة واردة.ترتيب الحل:channels.discord.accounts.<accountId>.ackReactionchannels.discord.ackReactionmessages.ackReaction- بديل الرمز التعبيري لهوية الوكيل (
agents.list[].identity.emoji، وإلا ”👀”)
- يقبل Discord الرموز التعبيرية الموحّدة أو أسماء الرموز التعبيرية المخصصة.
- استخدم
""لتعطيل التفاعل لقناة أو حساب.
كتابات الإعدادات
كتابات الإعدادات
/config set|unset (عند تفعيل ميزات الأوامر).التعطيل:وكيل Gateway
وكيل Gateway
channels.discord.proxy.دعم PluralKit
دعم PluralKit
- يمكن لقوائم السماح استخدام
pk:<memberId> - تتم مطابقة أسماء عرض الأعضاء بالاسم/الاسم المختصر فقط عندما يكون
channels.discord.dangerouslyAllowNameMatching: true - تستخدم عمليات البحث معرف الرسالة الأصلي وتكون مقيدة بنافذة زمنية
- إذا فشلت عملية البحث، تعامل الرسائل الموكلة كرسائل بوت ويتم إسقاطها ما لم يكن
allowBots=true
أسماء مستعارة للإشارات الصادرة
أسماء مستعارة للإشارات الصادرة
mentionAliases عندما يحتاج الوكلاء إلى إشارات صادرة حتمية لمستخدمي Discord معروفين. المفاتيح هي مقابض دون @ البادئة؛ والقيم هي معرفات مستخدمي Discord. تترك المقابض غير المعروفة، و@everyone، و@here، والإشارات داخل مقاطع كود Markdown دون تغيير.إعدادات الحضور
إعدادات الحضور
- 0: اللعب
- 1: البث (يتطلب
activityUrl) - 2: الاستماع
- 3: المشاهدة
- 4: مخصص (يستخدم نص النشاط كحالة للحالة؛ الرمز التعبيري اختياري)
- 5: المنافسة
autoPresence.healthyTextautoPresence.degradedTextautoPresence.exhaustedText(يدعم العنصر النائب{reason})
الموافقات في Discord
الموافقات في Discord
channels.discord.execApprovals.enabledchannels.discord.execApprovals.approvers(اختياري؛ يعود إلىcommands.ownerAllowFromعندما يكون ذلك ممكنًا)channels.discord.execApprovals.target(dm|channel|both، الافتراضي:dm)agentFilter،sessionFilter،cleanupAfterResolve
enabled غير معيّن أو "auto" ويمكن حل موافق واحد على الأقل، إما من execApprovals.approvers أو من commands.ownerAllowFrom. لا يستنتج Discord موافقي التنفيذ من allowFrom الخاصة بالقناة، أو dm.allowFrom القديمة، أو defaultTo الخاصة بالرسائل المباشرة. عيّن enabled: false لتعطيل Discord كعميل موافقة أصلي صراحةً.بالنسبة إلى أوامر المجموعات الحساسة المخصصة للمالك فقط مثل /diagnostics و/export-trajectory، يرسل OpenClaw مطالبات الموافقة والنتائج النهائية بشكل خاص. يحاول استخدام رسالة Discord خاصة أولًا عندما يكون للمالك المستدعي مسار مالك على Discord؛ وإذا لم يكن ذلك متاحًا، يعود إلى أول مسار مالك متاح من commands.ownerAllowFrom، مثل Telegram.عندما تكون target هي channel أو both، تكون مطالبة الموافقة مرئية في القناة. لا يمكن استخدام الأزرار إلا للموافقين الذين تم حلهم؛ ويتلقى المستخدمون الآخرون رفضًا عابرًا. تتضمن مطالبات الموافقة نص الأمر، لذلك لا تفعّل التسليم إلى القناة إلا في القنوات الموثوقة. إذا تعذر اشتقاق معرّف القناة من مفتاح الجلسة، يعود OpenClaw إلى التسليم عبر الرسائل الخاصة.يعرض Discord أيضًا أزرار الموافقة المشتركة التي تستخدمها قنوات الدردشة الأخرى. يضيف محوّل Discord الأصلي بشكل أساسي توجيه الرسائل الخاصة للموافقين والتوزيع إلى القنوات.
عند وجود هذه الأزرار، تكون هي تجربة الموافقة الأساسية؛ ويجب على OpenClaw
تضمين أمر /approve يدوي فقط عندما تفيد نتيجة الأداة بأن
موافقات الدردشة غير متاحة أو أن الموافقة اليدوية هي المسار الوحيد.
إذا لم يكن وقت تشغيل الموافقة الأصلي في Discord نشطًا، يبقي OpenClaw
مطالبة /approve <id> <decision> الحتمية المحلية مرئية. إذا كان
وقت التشغيل نشطًا ولكن تعذر تسليم بطاقة أصلية إلى أي هدف،
يرسل OpenClaw إشعار رجوع في الدردشة نفسها يتضمن أمر /approve
الدقيق من الموافقة المعلقة.تتبع مصادقة Gateway وحل الموافقات عقد عميل Gateway المشترك (تُحل معرّفات plugin: عبر plugin.approval.resolve؛ وتُحل المعرّفات الأخرى عبر exec.approval.resolve). تنتهي صلاحية الموافقات بعد 30 دقيقة افتراضيًا.راجع موافقات التنفيذ.الأدوات وبوابات الإجراءات
تتضمن إجراءات رسائل Discord إجراءات المراسلة وإدارة القنوات والإشراف والحضور والبيانات الوصفية. أمثلة أساسية:- المراسلة:
sendMessage،readMessages،editMessage،deleteMessage،threadReply - التفاعلات:
react،reactions،emojiList - الإشراف:
timeout،kick،ban - الحضور:
setPresence
event-create معلمة image اختيارية (URL أو مسار ملف محلي) لتعيين صورة غلاف الحدث المجدول.
توجد بوابات الإجراءات ضمن channels.discord.actions.*.
سلوك البوابة الافتراضي:
| مجموعة الإجراءات | الافتراضي |
|---|---|
| reactions، messages، threads، pins، polls، search، memberInfo، roleInfo، channelInfo، channels، voiceStatus، events، stickers، emojiUploads، stickerUploads، permissions | مفعّل |
| roles | معطّل |
| moderation | معطّل |
| presence | معطّل |
واجهة مستخدم Components v2
يستخدم OpenClaw مكونات Discord v2 لموافقات التنفيذ وعلامات السياقات المتعددة. يمكن لإجراءات رسائل Discord أيضًا قبولcomponents لواجهة مستخدم مخصصة (متقدم؛ يتطلب إنشاء حمولة مكوّن عبر أداة discord)، بينما تظل embeds القديمة متاحة لكنها غير موصى بها.
- يعيّن
channels.discord.ui.components.accentColorلون التمييز المستخدم في حاويات مكونات Discord (hex). - عيّنه لكل حساب باستخدام
channels.discord.accounts.<id>.ui.components.accentColor. - يتم تجاهل
embedsعند وجود مكونات v2.
الصوت
لدى Discord سطحان صوتيان متميزان: قنوات الصوت في الوقت الفعلي (محادثات مستمرة) ومرفقات الرسائل الصوتية (تنسيق معاينة الموجة). يدعم Gateway كليهما.قنوات الصوت
قائمة التحقق للإعداد:- فعّل Message Content Intent في Discord Developer Portal.
- فعّل Server Members Intent عند استخدام قوائم السماح للأدوار/المستخدمين.
- ادعُ الروبوت باستخدام نطاقي
botوapplications.commands. - امنح أذونات Connect وSpeak وSend Messages وRead Message History في قناة الصوت الهدف.
- فعّل الأوامر الأصلية (
commands.nativeأوchannels.discord.commands.native). - اضبط
channels.discord.voice.
/vc join|leave|status للتحكم في الجلسات. يستخدم الأمر الوكيل الافتراضي للحساب ويتبع قواعد قائمة السماح وسياسة المجموعات نفسها مثل أوامر Discord الأخرى.
- يتجاوز
voice.ttsإعدادmessages.ttsلتشغيل الصوت فيstt-ttsفقط. تستخدم أوضاع الوقت الحقيقيvoice.realtime.voice. - يتحكم
voice.modeفي مسار المحادثة. القيمة الافتراضية هيagent-proxy: تتولى واجهة صوتية في الوقت الحقيقي إدارة توقيت الأدوار، والمقاطعة، والتشغيل، وتفوّض العمل الجوهري إلى وكيل OpenClaw الموجّه عبرopenclaw_agent_consult، وتتعامل مع النتيجة كما لو كانت مطالبة Discord مكتوبة من ذلك المتحدث. يحتفظstt-ttsبالتدفق الأقدم القائم على STT الدفعي مع TTS. يتيحbidiلنموذج الوقت الحقيقي المحادثة مباشرة مع إتاحةopenclaw_agent_consultلعقل OpenClaw. - يتحكم
voice.agentSessionفي محادثة OpenClaw التي تستقبل أدوار الصوت. اتركه غير معيّن لاستخدام جلسة قناة الصوت نفسها، أو اضبط{ mode: "target", target: "channel:<text-channel-id>" }لجعل قناة الصوت تعمل كامتداد ميكروفون/مكبر صوت لجلسة قناة نصية موجودة في Discord مثل#maintainers. - يتجاوز
voice.modelعقل وكيل OpenClaw لاستجابات Discord الصوتية والاستشارات في الوقت الحقيقي. اتركه غير معيّن ليرث نموذج الوكيل الموجّه. وهو منفصل عنvoice.realtime.model. - يوجّه
agent-proxyالكلام عبرdiscord-voice، ما يحافظ على تفويض المالك/الأدوات العادي للمتحدث والجلسة المستهدفة لكنه يخفي أداة الوكيلttsلأن صوت Discord يمتلك التشغيل. افتراضياً، يمنحagent-proxyالاستشارة وصولاً كاملاً إلى الأدوات بمستوى مكافئ للمالك للمتحدثين المالكين (voice.realtime.toolPolicy: "owner") ويفضل بشدة استشارة وكيل OpenClaw قبل الإجابات الجوهرية (voice.realtime.consultPolicy: "always"). في وضعalwaysالافتراضي هذا، لا تنطق طبقة الوقت الحقيقي كلاماً حشوياً تلقائياً قبل إجابة الاستشارة؛ بل تلتقط الكلام وتنسخه، ثم تنطق إجابة OpenClaw الموجّهة. إذا انتهت عدة إجابات استشارة مفروضة بينما لا يزال Discord يشغل الإجابة الأولى، تُصفّ إجابات الكلام الدقيقة اللاحقة حتى يصبح التشغيل خاملاً بدلاً من استبدال الكلام في منتصف الجملة. - في وضع
stt-tts، يستخدم STTtools.media.audio؛ ولا يؤثرvoice.modelفي النسخ. - في أوضاع الوقت الحقيقي، تضبط
voice.realtime.providerوvoice.realtime.modelوvoice.realtime.voiceجلسة الصوت في الوقت الحقيقي. لاستخدام OpenAI Realtime 2 مع عقل Codex، استخدمvoice.realtime.model: "gpt-realtime-2"وvoice.model: "openai-codex/gpt-5.5". - يقبل موفر الوقت الحقيقي في OpenAI أسماء أحداث Realtime 2 الحالية والأسماء المستعارة القديمة المتوافقة مع Codex لأحداث صوت المخرجات والنص المنسوخ، بحيث يمكن أن تنحرف لقطات الموفر المتوافقة دون إسقاط صوت المساعد.
- يتحكم
voice.realtime.bargeInفيما إذا كانت أحداث بدء المتحدث في Discord تقاطع التشغيل النشط في الوقت الحقيقي. إذا تُرك غير معيّن، فإنه يتبع إعداد مقاطعة صوت الإدخال لدى موفر الوقت الحقيقي. - يتحكم
voice.realtime.minBargeInAudioEndMsفي الحد الأدنى لمدة تشغيل المساعد قبل أن تقطع مقاطعة OpenAI في الوقت الحقيقي الصوت. الافتراضي:250. اضبط0للمقاطعة الفورية في الغرف منخفضة الصدى، أو ارفعه لإعدادات مكبرات الصوت كثيرة الصدى. - لاستخدام صوت OpenAI في تشغيل Discord، اضبط
voice.tts.provider: "openai"واختر صوت تحويل نص إلى كلام ضمنvoice.tts.openai.voiceأوvoice.tts.providers.openai.voice. يُعدcedarخياراً جيداً ذا طابع صوتي ذكوري على نموذج TTS الحالي من OpenAI. - تنطبق تجاوزات
systemPromptفي Discord لكل قناة على أدوار نصوص الصوت المنسوخة لتلك القناة الصوتية. - تستمد أدوار نصوص الصوت المنسوخة حالة المالك من
allowFromفي Discord (أوdm.allowFrom)؛ ولا يمكن للمتحدثين غير المالكين الوصول إلى الأدوات المخصصة للمالك فقط (مثلgatewayوcron). - صوت Discord اختياري للإعدادات النصية فقط؛ اضبط
channels.discord.voice.enabled=true(أو أبقِ كتلةchannels.discord.voiceموجودة) لتمكين أوامر/vc، ووقت تشغيل الصوت، وقصد GatewayGuildVoiceStates. - يمكن لـ
channels.discord.intents.voiceStatesتجاوز اشتراك قصد حالة الصوت صراحةً. اتركه غير معيّن ليتبع القصد حالة تمكين الصوت الفعلية. - إذا احتوى
voice.autoJoinعلى عدة إدخالات للنقابة نفسها، ينضم OpenClaw إلى آخر قناة مهيأة لتلك النقابة. voice.allowedChannelsقائمة سماح اختيارية للإقامة. اتركها غير معيّنة للسماح لـ/vc joinبالدخول إلى أي قناة صوتية مصرّح بها في Discord. عند تعيينها، تُقيّد عمليات/vc joinوالانضمام التلقائي عند بدء التشغيل ونقل حالة صوت البوت بالإدخالات المدرجة{ guildId, channelId }. اضبطها على مصفوفة فارغة لرفض جميع عمليات انضمام Discord الصوتية. إذا نقل Discord البوت خارج قائمة السماح، يغادر OpenClaw تلك القناة ويعيد الانضمام إلى هدف الانضمام التلقائي المهيأ عندما يكون متاحاً.- يمرر
voice.daveEncryptionوvoice.decryptionFailureToleranceإلى خيارات الانضمام في@discordjs/voice. - الإعدادات الافتراضية لـ
@discordjs/voiceهيdaveEncryption=trueوdecryptionFailureTolerance=24إذا تُركت غير معيّنة. - يستخدم OpenClaw افتراضياً مفكك ترميز
opusscriptالمكتوب بـ JS فقط لاستقبال صوت Discord. يتجاهل repo حزمة@discordjs/opusالأصلية الاختيارية وفق سياسة تثبيت pnpm، بحيث لا تقوم عمليات التثبيت العادية ومسارات Docker والاختبارات غير ذات الصلة بتجميع إضافة أصلية. يمكن لمضيفي أداء الصوت المخصصين الاشتراك عبرOPENCLAW_DISCORD_OPUS_DECODER=nativeبعد تثبيت الإضافة الأصلية. - يتحكم
voice.connectTimeoutMsفي انتظار Ready الأولي الخاص بـ@discordjs/voiceلمحاولات/vc joinوالانضمام التلقائي. الافتراضي:30000. - يتحكم
voice.reconnectGraceMsفي مدة انتظار OpenClaw لجلسة صوتية منقطعة كي تبدأ إعادة الاتصال قبل تدميرها. الافتراضي:15000. - في وضع
stt-tts، لا يتوقف تشغيل الصوت لمجرد أن مستخدماً آخر بدأ الكلام. لتجنب حلقات التغذية الراجعة، يتجاهل OpenClaw التقاط الصوت الجديد أثناء تشغيل TTS؛ تحدث بعد انتهاء التشغيل للدور التالي. تمرر أوضاع الوقت الحقيقي بدايات المتحدث كإشارات مقاطعة إلى موفر الوقت الحقيقي. - في أوضاع الوقت الحقيقي، قد يبدو الصدى من مكبرات الصوت إلى ميكروفون مفتوح كمقاطعة ويقاطع التشغيل. لغرف Discord كثيرة الصدى، اضبط
voice.realtime.providers.openai.interruptResponseOnInputAudio: falseلمنع OpenAI من المقاطعة التلقائية عند صوت الإدخال. أضفvoice.realtime.bargeIn: trueإذا كنت لا تزال تريد أن تقاطع أحداث بدء المتحدث في Discord التشغيل النشط. يتجاهل جسر OpenAI في الوقت الحقيقي عمليات اقتطاع التشغيل الأقصر منvoice.realtime.minBargeInAudioEndMsباعتبارها غالباً صدى/ضجيجاً ويسجلها كمتخطاة بدلاً من مسح تشغيل Discord. - يتحكم
voice.captureSilenceGraceMsفي مدة انتظار OpenClaw بعد أن يبلغ Discord بأن المتحدث توقف قبل إنهاء ذلك المقطع الصوتي لـ STT. الافتراضي:2500؛ ارفع هذه القيمة إذا كان Discord يقسم الوقفات الطبيعية إلى نصوص منسوخة جزئية متقطعة. - عندما يكون ElevenLabs هو موفر TTS المحدد، يستخدم تشغيل صوت Discord TTS بالتدفق ويبدأ من تدفق استجابة الموفر. تعود الموفرات التي لا تدعم التدفق إلى مسار الملف المؤقت المركّب.
- يراقب OpenClaw أيضاً حالات فشل فك تشفير الاستقبال ويتعافى تلقائياً عبر مغادرة/إعادة الانضمام إلى القناة الصوتية بعد إخفاقات متكررة ضمن نافذة قصيرة.
- إذا أظهرت سجلات الاستقبال بشكل متكرر
DecryptionFailed(UnencryptedWhenPassthroughDisabled)بعد التحديث، فاجمع تقرير اعتماديات وسجلات. يتضمن خط@discordjs/voiceالمرفق إصلاح الحشو upstream من PR #11449 في discord.js، الذي أغلق issue #11419 في discord.js. - أحداث استقبال
The operation was abortedمتوقعة عندما ينهي OpenClaw مقطع متحدث ملتقطاً؛ وهي تشخيصات مطولة، لا تحذيرات. - تتضمن سجلات صوت Discord المطولة معاينة محدودة من سطر واحد لنص STT المنسوخ لكل مقطع متحدث مقبول، بحيث يعرض التصحيح جانب المستخدم وجانب رد الوكيل دون تفريغ نصوص منسوخة غير محدودة.
- في وضع
agent-proxy، يتخطى رجوع الاستشارة المفروضة أجزاء النص المنسوخ التي تبدو غير مكتملة مثل النص المنتهي بـ...أو واصل لاحق مثلand، إضافة إلى عبارات الإغلاق الواضحة غير القابلة للتنفيذ مثل “سأعود حالاً” أو “وداعاً”. تعرض السجلاتforced agent consult skipped reason=...عندما يمنع ذلك إجابة قديمة في الطابور.
node-gyp.
بعد تثبيت الإضافة الأصلية، ابدأ Gateway باستخدام:
discord voice: opus decoder: @discordjs/opus. من دون الاشتراك عبر متغير البيئة، أو إذا كانت الإضافة الأصلية مفقودة أو لا يمكن تحميلها على المضيف، يسجل OpenClaw discord voice: opus decoder: opusscript ويواصل استقبال الصوت عبر بديل JS الصرف.
مسار STT مع TTS:
- يتم تحويل التقاط PCM من Discord إلى ملف WAV مؤقت.
- يتولى
tools.media.audioمعالجة STT، على سبيل المثالopenai/gpt-4o-mini-transcribe. - يُرسل النص المنسوخ عبر مدخل Discord والتوجيه بينما يعمل LLM للاستجابة بسياسة إخراج صوتي تخفي أداة الوكيل
ttsوتطلب نصاً مُعاداً، لأن صوت Discord يمتلك تشغيل TTS النهائي. - عند تعيين
voice.model، فإنه يتجاوز فقط LLM الخاص بالاستجابة لهذا الدور في القناة الصوتية. - يُدمج
voice.ttsفوقmessages.tts؛ تغذي الموفرات القادرة على التدفق المشغل مباشرة، وإلا فيُشغل ملف الصوت الناتج في القناة المنضم إليها.
voice.agentSession، تحصل كل قناة صوتية على جلسة OpenClaw موجّهة خاصة بها. على سبيل المثال، يتحدث /vc join channel:234567890123456789 إلى الجلسة الخاصة بتلك القناة الصوتية في Discord. نموذج الوقت الحقيقي هو واجهة الصوت فقط؛ وتُسلّم الطلبات الجوهرية إلى وكيل OpenClaw المهيأ. إذا أنتج نموذج الوقت الحقيقي نصاً نهائياً منسوخاً من دون استدعاء أداة الاستشارة، يفرض OpenClaw الاستشارة كرجوع بحيث يظل السلوك الافتراضي مشابهاً للتحدث إلى الوكيل.
مثال STT مع TTS القديم:
agent-proxy، ينضم البوت إلى القناة الصوتية المهيأة، لكن أدوار وكيل OpenClaw تستخدم الجلسة والوكيل الموجّهين العاديين للقناة المستهدفة. تنطق جلسة الصوت في الوقت الحقيقي النتيجة المعادة داخل القناة الصوتية. لا يزال بإمكان وكيل الإشراف استخدام أدوات الرسائل العادية وفقاً لسياسة أدواته، بما في ذلك إرسال رسالة Discord منفصلة إذا كان ذلك هو الإجراء الصحيح.
صيغ الأهداف المفيدة:
- يوجّه
target: "channel:123456789012345678"عبر جلسة قناة نصية في Discord. - يُعامل
target: "123456789012345678"كهدف قناة. - يوجّه
target: "dm:123456789012345678"أوtarget: "user:123456789012345678"عبر جلسة الرسائل المباشرة تلك.
bargeIn: true لأحداث بدء متحدث Discord وصوت المتحدث النشط بالفعل إلغاء استجابات الوقت الفعلي النشطة قبل أن تصل اللفة الملتقطة التالية إلى OpenAI. تُعامل إشارات المقاطعة المبكرة جدًا التي يكون فيها audioEndMs أقل من minBargeInAudioEndMs على أنها صدى/ضجيج محتمل ويتم تجاهلها حتى لا ينقطع النموذج عند أول إطار تشغيل.
سجلات الصوت المتوقعة:
- عند الانضمام:
discord voice: joining ... voiceSession=... supervisorSession=... agentSessionMode=... voiceModel=... realtimeModel=... - عند بدء الوقت الفعلي:
discord voice: realtime bridge starting ... autoRespond=false interruptResponse=false bargeIn=false minBargeInAudioEndMs=... - عند صوت المتحدث:
discord voice: realtime speaker turn opened ...، وdiscord voice: realtime input audio started ... outputAudioMs=... outputActive=...، وdiscord voice: realtime speaker turn closed ... chunks=... discordBytes=... realtimeBytes=... interruptedPlayback=... - عند تخطي كلام قديم:
discord voice: realtime forced agent consult skipped reason=incomplete-transcript ...أوreason=non-actionable-closing ... - عند اكتمال استجابة الوقت الفعلي:
discord voice: realtime audio playback finishing reason=response.done ... audioMs=... chunks=... - عند إيقاف/إعادة ضبط التشغيل:
discord voice: realtime audio playback stopped reason=... audioMs=... elapsedMs=... chunks=... - عند استشارة الوقت الفعلي:
discord voice: realtime consult requested ... voiceSession=... supervisorSession=... question=... - عند إجابة الوكيل:
discord voice: agent turn answer ... - عند الكلام المطابق المدرج في الطابور:
discord voice: realtime exact speech queued ... queued=... outputAudioMs=... outputActive=...، يتبعهdiscord voice: realtime exact speech dequeued reason=player-idle ... - عند اكتشاف المقاطعة:
discord voice: realtime barge-in detected source=speaker-start ...أوdiscord voice: realtime barge-in detected source=active-speaker-audio ...، يتبعهdiscord voice: realtime barge-in requested reason=... outputAudioMs=... outputActive=... - عند مقاطعة الوقت الفعلي:
discord voice: realtime model interrupt requested client:response.cancel reason=barge-in، يتبعه إماdiscord voice: realtime model audio truncated client:conversation.item.truncate reason=barge-in audioEndMs=...أوdiscord voice: realtime model interrupt confirmed server:response.done status=cancelled ... - عند تجاهل الصدى/الضجيج:
discord voice: realtime model interrupt ignored client:conversation.item.truncate.skipped reason=barge-in audioEndMs=0 minAudioEndMs=250 - عند تعطيل المقاطعة:
discord voice: realtime capture ignored during playback (barge-in disabled) ... - عند التشغيل الخامل:
discord voice: realtime barge-in ignored reason=... outputActive=false ... playbackChunks=0
- يعني
realtime audio playback startedأن Discord بدأ تشغيل صوت المساعد. يبدأ الجسر من هذه النقطة في عد أجزاء مخرجات المساعد، وبايتات Discord PCM، وبايتات موفر الوقت الفعلي، ومدة الصوت المركب. - يحدد
realtime speaker turn openedأن متحدث Discord أصبح نشطًا. إذا كان التشغيل نشطًا بالفعل وكانbargeInمفعّلًا، فقد يتبعهbarge-in detected source=speaker-start. - يحدد
realtime input audio startedأول إطار صوت فعلي تم استلامه لتلك اللفة من المتحدث. يعنيoutputActive=trueأو قيمة غير صفرية لـoutputAudioMsهنا أن الميكروفون يرسل إدخالًا بينما لا يزال تشغيل المساعد نشطًا. - يعني
barge-in detected source=active-speaker-audioأن OpenClaw رأى صوت متحدث مباشرًا بينما كان تشغيل المساعد نشطًا. يفيد هذا في التمييز بين مقاطعة حقيقية وحدث بدء متحدث في Discord بلا صوت مفيد. - يعني
barge-in requested reason=...أن OpenClaw طلب من موفر الوقت الفعلي إلغاء الاستجابة النشطة أو اقتطاعها. ويتضمنoutputAudioMs، وoutputActive، وplaybackChunksحتى تتمكن من رؤية مقدار صوت المساعد الذي تم تشغيله فعليًا قبل المقاطعة. realtime audio playback stopped reason=...هو نقطة إعادة ضبط تشغيل Discord المحلية. يوضح السبب من أوقف التشغيل:barge-in، أوplayer-idle، أوprovider-clear-audio، أوforced-agent-consult، أوstream-close، أوsession-close.- يلخص
realtime speaker turn closedلفة الإدخال الملتقطة. يعنيchunks=0أوhasAudio=falseأن لفة المتحدث فُتحت لكن لم يصل أي صوت قابل للاستخدام إلى جسر الوقت الفعلي. ويعنيinterruptedPlayback=trueأن لفة الإدخال تلك تداخلت مع مخرجات المساعد وشغّلت منطق المقاطعة.
outputAudioMs: مدة صوت المساعد التي أنشأها موفر الوقت الفعلي قبل سطر السجل.audioMs: مدة صوت المساعد التي عدّها OpenClaw قبل توقف التشغيل.elapsedMs: وقت الساعة الفعلي بين فتح وإغلاق دفق التشغيل أو لفة المتحدث.discordBytes: بايتات PCM ستيريو بتردد 48 كيلوهرتز المرسلة إلى Discord voice أو المستلمة منه.realtimeBytes: بايتات PCM بتنسيق الموفر المرسلة إلى موفر الوقت الفعلي أو المستلمة منه.playbackChunks: أجزاء صوت المساعد الممررة إلى Discord للاستجابة النشطة.sinceLastAudioMs: الفجوة بين آخر إطار صوت متحدث ملتقط وإغلاق لفة المتحدث.
- غالبًا ما يشير الانقطاع الفوري مع
source=active-speaker-audioوoutputAudioMsصغير ووجود المستخدم نفسه بالقرب إلى دخول صدى السماعة إلى الميكروفون. ارفعvoice.realtime.minBargeInAudioEndMs، أو اخفض مستوى صوت السماعة، أو استخدم سماعات رأس، أو عيّنvoice.realtime.providers.openai.interruptResponseOnInputAudio: false. - يعني
source=speaker-startمتبوعًا بـspeaker turn closed ... hasAudio=falseأن Discord أبلغ عن بدء متحدث لكن لم يصل أي صوت إلى OpenClaw. قد يكون ذلك حدث Discord voice عابرًا، أو سلوك بوابة ضجيج، أو عميلًا يفعّل الميكروفون للحظة قصيرة. - يعني
audio playback stopped reason=stream-closeدون مقاطعة قريبة أوprovider-clear-audioأن دفق تشغيل Discord المحلي انتهى بشكل غير متوقع. تحقق من سجلات الموفر ومشغل Discord السابقة. - يعني
capture ignored during playback (barge-in disabled)أن OpenClaw أسقط الإدخال عمدًا بينما كان صوت المساعد نشطًا. فعّلvoice.realtime.bargeInإذا كنت تريد أن يقاطع الكلام التشغيل. - يعني
barge-in ignored ... outputActive=falseأن Discord أو VAD الخاص بالموفر أبلغ عن كلام، لكن لم يكن لدى OpenClaw تشغيل نشط لمقاطعته. لا ينبغي أن يؤدي هذا إلى قطع الصوت.
voice.model، ومصادقة STT لـ tools.media.audio، ومصادقة TTS لـ messages.tts/voice.tts، ومصادقة موفر الوقت الفعلي لـ voice.realtime.providers أو إعدادات المصادقة العادية الخاصة بالموفر.
رسائل الصوت
تعرض رسائل الصوت في Discord معاينة موجية وتتطلب صوت OGG/Opus. ينشئ OpenClaw الموجة تلقائيًا، لكنه يحتاج إلىffmpeg وffprobe على مضيف Gateway للفحص والتحويل.
- وفّر مسار ملف محليًا (تُرفض عناوين URL).
- احذف محتوى النص (يرفض Discord النص + رسالة صوتية في الحمولة نفسها).
- يُقبل أي تنسيق صوت؛ يحوّله OpenClaw إلى OGG/Opus حسب الحاجة.
استكشاف الأخطاء وإصلاحها
استُخدمت نوايا غير مسموح بها أو لا يرى البوت رسائل النقابة
استُخدمت نوايا غير مسموح بها أو لا يرى البوت رسائل النقابة
- فعّل Message Content Intent
- فعّل Server Members Intent عندما تعتمد على حل المستخدم/العضو
- أعد تشغيل Gateway بعد تغيير النوايا
حُظرت رسائل النقابة بشكل غير متوقع
حُظرت رسائل النقابة بشكل غير متوقع
- تحقق من
groupPolicy - تحقق من قائمة السماح للنقابة ضمن
channels.discord.guilds - إذا كانت خريطة
channelsللنقابة موجودة، فلا يُسمح إلا بالقنوات المدرجة - تحقق من سلوك
requireMentionوأنماط الإشارة
Require mention false لكنه لا يزال محظورًا
Require mention false لكنه لا يزال محظورًا
groupPolicy="allowlist"دون قائمة سماح مطابقة للنقابة/القناة- تهيئة
requireMentionفي الموضع الخطأ (يجب أن تكون ضمنchannels.discord.guildsأو إدخال القناة) - المرسل محظور بواسطة قائمة سماح
usersالخاصة بالنقابة/القناة
لفات Discord طويلة التشغيل أو ردود مكررة
لفات Discord طويلة التشغيل أو ردود مكررة
Slow listener detected ...stuck session: sessionKey=agent:...:discord:... state=processing ...
- حساب واحد:
channels.discord.eventQueue.listenerTimeout - حسابات متعددة:
channels.discord.accounts.<accountId>.eventQueue.listenerTimeout - يتحكم هذا فقط في عمل مستمع Discord Gateway، وليس عمر لفة الوكيل
تحذيرات مهلة البحث عن بيانات Gateway الوصفية
تحذيرات مهلة البحث عن بيانات Gateway الوصفية
/gateway/bot الوصفية قبل الاتصال. تعود حالات الفشل العابرة إلى عنوان URL الافتراضي لـ Gateway في Discord وتخضع لتحديد معدل في السجلات.مفاتيح ضبط مهلة البيانات الوصفية:- حساب واحد:
channels.discord.gatewayInfoTimeoutMs - حسابات متعددة:
channels.discord.accounts.<accountId>.gatewayInfoTimeoutMs - بديل البيئة عندما لا تكون التهيئة مضبوطة:
OPENCLAW_DISCORD_GATEWAY_INFO_TIMEOUT_MS - الافتراضي:
30000(30 ثانية)، الحد الأقصى:120000
إعادات تشغيل بسبب مهلة Gateway READY
إعادات تشغيل بسبب مهلة Gateway READY
READY من Discord gateway أثناء بدء التشغيل وبعد عمليات إعادة الاتصال في وقت التشغيل. قد تحتاج إعدادات الحسابات المتعددة مع تدرج بدء التشغيل إلى نافذة READY أطول عند بدء التشغيل من الافتراضية.مفاتيح ضبط مهلة READY:- بدء تشغيل حساب واحد:
channels.discord.gatewayReadyTimeoutMs - بدء تشغيل حسابات متعددة:
channels.discord.accounts.<accountId>.gatewayReadyTimeoutMs - بديل بيئة بدء التشغيل عندما لا تكون التهيئة مضبوطة:
OPENCLAW_DISCORD_READY_TIMEOUT_MS - افتراضي بدء التشغيل:
15000(15 ثانية)، الحد الأقصى:120000 - وقت تشغيل حساب واحد:
channels.discord.gatewayRuntimeReadyTimeoutMs - وقت تشغيل حسابات متعددة:
channels.discord.accounts.<accountId>.gatewayRuntimeReadyTimeoutMs - بديل بيئة وقت التشغيل عندما لا تكون التهيئة مضبوطة:
OPENCLAW_DISCORD_RUNTIME_READY_TIMEOUT_MS - افتراضي وقت التشغيل:
30000(30 ثانية)، الحد الأقصى:120000
عدم تطابقات تدقيق الأذونات
عدم تطابقات تدقيق الأذونات
channels status --probe فقط مع معرفات القنوات الرقمية.إذا كنت تستخدم مفاتيح slug، فقد تستمر المطابقة في وقت التشغيل بالعمل، لكن لا يستطيع الفحص التحقق من الأذونات بالكامل.مشكلات الرسائل الخاصة والاقتران
مشكلات الرسائل الخاصة والاقتران
- الرسائل الخاصة معطلة:
channels.discord.dm.enabled=false - سياسة الرسائل الخاصة معطلة:
channels.discord.dmPolicy="disabled"(قديم:channels.discord.dm.policy) - انتظار موافقة الاقتران في وضع
pairing
حلقات بوت إلى بوت
حلقات بوت إلى بوت
channels.discord.allowBots=true، فاستخدم قواعد صارمة للإشارة وقائمة السماح لتجنب سلوك الحلقات.
يفضّل استخدام channels.discord.allowBots="mentions" لقبول رسائل البوتات فقط عندما تشير إلى البوت.Voice STT drops with DecryptionFailed(...)
Voice STT drops with DecryptionFailed(...)
- أبقِ OpenClaw محدثًا (
openclaw update) حتى يكون منطق استرداد استقبال صوت Discord موجودًا - تأكد من
channels.discord.voice.daveEncryption=true(الافتراضي) - ابدأ من
channels.discord.voice.decryptionFailureTolerance=24(افتراضي المصدر الأعلى) واضبطه فقط عند الحاجة - راقب السجلات بحثًا عن:
discord voice: DAVE decrypt failures detecteddiscord voice: repeated decrypt failures; attempting rejoin
- إذا استمرت الإخفاقات بعد إعادة الانضمام التلقائية، فاجمع السجلات وقارنها بسجل استقبال DAVE في المصدر الأعلى في discord.js #11419 وdiscord.js #11449
مرجع التكوين
المرجع الأساسي: مرجع التكوين - Discord.High-signal Discord fields
High-signal Discord fields
- بدء التشغيل/المصادقة:
enabled,token,accounts.*,allowBots - السياسة:
groupPolicy,dm.*,guilds.*,guilds.*.channels.* - الأمر:
commands.native,commands.useAccessGroups,configWrites,slashCommand.* - طابور الأحداث:
eventQueue.listenerTimeout(ميزانية المستمع),eventQueue.maxQueueSize,eventQueue.maxConcurrency - Gateway:
gatewayInfoTimeoutMs,gatewayReadyTimeoutMs,gatewayRuntimeReadyTimeoutMs - الرد/السجل:
replyToMode,historyLimit,dmHistoryLimit,dms.*.historyLimit - التسليم:
textChunkLimit,chunkMode,maxLinesPerMessage - البث:
streaming(اسم مستعار قديم:streamMode),streaming.preview.toolProgress,draftChunk,blockStreaming,blockStreamingCoalesce - الوسائط/إعادة المحاولة:
mediaMaxMb(يحد من تحميلات Discord الصادرة، الافتراضي100MB),retry - الإجراءات:
actions.* - الحضور:
activity,status,activityType,activityUrl - UI:
ui.components.accentColor - الميزات:
threadBindings, المستوى الأعلىbindings[](type: "acp"),pluralkit,execApprovals,intents,agentComponents,heartbeat,responsePrefix
السلامة والعمليات
- تعامل مع رموز البوتات كأسرار (يفضل
DISCORD_BOT_TOKENفي البيئات الخاضعة للإشراف). - امنح أذونات Discord بأقل امتيازات ممكنة.
- إذا كانت حالة نشر الأوامر/الحالة قديمة، فأعد تشغيل Gateway ثم أعد الفحص باستخدام
openclaw channels status --probe.