d031961a84
ZZZZZZZZZ
63 lines
1.3 KiB
Elixir
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
|