Skip to content

Commit a5c0d85

Browse files
committed
feat: added more telegram commands, updated modules part
1 parent b7a3834 commit a5c0d85

10 files changed

Lines changed: 500 additions & 142 deletions

File tree

docs/cli/manage-account.md

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -18,26 +18,28 @@ docker compose exec userbot python3 -m scripts.manage_account <команда> [
1818

1919
- `<имя_аккаунта>`: Уникальное имя для нового аккаунта.
2020

21-
Скрипт запросит `API ID`, `API Hash`, язык и другие параметры.
22-
23-
### `toggle`
24-
25-
Включает или выключает аккаунт.
26-
27-
**Синтаксис:** `toggle <имя_аккаунта>`
28-
29-
- `<имя_аккаунта>`: Имя существующего аккаунта.
21+
Скрипт запросит `API ID`, `API Hash`, номер телефона и все остальные данные, необходимые для создания полноценной сессии и записи аккаунта в базу данных. Вы сможете настроить язык, устройство, прокси и статус активации.
3022

3123
### `delete`
3224

33-
Безвозвратно удаляет аккаунт и все его данные.
25+
Безвозвратно удаляет аккаунт и все его данные (включая сессию).
3426

3527
**Синтаксис:** `delete <имя_аккаунта>`
3628

3729
- `<имя_аккаунта>`: Имя аккаунта для удаления.
3830

3931
Скрипт запросит подтверждение перед удалением.
4032

33+
### `toggle`
34+
35+
Включает или выключает аккаунт.
36+
37+
**Синтаксис:** `toggle <имя_аккаунта>`
38+
39+
- `<имя_аккаунта>`: Имя существующего аккаунта.
40+
41+
Отключенные аккаунты не будут запускаться при старте бота.
42+
4143
### `edit`
4244

4345
Изменяет параметры существующего аккаунта.
@@ -48,12 +50,11 @@ docker compose exec userbot python3 -m scripts.manage_account <команда> [
4850

4951
**Опции:**
5052
- `--lang <код>`: Устанавливает новый код языка (например, `en`).
51-
- `--enable`: Включает аккаунт.
52-
- `--disable`: Отключает аккаунт.
53+
- `--enable` / `--disable`: Включает или отключает аккаунт (взаимоисключающие).
5354
- `--device-model "Новая модель"`: Устанавливает новую модель устройства.
54-
- `--proxy-type <http|socks5>`: Устанавливает тип прокси.
55+
- `--proxy-type <http|socks4|socks5>`: Устанавливает тип прокси.
5556
- `--proxy-ip <ip>`: IP-адрес прокси.
5657
- `--proxy-port <port>`: Порт прокси.
57-
- `--proxy-user <user>`: (Опционально) Имя пользователя прокси.
58-
- `--proxy-pass <pass>`: (Опционально) Пароль прокси.
58+
- `--proxy-user <user>`: (Опционально) Имя пользователя прокси. Используйте `''` для пустого значения.
59+
- `--proxy-pass <pass>`: (Опционально) Пароль прокси. Используйте `''` для пустого значения.
5960
- `--clear-proxy`: Удаляет все настройки прокси для аккаунта.

docs/for-developers/creating-modules.md

Lines changed: 56 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ def register(client):
5151
## Метаданные
5252

5353
- `__requires__` (опционально): Список строковых имен Python-пакетов, которые необходимы для работы модуля. DeBot автоматически попытается установить их через `pip` при добавлении модуля.
54-
- `__trusted__` (опционально): `True` или `False`. Если `True`, модуль считается потенциально опасным и требует явного одобрения от пользователя командой `.trustmod`. Только доверенные модули получают доступ к реальному объекту `TelegramClient`.
54+
- `__trusted__` (опционально): `True` или `False`. Если `True`, модуль считается потенциально опасным и требует явного одобрения от пользователя командой `.trustmod`. Только доверенные модули получают доступ к реальному объекту `TelegramClient` и его расширенным возможностям.
5555
- `__config__` (опционально): Словарь, описывающий настраиваемые параметры модуля. Для каждого ключа можно указать `default` (значение по умолчанию) и `description` (описание).
5656
- `info` (обязательно): Экземпляр класса `ModuleInfo`, который используется для генерации справки в команде `.help`.
5757

@@ -61,25 +61,64 @@ def register(client):
6161

6262
В зависимости от статуса доверия модуля, в `client` будет передан либо **реальный `TelegramClient`** (если модуль доверенный), либо **безопасная обертка `ModuleClient`** (если нет).
6363

64+
## Мультиаккаунтное взаимодействие
65+
66+
> ⚠️ **Требуется `__trusted__ = True`**
67+
>
68+
> Эта функция предоставляет доступ ко всем активным клиентам и является потенциально опасной. Используйте ее только в доверенных модулях.
69+
70+
Вы можете создавать модули, которые управляют всеми активными аккаунтами одновременно. Например, модуль для массового вступления в чат.
71+
72+
Для этого используйте метод `client.get_all_clients()`, который возвращает список всех активных экземпляров `TelegramClient`.
73+
74+
**Пример модуля `mass_joiner.py`:**
75+
76+
```python
77+
import asyncio
78+
from telethon import events
79+
from telethon.tl.functions.channels import JoinChannelRequest
80+
from userbot import TelegramClient
81+
from userbot.src.module_info import ModuleInfo
82+
83+
# Этот модуль должен быть доверенным, чтобы получить доступ к другим клиентам
84+
__trusted__ = True
85+
86+
info = ModuleInfo(
87+
name="Mass Joiner",
88+
category="tools",
89+
patterns=[".mjoin <chat>"],
90+
descriptions=["Зайти в указанный чат со всех активных аккаунтов."]
91+
)
92+
93+
async def mass_join_handler(event: events.NewMessage.Event):
94+
chat_to_join = event.pattern_match.group(1)
95+
if not chat_to_join:
96+
await event.edit("Укажите ссылку на чат.")
97+
return
98+
99+
await event.edit(f"Начинаю вход в `{chat_to_join}` со всех аккаунтов...")
100+
101+
all_clients: list[TelegramClient] = event.client.get_all_clients()
102+
tasks = []
103+
104+
for client_instance in all_clients:
105+
task = client_instance(JoinChannelRequest(chat_to_join))
106+
tasks.append(task)
107+
108+
try:
109+
await asyncio.gather(*tasks, return_exceptions=True)
110+
await event.edit(f"✅ Все аккаунты ({len(all_clients)}) попытались войти в `{chat_to_join}`.")
111+
except Exception as e:
112+
await event.edit(f"Произошла ошибка: {e}")
113+
114+
def register(client: TelegramClient):
115+
client.add_event_handler(mass_join_handler, events.NewMessage(outgoing=True, pattern=r"^\.mjoin\s+(.+)"))
116+
```
117+
64118
## Локализация
65119

66120
Ваши модули могут и должны поддерживать несколько языков.
67121

68122
1. Создайте папку `locales` внутри папки вашего модуля (например, `userbot/modules/my_module/locales/`).
69123
2. Внутри создайте JSON-файлы для каждого языка (например, `ru.json`, `en.json`).
70-
```json
71-
// ru.json
72-
{
73-
"response_message": "Ваш API ключ"
74-
}
75-
```
76-
3. В коде модуля получайте строки через `client`, который автоматически определит язык текущего аккаунта:
77-
```python
78-
text = await event.client.get_string("response_message", module_name="my_module")
79-
```
80-
81-
Бот будет искать перевод в следующей последовательности:
82-
1. Перевод модуля на языке аккаунта.
83-
2. Перевод модуля на русском/английском (fallback).
84-
3. Системный перевод на языке аккаунта.
85-
4. Системный перевод на русском/английском (fallback).
124+
3. В коде модуля получайте строки через `client.get_string("key", module_name="my_module")`.

docs/system-architecture/overview.md

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,33 +6,35 @@ DeBot построен на модульной и асинхронной арх
66
graph TD
77
subgraph "Docker Environment"
88
subgraph "Userbot Container (Python/Telethon)"
9-
Init["<b>userbot/__init__.py</b><br>Точка входа<br>Загружает аккаунты из БД<br>Запускает асинхронные задачи для каждого клиента"]
10-
Main["<b>userbot/__main__.py</b><br>Основной цикл событий<br>Обработчики команд<br>APScheduler для фоновых задач"]
9+
Init["<b>userbot/__init__.py</b><br>Точка входа<br>Загружает аккаунты и сессии из БД<br>Запускает асинхронные задачи для каждого клиента"]
10+
Main["<b>userbot/__main__.py</b><br>Основной цикл событий<br>APScheduler для фоновых задач"]
1111
DBManager["<b>DB Manager (SQLAlchemy)</b><br>Слой для работы с БД<br>Все CRUD-операции"]
1212
Locales["<b>TranslationManager</b><br>Кэширует и предоставляет переводы из .json файлов"]
1313
1414
subgraph "Для каждого аккаунта"
15-
Client[("TelegramClient Instance")]
16-
Session[("DbSession")]
15+
TempSession["Temp .session file"]
16+
Client[("TelegramClient Instance")] -- "использует" --> TempSession
1717
end
1818
end
1919
2020
DBContainer["<b>Database Container</b><br>(PostgreSQL)"]
2121
end
2222
23-
User((Telegram User)) -- ".addacc, .help, ..." --> Main
23+
User((Telegram User)) -- "Команды (.addacc, .help, ...)" --> Client
2424
Init -- "Читает аккаунты" --> DBManager
2525
Init -- "Создает" --> Client
26-
Client -- "Использует" --> Session
27-
Main -- "Выполняет операции" --> DBManager
28-
Main -- "Получает текст" --> Locales
29-
Session -- "Сохраняет/читает сессию" --> DBManager
26+
Init -- "Дешифрует сессию из БД и пишет в" --> TempSession
3027
DBManager -- "Подключается к" --> DBContainer
3128
```
3229

33-
- **`userbot/__init__.py` (Ядро)**: Это первая точка входа при запуске. Его задача — подключиться к базе данных, получить список всех **активных** аккаунтов (`is_enabled = True`) и создать для каждого из них отдельную асинхронную задачу по запуску клиента.
34-
- **`userbot/__main__.py` (Основной цикл)**: Этот файл содержит логику обработки команд, полученных от Telegram. Здесь же инициализируется и запускается `APScheduler`, который выполняет фоновые задачи (сборка мусора, автообновление).
30+
- **`userbot/__init__.py` (Ядро)**: Это первая точка входа при запуске. Его задача — подключиться к базе данных, получить список всех **активных** аккаунтов (`is_enabled = True`). Для каждого аккаунта он выполняет следующие шаги:
31+
1. Извлекает зашифрованный файл сессии из базы данных.
32+
2. Дешифрует его.
33+
3. Записывает содержимое во временный файл на диске.
34+
4. Создает экземпляр стандартного `telethon.sessions.SQLiteSession`, указывая на этот временный файл.
35+
5. Создает и запускает отдельную асинхронную задачу для `TelegramClient`, передавая ему эту сессию.
36+
- **`userbot/__main__.py` (Основной цикл)**: Этот файл содержит логику основного цикла событий и инициализирует `APScheduler` для выполнения фоновых задач (сборка мусора, автообновление).
3537
- **DB Manager (SQLAlchemy)**: Слой абстракции для работы с базой данных. Все функции для добавления, получения, обновления и удаления данных (аккаунтов, сессий, модулей) реализованы здесь с использованием SQLAlchemy ORM.
3638
- **TranslationManager**: Глобальный сервис, который отвечает за загрузку, кэширование и предоставление переведенных строк. Он обеспечивает мультиязычность во всем приложении.
37-
- **TelegramClient Instance**: Для каждого активного аккаунта создается свой собственный экземпляр кастомного класса `TelegramClient`, который наследуется от `telethon.TelegramClient`. Он содержит дополнительную логику, например, для работы с переводами.
38-
- **DbSession**: Кастомный класс сессии Telethon, который хранит данные сессии не в файле, а в базе данных PostgreSQL.
39+
- **TelegramClient Instance**: Для каждого активного аккаунта создается свой собственный экземпляр кастомного класса `TelegramClient`, который наследуется от `telethon.TelegramClient`.
40+
- **Хранение сессии**: В отличие от стандартного подхода, DeBot не хранит `.session` файлы на диске постоянно. Весь SQLite файл сессии хранится в базе данных PostgreSQL в зашифрованном виде (в поле типа `BYTEA`). Это обеспечивает безопасность и централизованное хранение.

docs/user-guide/module-management.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,10 @@ DeBot обладает мощной модульной системой. Упр
3333

3434
- **`<модуль>`**: Имя модуля.
3535
- **`<ключ>`**: Ключ параметра, который нужно изменить.
36-
- **`<значение>`**: Новое значение. Если значение содержит пробелы, его следует взять в кавычки (на данный момент не поддерживается, передавайте как одно слово или JSON).
36+
- **`<значение>`**: Новое значение.
37+
38+
### `.updatemodules`
39+
40+
(В разработке) Команда для автоматического обновления модулей.
3741

3842
> **Важно:** После добавления или удаления модулей может потребоваться перезапуск бота (`docker-compose restart userbot`) для корректной загрузки или выгрузки обработчиков событий.

0 commit comments

Comments
 (0)