summaryrefslogtreecommitdiff
path: root/lib/irc/client/command/join.ex
blob: f4728c76e2df992275a1b4cc0d475e19380bdc0c (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
39
40
defmodule Irc.Client.Command.Join do
  alias Irc.Parser.Line
  require Line
  import 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(line = %Line{command: "JOIN", source: source, args: [channel | args]}, conn) 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], _conn_info) do
    {:send, ['JOIN', channel]}
  end

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

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

end