summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorhref <href@random.sh>2021-09-04 13:06:21 +0200
committerhref <href@random.sh>2021-09-04 13:06:31 +0200
commit0c7f2dbab3f6986213472ed6fd2d01fe371f7366 (patch)
tree42fa48495e3e3f9f4efb6a4de2391f50bad8f5ad /lib
parentmatrix appservice, puppet improvements (diff)
matrix: fixes
Diffstat (limited to 'lib')
-rw-r--r--lib/lsg_matrix/matrix.ex19
-rw-r--r--lib/lsg_matrix/plug.ex2
-rw-r--r--lib/lsg_matrix/room.ex45
-rw-r--r--lib/lsg_web/router.ex4
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