diff options
author | ouwou <26526779+ouwou@users.noreply.github.com> | 2021-06-10 15:27:32 -0400 |
---|---|---|
committer | ouwou <26526779+ouwou@users.noreply.github.com> | 2021-06-10 15:27:32 -0400 |
commit | efc97aa2b0d7a4d63a2e6219070919559a0cf64d (patch) | |
tree | 9bdead11af29488095fe1e16261f58055d736c5b /components | |
parent | c73b08e341bb192936eff14ae5ba6ced18b20137 (diff) | |
download | abaddon-portaudio-efc97aa2b0d7a4d63a2e6219070919559a0cf64d.tar.gz abaddon-portaudio-efc97aa2b0d7a4d63a2e6219070919559a0cf64d.zip |
reduce db access + refactor
Diffstat (limited to 'components')
-rw-r--r-- | components/chatlist.cpp | 30 | ||||
-rw-r--r-- | components/chatlist.hpp | 2 | ||||
-rw-r--r-- | components/chatmessage.cpp | 55 | ||||
-rw-r--r-- | components/chatmessage.hpp | 6 | ||||
-rw-r--r-- | components/chatwindow.cpp | 12 | ||||
-rw-r--r-- | components/chatwindow.hpp | 6 |
6 files changed, 53 insertions, 58 deletions
diff --git a/components/chatlist.cpp b/components/chatlist.cpp index 0dc04df..d9e0f89 100644 --- a/components/chatlist.cpp +++ b/components/chatlist.cpp @@ -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) { diff --git a/components/chatlist.hpp b/components/chatlist.hpp index 45dc2eb..0726cf5 100644 --- a/components/chatlist.hpp +++ b/components/chatlist.hpp @@ -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(); diff --git a/components/chatmessage.cpp b/components/chatmessage.cpp index 0bda45e..0554cf7 100644 --- a/components/chatmessage.cpp +++ b/components/chatmessage.cpp @@ -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); diff --git a/components/chatmessage.hpp b/components/chatmessage.hpp index 6074b20..4adb0a4 100644 --- a/components/chatmessage.hpp +++ b/components/chatmessage.hpp @@ -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(); diff --git a/components/chatwindow.cpp b/components/chatwindow.cpp index f69efad..4c2b561 100644 --- a/components/chatwindow.cpp +++ b/components/chatwindow.cpp @@ -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) { diff --git a/components/chatwindow.hpp b/components/chatwindow.hpp index db3d2fc..e6280f6 100644 --- a/components/chatwindow.hpp +++ b/components/chatwindow.hpp @@ -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); |