Skip to content

Commit fd6236d

Browse files
committed
Add msg['User']
1 parent 834e638 commit fd6236d

File tree

7 files changed

+56
-23
lines changed

7 files changed

+56
-23
lines changed

itchat/components/hotreload.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
from ..config import VERSION
77
from ..returnvalues import ReturnValue
8+
from ..storage import templates
89
from .contact import update_local_chatrooms, update_local_friends
910
from .messages import produce_msg
1011

@@ -50,6 +51,8 @@ def load_login_status(self, fileDir,
5051
'ErrMsg': 'cached status ignored because of version',
5152
'Ret': -1005, }})
5253
self.loginInfo = j['loginInfo']
54+
self.loginInfo['User'] = templates.User(self.loginInfo['User'])
55+
self.loginInfo['User'].core = self
5356
self.s.cookies = requests.utils.cookiejar_from_dict(j['cookies'])
5457
self.storageClass.loads(j['storage'])
5558
msgList, contactList = self.get_msg()

itchat/components/login.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,7 @@ def maintain_loop():
248248
else:
249249
otherList.append(contact)
250250
chatroomMsg = update_local_chatrooms(self, chatroomList)
251+
chatroomMsg['User'] = self.loginInfo['User']
251252
self.msgList.put(chatroomMsg)
252253
update_local_friends(self, otherList)
253254
retryCount = 0

itchat/components/messages.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
from .. import config, utils
1010
from ..returnvalues import ReturnValue
11+
from ..storage import templates
1112
from .contact import update_local_uin
1213

1314
logger = logging.getLogger('itchat')
@@ -50,10 +51,29 @@ def produce_msg(core, msgList):
5051
rl = []
5152
srl = [40, 43, 50, 52, 53, 9999]
5253
for m in msgList:
54+
# get actual opposite
55+
if m['FromUserName'] == core.storageClass.userName:
56+
actualOpposite = m['ToUserName']
57+
else:
58+
actualOpposite = m['FromUserName']
59+
# produce basic message
5360
if '@@' in m['FromUserName'] or '@@' in m['ToUserName']:
5461
produce_group_chat(core, m)
5562
else:
5663
utils.msg_formatter(m, 'Content')
64+
# set user of msg
65+
if '@@' in actualOpposite:
66+
m['User'] = core.search_chatrooms(userName=actualOpposite) or \
67+
templates.Chatroom({'UserName': actualOpposite})
68+
# we don't need to update chatroom here because we have
69+
# updated once when producing basic message
70+
elif actualOpposite in ('filehelper', 'fmessage'):
71+
m['User'] = templates.MassivePlatform({'UserName': actualOpposite})
72+
else:
73+
m['User'] = core.search_mps(userName=actualOpposite) or \
74+
core.search_friends(userName=actualOpposite) or \
75+
templates.User(userName=actualOpposite)
76+
# by default we think there may be a user missing not a mp
5777
if m['MsgType'] == 1: # words
5878
if m['Url']:
5979
regx = r'(.+?\(.+?\))'

itchat/components/register.py

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
from ..log import set_logging
88
from ..utils import test_connect
9+
from ..storage import templates
910

1011
logger = logging.getLogger('itchat')
1112

@@ -46,19 +47,12 @@ def configured_reply(self):
4647
except Queue.Empty:
4748
pass
4849
else:
49-
if msg['FromUserName'] == self.storageClass.userName:
50-
actualOpposite = msg['ToUserName']
51-
else:
52-
actualOpposite = msg['FromUserName']
53-
if '@@' in actualOpposite:
54-
replyFn = self.functionDict['GroupChat'].get(msg['Type'])
55-
elif self.search_mps(userName=msg['FromUserName']):
56-
replyFn = self.functionDict['MpChat'].get(msg['Type'])
57-
elif '@' in actualOpposite or \
58-
actualOpposite in ('filehelper', 'fmessage'):
50+
if isinstance(msg['User'], templates.User):
5951
replyFn = self.functionDict['FriendChat'].get(msg['Type'])
60-
else:
52+
elif isinstance(msg['User'], templates.MassivePlatform):
6153
replyFn = self.functionDict['MpChat'].get(msg['Type'])
54+
elif isinstance(msg['User'], templates.Chatroom):
55+
replyFn = self.functionDict['GroupChat'].get(msg['Type'])
6256
if replyFn is None:
6357
r = None
6458
else:

