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 def get_listener_pid(guild, name) do GenServer.whereis(Quarrel.GuildSupervisor.NameProvider.via(guild, name)) end end