Skip to content

Commit 2bbc092

Browse files
committed
docs: make English the primary README, add Chinese, keep Russian
Promote English to README.md with a language switcher, add a Simplified Chinese translation (README.zh-CN.md) and move the Russian version to README.ru.md. Document the uv project workflow, container usage, the SESSION variable and the development commands; bump the stated Python floor to 3.11. Assisted-By: Claude <noreply@anthropic.com> Signed-off-by: Aleksei Sviridkin <f@lex.la>
1 parent f3eef40 commit 2bbc092

5 files changed

Lines changed: 248 additions & 87 deletions

File tree

.env.example

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,6 @@ API_ID=12345678
55
API_HASH=1a2b3c4d5e6f1239983abcdef
66
MUTE_TIMEOUT=3600
77
SUMMARY_PREFIX="I've put together your %d messages:\n"
8-
# Session name or path; Telethon stores auth at $SESSION.session
9-
SESSION=userbot
8+
# Optional. Session name or path; Telethon stores auth at $SESSION.session.
9+
# Leave unset to use the default ("userbot"; the container image uses /data/userbot).
10+
# SESSION=userbot

README.md

Lines changed: 67 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,55 +1,89 @@
11
# Telegram Abridger Userbot
22

3-
[English version](README_en.md)
3+
**English** · [中文](README.zh-CN.md) · [Русский](README.ru.md)
44

5-
## Что делает бот
6-
7-
Юзербот входит в Telegram от имени пользователя и следит за входящими сообщениями во всех чатах, которые не заглушены и не находятся в архиве (чаты с topics игнорируются).
8-
9-
Для каждого отправителя ведётся скользящее окно `COOLDOWN_INTERVAL` секунд:
10-
11-
- Все входящие сообщения автоматически отмечаются прочитанными и накапливаются в буфер
12-
- Когда окно истекает, буфер склеивается через `MESSAGE_CONCAT_STRING` и отправляется в тот же чат без уведомления (silently); если задан `SUMMARY_PREFIX`, он добавляется в начало (`%d` → число сообщений)
13-
- Если отправитель превышает `MESSAGE_FREQUENCY_LIMIT` сообщений за окно, он сразу заглушается на `MUTE_TIMEOUT` секунд, а накопленный буфер отправляется досрочно
14-
- Если за `COOLDOWN_INTERVAL` в том же чате были исходящие сообщения (т.е. пользователь сам отвечал), суммари не отправляется — это нормальный ход разговора
5+
A self-account (MTProto) userbot that watches incoming messages, buffers them per sender over a sliding window, and—when a sender floods the window—joins the buffered messages into one silent summary and mutes the sender's notifications. If you reply in the chat yourself, the summary is suppressed: the conversation is clearly active.
156

167
## Requirements
178

