shithub: hell

Download patch

ref: 57b338cb6111cc440b2e8074678d18d2eec65fdf
parent: 0b80f1a3a537166625c72ca46b32452abdf4eb45
author: penny <penny@limitedideas.org>
date: Fri Oct 31 08:17:06 EDT 2025

implement cmder

--- a/commands.go
+++ b/commands.go
@@ -1,7 +1,10 @@
 package main
 
 import (
+	"fmt"
 	"strings"
+
+	mastodon "codeberg.org/penny64/hellclient-go-mastodon"
 )
 
 var commands = []string{"examine", "reply", "like", "thread", "open", "prev", "download", "dm", "rt", "hrt", "parent", "children", "rm", "mark", "unmark", "account", "import", "pause", "resume", "url", "fpost", "ufpost", "edit", "notice", "stats", "next", "view", "bookmarks", "follow", "unfollow", "likes", "help", "reload", "attach", "detach", "pinned", "cat", "play", "translate", "read", "version", "local", "public", "block", "unblock", "unlike", "home", "page", "profile"}
@@ -92,16 +95,81 @@
 }
 
 
+type cmdflag uint8
+
+const (
+	status   cmdflag = 1 << iota
+	account
+	argument
+)
+
 type cmddata struct {
 	status *mastodon.Status
 	account *mastodon.Account
+	reblogger *mastodon.Status
 	raw_argument string
 	command string
 	content string
 	index string
+	hc *Hellclient
 }
 
 type cmd struct {
-	name string
 	data *cmddata
+	cmder cmder
+}
+
+type cmder interface {
+	name() string
+	flags() cmdflag
+	result(data *cmddata) string
+}
+
+func (cmd *cmd) String() string {
+	return cmd.cmder.result(cmd.data)
+}
+
+func (cmd *cmd) checkReqs() (err error) {
+	if (cmd.cmder.flags()&status != 0) && (cmd.cmder.flags()&account != 0) {
+		if cmd.data.status == nil && cmd.data.account == nil {
+			return fmt.Errorf("%s requires a status or an account", cmd.cmder.name())
+		}
+	} else {
+		if (cmd.cmder.flags()&status != 0) && (cmd.data.status == nil) {
+			return fmt.Errorf("%s requires a status", cmd.cmder.name())
+		}
+		if (cmd.cmder.flags()&account != 0) && (cmd.data.account == nil) {
+			return fmt.Errorf("%s requires an account", cmd.cmder.name())
+		}
+	}
+
+	if (cmd.cmder.flags()&argument != 0) && (cmd.data.raw_argument == "") {
+		return fmt.Errorf("%s requires an argument", cmd.cmder.name())
+	}
+
+	return nil
+}
+
+type dmcmd struct {}
+
+func (cmd *dmcmd) name() string {
+	return "dm"
+}
+
+func (cmd *dmcmd) flags() cmdflag {
+	return argument
+}
+
+func (cmd *dmcmd) result(data *cmddata) string {
+	hc :=data.hc
+	if data.raw_argument != "" {
+		hc.dispatchStatus(data.raw_argument, "direct")
+		return ""
+	}
+	hc.page = &Page{}
+	getter := &BasicStatusGetter{getter: hc.client.GetTimelineDirect}
+	hc.page.loader = &StatusPages{hc: hc, getter: getter}
+	fmt.Print(hc.page.String())
+	hc.pause(true)
+	return ""
 }
\ No newline at end of file
--- a/main.go
+++ b/main.go
@@ -85,8 +85,7 @@
 			} else {
 				postItem, postOK = homeMap[lastindex]
 			}
-
-
+			
 			var reblogger *mastodon.Status
 			//Okay now see if the post we end up with is a reblog
 			if postOK {
@@ -97,6 +96,22 @@
 				}
 			}
 
+			cmdctx := cmddata{
+				hc: hc,
+				command: command,
+				content: content,
+				raw_argument: arguments,
+			}
+			if lastaccount != nil {
+				cmdctx.account = lastaccount
+			}
+			if postOK {
+				cmdctx.status = postItem
+				cmdctx.account = &postItem.Account
+				cmdctx.reblogger = reblogger
+				cmdctx.index = index
+			}
+
 			accByNameOrRef := func() (account *mastodon.Account)  {
 				if lastaccount != nil {
 					account = lastaccount
@@ -143,7 +158,7 @@
 					fmt.Printf("Error reloading config: %s\n", err)
 					return
 				}
-				fmt.Println("Successfully reloaded preferences")
+			fmt.Println("Successfully reloaded preferences")
 				hc.preferences = &account.Preferences
 				return
 			case "stats":
@@ -263,15 +278,13 @@
 				}
 				return
 			case "dm":
-				if arguments != "" {
-					hc.dispatchStatus(arguments, "direct")
+				dm := cmd{data: &cmdctx, cmder: &dmcmd{}}
+				err := dm.checkReqs()
+				if err != nil {
+					fmt.Println(err)
 					return
 				}
-				hc.page = &Page{}
-				getter := &BasicStatusGetter{getter: hc.client.GetTimelineDirect}
-				hc.page.loader = &StatusPages{hc: hc, getter: getter}
-				fmt.Print(hc.page.String())
-				hc.pause(true)
+				fmt.Printf("%s", dm.String())
 				return
 			case "home":
 				hc.page = &Page{}
--