From 0e0e2d5ec84117467d0f96a2fb37f6e405e0beea Mon Sep 17 00:00:00 2001 From: Pim Kunis Date: Thu, 24 Oct 2019 22:58:09 +0200 Subject: [PATCH] Send telegram message when someone presses the button. --- morse/lib/morse/worker.ex | 6 +++--- ui/config/config.exs | 4 ++++ ui/lib/ui/telegram_bot.ex | 13 +++++++++++++ ui/lib/ui_web/controllers/page_controller.ex | 6 +++--- ui/lib/ui_web/live/morse_live.ex | 16 ++++++++++------ ui/mix.exs | 3 ++- ui/mix.lock | 10 ++++++++++ 7 files changed, 45 insertions(+), 13 deletions(-) create mode 100644 ui/lib/ui/telegram_bot.ex diff --git a/morse/lib/morse/worker.ex b/morse/lib/morse/worker.ex index c7b8831..af9d7dd 100644 --- a/morse/lib/morse/worker.ex +++ b/morse/lib/morse/worker.ex @@ -3,8 +3,6 @@ defmodule Morse.Worker do Functions to control the signal lamp connected with GPIO. """ - @esrom_node :"esrom@esrom.lan" - @sleep_short 200 @sleep_delay 400 @sleep_long 700 @@ -49,8 +47,8 @@ defmodule Morse.Worker do end defp signal_symbol({?\s, index}, length) do - Process.sleep(@sleep_pause) update_progress(index, length) + Process.sleep(@sleep_pause) end defp update_progress(index, length) do @@ -65,6 +63,8 @@ defmodule Morse.Worker do # Communicate with a deployed esrom node, if running on a host. case Application.get_env(:ui, :target) do :host -> + @esrom_node :"esrom@esrom.lan" + def toggle_lamp(state) do # Check if the deployed esrom node is online. if :pong == Node.ping(@esrom_node) do diff --git a/ui/config/config.exs b/ui/config/config.exs index 1cc954a..9d6ede8 100644 --- a/ui/config/config.exs +++ b/ui/config/config.exs @@ -17,3 +17,7 @@ else "host.exs" end |> import_config() + +if File.exists?("config/secrets.exs") do + import_config "secrets.exs" +end diff --git a/ui/lib/ui/telegram_bot.ex b/ui/lib/ui/telegram_bot.ex new file mode 100644 index 0000000..64dd32b --- /dev/null +++ b/ui/lib/ui/telegram_bot.ex @@ -0,0 +1,13 @@ +defmodule Ui.TelegramBot do + def message(msg) do + Telegram.Api.request(token(), "sendMessage", chat_id: chat_id(), text: msg) + end + + defp chat_id do + Application.fetch_env!(:ui, :chat_id) + end + + defp token do + Application.fetch_env!(:ui, :token) + end +end diff --git a/ui/lib/ui_web/controllers/page_controller.ex b/ui/lib/ui_web/controllers/page_controller.ex index 3ea3523..359098b 100644 --- a/ui/lib/ui_web/controllers/page_controller.ex +++ b/ui/lib/ui_web/controllers/page_controller.ex @@ -10,8 +10,8 @@ defmodule UiWeb.PageController do render(conn, :instructions) end - def morse(conn, _params) do - LiveView.Controller.live_render(conn, UiWeb.MorseLive, session: %{}) + def morse(%{remote_ip: ip} = conn, _params) do + ip = ip |> Tuple.to_list |> Enum.join(".") + LiveView.Controller.live_render(conn, UiWeb.MorseLive, session: %{ip: ip}) end - end diff --git a/ui/lib/ui_web/live/morse_live.ex b/ui/lib/ui_web/live/morse_live.ex index 5556730..16863a7 100644 --- a/ui/lib/ui_web/live/morse_live.ex +++ b/ui/lib/ui_web/live/morse_live.ex @@ -7,13 +7,16 @@ defmodule UiWeb.MorseLive do UiWeb.PageView.render("morse.html", assigns) end - def mount(_session, socket) do + def mount(%{ip: ip}, socket) do UiWeb.Endpoint.subscribe(@topic) - {:ok, assign(socket, default_assigns())} + {:ok, assign(socket, default_assigns(ip))} end - def handle_event("start_morse", _value, socket) do - Morse.Server.start_morse() + def handle_event("start_morse", _value, %{assigns: %{ip: ip}} = socket) do + if :ok == Morse.Server.start_morse() do + spawn fn -> Ui.TelegramBot.message("#{ip} pressed the button!") end + end + {:noreply, socket} end @@ -25,11 +28,12 @@ defmodule UiWeb.MorseLive do {:noreply, assign(socket, progress: progress, in_progress?: Morse.Server.in_progress?())} end - defp default_assigns do + defp default_assigns(ip) do [ progress: Morse.Server.progress(), in_progress?: Morse.Server.in_progress?(), - hints_visible: false + hints_visible: false, + ip: ip ] end end diff --git a/ui/mix.exs b/ui/mix.exs index eb09fb5..44fa2b0 100644 --- a/ui/mix.exs +++ b/ui/mix.exs @@ -40,7 +40,8 @@ defmodule Ui.MixProject do {:gettext, "~> 0.11"}, {:jason, "~> 1.0"}, {:plug_cowboy, "~> 2.0"}, - {:morse, path: "../morse"} + {:morse, path: "../morse"}, + {:telegram, git: "https://github.com/visciang/telegram.git", tag: "master"} ] end end diff --git a/ui/mix.lock b/ui/mix.lock index 018fb29..b176b61 100644 --- a/ui/mix.lock +++ b/ui/mix.lock @@ -1,12 +1,18 @@ %{ + "certifi": {:hex, :certifi, "2.5.1", "867ce347f7c7d78563450a18a6a28a8090331e77fa02380b4a21962a65d36ee5", [:rebar3], [{:parse_trans, "~>3.3", [hex: :parse_trans, repo: "hexpm", optional: false]}], "hexpm"}, "circuits_gpio": {:hex, :circuits_gpio, "0.4.1", "344dd34f2517687fd28723e5552571babff5469db05b697181cab860fe7eff23", [:make, :mix], [{:elixir_make, "~> 0.5", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm"}, "cowboy": {:hex, :cowboy, "2.6.3", "99aa50e94e685557cad82e704457336a453d4abcb77839ad22dbe71f311fcc06", [:rebar3], [{:cowlib, "~> 2.7.3", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, "~> 1.7.1", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm"}, "cowlib": {:hex, :cowlib, "2.7.3", "a7ffcd0917e6d50b4d5fb28e9e2085a0ceb3c97dea310505f7460ff5ed764ce9", [:rebar3], [], "hexpm"}, "elixir_make": {:hex, :elixir_make, "0.6.0", "38349f3e29aff4864352084fc736fa7fa0f2995a819a737554f7ebd28b85aaab", [:mix], [], "hexpm"}, "file_system": {:hex, :file_system, "0.2.7", "e6f7f155970975789f26e77b8b8d8ab084c59844d8ecfaf58cbda31c494d14aa", [:mix], [], "hexpm"}, "gettext": {:hex, :gettext, "0.17.0", "abe21542c831887a2b16f4c94556db9c421ab301aee417b7c4fbde7fbdbe01ec", [:mix], [], "hexpm"}, + "hackney": {:hex, :hackney, "1.15.2", "07e33c794f8f8964ee86cebec1a8ed88db5070e52e904b8f12209773c1036085", [:rebar3], [{:certifi, "2.5.1", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "6.0.0", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "1.0.1", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~>1.1", [hex: :mimerl, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "1.1.5", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}], "hexpm"}, + "idna": {:hex, :idna, "6.0.0", "689c46cbcdf3524c44d5f3dde8001f364cd7608a99556d8fbd8239a5798d4c10", [:rebar3], [{:unicode_util_compat, "0.4.1", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm"}, "jason": {:hex, :jason, "1.1.2", "b03dedea67a99223a2eaf9f1264ce37154564de899fd3d8b9a21b1a6fd64afe7", [:mix], [{:decimal, "~> 1.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm"}, + "metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], [], "hexpm"}, "mime": {:hex, :mime, "1.3.1", "30ce04ab3175b6ad0bdce0035cba77bba68b813d523d1aac73d9781b4d193cf8", [:mix], [], "hexpm"}, + "mimerl": {:hex, :mimerl, "1.2.0", "67e2d3f571088d5cfd3e550c383094b47159f3eee8ffa08e64106cdf5e981be3", [:rebar3], [], "hexpm"}, + "parse_trans": {:hex, :parse_trans, "3.3.0", "09765507a3c7590a784615cfd421d101aec25098d50b89d7aa1d66646bc571c1", [:rebar3], [], "hexpm"}, "phoenix": {:hex, :phoenix, "1.4.9", "746d098e10741c334d88143d3c94cab1756435f94387a63441792e66ec0ee974", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 1.1", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:plug, "~> 1.8.1 or ~> 1.9", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 1.0 or ~> 2.0", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm"}, "phoenix_html": {:hex, :phoenix_html, "2.13.3", "850e292ff6e204257f5f9c4c54a8cb1f6fbc16ed53d360c2b780a3d0ba333867", [:mix], [{:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm"}, "phoenix_live_reload": {:hex, :phoenix_live_reload, "1.2.1", "274a4b07c4adbdd7785d45a8b0bb57634d0b4f45b18d2c508b26c0344bd59b8f", [:mix], [{:file_system, "~> 0.2.1 or ~> 0.3", [hex: :file_system, repo: "hexpm", optional: false]}, {:phoenix, "~> 1.4", [hex: :phoenix, repo: "hexpm", optional: false]}], "hexpm"}, @@ -16,5 +22,9 @@ "plug_cowboy": {:hex, :plug_cowboy, "2.1.0", "b75768153c3a8a9e8039d4b25bb9b14efbc58e9c4a6e6a270abff1cd30cbe320", [:mix], [{:cowboy, "~> 2.5", [hex: :cowboy, repo: "hexpm", optional: false]}, {:plug, "~> 1.7", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm"}, "plug_crypto": {:hex, :plug_crypto, "1.0.0", "18e49317d3fa343f24620ed22795ec29d4a5e602d52d1513ccea0b07d8ea7d4d", [:mix], [], "hexpm"}, "ranch": {:hex, :ranch, "1.7.1", "6b1fab51b49196860b733a49c07604465a47bdb78aa10c1c16a3d199f7f8c881", [:rebar3], [], "hexpm"}, + "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.5", "6eaf7ad16cb568bb01753dbbd7a95ff8b91c7979482b95f38443fe2c8852a79b", [:make, :mix, :rebar3], [], "hexpm"}, + "telegram": {:git, "https://github.com/visciang/telegram.git", "548cfb192e92e7e810be026121b0c77672d0ca8d", [tag: "master"]}, "telemetry": {:hex, :telemetry, "0.4.0", "8339bee3fa8b91cb84d14c2935f8ecf399ccd87301ad6da6b71c09553834b2ab", [:rebar3], [], "hexpm"}, + "tesla": {:hex, :tesla, "1.3.0", "f35d72f029e608f9cdc6f6d6fcc7c66cf6d6512a70cfef9206b21b8bd0203a30", [:mix], [{:castore, "~> 0.1", [hex: :castore, repo: "hexpm", optional: true]}, {:exjsx, ">= 3.0.0", [hex: :exjsx, repo: "hexpm", optional: true]}, {:fuse, "~> 2.4", [hex: :fuse, repo: "hexpm", optional: true]}, {:gun, "~> 1.3", [hex: :gun, repo: "hexpm", optional: true]}, {:hackney, "~> 1.6", [hex: :hackney, repo: "hexpm", optional: true]}, {:ibrowse, "~> 4.4.0", [hex: :ibrowse, repo: "hexpm", optional: true]}, {:jason, ">= 1.0.0", [hex: :jason, repo: "hexpm", optional: true]}, {:mime, "~> 1.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mint, "~> 0.4", [hex: :mint, repo: "hexpm", optional: true]}, {:poison, ">= 1.0.0", [hex: :poison, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.3", [hex: :telemetry, repo: "hexpm", optional: true]}], "hexpm"}, + "unicode_util_compat": {:hex, :unicode_util_compat, "0.4.1", "d869e4c68901dd9531385bb0c8c40444ebf624e60b6962d95952775cac5e90cd", [:rebar3], [], "hexpm"}, }