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