Skip to content

Commit f515c97

Browse files
committed
Do not send backlog events
It is messy to resend then when clients restart, because none of them deduplicates messages on msgi. Some might if we wrapped the backlog in a 'chathistory' batch, but 1. not all of them would, 2. it's hard to implement correctly. Therefore, let's remove it entirely. If clients want the backlog, they should implement support for the CHATHISTORY command.
1 parent 8ddbb7c commit f515c97

File tree

2 files changed

+473
-319
lines changed

2 files changed

+473
-319
lines changed

lib/matrix_client/poller.ex

Lines changed: 100 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ defmodule M51.MatrixClient.Poller do
128128
end)
129129
end
130130

131-
defp well_formed_event?(event, irc_state, write) do
131+
defp well_formed_event?(is_backlog, event, irc_state, write) do
132132
case event do
133133
%{
134134
"content" => %{},
@@ -138,6 +138,9 @@ defmodule M51.MatrixClient.Poller do
138138
when is_binary(sender) and is_binary(type) ->
139139
true
140140

141+
_ when is_backlog ->
142+
nil
143+
141144
_ ->
142145
nick = M51.IrcConn.State.nick(irc_state)
143146

@@ -162,7 +165,7 @@ defmodule M51.MatrixClient.Poller do
162165
room_event
163166
|> Map.get("state", %{})
164167
|> Map.get("events", [])
165-
|> Enum.filter(fn event -> well_formed_event?(event, irc_state, write) end)
168+
|> Enum.filter(fn event -> well_formed_event?(is_backlog, event, irc_state, write) end)
166169
# oldest first
167170
|> Enum.map(fn event ->
168171
event_id = Map.get(event, "event_id")
@@ -203,7 +206,7 @@ defmodule M51.MatrixClient.Poller do
203206
room_event
204207
|> Map.get("timeline", %{})
205208
|> Map.get("events", [])
206-
|> Enum.filter(fn event -> well_formed_event?(event, irc_state, write) end)
209+
|> Enum.filter(fn event -> well_formed_event?(is_backlog, event, irc_state, write) end)
207210
# oldest first
208211
|> Enum.map(fn event ->
209212
event_id = Map.get(event, "event_id")
@@ -279,11 +282,21 @@ defmodule M51.MatrixClient.Poller do
279282
end
280283
end
281284

285+
def handle_event(
286+
_sup_pid,
287+
_room_id,
288+
_sender,
289+
true,
290+
_write,
291+
%{"type" => "m.room.join_rules"}
292+
) do
293+
end
294+
282295
def handle_event(
283296
sup_pid,
284297
room_id,
285298
sender,
286-
is_backlog,
299+
false,
287300
write,
288301
%{
289302
"type" => "m.room.join_rules",
@@ -295,24 +308,22 @@ defmodule M51.MatrixClient.Poller do
295308
channel = M51.MatrixClient.State.room_irc_channel(state, room_id)
296309
send = make_send_function(sup_pid, event, write)
297310

298-
if !is_backlog do
299-
mode =
300-
case join_rule do
301-
"public" -> "-i"
302-
"knock" -> "+i"
303-
"invite" -> "+i"
304-
"private" -> "+i"
305-
_ -> nil
306-
end
307-
308-
if mode != nil do
309-
send.(%M51.Irc.Command{
310-
tags: %{"account" => sender},
311-
source: nick2nuh(sender),
312-
command: "MODE",
313-
params: [channel, mode]
314-
})
311+
mode =
312+
case join_rule do
313+
"public" -> "-i"
314+
"knock" -> "+i"
315+
"invite" -> "+i"
316+
"private" -> "+i"
317+
_ -> nil
315318
end
319+
320+
if mode != nil do
321+
send.(%M51.Irc.Command{
322+
tags: %{"account" => sender},
323+
source: nick2nuh(sender),
324+
command: "MODE",
325+
params: [channel, mode]
326+
})
316327
end
317328

318329
nil
@@ -435,11 +446,23 @@ defmodule M51.MatrixClient.Poller do
435446
nil
436447
end
437448

449+
def handle_event(
450+
_sup_pid,
451+
_room_id,
452+
_sender,
453+
true,
454+
_write,
455+
%{"type" => "m.room.message"}
456+
) do
457+
# do not show messages from the backlog
458+
nil
459+
end
460+
438461
def handle_event(
439462
sup_pid,
440463
room_id,
441464
sender,
442-
_is_backlog,
465+
false,
443466
write,
444467
%{"type" => "m.room.message", "content" => %{}} = event
445468
) do
@@ -669,11 +692,22 @@ defmodule M51.MatrixClient.Poller do
669692
nil
670693
end
671694

695+
def handle_event(
696+
_sup_pid,
697+
_room_id,
698+
_sender,
699+
true,
700+
_write,
701+
%{"type" => "m.reaction"}
702+
) do
703+
nil
704+
end
705+
672706
def handle_event(
673707
sup_pid,
674708
room_id,
675709
sender,
676-
_is_backlog,
710+
false,
677711
write,
678712
%{"type" => "m.reaction", "content" => %{}} = event
679713
) do
@@ -726,11 +760,22 @@ defmodule M51.MatrixClient.Poller do
726760
end
727761
end
728762

763+
def handle_event(
764+
_sup_pid,
765+
_room_id,
766+
_sender,
767+
true,
768+
_write,
769+
%{"type" => "m.sticker"}
770+
) do
771+
nil
772+
end
773+
729774
def handle_event(
730775
sup_pid,
731776
room_id,
732777
sender,
733-
_is_backlog,
778+
false,
734779
write,
735780
%{"type" => "m.sticker", "content" => %{}} = event
736781
) do
@@ -781,11 +826,22 @@ defmodule M51.MatrixClient.Poller do
781826
end
782827
end
783828

829+
def handle_event(
830+
_sup_pid,
831+
_room_id,
832+
_sender,
833+
true,
834+
_write,
835+
%{"type" => "m.room.redaction", "content" => %{}}
836+
) do
837+
nil
838+
end
839+
784840
def handle_event(
785841
sup_pid,
786842
room_id,
787843
sender,
788-
_is_backlog,
844+
false,
789845
write,
790846
%{"type" => "m.room.redaction", "content" => %{}} = event
791847
) do
@@ -828,11 +884,22 @@ defmodule M51.MatrixClient.Poller do
828884
})
829885
end
830886

887+
def handle_event(
888+
_sup_pid,
889+
_room_id,
890+
_sender,
891+
true,
892+
_write,
893+
%{"type" => "m.room.encrypted"}
894+
) do
895+
nil
896+
end
897+
831898
def handle_event(
832899
sup_pid,
833900
room_id,
834901
sender,
835-
_is_backlog,
902+
false,
836903
write,
837904
%{"type" => "m.room.encrypted", "content" => %{}} = event
838905
) do
@@ -954,7 +1021,11 @@ defmodule M51.MatrixClient.Poller do
9541021
# ignore these
9551022
end
9561023

957-
def handle_event(sup_pid, room_id, _sender, _is_backlog, write, event) do
1024+
def handle_event(_sup_pid, _room_id, _sender, true, _write, _event) do
1025+
# Unknown or malformed event in the backlog
1026+
end
1027+
1028+
def handle_event(sup_pid, room_id, _sender, false, write, event) do
9581029
state = M51.IrcConn.Supervisor.matrix_state(sup_pid)
9591030
channel = M51.MatrixClient.State.room_irc_channel(state, room_id)
9601031
send = make_send_function(sup_pid, event, write)
@@ -988,7 +1059,7 @@ defmodule M51.MatrixClient.Poller do
9881059
# TODO
9891060
end
9901061

991-
defp handle_invited_room(sup_pid, _is_backlog, handled_event_ids, room_id, write, room_event) do
1062+
defp handle_invited_room(sup_pid, is_backlog, handled_event_ids, room_id, write, room_event) do
9921063
irc_state = M51.IrcConn.Supervisor.state(sup_pid)
9931064
state = M51.IrcConn.Supervisor.matrix_state(sup_pid)
9941065
nick = M51.IrcConn.State.nick(irc_state)
@@ -997,7 +1068,7 @@ defmodule M51.MatrixClient.Poller do
9971068
room_event
9981069
|> Map.get("invite_state", %{})
9991070
|> Map.get("events", [])
1000-
|> Enum.filter(fn event -> well_formed_event?(event, irc_state, write) end)
1071+
|> Enum.filter(fn event -> well_formed_event?(is_backlog, event, irc_state, write) end)
10011072
# oldest first
10021073
|> Enum.map(fn event ->
10031074
event_id = Map.get(event, "event_id")

0 commit comments

Comments
 (0)