Esempio n. 1
0
    async def handle(self, msg: Message):
        self._counter += 1
        log.error('%s: received %s messages' %
                  (datetime.datetime.now(), self._counter))
        me = self._bot.Contact.load('paulhybryant')
        text = msg.text()
        mention_self = await msg.mention_self()
        mention_text = await msg.mention_text()
        self._db.set(msg.talker().name, msg.talker().get_id())
        if msg.room():
            topic = await msg.room().topic()
            log.error('room: %s, topic %s' % (msg.room().room_id, topic))
            log.error('Message: %s, Contact: %s, Name: %s' %
                      (msg, msg.talker(), msg.talker().name))
            forward = self.handle_room(topic, text, mention_self, mention_text,
                                       msg.room().room_id, msg.type(),
                                       msg.talker())
            self._db.set(topic, msg.room().room_id)
            if forward:
                await me.say('来自群: %s,联系人: %s' % (topic, msg.talker().name))
                if msg.type() == MessageType.MESSAGE_TYPE_ATTACHMENT:
                    filebox = await msg.to_file_box()
                    await me.say(filebox)
                else:
                    await msg.forward(me)
        else:
            log.error('Message: %s, Contact: %s, Name: %s' %
                      (msg, msg.talker(), msg.talker().name))
            result = self.handle_cmd(text)
            if result:
                log.error(result)
                await msg.say(result)

            if msg.talker().get_id() in [
                    'wxid_p7xyfpcx7aoa12', 'wxid_5av5yw0udmgp12',
                    'wxid_lbvhcdjlgg0a21'
            ] and msg.type() == MessageType.MESSAGE_TYPE_ATTACHMENT:
                filebox = await msg.to_file_box()
                doc_re = re.compile(r'(.*)\.docx?')
                m = doc_re.match(filebox.name)
                if m:
                    if self._db.get('doc2pdf'):
                        f = '/tmp/%s' % filebox.name
                        await filebox.to_file(f, True)
                        converted, error = self.doc2pdf(f, m.group(1))
                        if converted:
                            pdf = filebox.from_file(converted)
                            await me.say(pdf)

            if msg.type() == MessageType.MESSAGE_TYPE_URL:
                talker = msg.talker()
                if talker.name in self._subscriptions:
                    await me.say('来自公众号: %s' % talker.name)
                    await msg.forward(me)
Esempio n. 2
0
 async def on_message(self, msg: Message):
     """listen message event"""
     self_contact = await self.my_self()
     from_contact = msg.talker()
     log.info('below are dict of message: ')
     log.info(str(msg.__dict__))
     quoted, text, mention = split_quote_and_mention(msg.text())
     log.info('finish spliting')
     log.info(f'quoted: {quoted}, text: {text}, mention: {mention}')
     room = msg.room()
     to_bot = self_contact.get_id() in msg.payload.mention_ids or\
              self_contact.get_id() == msg.payload.to_id or\
              self_contact.payload.name == mention
     conversation: Union[
         Room, Contact] = from_contact if room is None else room
     await conversation.ready()
     log.info(f'finish preprocess, talker: {from_contact.get_id()}, to_bot: {to_bot}')
     try:
         if self.tag_controller.handle_msg(quoted, text, from_contact.get_id(), to_bot):
             log.info('tag controller found reply')
             await conversation.say(self.tag_controller.get_reply())
         elif self.question_answering.handle_msg(text, to_bot):
             log.info('question answering found reply')
             await conversation.say(self.question_answering.get_reply())
         elif self.display.handle_msg(text, to_bot):
             log.info('display found reply')
             await conversation.say(self.display.get_reply())
     except Exception as error:
         log.info(f'something went wrong for tagging plugin: {error}')
Esempio n. 3
0
 async def on_message(self, msg: Message):
     """
     Message Handler for the Bot
     """
     contact = msg.talker()  # 发消息人
     content = msg.text()  # 消息内容
     room = msg.room()  # 是否是群消息
     contact_name = contact.name
     if room:  # 群聊入口,未做任何处理
         if room.room_id == config_list['room_id'] and (
                 msg.type() == Message.Type.MESSAGE_TYPE_TEXT):
             print('群聊')
             room_id = room.room_id
             print('群名:{},发消息人:{},内容:{}'.format(room_id, contact_name,
                                                content))
             print('使用API发送群消息')
     else:
         dividing_line()
         print('非群聊')
         if msg.type() == Message.Type.MESSAGE_TYPE_TEXT:  # 处理文本类型消息
             if content == 'ding':
                 await sendTextMsgToContact(contact=contact,
                                            text="这是自动回复: dong dong dong")
             elif content == 'hi' or content == '你好' or content == "帮助":
                 info0 = "我是机器人助手--懂懂,很高兴为您服务!\n"
                 info1 = "1.收到'ding',自动回复\n"
                 info2 = "2.收到'帮助',自动回复\n"
                 info3 = "3.收到'小程序'or'微信小程序',自动回复\n"
                 info4 = "4.收到'情话@your_content',自动回复,例如 情话@春天\n"
                 info5 = "5.收到'藏头诗@your_content',自动回复,例如 藏头诗@我喜欢你\n"
                 info6 = "6.收到'city+天气',自动回复,例如 长沙天气\n"
                 help_info = info0 + info1 + info2 + info3 + info4 + info5 + info6
                 await sendTextMsgToContact(contact=contact, text=help_info)
             elif content == '小程序' or content == "微信小程序":
                 file_url = 'https://upload-images.jianshu.io/upload_images/10519098-690ae0fde75147a1.png' \
                            '?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240'
                 await sendMediaMsgToContact(contact=contact,
                                             fileUrl=file_url,
                                             filePath='')
             elif '天气' in content:
                 city_name = content[:-2]
                 weather_info = get_weather_data(city_name)
                 await contact.say(weather_info)
             elif "情话" in content:
                 content = content[3:]
                 res = chat_bot(content=content, mode='1')
                 await contact.say(res)
             elif "藏头诗" in content:
                 # 藏头诗模式
                 content = content[4:]
                 res = chat_bot(content=content, mode='2')
                 await contact.say(res)
             else:
                 res = chat_bot(content=content, mode='0')
                 await contact.say(res)
         #  处理图片类型消息
         elif msg.type() == Message.Type.MESSAGE_TYPE_IMAGE:
             dividing_line()
             await contact.say(
                 '不好意思,暂时处理不了图片类型消息,我们已经在催程序员小哥哥日夜加班优化项目了!希望您能够理解!')
