diff options
Diffstat (limited to 'lib/irc/mask.ex')
-rw-r--r-- | lib/irc/mask.ex | 38 |
1 files changed, 37 insertions, 1 deletions
diff --git a/lib/irc/mask.ex b/lib/irc/mask.ex index 5106c26..7f68d1a 100644 --- a/lib/irc/mask.ex +++ b/lib/irc/mask.ex @@ -1,7 +1,8 @@ defmodule Irc.Mask do + alias Irc.Addressable @type t :: %__MODULE__{nick: nil | String.t(), user: nil | String.t(), host: nil | String.t(), server: nil | String.t()} - defstruct [:nick, :user, :host, :server] + defstruct [:nick, :user, :host, :server, {:__private__, %{owner: nil, owner_module: nil}}] @spec parse(String.t) :: {:ok, t()} | {:error, :invalid_mask} def parse(string) do @@ -12,10 +13,39 @@ defmodule Irc.Mask do end end + def parse(string, module, pid) do + case parse(string) do + {:ok, x} -> {:ok, set_owner(x, module, pid)} + error -> error + end + end + + @spec equal?(Addressable.t(), Addressable.t()) :: boolean + def equal?(a, b) do + import Addressable + (owner(a) == owner(b)) && (nick(a) == nick(b)) + end + + def from_addressable(addressable) do + import Addressable + new(nick(addressable), + user(addressable), + host(addressable) + ) + |> set_owner(owner_module(addressable), owner(addressable)) + end + def new(nick, user, host) do %__MODULE__{nick: nick, user: user, host: host} end + def set_owner(t = %{__private__: private = %{owner: nil, owner_module: nil}}, module, pid) when is_atom(module) and is_pid(pid) do + private = private + |> Map.put(:owner, pid) + |> Map.put(:owner_module, module) + %{t | __private__: private} + end + def to_string(%__MODULE__{server: nil, nick: nick, user: user, host: host}) do Enum.join([nick, "!", user, "@", host]) end @@ -40,6 +70,12 @@ defmodule Irc.Mask do defdelegate to_string(struct), to: Irc.Mask 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 + defimpl Inspect, for: __MODULE__ do @moduledoc false import Inspect.Algebra |