clova-advent-calendar-example/lib/advent.ex

59 lines
2.3 KiB
Elixir

defmodule Advent do
use Clova
def handle_launch(_req, resp) do
resp
|> add_speech("今日は#{say_date(today())}です")
|> add_speech(days_to_christmas() |> say_days_to_christmas())
|> add_speech(prompt_for_another())
end
def handle_intent("different_day", req, resp) do
with potential_date when not is_nil(potential_date) <- get_slot(req, "date"),
{:ok, date} <- Date.from_iso8601(potential_date) do
resp
|> add_speech("#{say_date(date)}まで計算しますか?")
|> put_session_attributes(%{"date" => date})
|> add_reprompt("#{date.month}#{date.day}日まで計算したい場合、「はい」と言ってください。")
|> add_reprompt(prompt_for_another())
else
_ -> add_speech(resp, "それは日付だと思いますがもっとわかりやすく言ってくださいね")
end
end
def handle_intent("Clova.YesIntent", req, resp) do
with %{"date" => iso_date} <- get_session_attributes(req),
{:ok, date} <- Date.from_iso8601(iso_date) do
resp
|> add_speech(say_days_to(date))
|> add_speech(prompt_for_another())
else
_ -> end_session(resp)
end
end
def handle_intent(_name, _req, resp), do: end_session(resp)
defp prompt_for_another(), do: "違う日まで計算したい場合、日付けを言ってください"
defp say_days_to_christmas(0), do: "クリスマスの日です!メリークリスマス!"
defp say_days_to_christmas(days) when days < 0, do: "クリスマスはもうすぎました。来年まで楽しみましょう。"
defp say_days_to_christmas(days), do: "クリスマスまであと#{days}日です!"
defp today, do: Timex.now("Asia/Tokyo") |> DateTime.to_date()
defp say_date(date), do: "#{date.year}#{date.month}#{date.day}"
defp days_to(date), do: Date.diff(date, today())
defp say_days_to(date), do: say_days_to(date, days_to(date))
defp say_days_to(date, 0), do: "#{say_date(date)}は今日です!"
defp say_days_to(date, days) when days < 0, do: "#{say_date(date)}から#{-days}日すぎました。"
defp say_days_to(date, days), do: "#{say_date(date)}まであと#{days}日です。"
defp days_to_christmas do
{:ok, xmas} = Date.new(today().year, 12, 25)
days_to(xmas)
end
end