timer.ex 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. defmodule Enchufe.Timer do
  2. use GenServer
  3. require Logger
  4. def start_link() do
  5. GenServer.start_link __MODULE__, %{}
  6. end
  7. ## SERVER ##
  8. def init(_state) do
  9. Logger.warn "Enchufe timer server started"
  10. EnchufeWeb.Endpoint.subscribe "timer:start", []
  11. state = %{timer_ref: nil, timer: nil}
  12. {:ok, state}
  13. end
  14. def handle_info(:update, %{timer: 0}) do
  15. broadcast 0, "TIMEEEE"
  16. {:noreply, %{timer_ref: nil, timer: 0}}
  17. end
  18. def handle_info(:update, %{timer: time}) do
  19. leftover = time - 1
  20. timer_ref = schedule_timer 1_000
  21. broadcast leftover, "tick tock... tick tock"
  22. {:noreply, %{timer_ref: timer_ref, timer: leftover}}
  23. end
  24. def handle_info(%{event: "start_timer"}, %{timer_ref: old_timer_ref}) do
  25. cancel_timer(old_timer_ref)
  26. duration = 30
  27. timer_ref = schedule_timer 1_000
  28. broadcast duration, "Started timer!"
  29. {:noreply, %{timer_ref: timer_ref, timer: duration}}
  30. end
  31. defp schedule_timer(interval), do: Process.send_after self(), :update, interval
  32. defp cancel_timer(nil), do: :ok
  33. defp cancel_timer(ref), do: Process.cancel_timer(ref)
  34. defp broadcast(time, response) do
  35. EnchufeWeb.Endpoint.broadcast! "timer:update", "new_time", %{
  36. response: response,
  37. time: time,
  38. }
  39. end
  40. # konsol baglanma
  41. # rlwrap ./wsta 'ws://localhost:4000/socket/websocket' '{"topic":"timer:update","event":"phx_join","payload":{},"ref":"1"}'
  42. #start time
  43. # {"topic":"timer:update","ref":null,"payload":{"time":55,"response":"fff"},"event":"start_timer"}
  44. end