feat(guilds): приватные комнаты — права доступа поверх серверных
Сервер:
- store: оверрайды всех комнат сервера одним запросом (без N+1) и снятие
оверрайда с признаком «был ли он»;
- API: PUT/DELETE /guilds/{id}/channels/{cid}/overwrites/{role|user}/{tid}
(права именами через `|`, как у ролей), step-up на изменение, проверка что
роль принадлежит серверу, а участник состоит в нём;
- список комнат отдаёт permission_overwrites; после правки сбрасывается кэш
прав комнаты, пишется аудит (channel.overwrite_set/delete) и уходит событие
GUILD_CHANNELS_SYNC — видимость комнаты меняется у всех участников.
Клиент:
- редактор «Доступ к комнате»: приватность одним переключателем (запрет
VIEW_CHANNEL для @everyone), права просмотра/переписки/входа для ролей и
участников, подтверждение личности по требованию сервера;
- в настройках комнаты теперь и голосовые комнаты (фон и права), вебхуки —
только у текстовых; событие GUILD_CHANNELS_SYNC перечитывает список комнат.
Тесты: 2 Go-теста (скрытие и открытие комнаты ролями, проверка цели и прав) и
3 web-теста редактора (маски, step-up, скрытие без MANAGE_ROLES).
This commit is contained in:
@@ -832,7 +832,7 @@ func (s *Server) handleChannelBackgroundUpload(w http.ResponseWriter, r *http.Re
|
||||
s.invalidateGuild(*channel.GuildID)
|
||||
s.recordAudit(ctx, user, *channel.GuildID, "channel.background", "channel", &channelID, "")
|
||||
}
|
||||
payload := channelFromStore(*updated, nil)
|
||||
payload := channelFromStore(*updated, nil, nil)
|
||||
s.dispatchChannelEvent(ctx, channelID, "CHANNEL_UPDATE", payload)
|
||||
httpxWriteJSON(w, http.StatusOK, map[string]any{"channel": payload})
|
||||
}
|
||||
@@ -861,7 +861,7 @@ func (s *Server) handleChannelBackgroundDelete(w http.ResponseWriter, r *http.Re
|
||||
s.invalidateGuild(*channel.GuildID)
|
||||
s.recordAudit(ctx, user, *channel.GuildID, "channel.background_remove", "channel", &channelID, "")
|
||||
}
|
||||
payload := channelFromStore(*updated, nil)
|
||||
payload := channelFromStore(*updated, nil, nil)
|
||||
s.dispatchChannelEvent(ctx, channelID, "CHANNEL_UPDATE", payload)
|
||||
httpxWriteJSON(w, http.StatusOK, map[string]any{"channel": payload})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user