diff options
Diffstat (limited to 'lib/lsg_matrix/room.ex')
-rw-r--r-- | lib/lsg_matrix/room.ex | 45 |
1 files changed, 31 insertions, 14 deletions
diff --git a/lib/lsg_matrix/room.ex b/lib/lsg_matrix/room.ex index 31d1b06..e3ddd1d 100644 --- a/lib/lsg_matrix/room.ex +++ b/lib/lsg_matrix/room.ex @@ -41,9 +41,10 @@ defmodule LSG.Matrix.Room do case __MODULE__.start(room_id) do {:ok, pid} -> pid {:error, {:already_started, pid}} -> pid + :ignore -> nil end end - send(pid, {:matrix_event, event}) + if(pid, do: send(pid, {:matrix_event, event})) end def whereis(room_id) do @@ -59,18 +60,23 @@ defmodule LSG.Matrix.Room do end def init([room_id]) do - {:ok, state} = Matrix.lookup_room(room_id) - Logger.metadata(matrix_room: room_id) + case Matrix.lookup_room(room_id) do + {:ok, state} -> + Logger.metadata(matrix_room: room_id) - {:ok, _} = Registry.register(IRC.PubSub, "#{state.network}:events", plugin: __MODULE__) - for t <- ["messages", "triggers", "outputs", "events"] do - {:ok, _} = Registry.register(IRC.PubSub, "#{state.network}/#{state.channel}:#{t}", plugin: __MODULE__) - end + {:ok, _} = Registry.register(IRC.PubSub, "#{state.network}:events", plugin: __MODULE__) + for t <- ["messages", "triggers", "outputs", "events"] do + {:ok, _} = Registry.register(IRC.PubSub, "#{state.network}/#{state.channel}:#{t}", plugin: __MODULE__) + end - state = state - |> Map.put(:id, room_id) - Logger.info("Started Matrix room #{room_id}") - {:ok, state, {:continue, :update_state}} + state = state + |> Map.put(:id, room_id) + Logger.info("Started Matrix room #{room_id}") + {:ok, state, {:continue, :update_state}} + error -> + Logger.info("Received event for nonexistent room #{inspect room_id}: #{inspect error}") + :ignore + end end def handle_continue(:update_state, state) do @@ -79,12 +85,16 @@ defmodule LSG.Matrix.Room do if s["type"] == "m.room.member" do if s["content"]["membership"] == "join" do [s["user_id"] | acc] + else + # XXX: The user left, remove from IRC.Memberships ? + acc end else - # XXX: The user left, remove from IRC.Memberships ? acc end end) + |> Enum.filter(& &1) + for m <- members, do: IRC.UserTrack.joined(state.id, %{network: "matrix", nick: m, user: m, host: "matrix."}, [], true) accounts = IRC.UserTrack.channel(state.network, state.channel) @@ -127,6 +137,13 @@ defmodule LSG.Matrix.Room do {:noreply, state} end + def handle_irc(%{type: quit_or_part, account_id: account_id}, state) when quit_or_part in [:quit, :part] do + mxid = Matrix.get_or_create_matrix_user(account_id) + Client.Room.leave(client(user_id: mxid), state.id) + {:noreply, state} + end + + def handle_irc(event, state) do Logger.warn("Skipped irc event #{inspect event}") {:noreply, state} @@ -144,8 +161,8 @@ defmodule LSG.Matrix.Room do end def handle_matrix(event = %{type: "m.room.message", user_id: user_id, content: %{"msgtype" => "m.text", "body" => text}}, state) do - IRC.send_message_as(get_account(event, state), state.network, state.channel, text, true) - {:noreply, state} + IRC.send_message_as(get_account(event, state), state.network, state.channel, text, true) + {:noreply, state} end def handle_matrix(event, state) do |