feat(invites): приглашения, каталог публичных серверов и публичность сервера

- POST /guilds/{id}/invites (CREATE_INVITES): код из 10 символов, лимит
  использований и срок жизни; GET /guilds/{id}/invites (MANAGE_GUILD);
  DELETE /invites/{code} — создатель или MANAGE_GUILD;
- GET /invites/{code} — предпросмотр с карточкой сервера, 410 для истёкших и
  исчерпанных; POST /invites/{code} — принятие с проверкой лимита участников,
  повторное принятие не расходует использование;
- PATCH /guilds/{id} принимает `public`: сервер попадает в каталог и открыт для
  входа без приглашения (главный сервер публиковать нельзя);
- GET /guilds/public — каталог (имя, описание, иконка, число участников);
- аудит invite.create/invite.revoke/invite.accept, события INVITE_CREATE и
  INVITE_DELETE владельцу сессии;
- тесты: полный жизненный цикл приглашения, исчерпание, отзыв, права,
  публичный каталог и вход в публичный сервер.
This commit is contained in:
2026-09-19 23:33:34 +03:00
parent e4ffbb05a5
commit 61a84bfeae
16 changed files with 1233 additions and 32 deletions
+68
View File
@@ -183,6 +183,7 @@
"empty": "В этом сервере пока нет видимых комнат.",
"select": "Открыть комнату {{name}}",
"add": "Создать комнату",
"settings": "Настройки сервера",
"create": {
"title": "Новая комната",
"name": "Название комнаты",
@@ -214,6 +215,13 @@
"user": {
"panelLabel": "Панель пользователя",
"settings": "Настройки пользователя",
"menu": {
"label": "Меню пользователя",
"open": "Открыть меню пользователя",
"account": "Настройки аккаунта",
"guilds": "Настройки серверов",
"status": "Статус"
},
"logout": "Выйти",
"loggingOut": "Выходим…",
"statusLabel": "Статус: {{status}}",
@@ -240,6 +248,11 @@
"settings": {
"title": "Настройки",
"back": "В приложение",
"switcher": {
"label": "Разделы настроек",
"account": "Настройки сервера",
"servers": "Мои серверы"
},
"tabs": {
"label": "Разделы настроек",
"profile": "Профиль",
@@ -331,6 +344,61 @@
"memberCount": "{{count}} участн.",
"adminBadge": "админ",
"mainBadge": "главный"
},
"servers": {
"pickerLabel": "Мои серверы",
"empty": "У вас пока нет серверов.",
"emptyTitle": "Пока нет ни одного сервера",
"emptyHint": "Присоединитесь к главному серверу инстанса или создайте свой — тогда здесь появятся его настройки.",
"select": "Открыть настройки сервера {{name}}",
"notFound": "Сервер не найден среди доступных вам.",
"readOnlyHint": "Редактирование доступно владельцу сервера и участникам с правами ADMINISTRATOR или MANAGE_GUILD.",
"general": {
"title": "Общее",
"description": "Название и описание сервера видят все участники.",
"name": "Название сервера",
"guildDescription": "Описание",
"descriptionPlaceholder": "О чём этот сервер",
"saved": "Настройки сервера сохранены."
},
"nickname": {
"title": "Мой профиль на сервере",
"description": "Никнейм виден только на этом сервере.",
"label": "Никнейм",
"placeholder": "Оставьте пустым, чтобы сбросить ник",
"current": "Текущий никнейм:",
"none": "не задан",
"saved": "Никнейм сохранён."
},
"members": {
"title": "Участники",
"description": "Первые {{limit}} участников сервера.",
"empty": "Участники не найдены.",
"roles": "Ролей: {{roles}}",
"more": "Полный список участников с ролями появится в следующих фазах."
},
"roles": {
"title": "Роли",
"description": "Цвет и позиция ролей. Управление ролями появится в следующих фазах.",
"empty": "На сервере пока нет ролей.",
"position": "Позиция {{position}}",
"default": "по умолчанию"
},
"danger": {
"title": "Опасная зона",
"description": "Эти действия необратимы.",
"leaveOwnerHint": "Владелец не может покинуть свой сервер: сначала передайте владение или удалите сервер.",
"leaveHint": "Выйти из сервера и потерять доступ к его комнатам.",
"leave": "Покинуть сервер",
"leaveConfirmTitle": "Покинуть сервер?",
"leaveConfirmBody": "Вы выйдете из сервера «{{name}}». Вернуться можно будет по приглашению.",
"leaveConfirm": "Покинуть",
"deleteHint": "Удалить сервер вместе с комнатами, ролями и участниками.",
"delete": "Удалить сервер",
"deleteConfirmTitle": "Удалить сервер?",
"deleteConfirmBody": "Сервер «{{name}}» будет удалён без возможности восстановления.",
"deleteConfirm": "Удалить"
}
}
}
}