Current section

Files

Jump to
quarrel lib quarrel.ex
Raw

lib/quarrel.ex

defmodule Quarrel do
@moduledoc """
Documentation for `Quarrel`.
"""
alias Quarrel.Repo
alias Quarrel.SettingStore
@pubsub Quarrel.PubSub
@doc """
Adds a setting to a store
"""
def add_setting(guild, name, id)
def add_setting(%Nostrum.Struct.Guild{id: guild_id}, name, id) do
add_setting(guild_id, name, id)
end
def add_setting(guild_id, name, id) when is_atom(name) do
with {:ok, %{settings: settings} = store} <- get_store(guild_id),
nil <- Enum.find(settings, &valid_for_insert_or_update(&1, name)) do
settings = settings ++ [%SettingStore.Setting{name: to_string(name), discord_id: id}]
result =
store
|> SettingStore.changeset(%{})
|> Ecto.Changeset.put_embed(:settings, settings)
|> Repo.update()
case result do
{:ok, store} ->
config = into_config(store.settings)
Phoenix.PubSub.broadcast(@pubsub, "config:#{guild_id}", {SettingStore, config})
{:ok, config}
error ->
error
end
else
%SettingStore.Setting{} -> {:error, :already_exists}
error -> error
end
end
@doc """
Get a map of all the settings for a store
"""
def get_settings(guild)
def get_settings(%Nostrum.Struct.Guild{id: guild_id}) do
get_settings(guild_id)
end
def get_settings(guild_id) do
with {:ok, %{settings: settings}} <- get_store(guild_id) do
{:ok, into_config(settings)}
end
end
@doc false
def get_store(guild)
def get_store(%Nostrum.Struct.Guild{id: guild_id}) do
get_store(guild_id)
end
def get_store(guild_id) when is_integer(guild_id) do
case Repo.get_by(SettingStore, guild_id: guild_id) do
nil -> Repo.insert(%SettingStore{guild_id: guild_id})
store -> {:ok, store}
end
end
defp into_config(settings) when is_list(settings) do
Map.new(settings, fn %{name: name, discord_id: id} ->
{String.to_atom(name), id}
end)
end
defp valid_for_insert_or_update(%{name: n, discord_id: id}, name) do
to_string(n) == to_string(name) && id != nil
end
end