Spaces:
Runtime error
Runtime error
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 | |