Exemplo n.º 1
0
async def GroupMessageHandler(group: Group, member: Member, msgchain: MessageChain):
    Record.addMessage(ChatRecord(messagechain=msgchain, group=group, member=member))
    if msgchain.has(Plain):
        text = msgchain.get(Plain)[0].text
        if text == '#词云生成':
            await app.sendGroupMessage(group, MessageChain.create(
                [At(member.id),
                 Plain('生成中...')]
            ))
            await app.sendGroupMessage(group, MessageChain.create(
                [At(member.id),
                 Image.fromLocalFile(wordCloudGenerator(Record.getAGroupMessageList(group.id)))]
            ))
        elif text == '#今日消息图表':
            await app.sendGroupMessage(group, MessageChain.create(
                [At(member.id),
                 Plain('生成中...')]
            ))
            await app.sendGroupMessage(group, MessageChain.create(
                [At(member.id),
                 Image.fromLocalFile(summaryGraphGenerator("today", Record.getAGroupMessageList(group.id)))]
            ))
        elif text == '#总消息图表':
            await app.sendGroupMessage(group, MessageChain.create(
                [At(member.id),
                 Plain('生成中...')]
            ))
            await app.sendGroupMessage(group, MessageChain.create(
                [At(member.id),
                 Image.fromLocalFile(summaryGraphGenerator("total", Record.getAGroupMessageList(group.id)))]
            ))
Exemplo n.º 2
0
    async def __on_receive(self, app: GraiaMiraiApplication,
                           subject: T.Union[Group, Friend],
                           message: MessageChain) -> T.NoReturn:
        src = message.get(Source)
        if len(src) == 0:
            src = None
        else:
            src = src[0]

        channel = asyncio.Queue(1)

        async def consumer(channel: asyncio.Queue):
            while True:
                try:
                    msg = await channel.get()
                    # logger.info("我摸到了!")
                    await reply(app, subject, msg, src)
                    # logger.info("我发完了!")
                    channel.task_done()
                except asyncio.CancelledError as exc:
                    # logger.info("我溜了!")
                    break
                except Exception as exc:
                    logger.exception(exc)
                    channel.task_done()

        consumer_task = asyncio.create_task(consumer(channel))

        try:
            for h in self.handlers:
                handler: AbstractMessageHandler = h["handler"]
                allow_group: T.Optional[T.Sequence[int]] = h["allow_group"]
                allow_friend: T.Optional[T.Sequence[int]] = h["allow_friend"]

                # 检查发送者是否有权限
                if isinstance(subject, Group):
                    if (allow_group is not None) and (subject.id not in allow_group):
                        continue
                elif isinstance(subject, Friend):
                    if (allow_friend is not None) and (subject.id not in allow_friend):
                        continue

                # 若handler拦截了这条消息
                try:
                    if await handler.handle(app, subject, message, channel):
                        break
                except Exception as exc:
                    logger.exception(exc)
                    pass
        finally:
            await channel.join()
            consumer_task.cancel()
Exemplo n.º 3
0
 async def solve_receive_msg(self, message: MessageChain):
     plain = message.asDisplay()
     if re.search(EroImage.cmd_receive, plain):
         self.set_receive_flag(True)
         return self.msg_receive
     elif re.search(EroImage.cmd_receive_done, plain):
         self.set_receive_flag(False)
         return self.msg_receive_done
     if self.receive_flag:
         images = message.get(Image)
         if len(images) == 0:
             return False
         else:
             return await self.receive_image(images)
    async def on_receive(self, app: GraiaMiraiApplication,
                         subject: T.Union[Group, Friend],
                         message: MessageChain) -> T.NoReturn:
        """
        接收消息
        :param app: GraiaMiraiApplication实例
        :param subject: 消息的发送对象
        :param message: 消息
        """
        src = message.get(Source)
        if len(src) == 0:
            src = None
        else:
            src = src[0]

        try:
            async for msg in self.generate_reply(app, subject, message):
                await reply(app, subject, msg, src)
        except Exception as exc:
            await reply(app, subject, self.generate_error_message(exc), src)