Skip to content
AliGhanizadePublic

About

Music archive bot for the Bale messenger, written in pure Go with zero dependencies. Built during the 2026 internet blackouts; peaked at ~1200 monthly users.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Latest commit

 

History

8 Commits

Folders and files

Repository files navigation

ArchivBot

یک ربات آرشیو موسیقی برای پیام‌رسان بله، نوشته‌شده با زبان Go و بدون هیچ وابستگی خارجی. کاربران آهنگ‌ها را برای ربات فوروارد می‌کنند؛ ربات آن‌ها را در یک کانال آرشیو ذخیره و ایندکس می‌کند و هر کسی می‌تواند با جستجوی متنی، آهنگ مورد نظرش را پیدا و دریافت کند.

داستان پروژه

این پروژه در دوره‌ی قطعی‌های گسترده اینترنت (از اواسط بهمن ۱۴۰۴ تا اواخر اسفند ۱۴۰۴) و به‌عنوان راهکاری کوچک برای یک مشکل واقعی ساخته شد: وقتی سرویس‌های پخش آنلاین در دسترس نیستند، پیدا کردن و به‌اشتراک‌گذاشتن موسیقی سخت می‌شود. ایده ساده بود — یک آرشیو مشارکتی که خود کاربران با فوروارد کردن آهنگ‌هایشان پرش می‌کنند و جستجو در آن برای همه آزاد است.

توسعه‌ی پروژه به‌کمک ابزارهای هوش مصنوعی و مطالعه و یادگیری شخصی انجام شد و در همان مدت کوتاه مخاطب جذب کرد؛ پیک مصرف آن به حدود ۱۲۰۰ کاربر فعال ماهانه رسید.

نکته‌ای درباره تاریخ‌چه گیت

توسعه‌ی کد از اواسط بهمن ۱۴۰۴ آغاز شد، اما پروژه عملاً از ۲۸ اسفند ۱۴۰۴ (مارس ۲۰۲۶) وارد گیت شد و سابقه‌ی قبل از آن تاریخ در این مخزن ثبت نشده است. کامیت‌های اولیه‌ی مخزن، بازسازیِ تاریخ‌چه بر اساس تاریخ فایل‌هاست و به دقتِ زمانیِ روزهای اول نباید اتکا کرد. علاوه بر این، بخش‌هایی از تاریخ‌چه در جابه‌جایی بین سیستم‌ها دچار دست‌کاری تاریخ فایل‌ها شده و ساختار کامیت‌ها بازسازی‌شده است، نه ثبت لحظه‌ای.

امکانات

  • آرشیو با فوروارد (Bulk): هر فایل صوتی که در حالت عادی برای ربات فوروارد شود، به‌صورت خودکار استخراج متادیتا می‌شود، از تکراری بودن بررسی می‌شود و در کانال آرشیو منتشر و ایندکس می‌گردد.
  • جستجو با کیبورد شیشه‌ای: دستور /find عبارت را می‌گیرد و نتایج را با کیبورد این‌لاین و صفحه‌بندی (دکمه‌های قبلی/بعدی) نمایش می‌دهد.
  • جستجوی متنی ساده: دستور /aza نتایج را مستقیم و به‌صورت رگباری فوروارد می‌کند (با محدودیت نرخ ارسال برای جلوگیری از بن شدن).
  • لیست هنرمندان: /artists فهرست هنرمندان را به‌ترتیب الفبا و با صفحه‌بندی نشان می‌دهد.
  • استانداردسازی نام هنرمند: یک دیتابیس نام‌مستعار، املاهای مختلف (فارسی/عربی/انگلیسی، فاصله، خط تیره و ...) را به یک نام استاندارد نگاشت می‌کند تا نتایج جستجو از دست نروند.
  • شنونده‌ی ساکت گروه‌ها: ربات در گروه‌ها هیچ پیامی نمی‌فرستد و به‌صورت بی‌صدا هر فایل mp3 ارسال‌شده را آرشیو می‌کند؛ آمار گروه‌ها و اعضا نیز ثبت می‌شود.
  • ثبت دستی: /send یک فلوی چندمرحله‌ای (فایل، نام خواننده، نام آهنگ) برای ثبت دقیق آهنگ است.
  • پنل مدیریت: بیش از بیست دستور ادمین برای آمارگیری، پاک‌سازی، ارسال گروهی، بررسی لاگ‌ها و مدیریت دیتابیس.
  • لاگ چرخشی: لاگر داخلی رویدادها را به تفکیک سیستم/کاربر/گروه در فایل‌های چرخشی (به‌صورت خودکار برش خورده) می‌نویسد.

معماری در یک نگاه

ربات هیچ وابستگی خارجی ندارد و فقط از کتابخانه استاندارد Go استفاده می‌کند:

  • Long Polling روی getUpdates بله؛ هر update در یک goroutine پردازش می‌شود.
  • دیتابیس فایل‌محور JSON با ایندکس درون‌حافظه‌ای و قفل خواندن/نوشتن (sync.RWMutex): موزیک‌ها، کاربران، گروه‌ها، اعضای گروه و هنرمندان.
  • مدیریت وضعیت (Session) برای فلوی چندمرحله‌ای ثبت دستی، به‌ازای هر chat.
  • استخراج متادیتا از نام فایل/تگ‌های صوتی و نرمال‌سازی کلید جستجو (یکسان‌سازی «ي/ی»، «ك/ک» و حذف علائم).

