diff --git a/app/main.py b/app/main.py index ae92ec2..9e00344 100644 --- a/app/main.py +++ b/app/main.py @@ -3161,6 +3161,12 @@ _ADMIN_HTML = """ +
+

Регистрации пользователей

+
+
ПользовательИмяСпособПочтаДатаПодписка
+
+

Активные подписки

@@ -3215,6 +3221,14 @@ _ADMIN_HTML = """ return ''; }).join('') : ''; + // Регистрации пользователей + var regs = (d.registrations && d.registrations.list) || []; + document.getElementById('reg-count').textContent = d.registrations ? '· всего ' + d.registrations.count : ''; + document.getElementById('t-regs').innerHTML = regs.length ? regs.map(function(u){ + return ''; + }).join('') : ''; + // Активность по дням — три малых кратных (заходы / документы сайт+бот / страницы) var dl = d.daily || []; // 14 дней, старые слева function dd(x){ return x.day.slice(8)+'.'+x.day.slice(5,7); } @@ -3517,6 +3531,31 @@ def _admin_collect_stats() -> dict: "SELECT account_id, sub_until FROM WEB_ACCOUNTS WHERE sub_until > ? ORDER BY sub_until DESC", (now,))] out["subs"] = {"active_count": len(subs), "list": subs[:300]} + # Регистрации пользователей (аккаунты сайта): способ = префикс account_id, + # имя/почту берём из последней сессии (WEB_SESSIONS), для email-входа — из самого id. + reg_rows = con.execute( + "SELECT a.account_id, a.created_at, a.sub_until, a.pm_email, " + "(SELECT s.name FROM WEB_SESSIONS s WHERE s.account_id=a.account_id ORDER BY s.created_at DESC LIMIT 1) AS s_name, " + "(SELECT s.email FROM WEB_SESSIONS s WHERE s.account_id=a.account_id ORDER BY s.created_at DESC LIMIT 1) AS s_email, " + "(SELECT s.provider FROM WEB_SESSIONS s WHERE s.account_id=a.account_id ORDER BY s.created_at DESC LIMIT 1) AS s_prov " + "FROM WEB_ACCOUNTS a ORDER BY a.created_at DESC LIMIT 300").fetchall() + _meth = {"tg": "Telegram", "telegram": "Telegram", "yandex": "Яндекс", + "vk": "VK", "email": "Почта"} + regs = [] + for r in reg_rows: + aid = r["account_id"] or "" + prov, _sep, ident = aid.partition(":") + email = ident if prov == "email" else (r["s_email"] or r["pm_email"] or "") + regs.append({ + "account_id": aid, + "name": r["s_name"] or "", + "method": _meth.get((r["s_prov"] or prov or "").lower(), prov or "—"), + "email": email, + "created_at": r["created_at"], + "sub_active": bool(r["sub_until"] and r["sub_until"] > now), + }) + reg_total = con.execute("SELECT COUNT(*) c FROM WEB_ACCOUNTS").fetchone()["c"] + out["registrations"] = {"count": reg_total, "list": regs} # Платежи pays = [dict(r) for r in con.execute( "SELECT payment_id, amount, currency, status, purpose, email, created_at, paid_at "
АккаунтАктивна доОсталось
'+esc(s.account_id)+''+dOnly(s.sub_until)+''+daysLeft(s.sub_until)+'
Нет активных подписок
'+esc(u.account_id)+''+esc(u.name||'—')+''+esc(u.method)+ + ''+esc(u.email||'—')+''+dts(u.created_at)+''+(u.sub_active?'✓':'—')+'
Пока нет регистраций