import io
import logging
import os
import traceback
from PIL import Image
from telegram import Update
from telegram.constants import ParseMode
from telegram.ext import Application, CommandHandler, ContextTypes, MessageHandler, filters
from square import square_size_padding
# Enable logging
logging.basicConfig(
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s", level=logging.INFO
)
logger = logging.getLogger(__name__)
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
await update.message.reply_text("This is a bot to output image in square shape")
async def process(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
chat_id = update.message.chat_id
filename = update.message.document.file_name
names = filename.split(".")
if str.upper(names[1]) in ("JPG", "JPEG"):
save_format = "JPEG"
elif str.upper(names[1]) in ("PNG",):
save_format = str.upper(names[1])
else:
await context.bot.send_message(chat_id, "Image extension `{}` not supported".format(names[1]),
parse_mode=ParseMode.MARKDOWN_V2)
return
await context.bot.send_message(chat_id, "Processing `{}`".format(filename),
parse_mode=ParseMode.MARKDOWN_V2)
file = await update.message.effective_attachment.get_file()
img = io.BytesIO()
await file.download_to_memory(img)
try:
im = Image.open(img)
result = square_size_padding(im)
output = io.BytesIO()
result.save(output, format=save_format, quality=100)
await update.message.reply_markdown_v2(text="Sending processed result")
await context.bot.send_document(chat_id=update.message.chat_id,
filename="{}-result.{}".format(names[0], names[1]),
document=output.getvalue())
except Exception as e:
await update.message.reply_markdown_v2(text="Error:\n```{}```".format(traceback.format_exc()))
def main() -> None:
tg_token = os.getenv("TG_TOKEN")
application = Application.builder().token(tg_token).build()
application.add_handler(CommandHandler("start", start))
application.add_handler(MessageHandler(filters.ATTACHMENT & ~filters.COMMAND, process))
application.run_polling()
if __name__ == "__main__":
main()