Spaces:
Sleeping
Sleeping
| 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 | |