From 0646faae2a5ec7b2ea8e7675f68a18747004318b Mon Sep 17 00:00:00 2001 From: grendervill Date: Mon, 21 Sep 2026 01:32:48 +0300 Subject: [PATCH] =?UTF-8?q?fix(cosmetics):=20=D0=BE=D0=B1=D0=BB=D0=B0?= =?UTF-8?q?=D1=81=D1=82=D1=8C=20=D1=81=D1=82=D0=B8=D0=BB=D1=8F=20=D0=B2=20?= =?UTF-8?q?=D0=BE=D1=82=D0=B2=D0=B5=D1=82=D0=B5=20=D0=B8=20=D0=BE=D0=B6?= =?UTF-8?q?=D0=B8=D0=B4=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=B4=D0=B0=D0=BD=D0=BD?= =?UTF-8?q?=D1=8B=D1=85=20=D0=B2=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80?= =?UTF-8?q?=D0=BA=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - GET /users/@me/styles отдаёт запись для каждой области, даже если стиль ещё не задан: иначе клиент не мог выбрать пер-серверную область - живая проверка ждёт загрузки галереи и вариантов рамок - уточнён приоритет: эффект роли важнее личного стиля (AGENT.md 7.2) --- internal/server/api_cosmetics.go | 35 ++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/internal/server/api_cosmetics.go b/internal/server/api_cosmetics.go index 4a265de..7e045bc 100644 --- a/internal/server/api_cosmetics.go +++ b/internal/server/api_cosmetics.go @@ -345,7 +345,7 @@ func (s *Server) registerStyleRoutes(api huma.API) { } output := &styleListOutput{} 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].Badges, store.CosmeticBadge), colors)) @@ -362,12 +362,11 @@ func (s *Server) registerStyleRoutes(api huma.API) { return nil, humaError(err) } entry := scoped[user.ID] - payload := styleFromStore(byScope[scope], - grantedIDs(cosmetics, entry.GuildFrames, store.CosmeticFrame), - grantedIDs(cosmetics, entry.GuildBadges, store.CosmeticBadge), - colors) - payload.GuildName = guilds[i].Name - output.Body.Styles = append(output.Body.Styles, payload) + output.Body.Styles = append(output.Body.Styles, + styleFromStore(byScope[scope], scope, guilds[i].Name, + grantedIDs(cosmetics, entry.GuildFrames, store.CosmeticFrame), + grantedIDs(cosmetics, entry.GuildBadges, store.CosmeticBadge), + colors)) } return output, nil }) @@ -444,8 +443,13 @@ func (s *Server) registerStyleRoutes(api huma.API) { } frames := grantedIDs(cosmetics, grants[user.ID].Frames, store.CosmeticFrame) badges := grantedIDs(cosmetics, grants[user.ID].Badges, store.CosmeticBadge) + scope := scopeGlobal + guildName := "" + if guildID != nil { + scope = formatSnowflake(*guildID) + } 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) return output, nil }) @@ -618,15 +622,20 @@ func cosmeticsFromEffective(effective store.EffectiveCosmetics) *cosmeticsPayloa return payload } -// styleFromStore собирает ответ по личному стилю. -func styleFromStore(style *store.UserStyle, frames, badges []string, colors []int64) stylePayload { +// styleFromStore собирает ответ по области стиля: даже без записанного стиля +// запись отдаётся клиенту — в ней список доступных элементов (AGENT.md 7.2). +func styleFromStore(style *store.UserStyle, scope, guildName string, frames, badges []string, colors []int64) stylePayload { payload := stylePayload{ - Scope: scopeGlobal, + Scope: scope, + GuildName: guildName, FrameIDs: frames, BadgeIDs: badges, NickColors: colors, Effects: effectNames(), } + if scope != scopeGlobal { + payload.GuildID = scope + } if payload.FrameIDs == nil { payload.FrameIDs = []string{} } @@ -639,10 +648,6 @@ func styleFromStore(style *store.UserStyle, frames, badges []string, colors []in if style == nil { return payload } - if style.GuildID != nil { - payload.Scope = formatSnowflake(*style.GuildID) - payload.GuildID = formatSnowflake(*style.GuildID) - } if style.FrameID != nil { payload.Style.FrameID = formatSnowflake(*style.FrameID) }