Telegram bot written with aiogram for managing an @exteraPluginsSup catalog, submissions, admin moderation, and group join settings (Joinly).
Live bot: @exteraPluginsRobot
- Plugins & iconpacks catalog inside the bot.
- Inline mode search: type
@exteraPluginsRobot <query>. - Plugin/icon preview pages with links.
- Upload and parse
.plugin/.iconsfiles. - Submit suggestions/updates for catalog items.
- Admin moderation flow (queues, review, publish/reject).
- Broadcast toggle for users (opt-in/out).
- Paid broadcast disable (Telegram Stars): user can pay to disable broadcast (for a joke, you can disable it for free).
Joinly is managed via /settings in a group (admins only).
- Welcome message with:
- MarkdownV2
- Placeholders:
{first},{last},{fullname},{username},{mention},{id},{chatname} - Inline buttons:
[Text](buttonurl://https://example.com)and:sameto keep buttons in the same row - Flags:
{preview},{nonotif},{protect}
- Welcome on/off toggle (independent from kick/ban).
- Kick on join (optional).
- Ban on join (optional; if disabled, uses kick-only flow).
- Service message cleanup (delete join/leave service messages).
- Join reaction: bot can react to the join service message when cleanup is disabled.
- Install dependencies
- Configure
config.json - Run:
python3 main.py- Configure
config.jsonin project root. - Start bot:
docker compose up -d --build
- View logs:
docker compose logs -f bot
- Stop:
docker compose down
Storage backend is SQLite (storage.sqlite3).
Configure path in config.json:
"storage": {
"data_dir": "data/data",
"sqlite_path": "data/data/storage.sqlite3"
}You can also override at runtime with env vars:
DATA_DIRSQLITE_PATH
Before running authorization, set in config.json:
userbot.api_iduserbot.api_hash
Run interactive authorization flow to create sessions/userbot_session.session:
docker compose --profile tools run --rm auth
In the prompt:
- enter phone number in international format (
+...) - enter code from Telegram
- if enabled, enter your 2FA password
After successful login, restart bot:
docker compose restart bot
If you need to log in with another account, remove previous session and run auth again:
sudo rm -f sessions/userbot_session.session*
