/divination-tg-bot

Primary LanguagePythonMIT LicenseMIT

Встречайте! Встречайте! Встречайте!

Гадание по книге через телеграм бот Bibliomancer!

Описание

Этот телеграм бот позволяет получить предсказание по книге. Прямо как в реальной жизни. Выберите одну из доступных книг (/book), напишите страницу и желаемую строчку. Вы получите цитату и её сгенерированное изображение — это и будет вашим предсказанием.

В этом репозитории также содержится код админ-бота, с помощью которого можно загружать новые книги, смотреть количество пользователей, добавлять новых админов и банить пользователей в случае необходимости. Книги загружаются как файлы в формате .txt и автоматически делятся на страницы и предложения.

Для взаимодействия с Telegram API используется фреймворк Python-Telegram-Bot, для генерации изображений — Pillow. С помощью NLTK страницы делятся на предложения. В качестве СУБД я использую MySQL.

Описание базы данных

В файле database.sql содержатся SQL-запросы создания базы данных:

  • Таблица book хранит метаданные о книгах: название, авторы и т.д.
  • Страницы книг хранятся в page.
  • Таблица chat содрежит id всех чатов, которые взаимодействуют с ботом, а также id книги из book, которую выбрал пользователь.

С помощью таблиц: role, chat_role и представления chat_role_view реализована система ролей.

На данный момент используются роли user, admin и banned, которые отвечают за обычного пользователя, администратора и забанненого пользователя соответсвенно. Роль admin дает возможность пользоваться админ-ботом. Один и тот же пользователь может иметь несколько ролей (например user и admin).

Каждая выданная роль может иметь временные рамки в теченнии которых она действует (grant_date и expire_date).
Событие role_expiration ежедневно в 3 часа ночи проверяет срок дейтсвия роли, и, в случае истечения, забирает её у пользователя.

Генерация изображений

Класс QuoteImage из файла imgen.py отвечает за генерацию изображения цитаты.
Чтобы избежать задержек в работе бота, для генерации изображений используется временная память io.BytesIO, а не диск.

Пример сгенерированной цитаты:

sreenshot

Установка:

  1. Клонируйте репозиторий на ваш компьютер:
    git clone git@github.com:ggeorg0/divination-tg-bot.git

  2. Перейдите в папку репозитория:
    cd divitaion-tg-bot

  3. Чтобы случайно не перезаписать ваши библиотеки Python другими версиями, используйте виртуальные окружения

    os command
    linux python3 -m venv ./.venv && source ./.venv/bin/activate
    windows python -m venv ./.venv && ./.venv/Scripts/activate
  4. Установите зависимости из файла requirements.txt

    os command
    linux pip3 install -r ./requirements.txt
    windows pip install -r ./requirements.txt
  5. Скорее всего меня нет прав на распространение чужих шрифтов, поэтому вам придется самостоятельно найти шрифты Ubuntu Bold и Georgia Italic, а затем поместить их файлы (Ubuntu-Bold.ttf, georgiai.ttf) в директорию fonts/.

  6. Теперь вам нужно установить систему управления базами данных MySQL (версия >= 8.0) на вашем компьютере. Если вы знакомы с Docker, вы можете использовать его.

  7. Получите токены доступа к ботам от BotFather — один для обычного бота и один для админ-бота

  8. Обновите файл config.py с вашими учетными данными для MySQL и токенами ботов, которые вы получили от BotFather. Если вы не хотите хранить учетные данные в файле, используйте переменные окружения.

  9. Запустите скрипт db_setup.py который инициирует базу данных. Вам будет предложено ввести id начального администратора (остальных админов можно будет добавлять через сам админ-бот).

     python ./db_setup.py
    
  10. Запустите скрипт nltk_setup.py который установит токенайзер для модуля NLTK.

     python ./nltk_setup.py
    
  11. Теперь можно запустить обычного бота

    python -u ./runbot.py > bot.logs &
    
  12. И админ-бота

    python -u ./adminbot.py > adminbot.logs &