پیکربندی

پیکربندی چطور کار می‌کند؟

نقش config.py، متغیرهای محیطی و تنظیمات ذخیره‌شده در MongoDB، ترتیب اولویت آن‌ها، تغییراتی که ری‌استارت می‌خواهند و فایل‌های خصوصی.

WZML-X تنظیماتش را از سه جا می‌گیرد: فایل config.py، متغیرهای محیطی، و تنظیماتی که در MongoDB ذخیره شده‌اند (همان‌هایی که با /bsetting از داخل تلگرام تغییر می‌دهید). این صفحه توضیح می‌دهد هر کدام چه نقشی دارد و وقتی یک مقدار در چند جا تعریف شده، کدام برنده می‌شود.

شرح تک‌تک متغیرهای پیکربندی در مرجع متغیرها و منوهای /bsetting در تنظیمات ربات آمده است.

فایل config.py

config.py را از روی نمونهٔ config_sample.py می‌سازید:

cp config_sample.py config.py

این یک فایل پایتون است، پس قواعد پایتون را رعایت کنید: رشته‌ها داخل کوتیشن، عددها بدون کوتیشن، مقادیر بولی به شکل True و False، و فهرست و دیکشنری با [] و {}:

BOT_TOKEN = "1234567890:AA..."
OWNER_ID = 123456789
STATUS_LIMIT = 10
AS_DOCUMENT = False
SEARCH_PLUGINS = ["https://..."]
LEECH_DUMP_CHATS = {"A": -1001234567890}

متغیرهای ضروری

متغیرتوضیح
BOT_TOKENتوکن ربات از @BotFather
OWNER_IDشناسهٔ عددی تلگرام مالک ربات
TELEGRAM_APIشناسهٔ API از my.telegram.org
TELEGRAM_HASHهش API از my.telegram.org
DATABASE_URLآدرس اتصال MongoDB

کد ربات چهار متغیر اول را بررسی می‌کند و اگر یکی خالی باشد، با خطای BOT_TOKEN variable is missing! (یا نام متغیر مربوط) متوقف می‌شود. DATABASE_URL را README.md ضروری می‌داند؛ ربات بدون آن هم بالا می‌آید، اما هیچ تغییری از /bsetting ذخیره نمی‌شود (در لاگ: update_config skipped: DB not connected) و قابلیت‌هایی مثل /broadcast، اطلاع از کارهای ناتمام بعد از ری‌استارت و ذخیرهٔ فایل‌های خصوصی کار نمی‌کنند.

تبدیل‌های خودکار

هنگام بارگذاری، ربات چند مقدار را خودش اصلاح می‌کند:

  • DEFAULT_UPLOAD: هر مقداری جز gd به rc تبدیل می‌شود.
  • BASE_URL، RCLONE_SERVE_URL، INDEX_URL و SEARCH_API_LINK: / در ابتدا و انتهای آن‌ها حذف می‌شود.
  • USENET_SERVERS: اگر اولین سرور host نداشته باشد، کل فهرست نادیده گرفته می‌شود.
  • LEECH_DUMP_CHAT منسوخ شده است؛ اگر هنوز آن را دارید، ربات هشدار می‌دهد و مقدارش را به LEECH_LOG_CHAT منتقل می‌کند (اگر LEECH_LOG_CHAT خالی باشد).

متغیرهای محیطی

هر متغیری که در مرجع متغیرها هست، با همان نام به‌عنوان متغیر محیطی هم پذیرفته می‌شود و بعد از خواندن config.py، روی آن اعمال می‌شود. چون متغیر محیطی همیشه متن است، ربات آن را بر اساس نوع مقدار پیش‌فرض تبدیل می‌کند:

نوع پیش‌فرضچطور خوانده می‌شود
بولیtrue، 1 یا yes (بدون توجه به حروف بزرگ و کوچک) یعنی روشن؛ هر چیز دیگری یعنی خاموش.
عدد صحیحبا int() تبدیل می‌شود؛ اگر نشد، پیش‌فرض می‌ماند.
فهرستیک فهرست پایتون مثل ["a", "b"]، یا مقادیر جداشده با ویرگول مثل a,b.
دیکشنرییک دیکشنری پایتون مثل {"A": -100123}؛ اگر قابل خواندن نباشد، پیش‌فرض می‌ماند.

