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:
@@ -58,6 +58,11 @@ type messagePayload struct {
|
||||
Mentions []string `json:"mentions"`
|
||||
Reactions []reactionPayload `json:"reactions"`
|
||||
CreatedAt string `json:"created_at"`
|
||||
// Поля вебхука (AGENT.md 7.11): у таких сообщений нет автора-пользователя,
|
||||
// а имя и аватар отправителя лежат в самом сообщении.
|
||||
WebhookID string `json:"webhook_id,omitempty"`
|
||||
WebhookName string `json:"webhook_name,omitempty"`
|
||||
WebhookAvatar string `json:"webhook_avatar,omitempty"`
|
||||
}
|
||||
|
||||
type messageListOutput struct {
|
||||
@@ -861,6 +866,11 @@ func (s *Server) messagePayload(ctx context.Context, message *store.Message, vie
|
||||
if message.AuthorID != nil {
|
||||
payload.AuthorID = formatSnowflake(*message.AuthorID)
|
||||
}
|
||||
if message.WebhookID != nil {
|
||||
payload.WebhookID = formatSnowflake(*message.WebhookID)
|
||||
}
|
||||
payload.WebhookName = message.WebhookName
|
||||
payload.WebhookAvatar = message.WebhookAvatar
|
||||
if message.ReplyToID != nil {
|
||||
payload.ReplyToID = formatSnowflake(*message.ReplyToID)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user