fix(bot): 🐛 Replies not working on unflushed messages.
This commit is contained in:
@@ -51,7 +51,7 @@ class Calls(base.Cog):
|
|||||||
pipe.delete(
|
pipe.delete(
|
||||||
constants.MESSAGES_QUEUE,
|
constants.MESSAGES_QUEUE,
|
||||||
constants.MESSAGE_CONTENTS_QUEUE,
|
constants.MESSAGE_CONTENTS_QUEUE,
|
||||||
constants.MESSAGES_TO_FLUSH_IDS,
|
constants.MESSAGES_PROPAGATION_MAP,
|
||||||
)
|
)
|
||||||
|
|
||||||
messages, message_contents, _ = await pipe.execute()
|
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()
|
await pipe.execute()
|
||||||
|
|
||||||
|
|||||||
@@ -2,8 +2,11 @@ import discord
|
|||||||
|
|
||||||
from tortoise import expressions
|
from tortoise import expressions
|
||||||
|
|
||||||
|
import orjson
|
||||||
|
|
||||||
from payphone.db import models
|
from payphone.db import models
|
||||||
from payphone.core import constants, formatting
|
from payphone.core import constants, formatting
|
||||||
|
from payphone.core.redis import redis
|
||||||
|
|
||||||
|
|
||||||
async def ReplyEmbed(
|
async def ReplyEmbed(
|
||||||
@@ -20,30 +23,66 @@ async def ReplyEmbed(
|
|||||||
message.
|
message.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
message = (
|
message = None
|
||||||
await models.Message.get_or_none(
|
|
||||||
expressions.Q(id=reference.message_id)
|
unflushed_propagation_to_message_id = await redis.hget(
|
||||||
| expressions.Q(propagation_id=reference.message_id),
|
constants.MESSAGES_PROPAGATION_MAP, reference.message_id
|
||||||
call_id=call_id,
|
|
||||||
)
|
|
||||||
.prefetch_related("contents")
|
|
||||||
.select_related("profile", "channel", "propagation_channel")
|
|
||||||
)
|
)
|
||||||
|
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:
|
if message is None:
|
||||||
return None, None
|
return None, None
|
||||||
|
|
||||||
is_this_channel = message.id == reference.message_id
|
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.message_id < content.message_id:
|
||||||
if last_content is None:
|
last_content = content
|
||||||
last_content = content
|
|
||||||
continue
|
|
||||||
|
|
||||||
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_name = message.display_name if is_this_channel else message.profile.name
|
||||||
author_avatar_url = (
|
author_avatar_url = (
|
||||||
|
|||||||
@@ -172,7 +172,7 @@ CHANNELS_SEARCH_QUEUE = "channels:searching"
|
|||||||
CHANNELS_ONCALL_SET = "channels:on-call"
|
CHANNELS_ONCALL_SET = "channels:on-call"
|
||||||
MESSAGES_QUEUE = "messages"
|
MESSAGES_QUEUE = "messages"
|
||||||
MESSAGE_CONTENTS_QUEUE = "message-contents"
|
MESSAGE_CONTENTS_QUEUE = "message-contents"
|
||||||
MESSAGES_TO_FLUSH_IDS = "message-ids"
|
MESSAGES_PROPAGATION_MAP = "messages-propagation"
|
||||||
BAN_TEMPLATE = "b:%s"
|
BAN_TEMPLATE = "b:%s"
|
||||||
PREFIX_TEMPLATE = "p:%s"
|
PREFIX_TEMPLATE = "p:%s"
|
||||||
|
|
||||||
|
|||||||
@@ -219,6 +219,7 @@ class Message(models.Model):
|
|||||||
profile: fields.ForeignKeyRelation["Profile"] = fields.ForeignKeyField(
|
profile: fields.ForeignKeyRelation["Profile"] = fields.ForeignKeyField(
|
||||||
"models.Profile", on_delete=fields.OnDelete.CASCADE
|
"models.Profile", on_delete=fields.OnDelete.CASCADE
|
||||||
)
|
)
|
||||||
|
profile_id: int
|
||||||
replying_to: fields.ForeignKeyNullableRelation["Message"] = fields.ForeignKeyField(
|
replying_to: fields.ForeignKeyNullableRelation["Message"] = fields.ForeignKeyField(
|
||||||
"models.Message",
|
"models.Message",
|
||||||
related_name="replies",
|
related_name="replies",
|
||||||
@@ -234,6 +235,7 @@ class Message(models.Model):
|
|||||||
"models.Channel", related_name="propagated_messages", null=True
|
"models.Channel", related_name="propagated_messages", null=True
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
propagation_channel_id: int
|
||||||
created_at = fields.DatetimeField(auto_now_add=True)
|
created_at = fields.DatetimeField(auto_now_add=True)
|
||||||
contents: fields.BackwardFKRelation["MessageContent"]
|
contents: fields.BackwardFKRelation["MessageContent"]
|
||||||
|
|
||||||
@@ -311,6 +313,7 @@ class MessageContent(models.Model):
|
|||||||
message = fields.ForeignKeyField(
|
message = fields.ForeignKeyField(
|
||||||
"models.Message", related_name="contents", on_delete=fields.OnDelete.CASCADE
|
"models.Message", related_name="contents", on_delete=fields.OnDelete.CASCADE
|
||||||
)
|
)
|
||||||
|
message_id: int
|
||||||
content = fields.CharField(max_length=4096)
|
content = fields.CharField(max_length=4096)
|
||||||
was_propagated = fields.BooleanField(default=True)
|
was_propagated = fields.BooleanField(default=True)
|
||||||
created_at = fields.DatetimeField(auto_now_add=True)
|
created_at = fields.DatetimeField(auto_now_add=True)
|
||||||
|
|||||||
Reference in New Issue
Block a user