* Initial plan * Implement parameter support for /ytdlp command Co-authored-by: krau <71133316+krau@users.noreply.github.com> * Add comprehensive tests for ytdlp parameter parsing Co-authored-by: krau <71133316+krau@users.noreply.github.com> * Improve flag parsing logic and clarify argument order Co-authored-by: krau <71133316+krau@users.noreply.github.com> * Preserve critical defaults and improve comments Co-authored-by: krau <71133316+krau@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: krau <71133316+krau@users.noreply.github.com>
115 lines
3.8 KiB
Go
115 lines
3.8 KiB
Go
package handlers
|
|
|
|
import (
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/celestix/gotgproto/dispatcher"
|
|
"github.com/celestix/gotgproto/ext"
|
|
"github.com/charmbracelet/log"
|
|
"github.com/gotd/td/telegram/message/styling"
|
|
"github.com/krau/SaveAny-Bot/common/i18n"
|
|
"github.com/krau/SaveAny-Bot/common/i18n/i18nk"
|
|
"github.com/krau/SaveAny-Bot/core"
|
|
)
|
|
|
|
func handleTaskCmd(ctx *ext.Context, update *ext.Update) error {
|
|
logger := log.FromContext(ctx)
|
|
args := strings.Fields(update.EffectiveMessage.Text)
|
|
if len(args) == 1 {
|
|
showRunningTasks(ctx, update)
|
|
return dispatcher.EndGroups
|
|
}
|
|
|
|
switch args[1] {
|
|
case "running", "run", "r":
|
|
showRunningTasks(ctx, update)
|
|
case "queued", "queue", "q", "waiting":
|
|
showQueuedTasks(ctx, update)
|
|
case "cancel", "c":
|
|
if len(args) < 3 {
|
|
ctx.Reply(update, ext.ReplyTextString(i18n.T(i18nk.BotMsgTasksUsageCancel)), nil)
|
|
return dispatcher.EndGroups
|
|
}
|
|
taskID := args[2]
|
|
if err := core.CancelTask(ctx, taskID); err != nil {
|
|
logger.Errorf("Failed to cancel task %s: %v", taskID, err)
|
|
ctx.Reply(update, ext.ReplyTextString(i18n.T(i18nk.BotMsgTasksCancelFailed, map[string]any{"Error": err.Error()})), nil)
|
|
return dispatcher.EndGroups
|
|
}
|
|
ctx.Reply(update, ext.ReplyTextStyledTextArray([]styling.StyledTextOption{
|
|
styling.Plain(i18n.T(i18nk.BotMsgTasksCancelRequestedPrefix)),
|
|
styling.Code(taskID),
|
|
}), nil)
|
|
default:
|
|
ctx.Reply(update, ext.ReplyTextString(i18n.T(i18nk.BotMsgTasksUsage)), nil)
|
|
}
|
|
return dispatcher.EndGroups
|
|
}
|
|
|
|
func showRunningTasks(ctx *ext.Context, update *ext.Update) {
|
|
tasks := core.GetRunningTasks(ctx)
|
|
if len(tasks) == 0 {
|
|
ctx.Reply(update, ext.ReplyTextString(i18n.T(i18nk.BotMsgTasksRunningEmpty)), nil)
|
|
return
|
|
}
|
|
opts := make([]styling.StyledTextOption, 0, 2+len(tasks)*4)
|
|
opts = append(opts,
|
|
styling.Bold(i18n.T(i18nk.BotMsgTasksRunningTitle)),
|
|
styling.Plain(i18n.T(i18nk.BotMsgTasksTotalPrefix, map[string]any{"Count": len(tasks)})),
|
|
)
|
|
for _, t := range tasks {
|
|
created := t.Created.In(time.Local).Format("2006-01-02 15:04:05")
|
|
status := i18n.T(i18nk.BotMsgTasksStatusRunning)
|
|
if t.Cancelled {
|
|
status = i18n.T(i18nk.BotMsgTasksStatusCancelRequested)
|
|
}
|
|
opts = append(opts,
|
|
styling.Plain("\n"+i18n.T(i18nk.BotMsgTasksFieldId)),
|
|
styling.Code(t.ID),
|
|
styling.Plain("\n"+i18n.T(i18nk.BotMsgTasksFieldTitle)),
|
|
styling.Code(t.Title),
|
|
styling.Plain("\n"+i18n.T(i18nk.BotMsgTasksFieldCreated)),
|
|
styling.Code(created),
|
|
styling.Plain("\n"+i18n.T(i18nk.BotMsgTasksFieldStatus)),
|
|
styling.Code(status),
|
|
)
|
|
}
|
|
ctx.Reply(update, ext.ReplyTextStyledTextArray(opts), nil)
|
|
}
|
|
|
|
func showQueuedTasks(ctx *ext.Context, update *ext.Update) {
|
|
tasks := core.GetQueuedTasks(ctx)
|
|
if len(tasks) == 0 {
|
|
ctx.Reply(update, ext.ReplyTextString(i18n.T(i18nk.BotMsgTasksQueuedEmpty)), nil)
|
|
return
|
|
}
|
|
opts := make([]styling.StyledTextOption, 0, 2+len(tasks)*3)
|
|
opts = append(opts,
|
|
styling.Bold(i18n.T(i18nk.BotMsgTasksQueuedTitle)),
|
|
styling.Plain(i18n.T(i18nk.BotMsgTasksTotalPrefix, map[string]any{"Count": len(tasks)})),
|
|
)
|
|
for _, t := range tasks {
|
|
created := t.Created.In(time.Local).Format("2006-01-02 15:04:05")
|
|
status := i18n.T(i18nk.BotMsgTasksStatusQueued)
|
|
if t.Cancelled {
|
|
status = i18n.T(i18nk.BotMsgTasksStatusCancelRequested)
|
|
}
|
|
opts = append(opts,
|
|
styling.Plain("\n"+i18n.T(i18nk.BotMsgTasksFieldId)),
|
|
styling.Code(t.ID),
|
|
styling.Plain("\n"+i18n.T(i18nk.BotMsgTasksFieldTitle)),
|
|
styling.Code(t.Title),
|
|
styling.Plain("\n"+i18n.T(i18nk.BotMsgTasksFieldCreated)),
|
|
styling.Code(created),
|
|
styling.Plain("\n"+i18n.T(i18nk.BotMsgTasksFieldStatus)),
|
|
styling.Code(status),
|
|
)
|
|
if len(tasks) > 10 {
|
|
opts = append(opts, styling.Plain("\n"+i18n.T(i18nk.BotMsgTasksTruncatedNote, map[string]any{"Count": len(tasks)})))
|
|
break
|
|
}
|
|
}
|
|
ctx.Reply(update, ext.ReplyTextStyledTextArray(opts), nil)
|
|
}
|