fix(cosmetics): область стиля в ответе и ожидание данных в проверке

- GET /users/@me/styles отдаёт запись для каждой области, даже если стиль ещё
  не задан: иначе клиент не мог выбрать пер-серверную область
- живая проверка ждёт загрузки галереи и вариантов рамок
- уточнён приоритет: эффект роли важнее личного стиля (AGENT.md 7.2)
This commit is contained in:
2026-09-21 01:32:48 +03:00
parent 48e30a1897
commit 0646faae2a
+20 -15
View File
@@ -345,7 +345,7 @@ func (s *Server) registerStyleRoutes(api huma.API) {
} }
output := &styleListOutput{} output := &styleListOutput{}
output.Body.Styles = append(output.Body.Styles, output.Body.Styles = append(output.Body.Styles,
styleFromStore(byScope[scopeGlobal], styleFromStore(byScope[scopeGlobal], scopeGlobal, "",
grantedIDs(cosmetics, grants[user.ID].Frames, store.CosmeticFrame), grantedIDs(cosmetics, grants[user.ID].Frames, store.CosmeticFrame),
grantedIDs(cosmetics, grants[user.ID].Badges, store.CosmeticBadge), grantedIDs(cosmetics, grants[user.ID].Badges, store.CosmeticBadge),
colors)) colors))
@@ -362,12 +362,11 @@ func (s *Server) registerStyleRoutes(api huma.API) {
return nil, humaError(err) return nil, humaError(err)
} }
entry := scoped[user.ID] entry := scoped[user.ID]
payload := styleFromStore(byScope[scope], output.Body.Styles = append(output.Body.Styles,
grantedIDs(cosmetics, entry.GuildFrames, store.CosmeticFrame), styleFromStore(byScope[scope], scope, guilds[i].Name,
grantedIDs(cosmetics, entry.GuildBadges, store.CosmeticBadge), grantedIDs(cosmetics, entry.GuildFrames, store.CosmeticFrame),
colors) grantedIDs(cosmetics, entry.GuildBadges, store.CosmeticBadge),
payload.GuildName = guilds[i].Name colors))
output.Body.Styles = append(output.Body.Styles, payload)
} }
return output, nil return output, nil
}) })
@@ -444,8 +443,13 @@ func (s *Server) registerStyleRoutes(api huma.API) {
} }
frames := grantedIDs(cosmetics, grants[user.ID].Frames, store.CosmeticFrame) frames := grantedIDs(cosmetics, grants[user.ID].Frames, store.CosmeticFrame)
badges := grantedIDs(cosmetics, grants[user.ID].Badges, store.CosmeticBadge) badges := grantedIDs(cosmetics, grants[user.ID].Badges, store.CosmeticBadge)
scope := scopeGlobal
guildName := ""
if guildID != nil {
scope = formatSnowflake(*guildID)
}
output := &styleOutput{} output := &styleOutput{}
output.Body.Style = styleFromStore(style, frames, badges, store.NickColorPalette()) output.Body.Style = styleFromStore(style, scope, guildName, frames, badges, store.NickColorPalette())
s.dispatchStyleUpdate(user.ID, guildID) s.dispatchStyleUpdate(user.ID, guildID)
return output, nil return output, nil
}) })
@@ -618,15 +622,20 @@ func cosmeticsFromEffective(effective store.EffectiveCosmetics) *cosmeticsPayloa
return payload return payload
} }
// styleFromStore собирает ответ по личному стилю. // styleFromStore собирает ответ по области стиля: даже без записанного стиля
func styleFromStore(style *store.UserStyle, frames, badges []string, colors []int64) stylePayload { // запись отдаётся клиенту — в ней список доступных элементов (AGENT.md 7.2).
func styleFromStore(style *store.UserStyle, scope, guildName string, frames, badges []string, colors []int64) stylePayload {
payload := stylePayload{ payload := stylePayload{
Scope: scopeGlobal, Scope: scope,
GuildName: guildName,
FrameIDs: frames, FrameIDs: frames,
BadgeIDs: badges, BadgeIDs: badges,
NickColors: colors, NickColors: colors,
Effects: effectNames(), Effects: effectNames(),
} }
if scope != scopeGlobal {
payload.GuildID = scope
}
if payload.FrameIDs == nil { if payload.FrameIDs == nil {
payload.FrameIDs = []string{} payload.FrameIDs = []string{}
} }
@@ -639,10 +648,6 @@ func styleFromStore(style *store.UserStyle, frames, badges []string, colors []in
if style == nil { if style == nil {
return payload return payload
} }
if style.GuildID != nil {
payload.Scope = formatSnowflake(*style.GuildID)
payload.GuildID = formatSnowflake(*style.GuildID)
}
if style.FrameID != nil { if style.FrameID != nil {
payload.Style.FrameID = formatSnowflake(*style.FrameID) payload.Style.FrameID = formatSnowflake(*style.FrameID)
} }