WeChatMsg/app/person.py
2024-03-01 01:17:47 +08:00

153 lines
4.6 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
定义各种联系人
"""
import json
import os.path
import re
from typing import Dict
from PyQt5.QtGui import QPixmap
from app.config import INFO_FILE_PATH
from app.ui.Icon import Icon
def singleton(cls):
_instance = {}
def inner():
if cls not in _instance:
_instance[cls] = cls()
return _instance[cls]
return inner
class Person:
def __init__(self):
self.avatar_path = None
self.avatar = None
self.avatar_path_qt = Icon.Default_avatar_path
self.detail = {}
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')
def save_avatar(self, path=None):
if not self.avatar:
return
if path:
save_path = path
if os.path.exists(save_path):
self.avatar_path = save_path
return save_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
if not os.path.exists(save_path):
self.avatar.save(save_path)
print('保存头像', save_path)
@singleton
class Me(Person):
def __init__(self):
super().__init__()
self.avatar = QPixmap(Icon.Default_avatar_path)
self.avatar_path = ':/icons/icons/default_avatar.svg'
self.wxid = 'wxid_00112233'
self.wx_dir = ''
self.name = ''
self.mobile = ''
self.smallHeadImgUrl = ''
self.nickName = self.name
self.remark = self.nickName
self.token = ''
def save_info(self):
if os.path.exists(INFO_FILE_PATH):
with open(INFO_FILE_PATH, 'r', encoding='utf-8') as f:
info_data = json.loads(f.read())
info_data['name'] = self.name
info_data['mobile'] = self.mobile
with open(INFO_FILE_PATH, 'w', encoding='utf-8') as f:
json.dump(info_data, f, ensure_ascii=False, indent=4)
class Contact(Person):
def __init__(self, contact_info: Dict):
super().__init__()
self.wxid = contact_info.get('UserName')
self.remark = contact_info.get('Remark')
# Alias,Type,Remark,NickName,PYInitial,RemarkPYInitial,ContactHeadImgUrl.smallHeadImgUrl,ContactHeadImgUrl,bigHeadImgUrl
self.alias = contact_info.get('Alias')
self.nickName = contact_info.get('NickName')
if not self.remark:
self.remark = self.nickName
self.remark = re.sub(r'[\\/:*?"<>|\s\.]', '_', self.remark)
self.smallHeadImgUrl = contact_info.get('smallHeadImgUrl')
self.smallHeadImgBLOG = b''
self.avatar = QPixmap()
self.avatar_path = Icon.Default_avatar_path
self.is_chatroom = self.wxid.__contains__('@chatroom')
self.detail: Dict = contact_info.get('detail')
self.label_name = contact_info.get('label_name') # 联系人的标签分类
"""
detail存储了联系人的详细信息是个字典
{
'region': tuple[国家,省份,市], # 地区三元组
'signature': str, # 个性签名
'telephone': str, # 电话号码,自己写的备注才会显示
'gender': int, # 性别 0未知12
}
"""
class ContactDefault(Person):
def __init__(self, wxid=""):
super().__init__()
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
self.detail = {}
class Contacts:
def __init__(self):
self.contacts: Dict[str:Contact] = {}
def add(self, wxid, contact: Contact):
if wxid not in contact:
self.contacts[wxid] = contact
def get(self, wxid: str) -> Contact:
return self.contacts.get(wxid)
def remove(self, wxid: str):
return self.contacts.pop(wxid)
def save_avatar(self, avatar_dir: str = './data/avatar/'):
for wxid, contact in self.contacts.items():
avatar_path = os.path.join(avatar_dir, wxid + '.png')
if os.path.exists(avatar_path):
continue
contact.save_avatar(avatar_path)
if __name__ == '__main__':
p1 = Me()
p2 = Me()
print(p1 == p2)