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{}--
⑨