diff --git a/internal/bot/handlers.go b/internal/bot/handlers.go index 38b46fb..3d7b51a 100644 --- a/internal/bot/handlers.go +++ b/internal/bot/handlers.go @@ -109,6 +109,8 @@ func (h *Handler) HandleMessage(update tgbotapi.Update) { h.handleSetReportTime(msg) case "/setaccent": h.handleAccentMsg(msg) + case "/settimezone": + h.handleSetTimezone(msg) default: h.sendText(msg.Chat.ID, "Unknown command") } @@ -154,6 +156,8 @@ func (h *Handler) HandleCallback(update tgbotapi.Update) { h.calTypeCallback(chatID, msgID, cb.ID) case "accent": h.accentCallback(chatID, msgID, cb.ID) + case "timezone": + h.timezoneCallback(chatID, msgID, cb.ID) case "history": h.historyCallback(chatID, msgID, cb.ID) case "reporttoggle": @@ -344,6 +348,36 @@ func (h *Handler) handleAccentMsg(msg *tgbotapi.Message) { h.Bot.Send(reply) } +func (h *Handler) handleSetTimezone(msg *tgbotapi.Message) { + arg := msg.CommandArguments() + if arg == "" { + user, err := h.getOrCreateUser(msg.Chat.ID) + if err != nil { + h.sendText(msg.Chat.ID, "Error loading profile") + return + } + h.sendText(msg.Chat.ID, fmt.Sprintf("Current timezone: %s\nUsage: /settimezone \nExamples: Asia/Tehran, Europe/London, America/New_York", user.Timezone)) + return + } + loc, err := time.LoadLocation(arg) + if err != nil { + h.sendText(msg.Chat.ID, fmt.Sprintf("Invalid timezone: %s\nUse IANA format, e.g. Asia/Tehran, Europe/London", arg)) + return + } + user, err := h.getOrCreateUser(msg.Chat.ID) + if err != nil { + h.sendText(msg.Chat.ID, "Error loading profile") + return + } + user.Timezone = arg + if err := h.DB.UpdateUser(user); err != nil { + h.sendText(msg.Chat.ID, "Error saving timezone") + return + } + now := time.Now().In(loc) + h.sendText(msg.Chat.ID, fmt.Sprintf("Timezone set to %s (current time: %s)", arg, now.Format("15:04"))) +} + func (h *Handler) handleStart(msg *tgbotapi.Message) { user, err := h.getOrCreateUser(msg.Chat.ID) if err != nil { @@ -371,6 +405,7 @@ func (h *Handler) handleHelp(msg *tgbotapi.Message) { /reporttoggle - Enable/disable auto report /setreporttime HH:MM - Set daily report time /setaccent - Select accent color +/settimezone - Set your timezone (e.g. Asia/Tehran) Buttons on the main menu also work.` h.sendText(msg.Chat.ID, text) @@ -469,6 +504,9 @@ func (h *Handler) buildSettingsKeyboard(user *db.User) (string, tgbotapi.InlineK reportStatus = "enabled" } var rows [][]tgbotapi.InlineKeyboardButton + rows = append(rows, tgbotapi.NewInlineKeyboardRow( + tgbotapi.NewInlineKeyboardButtonData(fmt.Sprintf("Timezone: %s", user.Timezone), "timezone"), + )) rows = append(rows, tgbotapi.NewInlineKeyboardRow( tgbotapi.NewInlineKeyboardButtonData(fmt.Sprintf("Accent: %s", user.ExportAccent), "accent"), )) @@ -502,6 +540,23 @@ func (h *Handler) accentCallback(chatID int64, msgID int, callbackID string) { h.Bot.Send(edit) } +func (h *Handler) timezoneCallback(chatID int64, msgID int, callbackID string) { + defer h.Bot.Request(tgbotapi.NewCallback(callbackID, "")) + user, err := h.getOrCreateUser(chatID) + if err != nil { + return + } + text := fmt.Sprintf("Current timezone: %s\n\nUse /settimezone to change it.\nExamples: Asia/Tehran, Europe/London, America/New_York", user.Timezone) + kb := tgbotapi.NewInlineKeyboardMarkup( + tgbotapi.NewInlineKeyboardRow( + tgbotapi.NewInlineKeyboardButtonData("Back to Settings", "back_settings"), + ), + ) + edit := tgbotapi.NewEditMessageText(chatID, msgID, text) + edit.ReplyMarkup = &kb + h.Bot.Send(edit) +} + func (h *Handler) buildAccentKeyboard(user *db.User) (string, tgbotapi.InlineKeyboardMarkup) { accents := []struct { name string