summaryrefslogtreecommitdiff
path: root/components
diff options
context:
space:
mode:
authorouwou <26526779+ouwou@users.noreply.github.com>2020-10-05 02:09:15 -0400
committerouwou <26526779+ouwou@users.noreply.github.com>2020-10-05 02:09:15 -0400
commitcfcb0d4e662b960dcdd331a7c61dc2b9c614f930 (patch)
treeef73894f8662a4925160d7126b01b20a896577f7 /components
parentb7dd1fd5b0cf8c5a6a9c191109112f887cc7ac36 (diff)
downloadabaddon-portaudio-cfcb0d4e662b960dcdd331a7c61dc2b9c614f930.tar.gz
abaddon-portaudio-cfcb0d4e662b960dcdd331a7c61dc2b9c614f930.zip
basic mention parsing
Diffstat (limited to 'components')
-rw-r--r--components/chatmessage.cpp47
-rw-r--r--components/chatmessage.hpp5
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"(&lt;@(\d+)&gt;)";
+
+ 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);