farmbot_os/farmbot_os/lib/farmbot_os/easter_eggs.ex

58 lines
1.4 KiB
Elixir

defmodule FarmbotOS.EasterEggs do
@moduledoc false
use GenServer
alias FarmbotCore.{Asset, JSON}
require FarmbotCore.Logger
@doc false
def start_link(args) do
GenServer.start_link(__MODULE__, args, name: __MODULE__)
end
def force do
GenServer.call(__MODULE__, :force)
end
def init([]) do
timer = generate_timer(self())
{:ok, %{timer: timer}}
end
def handle_info(:timer, state) do
%{"nouns" => noun_list, "verbs" => verb_list} = load_data()
verb = Enum.random(verb_list)
timer = generate_timer(self())
nouns =
Enum.reduce(noun_list, [], fn map, acc ->
[{key, val}] = Map.to_list(map)
[{:"#{key}", val} | acc]
end)
message = EEx.eval_string(verb, nouns)
bot_name = Asset.device().name
FarmbotCore.Logger.fun(3, Enum.join([bot_name, message], " "))
{:noreply, %{state | timer: timer}}
end
def handle_call(:force, _, state) do
Process.cancel_timer(state.timer)
send(self(), :timer)
{:reply, :ok, %{state | timer: nil}}
end
defp load_data do
Path.join(:code.priv_dir(:farmbot), "easter_eggs.json")
|> File.read!()
|> JSON.decode!()
end
@ms_in_one_hour 3.6e+6 |> round()
@ms_in_sixty_hours @ms_in_one_hour * 60
defp generate_timer(pid) do
time = Enum.random(@ms_in_one_hour..@ms_in_sixty_hours)
Process.send_after(pid, :timer, time)
end
end