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)))] ))
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()
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)