shithub: hell

Download patch

ref: 6f0f31a4efc83576aa1188f6efba6cb55a974dcf
parent: 2e100723bde5eb24ab032f4783478108685b30e7
author: penny <penny@limitedideas.org>
date: Mon Nov 3 15:49:47 EST 2025

port /rm and /reply

--- a/commands.go
+++ b/commands.go
@@ -5,6 +5,7 @@
 	"runtime/debug"
 	"strings"
 	"time"
+	"context"
 
 	mastodon "codeberg.org/penny64/hellclient-go-mastodon"
 )
@@ -103,7 +104,10 @@
 	status
 	account
 	argument
+	// Resolve @user@domain stringfs for us
 	acc_resolve
+	// Load user's own most recent post if they have one
+	want_recent
 )
 
 type cmdloader struct {
@@ -154,14 +158,27 @@
 	if err != nil {
 		return "", nil
 	}
+	hc := loader.hc
 	if !data.cmd_found {
 		return "", fmt.Errorf("Command %s not found.\n", data.command)
 	}
 	flags := loader.cmdmap[data.command].flags()
 	if flags&acc_resolve != 0 {
-		data.status = nil
 		data.account = data.lookupAccount(loader)
+		if data.status != nil && data.status.ID != data.account.ID {
+			data.status = nil
+		}
 	}
+	if flags&want_recent != 0 && !data.found_index {
+		if hc.recentpost != nil {
+			data.status = hc.recentpost
+			data.account = &hc.recentpost.Account
+		}
+	}
+	err = data.checkReqs(loader.cmdmap[data.command].flags())
+	if err != nil {
+		return "", err
+	}
 	return loader.cmdmap[data.command].result(data), nil
 }
 
@@ -232,11 +249,6 @@
 	index        string
 }
 
-// Cmder interface and post data
-type cmd struct {
-	data  *cmddata
-	cmder cmder
-}
 
 type cmder interface {
 	name() string
@@ -244,30 +256,27 @@
 	result(data *cmddata) string
 }
 
-func (cmd *cmd) String() string {
-	return cmd.cmder.result(cmd.data)
-}
 
 // return an error message if cmddata matches cmders flags
-func (cmd *cmd) checkReqs() (err error) {
-	if cmd.cmder.flags()&free != 0 {
+func (cmd *cmddata) checkReqs(flags cmdflag) (err error) {
+	if flags&free != 0 {
 		return nil
 	}
-	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())
+	if (flags&status != 0) && (flags&account != 0) {
+		if cmd.status == nil && cmd.account == nil {
+			return fmt.Errorf("%s requires a status or an account\n", cmd.command)
 		}
 	} else {
-		if (cmd.cmder.flags()&status != 0) && (cmd.data.status == nil) {
-			return fmt.Errorf("%s requires a status", cmd.cmder.name())
+		if (flags&status != 0) && (cmd.status == nil) {
+			return fmt.Errorf("%s requires a status\n", cmd.command)
 		}
-		if (cmd.cmder.flags()&account != 0) && (cmd.data.account == nil) {
-			return fmt.Errorf("%s requires an account", cmd.cmder.name())
+		if (flags&account != 0) && (cmd.account == nil) {
+			return fmt.Errorf("%s requires an account\n", cmd.command)
 		}
 	}
 
-	if (cmd.cmder.flags()&argument != 0) && (cmd.data.raw_argument == "") {
-		return fmt.Errorf("%s requires an argument", cmd.cmder.name())
+	if (flags&argument != 0) && (cmd.raw_argument == "") {
+		return fmt.Errorf("%s requires an argument\n", cmd.command)
 	}
 
 	return nil
@@ -309,7 +318,7 @@
 }
 
 func (cmd *profilecmd) flags() cmdflag {
-	return free | acc_resolve
+	return account | acc_resolve
 }
 
 func (cmd *profilecmd) result(data *cmddata) string {
@@ -597,8 +606,48 @@
 	return cmd
 }
 
+func (hc *Hellclient) replycmd() cmder {
+	cmd := &basiccmd{}
+	cmd.hc = hc
+	cmd.bname = "reply"
+	cmd.bflags = status
+	cmd.doer = func(data *cmddata) string {
+		if data.status != nil {
+			hc.dispatchReply(data.content, data.status.SpoilerText, data.status.ID, data.status)
+		}
+		return ""
+	}
+	return cmd
+}
+
+func (hc *Hellclient) rmcmd() cmder {
+	cmd := &basiccmd{}
+	cmd.hc = hc
+	cmd.bname = "rm"
+	cmd.bflags = status | want_recent
+	cmd.doer = func(data *cmddata) string {
+		if data.status != nil {
+			var err error
+			deletefunc := func(job *GenericJob) {
+				err = hc.client.DeleteStatus(context.Background(), data.status.ID)
+			}
+			deleteJob := hc.dispatchFunc(deletefunc)
+			deleteJob.Wait()
+			if err != nil {
+				return fmt.Sprintln(err)
+			}
+		}
+		//If we got here either this was already true or we deleted it?
+		hc.recentpost = nil
+		return ""
+	}
+	return cmd
+}
+
 func (hc *Hellclient) newCmdArray() []cmder {
 	cmdarray := []cmder{
+		hc.replycmd(),
+		hc.rmcmd(),
 		&profilecmd{hc, hc.cmdload},
 		&dmcmd{hc},
 		&helpcmd{hc},
--- a/main.go
+++ b/main.go
@@ -124,41 +124,6 @@
 
 			//Contextual commands that need to handle their own requirements
 			switch command {
-			case "rm":
-				if !foundindex && *recentpost != nil {
-					deletefunc := func(job *GenericJob) {
-						err = client.DeleteStatus(context.Background(), (*recentpost).ID)
-					}
-					deleteJob := hc.dispatchFunc(deletefunc)
-					deleteJob.Wait()
-					if err != nil {
-						fmt.Println(err)
-					}
-					*recentpost = nil
-					return
-				}
-				if !postOK {
-					fmt.Println("No recent status to delete or post index not valid")
-					return
-				}
-				deletefunc := func(job *GenericJob) {
-					err = client.DeleteStatus(context.Background(), (*postItem).ID)
-				}
-				deleteJob := hc.dispatchFunc(deletefunc)
-				deleteJob.Wait()
-				if err != nil {
-					fmt.Println(err)
-				}
-				return
-			case "dm":
-				dm := cmd{data: cmdctx, cmder: &dmcmd{hc}}
-				err := dm.checkReqs()
-				if err != nil {
-					fmt.Println(err)
-					return
-				}
-				fmt.Printf("%s", dm.String())
-				return
 			case "home":
 				hc.page = &Page{}
 				getter := &BasicStatusGetter{getter: hc.client.GetTimelineHome}
@@ -606,15 +571,6 @@
 				fmt.Printf("\"%v\" requires an argument\n", command)
 				return
 			}
-
-			switch command {
-			case "reply":
-				if postOK {
-					hc.dispatchReply(content, postItem.SpoilerText, postItem.ID, postItem)
-				}
-				return
-			}
-
 		}()
 	}
 }
--