82 lines
2.7 KiB
Python
82 lines
2.7 KiB
Python
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
|