Exemplo n.º 1
0
 async def handle(app: Ariadne, message: MessageChain, group: Group,
                  member: Member):
     if message.asDisplay().startswith("/fake "):
         content = "".join(i.text for i in message.get(Plain))[6:]
         if not message.has(At):
             return MessageItem(MessageChain.create([Plain(text="未指定目标!")]),
                                Normal())
         sender = message.get(At)[0]
         forward_nodes = [
             ForwardNode(
                 senderId=sender.target,
                 time=datetime.now(),
                 senderName=(await app.getMember(group,
                                                 sender.target)).name,
                 messageChain=MessageChain.create(Plain(text=content)),
             )
         ]
         return MessageItem(
             MessageChain.create(Forward(nodeList=forward_nodes)), Normal())
Exemplo n.º 2
0
async def chat_reply(
        app: Ariadne,
        message: MessageChain,
        group: Group,
        member: Member,
        at: ElementResult
):
    assert isinstance(at.result, At)
    if at.result.target == config.bot_qq:
        content = "".join(plain.text for plain in message.get(Plain)).strip().replace(" ", ",")
        mode_now = await group_setting.get_setting(group, Setting.speak_mode)

        if mode_now in ("normal", "zuanLow", "zuanLow"):
            return

        elif mode_now == "rainbow":
            async with get_running(Adapter).session.get("https://api.shadiao.app/chp") as resp:
                text = (await resp.json())['data']['text']

        elif mode_now == "chat":
            user_data = config.functions['tencent']
            if user_data["secret_id"] == "secret_id" or user_data["secret_key"] == "secret_key":
                text = "secret_id/secret_key未初始化"
            else:
                try:
                    user_data = config.functions['tencent']
                    cred = credential.Credential(user_data["secret_id"], user_data["secret_key"])
                    http_profile = HttpProfile()
                    http_profile.endpoint = "nlp.tencentcloudapi.com"

                    client_profile = ClientProfile()
                    client_profile.httpProfile = http_profile
                    client = nlp_client.NlpClient(cred, "ap-guangzhou", client_profile)

                    req = models.ChatBotRequest()
                    params = {"Query": content}
                    req.from_json_string(json.dumps(params))
                    resp = client.ChatBot(req)
                    text = json.loads(resp.to_json_string())["Reply"]\
                        .replace("腾讯小龙女", "纱雾酱").replace("小龙女", "纱雾酱")
                except TencentCloudSDKException as e:
                    logger.error(traceback.format_exc())
                    text = str(e)

        else:
            raise Exception(f"数据库群 <{group.id}> speak_mode项非法!目前值:{mode_now}")

        if text:
            await app.sendGroupMessage(group, MessageChain.create([
                At(target=member.id),
                Plain(text=f" {text}")
            ]))
Exemplo n.º 3
0
async def chat_record(message: MessageChain, group: Group, member: Member):
    content = "".join([plain.text for plain in message.get(Plain)]).strip()
    filter_words = re.findall(r"\[mirai:(.*?)\]", content, re.S)
    for i in filter_words:
        content = content.replace(f"[mirai:{i}]", "")
    seg_result = jieba.lcut(content) if content else ''
    await orm.add(
        ChatRecord, {
            "time": datetime.datetime.now(),
            "group_id": group.id,
            "member_id": member.id,
            "persistent_string": message.asPersistentString(),
            "seg": "|".join(seg_result) if seg_result else ''
        })
Exemplo n.º 4
0
 async def handle(app: Ariadne, message: MessageChain, group: Group,
                  member: Member):
     if re.match(pattern, message.asDisplay()):
         if not await user_permission_require(group, member, 2):
             return MessageItem(
                 MessageChain.create([Plain(text="你没有权限,爬!")]), Normal())
         image_type = re.findall(r"添加(.*?)图片.*(\[图片].*)+",
                                 message.asDisplay(), re.S)[0][0]
         if image_type not in legal_type:
             return MessageItem(
                 MessageChain.create([
                     Plain(
                         text=f"非法图片类型!\n合法image_type:{'、'.join(legal_type)}"
                     )
                 ]), QuoteSource())
         if path := image_paths.get(image_type):
             if os.path.exists(path):
                 try:
                     await ImageAdder.add_image(path, message.get(Image))
                 except:
                     logger.error(traceback.format_exc())
                     return MessageItem(
                         MessageChain.create(
                             [Plain(text="出错了呐~请查看日志/控制台输出!")]), Normal())
                 return MessageItem(
                     MessageChain.create([
                         Plain(
                             text=f"保存成功!共保存了{len(message.get(Image))}张图片!")
                     ]), Normal())
             else:
                 return MessageItem(
                     MessageChain.create([
                         Image(
                             path=
                             f"{os.getcwd()}/statics/error/path_not_exists.png"
                         )
                     ]), QuoteSource())
         else:
             return MessageItem(
                 MessageChain.create([Plain(text=f"无{image_type}项!请检查配置!")
                                      ]), QuoteSource())
