Telegram-бот для ведения текстовых заметок.
- Создаем telegram-бота через @BotFather. Пусть вам дали токен
XXX
echo 'TOKEN = "XXX"' > src/telegram_token.py
docker pull mongodb/mongodb-community-server:latest
docker run --name mongodb -p 27017:27017 -d mongodb/mongodb-community-server:latest
pip3 install -r requirements.txt
python3 -m src.main
- Запуск тестов:
coverage run --source=src --omit=src/main.py,src/telegram_token.py -m unittest tests/*_test.py
- Показать процент покрытия:
coverage report
Name | Stmts | Miss | Cover |
---|---|---|---|
src/handlers.py | 107 | 0 | 100% |
src/item.py | 11 | 0 | 100% |
src/mongo_persistence.py | 39 | 0 | 100% |
src/user_data.py | 41 | 0 | 100% |
TOTAL | 198 | 0 | 100% |
- Python
- Библиотека python-telegram-bot
- База данных MongoDB и библиотека PyMongo
- Карточка. Это обычная текстовая заметка. У каждой карточки есть номер.
/start
и/help
- показать список команд./cancel
- отменить текущую операцию./all
- перечислить все карточки. Бот присылает список из первых 10 карточек, остальные карточки находятся на следующих "страницах". Пользователь может перемещаться по "страницам" с помощью inline keyboard. Рядом с каждой карточкой будет команда вида/n
, нажав на которую пользователь может открыть эту карточку./n
- открыть карточку с номеромn
./edit
- редактировать текст текущей карточки./delete
- удалить текущую карточку./add
- добавить новую карточку- Примечание: пользователю никогда не придется вручную вводить номера карточек, он просто будет нажимать на кликабельные команды в сообщениях бота.
-
class Item:
- Это карточка.
- Атрибуты:
text: str
deleted: bool
- Методы:
get_text(max_len: int) -> str
- возвращаетtext
, обрезанный так, чтобы его длина была не большеmax_len
, и он заканчивался на...
(чтобы красиво отображать начало карточки в результате выполнения команды/all
).staticmethod from_json(document: dict) -> Item
- создает объектItem
из словаря вида{'text': 'abacaba', 'deleted': False}
.to_json() -> dict
- возвращает словарь вышеописанного вида.
-
class UserData
- Атрибуты:
main_message_id: int
- id сообщения, в котором на данный момент показывается список карточек (это нужно, чтобы иметь возможность редактировать это сообщение при перелистывании "страниц").current_item_id: int
- номер текущей карточки.items: List[Item]
- список карточек (в том числе удаленных).
- Методы:
get_main_message_text() -> str
- возвращает полный текст сообщения для результата выполнения команды/all
.staticmethod from_json(document: dict) -> UserData
- создает объектUserData
из словаря вида{'main_message_id': 1, 'current_item_id': 2, 'items': [{'text': 'abacaba', 'deleted': False}]}
.to_json() -> dict
- возвращает словарь вышеописанного вида.
- Атрибуты:
-
class Persistence(telegram.ext.BasePersistence):
- Класс для доступа к базе данных
- Атрибуты:
mongo_db: pymongo.database.Database
- Методы:
get_user_data() -> Dict[int, UserData]
- возвращаетUserData
для всех пользователей.update_user_data(user_id: int, data: UserData) -> None
- обновляет в базе данныйUserData
для пользователяuser_id
.get_conversations(name: str) -> dict
- возвращает объект, который необходим дляtelegram.ext.ConversationHandler
. Это нужно, чтобы бот запоминал, на чем закончился диалог с пользователем, если сервер по какой-то причине упал.update_conversations(name: str, key: tuple, new_state: int) -> None
- записывает в базу данных данные дляtelegram.ext.ConversationHandler
.- Много других методов, которые нужно как-то (неважно как) переопределить. Список методов указан здесь.
-
class Handlers:
- Класс, который просто содержит все необходимые обработчики команд.
help_handler: CommandHandler
- обработчик команд/start
и/help
.cancel_handler: CommandHandler
- обработчик команды/cancel
.get_all_handler: CommandHandler
- обработчик команды/all
.get_item_handler: CommandHandler
- обработчик команд вида/n
.init_add_handler: CommandHandler
- обработчик команды/add
. Переводит бота в состояниеADDING
, в котором он ждет текста для создания новой карточки.add_item_handler: MessageHandler
- обработчик сообщений в состоянииADDING
.init_edit_handler: CommandHandler
- обработчик команды/edit
. Переводит бота в состояниеEDITING
, в котором он ждет нового текста для редактирования старой карточки.edit_item_handler: MessageHandler
- обработчик сообщений в состоянииEDITING
.delete_item_handler: CommandHandler
- обработчик команды/delete
.main_handler: ConversationHandler
- обработчик, который хранит в себе все вышеописанные обработчики и текущее состояние диалога со всеми пользователями.