@@ -1,5 +1,12 @@
from telegram.ext import Updater, MessageHandler, Filters, CallbackContext
from telegram import Update,Message
from telegram.ext import (
Updater,
MessageHandler,
Filters,
CallbackContext,
ConversationHandler,
CommandHandler,
)
from telegram import Update, Message, ReplyKeyboardMarkup, ReplyKeyboardRemove, File
import json
import sys
import io
@@ -8,8 +15,10 @@ from PIL import Image
from overlay import overlay
logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
level=logging.INFO)
logging.basicConfig(
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s", level=logging.INFO
)
def overlay_photo(update: Update, context: CallbackContext):
try:
@@ -25,7 +34,11 @@ def overlay_photo(update: Update, context: CallbackContext):
output.seek(0)
context.bot.send_photo(chat_id=update.effective_chat.id, photo=output)
except:
context.bot.send_message(chat_id=update.effective_chat.id, text="Something went wrong. That might not have been an image.")
context.bot.send_message(
chat_id=update.effective_chat.id,
text="Something went wrong. That might not have been an image.",
)
def overlay_document(update: Update, context: CallbackContext):
try:
@@ -41,10 +54,102 @@ def overlay_document(update: Update, context: CallbackContext):
output.seek(0)
context.bot.send_document(chat_id=update.effective_chat.id, document=output)
except:
context.bot.send_message(chat_id=update.effective_chat.id, text="Something went wrong. That might not have been an image.")
context.bot.send_message(
chat_id=update.effective_chat.id,
text="Something went wrong. That might not have been an image.",
)
def echo(update: Update, context: CallbackContext):
context.bot.send_message(chat_id=update.effective_chat.id, text="Send an image (inline or as a file). You can customize the text by adding a caption.")
context.bot.send_message(
chat_id=update.effective_chat.id,
text="Send an image (inline or as a file). You can customize the text by adding a caption. Alternatively, use the /caption command to choose the image, text, and color.",
)
IMAGE, TEXT, COLOR = range(3)
def start_overlay(update: Update, context: CallbackContext) -> int:
"""Begins the overlay process."""
update.message.reply_text("First, send the image." "\n\n" "Send /cancel to stop.")
return IMAGE
def receive_image(update: Update, context: CallbackContext) -> int:
"""Receives the image to add text to."""
user = update.message.from_user
image = update.message.photo[-1].get_file()
context.user_data["image"] = image
logging.info("Received photo from %s", user.first_name)
update.message.reply_text("Next, send the caption.")
return TEXT
def receive_text(update: Update, context: CallbackContext) -> int:
"""Receives the caption to put on the image."""
user = update.message.from_user
text = update.message.text
context.user_data["text"] = text
options = [["Red", "Gold"]]
logging.info("Received text from %s", user.first_name)
update.message.reply_text(
"Finally, what color do you want?",
reply_markup=ReplyKeyboardMarkup(
options, one_time_keyboard=True, input_field_placeholder="Color"
),
)
return COLOR
def receive_color(update: Update, context: CallbackContext) -> int:
"""Receives the color for the caption."""
user = update.message.from_user
color = update.message.text
logging.info("Received color from %s", user.first_name)
image: File = context.user_data["image"]
text: str = context.user_data["text"]
try:
bytes = image.download_as_bytearray()
image = Image.open(io.BytesIO(bytes))
color_rgb = (200, 25, 25)
if color == "Gold":
color_rgb = (255, 255, 108)
overlayed = overlay(image, text, color_rgb).convert("RGB")
output = io.BytesIO()
overlayed.save(output, "JPEG")
output.seek(0)
context.bot.send_photo(chat_id=update.effective_chat.id, photo=output)
except:
context.bot.send_message(
chat_id=update.effective_chat.id,
text="Something went wrong. That might not have been an image.",
)
update.message.reply_text("Done!", reply_markup=ReplyKeyboardRemove())
return ConversationHandler.END
def cancel_overlay(update: Update, context: CallbackContext) -> int:
"""Cancels the overlay process."""
user = update.message.from_user
logging.info("Canceled overlay for %s", user.first_name)
update.message.reply_text("Cancelled.", reply_markup=ReplyKeyboardRemove())
return ConversationHandler.END
if __name__ == "__main__":
try:
@@ -59,8 +164,20 @@ if __name__ == "__main__":
overlay_document_handler = MessageHandler(Filters.document, overlay_document)
echo_handler = MessageHandler(Filters.text, echo)
conv_handler = ConversationHandler(
entry_points=[CommandHandler("caption", start_overlay)],
states={
IMAGE: [MessageHandler(Filters.photo, receive_image)],
TEXT: [MessageHandler(Filters.text, receive_text)],
COLOR: [MessageHandler(Filters.regex("^(Red|Gold)$"), receive_color)],
},
fallbacks=[CommandHandler("cancel", cancel_overlay)],
)
dispatcher.add_handler(conv_handler)
dispatcher.add_handler(overlay_photo_handler)
dispatcher.add_handler(overlay_document_handler)
dispatcher.add_handler(echo_handler)
updater.start_polling()
updater.start_polling()