import tkinter as tk from PIL import Image, ImageTk, UnidentifiedImageError import io import base64 import emoji class MessageView(tk.Frame): def __init__(self, master, message, current_logged_user, user_data, *args, **kwargs): super().__init__(master, *args, **kwargs) self.current_logged_user = current_logged_user self.user_data = user_data self.create_widgets(message) def create_widgets(self, message): is_sent_by_current_user = 1 sender_name = ( self.current_logged_user["username"] if is_sent_by_current_user else self.user_data["username"] ) message_frame = tk.Frame(self) pack = None match message["message_type"]: case "text": decoded_message = self.decode_emoji( f"sender: {sender_name}\nmessage: {message['message']}" ) pack = tk.Label(message_frame, text=decoded_message, bg="white") self.decoded_message = decoded_message # Keep a reference to prevent garbage collection case "image": decoded_image = self.decode_image(message["message"]) pack = tk.Label(message_frame, image=decoded_image) pack.image = decoded_image # Keep a reference to prevent garbage collection pack.pack() if is_sent_by_current_user: alignment = "right" else: alignment = "left" message_frame.pack(side=alignment, padx=5, pady=5) def decode_emoji(self, message): emoji_mapping = { ":)": "😊", ":(": "â˜šī¸", ":D": "😃", ":P": "😛", ";)": "😉", "XD": "😆", "<3": "â¤ī¸", "O:)": "😇", ":/": "😕", ":*": "😘", "8)": "😎", } for emoji_string, unicode_character in emoji_mapping.items(): message = message.replace(emoji_string, unicode_character) return message def decode_image(self, encoded_image): try: decoded_image = base64.b64decode(encoded_image) image_io = io.BytesIO(decoded_image) original_image = Image.open(image_io) resized_image = original_image.resize((100, 100), Image.ADAPTIVE) self.image = resized_image image = ImageTk.PhotoImage(self.image) return image except UnidentifiedImageError as e: print(f"Error decoding image: {e}") return None except Exception as e: print(f"Unexpected error: {e}") return None