import sqlite3 import aiosqlite import os from datetime import datetime DB_PATH = "messenger.db" def get_connection(): """Получает соединение с базой данных.""" conn = sqlite3.connect(DB_PATH) conn.row_factory = sqlite3.Row # Для доступа к колонкам по имени return conn def init_db(): """Инициализирует базу данных и создает таблицы, если они не существуют.""" conn = get_connection() cursor = conn.cursor() # Создаем таблицу для чатов (если ее нет) cursor.execute(''' CREATE TABLE IF NOT EXISTS chats ( id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT NOT NULL ) ''') # Создаем таблицу для сессий cursor.execute(''' CREATE TABLE IF NOT EXISTS sessions ( login TEXT PRIMARY KEY, user_id TEXT NOT NULL, access_token TEXT NOT NULL, refresh_token TEXT NOT NULL, created_at TIMESTAMP NOT NULL ) ''') # Создаем таблицу для хранения состояния приложения (ключ-значение) cursor.execute(''' CREATE TABLE IF NOT EXISTS app_state ( key TEXT PRIMARY KEY, value TEXT NOT NULL ) ''') # Проверяем, есть ли в chats тестовые данные cursor.execute("SELECT COUNT(*) FROM chats") if cursor.fetchone()[0] == 0: cursor.execute('INSERT INTO chats (title) VALUES (?)', ("Чат с Alice",)) conn.commit() conn.close() def add_session(login, access_token, refresh_token, user_id=None, update_existing=False): """Добавляет новую сессию или обновляет существующую.""" conn = get_connection() cursor = conn.cursor() print("ffff", login, access_token, refresh_token, user_id, update_existing) if update_existing: # Обновляем существующую сессию по access_token cursor.execute(''' UPDATE sessions SET access_token = ?, refresh_token = ?, created_at = ? WHERE access_token = ? ''', (access_token, refresh_token, datetime.now(), access_token)) else: # Вставляем новую или заменяем существующую по логину cursor.execute(''' INSERT OR REPLACE INTO sessions (login, user_id, access_token, refresh_token, created_at) VALUES (?, ?, ?, ?, ?) ''', (login, user_id, access_token, refresh_token, datetime.now())) conn.commit() conn.close() def logout(access_token: str): """Удаляет сессию по токену доступа.""" conn = get_connection() cursor = conn.cursor() cursor.execute('DELETE FROM sessions WHERE access_token = ?', (access_token,)) conn.commit() conn.close() def get_session(login: str): """Получает сессию по логину.""" conn = get_connection() cursor = conn.cursor() cursor.execute('SELECT * FROM sessions WHERE login = ?', (login,)) session = cursor.fetchone() conn.close() return session def get_all_sessions(): """Получает все сессии, отсортированные по дате создания (сначала новые).""" conn = get_connection() cursor = conn.cursor() cursor.execute('SELECT * FROM sessions ORDER BY created_at DESC') sessions = cursor.fetchall() conn.close() return sessions def get_last_login(): """Получает логин последнего вошедшего пользователя.""" conn = get_connection() cursor = conn.cursor() cursor.execute("SELECT value FROM app_state WHERE key = 'last_login'") result = cursor.fetchone() conn.close() return result['value'] if result else None def set_last_login(login: str): """Сохраняет логин последнего вошедшего пользователя.""" conn = get_connection() cursor = conn.cursor() cursor.execute("INSERT OR REPLACE INTO app_state (key, value) VALUES ('last_login', ?)", (login,)) conn.commit() conn.close() # def get_current_access_token(): # """ # Получает access_token для последней активной сессии. # :return: access_token или None, если сессия не найдена. # """ # last_login = get_last_login() # if not last_login: # return None # session = get_session(last_login) # return session['access_token'] if session else None async def get_current_access_token(): async with aiosqlite.connect(DB_PATH) as db: db.row_factory = aiosqlite.Row async with db.execute("SELECT value FROM app_state WHERE key = 'last_login'") as cur: row = await cur.fetchone() if not row: return None last_login = row[0] async with db.execute('SELECT access_token FROM sessions WHERE login = ?', (last_login,)) as cur: row = await cur.fetchone() return row[0] if row else None