diff options
Diffstat (limited to 'lib/plugins/sms.ex')
-rw-r--r-- | lib/plugins/sms.ex | 121 |
1 files changed, 79 insertions, 42 deletions
diff --git a/lib/plugins/sms.ex b/lib/plugins/sms.ex index 8dd15ad..713ac3f 100644 --- a/lib/plugins/sms.ex +++ b/lib/plugins/sms.ex @@ -8,9 +8,10 @@ defmodule Nola.Plugins.Sms do def irc_doc, do: @moduledoc require Logger - def incoming(from, "enable "<>key) do + def incoming(from, "enable " <> key) do key = String.trim(key) account = Nola.Account.find_meta_account("sms-validation-code", String.downcase(key)) + if account do net = Nola.Account.get_meta(account, "sms-validation-target") Nola.Account.put_meta(account, "sms-number", from) @@ -24,15 +25,21 @@ defmodule Nola.Plugins.Sms do def incoming(from, message) do account = Nola.Account.find_meta_account("sms-number", from) + if account do - reply_fun = fn(text) -> + reply_fun = fn text -> send_sms(from, text) end - trigger_text = if Enum.any?(Nola.Irc.Connection.triggers(), fn({trigger, _}) -> String.starts_with?(message, trigger) end) do - message - else - "!"<>message - end + + trigger_text = + if Enum.any?(Nola.Irc.Connection.triggers(), fn {trigger, _} -> + String.starts_with?(message, trigger) + end) do + message + else + "!" <> message + end + message = %Nola.Message{ id: FlakeId.get(), transport: :sms, @@ -44,7 +51,8 @@ defmodule Nola.Plugins.Sms do replyfun: reply_fun, trigger: Nola.Irc.Connection.extract_trigger(trigger_text) } - Logger.debug("converted sms to message: #{inspect message}") + + Logger.debug("converted sms to message: #{inspect(message)}") Nola.Irc.Connection.publish(message, ["messages:sms"]) message end @@ -69,53 +77,70 @@ defmodule Nola.Plugins.Sms do def send_sms(number, text) do url = path("/virtualNumbers/#{my_number()}/jobs") - body = %{ - "message" => text, - "receivers" => [number], - #"senderForResponse" => true, - #"noStopClause" => true, - "charset" => "UTF-8", - "coding" => "8bit" - } |> Poison.encode!() + + body = + %{ + "message" => text, + "receivers" => [number], + # "senderForResponse" => true, + # "noStopClause" => true, + "charset" => "UTF-8", + "coding" => "8bit" + } + |> Poison.encode!() + headers = [{"content-type", "application/json"}] ++ sign("POST", url, body) options = [] + case HTTPoison.post(url, body, headers, options) do - {:ok, %HTTPoison.Response{status_code: 200}} -> :ok + {:ok, %HTTPoison.Response{status_code: 200}} -> + :ok + {:ok, %HTTPoison.Response{status_code: code} = resp} -> - Logger.error("SMS Error: #{inspect resp}") + Logger.error("SMS Error: #{inspect(resp)}") {:error, code} - {:error, error} -> {:error, error} + + {:error, error} -> + {:error, error} end end def init([]) do - {:ok, _} = Registry.register(Nola.PubSub, "trigger:sms", [plugin: __MODULE__]) + {:ok, _} = Registry.register(Nola.PubSub, "trigger:sms", plugin: __MODULE__) :ok = register_ovh_callback() {:ok, %{}} :ignore end - def handle_info({:irc, :trigger, "sms", m = %Nola.Message{trigger: %Nola.Trigger{type: :bang, args: [nick | text]}}}, state) do - with \ - {:tree, false} <- {:tree, m.sender.nick == "Tree"}, - {_, %Nola.Account{} = account} <- {:account, Nola.Account.find_always_by_nick(m.network, m.channel, nick)}, - {_, number} when not is_nil(number) <- {:number, Nola.Account.get_meta(account, "sms-number")} - do + def handle_info( + {:irc, :trigger, "sms", + m = %Nola.Message{trigger: %Nola.Trigger{type: :bang, args: [nick | text]}}}, + state + ) do + with {:tree, false} <- {:tree, m.sender.nick == "Tree"}, + {_, %Nola.Account{} = account} <- + {:account, Nola.Account.find_always_by_nick(m.network, m.channel, nick)}, + {_, number} when not is_nil(number) <- + {:number, Nola.Account.get_meta(account, "sms-number")} do text = Enum.join(text, " ") - sender = if m.channel do - "#{m.channel} <#{m.sender.nick}> " - else - "<#{m.sender.nick}> " - end - case send_sms(number, sender<>text) do + + sender = + if m.channel do + "#{m.channel} <#{m.sender.nick}> " + else + "<#{m.sender.nick}> " + end + + case send_sms(number, sender <> text) do :ok -> m.replyfun.("sent!") - {:error, error} -> m.replyfun.("not sent, error: #{inspect error}") + {:error, error} -> m.replyfun.("not sent, error: #{inspect(error)}") end else {:tree, _} -> m.replyfun.("Tree: va en enfer") {:account, _} -> m.replyfun.("#{nick} not known") {:number, _} -> m.replyfun.("#{nick} have not enabled sms") end + {:noreply, state} end @@ -125,19 +150,26 @@ defmodule Nola.Plugins.Sms do defp register_ovh_callback() do url = path() - body = %{ - "callBack" =>NolaWeb.Router.Helpers.sms_url(NolaWeb.Endpoint, :ovh_callback), - "smsResponse" => %{ - "cgiUrl" => NolaWeb.Router.Helpers.sms_url(NolaWeb.Endpoint, :ovh_callback), - "responseType" => "cgi" + + body = + %{ + "callBack" => NolaWeb.Router.Helpers.sms_url(NolaWeb.Endpoint, :ovh_callback), + "smsResponse" => %{ + "cgiUrl" => NolaWeb.Router.Helpers.sms_url(NolaWeb.Endpoint, :ovh_callback), + "responseType" => "cgi" + } } - } |> Poison.encode!() + |> Poison.encode!() + headers = [{"content-type", "application/json"}] ++ sign("PUT", url, body) options = [] + case HTTPoison.put(url, body, headers, options) do {:ok, %HTTPoison.Response{status_code: 200}} -> :ok - error -> error + + error -> + error end end @@ -147,8 +179,13 @@ defmodule Nola.Plugins.Sms do ck = env(:consumer_key) sign = Enum.join([as, ck, String.upcase(method), url, body, ts], "+") sign_hex = :crypto.hash(:sha, sign) |> Base.encode16(case: :lower) - headers = [{"X-OVH-Application", env(:app_key)}, {"X-OVH-Timestamp", ts}, - {"X-OVH-Signature", "$1$"<>sign_hex}, {"X-Ovh-Consumer", ck}] + + headers = [ + {"X-OVH-Application", env(:app_key)}, + {"X-OVH-Timestamp", ts}, + {"X-OVH-Signature", "$1$" <> sign_hex}, + {"X-Ovh-Consumer", ck} + ] end def parse_number(num) do |