From edcbd2035a05d0d03aed732925197460eae109b8 Mon Sep 17 00:00:00 2001 From: Andrew Date: Sat, 4 May 2019 09:53:46 +1000 Subject: [PATCH 1/8] Add basic command handler --- client/client.go | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/client/client.go b/client/client.go index d8d591f..64545b3 100644 --- a/client/client.go +++ b/client/client.go @@ -18,6 +18,8 @@ import ( "github.com/goshuirc/irc-go/ircmsg" ) +var basicCmdPrefixes = []byte{'!', '@', '~', '.', '$'} + // ServerConnection is a connection to a single server. type ServerConnection struct { Name string @@ -176,6 +178,10 @@ func (sc *ServerConnection) ProcessIncomingLine(line string) { // IRC commands are case-insensitive sc.dispatchIn(strings.ToUpper(cmd), info) + if strings.ToUpper(cmd) == "PRIVMSG" { + sc.dispatchBasicCmd(info) + } + } // Disconnect closes the IRC socket. @@ -273,6 +279,18 @@ func (sc *ServerConnection) Send(tags map[string]string, prefix string, command return nil } +// dispatchCommand dispatches an event based on simple commands (e.g !help) +func (sc *ServerConnection) dispatchBasicCmd(info eventmgr.InfoMap) { + cmd := info["params"].([]string) + pfx := cmd[1][0] + + for _, p := range basicCmdPrefixes { + if pfx == p { + sc.eventsIn.Dispatch("cmd"+cmd[1], info) + } + } +} + // dispatchRawIn dispatches raw inbound messages. func (sc *ServerConnection) dispatchRawIn(info eventmgr.InfoMap) { sc.eventsIn.Dispatch("raw", info) From e1e4e900f80027d18c55fcf5500953775557972c Mon Sep 17 00:00:00 2001 From: Andrew Date: Sat, 4 May 2019 10:01:18 +1000 Subject: [PATCH 2/8] gofmt --- client/client.go | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/client/client.go b/client/client.go index 64545b3..20058d0 100644 --- a/client/client.go +++ b/client/client.go @@ -178,9 +178,9 @@ func (sc *ServerConnection) ProcessIncomingLine(line string) { // IRC commands are case-insensitive sc.dispatchIn(strings.ToUpper(cmd), info) - if strings.ToUpper(cmd) == "PRIVMSG" { - sc.dispatchBasicCmd(info) - } + if strings.ToUpper(cmd) == "PRIVMSG" { + sc.dispatchBasicCmd(info) + } } @@ -281,14 +281,14 @@ func (sc *ServerConnection) Send(tags map[string]string, prefix string, command // dispatchCommand dispatches an event based on simple commands (e.g !help) func (sc *ServerConnection) dispatchBasicCmd(info eventmgr.InfoMap) { - cmd := info["params"].([]string) - pfx := cmd[1][0] + cmd := info["params"].([]string) + pfx := cmd[1][0] - for _, p := range basicCmdPrefixes { - if pfx == p { - sc.eventsIn.Dispatch("cmd"+cmd[1], info) - } - } + for _, p := range basicCmdPrefixes { + if pfx == p { + sc.eventsIn.Dispatch("cmd"+cmd[1], info) + } + } } // dispatchRawIn dispatches raw inbound messages. From 0e3a2f777462e4e8bc5afbe08a9bcaccec17c5a5 Mon Sep 17 00:00:00 2001 From: Andrew Date: Mon, 6 May 2019 09:13:01 +1000 Subject: [PATCH 3/8] Correct issue with multiple params in basic commands --- client/client.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/client/client.go b/client/client.go index 20058d0..d93ba56 100644 --- a/client/client.go +++ b/client/client.go @@ -281,12 +281,12 @@ func (sc *ServerConnection) Send(tags map[string]string, prefix string, command // dispatchCommand dispatches an event based on simple commands (e.g !help) func (sc *ServerConnection) dispatchBasicCmd(info eventmgr.InfoMap) { - cmd := info["params"].([]string) - pfx := cmd[1][0] + cmd := strings.Split(info["params"].([]string)[1], " ")[0] + pfx := cmd[0] for _, p := range basicCmdPrefixes { if pfx == p { - sc.eventsIn.Dispatch("cmd"+cmd[1], info) + sc.eventsIn.Dispatch("cmd"+cmd, info) } } } From 9159419f769c4cb9b4286d91158b1707b1666766 Mon Sep 17 00:00:00 2001 From: Andrew Date: Wed, 8 May 2019 10:07:13 +1000 Subject: [PATCH 4/8] add RegisterCommand --- client/client.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/client/client.go b/client/client.go index a6c555f..cb53496 100644 --- a/client/client.go +++ b/client/client.go @@ -228,6 +228,11 @@ func (sc *ServerConnection) RegisterEvent(direction string, name string, handler } } +// RegisterCommand registers a command to be called via the configured prefix or the client's nickname (e.g !help, "GoshuBot: help") +func (sc *ServerConnection) RegisterCommand(name string, handler eventmgr.HandlerFn, priority int) { + sc.eventsIn.Attach("cmd_"+name, handler, priority) +} + // Shutdown closes the connection to the server. func (sc *ServerConnection) Shutdown(message string) { sc.Send(nil, "", "QUIT", message) From 25d0fa8e699be8dc17f87260aad55745532281de Mon Sep 17 00:00:00 2001 From: Andrew Date: Wed, 8 May 2019 11:24:17 +1000 Subject: [PATCH 5/8] Change dispatchBasicCmd to reflect the new new command handler --- client/client.go | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/client/client.go b/client/client.go index cb53496..dbddc74 100644 --- a/client/client.go +++ b/client/client.go @@ -179,7 +179,7 @@ func (sc *ServerConnection) ProcessIncomingLine(line string) { // IRC commands are case-insensitive sc.dispatchIn(strings.ToUpper(cmd), info) if strings.ToUpper(cmd) == "PRIVMSG" { - sc.dispatchBasicCmd(info) + sc.dispatchCommand(info) } } @@ -285,14 +285,15 @@ func (sc *ServerConnection) Send(tags map[string]string, prefix string, command } // dispatchCommand dispatches an event based on simple commands (e.g !help) -func (sc *ServerConnection) dispatchBasicCmd(info eventmgr.InfoMap) { - cmd := strings.Split(info["params"].([]string)[1], " ")[0] - pfx := cmd[0] +func (sc *ServerConnection) dispatchCommand(info eventmgr.InfoMap) { + params := strings.Split(info["params"].([]string)[1], " ") for _, p := range basicCmdPrefixes { - if pfx == p { - sc.eventsIn.Dispatch("cmd"+cmd, info) - } + if strings.HasPrefix(params[0], string(p)) { + sc.eventsIn.Dispatch("cmd_"+params[0][1:], info) + } else if (params[0] == sc.Nick || params[0] == sc.Nick + ":") && len(params) > 1 { + sc.eventsIn.Dispatch("cmd_"+params[1], info) + } } } From 9ca236b9e0139a6c37408d6b488044b48d91756c Mon Sep 17 00:00:00 2001 From: Andrew Date: Wed, 8 May 2019 11:38:05 +1000 Subject: [PATCH 6/8] move command prefixes to ServerConnection and update functions to use it --- client/client.go | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/client/client.go b/client/client.go index dbddc74..35f8fc7 100644 --- a/client/client.go +++ b/client/client.go @@ -18,14 +18,13 @@ import ( "github.com/goshuirc/irc-go/ircmsg" ) -var basicCmdPrefixes = []byte{'!', '@', '~', '.', '$'} - // ServerConnection is a connection to a single server. type ServerConnection struct { Name string Connected bool Registered bool Casemapping ircmap.MappingType + CommandPrefixes []string // internal stuff RawConnection net.Conn @@ -288,13 +287,16 @@ func (sc *ServerConnection) Send(tags map[string]string, prefix string, command func (sc *ServerConnection) dispatchCommand(info eventmgr.InfoMap) { params := strings.Split(info["params"].([]string)[1], " ") - for _, p := range basicCmdPrefixes { - if strings.HasPrefix(params[0], string(p)) { + for _, p := range sc.CommandPrefixes { + if strings.HasPrefix(params[0], p) { sc.eventsIn.Dispatch("cmd_"+params[0][1:], info) - } else if (params[0] == sc.Nick || params[0] == sc.Nick + ":") && len(params) > 1 { - sc.eventsIn.Dispatch("cmd_"+params[1], info) + return } } + + if (params[0] == sc.Nick || params[0] == sc.Nick + ":") && len(params) > 1 { + sc.eventsIn.Dispatch("cmd_"+params[1], info) + } } // dispatchRawIn dispatches raw inbound messages. From 48af37d99994c3bcd69c3c0320c91a431ffa0f04 Mon Sep 17 00:00:00 2001 From: Andrew Date: Wed, 8 May 2019 11:40:28 +1000 Subject: [PATCH 7/8] run go fmt over the client file since my editor likes to chowder indents --- client/client.go | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/client/client.go b/client/client.go index 35f8fc7..b8217e4 100644 --- a/client/client.go +++ b/client/client.go @@ -20,11 +20,11 @@ import ( // ServerConnection is a connection to a single server. type ServerConnection struct { - Name string - Connected bool - Registered bool - Casemapping ircmap.MappingType - CommandPrefixes []string + Name string + Connected bool + Registered bool + Casemapping ircmap.MappingType + CommandPrefixes []string // internal stuff RawConnection net.Conn @@ -229,7 +229,7 @@ func (sc *ServerConnection) RegisterEvent(direction string, name string, handler // RegisterCommand registers a command to be called via the configured prefix or the client's nickname (e.g !help, "GoshuBot: help") func (sc *ServerConnection) RegisterCommand(name string, handler eventmgr.HandlerFn, priority int) { - sc.eventsIn.Attach("cmd_"+name, handler, priority) + sc.eventsIn.Attach("cmd_"+name, handler, priority) } // Shutdown closes the connection to the server. @@ -289,14 +289,14 @@ func (sc *ServerConnection) dispatchCommand(info eventmgr.InfoMap) { for _, p := range sc.CommandPrefixes { if strings.HasPrefix(params[0], p) { - sc.eventsIn.Dispatch("cmd_"+params[0][1:], info) - return - } + sc.eventsIn.Dispatch("cmd_"+params[0][1:], info) + return + } } - if (params[0] == sc.Nick || params[0] == sc.Nick + ":") && len(params) > 1 { - sc.eventsIn.Dispatch("cmd_"+params[1], info) - } + if (params[0] == sc.Nick || params[0] == sc.Nick+":") && len(params) > 1 { + sc.eventsIn.Dispatch("cmd_"+params[1], info) + } } // dispatchRawIn dispatches raw inbound messages. From ac99fbdf859db8039a46198d8126c2214c99bea6 Mon Sep 17 00:00:00 2001 From: Andrew Date: Wed, 8 May 2019 11:56:12 +1000 Subject: [PATCH 8/8] change split to fields --- client/client.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/client.go b/client/client.go index b8217e4..2b9cf48 100644 --- a/client/client.go +++ b/client/client.go @@ -285,7 +285,7 @@ func (sc *ServerConnection) Send(tags map[string]string, prefix string, command // dispatchCommand dispatches an event based on simple commands (e.g !help) func (sc *ServerConnection) dispatchCommand(info eventmgr.InfoMap) { - params := strings.Split(info["params"].([]string)[1], " ") + params := strings.Fields(info["params"].([]string)[1]) for _, p := range sc.CommandPrefixes { if strings.HasPrefix(params[0], p) {