From e08580925dad57830aba14ce5d5c57dbc05a16ff Mon Sep 17 00:00:00 2001 From: Branden J Brown Date: Mon, 9 Mar 2026 11:09:53 -0400 Subject: [PATCH] horsebot: make skill responses ephemeral with share button --- cmd/horsebot/main.go | 3 ++- cmd/horsebot/skill.go | 35 ++++++++++++++++++++++++++++------- 2 files changed, 30 insertions(+), 8 deletions(-) diff --git a/cmd/horsebot/main.go b/cmd/horsebot/main.go index 1a91070..6072187 100644 --- a/cmd/horsebot/main.go +++ b/cmd/horsebot/main.go @@ -84,7 +84,8 @@ func main() { r.Route("/skill", func(r handler.Router) { r.SlashCommand("/", skillSrv.slash) r.Autocomplete("/", skillSrv.autocomplete) - r.ButtonComponent("/{id}", skillSrv.button) + r.ButtonComponent("/swap/{id}", skillSrv.button) + r.ButtonComponent("/share/{id}", skillSrv.share) }) opts := []bot.ConfigOpt{bot.WithDefaultGateway(), bot.WithEventListeners(r)} diff --git a/cmd/horsebot/skill.go b/cmd/horsebot/skill.go index 6835c4d..8ca0960 100644 --- a/cmd/horsebot/skill.go +++ b/cmd/horsebot/skill.go @@ -2,6 +2,7 @@ package main import ( "fmt" + "log/slog" "strconv" "strings" @@ -64,8 +65,8 @@ func (s *skillServer) slash(data discord.SlashCommandInteractionData, e *handler id = int64(v) } m := discord.MessageCreate{ - Components: []discord.LayoutComponent{s.render(horse.SkillID(id))}, - Flags: discord.MessageFlagIsComponentsV2, + Components: []discord.LayoutComponent{s.render(horse.SkillID(id), false)}, + Flags: discord.MessageFlagIsComponentsV2 | discord.MessageFlagEphemeral, } return e.CreateMessage(m) } @@ -86,15 +87,32 @@ func (s *skillServer) button(data discord.ButtonInteractionData, e *handler.Comp return e.CreateMessage(m) } m := discord.MessageUpdate{ - Components: &[]discord.LayoutComponent{s.render(horse.SkillID(id))}, + Components: &[]discord.LayoutComponent{s.render(horse.SkillID(id), false)}, } return e.UpdateMessage(m) } -func (s *skillServer) render(id horse.SkillID) discord.ContainerComponent { +func (s *skillServer) share(data discord.ButtonInteractionData, e *handler.ComponentEvent) error { + id, err := strconv.ParseInt(e.Vars["id"], 10, 32) + if err != nil { + m := discord.MessageCreate{ + Content: "That button produced an invalid skill ID. That's not supposed to happen.", + Flags: discord.MessageFlagEphemeral, + } + return e.CreateMessage(m) + } + m := discord.MessageCreate{ + Components: []discord.LayoutComponent{s.render(horse.SkillID(id), true)}, + Flags: discord.MessageFlagIsComponentsV2, + } + return e.CreateMessage(m) +} + +func (s *skillServer) render(id horse.SkillID, share bool) discord.ContainerComponent { skill, ok := s.skills[id] if !ok { - return discord.NewContainer(discord.NewTextDisplayf("invalid skill ID %v made it to RenderSkill", id)) + slog.Error("invalid skill id", slog.Int("id", int(id)), slog.Bool("share", share)) + return discord.NewContainer(discord.NewTextDisplayf("invalid skill ID %v made it to render", id)) } thumburl := fmt.Sprintf("https://gametora.com/images/umamusume/skill_icons/utx_ico_skill_%d.png", skill.IconID) @@ -180,15 +198,18 @@ func (s *skillServer) render(id horse.SkillID) discord.ContainerComponent { rel = append(rel, s.skills[id]) } } - if len(rel) > 1 { + if len(rel) > 1 || !share { buttons := make([]discord.InteractiveComponent, 0, 4) for _, rs := range rel { - b := discord.NewSecondaryButton(rs.Name, fmt.Sprintf("/skill/%d", rs.ID)) + b := discord.NewSecondaryButton(rs.Name, fmt.Sprintf("/skill/swap/%d", rs.ID)) if rs.ID == id { b = b.AsDisabled() } buttons = append(buttons, b) } + if !share { + buttons = append(buttons, discord.NewPrimaryButton("Share", fmt.Sprintf("/skill/share/%d", skill.ID))) + } r.Components = append(r.Components, discord.NewActionRow(buttons...)) } return r