update.py (که قبل از ربات اجرا می‌شود) فقط این هشت متغیر را از محیط می‌خواند: BOT_TOKEN، TELEGRAM_API، TELEGRAM_HASH، OWNER_ID، DATABASE_URL، BASE_URL، UPSTREAM_REPO و UPSTREAM_BRANCH. همین هشت متغیر در ادغام با پایگاه داده (بخش بعد) هم مثل مقادیر config.py حساب می‌شوند.

تنظیمات ذخیره‌شده در MongoDB

وقتی DATABASE_URL تنظیم شده باشد، ربات این‌ها را در پایگاه دادهٔ wzmlx نگه می‌دارد، جدا برای هر ربات (بر اساس شناسهٔ ربات):

  • همهٔ متغیرهای پیکربندی (هر بار که ربات شروع می‌شود و هر بار که از /bsetting چیزی را تغییر می‌دهید)
  • نسخه‌ای از config.py آخرین شروع، تا ربات بفهمد شما چه چیزی را در آن تغییر داده‌اید
  • فایل‌های خصوصی
  • تنظیمات Aria2، qBittorrent و SABnzbd
  • تنظیمات کاربران، RSS، کارهای ناتمام، لینک‌های پخش و وضعیت پلاگین‌ها

تغییری که از /bsetting ← Config Variables بدهید، همان لحظه در پایگاه داده ذخیره می‌شود و بیشتر آن‌ها بدون ری‌استارت اعمال می‌شوند.

کدام مقدار برنده می‌شود؟

هنگام شروع، ربات مقادیر را به این ترتیب روی هم می‌گذارد؛ هر لایه، لایه‌های قبلی را بازنویسی می‌کند:

  1. پیش‌فرض‌های کد (کلاس Config در bot/core/config_manager.py)
  2. config.py
  3. متغیرهای محیطی
  4. تنظیمات ذخیره‌شده در MongoDB، با یک استثنا: هر کلیدی که مقدارش در config.py (یا آن هشت متغیر محیطی) نسبت به شروع قبلی تغییر کرده باشد، مقدار جدید config.py برنده می‌شود و در پایگاه داده هم ذخیره می‌شود.

در اولین استقرار، که هنوز چیزی در پایگاه داده نیست، مقادیر config.py جاهای خالی را پر می‌کنند.

در عمل یعنی:

  • اگر مقداری را از /bsetting تغییر دهید، بعد از ری‌استارت هم همان می‌ماند، حتی اگر در config.py چیز دیگری نوشته شده باشد.
  • اگر بعداً همان کلید را در config.py عوض کنید، در شروع بعدی مقدار config.py جایگزین می‌شود.
  • متغیرهای محیطی غیر از آن هشت مورد ممکن است بعد از اولین اجرا با مقدار ذخیره‌شده در پایگاه داده بازنویسی شوند. برای تغییر ماندگار، از config.py یا /bsetting استفاده کنید.
  • دکمهٔ Reset در /bsetting مقدار را به پیش‌فرض کد برمی‌گرداند، نه به مقدار config.py. این دکمه برای متغیرهای حساس (BOT_TOKEN، OWNER_ID، TELEGRAM_API، TELEGRAM_HASH و DATABASE_URL) نمایش داده نمی‌شود.
  • اگر BOT_TOKEN را به توکن یک ربات دیگر عوض کنید، چون داده‌ها بر اساس شناسهٔ ربات جدا می‌شوند، تنظیمات ذخیره‌شدهٔ ربات قبلی بارگذاری نمی‌شود.

کدام تغییرها ری‌استارت لازم دارند؟

وقتی یکی از این متغیرها را از /bsetting ویرایش می‌کنید، ربات یادداشت Restart required for this edit to take effect! را نشان می‌دهد:

متغیرچرا
BOT_TOKEN، TELEGRAM_API، TELEGRAM_HASHاتصال ربات به تلگرام فقط هنگام شروع ساخته می‌شود.
OWNER_IDمالک ربات
DATABASE_URLاتصال پایگاه داده
USER_SESSION_STRINGحساب کاربری تلگرام فقط هنگام شروع وصل می‌شود.
STREAM_TOKENSربات‌های پخش فقط هنگام شروع وصل می‌شوند.
TG_PROXYپروکسی اتصال به تلگرام
AUTHORIZED_CHATSچت‌ها و کاربرهای مجاز
CMD_SUFFIXپسوند نام دستورها

