Proxichat/lib/proxichat/channel_authenticator.ex
Mikko Ahlroth d031961a84 HÄXFEST 2015 !!! ! ! ! !
ZZZZZZZZZ
2015-11-29 06:34:42 +02:00

63 lines
1.3 KiB
Elixir

defmodule Proxichat.ChannelAuthenticator do
@moduledoc """
This module stores the list of current users in an ETS database and can be used to check if given user IDs are valid.
"""
use GenServer
@user_table :proxichat_users
def start_link(opts \\ []) do
GenServer.start_link(__MODULE__, :ok, opts)
end
def init(:ok) do
init_db
{:ok, nil}
end
def init_db() do
if :ets.info(@user_table) == :undefined do
:ets.new @user_table, [:named_table, :set, :public, read_concurrency: true]
end
end
def check_user(user_id) do
case get_user user_id do
nil -> create_user
user -> user
end
end
def get_user(user_id) do
case :ets.lookup @user_table, user_id do
[{_, user}] -> user.id
_ -> nil
end
end
def create_user() do
id = get_new_user_id
user = %{id: id}
update_user user
id
end
def user_set_network(user_id, network_id) do
get_user user_id
|> Map.put(:network, network_id)
|> update_user
end
def user_check_network(user_id, network_id) do
user = get_user user_id
Map.get(user, :network, nil) == network_id
end
def update_user(user) do
:ets.insert @user_table, {user.id, user}
end
defp get_new_user_id() do
UUID.uuid4
end
end