def process_args(self, **kwargs): args = defaultdict(str) for k, v in kwargs.items(): if is_string(v): v = to_text(v) args[k] = v return args
class TextReply(WeChatReply): TEMPLATE = to_text( """ <xml> <ToUserName><![CDATA[{target}]]></ToUserName> <FromUserName><![CDATA[{source}]]></FromUserName> <CreateTime>{time}</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[{content}]]></Content> </xml> """ )
def __init__(self, message=None, **kwargs): print("replies.py __init__ target " + message.target) if message and "source" not in kwargs: kwargs["source"] = message.target if message and "target" not in kwargs: kwargs["target"] = message.source if 'time' not in kwargs: kwargs["time"] = int(time.time()) # if 'content' not in kwargs: # kwargs["content"] = "Hello, stranger." args = defaultdict(str) for k, v in kwargs.items(): if is_string(v): v = to_text(v) args[k] = v self.process_args(args) self._args = args
def add_filter(self, func, rules): """ 为 BaseRobot 添加一个 filter handler :param func: 如果 rules 通过,则处理该消息的 handler :param rules: 一个 list, 包含要匹配的字符串或者正则表达式 :return: """ if not callable(func): raise ValueError("{} is not callable".format(func)) if not isinstance(rules, list): raise ValueError("{} is not list".format(rules)) if len(rules) > 1: for x in rules: self.add_filter(func, [x]) else: target_content = rules[0] # 根据判断条件定义 _check_content() if isinstance(target_content, six.string_types): target_content = to_text(target_content) def _check_content(message): return message.content == target_content elif is_regex(target_content): def _check_content(message): return target_content.match(message.content) else: raise TypeError( "{} is not a valid rule.".format(target_content)) argc = len(signature(func).parameters.keys()) @self.text def _f(message, session=None): if _check_content(message): # 调用合适的 _check_content return func(*[message, session][:argc])
def __get__(self, instance, owner): v = get_value(instance, self.entry, self.default) if v is not None: return to_text(v) return v
def render(self): return to_text(self.TEMPLATE.format(**self._args))
def render(self): return to_text(self.__TEMPLATE__.format(**self.process_args(self.args)))