from abc import ABC, abstractmethod from enum import Enum from discord import Message, Attachment class IClientMessage(ABC): @abstractmethod def __init__(self): pass class ClientMessage(IClientMessage): def __init__(self): self.author_name: str = '' self.content: str = '' self.image_urls: list = [] class IMessageBuilder(ABC): @abstractmethod def __init__(self): pass @abstractmethod def set_content(self, value: str): pass @abstractmethod def set_author_name(self, value: str): pass @abstractmethod def set_image_urls(self, value: list[str]): pass class DiscordMessageBuilder(IMessageBuilder): def __init__(self, message: IClientMessage): self.message = message def set_author_name(self, value: str): self.message.author_name = value return self def set_content(self, value: str): self.message.content = value return self def set_image_urls(self, value: list[str]): self.message.image_urls = value return self class IMessageAdapter(ABC): @abstractmethod def create_message(self, message: object) -> IClientMessage: pass @staticmethod def validate_image_urls(urls_list: list[Attachment]) -> list[str]: supported_image_formats = ('image/jpeg', 'image/png', 'image/webp', 'image/gif') return [i_attachment.url for i_attachment in urls_list if i_attachment.content_type in supported_image_formats] class DiscordMessageAdapter(IMessageAdapter): def create_message(self, message: Message) -> IClientMessage: client_message = ClientMessage() message_builder = DiscordMessageBuilder(client_message) urls_list = self.validate_image_urls(message.attachments) message_builder.set_content(message.content)\ .set_author_name(message.author.name)\ .set_image_urls(urls_list) return client_message if __name__ == "__main__": pass