Esempio n. 4
0
    async def on_message(self, msg: Message):
        """listen message event"""
        from_contact = msg.talker()
        text = msg.text()
        room = msg.room()

        if room is None:
            return

        if text in ['#ding', 'dong']:
            if room.room_id not in self.room_data:
                self.room_data[room.room_id] = {'__status__': 'running'}
                await self.re_init_job(room.room_id)
        if text == '#ding':
            self.room_data[room.room_id]['__ding__'] = True

        if text == '#ding start':
            self.room_data[room.room_id] = {'__status__': 'running'}
            await room.say('#ding')
            await self.re_init_job(room.room_id)

        if text == 'dong':
            if room.room_id in self.room_data:
                self.room_data[room.room_id][from_contact.contact_id] = {
                    'id': from_contact.contact_id,
                    'time': datetime.now(),
                    'name': from_contact.name,
                }
                # refresh the scheduler job
                await self.re_init_job(room.room_id)
    async def on_message(self, msg: Message):
        """listen message event"""
        talker = msg.talker()
        room = msg.room()

        conversation_id = room.room_id if room else talker.contact_id

        # 1. TODO: use finder to match Room/Contact
        if conversation_id not in self.conversation_ids:
            return

        # only process the plain text message
        if msg.type() != MessageType.MESSAGE_TYPE_TEXT:
            return

        rasa_response = requests.post(
            self.endpoint,
            json=dict(
                sender=conversation_id,
                message=msg.text()
            )
        )
        messages: List[dict] = rasa_response.json()
        if len(messages) == 0:
            return

        conversational: Union[Room, Contact] = room if room else talker
        for message in messages:
            msg_text = message.get('text', None)
            if not msg_text:
                continue
            await conversational.say(msg_text)
Esempio n. 6
0
async def on_message(msg: Message):

    who = msg.talker()  # 发消息的人

    #设置好微信名,只要是他发的消息就回复
    if who.name == 'TTZO':
        #输入,翻译,模型输出,翻译,发送
        tf = fanyi(text, 'zh-CHS2en')
        robott = module.generate(list(tf))
        returns = fanyi(robott[0], 'en2zh-CHS')
        await msg.say(returns)
Esempio n. 7
0
    async def on_message(self, msg: Message):
        """listen message event"""
        self_contact = await self.my_self()
        from_contact = msg.talker()
        quoted, text, mention = split_quote_and_mention(msg.text())
        room = msg.room()
        to_bot = self_contact.get_id() in msg.payload.mention_ids or\
                 self_contact.get_id() == msg.payload.to_id or\
                 self_contact.payload.name == mention
        conversation: Union[Room,
                            Contact] = from_contact if room is None else room
        await conversation.ready()

        if isinstance(conversation, Contact):
            if not to_bot:
                return
            if self.language == 'zh':
                # await conversation.say('成员管理功能必须在群聊中使用')
                pass
            else:
                await conversation.say('Not work if not in chat room')
            return
        member_count = len(await conversation.member_list())
        # real people >= 4, 3 thumbsdown needed, 3 => 2, 2 => 1
        counts_limit = 3 if member_count > 4 else member_count // 2
        if text.strip() == self.thumbsdown:
            time_delta = datetime.now() - self.date[mention]
            if self.counts[mention] != 0 and time_delta > timedelta(hours=12):
                self.counts[mention] = 0  # former thumbsdown expired
            self.counts[mention] = self.counts[mention] + 1
            self.date[mention] = datetime.now()

            if self.language == 'zh':
                await conversation.say(
                    f'成员{mention}目前已经被踩{self.counts[mention]}次,'
                    f'被踩{counts_limit}次的成员将被移出群聊')
            else:
                await conversation.say(
                    f'thumbsdown of {mention} is currently {self.counts[mention]}, '
                    f'member with thumbsdown to {counts_limit} '
                    'will be removed from chat')
            if self.counts[mention] >= counts_limit:
                removed_contact = Contact.load(msg.payload.mention_ids[0])
                await removed_contact.ready()
                await conversation.delete(removed_contact)

                if self.language == 'zh':
                    await conversation.say(f'{removed_contact.name}已被移出群聊')
                else:
                    await conversation.say(
                        f'{removed_contact.name} is removed from chat')
        print(msg.__dict__)
 async def on_message(self, msg: Message):
     """listen message event"""
     from_contact = msg.talker()
     text = msg.text()
     room = msg.room()
     if text == '#ding':
         conversation: Union[
             Room, Contact] = from_contact if room is None else room
         conversation_id = from_contact.contact_id if room is None \
             else room.room_id
         if self.can_send_dong(conversation_id):
             await conversation.ready()
             await conversation.say('dong')
Esempio n. 9
0
 async def on_message(self, msg: Message):
     if msg.age() > 3 * 60:
         log.info(
             'Bot' + 'on(message) skip age("%d") > 3 * 60 seconds: "%s"',
             msg.age(), msg)
         return
     room = msg.room()
     talker = msg.talker()
     text = msg.text()
     if not talker:
         return
     if msg.is_self():
         return
     if re.search('^ding$', text):
         if room:
             if re.search('^ding', await room.topic()):
                 await get_out_room(talker, room)
         else:
             try:
                 dingRoom = await self.Room.find('^ding')
                 if dingRoom:
                     log.info('Bot' + 'onMessage: got dingRoom: "%s"' %
                              await dingRoom.topic())
                     if await dingRoom.has(talker):
                         topic = await dingRoom.topic()
                         log.info(
                             'Bot' +
                             'onMessage: sender has already in dingRoom')
                         await dingRoom.say(
                             'I found you have joined in room "{0}"!'.
                             format(topic), talker)
                         await talker.say(
                             'no need to ding again, because you are already in room: "{}"'
                             .format(topic))
                     else:
                         log.info(
                             'Bot' +
                             'onMessage: add sender("%s") to dingRoom("%s")'
                             % (talker.name, dingRoom.topic()))
                         await talker.say('ok, I will put you in ding room!'
                                          )
                         await put_in_room(talker, dingRoom)
                 else:
                     log.info(
                         'Bot' +
                         'onMessage: dingRoom not found, try to create one')
                     newRoom = await create_ding_room(self, talker)
                     print('create_ding_room id:', newRoom.id)
                     await manage_ding_room(self)
             except Exception as e:
                 log.exception(e)
 async def on_message(self, msg: Message):
     """listen message event"""
     from_contact = msg.talker()
     text = msg.text()
     room = msg.room()
     if text == '#ding':
         conversation: Union[
             Room, Contact] = from_contact if room is None else room
         await conversation.ready()
         await conversation.say('dong')
         file_box = FileBox.from_url(
             'https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/'
             'u=1116676390,2305043183&fm=26&gp=0.jpg',
             name='ding-dong.jpg')
         await conversation.say(file_box)
