diff --git a/client/line.go b/client/line.go index 706d373..f8ff82a 100644 --- a/client/line.go +++ b/client/line.go @@ -17,7 +17,7 @@ type Line struct { Time time.Time } -// NOTE: this doesn't copy l.Time (this should be read-only anyway) +// Copy() returns a deep copy of the Line. func (l *Line) Copy() *Line { nl := *l nl.Args = make([]string, len(l.Args)) @@ -25,6 +25,7 @@ func (l *Line) Copy() *Line { return &nl } +// parseLine() creates a Line from an incoming message from the IRC server. func parseLine(s string) *Line { line := &Line{Raw: s} if s[0] == ':' { @@ -62,7 +63,7 @@ func parseLine(s string) *Line { // So, I think CTCP and (in particular) CTCP ACTION are better handled as // separate events as opposed to forcing people to have gargantuan // handlers to cope with the possibilities. - if (line.Cmd == "PRIVMSG" || line.Cmd == "NOTICE") && + if (line.Cmd == PRIVMSG || line.Cmd == NOTICE) && len(line.Args[1]) > 2 && strings.HasPrefix(line.Args[1], "\001") && strings.HasSuffix(line.Args[1], "\001") { @@ -72,16 +73,16 @@ func parseLine(s string) *Line { // Replace the line with the unwrapped CTCP line.Args[1] = t[1] } - if c := strings.ToUpper(t[0]); c == "ACTION" && line.Cmd == "PRIVMSG" { + if c := strings.ToUpper(t[0]); c == ACTION && line.Cmd == PRIVMSG { // make a CTCP ACTION it's own event a-la PRIVMSG line.Cmd = c } else { // otherwise, dispatch a generic CTCP/CTCPREPLY event that // contains the type of CTCP in line.Args[0] - if line.Cmd == "PRIVMSG" { - line.Cmd = "CTCP" + if line.Cmd == PRIVMSG { + line.Cmd = CTCP } else { - line.Cmd = "CTCPREPLY" + line.Cmd = CTCPREPLY } line.Args = append([]string{c}, line.Args...) } diff --git a/client/line_test.go b/client/line_test.go index 37e43dd..7ae2db5 100644 --- a/client/line_test.go +++ b/client/line_test.go @@ -5,7 +5,7 @@ import ( "time" ) -func TestCopy(t *testing.T) { +func TestLineCopy(t *testing.T) { l1 := &Line{ Nick: "nick", Ident: "ident", @@ -22,7 +22,7 @@ func TestCopy(t *testing.T) { // Ugly. Couldn't be bothered to bust out reflect and actually think. if l2.Nick != "nick" || l2.Ident != "ident" || l2.Host != "host" || l2.Src != "src" || l2.Cmd != "cmd" || l2.Raw != "raw" || - l2.Args[0] != "arg" || l2.Args[1] != "text" { + l2.Args[0] != "arg" || l2.Args[1] != "text" || l2.Time != l1.Time { t.Errorf("Line not copied correctly") t.Errorf("l1: %#v\nl2: %#v", l1, l2) } @@ -33,10 +33,11 @@ func TestCopy(t *testing.T) { l2.Host = "" l2.Args[0] = l2.Args[0][1:] l2.Args[1] = "bar" + l2.Time = time.Now() if l1.Nick != "nick" || l1.Ident != "ident" || l1.Host != "host" || l1.Src != "src" || l1.Cmd != "cmd" || l1.Raw != "raw" || - l1.Args[0] != "arg" || l1.Args[1] != "text" { + l1.Args[0] != "arg" || l1.Args[1] != "text" || l1.Time == l2.Time { t.Errorf("Original modified when copy changed") t.Errorf("l1: %#v\nl2: %#v", l1, l2) }