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 enum import Enum
from discord import Message
from discord import Message, Attachment
class IClientMessage(ABC):
@ -18,68 +18,60 @@ class ClientMessage(IClientMessage):
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):
def __init__(self):
pass
@abstractmethod
def set_author_name(self):
def set_content(self, value: str):
pass
@abstractmethod
def set_image_urls(self):
def set_author_name(self, value: str):
pass
@abstractmethod
def set_image_urls(self, value: list[str]):
pass
class DiscordMessageBuilder(IMessageBuilder):
def __init__(self, raw_message: Message):
self.raw_message = raw_message
self.message = ClientMessage()
def __init__(self, message: IClientMessage):
self.message = message
def create_message(self) -> ClientMessage:
return super().create_message()
def set_author_name(self) -> 'DiscordMessageBuilder':
self.message.author_name = self.raw_message.author.name
def set_author_name(self, value: str):
self.message.author_name = value
return self
def set_content(self) -> 'DiscordMessageBuilder':
self.message.content = self.raw_message.content
def set_content(self, value: str):
self.message.content = value
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')
]
def set_image_urls(self, value: list[str]):
self.message.image_urls = value
return self
class MessengerTypes(Enum):
DISCORD = DiscordMessageBuilder
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__":
class TestAuthor:
name = 'John Doe'
class TestMessage:
content = 'Hello!'
author = TestAuthor()
attachments = []
message = DiscordMessageBuilder(raw_message=TestMessage).create_message()
print(message.__dict__)
pass