18-
- Python 3.10+
19-
- `telethon`
9+
- Python 3.11+
10+
- [uv](https://docs.astral.sh/uv/)
2011
- Telegram API credentials (`API_ID`, `API_HASH`)
2112

22-
### Получение API_ID и API_HASH
13+
### Getting API_ID and API_HASH
2314

24-
1. Открыть https://my.telegram.org и войти по номеру телефона
25-
2. Перейти в **API development tools**
26-
3. Создать приложение (название и платформа — любые)
27-
4. Скопировать `App api_id``API_ID` и `App api_hash``API_HASH`
15+
1. Go to https://my.telegram.org and sign in with your phone number
16+
2. Navigate to **API development tools**
17+
3. Create an application (name and platform can be anything)
18+
4. Copy `App api_id``API_ID` and `App api_hash``API_HASH`
2819

29-
### Config (env vars or `.env`)
20+
### Configuration (environment variables or `.env`)
3021

3122
| Variable | Default | Description |
32-
|---|---|---|
33-
| `API_ID` || Telegram API ID |
34-
| `API_HASH` || Telegram API Hash |
35-
| `COOLDOWN_INTERVAL` | `300` | Окно наблюдения в секундах |
36-
| `MESSAGE_FREQUENCY_LIMIT` | `5` | Макс. сообщений за окно до mute |
37-
| `MESSAGE_CONCAT_STRING` | `, ` | Разделитель при склейке сообщений |
38-
| `MUTE_TIMEOUT` | `3600` | Длительность mute в секундах |
39-
| `SUMMARY_PREFIX` | _(нет)_ | Префикс перед склеенным сообщением; `%d` заменяется числом сообщений (например, `"Собрано %d сообщений:\n"`) |
23+
| --- | --- | --- |
24+
| `API_ID` || Telegram API ID (required) |
25+
| `API_HASH` || Telegram API hash (required) |
26+
| `COOLDOWN_INTERVAL` | `300` | Observation window in seconds |
27+
| `MESSAGE_FREQUENCY_LIMIT` | `5` | Max messages per window before muting |
28+
| `MESSAGE_CONCAT_STRING` | `, ` | Delimiter used to join buffered messages |
29+
| `MUTE_TIMEOUT` | `3600` | Mute duration in seconds |
30+
| `SUMMARY_PREFIX` | _(none)_ | Optional prefix prepended to the summary; `%d` is replaced with the message count (e.g. `"I've put together your %d messages:\n"`) |
31+
| `SESSION` | `userbot` | Telethon session name or path; auth is stored at `$SESSION.session` |
4032

4133
## Usage
4234

4335
```bash
44-
cp .env.example .env # заполни API_ID и API_HASH
36+
cp .env.example .env # fill in API_ID and API_HASH
4537
uv run bot.py
4638
```
4739

48-
`uv` сам установит зависимости из inline-метаданных скрипта (PEP 723) в изолированное окружение.
40+
`uv run` resolves and installs the dependencies from `pyproject.toml`/`uv.lock` into an isolated environment automatically — no manual setup is needed.
41+
42+
On first run, Telethon will prompt for your phone number and a confirmation code, then write a `*.session` file. That file holds your authentication secret — keep it private and never commit it.
43+
44+
## Running in a container
45+
46+
The image builds dependencies in a `uv` stage and ships a slim, non-root runtime. The session is persisted on the `/data` volume so authentication survives restarts.
47+
48+
```bash
49+
# Build
50+
docker build --tag telegram-abridger --file Containerfile .
51+
52+
# First run: authenticate interactively, persisting the session to a named volume
53+
docker run --interactive --tty \
54+
--env-file .env \
55+
--volume abridger-session:/data \
56+
telegram-abridger
57+
58+
# Subsequent runs (already authenticated)
59+
docker run --detach --restart unless-stopped \
60+
--env-file .env \
61+
--volume abridger-session:/data \
62+
telegram-abridger
63+
```
64+
65+
The image sets `SESSION=/data/userbot`; leave `SESSION` unset in your `.env` so the session lands on the volume.
66+
67+
## How it works
68+
69+
The userbot monitors incoming messages from non-muted, non-archived chats (forum/topics chats are excluded). For each sender it maintains a sliding window of `COOLDOWN_INTERVAL` seconds:
4970

50-
При первом запуске Telethon запросит номер телефона и код подтверждения.
71+
- Incoming messages are marked as read and added to a per-sender buffer
72+
- If a sender exceeds `MESSAGE_FREQUENCY_LIMIT` messages within the window, they are muted for `MUTE_TIMEOUT` seconds via Telegram's notification settings and their buffer is flushed immediately
73+
- Buffered messages are concatenated with `MESSAGE_CONCAT_STRING` and sent silently in the same chat; if `SUMMARY_PREFIX` is set, it is prepended to the summary (`%d` → message count)
74+
- Buffers are also flushed periodically once a sender's window goes quiet
75+
- If you sent any message in the same chat within `COOLDOWN_INTERVAL`, the summary is suppressed — the conversation is already active
76+
77+
## Development
78+
79+
```bash
80+
uv sync # install runtime + dev dependencies
81+
uv run pytest # run the test suite
82+
uv run ruff check . && uv run ruff format --check .
83+
uv run mypy bot.py
84+
```
5185

52-
## Output / Result Files
86+
## Output / result files
5387

54-
- `userbot.session`файл сессии Telethon (не коммитить)
55-
- Логи выводятся в stdout
88+
- `$SESSION.session` (default `userbot.session`)Telethon session file (do not commit)
89+
- Logs go to stdout

README.ru.md

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
# Telegram Abridger Userbot
2+
3+
[English](README.md) · [中文](README.zh-CN.md) · **Русский**
4+
5+
Юзербот (MTProto, от имени аккаунта), который следит за входящими сообщениями, копит их по отправителю в скользящем окне и — когда отправитель заваливает окно — склеивает накопленные сообщения в одно беззвучное саммари и заглушает уведомления от него. Если ты сам ответил в этом чате, саммари не отправляется: разговор очевидно идёт.
6+
7+
## Требования
8+
9+
- Python 3.11+
10+
- [uv](https://docs.astral.sh/uv/)
11+
- Учётные данные Telegram API (`API_ID`, `API_HASH`)
12+
13+
### Получение API_ID и API_HASH
14+
15+
1. Открыть https://my.telegram.org и войти по номеру телефона
16+
2. Перейти в **API development tools**
17+
3. Создать приложение (название и платформа — любые)
18+
4. Скопировать `App api_id``API_ID` и `App api_hash``API_HASH`
19+
20+
### Конфигурация (переменные окружения или `.env`)
21+
22+
| Переменная | По умолчанию | Описание |
23+
| --- | --- | --- |
24+
| `API_ID` || Telegram API ID (обязательно) |
25+
| `API_HASH` || Telegram API hash (обязательно) |
26+
| `COOLDOWN_INTERVAL` | `300` | Окно наблюдения в секундах |
27+
| `MESSAGE_FREQUENCY_LIMIT` | `5` | Максимум сообщений за окно до mute |
28+
| `MESSAGE_CONCAT_STRING` | `, ` | Разделитель при склейке сообщений |
29+
| `MUTE_TIMEOUT` | `3600` | Длительность mute в секундах |
30+
| `SUMMARY_PREFIX` | _(нет)_ | Необязательный префикс перед саммари; `%d` заменяется числом сообщений (например, `"Собрано %d сообщений:\n"`) |
31+
| `SESSION` | `userbot` | Имя или путь сессии Telethon; авторизация хранится в `$SESSION.session` |
32+
33+
## Запуск
34+
35+
```bash
36+
cp .env.example .env # заполни API_ID и API_HASH
37+
uv run bot.py
38+
```
39+
40+
`uv run` сам разрешает и устанавливает зависимости из `pyproject.toml`/`uv.lock` в изолированное окружение — ручная настройка не нужна.
41+
42+
При первом запуске Telethon запросит номер телефона и код подтверждения, затем создаст файл `*.session`. Этот файл содержит секрет авторизации — храни его в тайне и никогда не коммить.
43+
44+
## Запуск в контейнере
45+
46+
Образ собирает зависимости в стадии `uv` и поставляется как тонкий non-root рантайм. Сессия хранится на томе `/data`, поэтому авторизация переживает перезапуски.
47+
48+
```bash
49+
# Сборка
50+
docker build --tag telegram-abridger --file Containerfile .
51+
52+
# Первый запуск: интерактивная авторизация с сохранением сессии в именованный том
53+
docker run --interactive --tty \
54+
--env-file .env \
55+
--volume abridger-session:/data \
56+
telegram-abridger
57+
58+
# Последующие запуски (авторизация уже выполнена)
59+
docker run --detach --restart unless-stopped \
60+
--env-file .env \
61+
--volume abridger-session:/data \
62+
telegram-abridger
63+
```
64+
65+
Образ задаёт `SESSION=/data/userbot`; не задавай `SESSION` в своём `.env`, чтобы сессия попадала на том.
66+
67+
## Как это работает
68+
69+
Юзербот отслеживает входящие сообщения из не заглушённых и не архивных чатов (чаты с форумами/топиками исключаются). Для каждого отправителя ведётся скользящее окно `COOLDOWN_INTERVAL` секунд:
70+
71+
- Входящие сообщения отмечаются прочитанными и добавляются в буфер по отправителю
72+
- Если отправитель превышает `MESSAGE_FREQUENCY_LIMIT` сообщений за окно, он заглушается на `MUTE_TIMEOUT` секунд через настройки уведомлений Telegram, а его буфер отправляется досрочно
73+
- Сообщения буфера склеиваются через `MESSAGE_CONCAT_STRING` и беззвучно отправляются в тот же чат; если задан `SUMMARY_PREFIX`, он добавляется в начало саммари (`%d` → число сообщений)
74+
- Буферы также периодически сбрасываются, когда окно отправителя затихает
75+
- Если ты отправил любое сообщение в этом же чате за `COOLDOWN_INTERVAL`, саммари подавляется — разговор уже активен
76+
77+
## Разработка
78+
79+
```bash
80+
uv sync # установка runtime- и dev-зависимостей
81+
uv run pytest # запуск тестов
82+
uv run ruff check . && uv run ruff format --check .
83+
uv run mypy bot.py
84+
```
85+
86+
## Выходные файлы
87+
88+
- `$SESSION.session` (по умолчанию `userbot.session`) — файл сессии Telethon (не коммитить)
89+
- Логи выводятся в stdout

README.zh-CN.md

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
# Telegram Abridger Userbot
2+
3+
[English](README.md) · **中文** · [Русский](README.ru.md)
4+
5+
一个以用户账号身份运行的 MTProto userbot:它监听收到的消息,按发送者在滑动时间窗内缓存消息;当某个发送者在窗口内刷屏时,将缓存的消息合并为一条静默的摘要发出,并静音该发送者的通知。如果你自己在该聊天里回复过,则不会发送摘要——对话显然正在进行中。
6+
7+
## 环境要求
8+
9+
- Python 3.11+
10+
- [uv](https://docs.astral.sh/uv/)
11+
- Telegram API 凭据(`API_ID``API_HASH`
12+
13+
### 获取 API_ID 和 API_HASH
14+
15+
1. 打开 https://my.telegram.org 并用手机号登录
16+
2. 进入 **API development tools**
17+
3. 创建一个应用(名称和平台任意)
18+
4. 复制 `App api_id``API_ID``App api_hash``API_HASH`
19+
20+
### 配置(环境变量或 `.env`
21+
22+
| 变量 | 默认值 | 说明 |
23+
| --- | --- | --- |
24+
| `API_ID` || Telegram API ID(必填) |
25+
| `API_HASH` || Telegram API hash(必填) |
26+
| `COOLDOWN_INTERVAL` | `300` | 观察窗口,单位秒 |
27+
| `MESSAGE_FREQUENCY_LIMIT` | `5` | 触发静音前每个窗口允许的最大消息数 |
28+
| `MESSAGE_CONCAT_STRING` | `, ` | 拼接缓存消息时使用的分隔符 |
29+
| `MUTE_TIMEOUT` | `3600` | 静音时长,单位秒 |
30+
| `SUMMARY_PREFIX` | _(无)_ | 可选的摘要前缀;`%d` 会被替换为消息数量(例如 `"I've put together your %d messages:\n"`|
31+
| `SESSION` | `userbot` | Telethon 会话名称或路径;认证信息保存在 `$SESSION.session` |
32+
33+
## 使用方法
34+
35+
```bash
36+
cp .env.example .env # 填入 API_ID 和 API_HASH
37+
uv run bot.py
38+
```
39+
40+
`uv run` 会自动根据 `pyproject.toml`/`uv.lock` 解析并安装依赖到隔离环境中,无需手动配置。
41+
42+
首次运行时,Telethon 会要求输入手机号和验证码,然后写入一个 `*.session` 文件。该文件包含你的认证密钥——请妥善保管,切勿提交到版本库。
43+
44+
## 在容器中运行
45+
46+
镜像在 `uv` 构建阶段安装依赖,并以精简的非 root 运行时发布。会话保存在 `/data` 卷上,因此重启后认证依然有效。
47+
48+
```bash
49+
# 构建
50+
docker build --tag telegram-abridger --file Containerfile .
51+
52+
# 首次运行:交互式登录,并将会话持久化到命名卷
53+
docker run --interactive --tty \
54+
--env-file .env \
55+
--volume abridger-session:/data \
56+
telegram-abridger
57+
58+
# 之后运行(已完成登录)
59+
docker run --detach --restart unless-stopped \
60+
--env-file .env \
61+
--volume abridger-session:/data \
62+
telegram-abridger
63+
```
64+
65+
镜像已设置 `SESSION=/data/userbot`;请在 `.env` 中不要设置 `SESSION`,以便会话保存到卷上。
66+
67+
## 工作原理
68+
69+
userbot 监听来自未静音、未归档聊天的收到消息(排除论坛/话题类聊天)。它为每个发送者维护一个 `COOLDOWN_INTERVAL` 秒的滑动窗口:
70+
71+
- 收到的消息会被标记为已读,并加入按发送者区分的缓冲区
72+
- 如果某个发送者在窗口内超过 `MESSAGE_FREQUENCY_LIMIT` 条消息,则通过 Telegram 的通知设置将其静音 `MUTE_TIMEOUT` 秒,并立即清空其缓冲区
73+
- 缓存的消息用 `MESSAGE_CONCAT_STRING` 拼接后,在同一聊天里静默发送;若设置了 `SUMMARY_PREFIX`,则将其加在摘要前面(`%d` → 消息数量)
74+
- 当某个发送者的窗口安静下来后,缓冲区也会被定期清空
75+
- 如果你在 `COOLDOWN_INTERVAL` 内于同一聊天发送过任何消息,摘要将被抑制——对话正在进行中
76+
77+
## 开发
78+
79+
```bash
80+
uv sync # 安装运行时与开发依赖
81+
uv run pytest # 运行测试
82+
uv run ruff check . && uv run ruff format --check .
83+
uv run mypy bot.py
84+
```
85+
86+
## 输出 / 结果文件
87+
88+
- `$SESSION.session`(默认 `userbot.session`)—— Telethon 会话文件(不要提交)
89+
- 日志输出到 stdout

README_en.md

Lines changed: 0 additions & 52 deletions
This file was deleted.

0 commit comments

Comments
 (0)