Replace single report type with composable analysis: depth levels (basic/standard/full) + focus area multi-select (psychology, business, marketing, content, audience, sentiment). Multi-step inline keyboard flow guides users through selection. - i18n: English + Russian, auto-detect from Telegram, /lang override - AI providers: Anthropic + OpenRouter via AIClient abstraction - Telegram Stars payments with per-depth pricing and free trial - SQLite (aiosqlite) for users, analyses, payments tracking - User middleware for auto-registration and language detection - Report persistence: save .md locally, offer file download - New commands: /features, /prices, /lang - Composable prompt system: depth modifiers + focus area fragments
54 lines
1.5 KiB
Python
54 lines
1.5 KiB
Python
import aiosqlite
|
|
|
|
from bot.config import settings
|
|
|
|
_db: aiosqlite.Connection | None = None
|
|
|
|
SCHEMA = """\
|
|
CREATE TABLE IF NOT EXISTS users (
|
|
telegram_id INTEGER PRIMARY KEY,
|
|
username TEXT,
|
|
first_name TEXT,
|
|
lang TEXT NOT NULL DEFAULT 'en',
|
|
free_used INTEGER NOT NULL DEFAULT 0,
|
|
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS analyses (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
telegram_id INTEGER NOT NULL REFERENCES users(telegram_id),
|
|
channel TEXT NOT NULL,
|
|
depth TEXT NOT NULL,
|
|
focus_areas TEXT NOT NULL,
|
|
model_id TEXT NOT NULL,
|
|
stars_paid INTEGER NOT NULL DEFAULT 0,
|
|
report_path TEXT,
|
|
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS payments (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
telegram_id INTEGER NOT NULL REFERENCES users(telegram_id),
|
|
telegram_payment_id TEXT NOT NULL UNIQUE,
|
|
stars_amount INTEGER NOT NULL,
|
|
analysis_id INTEGER REFERENCES analyses(id),
|
|
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
);
|
|
"""
|
|
|
|
|
|
async def get_db() -> aiosqlite.Connection:
|
|
global _db
|
|
if _db is None:
|
|
_db = await aiosqlite.connect(settings.db_path)
|
|
_db.row_factory = aiosqlite.Row
|
|
await _db.executescript(SCHEMA)
|
|
await _db.commit()
|
|
return _db
|
|
|
|
|
|
async def close_db() -> None:
|
|
global _db
|
|
if _db is not None:
|
|
await _db.close()
|
|
_db = None
|