Add public mode with channel membership requirements
Completes TODO #2. PUBLIC_MODE swaps the ALLOWED_USERS allowlist for a membership check against REQUIRED_CHATS, with REQUIRE_MODE choosing between needing every chat or just one. - Stop is_admin() falling back to "everyone is an admin" when ADMIN_USERS is unset once PUBLIC_MODE is on. That fallback is the original single-owner convenience, but under public mode it handed moderation, /edit and /delete to anyone who found the bot. Public mode now grants admin to nobody until ADMIN_USERS is set, and says so at startup. Private deployments are unaffected. - Cache membership answers: inline search queries on every keystroke, so an uncached check meant several API calls per typed character. Grants last five minutes, refusals thirty seconds, so a user who has just joined is not locked out for the full window. - Fail closed when the membership check errors, and validate REQUIRED_CHATS at startup so a chat the bot cannot read is reported rather than silently refusing every user. - Refused users get a join prompt with real links instead of silence; inline shows a tappable bar that opens the bot and explains why. A private bot stays silent as before. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -63,6 +63,25 @@ docker compose up -d --build
|
||||
| `/delete <id>` | حذف یک مورد (ID را از `/list` بگیرید) |
|
||||
| `/cancel` | لغو عملیات جاری |
|
||||
|
||||
### عمومیکردن ربات
|
||||
|
||||
با تنظیم `PUBLIC_MODE=true` ربات بهجای فهرست `ALLOWED_USERS`، به هر کسی که شرط عضویت را داشته باشد اجازه دسترسی میدهد:
|
||||
|
||||
```env
|
||||
PUBLIC_MODE=true
|
||||
ADMIN_USERS=123456789
|
||||
REQUIRED_CHATS=@mychannel,@mygroup
|
||||
REQUIRE_MODE=all
|
||||
```
|
||||
|
||||
در `REQUIRED_CHATS` میتوانید `@username` یا شناسه عددی بنویسید. **ربات باید در هر کدام ادمین باشد**، وگرنه نمیتواند عضویت را بررسی کند و همه رد میشوند. ربات هنگام راهاندازی این را بررسی میکند و نام هر چتی را که نمیتواند بخواند در لاگ مینویسد. مقدار `all` یعنی عضویت در همه چتها لازم است و `any` یعنی یکی کافی است. اگر `REQUIRED_CHATS` خالی باشد ربات برای همه باز است.
|
||||
|
||||
کاربری که شرط را ندارد پیامی میبیند که فهرست چتهای لازم را نشان میدهد. در جستجوی inline هم بهجای نتیجه خالی و بدون توضیح، یک نوار قابل لمس میبیند که ربات را باز میکند و همین توضیح را میدهد.
|
||||
|
||||
> **قبل از روشنکردن این گزینه حتماً `ADMIN_USERS` را تنظیم کنید.** وقتی `ADMIN_USERS` خالی باشد، ربات خصوصی کاربرانش را ادمین حساب میکند؛ این برای ربات تکنفره راحت است اما در حالت عمومی یعنی همه ادمین میشوند. به همین دلیل در حالت عمومی تا وقتی `ADMIN_USERS` تنظیم نشده باشد هیچکس ادمین نیست و ربات هنگام راهاندازی خطا ثبت میکند.
|
||||
|
||||
پاسخ بررسی عضویت پنج دقیقه کش میشود، چون جستجوی inline در غیر این صورت با هر بار فشردن کلید از تلگرام سؤال میکرد. رد شدن فقط سی ثانیه کش میشود تا کاربری که تازه عضو شده تقریباً بلافاصله دسترسی پیدا کند.
|
||||
|
||||
### پذیرش ارسال کاربران
|
||||
|
||||
اگر در فایل `.env` مقدار `ACCEPT_SUBMISSIONS=true` را تنظیم کنید، کاربران غیرادمین هم میتوانند رسانه بفرستند. این موارد ذخیره میشوند اما تا وقتی یک ناظر تأییدشان نکند در جستجوی inline و `/list` دیده نمیشوند. رسانهای که خود ادمینها میفرستند مثل قبل مستقیم ذخیره میشود.
|
||||
|
||||
Reference in New Issue
Block a user