feat(webhooks): вебхуки комнат — бэкенд, клиент и настройки комнаты

- миграция 00012: таблица webhooks, снимок имени и аватара в messages (AGENT.md 7.11)
- API: список/создание/правка/удаление и пересоздание токена (MANAGE_WEBHOOKS,
  step-up при создании, аудит), загрузка аватара отдельной multipart-ручкой
- исполнение POST /webhooks/{id}/{token} без сессии: content, username,
  avatar_url, файлы создателя вебхука, лимит 30/мин на вебхук
- клиент: пункт настроек «Комната» со списком вебхуков, копированием ссылки,
  пересозданием токена и удалением
- сообщения вебхуков: имя, аватар и значок в ленте вместо «неизвестного автора»
- fix: неполный ответ REST больше не затирает данные READY-снапшота
This commit is contained in:
2026-09-21 00:26:50 +03:00
parent 4ea2965892
commit 2e038a1d3f
32 changed files with 2494 additions and 23 deletions
+31 -3
View File
@@ -108,6 +108,7 @@
"back": "Back",
"copy": "Copy",
"copied": "Copied",
"delete": "Delete",
"yes": "Yes",
"no": "No",
"optional": "optional",
@@ -247,7 +248,8 @@
"inviteLink": "Invite link",
"inviteCopy": "Copy",
"inviteCopied": "Copied",
"inviteNew": "New link"
"inviteNew": "New link",
"settingsChannel": "Channel settings"
},
"voice": {
"title": "Voice room",
@@ -558,7 +560,9 @@
"channelCreated": "Room #{{name}} created",
"voiceChannelCreated": "Voice room {{name}} created",
"memberLeave": "{{name}} left the server"
}
},
"webhookBadge": "webhook",
"webhookAuthor": "webhook"
},
"user": {
"panelLabel": "User panel",
@@ -633,7 +637,8 @@
"server": "Server",
"voice": "Audio & video",
"language": "Language & region",
"instance": "Instance"
"instance": "Instance",
"channel": "Channel"
},
"profile": {
"avatar.change": "Change avatar",
@@ -1032,6 +1037,29 @@
"locale": "Interface language",
"localeHint": "Applies immediately.",
"saved": "Region settings saved."
},
"channel": {
"noGuild": "Pick a server to configure its channel.",
"noChannels": "This server has no text channels.",
"pick": "Channel",
"noPermission": "Only the server owner and members with MANAGE_WEBHOOKS can manage the channel.",
"webhooks": {
"title": "Webhooks",
"description": "A webhook posts messages to the channel without a user session: requests go to the tokenised URL.",
"empty": "No webhooks yet.",
"create": "Create webhook",
"name": "Webhook name",
"avatar": "Avatar",
"avatarHint": "PNG, JPEG, WebP or GIF up to 2 MB.",
"submit": "Create",
"rename": "Rename",
"rotate": "New link",
"url": "Webhook URL",
"createdAt": "created {{date}}",
"limit": "{{count}} used",
"deleteConfirm": "Delete the webhook? The link stops working, messages already sent stay.",
"stepUpBody": "Creating a webhook requires confirming your identity: enter your password{{totp}}."
}
}
}
}