neiam
/apollos_crib
It's Apollo's Crib
public · Issues · Pulls 1 · Labels · Forks · Compare · Actions failure · Badges · Packages
⭐
Log in to mark this repository.
improvements
0ff6a83 · gmorell · 2026-04-26 03:45
Files changed
modified
apps/room_sanctum/lib/room_sanctum/workers/vision_worker.ex
+62
−41
@@ -13,6 +13,8 @@ defmodule RoomSanctum.Worker.Vision do
| 13 | 13 | end |
| 14 | 14 | |
| 15 | 15 | def init(opts) do |
| 16 | + Process.flag(:trap_exit, true) | |
| 17 | + | |
| 16 | 18 | Periodic.start_link( |
| 17 | 19 | every: :timer.seconds(4), |
| 18 | 20 | run: fn -> RoomSanctum.Worker.Vision.refresh_db_cfg(opts[:id]) end, |
@@ -25,7 +27,7 @@ defmodule RoomSanctum.Worker.Vision do
| 25 | 27 | initial_delay: 100 |
| 26 | 28 | ) |
| 27 | 29 | |
| 28 | − {:ok, %{id: opts[:id], vision: nil, vision_q: [], data: [], query_task: nil}} | |
| 30 | + {:ok, %{id: opts[:id], vision: nil, vision_q: [], data: %{}, query_task: nil}} | |
| 29 | 31 | end |
| 30 | 32 | |
| 31 | 33 | defp via_tuple(name), do: {:via, Registry, {@registry, name}} |
@@ -85,6 +87,14 @@ defmodule RoomSanctum.Worker.Vision do
| 85 | 87 | {:noreply, state} |
| 86 | 88 | end |
| 87 | 89 | |
| 90 | + def handle_info({:EXIT, pid, reason}, state) do | |
| 91 | + if state.query_task && state.query_task.pid == pid and reason != :normal do | |
| 92 | + Logger.warning("Vision query task crashed: #{inspect(reason)}; keeping previous data") | |
| 93 | + end | |
| 94 | + | |
| 95 | + {:noreply, state} | |
| 96 | + end | |
| 97 | + | |
| 88 | 98 | def handle_info(_msg, state) do |
| 89 | 99 | {:noreply, state} |
| 90 | 100 | end |
@@ -111,56 +121,67 @@ defmodule RoomSanctum.Worker.Vision do
| 111 | 121 | vision_q |
| 112 | 122 | |> Enum.map(fn q -> |
| 113 | 123 | r = |
| 114 | − case q.source.type do | |
| 115 | − :gtfs -> | |
| 116 | − RoomGtfs.Worker.query_stop(q.source.id, q.query) | |
| 124 | + try do | |
| 125 | + query_one(q) | |
| 126 | + rescue | |
| 127 | + e -> | |
| 128 | + Logger.warning( | |
| 129 | + "Query failed for #{inspect(q.source.type)} (#{q.source.id}): #{Exception.message(e)}" | |
| 130 | + ) | |
| 117 | 131 | |
| 118 | − :gbfs -> | |
| 119 | − RoomGbfs.Worker.query_stop(q.source.id, q.query) | |
| 132 | + [] | |
| 133 | + catch | |
| 134 | + kind, reason -> | |
| 135 | + Logger.warning( | |
| 136 | + "Query #{kind} for #{inspect(q.source.type)} (#{q.source.id}): #{inspect(reason)}" | |
| 137 | + ) | |
| 120 | 138 | |
| 121 | − :tidal -> | |
| 122 | − RoomTidal.Worker.query_tides(q.source.id, q.query) | |
| 139 | + [] | |
| 140 | + end | |
| 123 | 141 | |
| 124 | − :weather -> | |
| 125 | − RoomWeather.Worker.query_weather( | |
| 126 | − q.source.id, | |
| 127 | − q.query | |
| 128 | − ) | |
| 142 | + {{q.id, q.source.type}, r} | |
| 143 | + end) | |
| 144 | + |> Enum.into(%{}) | |
| 145 | + end | |
| 129 | 146 | |
| 130 | − :aqi -> | |
| 131 | − RoomAirQuality.Worker.query_place( | |
| 132 | − q.source.id, | |
| 133 | − q.query | |
| 134 | − ) | |
| 147 | + defp query_one(q) do | |
| 148 | + case q.source.type do | |
| 149 | + :gtfs -> | |
| 150 | + RoomGtfs.Worker.query_stop(q.source.id, q.query) | |
| 135 | 151 | |
| 136 | − :ephem -> | |
| 137 | − RoomEphem.Worker.query_ephem( | |
| 138 | − q.source.id, | |
| 139 | − q.query | |
| 140 | − ) | |
| 152 | + :gbfs -> | |
| 153 | + RoomGbfs.Worker.query_stop(q.source.id, q.query) | |
| 141 | 154 | |
| 142 | − :calendar -> | |
| 143 | − RoomCalendar.Worker.query_calendar( | |
| 144 | − q.source.id, | |
| 145 | − q.query | |
| 146 | − ) | |
| 155 | + :tidal -> | |
| 156 | + RoomTidal.Worker.query_tides(q.source.id, q.query) | |
| 157 | + | |
| 158 | + :weather -> | |
| 159 | + RoomWeather.Worker.query_weather(q.source.id, q.query) | |
| 160 | + | |
| 161 | + :aqi -> | |
| 162 | + RoomAirQuality.Worker.query_place(q.source.id, q.query) | |
| 147 | 163 | |
| 148 | − :cronos -> | |
| 149 | − RoomCronos.Worker.query_cronos(q.id, q.query) | |
| 164 | + :ephem -> | |
| 165 | + RoomEphem.Worker.query_ephem(q.source.id, q.query) | |
| 150 | 166 | |
| 151 | − :gitlab -> | |
| 152 | − case RoomGitlab.Worker.pid(q.source.id) do | |
| 153 | − nil -> [] | |
| 154 | − _val -> (Process.alive?(RoomGitlab.Worker.pid(q.source.id)) && | |
| 155 | − RoomGitlab.Worker.read_jobs(q.source.id, q.query)) || [] | |
| 156 | − end | |
| 167 | + :calendar -> | |
| 168 | + RoomCalendar.Worker.query_calendar(q.source.id, q.query) | |
| 157 | 169 | |
| 158 | − :packages -> | |
| 159 | − RoomPackages.Worker.read(q.source.id, q.query) | |
| 170 | + :cronos -> | |
| 171 | + RoomCronos.Worker.query_cronos(q.id, q.query) | |
| 172 | + | |
| 173 | + :gitlab -> | |
| 174 | + case RoomGitlab.Worker.pid(q.source.id) do | |
| 175 | + nil -> | |
| 176 | + [] | |
| 177 | + | |
| 178 | + _val -> | |
| 179 | + (Process.alive?(RoomGitlab.Worker.pid(q.source.id)) && | |
| 180 | + RoomGitlab.Worker.read_jobs(q.source.id, q.query)) || [] | |
| 160 | 181 | end |
| 161 | 182 | |
| 162 | − {{q.id, q.source.type}, r} | |
| 163 | − end) | |
| 164 | − |> Enum.into(%{}) | |
| 183 | + :packages -> | |
| 184 | + RoomPackages.Worker.read(q.source.id, q.query) | |
| 185 | + end | |
| 165 | 186 | end |
| 166 | 187 | end |
modified
apps/room_sanctum/lib/room_sanctum_web/live/cfg_pythiae_live/show.ex
+2
−0
@@ -36,6 +36,8 @@ defmodule RoomSanctumWeb.PythiaeLive.Show do
| 36 | 36 | %{data: data, queries: queries} = |
| 37 | 37 | RoomSanctum.Worker.Vision.get_state(socket.assigns.pythiae.curr_vision) |
| 38 | 38 | |
| 39 | + data = if is_map(data), do: data, else: Map.new(data) | |
| 40 | + | |
| 39 | 41 | shuffled_consts = socket.assigns.pythiae.consts |> Enum.shuffle |> Enum.with_index |> Enum.map(fn {c, i} -> {{c.title, :const}, c} end) |> Map.new |
| 40 | 42 | |
| 41 | 43 | data = Map.merge(data, shuffled_consts) |> Enum.shuffle |
Parents: 9f1057c