Esempio n. 11
0
 async def on_message(self, msg: Message):
     """listen message event"""
     from_contact = msg.talker()
     text = msg.text()
     room = msg.room()
     if text == '今天天气如何':
         conversation: Union[
             Room, Contact] = from_contact if room is None else room
         await conversation.ready()
         response = requests.get('https://tianqiapi.com/api?version=v61&'
                                 'appid=32896971&appsecret=5bR8Gs9x')
         result = response.json()
         result_msg = f'今天{result["wea"]} 最低温度{result["tem2"]}度 ' \
                      f'最高温度{result["tem1"]}度'
         await conversation.say(result_msg)
    async def on_message(self, msg: Message):
        """check the keyword and reply to talker"""

        conversation: Union[
            Room, Contact] = msg.room() if msg.room() else msg.talker()
        await conversation.ready()

        text = msg.text()

        # find the match rules
        for matcher, rules in self.rule_map.items():
            is_match = await matcher.match(conversation)

            if is_match:
                for rule in rules:
                    if rule.keyword == text:
                        await conversation.say(rule.reply_content)
Esempio n. 13
0
    async def on_message(self, msg: Message):
        if msg.age() > 3 * 60:
            log.info(
                'Bot' + 'on(message) skip age("%d") > 3 * 60 seconds: "%s"',
                msg.age(), msg)
            return
        room = msg.room()
        talker = msg.talker()
        text = msg.text()
        if not talker:
            return
        if msg.is_self():
            return

        if re.search('^market$', text):
            if room:
                if re.search(TOPIC_NAME, await room.topic()):
                    await get_out_room(talker, room)
            else:
                try:
                    marketRoom = await self.Room.find(TOPIC_NAME)
                    if marketRoom:
                        log.info('Bot' + 'onMessage: got marketRoom: "%s"' %
                                 await marketRoom.topic())
                        if await marketRoom.has(talker):
                            topic = await marketRoom.topic()
                            log.info(
                                'Bot' +
                                'onMessage: sender has already in marketRoom')
                            await talker.say("已加入群组{}".format(topic))
                        else:
                            log.info(
                                'Bot' +
                                'onMessage: add sender("%s") to marketRoom("%s")'
                                % (talker.name, marketRoom.topic()))
                            await talker.say("邀请加入群组")
                            await put_in_room(talker, marketRoom)
                    else:
                        log.info(
                            'Bot' +
                            'onMessage: marketRoom not found, try to create one'
                        )
                        await create_market_room(self, talker)
                        await manage_market_room(self)
                except Exception as e:
                    log.exception(e)
Esempio n. 14
0
 async def on_message(self, msg: Message):
     """listen message event"""
     self_contact = await self.my_self()
     from_contact = msg.talker()
     quoted, text, mention = split_quote_and_mention(msg.text())
     room = msg.room()
     to_bot = self_contact.get_id() in msg.payload.mention_ids or\
              self_contact.get_id() == msg.payload.to_id or\
              self_contact.payload.name == mention
     conversation: Union[Room,
                         Contact] = from_contact if room is None else room
     await conversation.ready()
     try:
         if self.help.handle_msg(text, to_bot):
             log.info('help system found reply')
             await conversation.say(self.help.get_reply())
     except Exception as error:
         log.info(f'something went wrong for help system plugin: {error}')
Esempio n. 15
0
 async def on_message(self, msg: Message):
     user = msg.talker()
     text = msg.text()
     if Judge.is_ask_self_weight(text):
         msg_ = await Search.search_weight(user)
         await msg.say(msg_)
     if Judge.is_ask_self_login(text):
         user = await Search.create_self(user)
         if user:
             await msg.say('成功,欢迎🥳{}'.format(user.name))
     if Judge.is_ask_tag_weight(text):
         text = text.replace(':', ':')
         text = text.split(':')
         msg_ = await Search.update_weight(user, tag_weight=float(text[-1]))
         await msg.say(msg_)
     if Judge.is_ask_present_weight(text):
         text = text.replace(':', ':')
         text = text.split(':')
         msg_ = await Search.update_weight(user,
                                           present_weight=float(text[-1]))
         await msg.say(msg_)
     if Judge.is_ask_me(text):
         await msg.say('我在')
     if Judge.is_ask_weather(text):
         text = text.replace("天气", '')
         URL2 = 'https://geoapi.qweather.com/v2/city/lookup?location={}&key=86bae3f81a9c4af9ae7187b23250dffc'.format(
             text)
         resp = requests.get(URL2)
         city = resp.json()
         if int(city.get('code', 0)) != 200:
             await msg.say('找不到这个城市')
         else:
             url = 'https://devapi.qweather.com/v7/weather/now?location={}&key=86bae3f81a9c4af9ae7187b23250dffc'.format(
                 city.get('location', [])[0].get('id'))
             resp = requests.get(url)
             weather = resp.json()
             if int(weather.get('code', 0)) != 200:
                 await msg.say('搜索不到该气温')
             else:
                 msg_ = '{}\n🍁天气:{}\n🍁当前温度为:{}摄氏度\n🍁体感温度为:{}摄氏度'.format(
                     text, weather['now']['text'], weather['now']['temp'],
                     weather['now']['feelsLike'])
                 await msg.say(msg_)
Esempio n. 16
0
 async def on_message(self, msg: Message):
     """
     listen for message event
     """
     from_contact = msg.talker()
     text = msg.text()
     room = msg.room()
     to = msg.to()
     if room is None and to.contact_id == self.contact_id:
         # say msg to the bot
         if text == '#status':
             msg = 'busy' if self.busy else 'free'
             await from_contact.say(
                 f'My status: {msg}')
             await from_contact.say(self.auto_reply_comment)
         elif text == '#free':
             await from_contact.say('auto reply stopped.')
         elif text == '#busy':
             self.busy= True
             await from_contact.say('auto reply enabled')
         else:
             await from_contact.say(self.auto_reply_comment)
    async def on_message(self, msg: Message):
        """check the keyword and reply to talker"""

        # don't listen in room
        if msg.room():
            return

        talker = msg.talker()

        for message_matcher, rules in self.rules.items():
            is_match = await message_matcher.match(msg)

            if is_match:
                # cache the rooms data
                rooms = []
                for rule in rules:
                    # pytype: disable=attribute-error
                    matched_rooms = await rule.find_rooms(self.bot)
                    rooms.extend(matched_rooms)

                # invite person to the room
                for room in rooms:
                    self.welcome_ids[room.room_id].append(talker.contact_id)
                    await room.add(talker)
