from contextlib import closing import os import sqlite3 from pathlib import Path DEFAULT_DB_PATH = "/app/data/social_writer.sqlite3" def connect(db_path: str | None = None) -> sqlite3.Connection: path = Path(db_path or os.environ.get("BOT_DB_PATH", DEFAULT_DB_PATH)) path.parent.mkdir(parents=True, exist_ok=True) connection = sqlite3.connect(path, timeout=10) connection.row_factory = sqlite3.Row connection.execute("PRAGMA busy_timeout = 10000") connection.execute("PRAGMA journal_mode = WAL") return connection def init_db(db_path: str | None = None) -> None: with closing(connect(db_path)) as connection, connection: connection.execute( """ CREATE TABLE IF NOT EXISTS users ( telegram_user_id INTEGER PRIMARY KEY, tone_of_voice TEXT NOT NULL DEFAULT '', created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP ) """ ) def get_tone_of_voice(user_id: int, db_path: str | None = None) -> str: with closing(connect(db_path)) as connection, connection: connection.execute( "INSERT OR IGNORE INTO users (telegram_user_id) VALUES (?)", (user_id,) ) row = connection.execute( "SELECT tone_of_voice FROM users WHERE telegram_user_id = ?", (user_id,) ).fetchone() return str(row["tone_of_voice"] or "") if row else "" def get_deploy_notice_version(db_path: str | None = None) -> str: with closing(connect(db_path)) as connection, connection: connection.execute( "CREATE TABLE IF NOT EXISTS app_state (key TEXT PRIMARY KEY, value TEXT NOT NULL)" ) row = connection.execute( "SELECT value FROM app_state WHERE key = 'deploy_notice_version'" ).fetchone() return str(row["value"]) if row else "" def set_deploy_notice_version(version: str, db_path: str | None = None) -> None: with closing(connect(db_path)) as connection, connection: connection.execute( "CREATE TABLE IF NOT EXISTS app_state (key TEXT PRIMARY KEY, value TEXT NOT NULL)" ) connection.execute( """ INSERT INTO app_state (key, value) VALUES ('deploy_notice_version', ?) ON CONFLICT(key) DO UPDATE SET value = excluded.value """, (version,), ) def save_tone_of_voice(user_id: int, tone_of_voice: str, db_path: str | None = None) -> None: tone = tone_of_voice.strip()[:1200] with closing(connect(db_path)) as connection, connection: connection.execute( """ INSERT INTO users (telegram_user_id, tone_of_voice, updated_at) VALUES (?, ?, CURRENT_TIMESTAMP) ON CONFLICT(telegram_user_id) DO UPDATE SET tone_of_voice = excluded.tone_of_voice, updated_at = CURRENT_TIMESTAMP """, (user_id, tone), )