Reset channel resume points on undo
--undo only cleared the reactions log, so a subsequent run kept diffing forward from each channel's last-seen message instead of honoring days_back, silently skipping everything already undone. Undo now also clears channel_scan_state so the next run does a full fresh backlog scan.
This commit is contained in:
@@ -132,6 +132,16 @@ class Storage:
|
|||||||
)
|
)
|
||||||
return inserted
|
return inserted
|
||||||
|
|
||||||
|
def clear_scan_state(self) -> int:
|
||||||
|
"""Wipe all per-channel resume points. The backlog scan only ever
|
||||||
|
consults days_back on a channel's very first scan and otherwise just
|
||||||
|
diffs forward from the last-seen message, so this must be cleared
|
||||||
|
whenever reactions are undone (or days_back is widened) to force a
|
||||||
|
fresh full backlog scan instead of silently skipping everything."""
|
||||||
|
with self._lock, self._conn:
|
||||||
|
cur = self._conn.execute("DELETE FROM channel_scan_state")
|
||||||
|
return cur.rowcount
|
||||||
|
|
||||||
def get_scan_state(self, channel_id) -> Optional[dict]:
|
def get_scan_state(self, channel_id) -> Optional[dict]:
|
||||||
with self._lock:
|
with self._lock:
|
||||||
cur = self._conn.execute(
|
cur = self._conn.execute(
|
||||||
|
|||||||
@@ -43,4 +43,9 @@ async def undo_all_reactions(client: discord.Client, storage: Storage, display:
|
|||||||
|
|
||||||
await asyncio.sleep(human_jitter())
|
await asyncio.sleep(human_jitter())
|
||||||
|
|
||||||
log.info("Undo complete: removed %d/%d reaction(s)", removed, total)
|
cleared = await asyncio.to_thread(storage.clear_scan_state)
|
||||||
|
log.info(
|
||||||
|
"Undo complete: removed %d/%d reaction(s), cleared %d channel resume point(s) — "
|
||||||
|
"the next normal run will do a full fresh backlog scan.",
|
||||||
|
removed, total, cleared,
|
||||||
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user