diff --git a/bot/button/handlers/closerequestaccept.go b/bot/button/handlers/closerequestaccept.go index 6919dde2..ed0d4526 100644 --- a/bot/button/handlers/closerequestaccept.go +++ b/bot/button/handlers/closerequestaccept.go @@ -66,7 +66,7 @@ func (h *CloseRequestAcceptHandler) Execute(ctx *context.ButtonContext) { } ctx.Edit(command.MessageResponse{ - Embeds: utils.Slice(utils.BuildEmbedRaw(customisation.DefaultColours[customisation.Green], "Close Request", "Closing ticket...", nil, premium.Whitelabel)), // TODO: Translations, calculate premium level + Embeds: utils.Slice(utils.BuildEmbedRaw(utils.Ptr(customisation.DefaultColours[customisation.Green]), "Close Request", "Closing ticket...", nil, premium.Whitelabel)), // TODO: Translations, calculate premium level }) // Avoid users cant close issue diff --git a/bot/button/handlers/viewsurvey.go b/bot/button/handlers/viewsurvey.go index 9fd3fa04..3b0129a5 100644 --- a/bot/button/handlers/viewsurvey.go +++ b/bot/button/handlers/viewsurvey.go @@ -98,7 +98,7 @@ func (h *ViewSurveyHandler) Execute(ctx *context.ButtonContext) { e := embed.NewEmbed(). SetTitle("Exit Survey"). // TODO: i18n SetAuthor(opener.Username, "", opener.AvatarUrl(256)). - SetColor(ctx.GetColour(customisation.Green)) + SetColorPtr(ctx.GetColour(customisation.Green)) for _, answer := range surveyResponse.Responses { var title string diff --git a/bot/command/context/replyable.go b/bot/command/context/replyable.go index 95b221e5..0c6df138 100644 --- a/bot/command/context/replyable.go +++ b/bot/command/context/replyable.go @@ -34,7 +34,7 @@ import ( type Replyable struct { ctx registry.CommandContext - colourCodes map[customisation.Colour]int + colourCodes map[customisation.Colour]*int } type rateLimitResponse struct { @@ -44,18 +44,18 @@ type rateLimitResponse struct { } func NewReplyable(ctx registry.CommandContext) *Replyable { - var colourCodes map[customisation.Colour]int + var colourCodes map[customisation.Colour]*int if ctx.PremiumTier() > premium.None { // TODO: Propagate context tmp, err := customisation.GetColours(context.Background(), ctx.GuildId()) if err != nil { sentry.ErrorWithContext(err, ctx.ToErrorContext()) - colourCodes = customisation.DefaultColours + colourCodes = customisation.GetDefaultColours() } else { colourCodes = tmp } } else { - colourCodes = customisation.DefaultColours + colourCodes = customisation.GetDefaultColours() } return &Replyable{ @@ -64,8 +64,13 @@ func NewReplyable(ctx registry.CommandContext) *Replyable { } } -func (r *Replyable) GetColour(colour customisation.Colour) int { - return r.colourCodes[colour] +func (r *Replyable) GetColour(colour customisation.Colour) *int { + code := r.colourCodes[colour] + if code == nil { + return nil + } + + return utils.Ptr(*code) } func (r *Replyable) buildEmbed(colour customisation.Colour, title, content i18n.MessageId, fields []embed.EmbedField, format ...interface{}) *embed.Embed { diff --git a/bot/command/impl/general/help.go b/bot/command/impl/general/help.go index 60b83e1e..5d89ee56 100644 --- a/bot/command/impl/general/help.go +++ b/bot/command/impl/general/help.go @@ -95,7 +95,7 @@ func (c HelpCommand) Execute(ctx registry.CommandContext) { } embed := embed.NewEmbed(). - SetColor(ctx.GetColour(customisation.Green)). + SetColorPtr(ctx.GetColour(customisation.Green)). SetTitle(ctx.GetMessage(i18n.TitleHelp)) for _, category := range commandCategories.Keys() { diff --git a/bot/command/impl/settings/setup.go b/bot/command/impl/settings/setup.go index f2c8f47e..6e875f82 100644 --- a/bot/command/impl/settings/setup.go +++ b/bot/command/impl/settings/setup.go @@ -80,7 +80,7 @@ func (SetupCommand) Execute(ctx registry.CommandContext) { embed := embed.NewEmbed(). SetTitle("Setup"). - SetColor(getColour(context.Background(), ctx.GuildId(), failed)). // TODO: Propagate context + SetColorPtr(getColour(context.Background(), ctx.GuildId(), failed)). // TODO: Propagate context SetDescription(messageContent) ctx.ReplyWithEmbed(embed) @@ -132,7 +132,7 @@ func edit(ctx *cmdcontext.SlashCommandContext, e *embed.Embed) error { return err } -func getColour(ctx context.Context, guildId uint64, failed bool) int { +func getColour(ctx context.Context, guildId uint64, failed bool) *int { var colour customisation.Colour if failed { colour = customisation.Red @@ -140,8 +140,7 @@ func getColour(ctx context.Context, guildId uint64, failed bool) int { colour = customisation.Green } - hex, _ := customisation.GetColour(ctx, guildId, colour) - return hex + return customisation.GetColourOrDefault(ctx, guildId, colour) } func getTranscriptChannelData(guildId, supportRoleId, adminRoleId uint64) rest.CreateChannelData { diff --git a/bot/command/impl/tickets/switchpanel.go b/bot/command/impl/tickets/switchpanel.go index ca043f79..38b65911 100644 --- a/bot/command/impl/tickets/switchpanel.go +++ b/bot/command/impl/tickets/switchpanel.go @@ -198,7 +198,7 @@ func (SwitchPanelCommand) Execute(ctx *cmdcontext.SlashCommandContext, panelId i } for i := 1; i < len(embeds); i++ { - embeds[i].Color = embeds[0].Color + embeds[i].SetColorPtr(embeds[0].Color) } editData := rest.EditMessageData{ diff --git a/bot/command/registry/commandcontext.go b/bot/command/registry/commandcontext.go index c3a88b2d..b447885c 100644 --- a/bot/command/registry/commandcontext.go +++ b/bot/command/registry/commandcontext.go @@ -55,7 +55,7 @@ type CommandContext interface { HandleWarning(err error) GetMessage(messageId i18n.MessageId, format ...interface{}) string - GetColour(colour customisation.Colour) int + GetColour(colour customisation.Colour) *int // Utility functions Channel() (channel.PartialChannel, error) diff --git a/bot/customisation/colour.go b/bot/customisation/colour.go index 81f33a7e..5e662a03 100644 --- a/bot/customisation/colour.go +++ b/bot/customisation/colour.go @@ -37,55 +37,49 @@ func GetDefaultColour(colour Colour) int { return DefaultColours[colour] } +func GetDefaultColours() map[Colour]*int { + colours := make(map[Colour]*int, len(DefaultColours)) + for id, hex := range DefaultColours { + colours[id] = &hex + } + + return colours +} + +func defaultColour(colour Colour) *int { + hex := GetDefaultColour(colour) + return &hex +} + func IsValidColour(colour Colour) bool { _, valid := DefaultColours[colour] return valid } -func GetColours(ctx context.Context, guildId uint64) (map[Colour]int, error) { +func GetColours(ctx context.Context, guildId uint64) (map[Colour]*int, error) { raw, err := dbclient.Client.CustomColours.GetAll(ctx, guildId) if err != nil { - return DefaultColours, err + return GetDefaultColours(), err } - colours := make(map[Colour]int) + colours := GetDefaultColours() for id, hex := range raw { colours[Colour(id)] = hex } - for id, hex := range DefaultColours { - if _, ok := colours[id]; !ok { - colours[id] = hex - } - } - return colours, nil } // TODO: Premium check -func GetColour(ctx context.Context, guildId uint64, colourCode Colour) (int, error) { - colour, ok, err := dbclient.Client.CustomColours.Get(ctx, guildId, colourCode.Int16()) - if err != nil { - return 0, err - } - - if !ok { - return GetDefaultColour(colourCode), nil - } - - return colour, nil -} - -// TODO: Premium check -func GetColourOrDefault(ctx context.Context, guildId uint64, colourCode Colour) int { +func GetColourOrDefault(ctx context.Context, guildId uint64, colourCode Colour) *int { colour, ok, err := dbclient.Client.CustomColours.Get(ctx, guildId, colourCode.Int16()) if err != nil { sentry.Error(err) - return GetDefaultColour(colourCode) + return defaultColour(colourCode) } if !ok { - return GetDefaultColour(colourCode) + return defaultColour(colourCode) } return colour diff --git a/bot/listeners/guildcreate.go b/bot/listeners/guildcreate.go index 0282db3d..347eff05 100644 --- a/bot/listeners/guildcreate.go +++ b/bot/listeners/guildcreate.go @@ -79,7 +79,7 @@ func sendIntroMessage(ctx context.Context, worker *worker.Context, guild guild.G msg := embed.NewEmbed(). SetTitle("Tickets"). SetDescription(fmt.Sprintf("Thank you for inviting Tickets to your server! Below is a quick guide on setting up the bot, please don't hesitate to contact us in our [support server](%s) if you need any assistance!", config.Conf.Bot.SupportServerInvite)). - SetColor(customisation.GetColourOrDefault(ctx, guild.Id, customisation.Green)). + SetColorPtr(customisation.GetColourOrDefault(ctx, guild.Id, customisation.Green)). AddField("Setup", fmt.Sprintf("You can setup the bot using `/setup`, or you can use the [web dashboard](%s) which has additional options", config.Conf.Bot.DashboardUrl), false). AddField("Ticket Panels", fmt.Sprintf("Ticket panels are a commonly used feature of the bot. You can read about them [here](%s/setup/ticket-panels), or create one on the [web dashboard](%s/manage/%d/panels)", config.Conf.Bot.DocsUrl, config.Conf.Bot.DashboardUrl, guild.Id), false). AddField("Adding Staff", "To allow staff to answer tickets, you must let the bot know about them first. You can do this through\n`/addsupport [@User / @Role]` and `/addadmin [@User / @Role]`. While both Support and Admin can access the dashboard, Bot Admins can change the settings of the bot.", false). diff --git a/bot/logic/closeembed.go b/bot/logic/closeembed.go index 1b2df9d1..805de98c 100644 --- a/bot/logic/closeembed.go +++ b/bot/logic/closeembed.go @@ -159,13 +159,13 @@ func BuildCloseEmbed( colour, err := utils.GetColourForGuild(ctx, worker, customisation.Green, ticket.GuildId) if err != nil { sentry.Error(err) - colour = customisation.Green.Default() + colour = utils.Ptr(customisation.Green.Default()) } // TODO: Translate titles closeEmbed := embed.NewEmbed(). SetTitle("Ticket Closed"). - SetColor(colour). + SetColorPtr(colour). AddField(formatTitle("Ticket ID", customisation.EmojiId, worker.IsWhitelabel), strconv.Itoa(ticket.Id), true). AddField(formatTitle("Opened By", customisation.EmojiOpen, worker.IsWhitelabel), fmt.Sprintf("<@%d>", ticket.UserId), true). AddField(formatTitle("Closed By", customisation.EmojiClose, worker.IsWhitelabel), fmt.Sprintf("<@%d>", closedBy), true). diff --git a/bot/logic/open.go b/bot/logic/open.go index 9489aef5..92e6ca04 100644 --- a/bot/logic/open.go +++ b/bot/logic/open.go @@ -615,13 +615,8 @@ func OpenTicket(ctx context.Context, cmd registry.InteractionContext, panel *dat span := sentry.StartSpan(rootSpan.Context(), "Send out-of-hours warning") defer span.Finish() - colourHex := customisation.GetColourOrDefault(ctx, cmd.GuildId(), customisation.Red) - if outOfHoursColour != nil { - colourHex = *outOfHoursColour - } - warningEmbed := utils.BuildEmbedRaw( - colourHex, + outOfHoursColour, *outOfHoursTitle, *outOfHoursWarning, nil, diff --git a/bot/logic/validation.go b/bot/logic/validation.go index e9255ad9..fca34153 100644 --- a/bot/logic/validation.go +++ b/bot/logic/validation.go @@ -49,7 +49,6 @@ func replyIfPanelUnavailable(cmd registry.InteractionContext, panel *database.Pa // ValidatePanelAccess checks if the user can access the given panel. // Returns (canProceed, outOfHoursWarningTitle, outOfHoursWarning, outOfHoursColour, error). // outOfHoursWarning is non-nil when the panel is outside support hours but the behaviour is allow_with_warning. -// outOfHoursColour is non-nil when a custom colour is configured for the out-of-hours embed. func ValidatePanelAccess(ctx registry.InteractionContext, panel database.Panel) (bool, *string, *string, *int, error) { // Variables to hold out-of-hours warning info if behaviour is allow_with_warning var outOfHoursWarningTitle *string @@ -97,11 +96,7 @@ func ValidatePanelAccess(ctx registry.InteractionContext, panel database.Panel) outOfHoursMessage = settings.OutOfHoursMessage } - // Determine the custom colour (nil means use default) - var outOfHoursColour *int - if exists && settings.OutOfHoursColour != 0 { - outOfHoursColour = &settings.OutOfHoursColour - } + outOfHoursColour := resolveOutOfHoursColour(settings, exists, ctx.GetColour(customisation.Red)) behaviour := database.OutOfHoursBehaviourBlockCreation if exists { @@ -122,12 +117,8 @@ func ValidatePanelAccess(ctx registry.InteractionContext, panel database.Panel) outOfHoursWarningMessage = &outOfHoursMessage outOfHoursWarningColour = outOfHoursColour default: - if outOfHoursColour != nil { - embed := utils.BuildEmbedRaw(*outOfHoursColour, outOfHoursTitle, outOfHoursMessage, nil, ctx.PremiumTier()) - ctx.ReplyWith(command.NewEphemeralEmbedMessageResponse(embed)) - } else { - ctx.ReplyRaw(customisation.Red, outOfHoursTitle, outOfHoursMessage) - } + embed := utils.BuildEmbedRaw(outOfHoursColour, outOfHoursTitle, outOfHoursMessage, nil, ctx.PremiumTier()) + ctx.ReplyWith(command.NewEphemeralEmbedMessageResponse(embed)) return false, nil, nil, nil, nil } } @@ -183,3 +174,11 @@ func ValidatePanelAccess(ctx registry.InteractionContext, panel database.Panel) return true, outOfHoursWarningTitle, outOfHoursWarningMessage, outOfHoursWarningColour, nil } + +func resolveOutOfHoursColour(settings database.PanelSupportHoursSettings, exists bool, guildRed *int) *int { + if !exists { + return guildRed + } + + return settings.OutOfHoursColour +} diff --git a/bot/logic/welcomemessage.go b/bot/logic/welcomemessage.go index 59a5912e..4820bc3b 100644 --- a/bot/logic/welcomemessage.go +++ b/bot/logic/welcomemessage.go @@ -56,7 +56,7 @@ func SendWelcomeMessage( fields := getFormDataFields(formData) if len(fields) > 0 { formAnswersEmbed := embed.NewEmbed(). - SetColor(welcomeMessageEmbed.Color) + SetColorPtr(welcomeMessageEmbed.Color) for _, field := range fields { formAnswersEmbed.AddField(field.Name, utils.EscapeMarkdown(field.Value), field.Inline) @@ -834,7 +834,10 @@ func BuildCustomEmbed( Description: substitute(utils.ValueOrZero(customEmbed.Description)), Url: resolveAvatarUrl(utils.ValueOrZero(customEmbed.Url)), Timestamp: customEmbed.Timestamp, - Color: int(customEmbed.Colour), + } + + if customEmbed.Colour != nil { + e.SetColor(int(*customEmbed.Colour)) } if footer.ShowBranding { diff --git a/bot/utils/component_utils.go b/bot/utils/component_utils.go index a836ecb8..c453a499 100644 --- a/bot/utils/component_utils.go +++ b/bot/utils/component_utils.go @@ -49,7 +49,7 @@ func BuildContainerWithComponents[T string | i18n.MessageId](ctx registry.Comman } return component.BuildContainer(component.Container{ - AccentColor: Ptr(ctx.GetColour(colour)), + AccentColor: ctx.GetColour(colour), Components: components, }) } diff --git a/bot/utils/messageutils.go b/bot/utils/messageutils.go index 8ef99377..0d567587 100644 --- a/bot/utils/messageutils.go +++ b/bot/utils/messageutils.go @@ -24,7 +24,7 @@ func BuildEmbed( content := i18n.GetMessageFromGuild(ctx.GuildId(), contentId, format...) msgEmbed := embed.NewEmbed(). - SetColor(ctx.GetColour(colour)). + SetColorPtr(ctx.GetColour(colour)). SetTitle(title). SetDescription(content) @@ -40,10 +40,10 @@ func BuildEmbed( } func BuildEmbedRaw( - colourHex int, title, content string, fields []embed.EmbedField, tier premium.PremiumTier, + colour *int, title, content string, fields []embed.EmbedField, tier premium.PremiumTier, ) *embed.Embed { msgEmbed := embed.NewEmbed(). - SetColor(colourHex). + SetColorPtr(colour). SetTitle(title). SetDescription(content) @@ -58,23 +58,23 @@ func BuildEmbedRaw( return msgEmbed } -func GetColourForGuild(ctx context.Context, worker *worker.Context, colour customisation.Colour, guildId uint64) (int, error) { +func GetColourForGuild(ctx context.Context, worker *worker.Context, colour customisation.Colour, guildId uint64) (*int, error) { premiumTier, err := PremiumClient.GetTierByGuildId(ctx, guildId, true, worker.Token, worker.RateLimiter) if err != nil { - return 0, err + return nil, err } if premiumTier > premium.None { colourCode, ok, err := dbclient.Client.CustomColours.Get(ctx, guildId, colour.Int16()) if err != nil { - return 0, err + return nil, err } else if !ok { - return colour.Default(), nil + return Ptr(colour.Default()), nil } else { return colourCode, nil } } else { - return colour.Default(), nil + return Ptr(colour.Default()), nil } } diff --git a/event/commandexecutor.go b/event/commandexecutor.go index d0472f79..425d42d3 100644 --- a/event/commandexecutor.go +++ b/event/commandexecutor.go @@ -236,7 +236,7 @@ func executeCommand( if errors.Is(err, ErrArgumentNotFound) { if worker.IsWhitelabel { content := `This command registration is outdated. Please ask the server administrators to visit the whitelabel dashboard and press "Create Slash Commands" again.` - embed := utils.BuildEmbedRaw(customisation.GetDefaultColour(customisation.Red), "Outdated Command", content, nil, premium.Whitelabel) + embed := utils.BuildEmbedRaw(utils.Ptr(customisation.GetDefaultColour(customisation.Red)), "Outdated Command", content, nil, premium.Whitelabel) res := command.NewEphemeralEmbedMessageResponse(embed) responseCh <- command.ResponseMessage{Data: res.IntoApplicationCommandData()} diff --git a/go.mod b/go.mod index e8f33ccf..f91b3e11 100644 --- a/go.mod +++ b/go.mod @@ -15,9 +15,9 @@ go 1.26.0 require ( cloud.google.com/go/profiler v0.4.2 github.com/TicketsBot-cloud/archiverclient v0.0.0-20251015181023-f0b66a074704 - github.com/TicketsBot-cloud/common v0.0.0-20260927072029-424264fc4be2 - github.com/TicketsBot-cloud/database v0.0.0-20261002063446-01dca52a987e - github.com/TicketsBot-cloud/gdl v0.0.0-20260927072153-8dbf0b284f57 + github.com/TicketsBot-cloud/common v0.0.0-20261022190115-887ce60dce1b + github.com/TicketsBot-cloud/database v0.0.0-20261022191045-27b0736fc5a3 + github.com/TicketsBot-cloud/gdl v0.0.0-20261022191043-9caa827c743a github.com/caarlos0/env/v10 v10.0.0 github.com/elliotchance/orderedmap v1.8.0 github.com/getsentry/sentry-go v0.32.0 @@ -37,9 +37,9 @@ require ( go.uber.org/atomic v1.11.0 go.uber.org/zap v1.28.0 golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 - golang.org/x/net v0.58.0 - golang.org/x/sync v0.23.0 - golang.org/x/tools v0.49.0 + golang.org/x/net v0.60.0 + golang.org/x/sync v0.24.0 + golang.org/x/tools v0.51.0 gopkg.in/alexcesaro/statsd.v2 v2.0.0 ) @@ -128,12 +128,12 @@ require ( go.opentelemetry.io/otel/trace v1.36.0 // indirect go.uber.org/multierr v1.11.0 // indirect golang.org/x/arch v0.17.0 // indirect - golang.org/x/crypto v0.57.0 // indirect + golang.org/x/crypto v0.58.0 // indirect golang.org/x/mod v0.41.0 // indirect golang.org/x/oauth2 v0.30.0 // indirect - golang.org/x/sys v0.48.0 // indirect - golang.org/x/term v0.46.0 // indirect - golang.org/x/text v0.42.0 // indirect + golang.org/x/sys v0.49.0 // indirect + golang.org/x/term v0.47.0 // indirect + golang.org/x/text v0.43.0 // indirect golang.org/x/time v0.11.0 // indirect google.golang.org/api v0.232.0 // indirect google.golang.org/genproto v0.0.0-20250505200425-f936aa4a68b2 // indirect diff --git a/go.sum b/go.sum index c4d63865..72dd11ea 100644 --- a/go.sum +++ b/go.sum @@ -27,12 +27,12 @@ github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0 github.com/ReneKroon/ttlcache v1.6.0/go.mod h1:DG6nbhXKUQhrExfwwLuZUdH7UnRDDRA1IW+nBuCssvs= github.com/TicketsBot-cloud/archiverclient v0.0.0-20251015181023-f0b66a074704 h1:liLfvCrzoJ89DXFHzsd1iK3cyP8s4i0CnZPRFEj53zg= github.com/TicketsBot-cloud/archiverclient v0.0.0-20251015181023-f0b66a074704/go.mod h1:Mux1bEPpOHwRw1wo6Fa6qJLJH9Erk9qv1yAIfLi1Wmw= -github.com/TicketsBot-cloud/common v0.0.0-20260927072029-424264fc4be2 h1:qeebeGGdrsDXrngOVrKMDt9G3JUTJwT/IEPTB61d46s= -github.com/TicketsBot-cloud/common v0.0.0-20260927072029-424264fc4be2/go.mod h1:yL+VPSYNVK5gxUkA+fbb0WdTjGfWXnr7ScfL0rwk29g= -github.com/TicketsBot-cloud/database v0.0.0-20261002063446-01dca52a987e h1:kZS42Mp+6wBhApK7zA6F1SX8ZYYG18cVRHB2ZDTvx94= -github.com/TicketsBot-cloud/database v0.0.0-20261002063446-01dca52a987e/go.mod h1:0fKn7nPX6KeljYNQtGQiuZ5aJ/TczgXvBhnbz+4GEc8= -github.com/TicketsBot-cloud/gdl v0.0.0-20260927072153-8dbf0b284f57 h1:cFlQplQOlJCb+JQfxny+MJTg4dMKyEAvzB50MrWRa1E= -github.com/TicketsBot-cloud/gdl v0.0.0-20260927072153-8dbf0b284f57/go.mod h1:CdwBR2egPtxUXjD2CgC9ZwfuB8dz9HPePM8nuG6dt7Y= +github.com/TicketsBot-cloud/common v0.0.0-20261022190115-887ce60dce1b h1:NpnVYVEX8Ca/ngmJgEmUj3jFI5agGjqoISiZ1L5xzMg= +github.com/TicketsBot-cloud/common v0.0.0-20261022190115-887ce60dce1b/go.mod h1:yL+VPSYNVK5gxUkA+fbb0WdTjGfWXnr7ScfL0rwk29g= +github.com/TicketsBot-cloud/database v0.0.0-20261022191045-27b0736fc5a3 h1:rTdFBsz3cSOrE4RR+1Q55MNWYdsp3DvzctuQTC9aDL8= +github.com/TicketsBot-cloud/database v0.0.0-20261022191045-27b0736fc5a3/go.mod h1:0fKn7nPX6KeljYNQtGQiuZ5aJ/TczgXvBhnbz+4GEc8= +github.com/TicketsBot-cloud/gdl v0.0.0-20261022191043-9caa827c743a h1:e5tzjv+rKBV87epE/Tv3/yADr4dCG5SoBrpqv28x6nE= +github.com/TicketsBot-cloud/gdl v0.0.0-20261022191043-9caa827c743a/go.mod h1:CdwBR2egPtxUXjD2CgC9ZwfuB8dz9HPePM8nuG6dt7Y= github.com/TicketsBot-cloud/logarchiver v0.0.0-20251018211319-7a7df5cacbdc h1:qTLNpCvIqM7UwZ6MdWQ9EztcDsIJfHh+VJdG+ULLEaA= github.com/TicketsBot-cloud/logarchiver v0.0.0-20251018211319-7a7df5cacbdc/go.mod h1:pZqkzPNNTqnwKZvCT8kCaTHxrG7HJbxZV83S0p7mmzM= github.com/TicketsBot/common v0.0.0-20240613013221-1e27eb8bfe37 h1:NC5fn+uAup0JxLiX85+bjVdyfUUXW3pKZYmp72/29hw= @@ -414,8 +414,8 @@ golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/crypto v0.20.0/go.mod h1:Xwo95rrVNIoSMx9wa1JroENMToLWn3RNVrTBpLHgZPQ= -golang.org/x/crypto v0.57.0 h1:3ZVCjf8Ggz7zneR/EHRVx68Ctf+2pmIMP2UFhh9cC6M= -golang.org/x/crypto v0.57.0/go.mod h1:Fdz0i5U6CoizGwLda9DttjSk6qlZo25zYNtR+ycvuZA= +golang.org/x/crypto v0.58.0 h1:COkYLr4k7nDI4r6QtMML2AfzeIswWHAJthLS6K/M/54= +golang.org/x/crypto v0.58.0/go.mod h1:Xh+kl5A+M0gMiWDytH2Hhr5Z7WbNCpv/eB/EFgfSk+w= golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 h1:y5zboxd6LQAqYIhHnB48p0ByQ/GnQx2BE33L8BOHQkI= golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6/go.mod h1:U6Lno4MTRCDY+Ba7aCcauB9T60gsv5s4ralQzP72ZoQ= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= @@ -434,15 +434,15 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= -golang.org/x/net v0.58.0 h1:ynWG7rqYi4ccpTEuPZ2QGWHktVEM9DMCj9yzDE0Q7To= -golang.org/x/net v0.58.0/go.mod h1:YwCddHnFlT7eLQqVprV19OnhLGtc5xOKgE0RyqgfWAU= +golang.org/x/net v0.60.0 h1:79p50tfZlm0J9YfoDsSi639qSXNGVwEzOPLCxM2FsYU= +golang.org/x/net v0.60.0/go.mod h1:2DA/G1UfVbCpQPeWTmMPGY7Cs2PkBkwu743bVX5PIVg= golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI= golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.23.0 h1:KameEIfc1IkluZyXWLn39Wd4tURc6GbCiISGiZm2bQk= -golang.org/x/sync v0.23.0/go.mod h1:sUUOizhqBxiL6pEWpqNLUiaJn1ShEbZ6BBqskPbjZm0= +golang.org/x/sync v0.24.0 h1:iqiDrGoDgyuvAKrhLQthUEzU/R378N78gXbBjxed7oA= +golang.org/x/sync v0.24.0/go.mod h1:sUUOizhqBxiL6pEWpqNLUiaJn1ShEbZ6BBqskPbjZm0= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -462,16 +462,16 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.48.0 h1:bbX/i/6MgT9BVLM9RT1thmxL04yeTAhbEz4SyadbXoo= -golang.org/x/sys v0.48.0/go.mod h1:hNLxWAXmnKAxqDtdwIYC4bM9oQPEecfsnNMuSxOs3og= +golang.org/x/sys v0.49.0 h1:XbzkgYJHdqh/8m2Uu0W/dQv8nktxx4BFHp1M0gROTXA= +golang.org/x/sys v0.49.0/go.mod h1:hNLxWAXmnKAxqDtdwIYC4bM9oQPEecfsnNMuSxOs3og= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= -golang.org/x/term v0.46.0 h1:3+OXuTbaKDgwk8jTi3aSLHRlmWqHEUDUtxnbFigO4YE= -golang.org/x/term v0.46.0/go.mod h1:+K02xbkittuwc0Am4abfA3Fc+XRGXkvBXNO88NCXPoc= +golang.org/x/term v0.47.0 h1:cpyOwQkr2Nzxe2p6KnrTG7Ei2wtzjsuSjhpXXepZ/BM= +golang.org/x/term v0.47.0/go.mod h1:efAfAuG6RKABvg1ArGebRkvX6LXul14SM67o2e4mUCY= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= @@ -481,8 +481,8 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.42.0 h1:JbOZXgfeCPU9gacVtYliJqOhD+zhrEqK4LfdpmlUZqI= -golang.org/x/text v0.42.0/go.mod h1:ojzP1Z+2QtioaF8DTtO8K5q7JWVVYwZKenzujK0Zd0E= +golang.org/x/text v0.43.0 h1:1QivrlhwAsnMOcqgOdl9my7s9OyZl8O5/UGUTJVXoWc= +golang.org/x/text v0.43.0/go.mod h1:hbSIYA/amXcRXTFSZqh8tWHEoqRvvbKPJ2uz/KU+a+s= golang.org/x/time v0.11.0 h1:/bpjEDfN9tkoN/ryeYHnv5hcMlc8ncjMcM4XBk5NWV0= golang.org/x/time v0.11.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -496,8 +496,8 @@ golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.49.0 h1:3NI7VXzL9+1WZD52Dx2ttoPwD5DWrFGpl9mFZDlmisI= -golang.org/x/tools v0.49.0/go.mod h1:SJNXV9DBKT0UbdttsQjbfJlAE/q+y36++zo3uL3N0Oo= +golang.org/x/tools v0.51.0 h1:k4Xc/1Om9jwkBJBo4NVLMSARBoWtK10mx+W5BnXCeAI= +golang.org/x/tools v0.51.0/go.mod h1:9eEncMayCV6zRMGhR5eZEC2iBx98qWcF1HZ9Z7wJOoA= golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=