summaryrefslogtreecommitdiff
path: root/components
diff options
context:
space:
mode:
authorouwou <26526779+ouwou@users.noreply.github.com>2021-06-10 15:27:32 -0400
committerouwou <26526779+ouwou@users.noreply.github.com>2021-06-10 15:27:32 -0400
commitefc97aa2b0d7a4d63a2e6219070919559a0cf64d (patch)
tree9bdead11af29488095fe1e16261f58055d736c5b /components
parentc73b08e341bb192936eff14ae5ba6ced18b20137 (diff)
downloadabaddon-portaudio-efc97aa2b0d7a4d63a2e6219070919559a0cf64d.tar.gz
abaddon-portaudio-efc97aa2b0d7a4d63a2e6219070919559a0cf64d.zip
reduce db access + refactor
Diffstat (limited to 'components')
-rw-r--r--components/chatlist.cpp30
-rw-r--r--components/chatlist.hpp2
-rw-r--r--components/chatmessage.cpp55
-rw-r--r--components/chatmessage.hpp6
-rw-r--r--components/chatwindow.cpp12
-rw-r--r--components/chatwindow.hpp6
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 &param) {
+ content->signal_action_reaction_add().connect([this, id = data.ID](const Glib::ustring &param) {
m_signal_action_reaction_add.emit(id, param);
});
- content->signal_action_reaction_remove().connect([this, id](const Glib::ustring &param) {
+ content->signal_action_reaction_remove().connect([this, id = data.ID](const Glib::ustring &param) {
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);