155 lines
4.8 KiB
Python
155 lines
4.8 KiB
Python
![]() |
"""
|
|||
|
定义各种联系人
|
|||
|
"""
|
|||
|
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.original_remark = contact_info.get('Remark') # 保存原始备注名
|
|||
|
self.remark = self.original_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.original_remark = self.nickName
|
|||
|
self.display_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:未知,1:男,2:女
|
|||
|
}
|
|||
|
"""
|
|||
|
|
|||
|
|
|||
|
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)
|