import tkinter as tk import emoji from PIL import Image, ImageTk import io import base64 class MessageView(tk.Frame): """ This view is the message that appears in main windows of the chat. This is configured to hold text and images. """ 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 = None if is_sent_by_current_user: sender_name = self.current_logged_user['username'] else: sender_name = self.user_data['username'] message_frame = tk.Frame(self) # Set a background color for the message frame message_label = None image_label = None 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') 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): # Assume encoded_image is a base64-encoded image decoded_image = base64.b64decode(encoded_image) image = Image.open(io.BytesIO(decoded_image)) image = ImageTk.PhotoImage(image) return image