summaryrefslogtreecommitdiff
path: root/lib/polyjuice/client/sync.ex
diff options
context:
space:
mode:
Diffstat (limited to 'lib/polyjuice/client/sync.ex')
-rw-r--r--lib/polyjuice/client/sync.ex66
1 files changed, 62 insertions, 4 deletions
diff --git a/lib/polyjuice/client/sync.ex b/lib/polyjuice/client/sync.ex
index ac81568..1f4c2f8 100644
--- a/lib/polyjuice/client/sync.ex
+++ b/lib/polyjuice/client/sync.ex
@@ -272,20 +272,41 @@ defmodule Polyjuice.Client.Sync do
end
defp process_body(body, state) do
- body
- |> Map.get("rooms", %{})
+ rooms = Map.get(body, "rooms", %{})
+
+ rooms
|> Map.get("join", [])
|> Enum.each(fn {k, v} -> process_room(k, v, state) end)
+
+ rooms
+ |> Map.get("invite", [])
+ |> Enum.each(fn {k, v} -> process_invite(k, v, state) end)
+
+ rooms
+ |> Map.get("leave", [])
+ |> Enum.each(
+ fn {k, v} ->
+ process_room(k, v, state)
+ send(state.listener, {:left, k})
+ end
+ )
end
defp process_room(roomname, room, state) do
+ timeline = Map.get(room, "timeline", %{})
+
+ if Map.get(timeline, "limited", false) do
+ with {:ok, prev_batch} <- Map.get(timeline, "prev_batch") do
+ send(state.listener, {:limited, room, prev_batch})
+ end
+ end
+
room
|> Map.get("state", %{})
|> Map.get("events", [])
|> Enum.each(&process_event(&1, roomname, state))
- room
- |> Map.get("timeline", %{})
+ timeline
|> Map.get("events", [])
|> Enum.each(&process_event(&1, roomname, state))
end
@@ -321,4 +342,41 @@ defmodule Polyjuice.Client.Sync do
defp process_event(_, _, state) do
state
end
+
+ defp process_invite(roomname, room, state) do
+ Logger.debug("invite received #{inspect(room)}")
+ # The invite state is a map from state type to state key to event.
+ invite_state = Enum.reduce(
+ Map.get(room, "invite_state", %{}) |> Map.get("events", []),
+ %{},
+ fn
+ %{
+ "type" => type,
+ "state_key" => state_key
+ } = val, acc ->
+ Map.get(acc, type, %{})
+ |> Map.put(state_key, val)
+ |> (&Map.put(acc, type, &1)).()
+
+ _, acc ->
+ acc
+ end
+ )
+
+ Logger.debug("state #{inspect(invite_state)}")
+
+ inviter = invite_state
+ |> Map.get("m.room.member", %{})
+ |> Map.get(state.user_id, %{})
+ |> Map.get("sender")
+
+ if inviter do
+ send(
+ state.listener,
+ {:invite, roomname, inviter, invite_state}
+ )
+ end
+
+ state
+ end
end