PagerMaid_Plugins_Pyro/qr/main.py
xtaodada fb5a3f5baf
All checks were successful
Github commit to telegram / build (push) Successful in 13s
♻️ Reformat All Plugins
2024-09-28 22:35:08 +08:00

82 lines
2.6 KiB
Python

""" QR Code related utilities. """
from PIL import Image
from pagermaid.config import Config
from pagermaid.enums import Client, Message
from pagermaid.listener import listener
from pagermaid.utils import lang, pip_install, safe_remove
from pagermaid.utils.bot_utils import log
pip_install("pyqrcode")
pip_install("pypng")
pip_install("pyzbar")
from pyqrcode import create
@listener(
is_plugin=False,
outgoing=True,
command="genqr",
description=lang("genqr_des"),
parameters="[string]",
)
async def gen_qr(client: Client, message: Message):
"""Generate QR codes."""
text = message.obtain_message()
if not text:
await message.edit(lang("error_prefix"))
return
if not Config.SILENT:
await message.edit(lang("genqr_process"))
try:
create(text, error="L", encoding="utf-8", mode="binary").png("qr.webp", scale=6)
await client.send_document(
message.chat.id,
document="qr.webp",
reply_to_message_id=message.reply_to_message_id,
message_thread_id=message.message_thread_id,
)
except UnicodeEncodeError:
await message.edit(f"{lang('error_prefix')}{lang('genqr_e_encode')}")
return
except Exception as e:
await message.edit(f"{lang('error_prefix')}\n{e}")
return
finally:
safe_remove("qr.webp")
await message.safe_delete()
await log(f"`{text}` {lang('genqr_ok')}")
@listener(
is_plugin=False, outgoing=True, command="parseqr", description=lang("parseqr_des")
)
async def parse_qr(message: Message):
"""Parse attachment of replied message as a QR Code and output results."""
try:
from pyzbar.pyzbar import decode as pyzbar_decode
except ImportError:
await message.edit(f"{lang('error_prefix')}请先在系统中安装 zbar 库。")
return
success = False
reply = message.reply_to_message
if message.document or message.photo or message.sticker:
target_file_path = await message.download()
elif reply and (reply.document or reply.photo or reply.sticker):
target_file_path = await reply.download()
else:
return await message.edit(f"{lang('error_prefix')}{lang('parseqr_nofile')}")
try:
text = str(pyzbar_decode(Image.open(target_file_path))[0].data)[2:][:-1]
success = True
await message.edit(f"**{lang('parseqr_content')}: **\n" f"`{text}`")
except Exception:
await message.edit(f"{lang('error_prefix')}{lang('parseqr_e_noqr')}")
text = None
finally:
safe_remove(target_file_path)
if success:
await log(f"{lang('parseqr_log')} `{text}`.")