diff options
author | href <href@random.sh> | 2021-09-04 13:06:21 +0200 |
---|---|---|
committer | href <href@random.sh> | 2021-09-04 13:06:31 +0200 |
commit | 0c7f2dbab3f6986213472ed6fd2d01fe371f7366 (patch) | |
tree | 42fa48495e3e3f9f4efb6a4de2391f50bad8f5ad /lib | |
parent | matrix appservice, puppet improvements (diff) |
matrix: fixes
Diffstat (limited to 'lib')
-rw-r--r-- | lib/lsg_matrix/matrix.ex | 19 | ||||
-rw-r--r-- | lib/lsg_matrix/plug.ex | 2 | ||||
-rw-r--r-- | lib/lsg_matrix/room.ex | 45 | ||||
-rw-r--r-- | lib/lsg_web/router.ex | 4 |
4 files changed, 49 insertions, 21 deletions
diff --git a/lib/lsg_matrix/matrix.ex b/lib/lsg_matrix/matrix.ex index bea6d8b..49da6b2 100644 --- a/lib/lsg_matrix/matrix.ex +++ b/lib/lsg_matrix/matrix.ex @@ -5,6 +5,7 @@ defmodule LSG.Matrix do @behaviour MatrixAppService.Adapter.Room @behaviour MatrixAppService.Adapter.Transaction @behaviour MatrixAppService.Adapter.User + @env Mix.env def dets(part) do (LSG.data_path() <> "/matrix-#{to_string(part)}.dets") |> String.to_charlist() @@ -18,9 +19,16 @@ defmodule LSG.Matrix do end def myself?("@_dev:random.sh"), do: true + def myself?("@_bot:random.sh"), do: true def myself?("@_dev."<>_), do: true + def myself?("@_bot."<>_), do: true def myself?(_), do: false + def mxc_to_http(mxc = "mxc://"<>_) do + uri = URI.parse(mxc) + %URI{uri | scheme: "https", path: "/_matrix/media/r0/download/#{uri.authority}#{uri.path}"} + |> URI.to_string() + end def get_or_create_matrix_user(id) do if mxid = lookup_user(id) do @@ -31,7 +39,7 @@ defmodule LSG.Matrix do inhibit_login: true, device_id: "APP_SERVICE", initial_device_display_name: "Application Service", - username: "_dev.#{id}" + username: if(@env == :dev, do: "_dev.#{id}", else: "_bot.#{id}") ] Logger.debug("Registering user for #{id}") {:ok, %{"user_id" => mxid}} = Polyjuice.Client.LowLevel.register(client(), opts) @@ -89,7 +97,7 @@ defmodule LSG.Matrix do localpart = localpart(room_alias) with {:ok, network, channel} <- extract_network_channel_from_localpart(localpart), %IRC.Connection{} <- IRC.Connection.get_network(network, channel), - room = [visibility: :public, room_alias_name: localpart, name: "#{network}/#{channel}"], + room = [visibility: :public, room_alias_name: localpart, name: if(network == "random", do: channel, else: "#{network}/#{channel}")], {:ok, %{"room_id" => room_id}} <- Client.Room.create_room(client(), room) do Logger.info("Matrix: created room #{room_alias} #{room_id}") :dets.insert(dets(:rooms), {room_id, network, channel, %{}}) @@ -109,10 +117,11 @@ defmodule LSG.Matrix do def extract_network_channel_from_localpart(localpart) do s = localpart |> String.replace("dev.", "") - |> String.split("_", parts: 2) + |> String.split("/", parts: 2) case s do [network, channel] -> {:ok, network, channel} + [channel] -> {:ok, "random", channel} _ -> {:error, :invalid_localpart} end end @@ -130,7 +139,9 @@ defmodule LSG.Matrix do @impl MatrixAppService.Adapter.Transaction def new_event(event = %MatrixAppService.Event{}) do Logger.debug("New matrix event: #{inspect event}") - if room_id = event.room_id, do: LSG.Matrix.Room.start_and_send_matrix_event(room_id, event) + if event.room_id do + LSG.Matrix.Room.start_and_send_matrix_event(event.room_id, event) + end :noop end diff --git a/lib/lsg_matrix/plug.ex b/lib/lsg_matrix/plug.ex index 5d5b603..c0c027f 100644 --- a/lib/lsg_matrix/plug.ex +++ b/lib/lsg_matrix/plug.ex @@ -5,7 +5,7 @@ defmodule LSG.Matrix.Plug do state end - def call(conn, _) do + def call(conn, _) do hs = Application.get_env(:matrix_app_service, :homeserver_token) MatrixAppServiceWeb.AuthPlug.call(conn, hs) end 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 diff --git a/lib/lsg_web/router.ex b/lib/lsg_web/router.ex index dc49c9f..e872cef 100644 --- a/lib/lsg_web/router.ex +++ b/lib/lsg_web/router.ex @@ -56,13 +56,13 @@ defmodule LSGWeb.Router do get "/:network/:chan/alcoolog/t/:token", AlcoologController, :token end - scope "/_matrix/appservice", MatrixAppServiceWeb.V1, as: :matrix do + scope "/_matrix/:appservice", MatrixAppServiceWeb.V1, as: :matrix do pipe_through :matrix_app_service put "/transactions/:txn_id", TransactionController, :push get "/users/:user_id", UserController, :query - get "/rooms/:room_alias", RoomController, :query + get "/rooms/*room_alias", RoomController, :query get "/thirdparty/protocol/:protocol", ThirdPartyController, :query_protocol get "/thirdparty/user/:protocol", ThirdPartyController, :query_users |