From 9f321384ece48e262d325b80b1fb1669cf90dae3 Mon Sep 17 00:00:00 2001 From: KnugiHK <24708955+KnugiHK@users.noreply.github.com> Date: Sun, 2 Mar 2025 00:52:28 +0800 Subject: [PATCH] Make ChatStore.messages private --- Whatsapp_Chat_Exporter/android_handler.py | 6 +++--- Whatsapp_Chat_Exporter/data_model.py | 18 +++++++++++------- Whatsapp_Chat_Exporter/ios_handler.py | 4 ++-- 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/Whatsapp_Chat_Exporter/android_handler.py b/Whatsapp_Chat_Exporter/android_handler.py index 30284a0..ca6e8a7 100644 --- a/Whatsapp_Chat_Exporter/android_handler.py +++ b/Whatsapp_Chat_Exporter/android_handler.py @@ -451,7 +451,7 @@ def media(db, data, media_folder, filter_date, filter_chat, filter_empty, separa Path(f"{media_folder}/thumbnails").mkdir(parents=True, exist_ok=True) while content is not None: file_path = f"{media_folder}/{content['file_path']}" - message = data[content["key_remote_jid"]].messages[content["message_row_id"]] + message = data[content["key_remote_jid"]].get_message(content["message_row_id"]) message.media = True if os.path.isfile(file_path): message.data = file_path @@ -547,7 +547,7 @@ def vcard(db, data, media_folder, filter_date, filter_chat, filter_empty): if not os.path.isfile(file_path): with open(file_path, "w", encoding="utf-8") as f: f.write(row["vcard"]) - message = data[row["key_remote_jid"]].messages[row["message_row_id"]] + message = data[row["key_remote_jid"]].get_message(row["message_row_id"]) message.data = "This media include the following vCard file(s):
" \ f'{htmle(media_name)}' message.mime = "text/x-vcard" @@ -736,7 +736,7 @@ def create_txt(data, output): contact = jik.replace('+', '') output_file = os.path.join(output, f"{contact}.txt") with open(output_file, "w", encoding="utf8") as f: - for message in chat.messages.values(): + for message in chat.get_messages(): date = datetime.fromtimestamp(message.timestamp).date() if message.meta and message.mime != "media": continue # Skip any metadata in text format diff --git a/Whatsapp_Chat_Exporter/data_model.py b/Whatsapp_Chat_Exporter/data_model.py index 411de1c..20b9754 100644 --- a/Whatsapp_Chat_Exporter/data_model.py +++ b/Whatsapp_Chat_Exporter/data_model.py @@ -74,7 +74,7 @@ class ChatStore: if name is not None and not isinstance(name, str): raise TypeError("Name must be a string or None") self.name = name - self.messages: Dict[str, 'Message'] = {} + self._messages: Dict[str, 'Message'] = {} self.type = type if media is not None: from Whatsapp_Chat_Exporter.utility import Device @@ -95,12 +95,16 @@ class ChatStore: """Add a message to the chat store.""" if not isinstance(message, Message): raise TypeError("message must be a Message object") - self.messages[id] = message + self._messages[id] = message + + def get_message(self, id: str) -> 'Message': + """Get a message from the chat store.""" + return self._messages.get(id) def delete_message(self, id: str) -> None: """Delete a message from the chat store.""" - if id in self.messages: - del self.messages[id] + if id in self._messages: + del self._messages[id] def to_json(self) -> Dict[str, Any]: """Convert chat store to JSON-serializable dict.""" @@ -111,16 +115,16 @@ class ChatStore: 'their_avatar': self.their_avatar, 'their_avatar_thumb': self.their_avatar_thumb, 'status': self.status, - 'messages': {id: msg.to_json() for id, msg in self.messages.items()} + 'messages': {id: msg.to_json() for id, msg in self._messages.items()} } def get_last_message(self) -> 'Message': """Get the most recent message in the chat.""" - return tuple(self.messages.values())[-1] + return tuple(self._messages.values())[-1] def get_messages(self) -> Dict[str, 'Message']: """Get all messages in the chat.""" - return self.messages.values() + return self._messages.values() class Message: diff --git a/Whatsapp_Chat_Exporter/ios_handler.py b/Whatsapp_Chat_Exporter/ios_handler.py index 258bc61..a164e2d 100644 --- a/Whatsapp_Chat_Exporter/ios_handler.py +++ b/Whatsapp_Chat_Exporter/ios_handler.py @@ -283,7 +283,7 @@ def media(db, data, media_folder, filter_date, filter_chat, filter_empty, separa file_path = f"{media_folder}/Message/{content['ZMEDIALOCALPATH']}" ZMESSAGE = content["ZMESSAGE"] contact = data[content["ZCONTACTJID"]] - message = contact.messages[ZMESSAGE] + message = contact.get_message(ZMESSAGE) message.media = True if contact.media_base == "": contact.media_base = media_folder + "/" @@ -367,7 +367,7 @@ def vcard(db, data, media_folder, filter_date, filter_chat, filter_empty): vcard_summary = "This media include the following vCard file(s):
" vcard_summary += " | ".join([f'{htmle(name)}' for name, fp in zip(vcard_names, file_paths)]) - message = data[content["ZCONTACTJID"]].messages[content["ZMESSAGE"]] + message = data[content["ZCONTACTJID"]].get_message(content["ZMESSAGE"]) message.data = vcard_summary message.mime = "text/x-vcard" message.media = True