11import logging , copy , pickle
22
33from ..returnvalues import ReturnValue
4+ from ..utils import update_info_dict
45
56logger = logging .getLogger ('itchat' )
67
@@ -17,9 +18,7 @@ class ContactList(list):
1718 '''
1819 def __init__ (self , * args , ** kwargs ):
1920 super (ContactList , self ).__init__ (* args , ** kwargs )
20- self .contactInitFn = None
21- self .contactClass = User
22- self .core = fakeItchat
21+ self .__setstate__ (None )
2322 def set_default_value (self , initFunction = None , contactClass = None ):
2423 if hasattr (initFunction , '__call__' ):
2524 self .contactInitFn = initFunction
@@ -32,12 +31,17 @@ def append(self, value):
3231 contact = self .contactInitFn (contact ) or contact
3332 super (ContactList , self ).append (contact )
3433 def __deepcopy__ (self , memo ):
35- return self .__class__ ([copy .deepcopy (v ) for v in self ])
34+ r = self .__class__ ([copy .deepcopy (v ) for v in self ])
35+ r .contactInitFn = self .contactInitFn
36+ r .contactClass = self .contactClass
37+ r .core = self .core
38+ return r
3639 def __getstate__ (self ):
37- return [ pickle . dumps ( v ) for v in self ]
40+ return 1
3841 def __setstate__ (self , state ):
39- for v in state :
40- super (ContactList , self ).append (pickle .loads (v ))
42+ self .contactInitFn = None
43+ self .contactClass = User
44+ self .core = fakeItchat
4145 def __str__ (self ):
4246 return '[%s]' % ', ' .join ([repr (v ) for v in self ])
4347 def __repr__ (self ):
@@ -49,7 +53,7 @@ def __repr__(self):
4953class AbstractUserDict (dict ):
5054 def __init__ (self , * args , ** kwargs ):
5155 super (AbstractUserDict , self ).__init__ (* args , ** kwargs )
52- self .core = fakeItchat
56+ self .__setstate__ ( None )
5357 def update (self ):
5458 return ReturnValue ({'BaseResponse' : {
5559 'Ret' : - 1006 ,
@@ -104,30 +108,31 @@ def __getattr__(self, value):
104108 value = value [0 ].upper () + value [1 :]
105109 return self .get (value , '' )
106110 def __deepcopy__ (self , memo ):
107- r = self .__class__ ({
108- copy . deepcopy ( k , memo ): copy . deepcopy ( v , memo )
109- for k , v in self . items ()} )
111+ r = self .__class__ ()
112+ for k , v in self . items ():
113+ r [ copy . deepcopy ( k )] = copy . deepcopy ( v )
110114 r .core = self .core
111115 return r
112- def __getstate__ (self ):
113- return dict (self )
114- def __setstate__ (self , state ):
115- for k , v in state .items ():
116- self [k ] = v
117116 def __str__ (self ):
118117 return '{%s}' % ', ' .join (
119118 ['%s: %s' % (repr (k ),repr (v )) for k ,v in self .items ()])
120119 def __repr__ (self ):
121120 return '<%s: %s>' % (self .__class__ .__name__ .split ('.' )[- 1 ],
122121 self .__str__ ())
122+ def __getstate__ (self ):
123+ return 1
124+ def __setstate__ (self , state ):
125+ self .core = fakeItchat
123126
124127class User (AbstractUserDict ):
125128 def __init__ (self , * args , ** kwargs ):
126129 super (User , self ).__init__ (* args , ** kwargs )
127- self .verifyDict = {}
128- self .memberList = fakeContactList
130+ self .__setstate__ (None )
129131 def update (self ):
130- return self .core .update_friend (self .userName )
132+ r = self .core .update_friend (self .userName )
133+ if r :
134+ update_info_dict (self , r )
135+ return r
131136 def set_alias (self , alias ):
132137 return self .core .set_alias (self .userName , alias )
133138 def set_pinned (self , isPinned = True ):
@@ -138,10 +143,17 @@ def __deepcopy__(self, memo):
138143 r = super (User , self ).__deepcopy__ (memo )
139144 r .verifyDict = copy .deepcopy (self .verifyDict )
140145 return r
146+ def __setstate__ (self , state ):
147+ super (User , self ).__setstate__ (state )
148+ self .verifyDict = {}
149+ self .memberList = fakeContactList
141150
142151class MassivePlatform (AbstractUserDict ):
143152 def __init__ (self , * args , ** kwargs ):
144153 super (MassivePlatform , self ).__init__ (* args , ** kwargs )
154+ self .__setstate__ (None )
155+ def __setstate__ (self , state ):
156+ super (MassivePlatform , self ).__setstate__ (state )
145157 self .memberList = fakeContactList
146158
147159class Chatroom (AbstractUserDict ):
@@ -151,11 +163,21 @@ def __init__(self, *args, **kwargs):
151163 def init_fn (d ):
152164 d .chatroom = self
153165 memberList .set_default_value (init_fn , ChatroomMember )
154- for rawMember in self .memberList :
155- memberList .append (rawMember )
156- self ['MemberList' ] = memberList
166+ if 'MemberList' in self :
167+ if not isinstance (self .memberList , ContactList ):
168+ for member in self .memberList :
169+ memberList .append (member )
170+ self ['MemberList' ] = memberList
171+ else :
172+ for member in self .memberList :
173+ memberList .append (member )
174+ self ['MemberList' ] = memberList
157175 def update (self , detailedMember = False ):
158- return self .core .update_chatroom (self .userName , detailedMember )
176+ r = self .core .update_chatroom (self .userName , detailedMember )
177+ if r :
178+ update_info_dict (self , r )
179+ self ['MemberList' ] = r ['MemberList' ]
180+ return r
159181 def set_alias (self , alias ):
160182 return self .core .set_chatroom_name (self .userName , alias )
161183 def set_pinned (self , isPinned = True ):
@@ -200,8 +222,7 @@ def search_member(self, name=None, userName=None, remarkName=None, nickName=None
200222class ChatroomMember (AbstractUserDict ):
201223 def __init__ (self , * args , ** kwargs ):
202224 super (AbstractUserDict , self ).__init__ (* args , ** kwargs )
203- self .core = fakeItchat
204- self .chatroom = self .fakeChatroom
225+ self .__setstate__ (None )
205226 def get_head_image (self , imageDir = None ):
206227 return self .core .get_head_img (self .userName , self .chatroom .userName , picDir = imageDir )
207228 def delete_member (self , userName ):
@@ -240,6 +261,9 @@ def __deepcopy__(self, memo):
240261 r = super (ChatroomMember , self ).__deepcopy__ (memo )
241262 r .core = self .core
242263 return r
264+ def __setstate__ (self , state ):
265+ super (ChatroomMember , self ).__setstate__ (state )
266+ self .chatroom = self .fakeChatroom
243267
244268ChatroomMember .fakeChatroom = Chatroom ()
245269
0 commit comments