diff options
Diffstat (limited to 'lib/polyjuice/client/sync.ex')
-rw-r--r-- | lib/polyjuice/client/sync.ex | 64 |
1 files changed, 36 insertions, 28 deletions
diff --git a/lib/polyjuice/client/sync.ex b/lib/polyjuice/client/sync.ex index 1f4c2f8..fe4dd1a 100644 --- a/lib/polyjuice/client/sync.ex +++ b/lib/polyjuice/client/sync.ex @@ -40,7 +40,7 @@ defmodule Polyjuice.Client.Sync do query_params: "", backoff: nil, set_filter: nil, - initial_done: false, + initial_done: false ] @sync_path "_matrix/client/r0/sync" @@ -165,11 +165,15 @@ defmodule Polyjuice.Client.Sync do case status_code do 200 -> {:ok, body} = :hackney.body(client_ref) + with {:ok, %{} = json_body} <- Poison.decode(body), filter_id = Map.get(json_body, "filter_id") do Logger.debug("got filter id #{filter_id}") + Polyjuice.Client.Storage.set_filter_id( - state.storage, state.set_filter, filter_id + state.storage, + state.set_filter, + filter_id ) do_sync(%{ @@ -228,14 +232,17 @@ defmodule Polyjuice.Client.Sync do case status_code do 200 -> {:ok, body} = :hackney.body(client_ref) + with {:ok, json_body} <- Poison.decode(body), %{"next_batch" => next_batch} <- json_body do if state.backoff, do: Logger.info("Sync resumed") process_body(json_body, state) Polyjuice.Client.Storage.set_sync_token(state.storage, next_batch) + if not state.initial_done do send(state.listener, {:initial_sync_completed}) end + do_sync(%{state | since: next_batch, backoff: nil, initial_done: true}) else _ -> @@ -284,12 +291,10 @@ defmodule Polyjuice.Client.Sync do rooms |> Map.get("leave", []) - |> Enum.each( - fn {k, v} -> - process_room(k, v, state) - send(state.listener, {:left, k}) - end - ) + |> Enum.each(fn {k, v} -> + process_room(k, v, state) + send(state.listener, {:left, k}) + end) end defp process_room(roomname, room, state) do @@ -346,29 +351,32 @@ defmodule Polyjuice.Client.Sync do 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 - ) + 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") + inviter = + invite_state + |> Map.get("m.room.member", %{}) + |> Map.get(state.user_id, %{}) + |> Map.get("sender") if inviter do send( |