package admin import ( "context" "fmt" "log/slog" "time" "gitea.mrixs.me/Mrixs/yamusic-bot/internal/interfaces" tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5" ) // Handler обрабатывает команды администратора. type Handler struct { storage interfaces.TrackStorage telegram interfaces.TelegramClient yandex interfaces.YandexMusicClient startTime time.Time } // NewHandler создает новый обработчик команд администратора. func NewHandler(storage interfaces.TrackStorage, telegram interfaces.TelegramClient, yandex interfaces.YandexMusicClient, startTime time.Time) *Handler { return &Handler{ storage: storage, telegram: telegram, yandex: yandex, startTime: startTime, } } // HandleCommand обрабатывает входящую команду. func (h *Handler) HandleCommand(ctx context.Context, message *tgbotapi.Message) { command := message.Command() args := message.CommandArguments() slog.Info("Handling admin command", "user_id", message.From.ID, "command", command, "args", args) switch command { case "help": h.handleHelp(ctx, message.Chat.ID) case "stats": h.handleStats(ctx, message.Chat.ID) case "find": h.handleFind(ctx, message.Chat.ID, args) case "warm": h.handleWarm(ctx, message.Chat.ID, args) default: if err := h.telegram.SendMessage(ctx, message.Chat.ID, "Неизвестная команда. Используйте /help для списка команд."); err != nil { slog.Error("Failed to send 'unknown command' message", "error", err, "chat_id", message.Chat.ID) } } } func (h *Handler) handleHelp(ctx context.Context, chatID int64) { helpText := "Команды администратора:\n" + "/help - Показать это сообщение\n" + "/stats - Показать статистику бота\n" + "/find - Найти трек в кэше по ID\n" + "/warm - \"Прогреть\" кэш для альбома или исполнителя (в разработке)" if err := h.telegram.SendMessage(ctx, chatID, helpText); err != nil { slog.Error("Failed to send help message", "error", err, "chat_id", chatID) } } func (h *Handler) handleStats(ctx context.Context, chatID int64) { cachedTracks, err := h.storage.Count(ctx) if err != nil { slog.Error("Failed to get stats from storage", "error", err) if err := h.telegram.SendMessage(ctx, chatID, "Не удалось получить статистику из хранилища."); err != nil { slog.Error("Failed to send stats error message", "error", err, "chat_id", chatID) } return } uptime := time.Since(h.startTime).Round(time.Second) statsText := fmt.Sprintf( "📊 Статистика бота\n\n"+ "Время работы: %s\n"+ "Треков в кэше: %d", uptime, cachedTracks, ) if err := h.telegram.SendMessage(ctx, chatID, statsText); err != nil { slog.Error("Failed to send stats message", "error", err, "chat_id", chatID) } } func (h *Handler) handleFind(ctx context.Context, chatID int64, trackID string) { if trackID == "" { if err := h.telegram.SendMessage(ctx, chatID, "Пожалуйста, укажите Yandex Track ID. Пример: /find 123456"); err != nil { slog.Error("Failed to send 'missing args' message for /find", "error", err, "chat_id", chatID) } return } fileID, err := h.storage.Get(ctx, trackID) if err != nil { msg := fmt.Sprintf("Трек с ID `%s` не найден в кэше.", trackID) if err := h.telegram.SendMessage(ctx, chatID, msg); err != nil { slog.Error("Failed to send 'track not found' message for /find", "error", err, "chat_id", chatID) } return } msg := fmt.Sprintf("Трек найден! Telegram File ID: `%s`", fileID) if err := h.telegram.SendMessage(ctx, chatID, msg); err != nil { slog.Error("Failed to send 'track found' message for /find", "error", err, "chat_id", chatID) } } func (h *Handler) handleWarm(ctx context.Context, chatID int64, url string) { if err := h.telegram.SendMessage(ctx, chatID, "Команда /warm находится в разработке."); err != nil { slog.Error("Failed to send 'warm in development' message", "error", err, "chat_id", chatID) } }