From d030d0c63a13e1bba9beaff21a15a994de7fcd75 Mon Sep 17 00:00:00 2001 From: "Nyeki.py" <84998222+Nekidev@users.noreply.github.com> Date: Sat, 19 Oct 2024 22:47:50 -0300 Subject: [PATCH] fix(bot): :bug: Replies not working on unflushed messages. --- payphone/cogs/calls/cog.py | 10 ++++- payphone/cogs/calls/embeds.py | 71 +++++++++++++++++++++++++++-------- payphone/core/constants.py | 2 +- payphone/db/models.py | 3 ++ 4 files changed, 67 insertions(+), 19 deletions(-) diff --git a/payphone/cogs/calls/cog.py b/payphone/cogs/calls/cog.py index 5b325ae..45a684f 100644 --- a/payphone/cogs/calls/cog.py +++ b/payphone/cogs/calls/cog.py @@ -51,7 +51,7 @@ class Calls(base.Cog): pipe.delete( constants.MESSAGES_QUEUE, constants.MESSAGE_CONTENTS_QUEUE, - constants.MESSAGES_TO_FLUSH_IDS, + constants.MESSAGES_PROPAGATION_MAP, ) messages, message_contents, _ = await pipe.execute() @@ -830,7 +830,13 @@ class Calls(base.Cog): } ), ) - pipe.sadd(constants.MESSAGES_TO_FLUSH_IDS, message.id) + + if webhook_message is not None: + pipe.hset( + constants.MESSAGES_PROPAGATION_MAP, + webhook_message.id, + message.id + ) await pipe.execute() diff --git a/payphone/cogs/calls/embeds.py b/payphone/cogs/calls/embeds.py index 35dea3d..db0005a 100644 --- a/payphone/cogs/calls/embeds.py +++ b/payphone/cogs/calls/embeds.py @@ -2,8 +2,11 @@ import discord from tortoise import expressions +import orjson + from payphone.db import models from payphone.core import constants, formatting +from payphone.core.redis import redis async def ReplyEmbed( @@ -20,30 +23,66 @@ async def ReplyEmbed( message. """ - message = ( - await models.Message.get_or_none( - expressions.Q(id=reference.message_id) - | expressions.Q(propagation_id=reference.message_id), - call_id=call_id, - ) - .prefetch_related("contents") - .select_related("profile", "channel", "propagation_channel") + message = None + + unflushed_propagation_to_message_id = await redis.hget( + constants.MESSAGES_PROPAGATION_MAP, reference.message_id ) + unflushed_message = None + unflushed_message_content = None + last_content: models.MessageContent | None = None + + if unflushed_propagation_to_message_id is not None: + unflushed_message = await redis.hget( + constants.MESSAGES_QUEUE, unflushed_propagation_to_message_id + ) + + if unflushed_message is not None: + unflushed_message_content = await redis.hget( + constants.MESSAGE_CONTENTS_QUEUE, unflushed_propagation_to_message_id + ) + + else: + unflushed_message = await redis.hget( + constants.MESSAGES_QUEUE, reference.message_id + ) + + if unflushed_message is not None: + unflushed_message_content = await redis.hget( + constants.MESSAGE_CONTENTS_QUEUE, reference.message_id + ) + + if unflushed_message is not None: + message = models.Message(**orjson.loads(unflushed_message)) + last_content = models.MessageContent(**orjson.loads(unflushed_message_content)) + + message.profile = await models.Profile.get(id=message.profile_id) + message.propagation_channel = await models.Channel.get(id=message.propagation_channel_id) + + else: + message = ( + await models.Message.get_or_none( + expressions.Q(id=reference.message_id) + | expressions.Q(propagation_id=reference.message_id), + call_id=call_id, + ) + .prefetch_related("contents") + .select_related("profile", "channel", "propagation_channel") + ) if message is None: return None, None is_this_channel = message.id == reference.message_id - last_content: models.MessageContent | None = None + if last_content is None: + for content in message.contents: + if last_content is None: + last_content = content + continue - for content in message.contents: - if last_content is None: - last_content = content - continue - - if last_content.message_id < content.message_id: - last_content = content + if last_content.message_id < content.message_id: + last_content = content author_name = message.display_name if is_this_channel else message.profile.name author_avatar_url = ( diff --git a/payphone/core/constants.py b/payphone/core/constants.py index 91cb3cd..31a4789 100644 --- a/payphone/core/constants.py +++ b/payphone/core/constants.py @@ -172,7 +172,7 @@ CHANNELS_SEARCH_QUEUE = "channels:searching" CHANNELS_ONCALL_SET = "channels:on-call" MESSAGES_QUEUE = "messages" MESSAGE_CONTENTS_QUEUE = "message-contents" -MESSAGES_TO_FLUSH_IDS = "message-ids" +MESSAGES_PROPAGATION_MAP = "messages-propagation" BAN_TEMPLATE = "b:%s" PREFIX_TEMPLATE = "p:%s" diff --git a/payphone/db/models.py b/payphone/db/models.py index 1041b0a..e6f60cd 100644 --- a/payphone/db/models.py +++ b/payphone/db/models.py @@ -219,6 +219,7 @@ class Message(models.Model): profile: fields.ForeignKeyRelation["Profile"] = fields.ForeignKeyField( "models.Profile", on_delete=fields.OnDelete.CASCADE ) + profile_id: int replying_to: fields.ForeignKeyNullableRelation["Message"] = fields.ForeignKeyField( "models.Message", related_name="replies", @@ -234,6 +235,7 @@ class Message(models.Model): "models.Channel", related_name="propagated_messages", null=True ) ) + propagation_channel_id: int created_at = fields.DatetimeField(auto_now_add=True) contents: fields.BackwardFKRelation["MessageContent"] @@ -311,6 +313,7 @@ class MessageContent(models.Model): message = fields.ForeignKeyField( "models.Message", related_name="contents", on_delete=fields.OnDelete.CASCADE ) + message_id: int content = fields.CharField(max_length=4096) was_propagated = fields.BooleanField(default=True) created_at = fields.DatetimeField(auto_now_add=True)