main
1#!/usr/bin/env python
2# -*- coding: utf-8 -*-
3
4
5from loguru import logger
6from pyrogram.client import Client
7from pyrogram.types import Message
8
9from config import PREFIX
10from messages.parser import parse_msg
11from messages.sender import send2tg
12from messages.utils import equal_prefix, startswith_prefix
13from multimedia import split_long_img
14
15HELP = f"""🔁**原图转图片**
16使用说明: 以 `{PREFIX.CONVERT}` 回复包含原图文件的消息即可
17"""
18
19
20async def convert_image_file(client: Client, message: Message, *, convert_need_prefix: bool | None = None, **kwargs):
21 # send docs if message == "/convert", without reply
22 if equal_prefix(message.text, prefix=[PREFIX.CONVERT]) and not message.reply_to_message:
23 await send2tg(client, message, texts=HELP, **kwargs)
24 return
25 if not (trigger_message := get_trigger_message(message, convert_need_prefix=convert_need_prefix)):
26 return
27 info = parse_msg(trigger_message)
28 if info["mime_type"] not in ["image/png", "image/jpeg", "image/heic", "image/webp"]:
29 return
30 try:
31 logger.info(f"Convert raw image: {info['file_name']}")
32 path: str = await trigger_message.download() # type: ignore
33 logger.trace(f"Image {info['file_name']} downloaded to {path}")
34 photos = split_long_img(path)
35 media = [{"photo": photo.as_posix()} for photo in photos if photo.is_file()]
36 # send splits
37 if len(media) == 1:
38 await send2tg(client, trigger_message, media=media, texts="🔁【原图转换】已完成", **kwargs)
39 else:
40 await send2tg(client, trigger_message, media=media, texts="✂️【自动切长图】已完成 (使用【原图】发送才可触发切长图)", **kwargs)
41 except Exception as e:
42 logger.exception(e)
43
44
45def get_trigger_message(message: Message, *, convert_need_prefix: bool | None = None) -> Message | None:
46 """Check if the message is triggerable for converting.
47
48 By default, "/convert" prefix is needed in in Group & Channel & Bot chats to trigger this function.
49 In private chat, no need to add "/convert" prefix
50 """
51 info = parse_msg(message)
52 this_text = info["text"] # this message
53 if info["ctype"].lower() in ["group", "supergroup", "channel", "bot"]: # noqa: SIM108
54 convert_need_prefix = convert_need_prefix if convert_need_prefix is not None else True
55 else: # private chat
56 convert_need_prefix = convert_need_prefix or False
57
58 # skip no "/convert" prefix message if convert_need_prefix
59 if convert_need_prefix and not startswith_prefix(this_text, prefix=[PREFIX.CONVERT]):
60 return None
61
62 # treat the reply_to_message as the real message need to be converted
63 trigger_msg = message.reply_to_message if message.reply_to_message and startswith_prefix(this_text, prefix=[PREFIX.CONVERT]) else message
64 trigger_info = parse_msg(trigger_msg, silent=True)
65
66 # skip non document message
67 if not trigger_msg:
68 return None
69 if trigger_info["mtype"] not in ["document"]:
70 return None
71
72 # always trigger if the message has "/convert" prefix
73 if startswith_prefix(this_text, prefix=[PREFIX.CONVERT]):
74 return trigger_msg
75
76 return trigger_msg