feat(bot): доступ по QR-приглашениям, раздел «Участники», отзыв доступа
- AccessService: одноразовые приглашения (128 бит, в БД только sha256, TTL 24 ч), атомарный захват приглашения (условный UPDATE — из двух сканов одного QR проходит один), антиперебор (> 5 неудач в час — молчание), отзыв (черновик и FSM удаляются), повторное приглашение - ADMIN_IDS заводятся в БД при старте; дальше — только по приглашению - AccessMiddleware: участники из БД (+ last_seen раз в 5 мин), новичкам — только /start <токен> - «👥 Участники» для админов: список, QR (segno) + ссылка, отзыв с подтверждением - один ответ на неверный/истёкший/использованный токен — без подсказок Refs #25 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -19,6 +19,7 @@ start:
|
||||
📜 Логи — хвост, свой grep или вопрос агенту
|
||||
🚨 Алерты — падения, перегрузка, список
|
||||
no_access: "Доступ к боту — только по приглашению. Попросите QR-код у администратора."
|
||||
invite_rejected: "Приглашение недействительно: истекло, уже использовано или ссылка неверная. Попросите новое у администратора."
|
||||
|
||||
help:
|
||||
text: |-
|
||||
@@ -34,3 +35,20 @@ section:
|
||||
alerts: "🚨 Алерты\n\nРаздел в разработке."
|
||||
members: "👥 Участники\n\nРаздел в разработке."
|
||||
cancelled: "Отменено. Главное меню — кнопками внизу."
|
||||
|
||||
members:
|
||||
title: "👥 Участники: {count}"
|
||||
line: "{icon} {name}{username} · с {joined} · был(а) {seen}"
|
||||
never: "—"
|
||||
invite: "➕ Пригласить"
|
||||
revoke: "🚫 {name}"
|
||||
confirm: "Отозвать доступ у {name}? Его черновик удалится, кнопки перестанут работать."
|
||||
confirm_yes: "Да, отозвать"
|
||||
confirm_no: "Нет"
|
||||
revoked: "Доступ отозван: {name}."
|
||||
not_revoked: "Нельзя отозвать: администратор или уже без доступа."
|
||||
invite_caption: |-
|
||||
Приглашение в tgit — отсканируйте QR или откройте ссылку:
|
||||
{link}
|
||||
|
||||
Одноразовое, действует до {expires} UTC.
|
||||
|
||||
Reference in New Issue
Block a user