mirror of
https://github.com/zhayujie/chatgpt-on-wechat.git
synced 2026-02-07 00:22:25 +08:00
118 lines
4.9 KiB
Python
118 lines
4.9 KiB
Python
import os, time, copy
|
|
from threading import Lock
|
|
|
|
from .messagequeue import Queue
|
|
from .templates import (
|
|
ContactList, AbstractUserDict, User,
|
|
MassivePlatform, Chatroom, ChatroomMember)
|
|
|
|
def contact_change(fn):
|
|
def _contact_change(core, *args, **kwargs):
|
|
with core.storageClass.updateLock:
|
|
return fn(core, *args, **kwargs)
|
|
return _contact_change
|
|
|
|
class Storage(object):
|
|
def __init__(self, core):
|
|
self.userName = None
|
|
self.nickName = None
|
|
self.updateLock = Lock()
|
|
self.memberList = ContactList()
|
|
self.mpList = ContactList()
|
|
self.chatroomList = ContactList()
|
|
self.msgList = Queue(-1)
|
|
self.lastInputUserName = None
|
|
self.memberList.set_default_value(contactClass=User)
|
|
self.memberList.core = core
|
|
self.mpList.set_default_value(contactClass=MassivePlatform)
|
|
self.mpList.core = core
|
|
self.chatroomList.set_default_value(contactClass=Chatroom)
|
|
self.chatroomList.core = core
|
|
def dumps(self):
|
|
return {
|
|
'userName' : self.userName,
|
|
'nickName' : self.nickName,
|
|
'memberList' : self.memberList,
|
|
'mpList' : self.mpList,
|
|
'chatroomList' : self.chatroomList,
|
|
'lastInputUserName' : self.lastInputUserName, }
|
|
def loads(self, j):
|
|
self.userName = j.get('userName', None)
|
|
self.nickName = j.get('nickName', None)
|
|
del self.memberList[:]
|
|
for i in j.get('memberList', []):
|
|
self.memberList.append(i)
|
|
del self.mpList[:]
|
|
for i in j.get('mpList', []):
|
|
self.mpList.append(i)
|
|
del self.chatroomList[:]
|
|
for i in j.get('chatroomList', []):
|
|
self.chatroomList.append(i)
|
|
# I tried to solve everything in pickle
|
|
# but this way is easier and more storage-saving
|
|
for chatroom in self.chatroomList:
|
|
if 'MemberList' in chatroom:
|
|
for member in chatroom['MemberList']:
|
|
member.core = chatroom.core
|
|
member.chatroom = chatroom
|
|
if 'Self' in chatroom:
|
|
chatroom['Self'].core = chatroom.core
|
|
chatroom['Self'].chatroom = chatroom
|
|
self.lastInputUserName = j.get('lastInputUserName', None)
|
|
def search_friends(self, name=None, userName=None, remarkName=None, nickName=None,
|
|
wechatAccount=None):
|
|
with self.updateLock:
|
|
if (name or userName or remarkName or nickName or wechatAccount) is None:
|
|
return copy.deepcopy(self.memberList[0]) # my own account
|
|
elif userName: # return the only userName match
|
|
for m in self.memberList:
|
|
if m['UserName'] == userName:
|
|
return copy.deepcopy(m)
|
|
else:
|
|
matchDict = {
|
|
'RemarkName' : remarkName,
|
|
'NickName' : nickName,
|
|
'Alias' : wechatAccount, }
|
|
for k in ('RemarkName', 'NickName', 'Alias'):
|
|
if matchDict[k] is None:
|
|
del matchDict[k]
|
|
if name: # select based on name
|
|
contact = []
|
|
for m in self.memberList:
|
|
if any([m.get(k) == name for k in ('RemarkName', 'NickName', 'Alias')]):
|
|
contact.append(m)
|
|
else:
|
|
contact = self.memberList[:]
|
|
if matchDict: # select again based on matchDict
|
|
friendList = []
|
|
for m in contact:
|
|
if all([m.get(k) == v for k, v in matchDict.items()]):
|
|
friendList.append(m)
|
|
return copy.deepcopy(friendList)
|
|
else:
|
|
return copy.deepcopy(contact)
|
|
def search_chatrooms(self, name=None, userName=None):
|
|
with self.updateLock:
|
|
if userName is not None:
|
|
for m in self.chatroomList:
|
|
if m['UserName'] == userName:
|
|
return copy.deepcopy(m)
|
|
elif name is not None:
|
|
matchList = []
|
|
for m in self.chatroomList:
|
|
if name in m['NickName']:
|
|
matchList.append(copy.deepcopy(m))
|
|
return matchList
|
|
def search_mps(self, name=None, userName=None):
|
|
with self.updateLock:
|
|
if userName is not None:
|
|
for m in self.mpList:
|
|
if m['UserName'] == userName:
|
|
return copy.deepcopy(m)
|
|
elif name is not None:
|
|
matchList = []
|
|
for m in self.mpList:
|
|
if name in m['NickName']:
|
|
matchList.append(copy.deepcopy(m))
|
|
return matchList
|