diff --git a/client_test.go b/client_test.go index cfd6d1e..649f1a3 100644 --- a/client_test.go +++ b/client_test.go @@ -299,3 +299,36 @@ func TestClient(t *testing.T) { t.Logf("Log[%d] = %#+v", i, logLine) } } + +// TestParenthesesBug tests that the bugfix causing `((Remove :01 goofs!*))` to be parsed as an empty message. It was +// initially thought to be caused by the parentheses (like a hidden m_roleplay NPC attribution removal), hence the name +// for this function. +func TestParenthesesBug(t *testing.T) { + gotMessage := true + + client := irc.New(context.Background(), irc.Config{ + Nick: "Stuff", + }) + + irc.Handle(func(event *irc.Event, client *irc.Client) { + if event.Name() == "packet.privmsg" || event.Nick == "Dante" { + gotMessage = true + + if event.Text != "((Remove :01 goofs!*))" { + t.Errorf("Expected: %#+v", "((Remove :01 goofs!*))") + t.Errorf("Result: %#+v", event.Text) + } + } + }) + + packet, err := irc.ParsePacket("@example/tag=32; :Dante!TheBeans@captain.purple.beans PRIVMSG Stuff :((Remove :01 goofs!*))") + if err != nil { + t.Error("Parse", err) + } + + client.EmitSync(context.Background(), packet) + + if !gotMessage { + t.Error("Message was not received") + } +} diff --git a/event_packet.go b/event_packet.go index 8d3263f..79f5abd 100644 --- a/event_packet.go +++ b/event_packet.go @@ -2,6 +2,7 @@ package irc import ( "errors" + "fmt" "strings" "time" ) @@ -63,7 +64,7 @@ func ParsePacket(line string) (Event, error) { } // Parse body - split := strings.Split(line, " :") + split := strings.SplitN(line, " :", 2) tokens := strings.Split(split[0], " ") if len(split) == 2 { @@ -73,6 +74,8 @@ func ParsePacket(line string) (Event, error) { event.verb = tokens[0] event.Args = tokens[1:] + fmt.Printf("%#+v\n", split) + // Parse CTCP if (event.verb == "PRIVMSG" || event.verb == "NOTICE") && strings.HasPrefix(event.Text, "\x01") { verbtext := strings.SplitN(strings.Replace(event.Text, "\x01", "", 2), " ", 2)