Long-press message selection + delete (message.delete frame, outbox removal, all-device sync)
This commit is contained in:
1 parent
efecf2732e
commit
e9e1aed0f2
11 files changed
+417
-18
No files matched your search
@@ -277,6 +277,55 @@ class Outbox:
|
||||
"oldest_message_id": oldest_message_id,
|
||||
}
|
||||
|
||||
# ── message deletion ──────────────────────────────────────────────────
|
||||
|
||||
def delete_message(
|
||||
self,
|
||||
chat_id: str,
|
||||
message_id: str,
|
||||
thread_id: Optional[str] = None,
|
||||
) -> int:
|
||||
"""Remove every outbox frame belonging to *message_id* in *chat_id*.
|
||||
|
||||
A message can span several frames (``message`` / ``message.start`` /
|
||||
``message.update`` / ``message.stop`` / ``media.offer`` /
|
||||
``commentary``); all of them are removed so neither ``history`` nor a
|
||||
``sync`` replay can resurrect the message. The delete is scoped to the
|
||||
exact lane: a flat-lane delete (``thread_id=None``) matches only frames
|
||||
with no ``thread_id``, and a thread delete matches only that thread's
|
||||
frames (a ``message_id`` is unique to one lane, so this is a safety
|
||||
net, not a filter that drops real frames). Returns the number of rows
|
||||
removed (0 when the message is not in the outbox — e.g. already pruned
|
||||
by retention).
|
||||
"""
|
||||
if not message_id:
|
||||
return 0
|
||||
with self._lock:
|
||||
rows = self._conn.execute(
|
||||
"SELECT cursor, frame FROM outbox WHERE chat_id = ?", (chat_id,)
|
||||
).fetchall()
|
||||
cursors: List[int] = []
|
||||
for r in rows:
|
||||
try:
|
||||
frame = json.loads(r["frame"])
|
||||
except (json.JSONDecodeError, TypeError):
|
||||
continue
|
||||
if not isinstance(frame, dict):
|
||||
continue
|
||||
if frame.get("thread_id") != thread_id:
|
||||
continue
|
||||
payload = frame.get("payload")
|
||||
if isinstance(payload, dict) and payload.get("message_id") == message_id:
|
||||
cursors.append(int(r["cursor"]))
|
||||
if not cursors:
|
||||
return 0
|
||||
placeholders = ",".join("?" * len(cursors))
|
||||
self._conn.execute(
|
||||
f"DELETE FROM outbox WHERE cursor IN ({placeholders})", cursors
|
||||
)
|
||||
self._conn.commit()
|
||||
return len(cursors)
|
||||
|
||||
# ── retention ─────────────────────────────────────────────────────────
|
||||
|
||||
def _maybe_prune(self) -> None:
|
||||
|
||||
Reference in new issue
Block a user