diff --git a/app/DataBase/output_pc.py b/app/DataBase/output_pc.py index 3a9d967..d322546 100644 --- a/app/DataBase/output_pc.py +++ b/app/DataBase/output_pc.py @@ -336,11 +336,7 @@ class ChildThread(QThread): displayname = escape_js_and_html(displayname) if self.output_type == Output.HTML: emoji_path = get_emoji(str_content, thumb=True, output_path=origin_docx_path + '/emoji') - if emoji_path == "": - # todo 改为网络404图片 - emoji_path = "./emoji/404.png" - else: - emoji_path = './emoji/' + os.path.basename(emoji_path) + emoji_path = './emoji/' + os.path.basename(emoji_path) if self.is_5_min(timestamp): doc.write( f'''{{ type:0, text: '{str_time}',is_send:0,avatar_path:'',timestamp:{timestamp},is_chatroom:{is_chatroom},displayname:'{displayname}'}},''' @@ -549,6 +545,7 @@ class ChildThread(QThread): if not os.path.exists(chatroom_avatar_path): message[12].avatar.save(chatroom_avatar_path) except: + print(message) pass else: self.contact.avatar.save(os.path.join(f"{origin_docx_path}/avatar/{self.contact.wxid}.png")) @@ -1080,11 +1077,16 @@ html_end = ''' const itemsPerPage = 100; // 每页显示的元素个数 let currentPage = 1; // 当前页 -var reachedBottom = false; // 到达底部的标记 + var reachedBottom = false; // 到达底部的标记 + var lastScrollTop = 0; function renderPage(page) { - reachedBottom = false; const container = document.getElementById('chat-container'); - container.innerHTML = ''; // 清空容器 + if (!reachedBottom) { + container.innerHTML = ''; // 清空容器 + lastScrollTop = 0; + } else { + reachedBottom = false; + } // 计算当前页应该显示的元素范围 const startIndex = (page - 1) * itemsPerPage; @@ -1141,7 +1143,7 @@ var reachedBottom = false; // 到达底部的标记 return messageAudioTag; } - // 从数据列表中取出对应范围的元素并添加到容器中 + // 从数据列表中取出对应范围的元素并添加到容器中 for (let i = startIndex; i < endIndex && i < chatMessages.length; i++) { const message = chatMessages[i]; if (i == startIndex) { // 判断一下在页面顶部多加一个时间 @@ -1249,7 +1251,7 @@ var reachedBottom = false; // 到达底部的标记 } chatContainer.appendChild(messageElement); } - document.querySelector("#chat-container").scrollTop = 0; + document.querySelector("#chat-container").scrollTop = lastScrollTop; updatePaginationInfo(); refreshMediaListener(); } @@ -1287,22 +1289,22 @@ var reachedBottom = false; // 到达底部的标记 } - function checkScroll() { - var chatContainer = document.getElementById("chat-container"); + function checkScroll() { + var chatContainer = document.getElementById("chat-container"); - // 检查滚动条是否滑到底部 - if (chatContainer.scrollHeight - chatContainer.scrollTop === chatContainer.clientHeight) { - // 如果滚动条在底部 - if (!reachedBottom) { - // 设置标记并返回 - reachedBottom = true; - return; - } - else{ - nextPage(); - } + // 检查滚动条是否滑到底部 + if (chatContainer.scrollHeight - chatContainer.scrollTop - 10 <= chatContainer.clientHeight) { + // 如果滚动条在底部 + if (!reachedBottom) { + // 设置标记并返回 + reachedBottom = true; + lastScrollTop = chatContainer.scrollTop; + } + if (reachedBottom) { + nextPage(); + } + } } - } // 初始化页面 renderPage(currentPage); diff --git a/app/DataBase/package_msg.py b/app/DataBase/package_msg.py index 1560063..138bb7d 100644 --- a/app/DataBase/package_msg.py +++ b/app/DataBase/package_msg.py @@ -3,7 +3,7 @@ import threading from app.DataBase import msg_db, micro_msg_db, misc_db from app.util.protocbuf.msg_pb2 import MessageBytesExtra from app.util.protocbuf.roomdata_pb2 import ChatRoomData -from app.person import ContactPC, MePC +from app.person import ContactPC, MePC, ContactDefault lock = threading.Lock() @@ -107,12 +107,11 @@ class PackageMsg: a[9]: msgSvrId, a[10]: BytesExtra, a[11]: CompressContent, - a[12]: msg_sender, (ContactPC类型,这个才是群聊里的信息发送人,不是群聊或者自己是发送者没有这个字段) + a[12]: msg_sender, (ContactPC 或 ContactDefault 类型,这个才是群聊里的信息发送人,不是群聊或者自己是发送者没有这个字段) ''' updated_messages = [] # 用于存储修改后的消息列表 messages = msg_db.get_messages(chatroom_wxid) - for row in messages: message = list(row) if message[4] == 1: # 自己发送的就没必要解析了 @@ -120,6 +119,7 @@ class PackageMsg: updated_messages.append(message) continue if message[10] is None: # BytesExtra是空的跳过 + message.append(ContactDefault(wxid)) updated_messages.append(message) continue msgbytes = MessageBytesExtra() @@ -130,9 +130,14 @@ class PackageMsg: continue wxid = tmp.field2 if wxid == "": # 系统消息里面 wxid 不存在 + message.append(ContactDefault(wxid)) updated_messages.append(message) continue contact_info_list = micro_msg_db.get_contact_by_username(wxid) + if contact_info_list is None: # 群聊中已退群的联系人不会保存在数据库里 + message.append(ContactDefault(wxid)) + updated_messages.append(message) + continue contact_info = { 'UserName': contact_info_list[0], 'Alias': contact_info_list[1], @@ -145,7 +150,7 @@ class PackageMsg: contact.smallHeadImgBLOG = misc_db.get_avatar_buffer(contact.wxid) contact.set_avatar(contact.smallHeadImgBLOG) message.append(contact) - updated_messages.append(tuple(message)) + updated_messages.append(message) return updated_messages def get_chatroom_member_list(self, strtalker): @@ -175,4 +180,4 @@ class PackageMsg: if __name__ == "__main__": p = PackageMsg() - print(p.get_package_message_by_wxid("44326600419@chatroom")) + print(p.get_package_message_by_wxid("48615079469@chatroom")) diff --git a/app/person.py b/app/person.py index e1a49d2..dcd64a5 100644 --- a/app/person.py +++ b/app/person.py @@ -89,6 +89,40 @@ class ContactPC: self.avatar.save(save_path) print('保存头像', save_path) +class ContactDefault: + def __init__(self, wxid=""): + self.avatar = QPixmap(Icon.Default_avatar_path) + self.avatar_path = ':/icons/icons/default_avatar.svg' + self.wxid = wxid + self.remark = wxid + self.alias = wxid + self.nickName = wxid + self.smallHeadImgUrl = "" + self.smallHeadImgBLOG = b'' + self.is_chatroom = False + + def set_avatar(self, img_bytes): + if not img_bytes: + self.avatar.load(Icon.Default_avatar_path) + return + if img_bytes[:4] == b'\x89PNG': + self.avatar.loadFromData(img_bytes, format='PNG') + else: + self.avatar.loadFromData(img_bytes, format='jfif') + self.avatar.scaled(60, 60, Qt.IgnoreAspectRatio, Qt.SmoothTransformation) + + def save_avatar(self, path=None): + if not self.avatar: + return + if path: + save_path = path + else: + os.makedirs('./data/avatar', exist_ok=True) + save_path = os.path.join(f'data/avatar/', self.wxid + '.png') + self.avatar_path = save_path + self.avatar.save(save_path) + print('保存头像', save_path) + if __name__ == '__main__': p1 = MePC() diff --git a/app/util/emoji.py b/app/util/emoji.py index 31b63ba..ddafc5f 100644 --- a/app/util/emoji.py +++ b/app/util/emoji.py @@ -13,7 +13,7 @@ import traceback import xml.etree.ElementTree as ET import sqlite3 import threading - +from PyQt5.QtGui import QPixmap import requests from app.log import log, logger @@ -144,8 +144,6 @@ class Emotion: @log def download(url, output_dir, name, thumb=False): - if not url: - return ':/icons/icons/404.png' resp = requests.get(url) byte = resp.content image_format = get_image_format(byte[:8]) @@ -221,10 +219,16 @@ def get_emoji(xml_string, thumb=True, output_path=root_path) -> str: return output_path else: print("!!!未知表情包数据,信息:", xml_string, emoji_info, url) - return "" + output_path = os.path.join(output_path, '404.png') + if not os.path.exists(output_path): + QPixmap(':/icons/icons/404.png').save(output_path) + return output_path except: logger.error(traceback.format_exc()) - return "" + output_path = os.path.join(output_path, "404.png") + if not os.path.exists(output_path): + QPixmap(':/icons/icons/404.png').save(output_path) + return output_path if __name__ == '__main__':