@@ -435,6 +435,7 @@ class GroupMember:
435435
436436 TABLE_NAME = "ZWAGROUPMEMBER"
437437 EXPECTED_COLUMNS = {"Z_PK" , "ZMEMBERJID" , "ZCONTACTNAME" }
438+ ACTIVE_MEMBERSHIP_COLUMNS = {"ZCHATSESSION" , "ZISACTIVE" }
438439
439440 @classmethod
440441 def from_row (cls , row : sqlite3 .Row ) -> "GroupMember" :
@@ -456,6 +457,25 @@ def fetch_group_member(cls, member_id: int, connection: sqlite3.Connection) -> "
456457 ).fetchone ()
457458 return None if row is None else cls .from_row (row )
458459
460+ @classmethod
461+ def fetch_active_group_members (cls , chat_id : int , connection : sqlite3 .Connection ) -> list ["GroupMember" ]:
462+ rows = connection .execute (f"PRAGMA table_info({ cls .TABLE_NAME } )" ).fetchall ()
463+ column_names = {str (row ["name" ]).upper () for row in rows }
464+ if not cls .ACTIVE_MEMBERSHIP_COLUMNS .issubset (column_names ):
465+ return []
466+
467+ rows = connection .execute (
468+ f"""
469+ SELECT *
470+ FROM { cls .TABLE_NAME }
471+ WHERE ZCHATSESSION = ?
472+ AND IFNULL(ZISACTIVE, 0) = 1
473+ ORDER BY Z_PK
474+ """ ,
475+ (chat_id ,),
476+ ).fetchall ()
477+ return [cls .from_row (row ) for row in rows ]
478+
459479 @classmethod
460480 def fetch_group_member_ids (cls , chat_id : int , connection : sqlite3 .Connection ) -> list [int ]:
461481 supported = SupportedMessageType .all_values ()
@@ -1170,12 +1190,35 @@ def fetchGroupMemberInfo(
11701190 group_member = GroupMember .fetch_group_member (memberId , connection )
11711191 if group_member is None :
11721192 return None
1193+ return self .fetchResolvedGroupMemberInfo (group_member , connection )
1194+
1195+ def fetchResolvedGroupMemberInfo (
1196+ self ,
1197+ groupMember : GroupMember ,
1198+ connection : sqlite3 .Connection ,
1199+ ) -> tuple [str | None , str | None ]:
11731200 return self .obtainSenderInfo (
1174- jid = group_member .memberJid ,
1175- contactNameGroupMember = group_member .contactName ,
1201+ jid = groupMember .memberJid ,
1202+ contactNameGroupMember = groupMember .contactName ,
11761203 connection = connection ,
11771204 )
11781205
1206+ def fetchGroupContactMembers (
1207+ self ,
1208+ chatId : int ,
1209+ connection : sqlite3 .Connection ,
1210+ ) -> list [GroupMember ]:
1211+ active_members = GroupMember .fetch_active_group_members (chatId , connection )
1212+ if active_members :
1213+ return active_members
1214+
1215+ members : list [GroupMember ] = []
1216+ for member_id in GroupMember .fetch_group_member_ids (chatId , connection ):
1217+ group_member = GroupMember .fetch_group_member (member_id , connection )
1218+ if group_member is not None :
1219+ members .append (group_member )
1220+ return members
1221+
11791222 def fetchDuration (self , mediaItemId : int , connection : sqlite3 .Connection ) -> int | None :
11801223 media_item = MediaItem .fetch_media_item (mediaItemId , connection )
11811224 if media_item is None or media_item .movieDuration is None :
@@ -1311,14 +1354,31 @@ def obtainSenderInfo(
13111354 lid_account = self .lidAccountIndex .account (jid )
13121355 if lid_account is not None :
13131356 profile_display_name = normalized_author_field (ProfilePushName .push_name (jid , connection ))
1357+ linked_phone_jid = self .linkedPhoneJid (jid ) or self .lidAccountIndex .phoneJid (jid )
1358+ linked_phone_display_name : str | None = None
1359+ if linked_phone_jid is not None :
1360+ linked_phone_display_name = self .resolvedContactDisplayName (
1361+ jid = linked_phone_jid ,
1362+ profileDisplayName = normalized_author_field (ProfilePushName .push_name (linked_phone_jid , connection )),
1363+ senderPhone = normalized_author_field (extracted_phone (linked_phone_jid )),
1364+ connection = connection ,
1365+ )
13141366 return (
1315- profile_display_name ,
1367+ linked_phone_display_name or profile_display_name ,
13161368 normalized_author_field (lid_account .normalizedPhoneNumber ) or sender_phone ,
13171369 )
13181370
13191371 linked_phone_jid = self .linkedPhoneJid (jid )
13201372 if linked_phone_jid is not None :
1321- return (None , normalized_author_field (extracted_phone (linked_phone_jid )))
1373+ return (
1374+ self .resolvedContactDisplayName (
1375+ jid = linked_phone_jid ,
1376+ profileDisplayName = normalized_author_field (ProfilePushName .push_name (linked_phone_jid , connection )),
1377+ senderPhone = normalized_author_field (extracted_phone (linked_phone_jid )),
1378+ connection = connection ,
1379+ ),
1380+ normalized_author_field (extracted_phone (linked_phone_jid )),
1381+ )
13221382
13231383 push_name = ProfilePushName .push_name (jid , connection )
13241384 if push_name is not None :
@@ -1329,6 +1389,26 @@ def obtainSenderInfo(
13291389
13301390 return (contactNameGroupMember , sender_phone )
13311391
1392+ def resolvedContactDisplayName (
1393+ self ,
1394+ jid : str ,
1395+ profileDisplayName : str | None ,
1396+ senderPhone : str | None ,
1397+ connection : sqlite3 .Connection ,
1398+ ) -> str | None :
1399+ chat_session_name = normalized_author_field (ChatSession .fetch_chat_session_name (jid , connection ))
1400+ if chat_session_name is not None and not self .isPhoneLikeDisplayLabel (chat_session_name , senderPhone ):
1401+ return chat_session_name
1402+
1403+ if self .addressBookIndex is not None :
1404+ address_book_contact = self .addressBookIndex .contact (jid )
1405+ if address_book_contact is not None :
1406+ display_name = normalized_author_field (address_book_contact .bestDisplayName )
1407+ if display_name is not None :
1408+ return display_name
1409+
1410+ return profileDisplayName
1411+
13321412 def makeParticipantAuthor (
13331413 self ,
13341414 jid : str ,
@@ -1525,14 +1605,13 @@ def buildContactList(
15251605 other_contact = self .copyContactMedia (other_contact , backup , directory )
15261606 contacts .append (other_contact )
15271607 else :
1528- for member_id in GroupMember .fetch_group_member_ids (chatInfo .id , connection ):
1529- sender_info = self .fetchGroupMemberInfo (member_id , connection )
1530- if sender_info is None :
1531- continue
1532- sender_name , sender_phone = sender_info
1533- if sender_phone is None or sender_phone == owner_phone :
1608+ seen_phones = {owner_phone }
1609+ for member in self .fetchGroupContactMembers (chatInfo .id , connection ):
1610+ sender_name , sender_phone = self .fetchResolvedGroupMemberInfo (member , connection )
1611+ if sender_phone is None or sender_phone == owner_phone or sender_phone in seen_phones :
15341612 continue
1535- contact = ContactInfo (name = sender_name or "" , phone = sender_phone )
1613+ seen_phones .add (sender_phone )
1614+ contact = ContactInfo (name = sender_name or sender_phone , phone = sender_phone )
15361615 if directory is not None :
15371616 contact = self .copyContactMedia (contact , backup , directory )
15381617 contacts .append (contact )
0 commit comments