package public import ( "context" "time" "velox-bot/internal/commands/timezone/shared" "velox-bot/internal/db/services" "github.com/bwmarrin/discordgo" ) var Timezone = &discordgo.ApplicationCommand{ Name: "timezone", Description: "Configure and view your timezone", Options: []*discordgo.ApplicationCommandOption{ { Type: discordgo.ApplicationCommandOptionSubCommand, Name: "set", Description: "Set your timezone (IANA name, e.g., Europe/Lisbon)", Options: []*discordgo.ApplicationCommandOption{ { Type: discordgo.ApplicationCommandOptionString, Name: "zone", Description: "Timezone (e.g., Europe/Lisbon, America/New_York)", Required: true, }, }, }, { Type: discordgo.ApplicationCommandOptionSubCommand, Name: "show", Description: "Show your current timezone", }, }, } func TimezoneHandler(s *discordgo.Session, i *discordgo.InteractionCreate) { if !shared.RequireUserSettingsService(s, i) { return } data := i.ApplicationCommandData() if len(data.Options) == 0 { handleShow(s, i) return } switch data.Options[0].Name { case "set": handleSet(s, i) case "show": handleShow(s, i) default: shared.RespondEphemeral(s, i, "Unknown subcommand.") } } func handleSet(s *discordgo.Session, i *discordgo.InteractionCreate) { userID, ok := shared.CurrentUserID(i) if !ok { shared.RespondEphemeral(s, i, "Could not determine your user ID.") return } data := i.ApplicationCommandData() if len(data.Options) == 0 { shared.RespondEphemeral(s, i, "Missing options.") return } opt := data.Options[0] var zone string for _, o := range opt.Options { if o.Name == "zone" { zone = o.StringValue() } } if zone == "" { shared.RespondEphemeral(s, i, "Timezone cannot be empty.") return } // Validate via service (which uses time.LoadLocation). if err := services.Global.UserSettings.SetTimezone(context.Background(), userID, zone); err != nil { shared.RespondEphemeral(s, i, "Invalid timezone. Use an IANA name like `Europe/Lisbon`.") return } loc, z, _, _ := services.Global.UserSettings.GetTimezone(context.Background(), userID) now := time.Now().In(loc).Format("2006-01-02 15:04") shared.RespondEphemeral(s, i, "Your timezone is now set to `"+z+"` (current local time: "+now+").") } func handleShow(s *discordgo.Session, i *discordgo.InteractionCreate) { userID, ok := shared.CurrentUserID(i) if !ok { shared.RespondEphemeral(s, i, "Could not determine your user ID.") return } loc, z, userDefined, err := services.Global.UserSettings.GetTimezone(context.Background(), userID) if err != nil { shared.RespondEphemeral(s, i, "Failed to load your timezone.") return } now := time.Now().In(loc).Format("2006-01-02 15:04") if userDefined { shared.RespondEphemeral(s, i, "Your timezone is `"+z+"` (current local time: "+now+").") } else { shared.RespondEphemeral(s, i, "You don't have a timezone set. Using `UTC` (current time: "+now+"). Use `/timezone set` to configure one.") } }