summaryrefslogtreecommitdiff
path: root/lib/lsg_irc/user_track.ex
diff options
context:
space:
mode:
Diffstat (limited to 'lib/lsg_irc/user_track.ex')
-rw-r--r--lib/lsg_irc/user_track.ex150
1 files changed, 0 insertions, 150 deletions
diff --git a/lib/lsg_irc/user_track.ex b/lib/lsg_irc/user_track.ex
deleted file mode 100644
index b67b9f6..0000000
--- a/lib/lsg_irc/user_track.ex
+++ /dev/null
@@ -1,150 +0,0 @@
-defmodule LSG.IRC.UserTrack do
- @moduledoc """
- User Track DB & Utilities
- """
-
- @ets LSG.IRC.UserTrack.Storage
- # {uuid, nick, nicks, privilege_map}
- # Privilege map:
- # %{"#channel" => [:operator, :voice]
- defmodule Storage do
-
- def delete(id) do
- op(fn(ets) -> :ets.delete(ets, id) end)
- end
-
- def insert(tuple) do
- op(fn(ets) -> :ets.insert(ets, tuple) end)
- end
-
- def op(fun) do
- GenServer.call(__MODULE__, {:op, fun})
- end
-
- def start_link do
- GenServer.start_link(__MODULE__, [], [name: __MODULE__])
- end
-
- def init([]) do
- ets = :ets.new(__MODULE__, [:set, :named_table, :protected, {:read_concurrency, true}])
- {:ok, ets}
- end
-
- def handle_call({:op, fun}, _from, ets) do
- returned = try do
- {:ok, fun.(ets)}
- rescue
- rescued -> {:error, rescued}
- catch
- rescued -> {:error, rescued}
- end
- {:reply, returned, ets}
- end
- end
-
- defmodule Id, do: use EntropyString
-
- defmodule User do
- defstruct [:id, :nick, :nicks, :username, :host, :realname, :privileges]
-
- def to_tuple(u = %__MODULE__{}) do
- {u.id || LSG.IRC.UserTrack.Id.large_id, u.nick, u.nicks || [], u.username, u.host, u.realname, u.privileges}
- end
-
- def from_tuple({id, nick, nicks, username, host, realname, privs}) do
- %__MODULE__{id: id, nick: nick, nicks: nicks, username: username, realname: realname, privileges: privs}
- end
- end
-
- def find_by_nick(nick) do
- case :ets.match(@ets, {:'$1', nick, :_, :_, :_, :_, :_}) do
- [[id]] -> lookup(id)
- _ -> nil
- end
- end
-
- def to_list, do: :ets.tab2list(@ets)
-
- def lookup(id) do
- case :ets.lookup(@ets, id) do
- [] -> nil
- [tuple] -> User.from_tuple(tuple)
- end
- end
-
- def operator?(channel, nick) do
- if user = find_by_nick(nick) do
- privs = Map.get(user.privileges, channel, [])
- Enum.member?(privs, :admin) || Enum.member?(privs, :operator)
- else
- false
- end
- end
-
- def joined(c, s), do: joined(c,s,[])
-
- def joined(channel, sender=%{nick: nick, user: uname, host: host}, privileges) do
- privileges = if LSG.IRC.admin?(sender) do
- privileges ++ [:admin]
- else privileges end
- user = if user = find_by_nick(nick) do
- %User{user | username: uname, host: host, privileges: Map.put(user.privileges || %{}, channel, privileges)}
- else
- %User{nick: nick, username: uname, host: host, privileges: %{channel => privileges}}
- end
-
- Storage.op(fn(ets) ->
- :ets.insert(ets, User.to_tuple(user))
- end)
- end
-
- def joined(channel, nick, privileges) do
- user = if user = find_by_nick(nick) do
- %User{user | privileges: Map.put(user.privileges, channel, privileges)}
- else
- %User{nick: nick, privileges: %{channel => privileges}}
- end
-
- Storage.op(fn(ets) ->
- :ets.insert(ets, User.to_tuple(user))
- end)
- end
-
- def renamed(old_nick, new_nick) do
- if user = find_by_nick(old_nick) do
- user = %User{user | nick: new_nick, nicks: [old_nick|user.nicks]}
- Storage.insert(User.to_tuple(user))
- end
- end
-
- def change_privileges(channel, nick, {add, remove}) do
- if user = find_by_nick(nick) do
- privs = Map.get(user.privileges, channel)
-
- privs = Enum.reduce(add, privs, fn(priv, acc) -> [priv|acc] end)
- privs = Enum.reduce(remove, privs, fn(priv, acc) -> List.delete(acc, priv) end)
-
- user = %User{user | privileges: Map.put(user.privileges, channel, privs)}
- Storage.insert(User.to_tuple(user))
- end
- end
-
- def parted(channel, nick) do
- if user = find_by_nick(nick) do
- privs = Map.delete(user.privileges, channel)
- if Enum.count(privs) > 0 do
- user = %User{user | privileges: privs}
- Storage.insert(User.to_tuple(user))
- else
- Storage.delete(user.id)
- end
- end
- end
-
- def quitted(sender) do
- if user = find_by_nick(sender.nick) do
- Storage.delete(user.id)
- end
- end
-
-end