59 lines
2.7 KiB
Python
59 lines
2.7 KiB
Python
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() |