Esempio n. 18
0
    async def on_message(self, msg: Message):

        # 加载消息发送者
        talker = msg.talker()
        await talker.ready()

        # 忽略自己发的消息
        if talker.contact_id == self.my_contact_id:
            return

        # 加载聊天室信息
        room = msg.room()
        room_topic = None
        if room:
            await room.ready()
            room_topic = await room.topic()

        # 基本信息
        msg_text = msg.text()
        msg_text_inline = msg.text().replace('\n', '')
        msg_type = msg.message_type()
        msg_id = msg.message_id
        if msg_type == 6:
            log.info('Received text, msg_type = {}, id = {}'.format(
                msg_type, msg_id))
        else:
            log.info('Received text = {}, msg_type = {}, id = {}'.format(
                msg_text, msg_type, msg_id))

        # 保存聊天记录
        insert_data = {
            'contact_id': talker.contact_id,
            'contact_name': talker.name,
            'room_id': room.room_id if room else None,
            'room_name': room_topic,
            'msg_id': msg_id,
            'msg_text': msg_text[:20],
            'created_at': datetime.now()
        }
        keys = ','.join(['`{}`'.format(str(v)) for v in insert_data.keys()])
        values = ','.join(
            ['\'{}\''.format(str(v)) for v in insert_data.values()])
        sql = 'INSERT INTO {table}({keys}) VALUES({values})'.format(
            table='msg_records', keys=keys, values=values)
        try:
            self.db.cursor.execute(sql)
            self.db.db.commit()
        except Exception as e:
            log.error(e)
            self.db.db.rollback()

        # 鉴定是否为广告
        if room and not re.match(r'.*(kda|kadena|可达).*',
                                 msg_text_inline.lower()):
            is_ad = False
            if msg_type == 4:
                pass
            elif msg_type == 5:
                # 识别是否有二维码
                img = await msg.to_file_box()
                log.info('get img {}'.format(img.name))
                img_path = './images/{}'.format(img.name)
                img_file = await img.to_file(img_path)
                log.info('get img stored')
                img = cv2.imread(img_path)
                data, bbox, straight_qrcode = self.detector.detectAndDecode(
                    img)
                log.info('qrcode results: {}, {}, {}'.format(
                    data, bbox, straight_qrcode))
                if bbox is not None:
                    log.info('ad detected qr_code')
                    is_ad = True
                os.remove(img_path)
            elif msg_type == 6:
                if len(msg_text) >= 50 and re.match(
                        r'.*(http|空投|撸).*',
                        msg_text) and not re.match(r'.*bihu\.com.*', msg_text):
                    log.info('ad detected text')
                    is_ad = True

            if is_ad:
                sql = """SELECT count(*) as msg_cnt FROM {} where contact_id = '{}'""".format(
                    'msg_records', talker.contact_id)
                self.db.cursor.execute(sql)
                if list(self.db.cursor.fetchall())[0]['msg_cnt'] < 10:
                    q_list = list(self.ad_qa_dict.keys())
                    question = q_list[random.randrange(0, len(q_list))]
                    threading.Thread(target=self.kick_member,
                                     args=(talker, room, question)).start()
                    reply = '@{}\n你有打广告的嫌疑哦,请在15秒内回答以下问题,否则给你抱出去~~~\n{}'.format(
                        talker.name, question)
                    await room.say(reply, mention_ids=[talker.contact_id])
                    return

        # GOD的指令
        if talker.contact_id == self.god_contact_id and 'c/' in msg_text:
            if 'c/new' in msg_text:
                if '上一条' in msg_text:
                    sql = """SELECT msg_id FROM {} where contact_id = '{}' order by created_at desc""".format(
                        'msg_records', self.god_contact_id)
                    self.db.cursor.execute(sql)
                    refer_msg_id = list(self.db.cursor.fetchall())[1]['msg_id']
                    title = msg_text
                else:
                    root = ET.fromstring(msg_text)
                    refer_msg_id = root.find('.//refermsg//svrid').text
                    title = root.find('.//title').text
                keyword = re.findall('#.+#', title)[0].replace('#', '')
                log.info('title = {}, keyword = {}'.format(title, keyword))
                insert_data = {
                    'keyword': keyword,
                    'msg_id': refer_msg_id,
                    'created_at': datetime.now()
                }
                keys = ','.join(
                    ['`{}`'.format(str(v)) for v in insert_data.keys()])
                values = ','.join(
                    ['\'{}\''.format(str(v)) for v in insert_data.values()])
                sql = 'INSERT INTO {table}({keys}) VALUES({values})'.format(
                    table='materials', keys=keys, values=values)
                try:
                    self.db.cursor.execute(sql)
                    self.db.db.commit()
                    log.info('INSERT succesfully: {}'.format(sql))
                except Exception as e:
                    log.error(e)
                    self.db.db.rollback()

                reply = '指令已储存,关键词:{}'.format(keyword)
                await msg.say(reply)

            elif 'c/list' in msg_text:
                sql = """SELECT keyword FROM {} group by keyword""".format(
                    'materials')
                self.db.cursor.execute(sql)
                reply = '现有指令'
                for row in self.db.cursor.fetchall():
                    reply += '\n' + row['keyword']

                await msg.say(reply)

            elif 'c/show' in msg_text:
                keyword = re.findall('#.+#', msg_text)[0].replace('#', '')
                await self.send_msg_with_keyword(keyword,
                                                 contact=talker,
                                                 room=room)

            elif 'c/active' in msg_text:
                today = datetime.now()
                start_dt = datetime(today.year, today.month, today.day)
                sql = """SELECT contact_id, count(*) as msg_cnt
                        FROM {} where room_id = '{}' and created_at >= '{}'
                        group by contact_id""".format('msg_records',
                                                      room.room_id, start_dt)
                self.db.cursor.execute(sql)
                records = [
                    row['contact_id'] for row in self.db.cursor.fetchall()
                ]
                member_list = await room.member_list()
                reply = '今日群内未发言成员:'
                for member in member_list:
                    if member.contact_id != self.my_contact_id and member.contact_id not in records:
                        reply += '\n' + member.name

                topic = await room.topic()
                if '星火' in topic:
                    reply += '\n如果没法保持每天活跃,会被移出此群哦~'
                await msg.say(reply)

            elif 'c/fixroomname' in msg_text:
                log.info('to fix room name')
                sql = """SELECT * FROM {} WHERE room_id is not null and room_name = ''""".format(
                    'msg_records')
                self.db.cursor.execute(sql)
                for row in self.db.cursor.fetchall():
                    to_fix_room = self.Room(room_id=row['room_id'])
                    await to_fix_room.ready()
                    to_fix_room_name = await to_fix_room.topic()

                    sql = """UPDATE {} SET room_name = '{}' where id = {}""".format(
                        'msg_records', to_fix_room_name, row['id'])
                    try:
                        self.db.cursor.execute(sql)
                        self.db.db.commit()
                        log.info('update succesfully: {}'.format(sql))
                    except Exception as e:
                        log.error(e)
                        self.db.db.rollback()

                log.info('finished')

            elif 'c/kdashill_to_tg' in msg_text:
                log.info('to send telegram')
                sql = """SELECT * FROM {} WHERE has_sent_tg is null""".format(
                    'kdashill_records')
                self.db.cursor.execute(sql)
                for row in self.db.cursor.fetchall():
                    url = 'https://m.bihu.com/shortcontent/{}'.format(
                        row['content_id'])
                    data = None
                    with concurrent.futures.ThreadPoolExecutor() as executor:
                        future = executor.submit(self.telegram.send_msg, url)
                        data = future.result()

                    log.info('get res: {}'.format(data))
                    if data:
                        sql = """UPDATE {} SET has_sent_tg = {} where content_id = '{}'""".format(
                            'kdashill_records', 1, row['content_id'])
                        try:
                            self.db.cursor.execute(sql)
                            self.db.db.commit()
                            log.info('update succesfully: {}'.format(sql))
                        except Exception as e:
                            log.error(e)
                        self.db.db.rollback()

                    time.sleep(1)
                    break

            return

        # 推荐活动
        if room and re.match(r'.*[bihu|chainnode]\.com.*', msg_text_inline):
            content_id = None
            match_results = re.search(r'(?<=bihu\.com/s/)[0-9A-Za-z]{1,}',
                                      msg_text)
            if match_results:
                key = match_results[0]
                x = 0
                for y in key:
                    k = digit62.find(y)
                    if k >= 0:
                        x = x * 62 + k
                content_id = str(x)
                platform = 'bihu'
                log.info('transfer {} to {}'.format(key, content_id))
            elif 'bihu' in msg_text:
                match_results = re.search(
                    r'(?<=bihu\.com/shortcontent/)\d{1,}',
                    msg_text_inline.lower())
                content_id = match_results[0]
                platform = 'bihu'
            elif 'chainnode' in msg_text:
                match_results = re.search(r'(?<=chainnode\.com/post/)\d{1,}',
                                          msg_text_inline.lower())
                content_id = match_results[0]
                platform = 'chainnode'
            else:
                log.info('not find pattern')

            if content_id:
                log.info('get content id = {}'.format(content_id))
                data = None
                with concurrent.futures.ThreadPoolExecutor() as executor:
                    if platform == 'bihu':
                        future = executor.submit(self.crawler.fetch_bihu,
                                                 content_id)
                    else:
                        future = executor.submit(self.crawler.fetch_chainnode,
                                                 content_id)
                    data = future.result()

                log.info('fetched data = {}'.format(data))
                if data:
                    content_inline = data['content'].replace('\n', '')
                    post_date = data['post_date']
                    if not re.match(r'.*(kda|kadena|可达).*',
                                    content_inline.lower()):
                        reply = '未发现Kadena相关信息哦~'
                        reply = reply + ' @{}'.format(talker.name)
                        await room.say(reply, mention_ids=[talker.contact_id])
                        return
                    elif post_date < datetime(
                            2021, 3, 26) or post_date >= datetime(2021, 4, 2):
                        reply = '文章发布时间不在活动范围内,不能算入哦~'
                        reply = reply + ' @{}'.format(talker.name)
                        await room.say(reply, mention_ids=[talker.contact_id])
                        return

                    # 展示
                    sql = """SELECT * FROM {} where phase = 1 and platform = '{}' and content_id = '{}'""".format(
                        'kdashill_records', platform, content_id)
                    self.db.cursor.execute(sql)
                    results = list(self.db.cursor.fetchall())
                    if len(results):
                        # 处理重复
                        is_duplicate = True
                        ww_id = results[0]['id']
                        from_room = self.Room(room_id=results[0]['room_id'])
                        await from_room.ready()
                        from_room_name = await from_room.topic()
                        room_name_str = '「{}」\n'.format(
                            from_room_name.replace('Kadena', ''))
                        from_contact = self.Contact(
                            contact_id=results[0]['contact_id'])
                        await from_contact.ready()
                        from_contact_name = from_contact.name
                    else:
                        is_duplicate = False
                        sql = """SELECT max(id) as max_id FROM {} """.format(
                            'kdashill_records')
                        self.db.cursor.execute(sql)
                        max_id = list(self.db.cursor.fetchall())[0]['max_id']
                        ww_id = max_id + 1
                        room_name_str = '「{}」\n'.format(
                            room_topic.replace('Kadena', ''))
                        from_contact_name = talker.name

                    reply_title = '可达秀.{:02} @ {}'.format(
                        ww_id, from_contact_name)
                    if platform == 'bihu':
                        reply_url = 'https://m.bihu.com/shortcontent/{}'.format(
                            content_id)
                        score = 1
                        if 'img_url' in data:
                            prefix = 'https://oss-cdn1.bihu-static.com/'
                            reply_thumbnail = prefix + data['img_url']
                        else:
                            reply_thumbnail = 'https://m.bihu.com/static/img/pic300.jpg'
                    else:
                        score = 2
                        reply_url = 'https://www.chainnode.com/post/{}'.format(
                            content_id)
                        if 'img_url' in data:
                            reply_thumbnail = data['img_url']
                        else:
                            reply_thumbnail = 'https://webcdn.chainnode.com/mobile-1.3.15/img/ChainNode.4e5601a.svg'
                    reply_description = room_name_str + data['content'][:60]
                    log.info('to create url_link: {},{},{},{}'.format(
                        reply_url, reply_title, reply_thumbnail,
                        reply_description))
                    reply_link = UrlLink.create(reply_url, reply_title,
                                                reply_thumbnail,
                                                reply_description)
                    log.info('url created')

                    # 查重
                    if is_duplicate:
                        reply = '文章已有录入哦~'
                        reply = reply + ' @{}'.format(talker.name)
                        await room.say(reply, mention_ids=[talker.contact_id])

                        return

                    # 记分
                    insert_data = {
                        'phase': 2,
                        'platform': platform,
                        'content_id': content_id,
                        'contact_id': talker.contact_id,
                        'contact_name': talker.name,
                        'room_id': room.room_id,
                        'created_at': datetime.now(),
                        'score': score,
                    }
                    keys = ','.join(
                        ['`{}`'.format(str(v)) for v in insert_data.keys()])
                    values = ','.join([
                        '\'{}\''.format(str(v)) for v in insert_data.values()
                    ])
                    sql = 'INSERT INTO {table}({keys}) VALUES({values})'.format(
                        table='kdashill_records', keys=keys, values=values)
                    try:
                        self.db.cursor.execute(sql)
                        self.db.db.commit()
                        log.info('INSERT succesfully: {}'.format(sql))
                    except Exception as e:
                        log.error(e)
                        self.db.db.rollback()

                    # 报积分
                    sql = """SELECT contact_id, sum(score) as score FROM {} where phase = 2 group by contact_id order by score desc""".format(
                        'kdashill_records')
                    self.db.cursor.execute(sql)
                    rank = 0
                    for row in self.db.cursor.fetchall():
                        rank += 1
                        if row['contact_id'] == talker.contact_id:
                            reply = '感谢参加可达秀 [KDA-Show] 活动!🍻\n'
                            reply += '您当前积分为{},排名为{}'.format(
                                row['score'], rank)
                            break

                    reply = reply + ' @{}'.format(talker.name)
                    await room.say(reply, mention_ids=[talker.contact_id])

                    # 发送至其他群
                    sql = """SELECT room_id, max(room_name) as room_name FROM {} group by room_id""".format(
                        'msg_records')
                    self.db.cursor.execute(sql)
                    for row in self.db.cursor.fetchall():
                        if '可达社区信息流' in row['room_name']:
                            forward_room = self.Room(room_id=row['room_id'])
                            await forward_room.ready()
                            try:
                                await forward_room.say(reply_link)
                            except Exception as e:
                                log.exception(e)

                    # 发送至Telegram
                    #threading.Thread(target=self.telegram.send_msg, args=(reply_url)).start()

                    return

                else:
                    reply = '未查到相关网页'
                    reply = reply + ' @{}'.format(talker.name)
                    await room.say(reply, mention_ids=[talker.contact_id])
                    return

        # 关键词回复
        if re.match(r'(资料|学习|学习资料|新人)', msg_text_inline):
            await self.send_msg_with_keyword('新手指南', contact=talker, room=room)
            return

        coin_dict = {
            'kda': 'kadena',
            'btc': 'bitcoin',
            'eth': 'ethereum',
            'dot': 'polkadot',
            'link': 'chainlink',
            'atom': 'cosmos',
            'mkr': 'maker',
            'luna': 'terra-luna',
            'celo': 'celo',
        }
        if room and msg_text.lower() in coin_dict:
            name = msg_text.lower()
            full_name = coin_dict[name]
            url = 'https://api.coingecko.com/api/v3/coins/{}/market_chart?vs_currency=usd&days=30&interval=daily'.format(
                full_name)
            data = requests.get(url).json()
            log.info('get chart, response: {}'.format(data))
            url = 'http://*****:*****@{}'.format(self.my_contact_name)
                              in msg_text):
            data = {'msg': msg_text, 'appid': '0', 'key': 'free'}
            url = 'http://api.qingyunke.com/api.php'
            res = requests.get(url, params=data)
            log.info('get AI request: {}, {}, response: {}'.format(
                url, data, res.text))
            data = res.json()
            reply = data['content'].replace('{br}', '\n')
            reply = reply + ' @{}'.format(talker.name)
            if room:
                await room.say(reply, mention_ids=[talker.contact_id])
            else:
                await msg.say(reply)
    async def on_message(self, msg: Message):
        """
        listen for msg event.
        :param msg: received msg.
        :return: none
        """

        # msg
        # attrs:
        # message_id(str) '3037907331459016207'
        # from_id(str) 'wxid_qgho9l2kdha311'
        # mention_ids(list)
        # room_id(str)  ''
        # text(str) '1'
        # timestamp(int) 1620493045
        # to_id(str) 'wxid_vj8wsjhms91j22'


        # busy-bot: 可以输入特定指令使得机器人不会进行自动回答,可以用于进群验证时的维护状态


        from_contact = msg.talker()
        # attrs:
        # name(str) 'KIERAN.'
        # contact_id(str) 'wxid_qgho9l2kdha311'
        # address ''
        # alias ''
        # avatar 'https://wx.qlogo.cn/mmhead/ver_1/NFn8dpgY2taGWzz0jOnZFZ2rMsiaoINkFRuLDRtxTKyFREY56tIrWCXmdHMicB7cQxK7bJXqiajadVnicaM9CrAh0z1krDEpMs8AKEdMoHjaXvw/0'
        # city ''
        # friend True
        # gender 1
        # signature '短期计划者'
        # weixin 'kieran00000'

        text = msg.text()

        room = msg.room()

        to = msg.to()
        # attrs:
        # name(str) '随便取个名吧'
        # contact_id(str) 'wxid_vj8wsjhms91j22'
        # address ''
        # alias ''
        # avatar ''
        # city ''
        # friend True
        # gender 0
        # signature ''
        # weixin ''

        print(msg.type())

        if msg.is_self():
            return

        await savecontent(msg, from_contact, room, self.collection2)

        await calculatespeak(msg, from_contact, room, self.collection3)

        # if msg.type() == MessageType.MESSAGE_TYPE_AUDIO:
        #     audio = await msg.to_file_box()
        #     # save the image as local file
        #     await audio.to_file(f'./{audio.name}')

        # if msg.type() == MessageType.MESSAGE_TYPE_ATTACHMENT:
        #     file = await msg.to_file_box()
        #     await file.to_file(f"./{file.name}")
        #     print("保存文件成功")

        if msg.type() == MessageType.MESSAGE_TYPE_RECALLED:
            # recalledMessage = await msg.to_recalled()
            # 方法有错误,下面自己手写debug得到。

            msg_text = msg.text()
            # recalledMessage = self.Message.load(message_id=msg_text)
            # await recalledMessage.ready()
            origin_message_id = re.findall(r'<newmsgid>(.*?)</newmsgid>', msg_text)[0]

            # recalledMessage = self.Message.find_all(message_id=origin_message_id)
            recalledMessage = self.Message.load(message_id=origin_message_id)
            await recalledMessage.ready()
            log.info('Bot' + f'EVENT: Detect Recalled text : {recalledMessage.text()} . FROM {from_contact.contact_id}')
            print(f"Recalled msg is {recalledMessage.text()}")





        # 此处的if
        if room == None and to.contact_id == self.contact_id:
            # When someone try to contact with the bot
            if text == '#状态':
                msg = 'busy' if self.busy else 'free'
                await from_contact.say(
                    f'My status: {msg}')
                if self.busy == True:
                    await from_contact.say(self.busy_auto_reply_comment)

            elif text == '#开启':
                # Problem: the talker should be an authentic wechat user.
                self.busy = False
                await from_contact.say('关闭自动回复')

            elif text == '#关闭':
                # Problem: the talker should be an authentic wechat user.
                self.busy = True
                await from_contact.say('打开自动回复.')

            elif self.busy == False:
                # 添加基本的进群验证功能。
                if msg.text() == 'ding':
                    await from_contact.say('dong')
                    # await from_contact.say('目前只能进行ding的回复,请继续等待后续开发😂')

                if msg.text() == '#帮助':
                    await from_contact.say('1. 发送 \'#加群\' 给bot,bot会发送给用户对应的验证码图片\n'
                                           '2. 发送 \'#验证 XXXX\' 给bot,bot会完成验证并给予答复,拉人接口暂时还未完善\n'
                                           '3. 发送 \'ding\' 给bot,bot会答复dong')

                elif msg.text().startswith('#加群'):

                    find_result = find(self.collection3, from_contact.contact_id)
                    if find_result != False and find_result['remove'] != 0:
                        passed_time = time.time() - find_result['time_leave_room']
                        if passed_time < 300:
                            await from_contact.say(f"你的冷静期还未结束。还剩余{300 - int(passed_time)}秒")
                            return

                    inserted_dict = {"_id": from_contact.contact_id, "quiz_ans": "", "quiz_time": 0}
                    insert(self.collection1, from_contact.contact_id, inserted_dict)

                    await from_contact.say('请稍等验证码生成,并在60s内完成回答')

                    img, code = getVerifyCode()

                    update(self.collection1, from_contact.contact_id, "quiz_ans", code)
                    update(self.collection1, from_contact.contact_id, "quiz_time", time.time())
                    # 为了防止用户连续两次进行请求

                    # self.verify_info[from_contact.contact_id] = code

                    img = FileBox.from_file('./temp_verify.jpg')
                    await from_contact.say(img)
                    # print(self.verify_info[from_contact.contact_id])
                    print(code)

                    # await from_contact.say("目前进群功能仍在开发中")
                    # await from_contact.say('请耐心等待开发')


                elif msg.text() == '#我是你爹':
                    await from_contact.say("主人sama,马上把您拉上群")


                    try:
                        dingRoom = await self.Room.find('新测试群')
                        if dingRoom:
                            log.info('Bot' + 'onMessage: got dingRoom: "%s"' % await dingRoom.topic())
                            await checkandinvite(from_contact=from_contact, room = dingRoom, collection_user=self.collection3)
                            #
                            #
                            # if self.boton_quit.__contains__(dingRoom.room_id):
                            #     boton_quit_list = self.boton_quit[dingRoom.room_id]
                            # else:
                            #     boton_quit_list = []
                            #
                            # if from_contact.contact_id not in boton_quit_list and await dingRoom.has(from_contact):
                            #     topic = await dingRoom.topic()
                            #     log.info('Bot' + 'onMessage: sender has already in dingRoom')
                            #     # await dingRoom.say('I found you have joined in room "{0}"!'.format(topic), talker)
                            #     await dingRoom.say(f'您 @{from_contact.name} 已经在群聊 "{topic}"中!')
                            #     await from_contact.say(
                            #         '不需要再次申请入群,因为您已经在群"{}"中'.format(topic))
                            # else:
                            #     inserted_dict = {"_id": from_contact.contact_id, "time_in": time.time(), "warning": 0,
                            #                      "time_last_warning": 0}
                            #     insert(collection2, from_contact.contact_id, inserted_dict)
                            #     update(collection2, from_contact.contact_id, "warning", 0)
                            #     update(collection2, from_contact.contact_id, "time_last_warning", 0)
                            #
                            #
                            #     if from_contact.contact_id in boton_quit_list:
                            #         self.boton_quit[dingRoom.room_id].remove(from_contact.contact_id)
                            #     log.info('Bot' + 'onMessage: add sender("%s") to dingRoom("%s")' % (
                            #         from_contact.name, dingRoom.topic()))
                            #     await put_in_room(from_contact, dingRoom)
                            #     await from_contact.say('已经您拉入群中')


                    except Exception as e:
                        log.exception(e)



                elif msg.text().startswith('#验证'):
                    user_verify_code = msg.text()[4:]
                    print(user_verify_code)

                    find_result = find(self.collection1, from_contact.contact_id)
                    # if not self.verify_info.__contains__(from_contact.contact_id):
                    if find_result == False:
                        await from_contact.say('并未进行加群请求!,请先发送 #加群 至机器人获取专属验证码')
                        return

                    if time.time() - find_result['quiz_time'] > 60:
                        # expired_code = self.verify_info.pop(from_contact.contact_id)
                        delete(self.collection1, from_contact.contact_id)
                        print(f'previous code has benn expired')
                        await from_contact.say("超时未回答正确验证码信息,请重新发送 #加群 再进行尝试")

                    elif user_verify_code == find_result['quiz_ans']:

                        # TODO: 需不需要再在roominvite中删除?
                        delete(self.collection1, from_contact.contact_id)
                        print(f"在room_invite中删除一认证用户{from_contact.name}")


                        await from_contact.say("通过测试,后续会将您拉入群中")
                        # put_in_room()
                        # await from_contact.say("目前进群功能仍在开发中")



                        try:
                            dingRoom = await self.Room.find('新测试群')
                            if dingRoom:
                                log.info('Bot' + 'onMessage: got dingRoom: "%s"' % await dingRoom.topic())
                                await checkandinvite(from_contact=from_contact, room=dingRoom,
                                                    collection_user=self.collection3)

                                # if self.boton_quit.__contains__(dingRoom.room_id):
                                #     boton_quit_list = self.boton_quit[dingRoom.room_id]
                                # else:
                                #     boton_quit_list = []
                                #
                                # if from_contact.contact_id not in boton_quit_list and await dingRoom.has(from_contact):
                                #     topic = await dingRoom.topic()
                                #     log.info('Bot' + 'onMessage: sender has already in dingRoom')
                                #     # await dingRoom.say('I found you have joined in room "{0}"!'.format(topic), talker)
                                #     await dingRoom.say(f'您 @{from_contact.name} 已经在群聊 "{topic}"中!')
                                #     await from_contact.say(
                                #         '不需要再次申请入群,因为您已经在群"{}"中'.format(topic))
                                # else:
                                #     if from_contact.contact_id in boton_quit_list:
                                #         self.boton_quit[dingRoom.room_id].remove(from_contact.contact_id)
                                #
                                #     inserted_dict = {"_id": from_contact.contact_id, "time_in": time.time(),
                                #                      "warning": 0, "time_last_warning": 0}
                                #     insert(collection2, from_contact.contact_id, inserted_dict)
                                #     update(collection2, from_contact.contact_id, "warning", 0)
                                #     update(collection2, from_contact.contact_id, "time_last_warning", 0)
                                #     print("完成新人信息的插入")
                                #
                                #     log.info('Bot' + 'onMessage: add sender("%s") to dingRoom("%s")' % (
                                #         from_contact.name, dingRoom.topic()))
                                #     await put_in_room(from_contact, dingRoom)
                                #     await from_contact.say('已经您拉入群中')

                        except Exception as e:
                            log.exception(e)


                    else:
                        # 输入失败
                        await from_contact.say("验证失败,请再次尝试。")
                # 正常文字信息
                else:
                    if await regex_filter(msg, from_contact) != 0:
                        print("正则匹配得到")
                        # print("是这里吗?")
                        return
                    elif await dict_filter(msg, from_contact) != 0:
                        # print("regex passed")
                        print("字典检测得到")
                    # elif
                    # TODO:
                    elif await api_filter(msg, from_contact) != 0:
                        print("api匹配得到")
                        # print("regex passed")
                        # print("dict passed")

                    # else:
                        # print("regex passed")
                        # print("dict passed")
                        # print("api passed")



            else:
                await from_contact.say(self.busy_auto_reply_comment)

        # Room talk
        elif room.room_id == '23402005339@chatroom':
            print(1)
            if msg.text() == 'ding':
                await msg.say('dong')
                # await msg.say('目前只能进行ding的回复,请继续等待后续开发😂')

            else:
                # 正常的群中对话信息
                if await regex_filter(msg, from_contact) != 0:
                    print("正则匹配得到")
                    if from_contact.contact_id in owner_contact_id_list:
                        await room.say("管理员测试中")
                        return
                    await warnandcheck(from_contact, room, self.collection3)
                    return

                elif await dict_filter(msg, from_contact) != 0:
                    print("字典得到")
                    if from_contact.contact_id in owner_contact_id_list:
                        await room.say("管理员测试中")
                        return
                    await warnandcheck(from_contact, room, self.collection3)
                    return

                elif await api_filter(msg, from_contact) != 0:
                    print("API完成检测")
                    if from_contact.contact_id in owner_contact_id_list:
                        await room.say("管理员测试中")
                        return
                    await warnandcheck(from_contact, room, self.collection3)
                    return
