summaryrefslogtreecommitdiff
path: root/lib/plugins/sms.ex
diff options
context:
space:
mode:
Diffstat (limited to 'lib/plugins/sms.ex')
-rw-r--r--lib/plugins/sms.ex121
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