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())
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}") ]))
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 '' })
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())
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())])