چند مورد دیگر که پیام‌های خود ربات به آن اشاره می‌کنند:

  • HELPER_TOKENS: ربات‌های کمکی فقط هنگام شروع وصل می‌شوند؛ پیام دستور /stream هم می‌گوید بعد از افزودن STREAM_TOKENS یا HELPER_TOKENS ری‌استارت کنید.
  • روشن کردن دوبارهٔ SABnzbd: خاموش کردن NZB در Module Settings همان لحظه SABnzbd را متوقف می‌کند، اما روشن کردن دوباره‌اش ری‌استارت می‌خواهد (در لاگ: SABnzbd requires restart to re-enable).
  • .netrc: طبق متن بخش Private Files، تغییر .netrc تا ری‌استارت روی Aria2 اثر نمی‌کند.

برخی تغییرها همان لحظه اعمال می‌شوند، مثلاً: QUEUE_ALL، QUEUE_DOWNLOAD و QUEUE_UPLOAD (صف فوراً بررسی می‌شود)، RSS_DELAY، SEARCH_PLUGINS و SEARCH_API_LINK، متغیرهای RCLONE_SERVE_* (سرویس rclone serve دوباره اجرا می‌شود)، JD_EMAIL و JD_PASS (JDownloader دوباره بوت می‌شود)، STATUS_UPDATE_INTERVAL و TORRENT_TIMEOUT. روشن و خاموش کردن JDownloader، پخش، RSS و پلاگین‌ها در Module Settings هم بدون ری‌استارت انجام می‌شود.

فایل‌های خصوصی

بعضی تنظیمات فایل هستند، نه متغیر. این فایل‌ها کنار config.py (در پوشهٔ اصلی ربات) قرار می‌گیرند و می‌توانید از /bsetting ← Private Files آن‌ها را مدیریت کنید:

فایلکاربرد
config.pyپیکربندی اصلی. بارگذاری آن از این منو، پیکربندی را دوباره می‌خواند.
token.pickleتوکن OAuth گوگل درایو برای حساب مالک.
rclone.confپیکربندی Rclone با ریموت‌های شما. با بارگذاری آن، rclone serve هم دوباره اجرا می‌شود.
accounts.zipفایل‌های JSON سرویس‌اکانت‌ها در پوشهٔ accounts/ داخل zip. پس از بارگذاری استخراج می‌شود و USE_SERVICE_ACCOUNTS خودکار روشن می‌شود؛ با حذف آن خاموش می‌شود.
list_drives.txtفهرست درایوها برای جست‌وجو با /list؛ هر خط: NAME DRIVE_ID INDEX_URL (لینک ایندکس اختیاری است).
categories.txtدسته‌های مقصد آپلود گوگل درایو؛ هر خط: نام، شناسهٔ درایو و در صورت تمایل لینک ایندکس.
shortener.txtسرویس‌های کوتاه‌کنندهٔ لینک؛ هر خط دو بخش دارد: دامنهٔ سرویس و کلید API.
cookies.txtکوکی‌های پیش‌فرض yt-dlp (کاربرها می‌توانند کوکی خودشان را در /usetting بگذارند).
terabox.txtکوکی‌های TeraBox در قالب Netscape.
.netrcنام کاربری و رمز سایت‌ها برای Aria2 و yt-dlp.

نحوهٔ کار با این منو:

  • Add/Delete File: فایل را بفرستید تا ذخیره شود؛ نام فایل را به‌صورت متن بفرستید (مثلاً rclone.conf) تا حذف شود. config.py با این روش حذف نمی‌شود.
  • Create New File: یک پیام متنی بفرستید که خط اول آن نام فایل و بقیه‌اش محتوای فایل باشد.

فایل‌هایی که این‌جا بارگذاری می‌کنید در MongoDB هم ذخیره می‌شوند و در هر شروع دوباره روی دیسک نوشته می‌شوند؛ پس با ساختن دوبارهٔ کانتینر از بین نمی‌روند. اگر UPSTREAM_REPO شامل @github.com باشد (مخزن خصوصی با توکن)، ربات بعد از بارگذاری می‌پرسد Push to UPSTREAM_REPO ?.

ساختن token.pickle، سرویس‌اکانت‌ها و list_drives.txt در اسکریپت‌های کمکی توضیح داده شده است.

مثلاً LEECH_SPLIT_SIZE، /mirror، -up یا «تامبنیل»