From e6043462118b77b41a89c90e26b9ae5a938ffcbd Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Sun, 27 May 2018 15:30:52 +0300 Subject: [PATCH] Add very basic arbitrary message/state event sending commands --- ui/command-processor.go | 28 ++++++++++--------- ui/commands.go | 59 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+), 12 deletions(-) diff --git a/ui/command-processor.go b/ui/command-processor.go index 9d646ff..04ade4d 100644 --- a/ui/command-processor.go +++ b/ui/command-processor.go @@ -36,10 +36,11 @@ type Command struct { gomuksPointerContainer Handler *CommandProcessor - Room *RoomView - Command string - Args []string - OrigText string + Room *RoomView + Command string + OrigCommand string + Args []string + OrigText string } func (cmd *Command) Reply(message string, args ...interface{}) { @@ -74,7 +75,9 @@ func NewCommandProcessor(parent *MainView) *CommandProcessor { Gomuks: parent.gmx, }, aliases: map[string]*Alias{ - "part": {"leave"}, + "part": {"leave"}, + "send": {"sendevent"}, + "state": {"setstate"}, }, commands: map[string]CommandHandler{ "unknown-command": cmdUnknownCommand, @@ -86,6 +89,8 @@ func NewCommandProcessor(parent *MainView) *CommandProcessor { "join": cmdJoin, "uitoggle": cmdUIToggle, "logout": cmdLogout, + "sendevent": cmdSendEvent, + "setstate": cmdSetState, }, } } @@ -95,17 +100,16 @@ func (ch *CommandProcessor) ParseCommand(roomView *RoomView, text string) *Comma return nil } text = text[1:] - args := strings.SplitN(text, " ", 2) - command := strings.ToLower(args[0]) - args = args[1:] + split := strings.SplitN(text, " ", -1) return &Command{ gomuksPointerContainer: ch.gomuksPointerContainer, Handler: ch, - Room: roomView, - Command: command, - Args: args, - OrigText: text, + Room: roomView, + Command: strings.ToLower(split[0]), + OrigCommand: split[0], + Args: split[1:], + OrigText: text, } } diff --git a/ui/commands.go b/ui/commands.go index 38694a5..a72f3c7 100644 --- a/ui/commands.go +++ b/ui/commands.go @@ -19,6 +19,7 @@ package ui import ( "maunium.net/go/gomuks/debug" "strings" + "encoding/json" ) func cmdMe(cmd *Command) { @@ -70,6 +71,64 @@ func cmdJoin(cmd *Command) { } } +func cmdSendEvent(cmd *Command) { + debug.Print(cmd.Command, cmd.Args, len(cmd.Args)) + if len(cmd.Args) < 3 { + cmd.Reply("Usage: /send ") + return + } + roomID := cmd.Args[0] + eventType := cmd.Args[1] + rawContent := strings.Join(cmd.Args[2:], "") + debug.Print(roomID, eventType, rawContent) + + var content interface{} + err := json.Unmarshal([]byte(rawContent), &content) + debug.Print(err) + if err != nil { + cmd.Reply("Failed to parse content: %v", err) + return + } + debug.Print("Sending event to", roomID, eventType, content) + + resp, err := cmd.Matrix.Client().SendMessageEvent(roomID, eventType, content) + debug.Print(resp, err) + if err != nil { + cmd.Reply("Error from server: %v", err) + } else { + cmd.Reply("Event sent, ID: %s", resp.EventID) + } +} + +func cmdSetState(cmd *Command) { + if len(cmd.Args) < 4 { + cmd.Reply("Usage: /setstate ") + return + } + + roomID := cmd.Args[0] + eventType := cmd.Args[1] + stateKey := cmd.Args[2] + if stateKey == "-" { + stateKey = "" + } + rawContent := strings.Join(cmd.Args[3:], "") + + var content interface{} + err := json.Unmarshal([]byte(rawContent), &content) + if err != nil { + cmd.Reply("Failed to parse content: %v", err) + return + } + debug.Print("Sending state event to", roomID, eventType, stateKey, content) + resp, err := cmd.Matrix.Client().SendStateEvent(roomID, eventType, stateKey, content) + if err != nil { + cmd.Reply("Error from server: %v", err) + } else { + cmd.Reply("State event sent, ID: %s", resp.EventID) + } +} + func cmdUIToggle(cmd *Command) { if len(cmd.Args) == 0 { cmd.Reply("Usage: /uitoggle ")