Fix: use a more reliable way to determine chat #61

This fix also changed how to determine if the message belongs to a group or PM.
This commit is contained in:
KnugiHK
2023-12-03 10:27:22 +08:00
parent e6c43e7e35
commit 3847836ed6

View File

@@ -69,7 +69,7 @@ def messages(db, data, media_folder):
total_row_number = c.fetchone()[0] total_row_number = c.fetchone()[0]
print(f"Processing messages...(0/{total_row_number})", end="\r") print(f"Processing messages...(0/{total_row_number})", end="\r")
c.execute("""SELECT COALESCE(ZFROMJID, ZTOJID) as _id, c.execute("""SELECT ZCONTACTJID,
ZWAMESSAGE.Z_PK, ZWAMESSAGE.Z_PK,
ZISFROMME, ZISFROMME,
ZMESSAGEDATE, ZMESSAGEDATE,
@@ -77,29 +77,33 @@ def messages(db, data, media_folder):
ZMESSAGETYPE, ZMESSAGETYPE,
ZWAGROUPMEMBER.ZMEMBERJID, ZWAGROUPMEMBER.ZMEMBERJID,
ZMETADATA, ZMETADATA,
ZSTANZAID ZSTANZAID,
ZGROUPINFO
FROM ZWAMESSAGE FROM ZWAMESSAGE
LEFT JOIN ZWAGROUPMEMBER LEFT JOIN ZWAGROUPMEMBER
ON ZWAMESSAGE.ZGROUPMEMBER = ZWAGROUPMEMBER.Z_PK ON ZWAMESSAGE.ZGROUPMEMBER = ZWAGROUPMEMBER.Z_PK
LEFT JOIN ZWAMEDIAITEM LEFT JOIN ZWAMEDIAITEM
ON ZWAMESSAGE.Z_PK = ZWAMEDIAITEM.ZMESSAGE;""") ON ZWAMESSAGE.Z_PK = ZWAMEDIAITEM.ZMESSAGE
INNER JOIN ZWACHATSESSION
ON ZWAMESSAGE.ZCHATSESSION = ZWACHATSESSION.Z_PK;""")
i = 0 i = 0
content = c.fetchone() content = c.fetchone()
while content is not None: while content is not None:
_id = content["_id"] ZCONTACTJID = content["ZCONTACTJID"]
Z_PK = content["Z_PK"] Z_PK = content["Z_PK"]
if _id not in data: is_group_message = content["ZGROUPINFO"] is not None
data[_id] = ChatStore(Device.IOS) if ZCONTACTJID not in data:
data[ZCONTACTJID] = ChatStore(Device.IOS)
path = f'{media_folder}/Media/Profile/{_id.split("@")[0]}' path = f'{media_folder}/Media/Profile/{_id.split("@")[0]}'
avatars = glob(f"{path}*") avatars = glob(f"{path}*")
if 0 < len(avatars) <= 1: if 0 < len(avatars) <= 1:
data[_id].their_avatar = avatars[0] data[ZCONTACTJID].their_avatar = avatars[0]
else: else:
for avatar in avatars: for avatar in avatars:
if avatar.endswith(".thumb"): if avatar.endswith(".thumb"):
data[_id].their_avatar_thumb = avatar data[ZCONTACTJID].their_avatar_thumb = avatar
elif avatar.endswith(".jpg"): elif avatar.endswith(".jpg"):
data[_id].their_avatar = avatar data[ZCONTACTJID].their_avatar = avatar
ts = APPLE_TIME + content["ZMESSAGEDATE"] ts = APPLE_TIME + content["ZMESSAGEDATE"]
message = Message( message = Message(
from_me=content["ZISFROMME"], from_me=content["ZISFROMME"],
@@ -108,7 +112,7 @@ def messages(db, data, media_folder):
key_id=content["ZSTANZAID"][:17], key_id=content["ZSTANZAID"][:17],
) )
invalid = False invalid = False
if "-" in _id and content["ZISFROMME"] == 0: if is_group_message and content["ZISFROMME"] == 0:
name = None name = None
if content["ZMEMBERJID"] is not None: if content["ZMEMBERJID"] is not None:
if content["ZMEMBERJID"] in data: if content["ZMEMBERJID"] in data:
@@ -124,7 +128,7 @@ def messages(db, data, media_folder):
message.sender = None message.sender = None
if content["ZMESSAGETYPE"] == 6: if content["ZMESSAGETYPE"] == 6:
# Metadata # Metadata
if "-" in _id: if is_group_message:
# Group # Group
if content["ZTEXT"] is not None: if content["ZTEXT"] is not None:
# Chnaged name # Chnaged name
@@ -173,7 +177,7 @@ def messages(db, data, media_folder):
msg = msg.replace("\n", "<br>") msg = msg.replace("\n", "<br>")
message.data = msg message.data = msg
if not invalid: if not invalid:
data[_id].add_message(Z_PK, message) data[ZCONTACTJID].add_message(Z_PK, message)
i += 1 i += 1
if i % 1000 == 0: if i % 1000 == 0:
print(f"Processing messages...({i}/{total_row_number})", end="\r") print(f"Processing messages...({i}/{total_row_number})", end="\r")
@@ -189,7 +193,7 @@ def media(db, data, media_folder):
total_row_number = c.fetchone()[0] total_row_number = c.fetchone()[0]
print(f"\nProcessing media...(0/{total_row_number})", end="\r") print(f"\nProcessing media...(0/{total_row_number})", end="\r")
i = 0 i = 0
c.execute("""SELECT COALESCE(ZWAMESSAGE.ZFROMJID, ZWAMESSAGE.ZTOJID) as _id, c.execute("""SELECT ZCONTACTJID,
ZMESSAGE, ZMESSAGE,
ZMEDIALOCALPATH, ZMEDIALOCALPATH,
ZMEDIAURL, ZMEDIAURL,
@@ -199,15 +203,16 @@ def media(db, data, media_folder):
FROM ZWAMEDIAITEM FROM ZWAMEDIAITEM
INNER JOIN ZWAMESSAGE INNER JOIN ZWAMESSAGE
ON ZWAMEDIAITEM.ZMESSAGE = ZWAMESSAGE.Z_PK ON ZWAMEDIAITEM.ZMESSAGE = ZWAMESSAGE.Z_PK
INNER JOIN ZWACHATSESSION
ON ZWAMESSAGE.ZCHATSESSION = ZWACHATSESSION.Z_PK
WHERE ZMEDIALOCALPATH IS NOT NULL WHERE ZMEDIALOCALPATH IS NOT NULL
ORDER BY _id ASC""") ORDER BY ZCONTACTJID ASC""")
content = c.fetchone() content = c.fetchone()
mime = MimeTypes() mime = MimeTypes()
while content is not None: while content is not None:
file_path = f"{media_folder}/Message/{content['ZMEDIALOCALPATH']}" file_path = f"{media_folder}/Message/{content['ZMEDIALOCALPATH']}"
_id = content["_id"]
ZMESSAGE = content["ZMESSAGE"] ZMESSAGE = content["ZMESSAGE"]
message = data[_id].messages[ZMESSAGE] message = data[content["ZCONTACTJID"]].messages[ZMESSAGE]
message.media = True message.media = True
if os.path.isfile(file_path): if os.path.isfile(file_path):
message.data = file_path message.data = file_path