جزئیات کامل معماری در docs/ARCHITECTURE.md آمده است.

راه‌اندازی

پیش‌نیاز: Go 1.25 یا جدیدتر.

git clone https://github.com/AliGhanizade/ArchivBot.git
cd ArchivBot
go build -o archivbot .

سپس فایل config.example.json را با نام config.json کپی کنید و مقادیر خود را جایگزین کنید:

{
  "bot_token": "توکن ربات شما از @BotFather بله",
  "channel_id": 123456789,
  "admin_ids": [123456789],
  "db":   { "musics": "./data/musics.json", "users": "./data/users.json", "artists": "./data/artists.json", "groups": "./data/group.json", "group_users": "./data/groupUser.json" },
  "logs": { "system": "./logs/system/s_log", "user": "./logs/user/u_log", "group": "./logs/group/g_log" }
}

نکات مهم:

  • مسیر فایل کانفیگ را می‌توانید با متغیر محیطی ARCHIVBOT_CONFIG تغییر دهید.
  • توکن را می‌توانید به‌جای فایل، از متغیر محیطی ARCHIVBOT_BOT_TOKEN بدهید؛ این مقدار بر فایل کانفیگ اولویت دارد.
  • توکن را هرگز در سورس یا در مخزن کامیت نکنید. فایل config.json در .gitignore قرار دارد.
  • پوشه‌های data/ و logs/ در اولین اجرا به‌صورت خودکار ساخته می‌شوند و محتوای آن‌ها (شامل اطلاعات خصوصی کاربران) هرگز نباید منتشر شود.

اجرای ربات مهاجرت‌کننده‌ی داده‌ها (برای بازسازی کلیدهای جستجو) به‌صورت دستی و کامنت‌شده در main.go موجود است.

دستورات

دستورات کاربران

دستور توضیح
/start پیام خوش‌آمدگویی و معرفی
/help راهنمای کامل استفاده
/find جستجو با کیبورد این‌لاین و صفحه‌بندی
/aza جستجوی متنی ساده با ارسال مستقیم نتایج
/artists فهرست هنرمندان به‌ترتیب الفبا
/send ثبت دستی آهنگ (فایل، خواننده، عنوان)
/cancel لغو عملیات جاری و بازگشت به منو

فوروارد هر فایل صوتی در چت خصوصی نیز بدون هیچ دستوری، آن را آرشیو می‌کند.

دستورات ادمین (گزیده)

/ping، /stats، /statsys (آمار کلی و سیستم)، /cleanup و /clearcache (نگهداری)، /toall (ارسال گروهی)، /users، /topusers، /userinfo (آمار کاربران)، /groups، /topgroups، /groupinfo، /groupusers (آمار گروه‌ها)، /log-sys، /log-user، /log-group (دریافت فایل لاگ)، /getid (شناسه‌ی چت).

ساختار پروژه

ArchivBot/
├── main.go              # نقطه ورود: لاگر، کلاینت، دیتابیس‌ها، حلقه Long Polling
├── config/              # بارگذاری تنظیمات از config.json
├── api/                 # کلاینت HTTP برای API ربات بله + مدل‌ها
├── router/              # مسیریابی updateها به هندلر مناسب
├── bot/                 # هندلرها: جستجو، آرشیو، گروه‌ها، ادمین، کیبوردها، sessionها
├── database/            # دیتابیس‌های فایل‌محور JSON + مهاجرت داده
├── pkg/log/             # لاگر چرخشی رنگی
├── pkg/utils/           # استخراج متادیتا و ابزارهای کمکی
├── docs/                # مستندات معماری
├── config.example.json  # نمونه فایل کانفیگ
└── LICENSE              # لایسنس MIT

نسخه‌ها

نسخه تاریخ خلاصه
v1.0.0 فروردین ۱۴۰۵ اولین نسخه کارکردی: آرشیو با فوروارد، جستجوی /find، ذخیره‌سازی JSON
v1.1.0 فروردین ۱۴۰۵ جستجوی کیبوردی با صفحه‌بندی، استانداردسازی هنرمندان، پنل ادمین
v1.2.0 فروردین ۱۴۰۵ بهبود پایداری، مدیریت خطاهای API و نرخ ارسال
v1.3.0 شهریور ۱۴۰۵ انتقال تنظیمات به config.json، بهداشت مخزن و مستندات

یادداشت حریم خصوصی

این مخزن عمداً شامل هیچ داده‌ی اجرایی نیست: فایل‌های data/ (لیست موزیک‌ها، کاربران، گروه‌ها) و logs/ حاوی اطلاعات خصوصی کاربران ربات هستند و در .gitignore قرار دارند. هر کسی که ربات را self-host می‌کند، مسئولیت داده‌های کاربران خودش را دارد.

لایسنس

این پروژه تحت لایسنس MIT منتشر شده است.

About

Music archive bot for the Bale messenger, written in pure Go with zero dependencies. Built during the 2026 internet blackouts; peaked at ~1200 monthly users.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages