diff options
author | ouwou <26526779+ouwou@users.noreply.github.com> | 2020-10-05 02:09:15 -0400 |
---|---|---|
committer | ouwou <26526779+ouwou@users.noreply.github.com> | 2020-10-05 02:09:15 -0400 |
commit | cfcb0d4e662b960dcdd331a7c61dc2b9c614f930 (patch) | |
tree | ef73894f8662a4925160d7126b01b20a896577f7 /components | |
parent | b7dd1fd5b0cf8c5a6a9c191109112f887cc7ac36 (diff) | |
download | abaddon-portaudio-cfcb0d4e662b960dcdd331a7c61dc2b9c614f930.tar.gz abaddon-portaudio-cfcb0d4e662b960dcdd331a7c61dc2b9c614f930.zip |
basic mention parsing
Diffstat (limited to 'components')
-rw-r--r-- | components/chatmessage.cpp | 47 | ||||
-rw-r--r-- | components/chatmessage.hpp | 5 |
2 files changed, 47 insertions, 5 deletions
diff --git a/components/chatmessage.cpp b/components/chatmessage.cpp index 4530f6b..5f8726d 100644 --- a/components/chatmessage.cpp +++ b/components/chatmessage.cpp @@ -71,7 +71,7 @@ ChatMessageItemContainer *ChatMessageItemContainer::FromMessage(Snowflake id) { void ChatMessageItemContainer::UpdateContent() { const auto *data = Abaddon::Get().GetDiscordClient().GetMessage(ID); if (m_text_component != nullptr) - m_text_component->get_buffer()->set_text(data->Content); + UpdateTextComponent(m_text_component); if (m_embed_component != nullptr) delete m_embed_component; @@ -154,12 +154,23 @@ Gtk::TextView *ChatMessageItemContainer::CreateTextComponent(const Message *data tv->set_halign(Gtk::ALIGN_FILL); tv->set_hexpand(true); + UpdateTextComponent(tv); + + return tv; +} + +void ChatMessageItemContainer::UpdateTextComponent(Gtk::TextView *tv) { + const auto *data = Abaddon::Get().GetDiscordClient().GetMessage(ID); + if (data == nullptr) + return; + auto b = tv->get_buffer(); - Gtk::TextBuffer::iterator s, e; // lame + b->set_text(""); + Gtk::TextBuffer::iterator s, e; b->get_bounds(s, e); switch (data->Type) { case MessageType::DEFAULT: - b->set_text(data->Content); + b->insert_markup(s, ParseMessageContent(Glib::Markup::escape_text(data->Content))); break; case MessageType::GUILD_MEMBER_JOIN: b->insert_markup(s, "<span color='#999999'><i>[user joined]</i></span>"); @@ -169,8 +180,6 @@ Gtk::TextView *ChatMessageItemContainer::CreateTextComponent(const Message *data break; default: break; } - - return tv; } Gtk::EventBox *ChatMessageItemContainer::CreateEmbedComponent(const Message *data) { @@ -351,6 +360,34 @@ void ChatMessageItemContainer::HandleImage(const AttachmentData &data, Gtk::Imag Glib::signal_idle().connect(sigc::bind(sigc::mem_fun(*this, &ChatMessageItemContainer::EmitImageLoad), url)); } +std::string ChatMessageItemContainer::ParseMessageContent(std::string content) { + content = ParseMentions(content); + + return content; +} + +std::string ChatMessageItemContainer::ParseMentions(std::string content) { + constexpr static const auto mentions_regex = R"(<@(\d+)>)"; + + return RegexReplaceMany(content, mentions_regex, [this](const std::string &idstr) -> std::string { + const Snowflake id(idstr); + const auto &discord = Abaddon::Get().GetDiscordClient(); + const auto *user = discord.GetUser(id); + const auto *channel = discord.GetChannel(ChannelID); + if (channel == nullptr || user == nullptr) return idstr; + + if (channel->Type == ChannelType::DM || channel->Type == ChannelType::GROUP_DM) + return "<b>@" + Glib::Markup::escape_text(user->Username) + "#" + user->Discriminator + "</b>"; + + const auto colorid = user->GetHoistedRole(channel->GuildID, true); + const auto *role = discord.GetRole(colorid); + if (role == nullptr) + return "<b>@" + Glib::Markup::escape_text(user->Username) + "#" + user->Discriminator + "</b>"; + + return "<b><span color=\"#" + IntToCSSColor(role->Color) + "\">@" + Glib::Markup::escape_text(user->Username) + "#" + user->Discriminator + "</span></b>"; + }); +} + void ChatMessageItemContainer::ShowMenu(GdkEvent *event) { const auto &client = Abaddon::Get().GetDiscordClient(); const auto *data = client.GetMessage(ID); diff --git a/components/chatmessage.hpp b/components/chatmessage.hpp index 144118f..ca936ea 100644 --- a/components/chatmessage.hpp +++ b/components/chatmessage.hpp @@ -20,11 +20,16 @@ protected: void AddClickHandler(Gtk::Widget *widget, std::string); Gtk::TextView *CreateTextComponent(const Message *data); // Message.Content + void UpdateTextComponent(Gtk::TextView *tv); Gtk::EventBox *CreateEmbedComponent(const Message *data); // Message.Embeds[0] Gtk::Image *CreateImageComponent(const AttachmentData &data); Gtk::Box *CreateAttachmentComponent(const AttachmentData &data); // non-image attachments void HandleImage(const AttachmentData &data, Gtk::Image *img, std::string url); + // expects content run through Glib::Markup::escape_text + std::string ParseMessageContent(std::string content); + std::string ParseMentions(std::string content); + std::unordered_map<std::string, std::pair<Gtk::Image *, AttachmentData>> m_img_loadmap; void AttachMenuHandler(Gtk::Widget *widget); |