from abc import ABC, abstractmethod from enum import Enum from discord import Message 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, raw_message: object): self.raw_message = raw_message self.message: IClientMessage = None def create_message(self) -> ClientMessage: self.set_content() \ .set_author_name() \ .set_image_urls() return self.message @abstractmethod def set_content(self): pass @abstractmethod def set_author_name(self): pass @abstractmethod def set_image_urls(self): pass class DiscordMessageBuilder(IMessageBuilder): def __init__(self, raw_message: Message): self.raw_message = raw_message self.message = ClientMessage() def create_message(self) -> ClientMessage: return super().create_message() def set_author_name(self) -> 'DiscordMessageBuilder': self.message.author_name = self.raw_message.author.name return self def set_content(self) -> 'DiscordMessageBuilder': self.message.content = self.raw_message.content return self def set_image_urls(self) -> 'DiscordMessageBuilder': self.message.image_urls = [ i.url for i in self.raw_message.attachments if i.content_type in ('image/jpeg', 'image/png', 'image/webp', 'image/gif') ] return self class MessengerTypes(Enum): DISCORD = DiscordMessageBuilder if __name__ == "__main__": class TestAuthor: name = 'John Doe' class TestMessage: content = 'Hello!' author = TestAuthor() message = DiscordMessageBuilder(raw_message=TestMessage).create_message() print(message.__dict__)