import aiosqlite import os # База будет храниться в папке data DB_PATH = "data/users.db" async def init_db(): """Создает таблицу, если она еще не существует.""" os.makedirs("data", exist_ok=True) async with aiosqlite.connect(DB_PATH) as db: await db.execute(''' CREATE TABLE IF NOT EXISTS users ( user_id INTEGER PRIMARY KEY, lat REAL, lon REAL, time TEXT, timezone TEXT ) ''') await db.commit() async def get_user(user_id: int): """Возвращает данные пользователя по его ID.""" async with aiosqlite.connect(DB_PATH) as db: db.row_factory = aiosqlite.Row # Чтобы обращаться к колонкам по именам (как к словарю) async with db.execute("SELECT * FROM users WHERE user_id = ?", (user_id,)) as cursor: return await cursor.fetchone() async def save_user_location(user_id: int, lat: float, lon: float, timezone: str): """Сохраняет или обновляет координаты и часовой пояс пользователя.""" async with aiosqlite.connect(DB_PATH) as db: await db.execute(''' INSERT INTO users (user_id, lat, lon, timezone) VALUES (?, ?, ?, ?) ON CONFLICT(user_id) DO UPDATE SET lat=excluded.lat, lon=excluded.lon, timezone=excluded.timezone ''', (user_id, lat, lon, timezone)) await db.commit() async def update_user_time(user_id: int, time: str): """Обновляет время отправки для пользователя.""" async with aiosqlite.connect(DB_PATH) as db: await db.execute("UPDATE users SET time = ? WHERE user_id = ?", (time, user_id)) await db.commit() async def get_all_users_with_time(): """Получает всех пользователей, у которых настроено время (для восстановления после перезапуска).""" async with aiosqlite.connect(DB_PATH) as db: db.row_factory = aiosqlite.Row async with db.execute("SELECT * FROM users WHERE time IS NOT NULL") as cursor: return await cursor.fetchall() async def delete_user(user_id: int): """Удаляет пользователя из БД (например, если он заблокировал бота).""" async with aiosqlite.connect(DB_PATH) as db: await db.execute("DELETE FROM users WHERE user_id = ?", (user_id,)) await db.commit()