Esempio n. 20
0
    async def on_message(self, msg: Message):
        """
        listen for message event
        """
        from_contact: Contact = msg.talker()
        text: str = msg.text()
        room: Optional[Room] = msg.room()
        msg_type: MessageType = msg.type()
        file_box: Optional[FileBox] = None
        if text == '#ding':
            conversation: Union[
                Room, Contact] = from_contact if room is None else room
            await conversation.ready()
            await conversation.say('dong')
            file_box = FileBox.from_url(
                'https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/'
                'u=1116676390,2305043183&fm=26&gp=0.jpg',
                name='ding-dong.jpg')
            await conversation.say(file_box)

        elif msg_type == MessageType.MESSAGE_TYPE_IMAGE:
            logger.info('receving image file')
            # file_box: FileBox = await msg.to_file_box()
            image: Image = msg.to_image()

            hd_file_box: FileBox = await image.hd()
            await hd_file_box.to_file('./hd-image.jpg', overwrite=True)

            thumbnail_file_box: FileBox = await image.thumbnail()
            await thumbnail_file_box.to_file('./thumbnail-image.jpg',
                                             overwrite=True)
            artwork_file_box: FileBox = await image.artwork()
            await artwork_file_box.to_file('./artwork-image.jpg',
                                           overwrite=True)
            # reply the image
            await msg.say(hd_file_box)

        # pylint: disable=C0301
        elif msg_type in [
                MessageType.MESSAGE_TYPE_AUDIO,
                MessageType.MESSAGE_TYPE_ATTACHMENT,
                MessageType.MESSAGE_TYPE_VIDEO
        ]:
            logger.info('receving file ...')
            file_box = await msg.to_file_box()
            if file_box:
                await file_box.to_file(file_box.name)

        elif msg_type == MessageType.MESSAGE_TYPE_MINI_PROGRAM:
            logger.info('receving mini-program ...')
            mini_program: Optional[MiniProgram] = await msg.to_mini_program()
            if mini_program:
                await msg.say(mini_program)

        elif text == 'get room members' and room:
            logger.info('get room members ...')
            room_members: List[Contact] = await room.member_list()
            names: List[str] = [
                room_member.name for room_member in room_members
            ]
            await msg.say('\n'.join(names))

        elif text.startswith('remove room member:'):
            logger.info('remove room member:')
            if not room:
                await msg.say('this is not room zone')
                return

            room_member_name = text[len('remove room member:') + 1:]

            room_member: Optional[Contact] = await room.member(
                query=RoomMemberQueryFilter(name=room_member_name))
            if room_member:
                if self.login_user and self.login_user.contact_id in room.payload.admin_ids:
                    await room.delete(room_member)
                else:
                    await msg.say('登录用户不是该群管理员...')

            else:
                await msg.say(
                    f'can not fine room member by name<{room_member_name}>')
        elif text.startswith('get room topic'):
            logger.info('get room topic')
            if room:
                topic: Optional[str] = await room.topic()
                if topic:
                    await msg.say(topic)

        elif text.startswith('rename room topic:'):
            logger.info('rename room topic ...')
            if room:
                new_topic = text[len('rename room topic:') + 1:]
                await msg.say(new_topic)
        elif text.startswith('add new friend:'):
            logger.info('add new friendship ...')
            identity_info = text[len('add new friend:') + 1:]
            weixin_contact: Optional[Contact] = await self.Friendship.search(
                weixin=identity_info)
            phone_contact: Optional[Contact] = await self.Friendship.search(
                phone=identity_info)
            contact: Optional[Contact] = weixin_contact or phone_contact
            if contact:
                self.Friendship.add(contact, 'hello world ...')

        elif text.startswith('at me'):
            await msg.say(self.login_user)

        else:
            pass