generated from exteraGramPlugins/pluginBase
Keep the status card visible and the unread prefill stable
Two bugs visible in a device log. "injector: anchor 0 not loaded, skipping insert" was a regression from the previous commit. _newest_visible_message_id returns 0 when the offset reaches past the loaded window, and the strict anchor check then refused to place the card, so pressing Summarize appeared to do nothing at all. Before that commit anchor 0 silently matched a date separator, which is why it went unnoticed. A live card is the user's only feedback that the press registered, so it must always appear: try the exact anchor, then id ordering, then the bottom of the chat, and let reanchor() move it once the analyzed range is known. Restoring saved summaries stays strict, since nothing corrects their position later. _newest_visible_message_id also falls back to the oldest loaded message rather than returning 0. The unread button prefilled a smaller range on each press -- 1000, then 15, then 75, with ~1100 unread. Viewing a chat calls MessagesController.markDialogAsRead, so dialog.unread_count decays while the chat is open and no longer describes the backlog the user wants summarized. Resolve the count from the unread divider instead, which is what the app's own button uses (onPageDownClicked branches on createUnreadMessageAfterId) and which does not decay while the chat stays open, and keep the largest value seen per chat so a later press never prefills less than an earlier one. Both are covered by tests that fail against the previous behaviour: the strict anchor path reports inserted=True while leaving no card in the list, and the unread resolver reproduces exactly 1100, 15, 75.
This commit is contained in:
1 parent
b05d1a274c
commit
785618233b
4 files changed
+162
-13
No files matched your search
@@ -794,6 +794,50 @@ def main(argv=None) -> int:
|
||||
f"installed hooks: {len(plugin.unread_hook._unhooks)} (expected 3)",
|
||||
)
|
||||
|
||||
# unread_count decays while a chat is open (markDialogAsRead runs as
|
||||
# messages are viewed), so pressing the unread button a second time used
|
||||
# to prefill a far smaller range than the first press: 1100 then 15 then
|
||||
# 75. The resolved count must not shrink while the chat stays open.
|
||||
class _UnreadDialog:
|
||||
def __init__(self, count):
|
||||
self.unread_count = count
|
||||
|
||||
class _UnreadFragment:
|
||||
def __init__(self, divider, ids):
|
||||
self.createUnreadMessageAfterId = divider
|
||||
self.messages = _JavaList()
|
||||
for mid in ids:
|
||||
owner_obj = _TLObj("TL_message")
|
||||
owner_obj.id = mid
|
||||
self.messages.add(_FakeMessageObject(0, owner_obj))
|
||||
|
||||
unread_dialog = _UnreadDialog(1100)
|
||||
cu_mod = sys.modules["client_utils"]
|
||||
real_controller = cu_mod.get_messages_controller
|
||||
|
||||
class _UnreadController:
|
||||
class dialogs_dict:
|
||||
@staticmethod
|
||||
def get(_dialog_id):
|
||||
return unread_dialog
|
||||
|
||||
cu_mod.get_messages_controller = lambda: _UnreadController
|
||||
try:
|
||||
unread_fragment = _UnreadFragment(171000, list(range(172700, 172670, -1)))
|
||||
resolved = []
|
||||
for decayed in (1100, 15, 75):
|
||||
unread_dialog.unread_count = decayed
|
||||
resolved.append(
|
||||
plugin.unread_hook._resolve_unread_count(unread_fragment, -1978105175)
|
||||
)
|
||||
finally:
|
||||
cu_mod.get_messages_controller = real_controller
|
||||
check(
|
||||
"the unread prefill does not shrink as messages are marked read",
|
||||
resolved == [1100, 1100, 1100],
|
||||
f"resolved={resolved}",
|
||||
)
|
||||
|
||||
settings_rows = plugin.create_settings()
|
||||
settings_keys = {row.key for row in settings_rows if hasattr(row, "key")}
|
||||
expected_keys = {
|
||||
@@ -1971,6 +2015,24 @@ def main(argv=None) -> int:
|
||||
f"dispatched={sep_n} ids={sep_ids}",
|
||||
)
|
||||
|
||||
# A live status card is the only feedback that pressing Summarize did
|
||||
# anything, so it must appear even when the provisional anchor cannot be
|
||||
# placed: a large offset reaches past the loaded window, and an
|
||||
# unresolved anchor arrives as 0. Requiring a loaded anchor here left the
|
||||
# user staring at an unchanged chat.
|
||||
for label, anchor in (("unresolved anchor 0", 0), ("anchor past the window", 4242)):
|
||||
live = _FakeChatActivity([700, 690, 680])
|
||||
live_injection = injector.SummaryInjection(
|
||||
live, 0, -4242, 0, anchor, injector.virtual_id_for(0, anchor or 1)
|
||||
)
|
||||
shown = live_injection.insert(status="Fetching messages…", streaming=True)
|
||||
live_ids = [m.messageOwner.id for m in live.messages]
|
||||
check(
|
||||
f"the status card still appears with an {label}",
|
||||
shown and len([i for i in live_ids if i < 0]) == 1,
|
||||
f"inserted={shown} ids={live_ids}",
|
||||
)
|
||||
|
||||
check(
|
||||
"sys.modules gained no entry for bundled plugin module names",
|
||||
not ({"main", "config", "services", "providers", "hooks", "ui.summarize_dialog"} & new_modules),
|
||||
|
||||
Reference in new issue
Block a user