fix(bot): 🐛 Replies not working on unflushed messages.
This commit is contained in:
@@ -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()
|
||||
|
||||
|
||||
@@ -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 = (
|
||||
|
||||
@@ -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"
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user