summaryrefslogtreecommitdiff
path: root/lib/irc/user.ex
blob: 06a6b9728de45f21e6d596da3baba90571036a6a (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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
defmodule Irc.User do
  require Record

  @moduledoc """
  Represents an IRC user.

  Not all field may be returned in events.

  Its main structure is the struct `t()`, but the record `irc_user()` can be used to write queries against an ets collection.
  """

  @record :irc_user

  @attrs [
    :id,
    :owner,
    :nick,
    :user,
    :host,
    :name,
    :account,
    :server,
    :idle,
    :away,
    :connected_at,
    {:operator, false},
    {:modes, []},
    {:chanmodes, %{}},
    {:channels, []},
    {:assigns, %{}},
    {:private, %{persisted: false}},
  ]

  defstruct @attrs

  record_attrs = Enum.map(@attrs, fn
    ({_,_}=kv) -> kv
    (k) -> {k, :undefined}
  end)
  keys = :lists.map(&elem(&1, 0), record_attrs)
  vals = :lists.map(&{&1, [], nil}, keys)
  pairs = :lists.zip(keys, vals)

  Record.defrecord(@record, record_attrs)

#  @type t :: %__MODULE__{
#    id: String.t(),
#    owner: nil | pid(),
#    nick: String.t(),
#    user: nil | String.t(),
#    host: nil | String.t(),
#    name: nil | String.t(),
#    account: nil | String.t(),
#    server: nil | String.t(),
#    idle: nil | {non_neg_integer(), NaiveDateTime.t()},
#    operator: boolean(),
#    modes: [],
#    channels: [],
#    chanmodes: %{String.t() => String.t()},
##    assigns: %{any() => any()}
#  }
#  @type record :: record(:irc_user)

  @doc false
  def __attrs__, do: @attrs

#  @spec to_record(t()) :: t()
  def to_record(%__MODULE__{unquote_splicing(pairs)}) do
    {@record, unquote_splicing(vals)}
  end

#  @spec from_record(t()) :: t()
  def from_record({@record, unquote_splicing(vals)}) do
    %__MODULE__{unquote_splicing(pairs)}
  end

#  @spec from_mask(IRC.Mask.t()) :: t()
  def from_mask(%Irc.Mask{user: user, nick: nick, host: host}) when is_binary(nick) do
    %__MODULE__{nick: nick, user: user, host: host}
  end

#  @spec to_mask(t()) :: IRC.Mask.t()
  def to_mask(%__MODULE__{nick: nick, user: user, host: host}) do
    Irc.Mask.new(nick, user, host)
  end

  defimpl Irc.Addressable, for: __MODULE__ do
    def nick(%{nick: nick}), do: nick
    def user(%{user: user}), do: user
    def host(%{host: host}), do: host
  end
end