diff options
Diffstat (limited to 'lib/polyjuice/client/sync.ex')
-rw-r--r-- | lib/polyjuice/client/sync.ex | 66 |
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 |