118 lines
4.2 KiB
Go
118 lines
4.2 KiB
Go
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 <yandex_track_id> - Найти трек в кэше по ID\n" +
|
||
"/warm <URL> - \"Прогреть\" кэш для альбома или исполнителя (в разработке)"
|
||
|
||
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)
|
||
}
|
||
}
|