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
52 lines
1.4 KiB
Python
52 lines
1.4 KiB
Python
from bot.db.engine import get_db
|
|
|
|
|
|
async def get_or_create(
|
|
telegram_id: int,
|
|
username: str | None = None,
|
|
first_name: str | None = None,
|
|
lang: str = "en",
|
|
) -> dict:
|
|
db = await get_db()
|
|
row = await db.execute_fetchall(
|
|
"SELECT * FROM users WHERE telegram_id = ?", (telegram_id,)
|
|
)
|
|
if row:
|
|
return dict(row[0])
|
|
|
|
await db.execute(
|
|
"INSERT INTO users (telegram_id, username, first_name, lang) VALUES (?, ?, ?, ?)",
|
|
(telegram_id, username, first_name, lang),
|
|
)
|
|
await db.commit()
|
|
row = await db.execute_fetchall(
|
|
"SELECT * FROM users WHERE telegram_id = ?", (telegram_id,)
|
|
)
|
|
return dict(row[0])
|
|
|
|
|
|
async def update_lang(telegram_id: int, lang: str) -> None:
|
|
db = await get_db()
|
|
await db.execute("UPDATE users SET lang = ? WHERE telegram_id = ?", (lang, telegram_id))
|
|
await db.commit()
|
|
|
|
|
|
async def increment_free(telegram_id: int) -> int:
|
|
db = await get_db()
|
|
await db.execute(
|
|
"UPDATE users SET free_used = free_used + 1 WHERE telegram_id = ?",
|
|
(telegram_id,),
|
|
)
|
|
await db.commit()
|
|
row = await db.execute_fetchall(
|
|
"SELECT free_used FROM users WHERE telegram_id = ?", (telegram_id,)
|
|
)
|
|
return row[0][0]
|
|
|
|
|
|
async def get_free_used(telegram_id: int) -> int:
|
|
db = await get_db()
|
|
row = await db.execute_fetchall(
|
|
"SELECT free_used FROM users WHERE telegram_id = ?", (telegram_id,)
|
|
)
|
|
return row[0][0] if row else 0
|