Created DiscordMessageAdapter for creating ClientMessage instance instead of a builder's class method

This commit is contained in:
T-BENZIN 2025-08-25 12:32:35 +05:00
parent 4fd5e06eaa
commit bd6a55cd85

View File

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