defmodule BackendWeb.ClusterStatusChannel do @moduledoc """ Channel for cluster status information """ use BackendWeb, :channel require Logger @impl true def join("cluster_status", _params, socket) do Logger.info("Client joined clusterstatus channel") :net_kernel.monitor_nodes(true) {:ok, %{status: "connected"}, socket} end @impl true def handle_in("get_nodes", _payload, socket) do send_node_list(socket) {:noreply, socket} end @impl true def handle_in("kill_node", %{"node" => node_to_kill}, socket) do Logger.warning("Client requested to kill node: #{node_to_kill}") Backend.Cluster.kill_node(node_to_kill) {:noreply, socket} end @impl true def handle_in(_event, _payload, socket) do {:noreply, socket} end @impl true def handle_info({:nodeup, node_name}, socket) do Logger.info("Node up: #{node_name}, broadcasting updated node list") send_node_list(socket) {:noreply, socket} end @impl true def handle_info({:nodedown, node_name}, socket) do Logger.info("Node down: #{node_name}, broadcasting updated node list") send_node_list(socket) {:noreply, socket} end defp send_node_list(socket) do game_pid = Backend.GameRunner.get_pid() push(socket, "node_list", %{ other_nodes: Node.list(), connected_node: node(), game_node: node(game_pid) }) end end