summaryrefslogtreecommitdiff
path: root/lib/lsg_matrix/room.ex
diff options
context:
space:
mode:
Diffstat (limited to 'lib/lsg_matrix/room.ex')
-rw-r--r--lib/lsg_matrix/room.ex45
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