Класс 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). Его нужно исправить для корректного закрытия соединения.
Этот класс даёт базовую функциональность для организации случайных чатов. Его можно расширить, добавив логирование, тайм-ауты поиска или поддержку комнат.