mirror of
https://github.com/MCV-Software/TWBlue.git
synced 2026-03-06 09:27:33 +01:00
Fix unknown sender names in Bluesky chats, reduce false notifications, and reorder Chats buffer
Resolve sender DIDs to display names by building member maps from conversation data. Fix compose functions to prefer snake_case attributes (ATProto SDK convention). Ensure stable key comparison in dedup logic by converting ATProto objects to strings. Move Chats buffer to appear after Mentions and before Notifications. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -366,17 +366,25 @@ def compose_convo(convo, db, settings, relative_times, show_screen_names=False,
|
||||
members = g(convo, "members", [])
|
||||
self_did = db.get("user_id") if isinstance(db, dict) else None
|
||||
|
||||
# Build a local DID→name map from conversation members for sender resolution
|
||||
member_names = {}
|
||||
for m in members:
|
||||
did = g(m, "did", None)
|
||||
if did:
|
||||
name = g(m, "display_name") or g(m, "displayName") or g(m, "handle", "unknown")
|
||||
member_names[did] = name
|
||||
|
||||
# Get other participants (exclude self)
|
||||
others = []
|
||||
for m in members:
|
||||
did = g(m, "did", None)
|
||||
if self_did and did == self_did:
|
||||
continue
|
||||
label = g(m, "displayName") or g(m, "display_name") or g(m, "handle", "unknown")
|
||||
label = member_names.get(did, "unknown") if did else g(m, "display_name") or g(m, "displayName") or g(m, "handle", "unknown")
|
||||
others.append(label)
|
||||
|
||||
if not others:
|
||||
others = [g(m, "displayName") or g(m, "display_name") or g(m, "handle", "unknown") for m in members]
|
||||
others = [member_names.get(g(m, "did"), "unknown") if g(m, "did") else "unknown" for m in members]
|
||||
|
||||
participants = ", ".join(others)
|
||||
|
||||
@@ -389,7 +397,14 @@ def compose_convo(convo, db, settings, relative_times, show_screen_names=False,
|
||||
last_text = g(last_msg_obj, "text", "")
|
||||
sender = g(last_msg_obj, "sender", None)
|
||||
if sender:
|
||||
last_sender = g(sender, "displayName") or g(sender, "display_name") or g(sender, "handle", "")
|
||||
last_sender = g(sender, "display_name") or g(sender, "displayName") or g(sender, "handle")
|
||||
if not last_sender:
|
||||
# Resolve DID via local member map
|
||||
sdid = g(sender, "did")
|
||||
if sdid:
|
||||
last_sender = member_names.get(sdid, "")
|
||||
if not last_sender:
|
||||
last_sender = sdid or ""
|
||||
|
||||
# Date
|
||||
date_str = ""
|
||||
@@ -434,7 +449,16 @@ def compose_chat_message(msg, db, settings, relative_times, show_screen_names=Fa
|
||||
return getattr(obj, key, default)
|
||||
|
||||
sender = g(msg, "sender", {})
|
||||
handle = g(sender, "displayName") or g(sender, "display_name") or g(sender, "handle", "unknown")
|
||||
sender_did = g(sender, "did")
|
||||
handle = g(sender, "display_name") or g(sender, "displayName") or g(sender, "handle")
|
||||
if not handle and sender_did and isinstance(db, dict):
|
||||
# Look up DID in member maps stored by ChatBuffer
|
||||
for key, val in db.items():
|
||||
if key.endswith("_members") and isinstance(val, dict) and sender_did in val:
|
||||
handle = val[sender_did]
|
||||
break
|
||||
if not handle:
|
||||
handle = sender_did or "unknown"
|
||||
|
||||
text = g(msg, "text", "")
|
||||
|
||||
|
||||
@@ -751,6 +751,18 @@ class Session(base.baseSession):
|
||||
log.exception("Error listing conversations")
|
||||
return {"items": [], "cursor": None}
|
||||
|
||||
def get_convo(self, convo_id: str):
|
||||
"""Fetch a single conversation by ID, returning the convo object or None."""
|
||||
api = self._ensure_client()
|
||||
dm_client = api.with_bsky_chat_proxy()
|
||||
dm = dm_client.chat.bsky.convo
|
||||
try:
|
||||
res = dm.get_convo({"convoId": convo_id})
|
||||
return res.convo
|
||||
except Exception:
|
||||
log.exception("Error fetching conversation %s", convo_id)
|
||||
return None
|
||||
|
||||
def get_convo_messages(self, convo_id: str, limit: int = 50, cursor: str | None = None) -> dict[str, Any]:
|
||||
api = self._ensure_client()
|
||||
dm_client = api.with_bsky_chat_proxy()
|
||||
|
||||
Reference in New Issue
Block a user