From 887f61248641a8ab257e47890a4a500272e15694 Mon Sep 17 00:00:00 2001 From: Klemek Date: Tue, 1 Jun 2021 12:08:33 +0200 Subject: [PATCH] cleaning => set --- src/logs/channel_logs.py | 34 +++++++++++----------------------- src/logs/message_log.py | 6 ++++++ 2 files changed, 17 insertions(+), 23 deletions(-) diff --git a/src/logs/channel_logs.py b/src/logs/channel_logs.py index 686aea5..75ff6b8 100644 --- a/src/logs/channel_logs.py +++ b/src/logs/channel_logs.py @@ -38,11 +38,11 @@ class ChannelLogs: and channel["first_message_id"] is not None else None ) - self.messages = [ + self.messages = { MessageLog(message, self) for message in channel["messages"] - ] + } self.start_date = ( - self.messages[-1].created_at if len(self.messages) > 0 else None + self.sorted_messages[0].created_at if len(self.messages) > 0 else None ) def is_format(self): @@ -51,7 +51,10 @@ class ChannelLogs: def preload(self, channel: discord.TextChannel): self.name = channel.name self.channel = channel - self.clean() + + @property + def sorted_messages(self): + return sorted(self.messages) @property def nsfw(self): @@ -99,14 +102,13 @@ class ChannelLogs: first_message_date = message.created_at m = MessageLog(message, self) await m.load(message) - if m not in self.messages: - self.messages += [m] + self.messages.add(m) yield len(self.messages), False if done < CHUNK_SIZE: # reached bottom self.first_message_id = None self.last_message_id = channel.last_message_id # load forward - last_message_date = self.messages[0].created_at + last_message_date = self.sorted_messages[-1].created_at if not is_empty and (stop_date is None or last_message_date < stop_date): tmp_message_id = None while ( @@ -123,30 +125,16 @@ class ChannelLogs: self.last_message_id = message.id m = MessageLog(message, self) await m.load(message) - if m not in self.messages: - self.messages.insert(0, m) + self.messages.add(m) yield len(self.messages), False except discord.errors.HTTPException as e: yield -1, True return # When an exception occurs (like Forbidden) self.start_date = ( - self.messages[-1].created_at if len(self.messages) > 0 else None + self.sorted_messages[0].created_at if len(self.messages) > 0 else None ) - self.clean() yield len(self.messages), True - def clean(self): - ids = [] - count = 0 - for message in self.messages: - if message.id in ids: - self.messages.remove(message) - count += 1 - else: - ids += [message.id] - if count > 0: - logging.info(f"log {self.guild.id}.{self.id} > cleaned {count} messages") - def dict(self) -> dict: channel = serialize(self, not_serialized=["channel", "guild", "start_date"]) channel["messages"] = [message.dict() for message in self.messages] diff --git a/src/logs/message_log.py b/src/logs/message_log.py index cebc588..8146e3a 100644 --- a/src/logs/message_log.py +++ b/src/logs/message_log.py @@ -66,6 +66,12 @@ class MessageLog: def __eq__(self, other: object) -> bool: return isinstance(other, self.__class__) and other.id == self.id + def __gt__(self, other: 'MessageLog') -> bool: + return self.created_at > other.created_at + + def __hash__(self) -> int: + return self.id + async def load(self, message: discord.Message): for reaction in message.reactions: self.reactions[str(reaction.emoji)] = []