From 1da2c57376961d38be9ed3cdea7f78dc9d7a6ae2 Mon Sep 17 00:00:00 2001 From: ouwou <26526779+ouwou@users.noreply.github.com> Date: Tue, 16 Nov 2021 02:37:12 -0500 Subject: [PATCH] fix retrieving message references and also add a reset statement i forgot (raii might be good here...) --- components/chatmessage.cpp | 20 +++++++++++----- discord/store.cpp | 49 ++++++++++++++++++++++++-------------- 2 files changed, 45 insertions(+), 24 deletions(-) diff --git a/components/chatmessage.cpp b/components/chatmessage.cpp index af68a9d..b7d61a8 100644 --- a/components/chatmessage.cpp +++ b/components/chatmessage.cpp @@ -657,6 +657,14 @@ Gtk::Widget *ChatMessageItemContainer::CreateReplyComponent(const Message &data) return author->GetEscapedBoldString(); }; + // if the message wasnt fetched from store it might have an un-fetched reference + std::optional> referenced_message = data.ReferencedMessage; + if (data.MessageReference.has_value() && data.MessageReference->MessageID.has_value() && !referenced_message.has_value()) { + auto refd = discord.GetMessage(*data.MessageReference->MessageID); + if (refd.has_value()) + referenced_message = std::make_shared(std::move(*refd)); + } + if (data.Interaction.has_value()) { const auto user = *discord.GetUser(data.Interaction->User.ID); @@ -668,16 +676,16 @@ Gtk::Widget *ChatMessageItemContainer::CreateReplyComponent(const Message &data) } else { lbl->set_markup(user.GetEscapedBoldString()); } - } else if (data.ReferencedMessage.has_value()) { - if (data.ReferencedMessage.value().get() == nullptr) { + } else if (referenced_message.has_value()) { + if (referenced_message.value() == nullptr) { lbl->set_markup("deleted message"); } else { - const auto &referenced = *data.ReferencedMessage.value().get(); + const auto &referenced = *referenced_message.value(); Glib::ustring text; - if (referenced.Content == "") { - if (referenced.Attachments.size() > 0) { + if (referenced.Content.empty()) { + if (!referenced.Attachments.empty()) { text = "attachment"; - } else if (referenced.Embeds.size() > 0) { + } else if (!referenced.Embeds.empty()) { text = "embed"; } } else { diff --git a/discord/store.cpp b/discord/store.cpp index a119869..8e88e7b 100644 --- a/discord/store.cpp +++ b/discord/store.cpp @@ -484,10 +484,6 @@ std::vector Store::GetLastMessages(Snowflake id, size_t num) const { s->Bind(2, num); while (s->FetchOne()) { auto msg = GetMessageBound(s); - if (!s->IsNull(33)) { // referenced message id - msg.MessageReference.emplace(); - s->Get(33, msg.MessageReference->MessageID); - } msgs.push_back(std::move(msg)); } @@ -515,10 +511,6 @@ std::vector Store::GetMessagesBefore(Snowflake channel_id, Snowflake me while (s->FetchOne()) { auto msg = GetMessageBound(s); - if (!s->IsNull(33)) { // referenced message id - msg.MessageReference.emplace(); - s->Get(33, msg.MessageReference->MessageID); - } msgs.push_back(std::move(msg)); } @@ -544,10 +536,6 @@ std::vector Store::GetPinnedMessages(Snowflake channel_id) const { while (s->FetchOne()) { auto msg = GetMessageBound(s); - if (!s->IsNull(33)) { // referenced message id - msg.MessageReference.emplace(); - s->Get(33, msg.MessageReference->MessageID); - } msgs.push_back(std::move(msg)); } @@ -843,6 +831,8 @@ std::optional Store::GetMessage(Snowflake id) const { auto ref = GetMessageBound(s); top.ReferencedMessage = std::make_shared(std::move(ref)); + s->Reset(); + return top; } @@ -893,6 +883,13 @@ Message Store::GetMessageBound(std::unique_ptr &s) const { s->Get(31, a.Width); } + if (!s->IsNull(32)) { + auto &q = r.MessageReference.emplace(); + s->Get(32, q.MessageID); + s->Get(33, q.ChannelID); + s->Get(34, q.GuildID); + } + { auto &s = m_stmt_get_mentions; s->Bind(1, r.ID); @@ -1581,7 +1578,10 @@ bool Store::CreateStatements() { attachments.url, attachments.proxy, attachments.height, - attachments.width + attachments.width, + message_references.message, + message_references.channel, + message_references.guild FROM messages LEFT OUTER JOIN message_interactions @@ -1589,7 +1589,10 @@ bool Store::CreateStatements() { LEFT OUTER JOIN attachments ON messages.id = attachments.message - WHERE messages.id = ? + LEFT OUTER JOIN + message_references + ON messages.id = message_references.id + WHERE messages.id = ?1 UNION ALL SELECT messages.*, message_interactions.interaction_id, @@ -1602,7 +1605,10 @@ bool Store::CreateStatements() { attachments.url, attachments.proxy, attachments.height, - attachments.width + attachments.width, + message_references.message, + message_references.channel, + message_references.guild FROM messages LEFT OUTER JOIN message_interactions @@ -1610,7 +1616,10 @@ bool Store::CreateStatements() { LEFT OUTER JOIN attachments ON messages.id = attachments.message - WHERE messages.id = (SELECT message FROM message_references WHERE id = ?) + LEFT OUTER JOIN + message_references + ON messages.id = message_references.id + WHERE messages.id = (SELECT message FROM message_references WHERE id = ?1) ORDER BY messages.id DESC )"); if (!m_stmt_get_msg->OK()) { @@ -1642,7 +1651,9 @@ bool Store::CreateStatements() { attachments.proxy, attachments.height, attachments.width, - message_references.message + message_references.message, + message_references.channel, + message_references.guild FROM messages LEFT OUTER JOIN message_interactions @@ -1940,7 +1951,9 @@ bool Store::CreateStatements() { attachments.proxy, attachments.height, attachments.width, - message_references.message + message_references.message, + message_references.channel, + message_references.guild FROM messages LEFT OUTER JOIN message_interactions