146 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			146 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
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
 |