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