Browse Source

Added KICK handling and cleaned up part handling, fixed test incorrectness.

master
Gisle Aune 5 years ago
parent
commit
9a9cd33fd8
  1. 4
      channel.go
  2. 24
      client.go
  3. 72
      client_test.go

4
channel.go

@ -55,6 +55,10 @@ func (channel *Channel) Handle(event *Event, client *Client) {
{ {
channel.userlist.Remove(event.Nick) channel.userlist.Remove(event.Nick)
} }
case "packet.kick":
{
channel.userlist.Remove(event.Arg(1))
}
case "packet.nick": case "packet.nick":
{ {
channel.userlist.Rename(event.Nick, event.Arg(0)) channel.userlist.Rename(event.Nick, event.Arg(0))

24
client.go

@ -992,10 +992,6 @@ func (client *Client) handleEvent(event *Event) {
} }
client.handleInTarget(channel, event) client.handleInTarget(channel, event)
if channel != nil {
channel.Handle(event, client)
}
} }
case "packet.part": case "packet.part":
@ -1005,8 +1001,6 @@ func (client *Client) handleEvent(event *Event) {
break break
} }
channel.Handle(event, client)
if event.Nick == client.nick { if event.Nick == client.nick {
client.RemoveTarget(channel) client.RemoveTarget(channel)
} else { } else {
@ -1014,6 +1008,20 @@ func (client *Client) handleEvent(event *Event) {
} }
} }
case "packet.kick":
{
channel := client.Channel(event.Arg(0))
if channel == nil {
break
}
if event.Arg(1) == client.nick {
client.RemoveTarget(channel)
} else {
client.handleInTarget(channel, event)
}
}
case "packet.quit": case "packet.quit":
{ {
client.handleInTargets(event.Nick, event) client.handleInTargets(event.Nick, event)
@ -1216,6 +1224,10 @@ func (client *Client) handleInTargets(nick string, event *Event) {
} }
func (client *Client) handleInTarget(target Target, event *Event) { func (client *Client) handleInTarget(target Target, event *Event) {
if target == nil {
return
}
client.mutex.RLock() client.mutex.RLock()
target.Handle(event, client) target.Handle(event, client)

72
client_test.go

@ -105,9 +105,18 @@ func TestClient(t *testing.T) {
return nil return nil
}}, }},
{Kind: 'C', Data: "JOIN #Test"}, {Kind: 'C', Data: "JOIN #Test"},
{Kind: 'S', Data: ":Test768!~test@127.0.0.1 JOIN #Test *"},
{Kind: 'S', Data: ":testserver.example.com 353 Test768 = #Test :Test768!~test@127.0.0.1 @+Gisle!gisle@gisle.me"},
{Kind: 'S', Data: ":Test768!~Tester@127.0.0.1 JOIN #Test *"},
{Kind: 'S', Data: ":testserver.example.com 353 Test768 = #Test :Test768!~Tester@127.0.0.1 @+Gisle!irce@10.32.0.1"},
{Kind: 'S', Data: ":testserver.example.com 366 Test768 #Test :End of /NAMES list."}, {Kind: 'S', Data: ":testserver.example.com 366 Test768 #Test :End of /NAMES list."},
{Kind: 'S', Data: "PING :testserver.example.com"}, // Ping/Pong to sync.
{Kind: 'C', Data: "PONG :testserver.example.com"},
{Callback: func() error {
if client.Channel("#Test") == nil {
return errors.New("Channel #Test not found")
}
return nil
}},
{Kind: 'S', Data: ":Gisle!~irce@10.32.0.1 MODE #Test +osv Test768 Test768"}, {Kind: 'S', Data: ":Gisle!~irce@10.32.0.1 MODE #Test +osv Test768 Test768"},
{Kind: 'S', Data: ":Gisle!~irce@10.32.0.1 MODE #Test +N-s "}, {Kind: 'S', Data: ":Gisle!~irce@10.32.0.1 MODE #Test +N-s "},
{Kind: 'S', Data: ":Test1234!~test2@172.17.37.1 JOIN #Test Test1234"}, {Kind: 'S', Data: ":Test1234!~test2@172.17.37.1 JOIN #Test Test1234"},
@ -228,10 +237,10 @@ func TestClient(t *testing.T) {
{Kind: 'C', Data: "PRIVMSG #Test :\x01ACTION describes stuff\x01"}, {Kind: 'C', Data: "PRIVMSG #Test :\x01ACTION describes stuff\x01"},
{Kind: 'C', Data: "PRIVMSG #Test :Hello, World"}, {Kind: 'C', Data: "PRIVMSG #Test :Hello, World"},
{Kind: 'C', Data: "PRIVMSG #Test :Hello again"}, {Kind: 'C', Data: "PRIVMSG #Test :Hello again"},
{Kind: 'S', Data: ":Test768!~test@127.0.0.1 PRIVMSG #Test :\x01ACTION does stuff\x01"},
{Kind: 'S', Data: ":Test768!~test@127.0.0.1 PRIVMSG #Test :\x01ACTION describes stuff\x01"},
{Kind: 'S', Data: ":Test768!~test@127.0.0.1 PRIVMSG #Test :Hello, World"},
{Kind: 'S', Data: ":Test768!~test@127.0.0.1 PRIVMSG #Test :Hello again"},
{Kind: 'S', Data: ":Test768!~Tester@127.0.0.1 PRIVMSG #Test :\x01ACTION does stuff\x01"},
{Kind: 'S', Data: ":Test768!~Tester@127.0.0.1 PRIVMSG #Test :\x01ACTION describes stuff\x01"},
{Kind: 'S', Data: ":Test768!~Tester@127.0.0.1 PRIVMSG #Test :Hello, World"},
{Kind: 'S', Data: ":Test768!~Tester@127.0.0.1 PRIVMSG #Test :Hello again"},
{Callback: func() error { {Callback: func() error {
channel := client.Channel("#Test") channel := client.Channel("#Test")
if channel == nil { if channel == nil {
@ -244,7 +253,7 @@ func TestClient(t *testing.T) {
}}, }},
{Kind: 'C', Data: "MODE #Test +N"}, {Kind: 'C', Data: "MODE #Test +N"},
{Kind: 'C', Data: "NPCA #Test Test_NPC :stuffs things"}, {Kind: 'C', Data: "NPCA #Test Test_NPC :stuffs things"},
{Kind: 'S', Data: ":Test768!~test@127.0.0.1 MODE #Test +N"},
{Kind: 'S', Data: ":Test768!~Tester@127.0.0.1 MODE #Test +N"},
{Kind: 'S', Data: ":\x1FTest_NPC\x1F!Test768@npc.fakeuser.invalid PRIVMSG #Test :\x01ACTION stuffs things\x01"}, {Kind: 'S', Data: ":\x1FTest_NPC\x1F!Test768@npc.fakeuser.invalid PRIVMSG #Test :\x01ACTION stuffs things\x01"},
{Callback: func() error { {Callback: func() error {
channel := client.Channel("#Test") channel := client.Channel("#Test")
@ -263,6 +272,55 @@ func TestClient(t *testing.T) {
return nil return nil
}}, }},
{Kind: 'C', Data: "PART #Test"}, {Kind: 'C', Data: "PART #Test"},
{Kind: 'S', Data: ":Test768!~Tester@127.0.0.1 PART #Test"},
{Kind: 'S', Data: "PING :testserver.example.com"}, // Ping/Pong to sync.
{Kind: 'C', Data: "PONG :testserver.example.com"},
{Callback: func() error {
if client.Channel("#Test") != nil {
return errors.New("#Test is still there.")
}
return nil
}},
{Callback: func() error {
client.Join("#Test2")
return nil
}},
{Kind: 'C', Data: "JOIN #Test2"},
{Kind: 'S', Data: ":Test768!~Tester@127.0.0.1 JOIN #Test2 *"},
{Kind: 'S', Data: ":testserver.example.com 353 Test768 = #Test2 :Test768!~Tester@127.0.0.1 +DoomedUser!doom@example.com @+ZealousMod!zeal@example.com"},
{Kind: 'S', Data: ":testserver.example.com 366 Test768 #Test2 :End of /NAMES list."},
{Kind: 'S', Data: "PING :testserver.example.com"}, // Ping/Pong to sync.
{Kind: 'C', Data: "PONG :testserver.example.com"},
{Callback: func() error {
channel := client.Channel("#Test2")
if channel == nil {
return errors.New("Channel #Test2 not found")
}
return irctest.AssertUserlist(t, channel, "@ZealousMod", "+DoomedUser", "Test768")
}},
{Kind: 'S', Data: ":ZealousMod!zeal@example.com KICK #Test2 DoomedUser :Kickety kick"},
{Kind: 'S', Data: "PING :testserver.example.com sync"}, // Ping/Pong to sync.
{Kind: 'C', Data: "PONG :testserver.example.com sync"},
{Callback: func() error {
channel := client.Channel("#Test2")
if channel == nil {
return errors.New("Channel #Test2 not found")
}
return irctest.AssertUserlist(t, channel, "@ZealousMod", "Test768")
}},
{Kind: 'S', Data: ":ZealousMod!zeal@example.com KICK #Test2 Test768 :Kickety kick"},
{Kind: 'S', Data: "PING :testserver.example.com sync"}, // Ping/Pong to sync.
{Kind: 'C', Data: "PONG :testserver.example.com sync"},
{Callback: func() error {
if client.Channel("#Test2") != nil {
return errors.New("#Test2 is still there.")
}
return nil
}},
}, },
} }

Loading…
Cancel
Save