diff --git a/carbon/main.py b/carbon/main.py new file mode 100644 index 00000000..467e6675 --- /dev/null +++ b/carbon/main.py @@ -0,0 +1,48 @@ +import os +from io import BytesIO + + +from pagermaid.enums import AsyncClient, Message +from pagermaid.listener import listener +from pagermaid.utils import lang + + +async def make_carbon(code: str, client: AsyncClient) -> BytesIO: + url = "https://carbonara.solopov.dev/api/cook" + resp = await client.post(url, json={"code": code}, timeout=60.0) + image = BytesIO(resp.read()) + image.name = "carbon.png" + return image + + +async def get_from_file(message: Message) -> str: + msg = None + reply = message.reply_to_message + if message.document and message.document.mime_type.startswith("text"): + msg = message + elif reply.document and reply.document.mime_type.startswith("text"): + msg = reply + if msg: + path = await msg.download() + try: + with open(path, "r", encoding="utf-8") as f: + text = f.read() + except UnicodeDecodeError: + return "" + finally: + os.remove(path) + return text + + +@listener(command="carbon", description="Take an image of code snippet.", parameters="code") +async def carbon_func(client: AsyncClient, message: Message): + code = await get_from_file(message) + if not code: + code = message.obtain_message() + if not code: + return await message.edit(lang("arg_error")) + message = await message.edit("`Preparing Carbon . . .`") + carbon = await make_carbon(code, client) + message = await message.edit("`Uploading . . .`") + await message.reply_photo(carbon, quote=False) + await message.safe_delete()