summaryrefslogtreecommitdiff
path: root/lib/irc/client/command/join.ex
blob: f84dc4a080f465937c99fa05530fed82a1b6fef4 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
defmodule Irc.Client.Command.Join do
  alias Irc.Line

  @type t :: {:join, channel :: String.t()} | {:join, channel :: String.t(), Irc.User.t()}

  def init(_args) do
    {"JOIN", :join, ["extended-join"]}
  end

  # An user joined
  def handle_line(conn, line = %Line{command: "JOIN", source: source, args: [channel | args]}) do
    if Line.self?(line, conn) do
      {:event, {:join, channel}}
    else
      user = Irc.User.from_mask(source)
      user = case args do
        [] -> user
        [account, name] ->
          account = if account != "*", do: account
          {channel, %Irc.User{user | account: account, name: name}}
      end
      {:event, {:join, channel, user}}
    end
  end

  # Join a channel
  def handle_command(_, :join, [channel]) do
    {:send, ['JOIN', channel]}
  end

  # Outdated!
  def handle_buffer(%Irc.Connection{nick: nick}, %Line{command: "JOIN", source: %Irc.Mask{nick: nick}, args: [channel]}, buffer = %{channel: channel}) do
    {:finish, nil, {:event, {:join, channel}}}
  end

  def handle_buffer(_, _), do: :postpone

end