summaryrefslogtreecommitdiff
path: root/lib/plugins/account.ex
diff options
context:
space:
mode:
Diffstat (limited to 'lib/plugins/account.ex')
-rw-r--r--lib/plugins/account.ex326
1 files changed, 179 insertions, 147 deletions
diff --git a/lib/plugins/account.ex b/lib/plugins/account.ex
index 0377e1c..2977f4b 100644
--- a/lib/plugins/account.ex
+++ b/lib/plugins/account.ex
@@ -1,187 +1,219 @@
defmodule Nola.Plugins.Account do
- @moduledoc """
- # Account
-
- * **account** Get current account id and token
- * **auth `<account-id>` `<token>`** Authenticate and link the current nickname to an account
- * **auth** list authentications methods
- * **whoami** list currently authenticated users
- * **web** get a one-time login link to web
- * **enable-telegram** Link a Telegram account
- * **enable-sms** Link a SMS number
- * **enable-untappd** Link a Untappd account
- * **set-name** set account name
- * **setusermeta puppet-nick `<nick>`** Set puppet IRC nickname
- """
-
- def irc_doc, do: @moduledoc
- def start_link(), do: GenServer.start_link(__MODULE__, [], name: __MODULE__)
- def init(_) do
- {:ok, _} = Registry.register(Nola.PubSub, "messages:private", [])
- {:ok, nil}
- end
+ @moduledoc """
+ # Account
+
+ * **account** Get current account id and token
+ * **auth `<account-id>` `<token>`** Authenticate and link the current nickname to an account
+ * **auth** list authentications methods
+ * **whoami** list currently authenticated users
+ * **web** get a one-time login link to web
+ * **enable-telegram** Link a Telegram account
+ * **enable-sms** Link a SMS number
+ * **enable-untappd** Link a Untappd account
+ * **set-name** set account name
+ * **setusermeta puppet-nick `<nick>`** Set puppet IRC nickname
+ """
+
+ def irc_doc, do: @moduledoc
+ def start_link(), do: GenServer.start_link(__MODULE__, [], name: __MODULE__)
+
+ def init(_) do
+ {:ok, _} = Registry.register(Nola.PubSub, "messages:private", [])
+ {:ok, nil}
+ end
- def handle_info({:irc, :text, m = %Nola.Message{account: account, text: "help"}}, state) do
- text = [
- "account: show current account and auth token",
- "auth: show authentications methods",
- "whoami: list authenticated users",
- "set-name <name>: set account name",
- "web: login to web",
- "enable-sms | disable-sms: enable/change or disable sms",
- "enable-telegram: link/change telegram",
- "enable-untappd: link untappd account",
- "getmeta: show meta datas",
- "setusermeta: set user meta",
- ]
- m.replyfun.(text)
- {:noreply, state}
- end
+ def handle_info({:irc, :text, m = %Nola.Message{account: account, text: "help"}}, state) do
+ text = [
+ "account: show current account and auth token",
+ "auth: show authentications methods",
+ "whoami: list authenticated users",
+ "set-name <name>: set account name",
+ "web: login to web",
+ "enable-sms | disable-sms: enable/change or disable sms",
+ "enable-telegram: link/change telegram",
+ "enable-untappd: link untappd account",
+ "getmeta: show meta datas",
+ "setusermeta: set user meta"
+ ]
+
+ m.replyfun.(text)
+ {:noreply, state}
+ end
- def handle_info({:irc, :text, m = %Nola.Message{account: account, text: "auth"}}, state) do
- spec = [{{:"$1", :"$2"}, [{:==, :"$2", {:const, account.id}}], [:"$1"]}]
- predicates = :dets.select(Nola.Account.file("predicates"), spec)
- text = for {net, {key, value}} <- predicates, do: "#{net}: #{to_string(key)}: #{value}"
- m.replyfun.(text)
- {:noreply, state}
- end
+ def handle_info({:irc, :text, m = %Nola.Message{account: account, text: "auth"}}, state) do
+ spec = [{{:"$1", :"$2"}, [{:==, :"$2", {:const, account.id}}], [:"$1"]}]
+ predicates = :dets.select(Nola.Account.file("predicates"), spec)
+ text = for {net, {key, value}} <- predicates, do: "#{net}: #{to_string(key)}: #{value}"
+ m.replyfun.(text)
+ {:noreply, state}
+ end
+
+ def handle_info({:irc, :text, m = %Nola.Message{account: account, text: "whoami"}}, state) do
+ users =
+ for user <- Nola.UserTrack.find_by_account(m.account) do
+ chans =
+ Enum.map(user.privileges, fn {chan, _} -> chan end)
+ |> Enum.join(" ")
- def handle_info({:irc, :text, m = %Nola.Message{account: account, text: "whoami"}}, state) do
- users = for user <- Nola.UserTrack.find_by_account(m.account) do
- chans = Enum.map(user.privileges, fn({chan, _}) -> chan end)
- |> Enum.join(" ")
"#{user.network} - #{user.nick}!#{user.username}@#{user.host} - #{chans}"
end
- m.replyfun.(users)
- {:noreply, state}
- end
- def handle_info({:irc, :text, m = %Nola.Message{account: account, text: "account"}}, state) do
- account = Nola.Account.lookup(m.sender)
- text = ["Account Id: #{account.id}",
- "Authenticate to this account from another network: \"auth #{account.id} #{account.token}\" to the other bot!"]
- m.replyfun.(text)
- {:noreply, state}
- end
+ m.replyfun.(users)
+ {:noreply, state}
+ end
- def handle_info({:irc, :text, m = %Nola.Message{sender: sender, text: "auth"<>_}}, state) do
- #account = Nola.Account.lookup(m.sender)
- case String.split(m.text, " ") do
- ["auth", id, token] ->
- join_account(m, id, token)
- _ ->
- m.replyfun.("Invalid parameters")
- end
- {:noreply, state}
- end
+ def handle_info({:irc, :text, m = %Nola.Message{account: account, text: "account"}}, state) do
+ account = Nola.Account.lookup(m.sender)
- def handle_info({:irc, :text, m = %Nola.Message{account: account, text: "set-name "<>name}}, state) do
- Nola.Account.update_account_name(account, name)
- m.replyfun.("Name changed: #{name}")
- {:noreply, state}
- end
+ text = [
+ "Account Id: #{account.id}",
+ "Authenticate to this account from another network: \"auth #{account.id} #{account.token}\" to the other bot!"
+ ]
- def handle_info({:irc, :text, m = %Nola.Message{text: "disable-sms"}}, state) do
- if Nola.Account.get_meta(m.account, "sms-number") do
- Nola.Account.delete_meta(m.account, "sms-number")
- m.replyfun.("SMS disabled.")
- else
- m.replyfun.("SMS already disabled.")
- end
- {:noreply, state}
- end
+ m.replyfun.(text)
+ {:noreply, state}
+ end
- def handle_info({:irc, :text, m = %Nola.Message{text: "web"}}, state) do
- login_url = Nola.AuthToken.new_url(m.account.id, nil)
- m.replyfun.("↪:" <> login_url)
- {:noreply, state}
- end
+ def handle_info({:irc, :text, m = %Nola.Message{sender: sender, text: "auth" <> _}}, state) do
+ # account = Nola.Account.lookup(m.sender)
+ case String.split(m.text, " ") do
+ ["auth", id, token] ->
+ join_account(m, id, token)
- def handle_info({:irc, :text, m = %Nola.Message{text: "enable-sms"}}, state) do
- code = String.downcase(EntropyString.small_id())
- Nola.Account.put_meta(m.account, "sms-validation-code", code)
- Nola.Account.put_meta(m.account, "sms-validation-target", m.network)
- number = Nola.Plugins.Sms.my_number()
- text = "To enable or change your number for SMS messaging, please send:"
- <> " \"enable #{code}\" to #{number}"
- m.replyfun.(text)
- {:noreply, state}
+ _ ->
+ m.replyfun.("Invalid parameters")
end
- def handle_info({:irc, :text, m = %Nola.Message{text: "enable-telegram"}}, state) do
- code = String.downcase(EntropyString.small_id())
- Nola.Account.delete_meta(m.account, "telegram-id")
- Nola.Account.put_meta(m.account, "telegram-validation-code", code)
- Nola.Account.put_meta(m.account, "telegram-validation-target", m.network)
- text = "To enable or change your number for telegram messaging, please open #{Nola.Telegram.my_path()} and send:"
- <> " \"/enable #{code}\""
- m.replyfun.(text)
- {:noreply, state}
- end
+ {:noreply, state}
+ end
+
+ def handle_info(
+ {:irc, :text, m = %Nola.Message{account: account, text: "set-name " <> name}},
+ state
+ ) do
+ Nola.Account.update_account_name(account, name)
+ m.replyfun.("Name changed: #{name}")
+ {:noreply, state}
+ end
- def handle_info({:irc, :text, m = %Nola.Message{text: "enable-untappd"}}, state) do
- auth_url = Untappd.auth_url()
- login_url = Nola.AuthToken.new_url(m.account.id, {:external_redirect, auth_url})
- m.replyfun.(["To link your Untappd account, open this URL:", login_url])
- {:noreply, state}
+ def handle_info({:irc, :text, m = %Nola.Message{text: "disable-sms"}}, state) do
+ if Nola.Account.get_meta(m.account, "sms-number") do
+ Nola.Account.delete_meta(m.account, "sms-number")
+ m.replyfun.("SMS disabled.")
+ else
+ m.replyfun.("SMS already disabled.")
end
- def handle_info({:irc, :text, m = %Nola.Message{text: "getmeta"<>_}}, state) do
- result = case String.split(m.text, " ") do
+ {:noreply, state}
+ end
+
+ def handle_info({:irc, :text, m = %Nola.Message{text: "web"}}, state) do
+ login_url = Nola.AuthToken.new_url(m.account.id, nil)
+ m.replyfun.("↪:" <> login_url)
+ {:noreply, state}
+ end
+
+ def handle_info({:irc, :text, m = %Nola.Message{text: "enable-sms"}}, state) do
+ code = String.downcase(EntropyString.small_id())
+ Nola.Account.put_meta(m.account, "sms-validation-code", code)
+ Nola.Account.put_meta(m.account, "sms-validation-target", m.network)
+ number = Nola.Plugins.Sms.my_number()
+
+ text =
+ "To enable or change your number for SMS messaging, please send:" <>
+ " \"enable #{code}\" to #{number}"
+
+ m.replyfun.(text)
+ {:noreply, state}
+ end
+
+ def handle_info({:irc, :text, m = %Nola.Message{text: "enable-telegram"}}, state) do
+ code = String.downcase(EntropyString.small_id())
+ Nola.Account.delete_meta(m.account, "telegram-id")
+ Nola.Account.put_meta(m.account, "telegram-validation-code", code)
+ Nola.Account.put_meta(m.account, "telegram-validation-target", m.network)
+
+ text =
+ "To enable or change your number for telegram messaging, please open #{Nola.Telegram.my_path()} and send:" <>
+ " \"/enable #{code}\""
+
+ m.replyfun.(text)
+ {:noreply, state}
+ end
+
+ def handle_info({:irc, :text, m = %Nola.Message{text: "enable-untappd"}}, state) do
+ auth_url = Untappd.auth_url()
+ login_url = Nola.AuthToken.new_url(m.account.id, {:external_redirect, auth_url})
+ m.replyfun.(["To link your Untappd account, open this URL:", login_url])
+ {:noreply, state}
+ end
+
+ def handle_info({:irc, :text, m = %Nola.Message{text: "getmeta" <> _}}, state) do
+ result =
+ case String.split(m.text, " ") do
["getmeta"] ->
for {k, v} <- Nola.Account.get_all_meta(m.account) do
case k do
- "u:"<>key -> "(user) #{key}: #{v}"
+ "u:" <> key -> "(user) #{key}: #{v}"
key -> "#{key}: #{v}"
end
end
+
["getmeta", key] ->
value = Nola.Account.get_meta(m.account, key)
- text = if value do
- "#{key}: #{value}"
- else
- "#{key} is not defined"
- end
+
+ text =
+ if value do
+ "#{key}: #{value}"
+ else
+ "#{key} is not defined"
+ end
+
_ ->
"usage: getmeta [key]"
end
- m.replyfun.(result)
- {:noreply, state}
- end
- def handle_info({:irc, :text, m = %Nola.Message{text: "setusermeta"<>_}}, state) do
- result = case String.split(m.text, " ") do
+ m.replyfun.(result)
+ {:noreply, state}
+ end
+
+ def handle_info({:irc, :text, m = %Nola.Message{text: "setusermeta" <> _}}, state) do
+ result =
+ case String.split(m.text, " ") do
["setusermeta", key, value] ->
Nola.Account.put_user_meta(m.account, key, value)
"ok"
+
_ ->
"usage: setusermeta <key> <value>"
end
- m.replyfun.(result)
- {:noreply, state}
- end
- def handle_info(_, state) do
- {:noreply, state}
- end
+ m.replyfun.(result)
+ {:noreply, state}
+ end
- defp join_account(m, id, token) do
- old_account = Nola.Account.lookup(m.sender)
- new_account = Nola.Account.get(id)
- if new_account && token == new_account.token do
- case Nola.Account.merge_account(old_account.id, new_account.id) do
- :ok ->
- if old_account.id == new_account.id do
- m.replyfun.("Already authenticated, but hello")
- else
- m.replyfun.("Accounts merged!")
- end
- _ -> m.replyfun.("Something failed :(")
- end
- else
- m.replyfun.("Invalid token")
+ def handle_info(_, state) do
+ {:noreply, state}
+ end
+
+ defp join_account(m, id, token) do
+ old_account = Nola.Account.lookup(m.sender)
+ new_account = Nola.Account.get(id)
+
+ if new_account && token == new_account.token do
+ case Nola.Account.merge_account(old_account.id, new_account.id) do
+ :ok ->
+ if old_account.id == new_account.id do
+ m.replyfun.("Already authenticated, but hello")
+ else
+ m.replyfun.("Accounts merged!")
+ end
+
+ _ ->
+ m.replyfun.("Something failed :(")
end
+ else
+ m.replyfun.("Invalid token")
end
-
end
-
+end