diff --git a/wxpy/__init__.py b/wxpy/__init__.py index 38f795c..3a6f4e6 100644 --- a/wxpy/__init__.py +++ b/wxpy/__init__.py @@ -54,7 +54,7 @@ def reply_my_friend(msg): from .utils import dont_raise_response_error, embed, ensure_one, mutual_friends __title__ = 'wxpy' -__version__ = '0.3.3' +__version__ = '0.3.4' __author__ = 'Youfou' __license__ = 'MIT' __copyright__ = '2017, Youfou' diff --git a/wxpy/api/bot.py b/wxpy/api/bot.py index 46ee16c..22f8a17 100644 --- a/wxpy/api/bot.py +++ b/wxpy/api/bot.py @@ -10,8 +10,7 @@ import itchat from wxpy.api.chats import Chat, Chats, Friend, Group, MP, User -from wxpy.api.messages import Message, MessageConfig, Messages, Registered -from wxpy.api.messages import SYSTEM +from wxpy.api.messages import Message, MessageConfig, Messages, Registered, SYSTEM from wxpy.utils import enhance_connection, ensure_list, get_user_name, handle_response, wrap_user_name logger = logging.getLogger(__name__) @@ -64,7 +63,7 @@ def __init__( self.self = Friend(self.core.loginInfo['User'], self) self.file_helper = Chat(wrap_user_name('filehelper'), self) - self.messages = Messages(bot=self) + self.messages = Messages() self.registered = Registered(self) self.is_listening = False diff --git a/wxpy/api/chats/chat.py b/wxpy/api/chats/chat.py index 1caf856..9828857 100644 --- a/wxpy/api/chats/chat.py +++ b/wxpy/api/chats/chat.py @@ -203,7 +203,7 @@ def get_avatar(self, save_path=None): else: raise TypeError('expected `Friend`, `Group` or `Member`, got`{}`'.format(type(self))) - kwargs.update(picDir=save_path) + kwargs.update(dict(picDir=save_path)) return self.bot.core.get_head_img(**kwargs) diff --git a/wxpy/api/chats/group.py b/wxpy/api/chats/group.py index fcddd74..7f1ba28 100644 --- a/wxpy/api/chats/group.py +++ b/wxpy/api/chats/group.py @@ -28,8 +28,10 @@ def raw_member_list(update=False): return self.raw.get('MemberList', list()) ret = Chats(source=self) - for raw in raw_member_list() or raw_member_list(True): - ret.append(Member(raw, self)) + ret.extend(map( + lambda x: Member(x, self), + raw_member_list() or raw_member_list(True) + )) return ret def __contains__(self, user): diff --git a/wxpy/api/chats/member.py b/wxpy/api/chats/member.py index 31acf08..9556601 100644 --- a/wxpy/api/chats/member.py +++ b/wxpy/api/chats/member.py @@ -1,4 +1,5 @@ from .user import User +import weakref # Todo: 若尝试获取群成员信息时为空,自动更新成员信息 (并要照顾到遍历所有群成员的场景) @@ -11,7 +12,7 @@ class Member(User): def __init__(self, raw, group): super(Member, self).__init__(raw, group.bot) - self.group = group + self.group = weakref.proxy(group) @property def display_name(self): diff --git a/wxpy/api/messages/message.py b/wxpy/api/messages/message.py index 6c91844..a62c8bf 100644 --- a/wxpy/api/messages/message.py +++ b/wxpy/api/messages/message.py @@ -1,6 +1,7 @@ import html import os import tempfile +import weakref from datetime import datetime from xml.etree import ElementTree as ETree @@ -39,7 +40,7 @@ class Message(object): def __init__(self, raw, bot): self.raw = raw - self.bot = bot + self.bot = weakref.proxy(bot) self.type = self.raw.get('Type') self.is_at = self.raw.get('IsAt') or self.raw.get('isAt') diff --git a/wxpy/api/messages/message_config.py b/wxpy/api/messages/message_config.py index 4eacc19..5a6c406 100644 --- a/wxpy/api/messages/message_config.py +++ b/wxpy/api/messages/message_config.py @@ -1,4 +1,5 @@ import logging +import weakref from wxpy.utils import ensure_list @@ -15,7 +16,7 @@ def __init__( chats, msg_types, except_self, run_async, enabled ): - self.bot = bot + self.bot = weakref.proxy(bot) self.func = func self.chats = ensure_list(chats) diff --git a/wxpy/api/messages/messages.py b/wxpy/api/messages/messages.py index 0007412..4d5ef36 100644 --- a/wxpy/api/messages/messages.py +++ b/wxpy/api/messages/messages.py @@ -6,10 +6,9 @@ class Messages(list): 多条消息的合集,可用于记录或搜索 """ - def __init__(self, msg_list=None, bot=None, max_history=None): + def __init__(self, msg_list=None, max_history=None): if msg_list: super(Messages, self).__init__(msg_list) - self.bot = bot self.max_history = max_history def append(self, msg): @@ -33,4 +32,4 @@ def match(msg): return return True - return Messages(filter(match, self), bot=self.bot, max_history=self.max_history) + return Messages(filter(match, self), max_history=self.max_history) diff --git a/wxpy/api/messages/registered.py b/wxpy/api/messages/registered.py index be248e4..9923b21 100644 --- a/wxpy/api/messages/registered.py +++ b/wxpy/api/messages/registered.py @@ -1,3 +1,5 @@ +import weakref + from .message import SYSTEM @@ -9,7 +11,7 @@ def __init__(self, bot): :param bot: 所属的机器人 """ super(Registered, self).__init__() - self.bot = bot + self.bot = weakref.proxy(bot) def get_config(self, msg): """ diff --git a/wxpy/utils/misc.py b/wxpy/utils/misc.py index b8040f7..67e3dee 100644 --- a/wxpy/utils/misc.py +++ b/wxpy/utils/misc.py @@ -1,7 +1,7 @@ import inspect import re from functools import wraps - +import weakref from requests.adapters import HTTPAdapter from wxpy.exceptions import ResponseError @@ -48,7 +48,7 @@ def wrapped(*args, **kwargs): from wxpy.api.bot import Bot if isinstance(self, Bot): - bot = self + bot = weakref.proxy(self) else: bot = getattr(self, 'bot', None) if not bot: