Класс database для чат-приложения на Python с SQLite

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

    Общая архитектура класса database

    Класс инициализируется с именем базы данных. Внутри создаётся объект db, который представляет таблицу users с тремя полями: id (целый), status (целый), rid (целый). Поле status хранит текущее состояние пользователя: 0 - не в поиске, 1 - в поиске собеседника, 2 - в чате. Поле rid содержит ID собеседника (rival).

    Методы для работы с пользователями

    new_user(user_id: int)

    Добавляет нового пользователя в таблицу со статусом 0 и rid = 0. Вызывается при первом входе в приложение.

    get_user_cursor(user_id: int) -> dict | None

    Возвращает словарь с ключами status и rid для указанного пользователя. Если пользователь не найден, возвращает None. Метод преобразует кортеж из базы в удобный формат.

    Управление поиском собеседника

    get_users_in_search() -> int

    Возвращает количество пользователей, у которых status = 1 (находятся в поиске). Используется для отображения индикатора ожидания.

    search(user_id: int) -> dict | None

    Ставит пользователя в очередь поиска (обновляет status на 1, rid на 0). Затем выбирает первого пользователя из очереди, исключая самого себя. Если никого нет, возвращает None. Иначе возвращает словарь с данными найденного собеседника.

    Управление чатами

    start_chat(user_id: int, rival_id: int)

    Устанавливает обоим пользователям status = 2 и rid равным ID собеседника. Таким образом фиксируется начало диалога.

    stop_chat(user_id: int, rival_id: int)

    Сбрасывает статус и rid обоих пользователей в 0. Вызывается при завершении чата.

    stop_search(user_id: int)

    Отменяет поиск для одного пользователя: устанавливает status = 0 и rid = 0.

    Особенности и возможные улучшения

    • Потокобезопасность: В текущей реализации нет блокировок. Для многопоточных приложений стоит добавить threading.Lock.
    • Обработка ошибок: Рекомендуется обернуть запросы в try-except для обработки исключений SQLite.
    • Метод close(): В коде есть незавершённый метод close() с опечаткой (self.db.close() вместо self.database). Его нужно исправить для корректного закрытия соединения.

    Этот класс даёт базовую функциональность для организации случайных чатов. Его можно расширить, добавив логирование, тайм-ауты поиска или поддержку комнат.

    Часто задаваемые вопросы