This commit is contained in:
117
internal/admin/handler.go
Normal file
117
internal/admin/handler.go
Normal file
@@ -0,0 +1,117 @@
|
||||
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)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user