itchat/storage/__init__.py

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,8 @@ def dumps(self):
4040
'chatroomList' : self.chatroomList,
4141
'lastInputUserName' : self.lastInputUserName, }
4242
def loads(self, j):
43-
self.userName = j.get('userName', None)
44-
self.nickName = j.get('nickName', None)
43+
self.userName = j.get('userName', None)
44+
self.nickName = j.get('nickName', None)
4545
del self.memberList[:]
4646
for i in j.get('memberList', []):
4747
self.memberList.append(i)
@@ -88,19 +88,23 @@ def search_chatrooms(self, name=None, userName=None):
8888
with self.updateLock:
8989
if userName is not None:
9090
for m in self.chatroomList:
91-
if m['UserName'] == userName: return copy.deepcopy(m)
91+
if m['UserName'] == userName:
92+
return copy.deepcopy(m)
9293
elif name is not None:
9394
matchList = []
9495
for m in self.chatroomList:
95-
if name in m['NickName']: matchList.append(copy.deepcopy(m))
96+
if name in m['NickName']:
97+
matchList.append(copy.deepcopy(m))
9698
return matchList
9799
def search_mps(self, name=None, userName=None):
98100
with self.updateLock:
99101
if userName is not None:
100102
for m in self.mpList:
101-
if m['UserName'] == userName: return copy.deepcopy(m)
103+
if m['UserName'] == userName:
104+
return copy.deepcopy(m)
102105
elif name is not None:
103106
matchList = []
104107
for m in self.mpList:
105-
if name in m['NickName']: matchList.append(copy.deepcopy(m))
108+
if name in m['NickName']:
109+
matchList.append(copy.deepcopy(m))
106110
return matchList

itchat/storage/templates.py

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ def append(self, value):
2929
contact = self.contactClass(value)
3030
contact.core = self.core
3131
if self.contactInitFn is not None:
32-
contact = self.contactInitFn(contact)
32+
contact = self.contactInitFn(contact) or contact
3333
super(ContactList, self).append(contact)
3434
def __deepcopy__(self, memo):
3535
return self.__class__([copy.deepcopy(v) for v in self])
@@ -38,6 +38,11 @@ def __getstate__(self):
3838
def __setstate__(self, state):
3939
for v in state:
4040
super(ContactList, self).append(pickle.loads(v))
41+
def __str__(self):
42+
return '[%s]' % ', '.join([repr(v) for v in self])
43+
def __repr__(self):
44+
return '<%s: %s>' % (self.__class__.__name__.split('.')[-1],
45+
self.__str__())
4146

4247
fakeContactList = ContactList
4348

@@ -99,16 +104,22 @@ def __getattr__(self, value):
99104
value = value[0].upper() + value[1:]
100105
return self.get(value, '')
101106
def __deepcopy__(self, memo):
102-
r = self.__class__([
103-
(copy.deepcopy(k, memo), copy.deepcopy(v, memo))
104-
for k, v in self.items()])
107+
r = self.__class__({
108+
copy.deepcopy(k, memo): copy.deepcopy(v, memo)
109+
for k, v in self.items()})
105110
r.core = self.core
106111
return r
107112
def __getstate__(self):
108113
return dict(self)
109114
def __setstate__(self, state):
110115
for k, v in state.items():
111116
self[k] = v
117+
def __str__(self):
118+
return '{%s}' % ', '.join(
119+
['%s: %s' % (repr(k),repr(v)) for k,v in self.items()])
120+
def __repr__(self):
121+
return '<%s: %s>' % (self.__class__.__name__.split('.')[-1],
122+
self.__str__())
112123

113124
class User(AbstractUserDict):
114125
def __init__(self, *args, **kwargs):
@@ -128,7 +139,6 @@ def __deepcopy__(self, memo):
128139
r.verifyDict = copy.deepcopy(self.verifyDict)
129140
return r
130141

131-
132142
class MassivePlatform(AbstractUserDict):
133143
def __init__(self, *args, **kwargs):
134144
super(MassivePlatform, self).__init__(*args, **kwargs)

itchat/utils.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,8 @@ def search_dict_list(l, key, value):
106106
''' Search a list of dict
107107
* return dict with specific value & key '''
108108
for i in l:
109-
if i.get(key) == value: return i
109+
if i.get(key) == value:
110+
return i
110111

111112
def print_line(msg, oneLine = False):
112113
if oneLine:

0 commit comments

Comments
 (0)