diff --git a/cmd/abuseReport/insert.go b/cmd/abuseReport/insert.go index 6606a03..df0dc20 100644 --- a/cmd/abuseReport/insert.go +++ b/cmd/abuseReport/insert.go @@ -20,6 +20,7 @@ import ( const ( insertTool = "abuseReport-insert" + insertConfirm = "Report abuse for %s %s" insertShort = "Insert an abuse report" insertLong = "Insert an abuse report. Use this tool to report abusive content on YouTube such as spam, harassment, or violent content." insertExample = `# Report a video as spam @@ -49,7 +50,6 @@ var insertInSchema = &jsonschema.Schema{ Type: "string", Enum: []any{"json", "yaml", "silent"}, Description: pkg.SilentUsage, Default: jsontext.Value(`"yaml"`), }, - "confirmed": {Type: "boolean", Description: pkg.ConfirmedUsage}, }, } @@ -63,13 +63,15 @@ func init() { OpenWorldHint: new(true), ReadOnlyHint: false, }, - }, cobramcp.GenToolHandler( - insertTool, func(input abuseReport.AbuseReport, writer io.Writer) error { - if !input.Confirmed { - return utils.ErrNotConfirmed - } - return input.Insert(writer) - }, + }, cobramcp.GenToolHandlerWithMRTR( + insertTool, cobramcp.ConfirmThen( + func(input abuseReport.AbuseReport) string { + return fmt.Sprintf(insertConfirm, input.SubjectTypeId, input.SubjectId) + }, + func(input abuseReport.AbuseReport, w io.Writer) error { + return input.Insert(w) + }, + ), ), ) abuseReportCmd.AddCommand(insertCmd) @@ -106,8 +108,9 @@ var insertCmd = &cobra.Command{ Long: insertLong, Example: insertExample, PreRunE: func(c *cobra.Command, _ []string) error { - msg := fmt.Sprintf("Would report abuse for %s %s", subjectTypeId, subjectId) - return utils.ConfirmPreRun(c, msg) + return utils.ConfirmPreRun( + c, fmt.Sprintf(insertConfirm, subjectTypeId, subjectId), + ) }, Run: func(c *cobra.Command, _ []string) { output, _ := c.Flags().GetString("output") diff --git a/cmd/caption/delete.go b/cmd/caption/delete.go index 35408cd..acca074 100644 --- a/cmd/caption/delete.go +++ b/cmd/caption/delete.go @@ -21,6 +21,7 @@ import ( const ( deleteTool = "caption-delete" deleteIdsUsage = "IDs of the captions to delete" + deleteConfirm = "Delete caption(s): %s" deleteShort = "Delete captions" deleteLong = "Delete captions. Use this tool to delete captions of a video by IDs." deleteExample = `# Delete a caption by ID @@ -39,7 +40,6 @@ var deleteInSchema = &jsonschema.Schema{ }, "on_behalf_of": {Type: "string", Description: pkg.OBOUsage}, "on_behalf_of_content_owner": {Type: "string", Description: pkg.OBOCOUsage}, - "confirmed": {Type: "boolean", Description: pkg.ConfirmedUsage}, }, } @@ -53,13 +53,15 @@ func init() { OpenWorldHint: new(true), ReadOnlyHint: false, }, - }, cobramcp.GenToolHandler( - deleteTool, func(input caption.Caption, writer io.Writer) error { - if !input.Confirmed { - return utils.ErrNotConfirmed - } - return input.Delete(writer) - }, + }, cobramcp.GenToolHandlerWithMRTR( + deleteTool, cobramcp.ConfirmThen( + func(input caption.Caption) string { + return fmt.Sprintf(deleteConfirm, strings.Join(input.Ids, ", ")) + }, + func(input caption.Caption, w io.Writer) error { + return input.Delete(w) + }, + ), ), ) captionCmd.AddCommand(deleteCmd) @@ -79,8 +81,9 @@ var deleteCmd = &cobra.Command{ Long: deleteLong, Example: deleteExample, PreRunE: func(c *cobra.Command, _ []string) error { - msg := fmt.Sprintf("Would delete caption(s): %s", strings.Join(ids, ", ")) - return utils.ConfirmPreRun(c, msg) + return utils.ConfirmPreRun( + c, fmt.Sprintf(deleteConfirm, strings.Join(ids, ", ")), + ) }, Run: func(c *cobra.Command, _ []string) { input := caption.NewCaption( diff --git a/cmd/caption/insert.go b/cmd/caption/insert.go index bdb741e..d56b7dd 100644 --- a/cmd/caption/insert.go +++ b/cmd/caption/insert.go @@ -20,6 +20,7 @@ import ( const ( insertTool = "caption-insert" + insertConfirm = "Upload caption for video: %s" insertShort = "Insert a caption" insertLong = "Insert a caption. Use this tool to insert a caption to a video." insertExample = `# Insert a caption to a video @@ -60,7 +61,6 @@ var insertInSchema = &jsonschema.Schema{ Enum: []any{"json", "yaml", "silent"}, Default: jsontext.Value(`"yaml"`), }, - "confirmed": {Type: "boolean", Description: pkg.ConfirmedUsage}, }, } @@ -74,13 +74,15 @@ func init() { OpenWorldHint: new(true), ReadOnlyHint: false, }, - }, cobramcp.GenToolHandler( - insertTool, func(input caption.Caption, writer io.Writer) error { - if !input.Confirmed { - return utils.ErrNotConfirmed - } - return input.Insert(writer) - }, + }, cobramcp.GenToolHandlerWithMRTR( + insertTool, cobramcp.ConfirmThen( + func(input caption.Caption) string { + return fmt.Sprintf(insertConfirm, input.VideoId) + }, + func(input caption.Caption, w io.Writer) error { + return input.Insert(w) + }, + ), ), ) captionCmd.AddCommand(insertCmd) @@ -120,8 +122,7 @@ var insertCmd = &cobra.Command{ Long: insertLong, Example: insertExample, PreRunE: func(c *cobra.Command, _ []string) error { - msg := fmt.Sprintf("Would insert caption: %s", file) - return utils.ConfirmPreRun(c, msg) + return utils.ConfirmPreRun(c, fmt.Sprintf(insertConfirm, videoId)) }, Run: func(c *cobra.Command, _ []string) { output, _ := c.Flags().GetString("output") diff --git a/cmd/caption/update.go b/cmd/caption/update.go index 267acf2..3fb1377 100644 --- a/cmd/caption/update.go +++ b/cmd/caption/update.go @@ -20,6 +20,7 @@ import ( const ( updateTool = "caption-update" + updateConfirm = "Update caption for video: %s" updateShort = "Update a video caption" updateLong = "Update a video caption. Use this tool to update a video caption." updateExample = `# Publish a draft caption @@ -59,7 +60,6 @@ var updateInSchema = &jsonschema.Schema{ Enum: []any{"json", "yaml", "silent"}, Default: jsontext.Value(`"yaml"`), }, - "confirmed": {Type: "boolean", Description: pkg.ConfirmedUsage}, }, } @@ -73,13 +73,15 @@ func init() { OpenWorldHint: new(true), ReadOnlyHint: false, }, - }, cobramcp.GenToolHandler( - updateTool, func(input caption.Caption, writer io.Writer) error { - if !input.Confirmed { - return utils.ErrNotConfirmed - } - return input.Update(writer) - }, + }, cobramcp.GenToolHandlerWithMRTR( + updateTool, cobramcp.ConfirmThen( + func(input caption.Caption) string { + return fmt.Sprintf(updateConfirm, input.VideoId) + }, + func(input caption.Caption, w io.Writer) error { + return input.Update(w) + }, + ), ), ) captionCmd.AddCommand(updateCmd) @@ -118,8 +120,7 @@ var updateCmd = &cobra.Command{ Long: updateLong, Example: updateExample, PreRunE: func(c *cobra.Command, _ []string) error { - msg := fmt.Sprintf("Would update caption for video: %s", videoId) - return utils.ConfirmPreRun(c, msg) + return utils.ConfirmPreRun(c, fmt.Sprintf(updateConfirm, videoId)) }, Run: func(c *cobra.Command, _ []string) { output, _ := c.Flags().GetString("output") diff --git a/cmd/channel/update.go b/cmd/channel/update.go index abc7cbb..113a59c 100644 --- a/cmd/channel/update.go +++ b/cmd/channel/update.go @@ -22,6 +22,7 @@ import ( const ( updateTool = "channel-update" updateIdUsage = "ID of the channel to update" + updateConfirm = "Update channel: %s" updateShort = "Update channel information" updateLong = "Update channel information. Use this tool to update channel information." updateExample = `# Update channel description @@ -49,7 +50,6 @@ var updateInSchema = &jsonschema.Schema{ Type: "string", Enum: []any{"json", "yaml", "silent"}, Description: pkg.SilentUsage, Default: jsontext.Value(`"yaml"`), }, - "confirmed": {Type: "boolean", Description: pkg.ConfirmedUsage}, }, } @@ -63,13 +63,15 @@ func init() { OpenWorldHint: new(true), ReadOnlyHint: false, }, - }, cobramcp.GenToolHandler( - updateTool, func(input channel.Channel, writer io.Writer) error { - if !input.Confirmed { - return utils.ErrNotConfirmed - } - return input.Update(writer) - }, + }, cobramcp.GenToolHandlerWithMRTR( + updateTool, cobramcp.ConfirmThen( + func(input channel.Channel) string { + return fmt.Sprintf(updateConfirm, strings.Join(input.Ids, ", ")) + }, + func(input channel.Channel, w io.Writer) error { + return input.Update(w) + }, + ), ), ) channelCmd.AddCommand(updateCmd) @@ -95,8 +97,9 @@ var updateCmd = &cobra.Command{ Long: updateLong, Example: updateExample, PreRunE: func(c *cobra.Command, _ []string) error { - msg := fmt.Sprintf("Would update channel: %s", strings.Join(ids, ", ")) - return utils.ConfirmPreRun(c, msg) + return utils.ConfirmPreRun( + c, fmt.Sprintf(updateConfirm, strings.Join(ids, ", ")), + ) }, Run: func(c *cobra.Command, _ []string) { output, _ := c.Flags().GetString("output") diff --git a/cmd/channelBanner/insert.go b/cmd/channelBanner/insert.go index ce4706b..0e20d48 100644 --- a/cmd/channelBanner/insert.go +++ b/cmd/channelBanner/insert.go @@ -20,6 +20,7 @@ import ( const ( insertTool = "channelBanner-insert" + insertConfirm = "Insert channel banner: %s" insertShort = "Insert a channel banner" insertLong = "Insert a channel banner. Use this tool to upload a channel banner." insertExample = `# Upload a channel banner @@ -47,7 +48,6 @@ var insertInSchema = &jsonschema.Schema{ Type: "string", Enum: []any{"json", "yaml", "silent"}, Description: pkg.SilentUsage, Default: jsontext.Value(`"yaml"`), }, - "confirmed": {Type: "boolean", Description: pkg.ConfirmedUsage}, }, } @@ -61,14 +61,15 @@ func init() { OpenWorldHint: new(true), ReadOnlyHint: false, }, - }, cobramcp.GenToolHandler( - insertTool, - func(input channelBanner.ChannelBanner, writer io.Writer) error { - if !input.Confirmed { - return utils.ErrNotConfirmed - } - return input.Insert(writer) - }, + }, cobramcp.GenToolHandlerWithMRTR( + insertTool, cobramcp.ConfirmThen( + func(input channelBanner.ChannelBanner) string { + return fmt.Sprintf(insertConfirm, input.File) + }, + func(input channelBanner.ChannelBanner, w io.Writer) error { + return input.Insert(w) + }, + ), ), ) channelBannerCmd.AddCommand(insertCmd) @@ -94,8 +95,7 @@ var insertCmd = &cobra.Command{ Long: insertLong, Example: insertExample, PreRunE: func(c *cobra.Command, _ []string) error { - msg := fmt.Sprintf("Would insert channel banner: %s", file) - return utils.ConfirmPreRun(c, msg) + return utils.ConfirmPreRun(c, fmt.Sprintf(insertConfirm, file)) }, Run: func(c *cobra.Command, _ []string) { output, _ := c.Flags().GetString("output") diff --git a/cmd/channelSection/delete.go b/cmd/channelSection/delete.go index 36c5d8a..2ca12d1 100644 --- a/cmd/channelSection/delete.go +++ b/cmd/channelSection/delete.go @@ -21,6 +21,7 @@ import ( const ( deleteTool = "channelSection-delete" deleteIdsUsage = "Delete the channel sections with the given ids" + deleteConfirm = "Delete channel section(s): %s" deleteShort = "Delete channel sections" deleteLong = "Delete channel sections. Use this tool to delete channel sections by IDs." deleteExample = `# Delete a channel section by ID @@ -38,7 +39,6 @@ var deleteInSchema = &jsonschema.Schema{ Items: &jsonschema.Schema{Type: "string"}, }, "on_behalf_of_content_owner": {Type: "string", Description: pkg.OBOCOUsage}, - "confirmed": {Type: "boolean", Description: pkg.ConfirmedUsage}, }, } @@ -52,14 +52,15 @@ func init() { OpenWorldHint: new(true), ReadOnlyHint: false, }, - }, cobramcp.GenToolHandler( - deleteTool, - func(input channelSection.ChannelSection, writer io.Writer) error { - if !input.Confirmed { - return utils.ErrNotConfirmed - } - return input.Delete(writer) - }, + }, cobramcp.GenToolHandlerWithMRTR( + deleteTool, cobramcp.ConfirmThen( + func(input channelSection.ChannelSection) string { + return fmt.Sprintf(deleteConfirm, strings.Join(input.Ids, ", ")) + }, + func(input channelSection.ChannelSection, w io.Writer) error { + return input.Delete(w) + }, + ), ), ) channelSectionCmd.AddCommand(deleteCmd) @@ -78,10 +79,9 @@ var deleteCmd = &cobra.Command{ Long: deleteLong, Example: deleteExample, PreRunE: func(c *cobra.Command, _ []string) error { - msg := fmt.Sprintf( - "Would delete channel section(s): %s", strings.Join(ids, ", "), + return utils.ConfirmPreRun( + c, fmt.Sprintf(deleteConfirm, strings.Join(ids, ", ")), ) - return utils.ConfirmPreRun(c, msg) }, Run: func(c *cobra.Command, _ []string) { input := channelSection.NewChannelSection( diff --git a/cmd/comment/delete.go b/cmd/comment/delete.go index aa71fc6..b3fbab7 100644 --- a/cmd/comment/delete.go +++ b/cmd/comment/delete.go @@ -20,6 +20,7 @@ import ( const ( deleteTool = "comment-delete" + deleteConfirm = "Delete comment(s): %s" deleteShort = "Delete comments" deleteLong = "Delete comments. Use this tool to delete comments by IDs." deleteExample = `# Delete a comment by ID @@ -36,7 +37,6 @@ var deleteInSchema = &jsonschema.Schema{ Type: "array", Description: idsUsage, Items: &jsonschema.Schema{Type: "string"}, }, - "confirmed": {Type: "boolean", Description: pkg.ConfirmedUsage}, }, } @@ -50,13 +50,15 @@ func init() { OpenWorldHint: new(true), ReadOnlyHint: false, }, - }, cobramcp.GenToolHandler( - deleteTool, func(input comment.Comment, writer io.Writer) error { - if !input.Confirmed { - return utils.ErrNotConfirmed - } - return input.Delete(writer) - }, + }, cobramcp.GenToolHandlerWithMRTR( + deleteTool, cobramcp.ConfirmThen( + func(input comment.Comment) string { + return fmt.Sprintf(deleteConfirm, strings.Join(input.Ids, ", ")) + }, + func(input comment.Comment, w io.Writer) error { + return input.Delete(w) + }, + ), ), ) commentCmd.AddCommand(deleteCmd) @@ -72,8 +74,9 @@ var deleteCmd = &cobra.Command{ Long: deleteLong, Example: deleteExample, PreRunE: func(c *cobra.Command, _ []string) error { - msg := fmt.Sprintf("Would delete comment(s): %s", strings.Join(ids, ", ")) - return utils.ConfirmPreRun(c, msg) + return utils.ConfirmPreRun( + c, fmt.Sprintf(deleteConfirm, strings.Join(ids, ", ")), + ) }, Run: func(c *cobra.Command, _ []string) { input := comment.NewComment(comment.WithIds(ids)) diff --git a/cmd/comment/insert.go b/cmd/comment/insert.go index 8441059..505fe9e 100644 --- a/cmd/comment/insert.go +++ b/cmd/comment/insert.go @@ -21,6 +21,7 @@ import ( const ( insertTool = "comment-insert" insertPidUsage = "ID of the parent comment" + insertConfirm = "Insert comment on parent: %s" insertShort = "Create a comment" insertLong = "Create a comment. Use this tool to create a comment on a video." insertExample = `# Reply to a comment @@ -45,7 +46,6 @@ var insertInSchema = &jsonschema.Schema{ Type: "string", Enum: []any{"json", "yaml", "silent"}, Description: pkg.SilentUsage, Default: jsontext.Value(`"yaml"`), }, - "confirmed": {Type: "boolean", Description: pkg.ConfirmedUsage}, }, } @@ -59,13 +59,15 @@ func init() { OpenWorldHint: new(true), ReadOnlyHint: false, }, - }, cobramcp.GenToolHandler( - insertTool, func(input comment.Comment, writer io.Writer) error { - if !input.Confirmed { - return utils.ErrNotConfirmed - } - return input.Insert(writer) - }, + }, cobramcp.GenToolHandlerWithMRTR( + insertTool, cobramcp.ConfirmThen( + func(input comment.Comment) string { + return fmt.Sprintf(insertConfirm, input.ParentId) + }, + func(input comment.Comment, w io.Writer) error { + return input.Insert(w) + }, + ), ), ) commentCmd.AddCommand(insertCmd) @@ -96,8 +98,7 @@ var insertCmd = &cobra.Command{ Long: insertLong, Example: insertExample, PreRunE: func(c *cobra.Command, _ []string) error { - msg := fmt.Sprintf("Would insert comment on parent: %s", parentId) - return utils.ConfirmPreRun(c, msg) + return utils.ConfirmPreRun(c, fmt.Sprintf(insertConfirm, parentId)) }, Run: func(c *cobra.Command, _ []string) { output, _ := c.Flags().GetString("output") diff --git a/cmd/comment/markAsSpam.go b/cmd/comment/markAsSpam.go index 3ef444e..7aa3f92 100644 --- a/cmd/comment/markAsSpam.go +++ b/cmd/comment/markAsSpam.go @@ -21,6 +21,7 @@ import ( const ( masTool = "comment-markAsSpam" + masConfirm = "Mark comment(s) as spam: %s" masShort = "Mark comments as spam" masLong = "Mark comments as spam. Use this tool to mark comments as spam." masExample = `# Mark a comment as spam @@ -41,7 +42,6 @@ var markAsSpamInSchema = &jsonschema.Schema{ Type: "string", Enum: []any{"json", "yaml", "silent"}, Description: pkg.SilentUsage, Default: jsontext.Value(`"yaml"`), }, - "confirmed": {Type: "boolean", Description: pkg.ConfirmedUsage}, }, } @@ -55,13 +55,15 @@ func init() { OpenWorldHint: new(true), ReadOnlyHint: false, }, - }, cobramcp.GenToolHandler( - masTool, func(input comment.Comment, writer io.Writer) error { - if !input.Confirmed { - return utils.ErrNotConfirmed - } - return input.MarkAsSpam(writer) - }, + }, cobramcp.GenToolHandlerWithMRTR( + masTool, cobramcp.ConfirmThen( + func(input comment.Comment) string { + return fmt.Sprintf(masConfirm, strings.Join(input.Ids, ", ")) + }, + func(input comment.Comment, w io.Writer) error { + return input.MarkAsSpam(w) + }, + ), ), ) commentCmd.AddCommand(markAsSpamCmd) @@ -78,10 +80,9 @@ var markAsSpamCmd = &cobra.Command{ Long: masLong, Example: masExample, PreRunE: func(c *cobra.Command, _ []string) error { - msg := fmt.Sprintf( - "Would mark comment(s) as spam: %s", strings.Join(ids, ", "), + return utils.ConfirmPreRun( + c, fmt.Sprintf(masConfirm, strings.Join(ids, ", ")), ) - return utils.ConfirmPreRun(c, msg) }, Run: func(c *cobra.Command, _ []string) { output, _ := c.Flags().GetString("output") diff --git a/cmd/comment/setModerationStatus.go b/cmd/comment/setModerationStatus.go index f95fd00..e965a52 100644 --- a/cmd/comment/setModerationStatus.go +++ b/cmd/comment/setModerationStatus.go @@ -21,6 +21,7 @@ import ( const ( smsTool = "comment-setModerationStatus" + smsConfirm = "Set moderation status of comment(s): %s to %s" smsShort = "Set comment moderation status" smsLong = "Set comment moderation status. Use this tool to set comment moderation status." smsExample = `# Publish a held comment @@ -48,7 +49,6 @@ var setModerationStatusInSchema = &jsonschema.Schema{ Type: "string", Enum: []any{"json", "yaml", "silent"}, Description: pkg.SilentUsage, Default: jsontext.Value(`"yaml"`), }, - "confirmed": {Type: "boolean", Description: pkg.ConfirmedUsage}, }, } @@ -63,13 +63,17 @@ func init() { OpenWorldHint: new(true), ReadOnlyHint: false, }, - }, cobramcp.GenToolHandler( - smsTool, func(input comment.Comment, writer io.Writer) error { - if !input.Confirmed { - return utils.ErrNotConfirmed - } - return input.SetModerationStatus(writer) - }, + }, cobramcp.GenToolHandlerWithMRTR( + smsTool, cobramcp.ConfirmThen( + func(input comment.Comment) string { + return fmt.Sprintf( + smsConfirm, strings.Join(input.Ids, ", "), input.ModerationStatus, + ) + }, + func(input comment.Comment, w io.Writer) error { + return input.SetModerationStatus(w) + }, + ), ), ) commentCmd.AddCommand(setModerationStatusCmd) @@ -95,11 +99,9 @@ var setModerationStatusCmd = &cobra.Command{ Long: smsLong, Example: smsExample, PreRunE: func(c *cobra.Command, _ []string) error { - msg := fmt.Sprintf( - "Would set moderation status of comment(s): %s to %s", - strings.Join(ids, ", "), moderationStatus, + return utils.ConfirmPreRun( + c, fmt.Sprintf(smsConfirm, strings.Join(ids, ", "), moderationStatus), ) - return utils.ConfirmPreRun(c, msg) }, Run: func(c *cobra.Command, _ []string) { output, _ := c.Flags().GetString("output") diff --git a/cmd/comment/update.go b/cmd/comment/update.go index 7888ff9..82a2432 100644 --- a/cmd/comment/update.go +++ b/cmd/comment/update.go @@ -22,6 +22,7 @@ import ( const ( updateTool = "comment-update" updateIdUsage = "ID of the comment" + updateConfirm = "Update comment: %s" updateShort = "Update a comment on a video" updateLong = "Update a comment on a video. Use this tool to update a comment on a video." updateExample = `# Update comment text @@ -50,7 +51,6 @@ var updateInSchema = &jsonschema.Schema{ Type: "string", Enum: []any{"json", "yaml", "silent"}, Description: pkg.SilentUsage, Default: jsontext.Value(`"yaml"`), }, - "confirmed": {Type: "boolean", Description: pkg.ConfirmedUsage}, }, } @@ -64,13 +64,15 @@ func init() { OpenWorldHint: new(true), ReadOnlyHint: false, }, - }, cobramcp.GenToolHandler( - updateTool, func(input comment.Comment, writer io.Writer) error { - if !input.Confirmed { - return utils.ErrNotConfirmed - } - return input.Update(writer) - }, + }, cobramcp.GenToolHandlerWithMRTR( + updateTool, cobramcp.ConfirmThen( + func(input comment.Comment) string { + return fmt.Sprintf(updateConfirm, strings.Join(input.Ids, ", ")) + }, + func(input comment.Comment, w io.Writer) error { + return input.Update(w) + }, + ), ), ) commentCmd.AddCommand(updateCmd) @@ -94,8 +96,9 @@ var updateCmd = &cobra.Command{ Long: updateLong, Example: updateExample, PreRunE: func(c *cobra.Command, _ []string) error { - msg := fmt.Sprintf("Would update comment: %s", strings.Join(ids, ", ")) - return utils.ConfirmPreRun(c, msg) + return utils.ConfirmPreRun( + c, fmt.Sprintf(updateConfirm, strings.Join(ids, ", ")), + ) }, Run: func(c *cobra.Command, _ []string) { output, _ := c.Flags().GetString("output") diff --git a/cmd/commentThread/insert.go b/cmd/commentThread/insert.go index 39122ba..ef98820 100644 --- a/cmd/commentThread/insert.go +++ b/cmd/commentThread/insert.go @@ -21,6 +21,7 @@ import ( const ( insertTool = "commentThread-insert" insertVidUsage = "ID of the video" + insertConfirm = "Insert comment thread on video: %s" insertShort = "Insert a new comment thread" insertLong = "Insert a new comment thread. Use this tool to insert a new comment thread." insertExample = `# Post a comment on a video @@ -43,7 +44,6 @@ var insertInSchema = &jsonschema.Schema{ Type: "string", Enum: []any{"json", "yaml", "silent"}, Description: pkg.SilentUsage, Default: jsontext.Value(`"yaml"`), }, - "confirmed": {Type: "boolean", Description: pkg.ConfirmedUsage}, }, } @@ -57,14 +57,15 @@ func init() { OpenWorldHint: new(true), ReadOnlyHint: false, }, - }, cobramcp.GenToolHandler( - insertTool, - func(input commentThread.CommentThread, writer io.Writer) error { - if !input.Confirmed { - return utils.ErrNotConfirmed - } - return input.Insert(writer) - }, + }, cobramcp.GenToolHandlerWithMRTR( + insertTool, cobramcp.ConfirmThen( + func(input commentThread.CommentThread) string { + return fmt.Sprintf(insertConfirm, input.VideoId) + }, + func(input commentThread.CommentThread, w io.Writer) error { + return input.Insert(w) + }, + ), ), ) commentThreadCmd.AddCommand(insertCmd) @@ -87,8 +88,7 @@ var insertCmd = &cobra.Command{ Long: insertLong, Example: insertExample, PreRunE: func(c *cobra.Command, _ []string) error { - msg := fmt.Sprintf("Would insert comment thread on video: %s", videoId) - return utils.ConfirmPreRun(c, msg) + return utils.ConfirmPreRun(c, fmt.Sprintf(insertConfirm, videoId)) }, Run: func(c *cobra.Command, _ []string) { output, _ := c.Flags().GetString("output") diff --git a/cmd/liveBroadcast/bind.go b/cmd/liveBroadcast/bind.go index 3d51b5c..08690aa 100644 --- a/cmd/liveBroadcast/bind.go +++ b/cmd/liveBroadcast/bind.go @@ -21,6 +21,7 @@ import ( const ( bindTool = "liveBroadcast-bind" + bindConfirm = "Bind live broadcast(s) %s to stream %s" bindShort = "Bind a live broadcast to a stream" bindLong = "Bind a live broadcast to a stream. Use this tool to bind or unbind a live stream to/from a live broadcast." bindExample = `# Bind a broadcast to a stream @@ -51,7 +52,6 @@ var bindInSchema = &jsonschema.Schema{ Type: "string", Enum: []any{"json", "yaml", "silent"}, Description: pkg.SilentUsage, Default: jsontext.Value(`"yaml"`), }, - "confirmed": {Type: "boolean", Description: pkg.ConfirmedUsage}, }, } @@ -65,13 +65,17 @@ func init() { OpenWorldHint: new(true), ReadOnlyHint: false, }, - }, cobramcp.GenToolHandler( - bindTool, func(input liveBroadcast.LiveBroadcast, writer io.Writer) error { - if !input.Confirmed { - return utils.ErrNotConfirmed - } - return input.Bind(writer) - }, + }, cobramcp.GenToolHandlerWithMRTR( + bindTool, cobramcp.ConfirmThen( + func(input liveBroadcast.LiveBroadcast) string { + return fmt.Sprintf( + bindConfirm, strings.Join(input.Ids, ", "), input.StreamId, + ) + }, + func(input liveBroadcast.LiveBroadcast, w io.Writer) error { + return input.Bind(w) + }, + ), ), ) liveBroadcastCmd.AddCommand(bindCmd) @@ -102,11 +106,9 @@ var bindCmd = &cobra.Command{ Long: bindLong, Example: bindExample, PreRunE: func(c *cobra.Command, _ []string) error { - msg := fmt.Sprintf( - "Would bind live broadcast(s) %s to stream %s", - strings.Join(ids, ", "), streamId, + return utils.ConfirmPreRun( + c, fmt.Sprintf(bindConfirm, strings.Join(ids, ", "), streamId), ) - return utils.ConfirmPreRun(c, msg) }, Run: func(c *cobra.Command, _ []string) { output, _ := c.Flags().GetString("output") diff --git a/cmd/liveBroadcast/delete.go b/cmd/liveBroadcast/delete.go index 68d6cfa..dcd6a29 100644 --- a/cmd/liveBroadcast/delete.go +++ b/cmd/liveBroadcast/delete.go @@ -20,6 +20,7 @@ import ( const ( deleteTool = "liveBroadcast-delete" + deleteConfirm = "Delete live broadcast(s): %s" deleteIdsUsage = "IDs of the live broadcasts to delete" deleteShort = "Delete live broadcasts" deleteLong = "Delete live broadcasts. Use this tool to delete live broadcasts by their IDs." @@ -41,7 +42,6 @@ var deleteInSchema = &jsonschema.Schema{ "on_behalf_of_content_owner_channel": { Type: "string", Description: obococUsage, }, - "confirmed": {Type: "boolean", Description: pkg.ConfirmedUsage}, }, } @@ -55,14 +55,15 @@ func init() { OpenWorldHint: new(true), ReadOnlyHint: false, }, - }, cobramcp.GenToolHandler( - deleteTool, - func(input liveBroadcast.LiveBroadcast, writer io.Writer) error { - if !input.Confirmed { - return utils.ErrNotConfirmed - } - return input.Delete(writer) - }, + }, cobramcp.GenToolHandlerWithMRTR( + deleteTool, cobramcp.ConfirmThen( + func(input liveBroadcast.LiveBroadcast) string { + return fmt.Sprintf(deleteConfirm, strings.Join(input.Ids, ", ")) + }, + func(input liveBroadcast.LiveBroadcast, w io.Writer) error { + return input.Delete(w) + }, + ), ), ) liveBroadcastCmd.AddCommand(deleteCmd) @@ -85,10 +86,9 @@ var deleteCmd = &cobra.Command{ Long: deleteLong, Example: deleteExample, PreRunE: func(c *cobra.Command, _ []string) error { - msg := fmt.Sprintf( - "Would delete live broadcast(s): %s", strings.Join(ids, ", "), + return utils.ConfirmPreRun( + c, fmt.Sprintf(deleteConfirm, strings.Join(ids, ", ")), ) - return utils.ConfirmPreRun(c, msg) }, Run: func(c *cobra.Command, _ []string) { input := liveBroadcast.NewLiveBroadcast( diff --git a/cmd/liveBroadcast/insert.go b/cmd/liveBroadcast/insert.go index 931945b..098a0ab 100644 --- a/cmd/liveBroadcast/insert.go +++ b/cmd/liveBroadcast/insert.go @@ -20,6 +20,7 @@ import ( const ( insertTool = "liveBroadcast-insert" + insertConfirm = "Create live broadcast: %s" insertShort = "Insert a live broadcast" insertLong = "Insert a live broadcast. Use this tool to create a new live broadcast for the authenticated user." insertExample = `# Create a public live broadcast @@ -53,7 +54,6 @@ var insertInSchema = &jsonschema.Schema{ Type: "string", Enum: []any{"json", "yaml", "silent"}, Description: pkg.SilentUsage, Default: jsontext.Value(`"yaml"`), }, - "confirmed": {Type: "boolean", Description: pkg.ConfirmedUsage}, }, } @@ -67,14 +67,15 @@ func init() { OpenWorldHint: new(true), ReadOnlyHint: false, }, - }, cobramcp.GenToolHandler( - insertTool, - func(input liveBroadcast.LiveBroadcast, writer io.Writer) error { - if !input.Confirmed { - return utils.ErrNotConfirmed - } - return input.Insert(writer) - }, + }, cobramcp.GenToolHandlerWithMRTR( + insertTool, cobramcp.ConfirmThen( + func(input liveBroadcast.LiveBroadcast) string { + return fmt.Sprintf(insertConfirm, input.Title) + }, + func(input liveBroadcast.LiveBroadcast, w io.Writer) error { + return input.Insert(w) + }, + ), ), ) liveBroadcastCmd.AddCommand(insertCmd) @@ -111,8 +112,7 @@ var insertCmd = &cobra.Command{ Long: insertLong, Example: insertExample, PreRunE: func(c *cobra.Command, _ []string) error { - msg := fmt.Sprintf("Would create live broadcast: %s", title) - return utils.ConfirmPreRun(c, msg) + return utils.ConfirmPreRun(c, fmt.Sprintf(insertConfirm, title)) }, Run: func(c *cobra.Command, _ []string) { output, _ := c.Flags().GetString("output") diff --git a/cmd/liveBroadcast/insertCuepoint.go b/cmd/liveBroadcast/insertCuepoint.go index 6fb65fa..22ce542 100644 --- a/cmd/liveBroadcast/insertCuepoint.go +++ b/cmd/liveBroadcast/insertCuepoint.go @@ -21,6 +21,7 @@ import ( const ( insertCuepointTool = "liveBroadcast-insertCuepoint" + insertCuepointConfirm = "Insert cuepoint into live broadcast(s): %s" insertCuepointShort = "Insert a cuepoint into a live broadcast" insertCuepointLong = "Insert a cuepoint into a live broadcast. Use this tool to insert an ad break cuepoint into a currently live broadcast." insertCuepointExample = `# Insert an ad cuepoint of 30 seconds @@ -52,7 +53,6 @@ var insertCuepointInSchema = &jsonschema.Schema{ Type: "string", Enum: []any{"json", "yaml", "silent"}, Description: pkg.SilentUsage, Default: jsontext.Value(`"yaml"`), }, - "confirmed": {Type: "boolean", Description: pkg.ConfirmedUsage}, }, } @@ -66,14 +66,17 @@ func init() { OpenWorldHint: new(true), ReadOnlyHint: false, }, - }, cobramcp.GenToolHandler( - insertCuepointTool, - func(input liveBroadcast.LiveBroadcast, writer io.Writer) error { - if !input.Confirmed { - return utils.ErrNotConfirmed - } - return input.InsertCuepoint(writer) - }, + }, cobramcp.GenToolHandlerWithMRTR( + insertCuepointTool, cobramcp.ConfirmThen( + func(input liveBroadcast.LiveBroadcast) string { + return fmt.Sprintf( + insertCuepointConfirm, strings.Join(input.Ids, ", "), + ) + }, + func(input liveBroadcast.LiveBroadcast, w io.Writer) error { + return input.InsertCuepoint(w) + }, + ), ), ) liveBroadcastCmd.AddCommand(insertCuepointCmd) @@ -111,11 +114,9 @@ var insertCuepointCmd = &cobra.Command{ Long: insertCuepointLong, Example: insertCuepointExample, PreRunE: func(c *cobra.Command, _ []string) error { - msg := fmt.Sprintf( - "Would insert cuepoint into live broadcast(s): %s", - strings.Join(ids, ", "), + return utils.ConfirmPreRun( + c, fmt.Sprintf(insertCuepointConfirm, strings.Join(ids, ", ")), ) - return utils.ConfirmPreRun(c, msg) }, Run: func(c *cobra.Command, _ []string) { output, _ := c.Flags().GetString("output") diff --git a/cmd/liveBroadcast/transition.go b/cmd/liveBroadcast/transition.go index 3276103..4d3c076 100644 --- a/cmd/liveBroadcast/transition.go +++ b/cmd/liveBroadcast/transition.go @@ -21,6 +21,7 @@ import ( const ( transitionTool = "liveBroadcast-transition" + transitionConfirm = "Transition live broadcast(s) %s to %s" transitionBsUsage = "Broadcast status to transition to (testing, live, complete)" transitionShort = "Transition a live broadcast" transitionLong = "Transition a live broadcast. Use this tool to change the status of a live broadcast (e.g., go live, end broadcast)." @@ -55,7 +56,6 @@ var transitionInSchema = &jsonschema.Schema{ Type: "string", Enum: []any{"json", "yaml", "silent"}, Description: pkg.SilentUsage, Default: jsontext.Value(`"yaml"`), }, - "confirmed": {Type: "boolean", Description: pkg.ConfirmedUsage}, }, } @@ -69,14 +69,18 @@ func init() { OpenWorldHint: new(true), ReadOnlyHint: false, }, - }, cobramcp.GenToolHandler( - transitionTool, - func(input liveBroadcast.LiveBroadcast, writer io.Writer) error { - if !input.Confirmed { - return utils.ErrNotConfirmed - } - return input.Transition(writer) - }, + }, cobramcp.GenToolHandlerWithMRTR( + transitionTool, cobramcp.ConfirmThen( + func(input liveBroadcast.LiveBroadcast) string { + return fmt.Sprintf( + transitionConfirm, strings.Join(input.Ids, ", "), + input.BroadcastStatus, + ) + }, + func(input liveBroadcast.LiveBroadcast, w io.Writer) error { + return input.Transition(w) + }, + ), ), ) liveBroadcastCmd.AddCommand(transitionCmd) @@ -109,11 +113,10 @@ var transitionCmd = &cobra.Command{ Long: transitionLong, Example: transitionExample, PreRunE: func(c *cobra.Command, _ []string) error { - msg := fmt.Sprintf( - "Would transition live broadcast(s) %s to %s", - strings.Join(ids, ", "), broadcastStatus, + return utils.ConfirmPreRun( + c, + fmt.Sprintf(transitionConfirm, strings.Join(ids, ", "), broadcastStatus), ) - return utils.ConfirmPreRun(c, msg) }, Run: func(c *cobra.Command, _ []string) { output, _ := c.Flags().GetString("output") diff --git a/cmd/liveBroadcast/update.go b/cmd/liveBroadcast/update.go index c191d38..2325795 100644 --- a/cmd/liveBroadcast/update.go +++ b/cmd/liveBroadcast/update.go @@ -21,6 +21,7 @@ import ( const ( updateTool = "liveBroadcast-update" + updateConfirm = "Update live broadcast: %s" updateIdUsage = "ID of the live broadcast to update" updateShort = "Update a live broadcast" updateLong = "Update a live broadcast. Use this tool to update an existing live broadcast's settings." @@ -54,7 +55,6 @@ var updateInSchema = &jsonschema.Schema{ Type: "string", Enum: []any{"json", "yaml", "silent"}, Description: pkg.SilentUsage, Default: jsontext.Value(`"yaml"`), }, - "confirmed": {Type: "boolean", Description: pkg.ConfirmedUsage}, }, } @@ -68,15 +68,16 @@ func init() { OpenWorldHint: new(true), ReadOnlyHint: false, }, - }, cobramcp.GenToolHandler( - updateTool, - func(input liveBroadcast.LiveBroadcast, writer io.Writer) error { - if !input.Confirmed { - return utils.ErrNotConfirmed - } - input.MaxResults = 1 - return input.Update(writer) - }, + }, cobramcp.GenToolHandlerWithMRTR( + updateTool, cobramcp.ConfirmThen( + func(input liveBroadcast.LiveBroadcast) string { + return fmt.Sprintf(updateConfirm, strings.Join(input.Ids, ", ")) + }, + func(input liveBroadcast.LiveBroadcast, w io.Writer) error { + input.MaxResults = 1 + return input.Update(w) + }, + ), ), ) liveBroadcastCmd.AddCommand(updateCmd) @@ -109,10 +110,9 @@ var updateCmd = &cobra.Command{ Long: updateLong, Example: updateExample, PreRunE: func(c *cobra.Command, _ []string) error { - msg := fmt.Sprintf( - "Would update live broadcast: %s", strings.Join(ids, ", "), + return utils.ConfirmPreRun( + c, fmt.Sprintf(updateConfirm, strings.Join(ids, ", ")), ) - return utils.ConfirmPreRun(c, msg) }, Run: func(c *cobra.Command, _ []string) { output, _ := c.Flags().GetString("output") diff --git a/cmd/liveChatBan/delete.go b/cmd/liveChatBan/delete.go index fec9f2e..e96a600 100644 --- a/cmd/liveChatBan/delete.go +++ b/cmd/liveChatBan/delete.go @@ -20,6 +20,7 @@ import ( const ( deleteTool = "liveChatBan-delete" + deleteConfirm = "Delete live chat ban(s): %s" deleteIdsUsage = "IDs of the live chat bans to delete" deleteShort = "Delete live chat bans" deleteLong = "Delete live chat bans. Use this tool to unban users from a live chat by ban IDs." @@ -37,7 +38,6 @@ var deleteInSchema = &jsonschema.Schema{ Type: "array", Description: deleteIdsUsage, Items: &jsonschema.Schema{Type: "string"}, }, - "confirmed": {Type: "boolean", Description: pkg.ConfirmedUsage}, }, } @@ -51,13 +51,15 @@ func init() { OpenWorldHint: new(true), ReadOnlyHint: false, }, - }, cobramcp.GenToolHandler( - deleteTool, func(input liveChatBan.LiveChatBan, writer io.Writer) error { - if !input.Confirmed { - return utils.ErrNotConfirmed - } - return input.Delete(writer) - }, + }, cobramcp.GenToolHandlerWithMRTR( + deleteTool, cobramcp.ConfirmThen( + func(input liveChatBan.LiveChatBan) string { + return fmt.Sprintf(deleteConfirm, strings.Join(input.Ids, ", ")) + }, + func(input liveChatBan.LiveChatBan, w io.Writer) error { + return input.Delete(w) + }, + ), ), ) liveChatBanCmd.AddCommand(deleteCmd) @@ -73,10 +75,9 @@ var deleteCmd = &cobra.Command{ Long: deleteLong, Example: deleteExample, PreRunE: func(c *cobra.Command, _ []string) error { - msg := fmt.Sprintf( - "Would delete live chat ban(s): %s", strings.Join(ids, ", "), + return utils.ConfirmPreRun( + c, fmt.Sprintf(deleteConfirm, strings.Join(ids, ", ")), ) - return utils.ConfirmPreRun(c, msg) }, Run: func(c *cobra.Command, _ []string) { input := liveChatBan.NewLiveChatBan( diff --git a/cmd/liveChatBan/insert.go b/cmd/liveChatBan/insert.go index 6d8316c..40e6cab 100644 --- a/cmd/liveChatBan/insert.go +++ b/cmd/liveChatBan/insert.go @@ -20,6 +20,7 @@ import ( const ( insertTool = "liveChatBan-insert" + insertConfirm = "Ban user %s in live chat %s" insertShort = "Insert a live chat ban" insertLong = "Insert a live chat ban. Use this tool to ban a user from a live chat." insertExample = `# Ban a user permanently @@ -44,7 +45,6 @@ var insertInSchema = &jsonschema.Schema{ Type: "string", Enum: []any{"json", "yaml", "silent"}, Description: pkg.SilentUsage, Default: jsontext.Value(`"yaml"`), }, - "confirmed": {Type: "boolean", Description: pkg.ConfirmedUsage}, }, } @@ -58,13 +58,17 @@ func init() { OpenWorldHint: new(true), ReadOnlyHint: false, }, - }, cobramcp.GenToolHandler( - insertTool, func(input liveChatBan.LiveChatBan, writer io.Writer) error { - if !input.Confirmed { - return utils.ErrNotConfirmed - } - return input.Insert(writer) - }, + }, cobramcp.GenToolHandlerWithMRTR( + insertTool, cobramcp.ConfirmThen( + func(input liveChatBan.LiveChatBan) string { + return fmt.Sprintf( + insertConfirm, input.BannedUserChannelId, input.LiveChatId, + ) + }, + func(input liveChatBan.LiveChatBan, w io.Writer) error { + return input.Insert(w) + }, + ), ), ) liveChatBanCmd.AddCommand(insertCmd) @@ -93,10 +97,9 @@ var insertCmd = &cobra.Command{ Long: insertLong, Example: insertExample, PreRunE: func(c *cobra.Command, _ []string) error { - msg := fmt.Sprintf( - "Would ban user %s in live chat %s", bannedUserChannelId, liveChatId, + return utils.ConfirmPreRun( + c, fmt.Sprintf(insertConfirm, bannedUserChannelId, liveChatId), ) - return utils.ConfirmPreRun(c, msg) }, Run: func(c *cobra.Command, _ []string) { output, _ := c.Flags().GetString("output") diff --git a/cmd/liveChatMessage/delete.go b/cmd/liveChatMessage/delete.go index 2fe747a..e9c118a 100644 --- a/cmd/liveChatMessage/delete.go +++ b/cmd/liveChatMessage/delete.go @@ -20,6 +20,7 @@ import ( const ( deleteTool = "liveChatMessage-delete" + deleteConfirm = "Delete live chat message(s): %s" deleteIdsUsage = "IDs of the live chat messages to delete" deleteShort = "Delete live chat messages" deleteLong = "Delete live chat messages. Use this tool to remove messages from a live chat by their IDs." @@ -37,7 +38,6 @@ var deleteInSchema = &jsonschema.Schema{ Type: "array", Description: deleteIdsUsage, Items: &jsonschema.Schema{Type: "string"}, }, - "confirmed": {Type: "boolean", Description: pkg.ConfirmedUsage}, }, } @@ -51,14 +51,15 @@ func init() { OpenWorldHint: new(true), ReadOnlyHint: false, }, - }, cobramcp.GenToolHandler( - deleteTool, - func(input liveChatMessage.LiveChatMessage, writer io.Writer) error { - if !input.Confirmed { - return utils.ErrNotConfirmed - } - return input.Delete(writer) - }, + }, cobramcp.GenToolHandlerWithMRTR( + deleteTool, cobramcp.ConfirmThen( + func(input liveChatMessage.LiveChatMessage) string { + return fmt.Sprintf(deleteConfirm, strings.Join(input.Ids, ", ")) + }, + func(input liveChatMessage.LiveChatMessage, w io.Writer) error { + return input.Delete(w) + }, + ), ), ) liveChatMessageCmd.AddCommand(deleteCmd) @@ -74,10 +75,9 @@ var deleteCmd = &cobra.Command{ Long: deleteLong, Example: deleteExample, PreRunE: func(c *cobra.Command, _ []string) error { - msg := fmt.Sprintf( - "Would delete live chat message(s): %s", strings.Join(ids, ", "), + return utils.ConfirmPreRun( + c, fmt.Sprintf(deleteConfirm, strings.Join(ids, ", ")), ) - return utils.ConfirmPreRun(c, msg) }, Run: func(c *cobra.Command, _ []string) { input := liveChatMessage.NewLiveChatMessage( diff --git a/cmd/liveChatMessage/insert.go b/cmd/liveChatMessage/insert.go index 3a4fa12..4e972a2 100644 --- a/cmd/liveChatMessage/insert.go +++ b/cmd/liveChatMessage/insert.go @@ -20,6 +20,7 @@ import ( const ( insertTool = "liveChatMessage-insert" + insertConfirm = "Send message to live chat %s" insertShort = "Send a live chat message" insertLong = "Send a live chat message. Use this tool to post a text message to a live chat." insertExample = `# Send a message to a live chat @@ -40,7 +41,6 @@ var insertInSchema = &jsonschema.Schema{ Type: "string", Enum: []any{"json", "yaml", "silent"}, Description: pkg.SilentUsage, Default: jsontext.Value(`"yaml"`), }, - "confirmed": {Type: "boolean", Description: pkg.ConfirmedUsage}, }, } @@ -54,14 +54,15 @@ func init() { OpenWorldHint: new(true), ReadOnlyHint: false, }, - }, cobramcp.GenToolHandler( - insertTool, - func(input liveChatMessage.LiveChatMessage, writer io.Writer) error { - if !input.Confirmed { - return utils.ErrNotConfirmed - } - return input.Insert(writer) - }, + }, cobramcp.GenToolHandlerWithMRTR( + insertTool, cobramcp.ConfirmThen( + func(input liveChatMessage.LiveChatMessage) string { + return fmt.Sprintf(insertConfirm, input.LiveChatId) + }, + func(input liveChatMessage.LiveChatMessage, w io.Writer) error { + return input.Insert(w) + }, + ), ), ) liveChatMessageCmd.AddCommand(insertCmd) @@ -83,8 +84,7 @@ var insertCmd = &cobra.Command{ Long: insertLong, Example: insertExample, PreRunE: func(c *cobra.Command, _ []string) error { - msg := fmt.Sprintf("Would send message to live chat %s", liveChatId) - return utils.ConfirmPreRun(c, msg) + return utils.ConfirmPreRun(c, fmt.Sprintf(insertConfirm, liveChatId)) }, Run: func(c *cobra.Command, _ []string) { output, _ := c.Flags().GetString("output") diff --git a/cmd/liveChatMessage/transition.go b/cmd/liveChatMessage/transition.go index 6ceb8c1..b108f53 100644 --- a/cmd/liveChatMessage/transition.go +++ b/cmd/liveChatMessage/transition.go @@ -21,6 +21,7 @@ import ( const ( transitionTool = "liveChatMessage-transition" + transitionConfirm = "Transition live chat message(s) %s to %s" transitionShort = "Transition a live chat message" transitionLong = "Transition a durable live chat event. Use this tool to change the status of a live chat message (e.g., close a poll)." transitionExample = `# Transition a live chat message to closed @@ -43,7 +44,6 @@ var transitionInSchema = &jsonschema.Schema{ Type: "string", Enum: []any{"json", "yaml", "silent"}, Description: pkg.SilentUsage, Default: jsontext.Value(`"yaml"`), }, - "confirmed": {Type: "boolean", Description: pkg.ConfirmedUsage}, }, } @@ -57,14 +57,17 @@ func init() { OpenWorldHint: new(true), ReadOnlyHint: false, }, - }, cobramcp.GenToolHandler( - transitionTool, - func(input liveChatMessage.LiveChatMessage, writer io.Writer) error { - if !input.Confirmed { - return utils.ErrNotConfirmed - } - return input.Transition(writer) - }, + }, cobramcp.GenToolHandlerWithMRTR( + transitionTool, cobramcp.ConfirmThen( + func(input liveChatMessage.LiveChatMessage) string { + return fmt.Sprintf( + transitionConfirm, strings.Join(input.Ids, ", "), input.Status, + ) + }, + func(input liveChatMessage.LiveChatMessage, w io.Writer) error { + return input.Transition(w) + }, + ), ), ) liveChatMessageCmd.AddCommand(transitionCmd) @@ -85,11 +88,9 @@ var transitionCmd = &cobra.Command{ Long: transitionLong, Example: transitionExample, PreRunE: func(c *cobra.Command, _ []string) error { - msg := fmt.Sprintf( - "Would transition live chat message(s) %s to status %s", - strings.Join(ids, ", "), status, + return utils.ConfirmPreRun( + c, fmt.Sprintf(transitionConfirm, strings.Join(ids, ", "), status), ) - return utils.ConfirmPreRun(c, msg) }, Run: func(c *cobra.Command, _ []string) { output, _ := c.Flags().GetString("output") diff --git a/cmd/liveChatModerator/delete.go b/cmd/liveChatModerator/delete.go index 9bd1fd0..b79e811 100644 --- a/cmd/liveChatModerator/delete.go +++ b/cmd/liveChatModerator/delete.go @@ -20,6 +20,7 @@ import ( const ( deleteTool = "liveChatModerator-delete" + deleteConfirm = "Delete live chat moderator(s): %s" deleteIdsUsage = "IDs of the live chat moderators to delete" deleteShort = "Delete live chat moderators" deleteLong = "Delete live chat moderators. Use this tool to remove moderators from a live chat by their IDs." @@ -37,7 +38,6 @@ var deleteInSchema = &jsonschema.Schema{ Type: "array", Description: deleteIdsUsage, Items: &jsonschema.Schema{Type: "string"}, }, - "confirmed": {Type: "boolean", Description: pkg.ConfirmedUsage}, }, } @@ -51,14 +51,15 @@ func init() { OpenWorldHint: new(true), ReadOnlyHint: false, }, - }, cobramcp.GenToolHandler( - deleteTool, - func(input liveChatModerator.LiveChatModerator, writer io.Writer) error { - if !input.Confirmed { - return utils.ErrNotConfirmed - } - return input.Delete(writer) - }, + }, cobramcp.GenToolHandlerWithMRTR( + deleteTool, cobramcp.ConfirmThen( + func(input liveChatModerator.LiveChatModerator) string { + return fmt.Sprintf(deleteConfirm, strings.Join(input.Ids, ", ")) + }, + func(input liveChatModerator.LiveChatModerator, w io.Writer) error { + return input.Delete(w) + }, + ), ), ) liveChatModeratorCmd.AddCommand(deleteCmd) @@ -74,10 +75,9 @@ var deleteCmd = &cobra.Command{ Long: deleteLong, Example: deleteExample, PreRunE: func(c *cobra.Command, _ []string) error { - msg := fmt.Sprintf( - "Would delete live chat moderator(s): %s", strings.Join(ids, ", "), + return utils.ConfirmPreRun( + c, fmt.Sprintf(deleteConfirm, strings.Join(ids, ", ")), ) - return utils.ConfirmPreRun(c, msg) }, Run: func(c *cobra.Command, _ []string) { input := liveChatModerator.NewLiveChatModerator( diff --git a/cmd/liveChatModerator/insert.go b/cmd/liveChatModerator/insert.go index bc5435f..992f598 100644 --- a/cmd/liveChatModerator/insert.go +++ b/cmd/liveChatModerator/insert.go @@ -20,6 +20,7 @@ import ( const ( insertTool = "liveChatModerator-insert" + insertConfirm = "Add moderator %s to live chat %s" insertShort = "Insert a live chat moderator" insertLong = "Insert a live chat moderator. Use this tool to add a moderator to a live chat." insertExample = `# Add a moderator to a live chat @@ -40,7 +41,6 @@ var insertInSchema = &jsonschema.Schema{ Type: "string", Enum: []any{"json", "yaml", "silent"}, Description: pkg.SilentUsage, Default: jsontext.Value(`"yaml"`), }, - "confirmed": {Type: "boolean", Description: pkg.ConfirmedUsage}, }, } @@ -54,14 +54,17 @@ func init() { OpenWorldHint: new(true), ReadOnlyHint: false, }, - }, cobramcp.GenToolHandler( - insertTool, - func(input liveChatModerator.LiveChatModerator, writer io.Writer) error { - if !input.Confirmed { - return utils.ErrNotConfirmed - } - return input.Insert(writer) - }, + }, cobramcp.GenToolHandlerWithMRTR( + insertTool, cobramcp.ConfirmThen( + func(input liveChatModerator.LiveChatModerator) string { + return fmt.Sprintf( + insertConfirm, input.ModeratorChannelId, input.LiveChatId, + ) + }, + func(input liveChatModerator.LiveChatModerator, w io.Writer) error { + return input.Insert(w) + }, + ), ), ) liveChatModeratorCmd.AddCommand(insertCmd) @@ -85,10 +88,9 @@ var insertCmd = &cobra.Command{ Long: insertLong, Example: insertExample, PreRunE: func(c *cobra.Command, _ []string) error { - msg := fmt.Sprintf( - "Would add moderator %s to live chat %s", moderatorChannelId, liveChatId, + return utils.ConfirmPreRun( + c, fmt.Sprintf(insertConfirm, moderatorChannelId, liveChatId), ) - return utils.ConfirmPreRun(c, msg) }, Run: func(c *cobra.Command, _ []string) { output, _ := c.Flags().GetString("output") diff --git a/cmd/liveStream/delete.go b/cmd/liveStream/delete.go index 7129cbb..7492e6b 100644 --- a/cmd/liveStream/delete.go +++ b/cmd/liveStream/delete.go @@ -20,6 +20,7 @@ import ( const ( deleteTool = "liveStream-delete" + deleteConfirm = "Delete live stream(s): %s" deleteIdsUsage = "IDs of the live streams to delete" deleteShort = "Delete live streams" deleteLong = "Delete live streams. Use this tool to delete live streams by their IDs." @@ -41,7 +42,6 @@ var deleteInSchema = &jsonschema.Schema{ "on_behalf_of_content_owner_channel": { Type: "string", Description: obococUsage, }, - "confirmed": {Type: "boolean", Description: pkg.ConfirmedUsage}, }, } @@ -55,13 +55,15 @@ func init() { OpenWorldHint: new(true), ReadOnlyHint: false, }, - }, cobramcp.GenToolHandler( - deleteTool, func(input liveStream.LiveStream, writer io.Writer) error { - if !input.Confirmed { - return utils.ErrNotConfirmed - } - return input.Delete(writer) - }, + }, cobramcp.GenToolHandlerWithMRTR( + deleteTool, cobramcp.ConfirmThen( + func(input liveStream.LiveStream) string { + return fmt.Sprintf(deleteConfirm, strings.Join(input.Ids, ", ")) + }, + func(input liveStream.LiveStream, w io.Writer) error { + return input.Delete(w) + }, + ), ), ) liveStreamCmd.AddCommand(deleteCmd) @@ -84,10 +86,9 @@ var deleteCmd = &cobra.Command{ Long: deleteLong, Example: deleteExample, PreRunE: func(c *cobra.Command, _ []string) error { - msg := fmt.Sprintf( - "Would delete live stream(s): %s", strings.Join(ids, ", "), + return utils.ConfirmPreRun( + c, fmt.Sprintf(deleteConfirm, strings.Join(ids, ", ")), ) - return utils.ConfirmPreRun(c, msg) }, Run: func(c *cobra.Command, _ []string) { input := liveStream.NewLiveStream( diff --git a/cmd/liveStream/insert.go b/cmd/liveStream/insert.go index 0ca842d..74fa707 100644 --- a/cmd/liveStream/insert.go +++ b/cmd/liveStream/insert.go @@ -20,6 +20,7 @@ import ( const ( insertTool = "liveStream-insert" + insertConfirm = "Create live stream: %s" insertShort = "Insert a live stream" insertLong = "Insert a live stream. Use this tool to create a new live stream for the authenticated user." insertExample = `# Create a live stream with RTMP at 1080p @@ -59,7 +60,6 @@ var insertInSchema = &jsonschema.Schema{ Type: "string", Enum: []any{"json", "yaml", "silent"}, Description: pkg.SilentUsage, Default: jsontext.Value(`"yaml"`), }, - "confirmed": {Type: "boolean", Description: pkg.ConfirmedUsage}, }, } @@ -73,13 +73,15 @@ func init() { OpenWorldHint: new(true), ReadOnlyHint: false, }, - }, cobramcp.GenToolHandler( - insertTool, func(input liveStream.LiveStream, writer io.Writer) error { - if !input.Confirmed { - return utils.ErrNotConfirmed - } - return input.Insert(writer) - }, + }, cobramcp.GenToolHandlerWithMRTR( + insertTool, cobramcp.ConfirmThen( + func(input liveStream.LiveStream) string { + return fmt.Sprintf(insertConfirm, input.Title) + }, + func(input liveStream.LiveStream, w io.Writer) error { + return input.Insert(w) + }, + ), ), ) liveStreamCmd.AddCommand(insertCmd) @@ -112,8 +114,7 @@ var insertCmd = &cobra.Command{ Long: insertLong, Example: insertExample, PreRunE: func(c *cobra.Command, _ []string) error { - msg := fmt.Sprintf("Would create live stream: %s", title) - return utils.ConfirmPreRun(c, msg) + return utils.ConfirmPreRun(c, fmt.Sprintf(insertConfirm, title)) }, Run: func(c *cobra.Command, _ []string) { output, _ := c.Flags().GetString("output") diff --git a/cmd/liveStream/update.go b/cmd/liveStream/update.go index 11a9365..2a904e3 100644 --- a/cmd/liveStream/update.go +++ b/cmd/liveStream/update.go @@ -21,6 +21,7 @@ import ( const ( updateTool = "liveStream-update" + updateConfirm = "Update live stream: %s" updateIdUsage = "ID of the live stream to update" updateShort = "Update a live stream" updateLong = "Update a live stream. Use this tool to update an existing live stream's settings." @@ -60,7 +61,6 @@ var updateInSchema = &jsonschema.Schema{ Type: "string", Enum: []any{"json", "yaml", "silent"}, Description: pkg.SilentUsage, Default: jsontext.Value(`"yaml"`), }, - "confirmed": {Type: "boolean", Description: pkg.ConfirmedUsage}, }, } @@ -74,14 +74,16 @@ func init() { OpenWorldHint: new(true), ReadOnlyHint: false, }, - }, cobramcp.GenToolHandler( - updateTool, func(input liveStream.LiveStream, writer io.Writer) error { - if !input.Confirmed { - return utils.ErrNotConfirmed - } - input.MaxResults = 1 - return input.Update(writer) - }, + }, cobramcp.GenToolHandlerWithMRTR( + updateTool, cobramcp.ConfirmThen( + func(input liveStream.LiveStream) string { + return fmt.Sprintf(updateConfirm, strings.Join(input.Ids, ", ")) + }, + func(input liveStream.LiveStream, w io.Writer) error { + input.MaxResults = 1 + return input.Update(w) + }, + ), ), ) liveStreamCmd.AddCommand(updateCmd) @@ -110,8 +112,9 @@ var updateCmd = &cobra.Command{ Long: updateLong, Example: updateExample, PreRunE: func(c *cobra.Command, _ []string) error { - msg := fmt.Sprintf("Would update live stream: %s", strings.Join(ids, ", ")) - return utils.ConfirmPreRun(c, msg) + return utils.ConfirmPreRun( + c, fmt.Sprintf(updateConfirm, strings.Join(ids, ", ")), + ) }, Run: func(c *cobra.Command, _ []string) { output, _ := c.Flags().GetString("output") diff --git a/cmd/playlist/delete.go b/cmd/playlist/delete.go index f59d3c8..7a6af58 100644 --- a/cmd/playlist/delete.go +++ b/cmd/playlist/delete.go @@ -21,6 +21,7 @@ import ( const ( deleteTool = "playlist-delete" deleteIdsUsage = "IDs of the playlists to delete" + deleteConfirm = "Delete playlist(s): %s" deleteShort = "Delete playlists" deleteLong = "Delete playlists. Use this tool to delete playlists by IDs." deleteExample = `# Delete a playlist by ID @@ -38,7 +39,6 @@ var deleteInSchema = &jsonschema.Schema{ Items: &jsonschema.Schema{Type: "string"}, }, "on_behalf_of_content_owner": {Type: "string", Description: pkg.OBOCOUsage}, - "confirmed": {Type: "boolean", Description: pkg.ConfirmedUsage}, }, } @@ -52,13 +52,15 @@ func init() { OpenWorldHint: new(true), ReadOnlyHint: false, }, - }, cobramcp.GenToolHandler( - deleteTool, func(input playlist.Playlist, writer io.Writer) error { - if !input.Confirmed { - return utils.ErrNotConfirmed - } - return input.Delete(writer) - }, + }, cobramcp.GenToolHandlerWithMRTR( + deleteTool, cobramcp.ConfirmThen( + func(input playlist.Playlist) string { + return fmt.Sprintf(deleteConfirm, strings.Join(input.Ids, ", ")) + }, + func(input playlist.Playlist, w io.Writer) error { + return input.Delete(w) + }, + ), ), ) playlistCmd.AddCommand(deleteCmd) @@ -77,8 +79,9 @@ var deleteCmd = &cobra.Command{ Long: deleteLong, Example: deleteExample, PreRunE: func(c *cobra.Command, _ []string) error { - msg := fmt.Sprintf("Would delete playlist(s): %s", strings.Join(ids, ", ")) - return utils.ConfirmPreRun(c, msg) + return utils.ConfirmPreRun( + c, fmt.Sprintf(deleteConfirm, strings.Join(ids, ", ")), + ) }, Run: func(c *cobra.Command, _ []string) { input := playlist.NewPlaylist( diff --git a/cmd/playlist/insert.go b/cmd/playlist/insert.go index 13c25b2..8476706 100644 --- a/cmd/playlist/insert.go +++ b/cmd/playlist/insert.go @@ -21,6 +21,7 @@ import ( const ( insertTool = "playlist-insert" insertCidUsage = "Channel id of the playlist" + insertConfirm = "Insert playlist: %s" insertShort = "Create a new playlist" insertLong = "Create a new playlist. Use this tool to create a new playlist." insertExample = `# Create a public playlist @@ -51,7 +52,6 @@ var insertInSchema = &jsonschema.Schema{ Type: "string", Enum: []any{"json", "yaml", "silent"}, Description: pkg.SilentUsage, Default: jsontext.Value(`"yaml"`), }, - "confirmed": {Type: "boolean", Description: pkg.ConfirmedUsage}, }, } @@ -65,13 +65,15 @@ func init() { OpenWorldHint: new(true), ReadOnlyHint: false, }, - }, cobramcp.GenToolHandler( - insertTool, func(input playlist.Playlist, writer io.Writer) error { - if !input.Confirmed { - return utils.ErrNotConfirmed - } - return input.Insert(writer) - }, + }, cobramcp.GenToolHandlerWithMRTR( + insertTool, cobramcp.ConfirmThen( + func(input playlist.Playlist) string { + return fmt.Sprintf(insertConfirm, input.Title) + }, + func(input playlist.Playlist, w io.Writer) error { + return input.Insert(w) + }, + ), ), ) playlistCmd.AddCommand(insertCmd) @@ -95,8 +97,7 @@ var insertCmd = &cobra.Command{ Long: insertLong, Example: insertExample, PreRunE: func(c *cobra.Command, _ []string) error { - msg := fmt.Sprintf("Would insert playlist: %s", title) - return utils.ConfirmPreRun(c, msg) + return utils.ConfirmPreRun(c, fmt.Sprintf(insertConfirm, title)) }, Run: func(c *cobra.Command, _ []string) { output, _ := c.Flags().GetString("output") diff --git a/cmd/playlist/update.go b/cmd/playlist/update.go index 14142b9..2313816 100644 --- a/cmd/playlist/update.go +++ b/cmd/playlist/update.go @@ -22,6 +22,7 @@ import ( const ( updateTool = "playlist-update" updateIdUsage = "ID of the playlist to update" + updateConfirm = "Update playlist: %s" updateShort = "Update a playlist" updateLong = "Update a playlist. Use this tool to update a playlist." updateExample = `# Update playlist title @@ -57,7 +58,6 @@ var updateInSchema = &jsonschema.Schema{ Type: "string", Enum: []any{"json", "yaml", "silent"}, Description: pkg.SilentUsage, Default: jsontext.Value(`"yaml"`), }, - "confirmed": {Type: "boolean", Description: pkg.ConfirmedUsage}, }, } @@ -71,13 +71,15 @@ func init() { OpenWorldHint: new(true), ReadOnlyHint: false, }, - }, cobramcp.GenToolHandler( - updateTool, func(input playlist.Playlist, writer io.Writer) error { - if !input.Confirmed { - return utils.ErrNotConfirmed - } - return input.Update(writer) - }, + }, cobramcp.GenToolHandlerWithMRTR( + updateTool, cobramcp.ConfirmThen( + func(input playlist.Playlist) string { + return fmt.Sprintf(updateConfirm, strings.Join(input.Ids, ", ")) + }, + func(input playlist.Playlist, w io.Writer) error { + return input.Update(w) + }, + ), ), ) playlistCmd.AddCommand(updateCmd) @@ -99,8 +101,9 @@ var updateCmd = &cobra.Command{ Long: updateLong, Example: updateExample, PreRunE: func(c *cobra.Command, _ []string) error { - msg := fmt.Sprintf("Would update playlist: %s", strings.Join(ids, ", ")) - return utils.ConfirmPreRun(c, msg) + return utils.ConfirmPreRun( + c, fmt.Sprintf(updateConfirm, strings.Join(ids, ", ")), + ) }, Run: func(c *cobra.Command, _ []string) { output, _ := c.Flags().GetString("output") diff --git a/cmd/playlistImage/delete.go b/cmd/playlistImage/delete.go index b2bf0f0..96dca97 100644 --- a/cmd/playlistImage/delete.go +++ b/cmd/playlistImage/delete.go @@ -20,6 +20,7 @@ import ( const ( deleteTool = "playlistImage-delete" + deleteConfirm = "Delete playlist image(s): %s" deleteShort = "Delete playlist images" deleteLong = "Delete playlist images. Use this tool to delete playlist images by IDs." deleteExample = `# Delete a playlist image by ID @@ -37,7 +38,6 @@ var deleteInSchema = &jsonschema.Schema{ Items: &jsonschema.Schema{Type: "string"}, }, "on_behalf_of_content_owner": {Type: "string", Description: pkg.OBOCOUsage}, - "confirmed": {Type: "boolean", Description: pkg.ConfirmedUsage}, }, } @@ -51,14 +51,15 @@ func init() { OpenWorldHint: new(true), ReadOnlyHint: false, }, - }, cobramcp.GenToolHandler( - deleteTool, - func(input playlistImage.PlaylistImage, writer io.Writer) error { - if !input.Confirmed { - return utils.ErrNotConfirmed - } - return input.Delete(writer) - }, + }, cobramcp.GenToolHandlerWithMRTR( + deleteTool, cobramcp.ConfirmThen( + func(input playlistImage.PlaylistImage) string { + return fmt.Sprintf(deleteConfirm, strings.Join(input.Ids, ", ")) + }, + func(input playlistImage.PlaylistImage, w io.Writer) error { + return input.Delete(w) + }, + ), ), ) playlistImageCmd.AddCommand(deleteCmd) @@ -77,10 +78,9 @@ var deleteCmd = &cobra.Command{ Long: deleteLong, Example: deleteExample, PreRunE: func(c *cobra.Command, _ []string) error { - msg := fmt.Sprintf( - "Would delete playlist image(s): %s", strings.Join(ids, ", "), + return utils.ConfirmPreRun( + c, fmt.Sprintf(deleteConfirm, strings.Join(ids, ", ")), ) - return utils.ConfirmPreRun(c, msg) }, Run: func(c *cobra.Command, _ []string) { input := playlistImage.NewPlaylistImage( diff --git a/cmd/playlistImage/insert.go b/cmd/playlistImage/insert.go index adbb945..812009a 100644 --- a/cmd/playlistImage/insert.go +++ b/cmd/playlistImage/insert.go @@ -20,6 +20,7 @@ import ( const ( insertTool = "playlistImage-insert" + insertConfirm = "Insert playlist image: %s" insertShort = "Insert a playlist image" insertLong = "Insert a playlist image. Use this tool to insert a YouTube playlist image for a given playlist ID." insertExample = `# Insert a playlist cover image @@ -57,7 +58,6 @@ var insertInSchema = &jsonschema.Schema{ Type: "string", Enum: []any{"json", "yaml", "silent"}, Description: pkg.SilentUsage, Default: jsontext.Value(`"yaml"`), }, - "confirmed": {Type: "boolean", Description: pkg.ConfirmedUsage}, }, } @@ -71,14 +71,15 @@ func init() { OpenWorldHint: new(true), ReadOnlyHint: false, }, - }, cobramcp.GenToolHandler( - insertTool, - func(input playlistImage.PlaylistImage, writer io.Writer) error { - if !input.Confirmed { - return utils.ErrNotConfirmed - } - return input.Insert(writer) - }, + }, cobramcp.GenToolHandlerWithMRTR( + insertTool, cobramcp.ConfirmThen( + func(input playlistImage.PlaylistImage) string { + return fmt.Sprintf(insertConfirm, input.File) + }, + func(input playlistImage.PlaylistImage, w io.Writer) error { + return input.Insert(w) + }, + ), ), ) playlistImageCmd.AddCommand(insertCmd) @@ -107,8 +108,7 @@ var insertCmd = &cobra.Command{ Long: insertLong, Example: insertExample, PreRunE: func(c *cobra.Command, _ []string) error { - msg := fmt.Sprintf("Would insert playlist image: %s", file) - return utils.ConfirmPreRun(c, msg) + return utils.ConfirmPreRun(c, fmt.Sprintf(insertConfirm, file)) }, Run: func(c *cobra.Command, _ []string) { output, _ := c.Flags().GetString("output") diff --git a/cmd/playlistImage/update.go b/cmd/playlistImage/update.go index 26a6983..3d36ec4 100644 --- a/cmd/playlistImage/update.go +++ b/cmd/playlistImage/update.go @@ -20,6 +20,7 @@ import ( const ( updateTool = "playlistImage-update" + updateConfirm = "Update playlist image for playlist: %s" updateShort = "Update a playlist image" updateLong = "Update a playlist image. Use this tool to update a playlist image." updateExample = `# Update a playlist image @@ -52,7 +53,6 @@ var updateInSchema = &jsonschema.Schema{ Type: "string", Enum: []any{"json", "yaml", "silent"}, Description: pkg.SilentUsage, Default: jsontext.Value(`"yaml"`), }, - "confirmed": {Type: "boolean", Description: pkg.ConfirmedUsage}, }, } @@ -66,14 +66,15 @@ func init() { OpenWorldHint: new(true), ReadOnlyHint: false, }, - }, cobramcp.GenToolHandler( - updateTool, - func(input playlistImage.PlaylistImage, writer io.Writer) error { - if !input.Confirmed { - return utils.ErrNotConfirmed - } - return input.Update(writer) - }, + }, cobramcp.GenToolHandlerWithMRTR( + updateTool, cobramcp.ConfirmThen( + func(input playlistImage.PlaylistImage) string { + return fmt.Sprintf(updateConfirm, input.PlaylistId) + }, + func(input playlistImage.PlaylistImage, w io.Writer) error { + return input.Update(w) + }, + ), ), ) playlistImageCmd.AddCommand(updateCmd) @@ -100,10 +101,7 @@ var updateCmd = &cobra.Command{ Long: updateLong, Example: updateExample, PreRunE: func(c *cobra.Command, _ []string) error { - msg := fmt.Sprintf( - "Would update playlist image for playlist: %s", playlistId, - ) - return utils.ConfirmPreRun(c, msg) + return utils.ConfirmPreRun(c, fmt.Sprintf(updateConfirm, playlistId)) }, Run: func(c *cobra.Command, _ []string) { output, _ := c.Flags().GetString("output") diff --git a/cmd/playlistItem/delete.go b/cmd/playlistItem/delete.go index 74c3ebb..26e3baa 100644 --- a/cmd/playlistItem/delete.go +++ b/cmd/playlistItem/delete.go @@ -21,6 +21,7 @@ import ( const ( deleteTool = "playlistItem-delete" deleteIdsUsage = "IDs of the playlist items to delete" + deleteConfirm = "Delete playlist item(s): %s" deleteShort = "Delete items from a playlist" deleteLong = "Delete items from a playlist. Use this tool to delete items from a playlist by IDs." deleteExample = `# Delete a playlist item by ID @@ -38,7 +39,6 @@ var deleteInSchema = &jsonschema.Schema{ Items: &jsonschema.Schema{Type: "string"}, }, "on_behalf_of_content_owner": {Type: "string", Description: pkg.OBOCOUsage}, - "confirmed": {Type: "boolean", Description: pkg.ConfirmedUsage}, }, } @@ -52,13 +52,15 @@ func init() { OpenWorldHint: new(true), ReadOnlyHint: false, }, - }, cobramcp.GenToolHandler( - deleteTool, func(input playlistItem.PlaylistItem, writer io.Writer) error { - if !input.Confirmed { - return utils.ErrNotConfirmed - } - return input.Delete(writer) - }, + }, cobramcp.GenToolHandlerWithMRTR( + deleteTool, cobramcp.ConfirmThen( + func(input playlistItem.PlaylistItem) string { + return fmt.Sprintf(deleteConfirm, strings.Join(input.Ids, ", ")) + }, + func(input playlistItem.PlaylistItem, w io.Writer) error { + return input.Delete(w) + }, + ), ), ) playlistItemCmd.AddCommand(deleteCmd) @@ -77,10 +79,9 @@ var deleteCmd = &cobra.Command{ Long: deleteLong, Example: deleteExample, PreRunE: func(c *cobra.Command, _ []string) error { - msg := fmt.Sprintf( - "Would delete playlist item(s): %s", strings.Join(ids, ", "), + return utils.ConfirmPreRun( + c, fmt.Sprintf(deleteConfirm, strings.Join(ids, ", ")), ) - return utils.ConfirmPreRun(c, msg) }, Run: func(c *cobra.Command, _ []string) { input := playlistItem.NewPlaylistItem( diff --git a/cmd/playlistItem/insert.go b/cmd/playlistItem/insert.go index ab0478b..500488b 100644 --- a/cmd/playlistItem/insert.go +++ b/cmd/playlistItem/insert.go @@ -21,6 +21,7 @@ import ( const ( insertTool = "playlistItem-insert" insertPidUsage = "The id that YouTube uses to uniquely identify the playlist that the item is in" + insertConfirm = "Insert playlist item to playlist: %s" insertShort = "Insert a playlist item into a playlist" insertLong = "Insert a playlist item into a playlist. Use this tool to insert a playlist item into a playlist." insertExample = `# Add a video to a playlist @@ -53,7 +54,6 @@ var insertInSchema = &jsonschema.Schema{ Type: "string", Enum: []any{"json", "yaml", "silent"}, Description: pkg.SilentUsage, Default: jsontext.Value(`"yaml"`), }, - "confirmed": {Type: "boolean", Description: pkg.ConfirmedUsage}, }, } @@ -67,13 +67,15 @@ func init() { OpenWorldHint: new(true), ReadOnlyHint: false, }, - }, cobramcp.GenToolHandler( - insertTool, func(input playlistItem.PlaylistItem, writer io.Writer) error { - if !input.Confirmed { - return utils.ErrNotConfirmed - } - return input.Insert(writer) - }, + }, cobramcp.GenToolHandlerWithMRTR( + insertTool, cobramcp.ConfirmThen( + func(input playlistItem.PlaylistItem) string { + return fmt.Sprintf(insertConfirm, input.PlaylistId) + }, + func(input playlistItem.PlaylistItem, w io.Writer) error { + return input.Insert(w) + }, + ), ), ) playlistItemCmd.AddCommand(insertCmd) @@ -105,8 +107,7 @@ var insertCmd = &cobra.Command{ Long: insertLong, Example: insertExample, PreRunE: func(c *cobra.Command, _ []string) error { - msg := fmt.Sprintf("Would insert playlist item to playlist: %s", playlistId) - return utils.ConfirmPreRun(c, msg) + return utils.ConfirmPreRun(c, fmt.Sprintf(insertConfirm, playlistId)) }, Run: func(c *cobra.Command, _ []string) { output, _ := c.Flags().GetString("output") diff --git a/cmd/playlistItem/update.go b/cmd/playlistItem/update.go index 3de6870..41c0073 100644 --- a/cmd/playlistItem/update.go +++ b/cmd/playlistItem/update.go @@ -22,6 +22,7 @@ import ( const ( updateTool = "playlistItem-update" updateIdUsage = "ID of the playlist item to update" + updateConfirm = "Update playlist item: %s" updateShort = "Update a playlist item" updateLong = "Update a playlist item. Use this tool to update a playlist item." updateExample = `# Update playlist item title @@ -51,7 +52,6 @@ var updateInSchema = &jsonschema.Schema{ Type: "string", Enum: []any{"json", "yaml", "silent"}, Description: pkg.SilentUsage, Default: jsontext.Value(`"yaml"`), }, - "confirmed": {Type: "boolean", Description: pkg.ConfirmedUsage}, }, } @@ -65,13 +65,15 @@ func init() { OpenWorldHint: new(true), ReadOnlyHint: false, }, - }, cobramcp.GenToolHandler( - updateTool, func(input playlistItem.PlaylistItem, writer io.Writer) error { - if !input.Confirmed { - return utils.ErrNotConfirmed - } - return input.Update(writer) - }, + }, cobramcp.GenToolHandlerWithMRTR( + updateTool, cobramcp.ConfirmThen( + func(input playlistItem.PlaylistItem) string { + return fmt.Sprintf(updateConfirm, strings.Join(input.Ids, ", ")) + }, + func(input playlistItem.PlaylistItem, w io.Writer) error { + return input.Update(w) + }, + ), ), ) playlistItemCmd.AddCommand(updateCmd) @@ -94,8 +96,9 @@ var updateCmd = &cobra.Command{ Long: updateLong, Example: updateExample, PreRunE: func(c *cobra.Command, _ []string) error { - msg := fmt.Sprintf("Would update playlist item: %s", strings.Join(ids, ", ")) - return utils.ConfirmPreRun(c, msg) + return utils.ConfirmPreRun( + c, fmt.Sprintf(updateConfirm, strings.Join(ids, ", ")), + ) }, Run: func(c *cobra.Command, _ []string) { output, _ := c.Flags().GetString("output") diff --git a/cmd/subscription/delete.go b/cmd/subscription/delete.go index 9a90151..a948453 100644 --- a/cmd/subscription/delete.go +++ b/cmd/subscription/delete.go @@ -21,6 +21,7 @@ import ( const ( deleteTool = "subscription-delete" deleteIdsUsage = "IDs of the subscriptions to delete" + deleteConfirm = "Delete subscription(s): %s" deleteShort = "Delete subscriptions" deleteLong = "Delete subscriptions. Use this tool to delete subscriptions by IDs." deleteExample = `# Delete a subscription by ID @@ -37,7 +38,6 @@ var deleteInSchema = &jsonschema.Schema{ Type: "array", Description: deleteIdsUsage, Items: &jsonschema.Schema{Type: "string"}, }, - "confirmed": {Type: "boolean", Description: pkg.ConfirmedUsage}, }, } @@ -51,13 +51,15 @@ func init() { OpenWorldHint: new(true), ReadOnlyHint: false, }, - }, cobramcp.GenToolHandler( - deleteTool, func(input subscription.Subscription, writer io.Writer) error { - if !input.Confirmed { - return utils.ErrNotConfirmed - } - return input.Delete(writer) - }, + }, cobramcp.GenToolHandlerWithMRTR( + deleteTool, cobramcp.ConfirmThen( + func(input subscription.Subscription) string { + return fmt.Sprintf(deleteConfirm, strings.Join(input.Ids, ", ")) + }, + func(input subscription.Subscription, w io.Writer) error { + return input.Delete(w) + }, + ), ), ) subscriptionCmd.AddCommand(deleteCmd) @@ -73,10 +75,9 @@ var deleteCmd = &cobra.Command{ Long: deleteLong, Example: deleteExample, PreRunE: func(c *cobra.Command, _ []string) error { - msg := fmt.Sprintf( - "Would delete subscription(s): %s", strings.Join(ids, ", "), + return utils.ConfirmPreRun( + c, fmt.Sprintf(deleteConfirm, strings.Join(ids, ", ")), ) - return utils.ConfirmPreRun(c, msg) }, Run: func(c *cobra.Command, _ []string) { input := subscription.NewSubscription( diff --git a/cmd/subscription/insert.go b/cmd/subscription/insert.go index f544be4..4701e2b 100644 --- a/cmd/subscription/insert.go +++ b/cmd/subscription/insert.go @@ -21,6 +21,7 @@ import ( const ( insertTool = "subscription-insert" insertCidUsage = "ID of the channel to be subscribed" + insertConfirm = "Insert subscription to channel: %s" insertShort = "Insert a new subscription" insertLong = "Insert a new subscription. Use this tool to insert a new subscription." insertExample = `# Subscribe to a channel @@ -41,7 +42,6 @@ var insertInSchema = &jsonschema.Schema{ Type: "string", Enum: []any{"json", "yaml", "silent"}, Description: pkg.SilentUsage, Default: jsontext.Value(`"yaml"`), }, - "confirmed": {Type: "boolean", Description: pkg.ConfirmedUsage}, }, } @@ -55,13 +55,15 @@ func init() { OpenWorldHint: new(true), ReadOnlyHint: false, }, - }, cobramcp.GenToolHandler( - insertTool, func(input subscription.Subscription, writer io.Writer) error { - if !input.Confirmed { - return utils.ErrNotConfirmed - } - return input.Insert(writer) - }, + }, cobramcp.GenToolHandlerWithMRTR( + insertTool, cobramcp.ConfirmThen( + func(input subscription.Subscription) string { + return fmt.Sprintf(insertConfirm, input.ChannelId) + }, + func(input subscription.Subscription, w io.Writer) error { + return input.Insert(w) + }, + ), ), ) subscriptionCmd.AddCommand(insertCmd) @@ -84,8 +86,7 @@ var insertCmd = &cobra.Command{ Long: insertLong, Example: insertExample, PreRunE: func(c *cobra.Command, _ []string) error { - msg := fmt.Sprintf("Would insert subscription to channel: %s", channelId) - return utils.ConfirmPreRun(c, msg) + return utils.ConfirmPreRun(c, fmt.Sprintf(insertConfirm, channelId)) }, Run: func(c *cobra.Command, _ []string) { output, _ := c.Flags().GetString("output") diff --git a/cmd/thirdPartyLink/delete.go b/cmd/thirdPartyLink/delete.go index 7ebc3d3..ecee92b 100644 --- a/cmd/thirdPartyLink/delete.go +++ b/cmd/thirdPartyLink/delete.go @@ -19,6 +19,7 @@ import ( const ( deleteTool = "thirdPartyLink-delete" + deleteConfirm = "Delete third-party link: %s" deleteShort = "Delete a third-party link" deleteLong = "Delete a third-party link. Use this tool to delete a link between a YouTube channel and a third-party service." deleteExample = `# Delete a third-party link @@ -35,7 +36,6 @@ var deleteInSchema = &jsonschema.Schema{ Enum: []any{"linkUnspecified", "channelToStoreLink"}, }, "external_channel_id": {Type: "string", Description: extCidUsage}, - "confirmed": {Type: "boolean", Description: pkg.ConfirmedUsage}, }, } @@ -49,14 +49,15 @@ func init() { OpenWorldHint: new(true), ReadOnlyHint: false, }, - }, cobramcp.GenToolHandler( - deleteTool, - func(input thirdPartyLink.ThirdPartyLink, writer io.Writer) error { - if !input.Confirmed { - return utils.ErrNotConfirmed - } - return input.Delete(writer) - }, + }, cobramcp.GenToolHandlerWithMRTR( + deleteTool, cobramcp.ConfirmThen( + func(input thirdPartyLink.ThirdPartyLink) string { + return fmt.Sprintf(deleteConfirm, input.LinkingToken) + }, + func(input thirdPartyLink.ThirdPartyLink, w io.Writer) error { + return input.Delete(w) + }, + ), ), ) thirdPartyLinkCmd.AddCommand(deleteCmd) @@ -77,8 +78,7 @@ var deleteCmd = &cobra.Command{ Long: deleteLong, Example: deleteExample, PreRunE: func(c *cobra.Command, _ []string) error { - msg := fmt.Sprintf("Would delete third-party link: %s", linkingToken) - return utils.ConfirmPreRun(c, msg) + return utils.ConfirmPreRun(c, fmt.Sprintf(deleteConfirm, linkingToken)) }, Run: func(c *cobra.Command, _ []string) { input := thirdPartyLink.NewThirdPartyLink( diff --git a/cmd/thirdPartyLink/insert.go b/cmd/thirdPartyLink/insert.go index 1a1ef15..85912a6 100644 --- a/cmd/thirdPartyLink/insert.go +++ b/cmd/thirdPartyLink/insert.go @@ -20,6 +20,7 @@ import ( const ( insertTool = "thirdPartyLink-insert" + insertConfirm = "Insert third-party link: %s" insertShort = "Insert a new third-party link" insertLong = "Insert a new third-party link. Use this tool to create a link between a YouTube channel and a third-party service." insertExample = `# Insert a new third-party link @@ -43,7 +44,6 @@ var insertInSchema = &jsonschema.Schema{ Type: "string", Enum: []any{"json", "yaml", "silent"}, Description: pkg.SilentUsage, Default: jsontext.Value(`"yaml"`), }, - "confirmed": {Type: "boolean", Description: pkg.ConfirmedUsage}, }, } @@ -57,14 +57,15 @@ func init() { OpenWorldHint: new(true), ReadOnlyHint: false, }, - }, cobramcp.GenToolHandler( - insertTool, - func(input thirdPartyLink.ThirdPartyLink, writer io.Writer) error { - if !input.Confirmed { - return utils.ErrNotConfirmed - } - return input.Insert(writer) - }, + }, cobramcp.GenToolHandlerWithMRTR( + insertTool, cobramcp.ConfirmThen( + func(input thirdPartyLink.ThirdPartyLink) string { + return fmt.Sprintf(insertConfirm, input.LinkingToken) + }, + func(input thirdPartyLink.ThirdPartyLink, w io.Writer) error { + return input.Insert(w) + }, + ), ), ) thirdPartyLinkCmd.AddCommand(insertCmd) @@ -90,8 +91,7 @@ var insertCmd = &cobra.Command{ Long: insertLong, Example: insertExample, PreRunE: func(c *cobra.Command, _ []string) error { - msg := fmt.Sprintf("Would insert third-party link: %s", linkingToken) - return utils.ConfirmPreRun(c, msg) + return utils.ConfirmPreRun(c, fmt.Sprintf(insertConfirm, linkingToken)) }, Run: func(c *cobra.Command, _ []string) { output, _ := c.Flags().GetString("output") diff --git a/cmd/thirdPartyLink/update.go b/cmd/thirdPartyLink/update.go index 87f7ae4..2401683 100644 --- a/cmd/thirdPartyLink/update.go +++ b/cmd/thirdPartyLink/update.go @@ -20,6 +20,7 @@ import ( const ( updateTool = "thirdPartyLink-update" + updateConfirm = "Update third-party link: %s" updateShort = "Update a third-party link" updateLong = "Update a third-party link. Use this tool to update the status or type of a link between a YouTube channel and a third-party service." updateExample = `# Update a third-party link status @@ -45,7 +46,6 @@ var updateInSchema = &jsonschema.Schema{ Type: "string", Enum: []any{"json", "yaml", "silent"}, Description: pkg.SilentUsage, Default: jsontext.Value(`"yaml"`), }, - "confirmed": {Type: "boolean", Description: pkg.ConfirmedUsage}, }, } @@ -59,14 +59,15 @@ func init() { OpenWorldHint: new(true), ReadOnlyHint: false, }, - }, cobramcp.GenToolHandler( - updateTool, - func(input thirdPartyLink.ThirdPartyLink, writer io.Writer) error { - if !input.Confirmed { - return utils.ErrNotConfirmed - } - return input.Update(writer) - }, + }, cobramcp.GenToolHandlerWithMRTR( + updateTool, cobramcp.ConfirmThen( + func(input thirdPartyLink.ThirdPartyLink) string { + return fmt.Sprintf(updateConfirm, input.LinkingToken) + }, + func(input thirdPartyLink.ThirdPartyLink, w io.Writer) error { + return input.Update(w) + }, + ), ), ) thirdPartyLinkCmd.AddCommand(updateCmd) @@ -91,8 +92,7 @@ var updateCmd = &cobra.Command{ Long: updateLong, Example: updateExample, PreRunE: func(c *cobra.Command, _ []string) error { - msg := fmt.Sprintf("Would update third-party link: %s", linkingToken) - return utils.ConfirmPreRun(c, msg) + return utils.ConfirmPreRun(c, fmt.Sprintf(updateConfirm, linkingToken)) }, Run: func(c *cobra.Command, _ []string) { output, _ := c.Flags().GetString("output") diff --git a/cmd/thumbnail/set.go b/cmd/thumbnail/set.go index b64e63c..3341f4b 100644 --- a/cmd/thumbnail/set.go +++ b/cmd/thumbnail/set.go @@ -20,6 +20,7 @@ import ( const ( setTool = "thumbnail-set" + setConfirm = "Set thumbnail for video: %s" setShort = "Set a thumbnail for a video" setLong = "Set a thumbnail for a video. Use this tool to set a thumbnail for a video." setExample = `# Set a thumbnail for a video @@ -38,7 +39,6 @@ var setInSchema = &jsonschema.Schema{ Type: "string", Enum: []any{"json", "yaml", "silent"}, Description: pkg.SilentUsage, Default: jsontext.Value(`"yaml"`), }, - "confirmed": {Type: "boolean", Description: pkg.ConfirmedUsage}, }, } @@ -52,13 +52,15 @@ func init() { OpenWorldHint: new(true), ReadOnlyHint: false, }, - }, cobramcp.GenToolHandler( - setTool, func(input thumbnail.Thumbnail, writer io.Writer) error { - if !input.Confirmed { - return utils.ErrNotConfirmed - } - return input.Set(writer) - }, + }, cobramcp.GenToolHandlerWithMRTR( + setTool, cobramcp.ConfirmThen( + func(input thumbnail.Thumbnail) string { + return fmt.Sprintf(setConfirm, input.VideoId) + }, + func(input thumbnail.Thumbnail, w io.Writer) error { + return input.Set(w) + }, + ), ), ) thumbnailCmd.AddCommand(setCmd) @@ -77,8 +79,7 @@ var setCmd = &cobra.Command{ Long: setLong, Example: setExample, PreRunE: func(c *cobra.Command, _ []string) error { - msg := fmt.Sprintf("Would set thumbnail for video: %s", videoId) - return utils.ConfirmPreRun(c, msg) + return utils.ConfirmPreRun(c, fmt.Sprintf(setConfirm, videoId)) }, Run: func(c *cobra.Command, _ []string) { output, _ := c.Flags().GetString("output") diff --git a/cmd/video/delete.go b/cmd/video/delete.go index bb1fee6..e7e9e91 100644 --- a/cmd/video/delete.go +++ b/cmd/video/delete.go @@ -21,6 +21,7 @@ import ( const ( deleteTool = "video-delete" deleteIdsUsage = "IDs of the videos to delete" + deleteConfirm = "Delete video(s): %s" deleteShort = "Delete videos" deleteLong = "Delete videos. Use this tool to delete videos by IDs." deleteExample = `# Delete a video by ID @@ -37,7 +38,6 @@ var deleteInSchema = &jsonschema.Schema{ Type: "array", Description: deleteIdsUsage, Items: &jsonschema.Schema{Type: "string"}, }, - "confirmed": {Type: "boolean", Description: pkg.ConfirmedUsage}, }, } @@ -51,13 +51,15 @@ func init() { OpenWorldHint: new(true), ReadOnlyHint: false, }, - }, cobramcp.GenToolHandler( - deleteTool, func(input video.Video, writer io.Writer) error { - if !input.Confirmed { - return utils.ErrNotConfirmed - } - return input.Delete(writer) - }, + }, cobramcp.GenToolHandlerWithMRTR( + deleteTool, cobramcp.ConfirmThen( + func(input video.Video) string { + return fmt.Sprintf(deleteConfirm, strings.Join(input.Ids, ", ")) + }, + func(input video.Video, w io.Writer) error { + return input.Delete(w) + }, + ), ), ) videoCmd.AddCommand(deleteCmd) @@ -73,8 +75,9 @@ var deleteCmd = &cobra.Command{ Long: deleteLong, Example: deleteExample, PreRunE: func(c *cobra.Command, _ []string) error { - msg := fmt.Sprintf("Would delete video(s): %s", strings.Join(ids, ", ")) - return utils.ConfirmPreRun(c, msg) + return utils.ConfirmPreRun( + c, fmt.Sprintf(deleteConfirm, strings.Join(ids, ", ")), + ) }, Run: func(c *cobra.Command, _ []string) { input := video.NewVideo(video.WithIds(ids)) diff --git a/cmd/video/insert.go b/cmd/video/insert.go index b3f9875..746ba55 100644 --- a/cmd/video/insert.go +++ b/cmd/video/insert.go @@ -21,6 +21,7 @@ import ( const ( insertTool = "video-insert" insertLangUsage = "Language of the video" + insertConfirm = "Insert video: %s" insertShort = "Upload a video" insertLong = "Upload a video. Use this tool to upload a video." insertExample = `# Upload a public video @@ -64,8 +65,6 @@ var insertInSchema = &jsonschema.Schema{ "stabilize": {Type: "boolean", Description: stabilizeUsage}, "notify_subscribers": {Type: "boolean", Description: nsUsage}, "public_stats_viewable": {Type: "boolean", Description: psvUsage}, - "confirmed": {Type: "boolean", Description: pkg.ConfirmedUsage}, - "on_behalf_of_content_owner": { Type: "string", Description: pkg.OBOCOUsage, @@ -91,13 +90,15 @@ func init() { OpenWorldHint: new(true), ReadOnlyHint: false, }, - }, cobramcp.GenToolHandler( - insertTool, func(input video.Video, writer io.Writer) error { - if !input.Confirmed { - return utils.ErrNotConfirmed - } - return input.Insert(writer) - }, + }, cobramcp.GenToolHandlerWithMRTR( + insertTool, cobramcp.ConfirmThen( + func(input video.Video) string { + return fmt.Sprintf(insertConfirm, input.File) + }, + func(input video.Video, w io.Writer) error { + return input.Insert(w) + }, + ), ), ) videoCmd.AddCommand(insertCmd) @@ -152,8 +153,7 @@ var insertCmd = &cobra.Command{ Long: insertLong, Example: insertExample, PreRunE: func(c *cobra.Command, _ []string) error { - msg := fmt.Sprintf("Would insert video: %s", file) - return utils.ConfirmPreRun(c, msg) + return utils.ConfirmPreRun(c, fmt.Sprintf(insertConfirm, file)) }, Run: func(c *cobra.Command, _ []string) { output, _ := c.Flags().GetString("output") diff --git a/cmd/video/rate.go b/cmd/video/rate.go index 76af76d..c882ad4 100644 --- a/cmd/video/rate.go +++ b/cmd/video/rate.go @@ -22,6 +22,7 @@ const ( rateTool = "video-rate" rateIdsUsage = "IDs of the videos to rate" rateRUsage = "like|dislike|none" + rateConfirm = "Rate video(s) %s as %s" rateShort = "Rate a video" rateLong = "Rate a video. Use this tool to rate a video." rateExample = `# Like a video @@ -44,7 +45,6 @@ var rateInSchema = &jsonschema.Schema{ Type: "string", Description: rateRUsage, Enum: []any{"like", "dislike", "none"}, }, - "confirmed": {Type: "boolean", Description: pkg.ConfirmedUsage}, }, } @@ -58,13 +58,17 @@ func init() { OpenWorldHint: new(true), ReadOnlyHint: false, }, - }, cobramcp.GenToolHandler( - rateTool, func(input video.Video, writer io.Writer) error { - if !input.Confirmed { - return utils.ErrNotConfirmed - } - return input.Rate(writer) - }, + }, cobramcp.GenToolHandlerWithMRTR( + rateTool, cobramcp.ConfirmThen( + func(input video.Video) string { + return fmt.Sprintf( + rateConfirm, strings.Join(input.Ids, ", "), input.Rating, + ) + }, + func(input video.Video, w io.Writer) error { + return input.Rate(w) + }, + ), ), ) videoCmd.AddCommand(rateCmd) @@ -82,10 +86,9 @@ var rateCmd = &cobra.Command{ Long: rateLong, Example: rateExample, PreRunE: func(c *cobra.Command, _ []string) error { - msg := fmt.Sprintf( - "Would rate video(s): %s as %s", strings.Join(ids, ", "), rating, + return utils.ConfirmPreRun( + c, fmt.Sprintf(rateConfirm, strings.Join(ids, ", "), rating), ) - return utils.ConfirmPreRun(c, msg) }, Run: func(c *cobra.Command, _ []string) { input := video.NewVideo( diff --git a/cmd/video/reportAbuse.go b/cmd/video/reportAbuse.go index 952b807..3eb3460 100644 --- a/cmd/video/reportAbuse.go +++ b/cmd/video/reportAbuse.go @@ -22,6 +22,7 @@ const ( reportAbuseTool = "video-reportAbuse" raIdsUsage = "IDs of the videos to report abuse on" raLangUsage = "Language that the content was viewed in" + reportAbuseConfirm = "Report abuse on video(s): %s" reportAbuseShort = "Report abuse on a video" reportAbuseLong = "Report abuse on a video. Use this tool to report abuse on a video." reportAbuseExample = `# Report abuse on a video @@ -45,7 +46,6 @@ var reportAbuseInSchema = &jsonschema.Schema{ "comments": {Type: "string", Description: commentsUsage}, "language": {Type: "string", Description: raLangUsage}, "on_behalf_of_content_owner": {Type: "string", Description: pkg.OBOCOUsage}, - "confirmed": {Type: "boolean", Description: pkg.ConfirmedUsage}, }, } @@ -60,13 +60,15 @@ func init() { OpenWorldHint: new(true), ReadOnlyHint: false, }, - }, cobramcp.GenToolHandler( - reportAbuseTool, func(input video.Video, writer io.Writer) error { - if !input.Confirmed { - return utils.ErrNotConfirmed - } - return input.ReportAbuse(writer) - }, + }, cobramcp.GenToolHandlerWithMRTR( + reportAbuseTool, cobramcp.ConfirmThen( + func(input video.Video) string { + return fmt.Sprintf(reportAbuseConfirm, strings.Join(input.Ids, ", ")) + }, + func(input video.Video, w io.Writer) error { + return input.ReportAbuse(w) + }, + ), ), ) videoCmd.AddCommand(reportAbuseCmd) @@ -96,10 +98,9 @@ var reportAbuseCmd = &cobra.Command{ Long: reportAbuseLong, Example: reportAbuseExample, PreRunE: func(c *cobra.Command, _ []string) error { - msg := fmt.Sprintf( - "Would report abuse on video(s): %s", strings.Join(ids, ", "), + return utils.ConfirmPreRun( + c, fmt.Sprintf(reportAbuseConfirm, strings.Join(ids, ", ")), ) - return utils.ConfirmPreRun(c, msg) }, Run: func(c *cobra.Command, _ []string) { input := video.NewVideo( diff --git a/cmd/video/update.go b/cmd/video/update.go index 4819759..6389f60 100644 --- a/cmd/video/update.go +++ b/cmd/video/update.go @@ -23,6 +23,7 @@ const ( updateTool = "video-update" updateIdUsage = "ID of the video to update" updateLangUsage = "Language of the video" + updateConfirm = "Update video: %s" updateShort = "Update a video" updateLong = "Update a video. Use this tool to update a video." updateExample = `# Update video title @@ -65,7 +66,6 @@ var updateInSchema = &jsonschema.Schema{ "embeddable": {Type: "boolean", Description: embeddableUsage}, "contains_synthetic_media": {Type: "boolean", Description: csmUsage}, "recording_date": {Type: "string", Description: rdUsage}, - "confirmed": {Type: "boolean", Description: pkg.ConfirmedUsage}, "output": { Type: "string", Enum: []any{"json", "yaml", "silent"}, Description: pkg.SilentUsage, Default: jsontext.Value(`"yaml"`), @@ -83,14 +83,16 @@ func init() { OpenWorldHint: new(true), ReadOnlyHint: false, }, - }, cobramcp.GenToolHandler( - updateTool, func(input video.Video, writer io.Writer) error { - if !input.Confirmed { - return utils.ErrNotConfirmed - } - input.MaxResults = 1 - return input.Update(writer) - }, + }, cobramcp.GenToolHandlerWithMRTR( + updateTool, cobramcp.ConfirmThen( + func(input video.Video) string { + return fmt.Sprintf(updateConfirm, strings.Join(input.Ids, ", ")) + }, + func(input video.Video, w io.Writer) error { + input.MaxResults = 1 + return input.Update(w) + }, + ), ), ) videoCmd.AddCommand(updateCmd) @@ -124,8 +126,9 @@ var updateCmd = &cobra.Command{ Long: updateLong, Example: updateExample, PreRunE: func(c *cobra.Command, _ []string) error { - msg := fmt.Sprintf("Would update video: %s", strings.Join(ids, ", ")) - return utils.ConfirmPreRun(c, msg) + return utils.ConfirmPreRun( + c, fmt.Sprintf(updateConfirm, strings.Join(ids, ", ")), + ) }, Run: func(c *cobra.Command, _ []string) { output, _ := c.Flags().GetString("output") diff --git a/cmd/watermark/set.go b/cmd/watermark/set.go index 9e57818..aa30e89 100644 --- a/cmd/watermark/set.go +++ b/cmd/watermark/set.go @@ -19,6 +19,7 @@ import ( const ( setTool = "watermark-set" + setConfirm = "Set watermark for channel: %s" setShort = "Set a watermark for channel's videos" setLong = "Set a watermark for channel's videos. Use this tool to set a watermark for channel's videos." setExample = `# Set a watermark for a channel @@ -41,7 +42,6 @@ var setInSchema = &jsonschema.Schema{ }, "duration_ms": {Type: "number", Description: dmUsage}, "offset_ms": {Type: "number", Description: omUsage}, - "confirmed": {Type: "boolean", Description: pkg.ConfirmedUsage}, "offset_type": { Type: "string", Description: otUsage, Enum: []any{"offsetFromStart", "offsetFromEnd"}, @@ -60,13 +60,15 @@ func init() { OpenWorldHint: new(true), ReadOnlyHint: false, }, - }, cobramcp.GenToolHandler( - setTool, func(input watermark.Watermark, writer io.Writer) error { - if !input.Confirmed { - return utils.ErrNotConfirmed - } - return input.Set(writer) - }, + }, cobramcp.GenToolHandlerWithMRTR( + setTool, cobramcp.ConfirmThen( + func(input watermark.Watermark) string { + return fmt.Sprintf(setConfirm, input.ChannelId) + }, + func(input watermark.Watermark, w io.Writer) error { + return input.Set(w) + }, + ), ), ) watermarkCmd.AddCommand(setCmd) @@ -93,8 +95,7 @@ var setCmd = &cobra.Command{ Long: setLong, Example: setExample, PreRunE: func(c *cobra.Command, _ []string) error { - msg := fmt.Sprintf("Would set watermark for channel: %s", channelId) - return utils.ConfirmPreRun(c, msg) + return utils.ConfirmPreRun(c, fmt.Sprintf(setConfirm, channelId)) }, Run: func(c *cobra.Command, _ []string) { input := watermark.NewWatermark( diff --git a/cmd/watermark/unset.go b/cmd/watermark/unset.go index 673572a..403e110 100644 --- a/cmd/watermark/unset.go +++ b/cmd/watermark/unset.go @@ -19,6 +19,7 @@ import ( const ( unsetTool = "watermark-unset" + unsetConfirm = "Unset watermark for channel: %s" unsetShort = "Unset a watermark for channel's videos" unsetLong = "Unset a watermark for channel's videos. Use this tool to unset a watermark for a channel's videos." unsetExample = `# Unset watermark for a channel @@ -30,7 +31,6 @@ var unsetInSchema = &jsonschema.Schema{ Required: []string{"channel_id"}, Properties: map[string]*jsonschema.Schema{ "channel_id": {Type: "string", Description: cidUsage}, - "confirmed": {Type: "boolean", Description: pkg.ConfirmedUsage}, }, } @@ -44,13 +44,15 @@ func init() { OpenWorldHint: new(true), ReadOnlyHint: false, }, - }, cobramcp.GenToolHandler( - unsetTool, func(input watermark.Watermark, writer io.Writer) error { - if !input.Confirmed { - return utils.ErrNotConfirmed - } - return input.Unset(writer) - }, + }, cobramcp.GenToolHandlerWithMRTR( + unsetTool, cobramcp.ConfirmThen( + func(input watermark.Watermark) string { + return fmt.Sprintf(unsetConfirm, input.ChannelId) + }, + func(input watermark.Watermark, w io.Writer) error { + return input.Unset(w) + }, + ), ), ) watermarkCmd.AddCommand(unsetCmd) @@ -66,8 +68,7 @@ var unsetCmd = &cobra.Command{ Long: unsetLong, Example: unsetExample, PreRunE: func(c *cobra.Command, _ []string) error { - msg := fmt.Sprintf("Would unset watermark for channel: %s", channelId) - return utils.ConfirmPreRun(c, msg) + return utils.ConfirmPreRun(c, fmt.Sprintf(unsetConfirm, channelId)) }, Run: func(c *cobra.Command, _ []string) { input := watermark.NewWatermark(watermark.WithChannelId(channelId)) diff --git a/go.mod b/go.mod index 796380a..0e5d3f9 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/eat-pray-ai/yutu go 1.27.0 require ( - github.com/eat-pray-ai/cobra-mcp v0.4.1 + github.com/eat-pray-ai/cobra-mcp v0.4.5 github.com/google/jsonschema-go v0.4.3 github.com/jedib0t/go-pretty/v6 v6.8.3 github.com/modelcontextprotocol/go-sdk v1.7.0 diff --git a/go.sum b/go.sum index 0a11807..588819d 100644 --- a/go.sum +++ b/go.sum @@ -26,6 +26,8 @@ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1 github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/eat-pray-ai/cobra-mcp v0.4.1 h1:z21A/tnsNiTjyuAPIcrgjNVT37TJ7jH9PbCj+4fPQNc= github.com/eat-pray-ai/cobra-mcp v0.4.1/go.mod h1:YfRGGxp7LXAowS408XJ8SzCn74oaXGmjbcbjyYyPYqQ= +github.com/eat-pray-ai/cobra-mcp v0.4.5 h1:HXYaxvXF0PoYjlF+B0myikx4w/X+H/LFjgmYw89BB70= +github.com/eat-pray-ai/cobra-mcp v0.4.5/go.mod h1:ikePQIGp+iDcFTk6WkhYY8clOzn0cl2+sr8JupthOmQ= github.com/felixge/httpsnoop v1.1.0 h1:3YtUj32ZZkqZtt3sZZsClsymw/QDuVfpNhoA31zeORc= github.com/felixge/httpsnoop v1.1.0/go.mod h1:Zqxgdd+1Rkcz8euOqdr7lqgCRJztwr5hp9vDSi5UZCE= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=