summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Schoenfelder <paulschoenfelder@gmail.com>2016-03-31 12:25:49 -0500
committerPaul Schoenfelder <paulschoenfelder@gmail.com>2016-03-31 12:25:49 -0500
commiteb822271015334663cbcb66ea98e6bffbe84ee53 (patch)
tree961ef79ce3b5e784d9fbccf9d6595e70dcd0845b
parentMerge pull request #46 from jeffweiss/add_test_for_stripping_rank_from_nicks (diff)
parenthandle QUIT messages (diff)
Merge pull request #48 from jeffweiss/handle_quit
handle QUIT messages
-rw-r--r--lib/exirc/channels.ex10
-rw-r--r--lib/exirc/client.ex9
-rw-r--r--test/channels_test.exs15
3 files changed, 34 insertions, 0 deletions
diff --git a/lib/exirc/channels.ex b/lib/exirc/channels.ex
index b7a6d4c..b108de9 100644
--- a/lib/exirc/channels.ex
+++ b/lib/exirc/channels.ex
@@ -118,6 +118,16 @@ defmodule ExIrc.Channels do
users_manip(channel_tree, channel_name, manipfn)
end
+ def user_quit(channel_tree, nick) do
+ pnick = strip_rank([nick])
+ manipfn = fn(channel_nicks) -> :lists.usort(channel_nicks -- pnick) end
+ foldl = fn(channel_name, new_channel_tree) ->
+ name = downcase(channel_name)
+ users_manip(new_channel_tree, name, manipfn)
+ end
+ :lists.foldl(foldl, channel_tree, channels(channel_tree))
+ end
+
@doc """
Update the nick of a user in a tracked channel when they change their nick
"""
diff --git a/lib/exirc/client.ex b/lib/exirc/client.ex
index 0ef50cc..7fb9122 100644
--- a/lib/exirc/client.ex
+++ b/lib/exirc/client.ex
@@ -637,6 +637,15 @@ defmodule ExIrc.Client do
send_event {:parted, channel, sender}, new_state
{:noreply, new_state}
end
+ def handle_data(%IrcMessage{cmd: "QUIT", nick: from, host: host, user: user} = msg, state) do
+ sender = %SenderInfo{nick: from, host: host, user: user}
+ reason = msg.args |> List.first
+ if state.debug?, do: debug "#{from} QUIT"
+ channels = Channels.user_quit(state.channels, from)
+ new_state = %{state | channels: channels}
+ send_event {:quit, reason, sender}, new_state
+ {:noreply, new_state}
+ end
# Called when we receive a PING
def handle_data(%IrcMessage{cmd: "PING"} = msg, %ClientState{autoping: true} = state) do
if state.debug?, do: debug "RECEIVED A PING!"
diff --git a/test/channels_test.exs b/test/channels_test.exs
index 1c0b424..a1549ca 100644
--- a/test/channels_test.exs
+++ b/test/channels_test.exs
@@ -100,6 +100,21 @@ defmodule ExIrc.ChannelsTest do
assert {:error, :no_such_channel} == Channels.channel_has_user?(channels, "#testchannel", "testnick")
end
+ test "Can quit a user from all channels" do
+ channels =
+ Channels.init()
+ |> Channels.join("#testchannel")
+ |> Channels.user_join("#testchannel", "testnick")
+ |> Channels.join("#anotherchannel")
+ |> Channels.user_join("#anotherchannel", "testnick")
+ |> Channels.user_join("#anotherchannel", "secondnick")
+ assert Channels.channel_has_user?(channels, "#testchannel", "testnick")
+ channels = channels |> Channels.user_quit("testnick")
+ refute Channels.channel_has_user?(channels, "#testchannel", "testnick")
+ refute Channels.channel_has_user?(channels, "#anotherchannel", "testnick")
+ assert Channels.channel_has_user?(channels, "#anotherchannel", "secondnick")
+ end
+
test "Can rename a user" do
channels = Channels.init()
|> Channels.join("#testchannel")