mirror of
https://github.com/celisej567/abaddon.git
synced 2026-09-13 20:18:50 +03:00
reduce db access + refactor
This commit is contained in:
@@ -44,16 +44,14 @@ void ChatList::SetActiveChannel(Snowflake id) {
|
||||
m_active_channel = id;
|
||||
}
|
||||
|
||||
void ChatList::ProcessNewMessage(Snowflake id, bool prepend) {
|
||||
void ChatList::ProcessNewMessage(const Message &data, bool prepend) {
|
||||
auto &discord = Abaddon::Get().GetDiscordClient();
|
||||
if (!discord.IsStarted()) return;
|
||||
const auto data = discord.GetMessage(id);
|
||||
if (!data.has_value()) return;
|
||||
|
||||
// delete preview message when gateway sends it back
|
||||
if (!data->IsPending && data->Nonce.has_value() && data->Author.ID == discord.GetUserData().ID) {
|
||||
if (!data.IsPending && data.Nonce.has_value() && data.Author.ID == discord.GetUserData().ID) {
|
||||
for (auto [id, widget] : m_id_to_widget) {
|
||||
if (dynamic_cast<ChatMessageItemContainer *>(widget)->Nonce == *data->Nonce) {
|
||||
if (dynamic_cast<ChatMessageItemContainer *>(widget)->Nonce == *data.Nonce) {
|
||||
RemoveMessageAndHeader(widget);
|
||||
m_id_to_widget.erase(id);
|
||||
break;
|
||||
@@ -70,8 +68,8 @@ void ChatList::ProcessNewMessage(Snowflake id, bool prepend) {
|
||||
last_row = dynamic_cast<ChatMessageHeader *>(m_list.get_row_at_index(m_num_rows - 1));
|
||||
|
||||
if (last_row != nullptr) {
|
||||
const uint64_t diff = std::max(id, last_row->NewestID) - std::min(id, last_row->NewestID);
|
||||
if (last_row->UserID == data->Author.ID && (prepend || (diff < SnowflakeSplitDifference * Snowflake::SecondsInterval)))
|
||||
const uint64_t diff = std::max(data.ID, last_row->NewestID) - std::min(data.ID, last_row->NewestID);
|
||||
if (last_row->UserID == data.Author.ID && (prepend || (diff < SnowflakeSplitDifference * Snowflake::SecondsInterval)))
|
||||
should_attach = true;
|
||||
}
|
||||
}
|
||||
@@ -91,11 +89,11 @@ void ChatList::ProcessNewMessage(Snowflake id, bool prepend) {
|
||||
header = last_row;
|
||||
} else {
|
||||
const auto guild_id = *discord.GetChannel(m_active_channel)->GuildID;
|
||||
const auto user_id = data->Author.ID;
|
||||
const auto user_id = data.Author.ID;
|
||||
const auto user = discord.GetUser(user_id);
|
||||
if (!user.has_value()) return;
|
||||
|
||||
header = Gtk::manage(new ChatMessageHeader(&*data));
|
||||
header = Gtk::manage(new ChatMessageHeader(data));
|
||||
header->signal_action_insert_mention().connect([this, user_id]() {
|
||||
m_signal_action_insert_mention.emit(user_id);
|
||||
});
|
||||
@@ -107,22 +105,22 @@ void ChatList::ProcessNewMessage(Snowflake id, bool prepend) {
|
||||
m_num_rows++;
|
||||
}
|
||||
|
||||
auto *content = ChatMessageItemContainer::FromMessage(id);
|
||||
auto *content = ChatMessageItemContainer::FromMessage(data);
|
||||
if (content != nullptr) {
|
||||
header->AddContent(content, prepend);
|
||||
m_id_to_widget[id] = content;
|
||||
m_id_to_widget[data.ID] = content;
|
||||
|
||||
if (!data->IsPending) {
|
||||
content->signal_action_delete().connect([this, id] {
|
||||
if (!data.IsPending) {
|
||||
content->signal_action_delete().connect([this, id = data.ID] {
|
||||
m_signal_action_message_delete.emit(m_active_channel, id);
|
||||
});
|
||||
content->signal_action_edit().connect([this, id] {
|
||||
content->signal_action_edit().connect([this, id = data.ID] {
|
||||
m_signal_action_message_edit.emit(m_active_channel, id);
|
||||
});
|
||||
content->signal_action_reaction_add().connect([this, id](const Glib::ustring ¶m) {
|
||||
content->signal_action_reaction_add().connect([this, id = data.ID](const Glib::ustring ¶m) {
|
||||
m_signal_action_reaction_add.emit(id, param);
|
||||
});
|
||||
content->signal_action_reaction_remove().connect([this, id](const Glib::ustring ¶m) {
|
||||
content->signal_action_reaction_remove().connect([this, id = data.ID](const Glib::ustring ¶m) {
|
||||
m_signal_action_reaction_remove.emit(id, param);
|
||||
});
|
||||
content->signal_action_channel_click().connect([this](const Snowflake &id) {
|
||||
|
||||
@@ -13,7 +13,7 @@ public:
|
||||
void SetMessages(Iter begin, Iter end);
|
||||
template<typename Iter>
|
||||
void PrependMessages(Iter begin, Iter end);
|
||||
void ProcessNewMessage(Snowflake id, bool prepend);
|
||||
void ProcessNewMessage(const Message &data, bool prepend);
|
||||
void DeleteMessage(Snowflake id);
|
||||
void RefetchMessage(Snowflake id);
|
||||
Snowflake GetOldestListedMessage();
|
||||
|
||||
@@ -43,32 +43,29 @@ ChatMessageItemContainer::ChatMessageItemContainer() {
|
||||
m_link_menu.show_all();
|
||||
}
|
||||
|
||||
ChatMessageItemContainer *ChatMessageItemContainer::FromMessage(Snowflake id) {
|
||||
const auto data = Abaddon::Get().GetDiscordClient().GetMessage(id);
|
||||
if (!data.has_value()) return nullptr;
|
||||
|
||||
ChatMessageItemContainer *ChatMessageItemContainer::FromMessage(const Message &data) {
|
||||
auto *container = Gtk::manage(new ChatMessageItemContainer);
|
||||
container->ID = data->ID;
|
||||
container->ChannelID = data->ChannelID;
|
||||
container->ID = data.ID;
|
||||
container->ChannelID = data.ChannelID;
|
||||
|
||||
if (data->Nonce.has_value())
|
||||
container->Nonce = *data->Nonce;
|
||||
if (data.Nonce.has_value())
|
||||
container->Nonce = *data.Nonce;
|
||||
|
||||
if (data->Content.size() > 0 || data->Type != MessageType::DEFAULT) {
|
||||
container->m_text_component = container->CreateTextComponent(&*data);
|
||||
if (data.Content.size() > 0 || data.Type != MessageType::DEFAULT) {
|
||||
container->m_text_component = container->CreateTextComponent(data);
|
||||
container->AttachEventHandlers(*container->m_text_component);
|
||||
container->m_main->add(*container->m_text_component);
|
||||
}
|
||||
|
||||
if ((data->MessageReference.has_value() || data->Interaction.has_value()) && data->Type != MessageType::CHANNEL_FOLLOW_ADD) {
|
||||
auto *widget = container->CreateReplyComponent(*data);
|
||||
if ((data.MessageReference.has_value() || data.Interaction.has_value()) && data.Type != MessageType::CHANNEL_FOLLOW_ADD) {
|
||||
auto *widget = container->CreateReplyComponent(data);
|
||||
container->m_main->add(*widget);
|
||||
container->m_main->child_property_position(*widget) = 0; // eek
|
||||
}
|
||||
|
||||
// there should only ever be 1 embed (i think?)
|
||||
if (data->Embeds.size() == 1) {
|
||||
const auto &embed = data->Embeds[0];
|
||||
if (data.Embeds.size() == 1) {
|
||||
const auto &embed = data.Embeds[0];
|
||||
if (IsEmbedImageOnly(embed)) {
|
||||
auto *widget = container->CreateImageComponent(*embed.Thumbnail->ProxyURL, *embed.Thumbnail->URL, *embed.Thumbnail->Width, *embed.Thumbnail->Height);
|
||||
container->AttachEventHandlers(*widget);
|
||||
@@ -82,7 +79,7 @@ ChatMessageItemContainer *ChatMessageItemContainer::FromMessage(Snowflake id) {
|
||||
|
||||
// i dont think attachments can be edited
|
||||
// also this can definitely be done much better holy shit
|
||||
for (const auto &a : data->Attachments) {
|
||||
for (const auto &a : data.Attachments) {
|
||||
if (IsURLViewableImage(a.ProxyURL) && a.Width.has_value() && a.Height.has_value()) {
|
||||
auto *widget = container->CreateImageComponent(a.ProxyURL, a.URL, *a.Width, *a.Height);
|
||||
container->m_main->add(*widget);
|
||||
@@ -93,8 +90,8 @@ ChatMessageItemContainer *ChatMessageItemContainer::FromMessage(Snowflake id) {
|
||||
}
|
||||
|
||||
// only 1?
|
||||
if (data->Stickers.has_value()) {
|
||||
const auto &sticker = data->Stickers.value()[0];
|
||||
if (data.Stickers.has_value()) {
|
||||
const auto &sticker = data.Stickers.value()[0];
|
||||
// todo: lottie, proper apng
|
||||
if (sticker.FormatType == StickerFormatType::PNG || sticker.FormatType == StickerFormatType::APNG) {
|
||||
auto *widget = container->CreateStickerComponent(sticker);
|
||||
@@ -102,8 +99,8 @@ ChatMessageItemContainer *ChatMessageItemContainer::FromMessage(Snowflake id) {
|
||||
}
|
||||
}
|
||||
|
||||
if (data->Reactions.has_value() && data->Reactions->size() > 0) {
|
||||
container->m_reactions_component = container->CreateReactionsComponent(*data);
|
||||
if (data.Reactions.has_value() && data.Reactions->size() > 0) {
|
||||
container->m_reactions_component = container->CreateReactionsComponent(data);
|
||||
container->m_main->add(*container->m_reactions_component);
|
||||
}
|
||||
|
||||
@@ -183,10 +180,10 @@ void ChatMessageItemContainer::AddClickHandler(Gtk::Widget *widget, std::string
|
||||
// clang-format on
|
||||
}
|
||||
|
||||
Gtk::TextView *ChatMessageItemContainer::CreateTextComponent(const Message *data) {
|
||||
Gtk::TextView *ChatMessageItemContainer::CreateTextComponent(const Message &data) {
|
||||
auto *tv = Gtk::manage(new Gtk::TextView);
|
||||
|
||||
if (data->IsPending)
|
||||
if (data.IsPending)
|
||||
tv->get_style_context()->add_class("pending");
|
||||
tv->get_style_context()->add_class("message-text");
|
||||
tv->set_can_focus(false);
|
||||
@@ -1065,9 +1062,9 @@ void ChatMessageItemContainer::AttachEventHandlers(Gtk::Widget &widget) {
|
||||
widget.signal_button_press_event().connect(on_button_press_event, false);
|
||||
}
|
||||
|
||||
ChatMessageHeader::ChatMessageHeader(const Message *data) {
|
||||
UserID = data->Author.ID;
|
||||
ChannelID = data->ChannelID;
|
||||
ChatMessageHeader::ChatMessageHeader(const Message &data) {
|
||||
UserID = data.Author.ID;
|
||||
ChannelID = data.ChannelID;
|
||||
|
||||
m_main_box = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_HORIZONTAL));
|
||||
m_content_box = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_VERTICAL));
|
||||
@@ -1086,7 +1083,7 @@ ChatMessageHeader::ChatMessageHeader(const Message *data) {
|
||||
m_static_avatar = pb->scale_simple(AvatarSize, AvatarSize, Gdk::INTERP_BILINEAR);
|
||||
m_avatar->property_pixbuf() = m_static_avatar;
|
||||
};
|
||||
img.LoadFromURL(author->GetAvatarURL(data->GuildID), sigc::track_obj(cb, *this));
|
||||
img.LoadFromURL(author->GetAvatarURL(data.GuildID), sigc::track_obj(cb, *this));
|
||||
|
||||
if (author->HasAnimatedAvatar()) {
|
||||
auto cb = [this](const Glib::RefPtr<Gdk::PixbufAnimation> &pb) {
|
||||
@@ -1103,7 +1100,7 @@ ChatMessageHeader::ChatMessageHeader(const Message *data) {
|
||||
m_avatar->set_valign(Gtk::ALIGN_START);
|
||||
m_avatar->set_margin_right(10);
|
||||
|
||||
m_author->set_markup(data->Author.GetEscapedBoldName());
|
||||
m_author->set_markup(data.Author.GetEscapedBoldName());
|
||||
m_author->set_single_line_mode(true);
|
||||
m_author->set_line_wrap(false);
|
||||
m_author->set_ellipsize(Pango::ELLIPSIZE_END);
|
||||
@@ -1112,7 +1109,7 @@ ChatMessageHeader::ChatMessageHeader(const Message *data) {
|
||||
|
||||
m_meta_ev->signal_button_press_event().connect(sigc::mem_fun(*this, &ChatMessageHeader::on_author_button_press));
|
||||
|
||||
if (author->IsBot || data->WebhookID.has_value()) {
|
||||
if (author->IsBot || data.WebhookID.has_value()) {
|
||||
m_extra = Gtk::manage(new Gtk::Label);
|
||||
m_extra->get_style_context()->add_class("message-container-extra");
|
||||
m_extra->set_single_line_mode(true);
|
||||
@@ -1122,10 +1119,10 @@ ChatMessageHeader::ChatMessageHeader(const Message *data) {
|
||||
}
|
||||
if (author->IsBot)
|
||||
m_extra->set_markup("<b>BOT</b>");
|
||||
else if (data->WebhookID.has_value())
|
||||
else if (data.WebhookID.has_value())
|
||||
m_extra->set_markup("<b>Webhook</b>");
|
||||
|
||||
m_timestamp->set_text(data->ID.GetLocalTimestamp());
|
||||
m_timestamp->set_text(data.ID.GetLocalTimestamp());
|
||||
m_timestamp->set_hexpand(true);
|
||||
m_timestamp->set_halign(Gtk::ALIGN_END);
|
||||
m_timestamp->set_ellipsize(Pango::ELLIPSIZE_END);
|
||||
|
||||
@@ -10,7 +10,7 @@ public:
|
||||
std::string Nonce;
|
||||
|
||||
ChatMessageItemContainer();
|
||||
static ChatMessageItemContainer *FromMessage(Snowflake id);
|
||||
static ChatMessageItemContainer *FromMessage(const Message &data);
|
||||
|
||||
// attributes = edited, deleted
|
||||
void UpdateAttributes();
|
||||
@@ -20,7 +20,7 @@ public:
|
||||
|
||||
protected:
|
||||
void AddClickHandler(Gtk::Widget *widget, std::string);
|
||||
Gtk::TextView *CreateTextComponent(const Message *data); // Message.Content
|
||||
Gtk::TextView *CreateTextComponent(const Message &data); // Message.Content
|
||||
void UpdateTextComponent(Gtk::TextView *tv);
|
||||
Gtk::Widget *CreateEmbedComponent(const EmbedData &data); // Message.Embeds[0]
|
||||
Gtk::Widget *CreateImageComponent(const std::string &proxy_url, const std::string &url, int inw, int inh);
|
||||
@@ -111,7 +111,7 @@ public:
|
||||
Snowflake ChannelID;
|
||||
Snowflake NewestID = 0;
|
||||
|
||||
ChatMessageHeader(const Message *data);
|
||||
ChatMessageHeader(const Message &data);
|
||||
void AddContent(Gtk::Widget *widget, bool prepend);
|
||||
void UpdateNameColor();
|
||||
std::vector<Gtk::Widget*> GetChildContent();
|
||||
|
||||
@@ -99,10 +99,10 @@ Gtk::Widget *ChatWindow::GetRoot() const {
|
||||
}
|
||||
|
||||
void ChatWindow::Clear() {
|
||||
SetMessages(std::set<Snowflake>());
|
||||
m_chat->Clear();
|
||||
}
|
||||
|
||||
void ChatWindow::SetMessages(const std::set<Snowflake> &msgs) {
|
||||
void ChatWindow::SetMessages(const std::vector<Message> &msgs) {
|
||||
m_chat->SetMessages(msgs.begin(), msgs.end());
|
||||
}
|
||||
|
||||
@@ -115,8 +115,8 @@ void ChatWindow::SetActiveChannel(Snowflake id) {
|
||||
StopReplying();
|
||||
}
|
||||
|
||||
void ChatWindow::AddNewMessage(Snowflake id) {
|
||||
m_chat->ProcessNewMessage(id, false);
|
||||
void ChatWindow::AddNewMessage(const Message &data) {
|
||||
m_chat->ProcessNewMessage(data, false);
|
||||
}
|
||||
|
||||
void ChatWindow::DeleteMessage(Snowflake id) {
|
||||
@@ -127,8 +127,8 @@ void ChatWindow::UpdateMessage(Snowflake id) {
|
||||
m_chat->RefetchMessage(id);
|
||||
}
|
||||
|
||||
void ChatWindow::AddNewHistory(const std::vector<Snowflake> &id) {
|
||||
m_chat->PrependMessages(id.begin(), id.end());
|
||||
void ChatWindow::AddNewHistory(const std::vector<Message> &msgs) {
|
||||
m_chat->PrependMessages(msgs.crbegin(), msgs.crend());
|
||||
}
|
||||
|
||||
void ChatWindow::InsertChatInput(std::string text) {
|
||||
|
||||
@@ -19,12 +19,12 @@ public:
|
||||
Snowflake GetActiveChannel() const;
|
||||
|
||||
void Clear();
|
||||
void SetMessages(const std::set<Snowflake> &msgs); // clear contents and replace with given set
|
||||
void SetMessages(const std::vector<Message> &msgs); // clear contents and replace with given set
|
||||
void SetActiveChannel(Snowflake id);
|
||||
void AddNewMessage(Snowflake id); // append new message to bottom
|
||||
void AddNewMessage(const Message &data); // append new message to bottom
|
||||
void DeleteMessage(Snowflake id); // add [deleted] indicator
|
||||
void UpdateMessage(Snowflake id); // add [edited] indicator
|
||||
void AddNewHistory(const std::vector<Snowflake> &id); // prepend messages
|
||||
void AddNewHistory(const std::vector<Message> &msgs); // prepend messages
|
||||
void InsertChatInput(std::string text);
|
||||
Snowflake GetOldestListedMessage(); // oldest message that is currently in the ListBox
|
||||
void UpdateReactions(Snowflake id);
|
||||
|
||||
Reference in New Issue
Block a user