aboutsummaryrefslogtreecommitdiff
path: root/ui/command-processor.go
diff options
context:
space:
mode:
Diffstat (limited to 'ui/command-processor.go')
-rw-r--r--ui/command-processor.go128
1 files changed, 128 insertions, 0 deletions
diff --git a/ui/command-processor.go b/ui/command-processor.go
new file mode 100644
index 0000000..9d646ff
--- /dev/null
+++ b/ui/command-processor.go
@@ -0,0 +1,128 @@
+// gomuks - A terminal Matrix client written in Go.
+// Copyright (C) 2018 Tulir Asokan
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+package ui
+
+import (
+ "maunium.net/go/gomuks/interface"
+ "strings"
+ "maunium.net/go/gomuks/config"
+ "maunium.net/go/gomuks/debug"
+ "fmt"
+)
+
+type gomuksPointerContainer struct {
+ MainView *MainView
+ UI *GomuksUI
+ Matrix ifc.MatrixContainer
+ Config *config.Config
+ Gomuks ifc.Gomuks
+}
+
+type Command struct {
+ gomuksPointerContainer
+ Handler *CommandProcessor
+
+ Room *RoomView
+ Command string
+ Args []string
+ OrigText string
+}
+
+func (cmd *Command) Reply(message string, args ...interface{}) {
+ cmd.Room.AddServiceMessage(fmt.Sprintf(message, args...))
+}
+
+type Alias struct {
+ NewCommand string
+}
+
+func (alias *Alias) Process(cmd *Command) *Command {
+ cmd.Command = alias.NewCommand
+ return cmd
+}
+
+type CommandHandler func(cmd *Command)
+
+type CommandProcessor struct {
+ gomuksPointerContainer
+
+ aliases map[string]*Alias
+ commands map[string]CommandHandler
+}
+
+func NewCommandProcessor(parent *MainView) *CommandProcessor {
+ return &CommandProcessor{
+ gomuksPointerContainer: gomuksPointerContainer{
+ MainView: parent,
+ UI: parent.parent,
+ Matrix: parent.matrix,
+ Config: parent.config,
+ Gomuks: parent.gmx,
+ },
+ aliases: map[string]*Alias{
+ "part": {"leave"},
+ },
+ commands: map[string]CommandHandler{
+ "unknown-command": cmdUnknownCommand,
+ "help": cmdHelp,
+ "me": cmdMe,
+ "quit": cmdQuit,
+ "clearcache": cmdClearCache,
+ "leave": cmdLeave,
+ "join": cmdJoin,
+ "uitoggle": cmdUIToggle,
+ "logout": cmdLogout,
+ },
+ }
+}
+
+func (ch *CommandProcessor) ParseCommand(roomView *RoomView, text string) *Command {
+ if text[0] != '/' || len(text) < 2 {
+ return nil
+ }
+ text = text[1:]
+ args := strings.SplitN(text, " ", 2)
+ command := strings.ToLower(args[0])
+ args = args[1:]
+ return &Command{
+ gomuksPointerContainer: ch.gomuksPointerContainer,
+ Handler: ch,
+
+ Room: roomView,
+ Command: command,
+ Args: args,
+ OrigText: text,
+ }
+}
+
+func (ch *CommandProcessor) HandleCommand(cmd *Command) {
+ defer debug.Recover()
+ if cmd == nil {
+ return
+ }
+ if alias, ok := ch.aliases[cmd.Command]; ok {
+ cmd = alias.Process(cmd)
+ }
+ if cmd == nil {
+ return
+ }
+ if handler, ok := ch.commands[cmd.Command]; ok {
+ handler(cmd)
+ return
+ }
+ cmdUnknownCommand(cmd)
+}