Exemplo n.º 5
0
    async def messagechain_to_img(
        message: MessageChain,
        max_width: int = 1080,
        font_size: int = 40,
        spacing: int = 15,
        padding_x: int = 20,
        padding_y: int = 15,
        img_fixed: bool = True,
        font_path: str = f"{os.getcwd()}/statics/fonts/STKAITI.TTF",
    ) -> MessageChain:
        """
        将 MessageChain 转换为图片,仅支持只含有图片/文本的 MessageChain
        Args:
            message: 要转换的MessageChain
            max_width: 最大长度
            font_size: 字体尺寸
            spacing: 行间距
            padding_x: x轴距离边框大小
            padding_y: y轴距离边框大小
            img_fixed: 图片是否适应大小(仅适用于图片小于最大长度时)
            font_path: 字体文件路径
        Examples:
            msg = await messagechain_to_img(message=message)
        Returns:
            MessageChain (内含图片Image类)
        """
        def get_final_text_lines(text: str, text_width: int,
                                 font: ImageFont.FreeTypeFont) -> int:
            lines = text.split("\n")
            line_count = 0
            for line in lines:
                if not line:
                    line_count += 1
                    continue
                line_count += int(
                    math.ceil(
                        float(font.getsize(line)[0]) / float(text_width)))
            return line_count + 1

        font = ImageFont.truetype(font_path, font_size, encoding="utf-8")
        message = message.merge(copy=True)
        elements = message.__root__

        plains = message.get(Plain)
        text_gather = "\n".join([plain.text for plain in plains])
        # print(max(font.getsize(text)[0] for text in text_gather.split("\n")) + 2 * padding_x)
        final_width = min(
            max(font.getsize(text)[0]
                for text in text_gather.split("\n")) + 2 * padding_x,
            max_width)
        text_width = final_width - 2 * padding_x
        text_height = (font_size + spacing) * (
            get_final_text_lines(text_gather, text_width, font) + 1)

        img_height_sum = 0
        temp_img_list = []
        images = [
            element for element in message.__root__
            if isinstance(element, Image)
        ]
        for image in images:
            temp_img = IMG.open(BytesIO(await image.get_bytes()))
            img_width, img_height = temp_img.size
            temp_img_list.append(
                temp_img := temp_img.resize((
                    int(final_width - 2 * spacing),
                    int(
                        float(img_height * (final_width - 2 * spacing)) /
                        float(img_width)))) if img_width > final_width -
                2 * spacing or (img_fixed and img_width < final_width -
                                2 * spacing) else temp_img)
            img_height_sum = img_height_sum + temp_img.size[1]
        final_height = 2 * padding_y + text_height + img_height_sum
        picture = IMG.new('RGB', (final_width, final_height), (255, 255, 255))
        draw = ImageDraw.Draw(picture)
        present_x = padding_x
        present_y = padding_y
        image_index = 0
        for element in elements:
            if isinstance(element, Image):
                picture.paste(temp_img_list[image_index],
                              (present_x, present_y))
                present_y += (spacing + temp_img_list[image_index].size[1])
                image_index += 1
            elif isinstance(element, Plain):
                for char in element.text:
                    if char == "\n":
                        present_y += (font_size + spacing)
                        present_x = padding_x
                        continue
                    if char == "\r":
                        continue
                    if present_x + font.getsize(char)[0] > text_width:
                        present_y += (font_size + spacing)
                        present_x = padding_x
                    draw.text((present_x, present_y),
                              char,
                              font=font,
                              fill=(0, 0, 0))
                    present_x += font.getsize(char)[0]
                present_y += (font_size + spacing)
                present_x = padding_x
        bytes_io = BytesIO()
        picture.save(bytes_io, format='PNG')
        logger.success("消息转图片处理成功!")
        return MessageChain.create([Image(data_bytes=bytes_io.getvalue())])