From f9deeef70dbc4f407d85ba04d56a7bae70f77ee7 Mon Sep 17 00:00:00 2001 From: ouwou <26526779+ouwou@users.noreply.github.com> Date: Sat, 3 Jun 2023 18:04:48 -0400 Subject: dont let message ListBoxRow steal focus on click --- src/components/chatmessage.cpp | 1 + 1 file changed, 1 insertion(+) (limited to 'src/components/chatmessage.cpp') diff --git a/src/components/chatmessage.cpp b/src/components/chatmessage.cpp index 5f4c9a5..4b2e748 100644 --- a/src/components/chatmessage.cpp +++ b/src/components/chatmessage.cpp @@ -1011,6 +1011,7 @@ ChatMessageHeader::ChatMessageHeader(const Message &data) add(m_main_box); set_margin_bottom(8); + set_focus_on_click(false); show_all(); -- cgit v1.2.3 From 6f1bd0014cad37f2f0b43a9b83733d9f65a91406 Mon Sep 17 00:00:00 2001 From: ouwou <26526779+ouwou@users.noreply.github.com> Date: Tue, 13 Jun 2023 21:28:18 -0400 Subject: refactor, update user mention handling --- src/components/channels.cpp | 2 +- src/components/chatmessage.cpp | 22 +++++++++++----------- src/components/chatwindow.cpp | 2 +- src/components/friendslist.cpp | 2 +- src/components/memberlist.cpp | 2 +- src/dialogs/friendpicker.cpp | 2 +- src/discord/user.cpp | 16 ++++++++-------- src/discord/user.hpp | 24 +++++++++++++++--------- src/misc/chatutil.cpp | 8 ++++---- src/windows/guildsettings/auditlogpane.cpp | 18 +++++++++--------- src/windows/guildsettings/memberspane.cpp | 4 ++-- src/windows/profile/mutualfriendspane.cpp | 2 +- src/windows/profilewindow.cpp | 2 +- 13 files changed, 56 insertions(+), 50 deletions(-) (limited to 'src/components/chatmessage.cpp') diff --git a/src/components/channels.cpp b/src/components/channels.cpp index 0e97837..15a8348 100644 --- a/src/components/channels.cpp +++ b/src/components/channels.cpp @@ -863,7 +863,7 @@ Gtk::TreeModel::iterator ChannelList::CreateVoiceParticipantRow(const UserData & auto row = *m_model->append(parent); row[m_columns.m_type] = RenderType::VoiceParticipant; row[m_columns.m_id] = user.ID; - row[m_columns.m_name] = user.GetEscapedName(); + row[m_columns.m_name] = user.GetDisplayNameEscaped(); const auto voice_state = Abaddon::Get().GetDiscordClient().GetVoiceState(user.ID); if (voice_state.has_value()) { diff --git a/src/components/chatmessage.cpp b/src/components/chatmessage.cpp index 4b2e748..2f3a86d 100644 --- a/src/components/chatmessage.cpp +++ b/src/components/chatmessage.cpp @@ -234,23 +234,23 @@ void ChatMessageItemContainer::UpdateTextComponent(Gtk::TextView *tv) { } break; case MessageType::CHANNEL_NAME_CHANGE: { const auto author = Abaddon::Get().GetDiscordClient().GetUser(data->Author.ID); - b->insert_markup(s, "" + author->GetEscapedBoldName() + " changed the name to " + Glib::Markup::escape_text(data->Content) + ""); + b->insert_markup(s, "" + author->GetDisplayNameEscapedBold() + " changed the name to " + Glib::Markup::escape_text(data->Content) + ""); } break; case MessageType::CHANNEL_ICON_CHANGE: { const auto author = Abaddon::Get().GetDiscordClient().GetUser(data->Author.ID); - b->insert_markup(s, "" + author->GetEscapedBoldName() + " changed the channel icon"); + b->insert_markup(s, "" + author->GetDisplayNameEscapedBold() + " changed the channel icon"); } break; case MessageType::USER_PREMIUM_GUILD_SUBSCRIPTION_TIER_1: case MessageType::USER_PREMIUM_GUILD_SUBSCRIPTION_TIER_2: case MessageType::USER_PREMIUM_GUILD_SUBSCRIPTION_TIER_3: { const auto author = Abaddon::Get().GetDiscordClient().GetUser(data->Author.ID); const auto guild = Abaddon::Get().GetDiscordClient().GetGuild(*data->GuildID); - b->insert_markup(s, "" + author->GetEscapedBoldName() + " just boosted the server " + Glib::Markup::escape_text(data->Content) + " times! " + + b->insert_markup(s, "" + author->GetDisplayNameEscapedBold() + " just boosted the server " + Glib::Markup::escape_text(data->Content) + " times! " + Glib::Markup::escape_text(guild->Name) + " has achieved Level " + std::to_string(static_cast(data->Type) - 8) + "!"); // oo cheeky me !!! } break; case MessageType::CHANNEL_FOLLOW_ADD: { const auto author = Abaddon::Get().GetDiscordClient().GetUser(data->Author.ID); - b->insert_markup(s, "" + author->GetEscapedBoldName() + " has added " + Glib::Markup::escape_text(data->Content) + " to this channel. Its most important updates will show up here."); + b->insert_markup(s, "" + author->GetDisplayNameEscapedBold() + " has added " + Glib::Markup::escape_text(data->Content) + " to this channel. Its most important updates will show up here."); } break; case MessageType::CALL: { b->insert_markup(s, "[started a call]"); @@ -270,13 +270,13 @@ void ChatMessageItemContainer::UpdateTextComponent(Gtk::TextView *tv) { case MessageType::THREAD_CREATED: { const auto author = Abaddon::Get().GetDiscordClient().GetUser(data->Author.ID); if (data->MessageReference.has_value() && data->MessageReference->ChannelID.has_value()) { - auto iter = b->insert_markup(s, "" + author->GetEscapedBoldName() + " started a thread: "); + auto iter = b->insert_markup(s, "" + author->GetDisplayNameEscapedBold() + " started a thread: "); auto tag = b->create_tag(); tag->property_weight() = Pango::WEIGHT_BOLD; m_channel_tagmap[tag] = *data->MessageReference->ChannelID; b->insert_with_tag(iter, data->Content, tag); } else { - b->insert_markup(s, "" + author->GetEscapedBoldName() + " started a thread: " + Glib::Markup::escape_text(data->Content) + ""); + b->insert_markup(s, "" + author->GetDisplayNameEscapedBold() + " started a thread: " + Glib::Markup::escape_text(data->Content) + ""); } } break; default: break; @@ -656,7 +656,7 @@ Gtk::Widget *ChatMessageItemContainer::CreateReplyComponent(const Message &data) if (role.has_value()) { const auto author = discord.GetUser(author_id); if (author.has_value()) { - return "Color) + "\">" + author->GetEscapedString() + ""; + return "Color) + "\">" + author->GetUsernameEscaped() + ""; } } } @@ -664,7 +664,7 @@ Gtk::Widget *ChatMessageItemContainer::CreateReplyComponent(const Message &data) const auto author = discord.GetUser(author_id); if (author.has_value()) { - return author->GetEscapedBoldString(); + return author->GetUsernameEscapedBold(); } return "Unknown User"; @@ -685,7 +685,7 @@ Gtk::Widget *ChatMessageItemContainer::CreateReplyComponent(const Message &data) Glib::Markup::escape_text(data.Interaction->Name) + ""); } else if (const auto user = discord.GetUser(data.Interaction->User.ID); user.has_value()) { - lbl->set_markup(user->GetEscapedBoldString()); + lbl->set_markup(user->GetUsernameEscapedBold()); } else { lbl->set_markup("Unknown User"); } @@ -1043,7 +1043,7 @@ void ChatMessageHeader::UpdateName() { else m_author.set_markup("" + name + ""); } else - m_author.set_markup("" + user->GetEscapedName() + ""); + m_author.set_markup("" + user->GetDisplayNameEscaped() + ""); } std::vector ChatMessageHeader::GetChildContent() { @@ -1069,7 +1069,7 @@ Glib::ustring ChatMessageHeader::GetEscapedDisplayName(const UserData &user, con if (member.has_value() && !member->Nickname.empty()) return Glib::Markup::escape_text(member->Nickname); else - return Glib::Markup::escape_text(user.GetEscapedName()); + return Glib::Markup::escape_text(user.GetDisplayNameEscaped()); } bool ChatMessageHeader::on_author_button_press(GdkEventButton *ev) { diff --git a/src/components/chatwindow.cpp b/src/components/chatwindow.cpp index 1565d0c..8f59944 100644 --- a/src/components/chatwindow.cpp +++ b/src/components/chatwindow.cpp @@ -301,7 +301,7 @@ void ChatWindow::StartReplying(Snowflake message_id) { m_is_replying = true; m_input->StartReplying(); if (author.has_value()) - m_input_indicator->SetCustomMarkup("Replying to " + author->GetEscapedBoldString()); + m_input_indicator->SetCustomMarkup("Replying to " + author->GetUsernameEscapedBold()); else m_input_indicator->SetCustomMarkup("Replying..."); } diff --git a/src/components/friendslist.cpp b/src/components/friendslist.cpp index d8a566f..5839b65 100644 --- a/src/components/friendslist.cpp +++ b/src/components/friendslist.cpp @@ -265,7 +265,7 @@ FriendsListFriendRow::FriendsListFriendRow(RelationshipType type, const UserData img->SetURL(data.GetAvatarURL("png", "32")); } - namelbl->set_markup(data.GetEscapedBoldName()); + namelbl->set_markup(data.GetDisplayNameEscapedBold()); UpdatePresenceLabel(); diff --git a/src/components/memberlist.cpp b/src/components/memberlist.cpp index a477832..9450548 100644 --- a/src/components/memberlist.cpp +++ b/src/components/memberlist.cpp @@ -40,7 +40,7 @@ MemberListUserRow::MemberListUserRow(const std::optional &guild, cons // todo remove after migration complete std::string display; if (data.IsPomelo()) { - display = data.GetName(); + display = data.GetDisplayName(); } else { display = data.Username; if (Abaddon::Get().GetSettings().ShowMemberListDiscriminators) { diff --git a/src/dialogs/friendpicker.cpp b/src/dialogs/friendpicker.cpp index c70a9e9..873ddbd 100644 --- a/src/dialogs/friendpicker.cpp +++ b/src/dialogs/friendpicker.cpp @@ -62,7 +62,7 @@ FriendPickerDialogItem::FriendPickerDialogItem(Snowflake user_id) , m_layout(Gtk::ORIENTATION_HORIZONTAL) { auto user = *Abaddon::Get().GetDiscordClient().GetUser(user_id); - m_name.set_markup(user.GetEscapedBoldString()); + m_name.set_markup(user.GetUsernameEscapedBold()); m_name.set_single_line_mode(true); m_avatar.property_pixbuf() = Abaddon::Get().GetImageManager().GetPlaceholder(32); diff --git a/src/discord/user.cpp b/src/discord/user.cpp index 06073ad..38157e7 100644 --- a/src/discord/user.cpp +++ b/src/discord/user.cpp @@ -81,7 +81,7 @@ std::string UserData::GetMention() const { return "<@" + std::to_string(ID) + ">"; } -std::string UserData::GetName() const { +std::string UserData::GetDisplayName() const { if (IsPomelo() && GlobalName.has_value()) { return *GlobalName; } @@ -97,19 +97,19 @@ std::string UserData::GetUsername() const { return Username + "#" + Discriminator; } -std::string UserData::GetEscapedName() const { - return Glib::Markup::escape_text(GetName()); +std::string UserData::GetDisplayNameEscaped() const { + return Glib::Markup::escape_text(GetDisplayName()); } -std::string UserData::GetEscapedBoldName() const { - return "" + Glib::Markup::escape_text(GetName()) + ""; +std::string UserData::GetDisplayNameEscapedBold() const { + return "" + Glib::Markup::escape_text(GetDisplayName()) + ""; } -std::string UserData::GetEscapedString() const { +std::string UserData::GetUsernameEscaped() const { if (IsPomelo()) { - return GetEscapedName(); + return GetDisplayNameEscaped(); } - return Glib::Markup::escape_text(GetName()) + "#" + Discriminator; + return Glib::Markup::escape_text(GetDisplayName()) + "#" + Discriminator; } void from_json(const nlohmann::json &j, UserData &m) { diff --git a/src/discord/user.hpp b/src/discord/user.hpp index 05acd05..d2c1002 100644 --- a/src/discord/user.hpp +++ b/src/discord/user.hpp @@ -79,16 +79,22 @@ struct UserData { [[nodiscard]] std::string GetDefaultAvatarURL() const; [[nodiscard]] Snowflake GetHoistedRole(Snowflake guild_id, bool with_color = false) const; [[nodiscard]] std::string GetMention() const; - [[nodiscard]] std::string GetName() const; + [[nodiscard]] std::string GetDisplayName() const; + [[nodiscard]] std::string GetDisplayNameEscaped() const; + [[nodiscard]] std::string GetDisplayNameEscapedBold() const; [[nodiscard]] std::string GetUsername() const; - [[nodiscard]] std::string GetEscapedName() const; - [[nodiscard]] std::string GetEscapedBoldName() const; - [[nodiscard]] std::string GetEscapedString() const; + [[nodiscard]] std::string GetUsernameEscaped() const; template - [[nodiscard]] inline std::string GetEscapedBoldString() const { - if constexpr (with_at) - return "@" + Glib::Markup::escape_text(Username) + "#" + Discriminator; - else - return "" + Glib::Markup::escape_text(Username) + "#" + Discriminator; + [[nodiscard]] inline std::string GetUsernameEscapedBold() const { + // stupid microoptimization (nanooptimization) that shouldnt exist + if constexpr (with_at) { + std::string r = "@" + Glib::Markup::escape_text(Username) + ""; + if (!IsPomelo()) r += "#" + Discriminator; + return r; + } else { + std::string r = "" + Glib::Markup::escape_text(Username) + ""; + if (!IsPomelo()) r += "#" + Discriminator; + return r; + } } }; diff --git a/src/misc/chatutil.cpp b/src/misc/chatutil.cpp index a87df00..b5917ca 100644 --- a/src/misc/chatutil.cpp +++ b/src/misc/chatutil.cpp @@ -74,17 +74,17 @@ void HandleUserMentions(const Glib::RefPtr &buf, Snowflake chan if (channel->Type == ChannelType::DM || channel->Type == ChannelType::GROUP_DM || !channel->GuildID.has_value() || plain) { if (plain) { - replacement = "@" + user->Username + "#" + user->Discriminator; + replacement = "@" + user->GetUsername(); } else { - replacement = user->GetEscapedBoldString(); + replacement = user->GetUsernameEscapedBold(); } } else { const auto role_id = user->GetHoistedRole(*channel->GuildID, true); const auto role = discord.GetRole(role_id); if (!role.has_value()) - replacement = user->GetEscapedBoldString(); + replacement = user->GetUsernameEscapedBold(); else - replacement = "Color) + "\">" + user->GetEscapedBoldString() + ""; + replacement = "Color) + "\">" + user->GetUsernameEscapedBold() + ""; } // regex returns byte positions and theres no straightforward way in the c++ bindings to deal with that :( diff --git a/src/windows/guildsettings/auditlogpane.cpp b/src/windows/guildsettings/auditlogpane.cpp index 53bfd15..7402c55 100644 --- a/src/windows/guildsettings/auditlogpane.cpp +++ b/src/windows/guildsettings/auditlogpane.cpp @@ -38,7 +38,7 @@ void GuildSettingsAuditLogPane::OnAuditLogFetch(const AuditLogData &data) { Glib::ustring user_markup = "Unknown User"; if (entry.UserID.has_value()) { if (auto user = discord.GetUser(*entry.UserID); user.has_value()) - user_markup = discord.GetUser(*entry.UserID)->GetEscapedBoldString(); + user_markup = discord.GetUser(*entry.UserID)->GetUsernameEscapedBold(); } // spaghetti moment @@ -177,7 +177,7 @@ void GuildSettingsAuditLogPane::OnAuditLogFetch(const AuditLogData &data) { const auto target_user = discord.GetUser(entry.TargetID); markup = user_markup + " kicked " + - target_user->GetEscapedString() + + target_user->GetUsernameEscaped() + ""; } break; case AuditLogActionType::MEMBER_PRUNE: { @@ -193,21 +193,21 @@ void GuildSettingsAuditLogPane::OnAuditLogFetch(const AuditLogData &data) { const auto target_user = discord.GetUser(entry.TargetID); markup = user_markup + " banned " + - target_user->GetEscapedString() + + target_user->GetUsernameEscaped() + ""; } break; case AuditLogActionType::MEMBER_BAN_REMOVE: { const auto target_user = discord.GetUser(entry.TargetID); markup = user_markup + " removed the ban for " + - target_user->GetEscapedString() + + target_user->GetUsernameEscaped() + ""; } break; case AuditLogActionType::MEMBER_UPDATE: { const auto target_user = discord.GetUser(entry.TargetID); markup = user_markup + " updated " + - target_user->GetEscapedString() + + target_user->GetUsernameEscaped() + ""; if (entry.Changes.has_value()) for (const auto &change : *entry.Changes) { @@ -227,7 +227,7 @@ void GuildSettingsAuditLogPane::OnAuditLogFetch(const AuditLogData &data) { const auto target_user = discord.GetUser(entry.TargetID); markup = user_markup + " updated roles for " + - target_user->GetEscapedString() + ""; + target_user->GetUsernameEscaped() + ""; if (entry.Changes.has_value()) for (const auto &change : *entry.Changes) { if (change.Key == "$remove" && change.NewValue.has_value()) { @@ -262,7 +262,7 @@ void GuildSettingsAuditLogPane::OnAuditLogFetch(const AuditLogData &data) { const auto target_user = discord.GetUser(entry.TargetID); markup = user_markup + " added " + - target_user->GetEscapedString() + + target_user->GetUsernameEscaped() + " to the server"; } break; case AuditLogActionType::ROLE_CREATE: { @@ -450,14 +450,14 @@ void GuildSettingsAuditLogPane::OnAuditLogFetch(const AuditLogData &data) { const auto target_user = discord.GetUser(entry.TargetID); markup = user_markup + " pinned a message by " + - target_user->GetEscapedString() + + target_user->GetUsernameEscaped() + ""; } break; case AuditLogActionType::MESSAGE_UNPIN: { const auto target_user = discord.GetUser(entry.TargetID); markup = user_markup + " unpinned a message by " + - target_user->GetEscapedString() + + target_user->GetUsernameEscaped() + ""; } break; case AuditLogActionType::STAGE_INSTANCE_CREATE: { diff --git a/src/windows/guildsettings/memberspane.cpp b/src/windows/guildsettings/memberspane.cpp index 64c28cb..ab4ec1a 100644 --- a/src/windows/guildsettings/memberspane.cpp +++ b/src/windows/guildsettings/memberspane.cpp @@ -150,9 +150,9 @@ void GuildSettingsMembersListItem::UpdateColor() { const auto user = *discord.GetUser(UserID); if (auto color_id = discord.GetMemberHoistedRole(GuildID, UserID, true); color_id.IsValid()) { auto role = *discord.GetRole(color_id); - m_name.set_markup("" + user.GetEscapedBoldString() + ""); + m_name.set_markup("" + user.GetUsernameEscapedBold() + ""); } else - m_name.set_markup(user.GetEscapedBoldString()); + m_name.set_markup(user.GetUsernameEscapedBold()); } GuildSettingsMembersPaneInfo::GuildSettingsMembersPaneInfo(Snowflake guild_id) diff --git a/src/windows/profile/mutualfriendspane.cpp b/src/windows/profile/mutualfriendspane.cpp index e9f465b..2983fd5 100644 --- a/src/windows/profile/mutualfriendspane.cpp +++ b/src/windows/profile/mutualfriendspane.cpp @@ -22,7 +22,7 @@ MutualFriendItem::MutualFriendItem(const UserData &user) img.LoadFromURL(user.GetAvatarURL("png", "32"), sigc::track_obj(cb, *this)); } - m_name.set_markup(user.GetEscapedBoldString()); + m_name.set_markup(user.GetUsernameEscapedBold()); m_name.set_valign(Gtk::ALIGN_CENTER); add(m_avatar); diff --git a/src/windows/profilewindow.cpp b/src/windows/profilewindow.cpp index 1469e49..ed8cd8a 100644 --- a/src/windows/profilewindow.cpp +++ b/src/windows/profilewindow.cpp @@ -64,7 +64,7 @@ ProfileWindow::ProfileWindow(Snowflake user_id) img.LoadFromURL(user.GetAvatarURL("png", "64"), sigc::track_obj(cb, *this)); } - m_displayname.set_markup(user.GetEscapedName()); + m_displayname.set_markup(user.GetDisplayNameEscaped()); m_username.set_label(user.GetUsername()); m_switcher.set_stack(m_stack); -- cgit v1.2.3 From 8ec96944028a885f1af3ee8988b29b48ee2a07f7 Mon Sep 17 00:00:00 2001 From: ouwou <26526779+ouwou@users.noreply.github.com> Date: Tue, 13 Jun 2023 21:34:29 -0400 Subject: use display name in replies --- src/components/chatmessage.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src/components/chatmessage.cpp') diff --git a/src/components/chatmessage.cpp b/src/components/chatmessage.cpp index 2f3a86d..9e01cf0 100644 --- a/src/components/chatmessage.cpp +++ b/src/components/chatmessage.cpp @@ -656,7 +656,7 @@ Gtk::Widget *ChatMessageItemContainer::CreateReplyComponent(const Message &data) if (role.has_value()) { const auto author = discord.GetUser(author_id); if (author.has_value()) { - return "Color) + "\">" + author->GetUsernameEscaped() + ""; + return "Color) + "\">" + author->GetDisplayNameEscaped() + ""; } } } @@ -664,7 +664,7 @@ Gtk::Widget *ChatMessageItemContainer::CreateReplyComponent(const Message &data) const auto author = discord.GetUser(author_id); if (author.has_value()) { - return author->GetUsernameEscapedBold(); + return author->GetDisplayNameEscapedBold(); } return "Unknown User"; @@ -685,7 +685,7 @@ Gtk::Widget *ChatMessageItemContainer::CreateReplyComponent(const Message &data) Glib::Markup::escape_text(data.Interaction->Name) + ""); } else if (const auto user = discord.GetUser(data.Interaction->User.ID); user.has_value()) { - lbl->set_markup(user->GetUsernameEscapedBold()); + lbl->set_markup(user->GetDisplayNameEscapedBold()); } else { lbl->set_markup("Unknown User"); } -- cgit v1.2.3 From 29a049e62a6a701c7e6290a643f709a35ba5f4cf Mon Sep 17 00:00:00 2001 From: ouwou <26526779+ouwou@users.noreply.github.com> Date: Tue, 13 Jun 2023 22:15:48 -0400 Subject: handle nickname in reply component --- src/components/chatmessage.cpp | 4 ++-- src/discord/user.cpp | 16 ++++++++++++++++ src/discord/user.hpp | 3 +++ 3 files changed, 21 insertions(+), 2 deletions(-) (limited to 'src/components/chatmessage.cpp') diff --git a/src/components/chatmessage.cpp b/src/components/chatmessage.cpp index 9e01cf0..12f8c33 100644 --- a/src/components/chatmessage.cpp +++ b/src/components/chatmessage.cpp @@ -656,7 +656,7 @@ Gtk::Widget *ChatMessageItemContainer::CreateReplyComponent(const Message &data) if (role.has_value()) { const auto author = discord.GetUser(author_id); if (author.has_value()) { - return "Color) + "\">" + author->GetDisplayNameEscaped() + ""; + return "Color) + "\">" + author->GetDisplayNameEscaped(guild_id) + ""; } } } @@ -664,7 +664,7 @@ Gtk::Widget *ChatMessageItemContainer::CreateReplyComponent(const Message &data) const auto author = discord.GetUser(author_id); if (author.has_value()) { - return author->GetDisplayNameEscapedBold(); + return author->GetDisplayNameEscapedBold(guild_id); } return "Unknown User"; diff --git a/src/discord/user.cpp b/src/discord/user.cpp index 1d5d15a..0f89fe2 100644 --- a/src/discord/user.cpp +++ b/src/discord/user.cpp @@ -89,14 +89,30 @@ std::string UserData::GetDisplayName() const { return Username; } +std::string UserData::GetDisplayName(Snowflake guild_id) const { + const auto member = Abaddon::Get().GetDiscordClient().GetMember(ID, guild_id); + if (member.has_value() && !member->Nickname.empty()) { + return member->Nickname; + } + return GetDisplayName(); +} + std::string UserData::GetDisplayNameEscaped() const { return Glib::Markup::escape_text(GetDisplayName()); } +std::string UserData::GetDisplayNameEscaped(Snowflake guild_id) const { + return Glib::Markup::escape_text(GetDisplayName(guild_id)); +} + std::string UserData::GetDisplayNameEscapedBold() const { return "" + Glib::Markup::escape_text(GetDisplayName()) + ""; } +std::string UserData::GetDisplayNameEscapedBold(Snowflake guild_id) const { + return "" + Glib::Markup::escape_text(GetDisplayName(guild_id)) + ""; +} + std::string UserData::GetUsername() const { if (IsPomelo()) { return Username; diff --git a/src/discord/user.hpp b/src/discord/user.hpp index 19a0bf9..29de62a 100644 --- a/src/discord/user.hpp +++ b/src/discord/user.hpp @@ -80,8 +80,11 @@ struct UserData { [[nodiscard]] Snowflake GetHoistedRole(Snowflake guild_id, bool with_color = false) const; [[nodiscard]] std::string GetMention() const; [[nodiscard]] std::string GetDisplayName() const; + [[nodiscard]] std::string GetDisplayName(Snowflake guild_id) const; [[nodiscard]] std::string GetDisplayNameEscaped() const; + [[nodiscard]] std::string GetDisplayNameEscaped(Snowflake guild_id) const; [[nodiscard]] std::string GetDisplayNameEscapedBold() const; + [[nodiscard]] std::string GetDisplayNameEscapedBold(Snowflake guild_id) const; [[nodiscard]] std::string GetUsername() const; [[nodiscard]] std::string GetUsernameEscaped() const; [[nodiscard]] std::string GetUsernameEscapedBold() const; -- cgit v1.2.3 From 00dddf410e8aa9df64d323211e9dcdf4309f06a1 Mon Sep 17 00:00:00 2001 From: ouwou <26526779+ouwou@users.noreply.github.com> Date: Wed, 14 Jun 2023 02:04:39 -0400 Subject: convert a bunch of .Username accesses to proper access --- src/abaddon.cpp | 4 ++-- src/components/chatmessage.cpp | 6 +++--- src/components/completer.cpp | 3 ++- src/components/friendslist.cpp | 10 +++++----- src/windows/guildsettings/banspane.cpp | 6 +++--- src/windows/guildsettings/emojispane.cpp | 2 +- src/windows/guildsettings/invitespane.cpp | 2 +- src/windows/guildsettings/memberspane.cpp | 2 +- src/windows/voicewindow.cpp | 2 +- 9 files changed, 19 insertions(+), 18 deletions(-) (limited to 'src/components/chatmessage.cpp') diff --git a/src/abaddon.cpp b/src/abaddon.cpp index a1ed343..e22afde 100644 --- a/src/abaddon.cpp +++ b/src/abaddon.cpp @@ -952,7 +952,7 @@ void Abaddon::ActionKickMember(Snowflake user_id, Snowflake guild_id) { ConfirmDialog dlg(*m_main_window); const auto user = m_discord.GetUser(user_id); if (user.has_value()) - dlg.SetConfirmText("Are you sure you want to kick " + user->Username + "#" + user->Discriminator + "?"); + dlg.SetConfirmText("Are you sure you want to kick " + user->GetUsername() + "?"); auto response = dlg.run(); if (response == Gtk::RESPONSE_OK) m_discord.KickUser(user_id, guild_id); @@ -962,7 +962,7 @@ void Abaddon::ActionBanMember(Snowflake user_id, Snowflake guild_id) { ConfirmDialog dlg(*m_main_window); const auto user = m_discord.GetUser(user_id); if (user.has_value()) - dlg.SetConfirmText("Are you sure you want to ban " + user->Username + "#" + user->Discriminator + "?"); + dlg.SetConfirmText("Are you sure you want to ban " + user->GetUsername() + "?"); auto response = dlg.run(); if (response == Gtk::RESPONSE_OK) m_discord.BanUser(user_id, guild_id); diff --git a/src/components/chatmessage.cpp b/src/components/chatmessage.cpp index 12f8c33..4fde039 100644 --- a/src/components/chatmessage.cpp +++ b/src/components/chatmessage.cpp @@ -221,16 +221,16 @@ void ChatMessageItemContainer::UpdateTextComponent(Gtk::TextView *tv) { if (data->Mentions.empty()) break; const auto &adder = Abaddon::Get().GetDiscordClient().GetUser(data->Author.ID); const auto &added = data->Mentions[0]; - b->insert_markup(s, "" + adder->Username + " added " + added.Username + ""); + b->insert_markup(s, "" + adder->GetUsername() + " added " + added.GetUsername() + ""); } break; case MessageType::RECIPIENT_REMOVE: { if (data->Mentions.empty()) break; const auto &adder = Abaddon::Get().GetDiscordClient().GetUser(data->Author.ID); const auto &added = data->Mentions[0]; if (adder->ID == added.ID) - b->insert_markup(s, "" + adder->Username + " left"); + b->insert_markup(s, "" + adder->GetUsername() + " left"); else - b->insert_markup(s, "" + adder->Username + " removed " + added.Username + ""); + b->insert_markup(s, "" + adder->GetUsername() + " removed " + added.GetUsername() + ""); } break; case MessageType::CHANNEL_NAME_CHANGE: { const auto author = Abaddon::Get().GetDiscordClient().GetUser(data->Author.ID); diff --git a/src/components/completer.cpp b/src/components/completer.cpp index c6a5a08..f6f0906 100644 --- a/src/components/completer.cpp +++ b/src/components/completer.cpp @@ -117,12 +117,13 @@ void Completer::CompleteMentions(const Glib::ustring &term) { if (id == me) continue; const auto author = discord.GetUser(id); if (!author.has_value()) continue; + // todo improve the predicate here if (!StringContainsCaseless(author->Username, term)) continue; if (i++ > 15) break; auto entry = CreateEntry(author->GetMention()); - entry->SetText(author->Username + "#" + author->Discriminator); + entry->SetText(author->GetUsername()); if (channel_id.IsValid()) { const auto chan = discord.GetChannel(channel_id); diff --git a/src/components/friendslist.cpp b/src/components/friendslist.cpp index 5839b65..99fbafa 100644 --- a/src/components/friendslist.cpp +++ b/src/components/friendslist.cpp @@ -117,16 +117,16 @@ void FriendsList::OnActionRemove(Snowflake id) { Glib::ustring str; switch (*discord.GetRelationship(id)) { case RelationshipType::Blocked: - str = "Are you sure you want to unblock " + user->Username + "#" + user->Discriminator + "?"; + str = "Are you sure you want to unblock " + user->GetUsername() + "?"; break; case RelationshipType::Friend: - str = "Are you sure you want to remove " + user->Username + "#" + user->Discriminator + "?"; + str = "Are you sure you want to remove " + user->GetUsername() + "?"; break; case RelationshipType::PendingIncoming: - str = "Are you sure you want to ignore " + user->Username + "#" + user->Discriminator + "?"; + str = "Are you sure you want to ignore " + user->GetUsername() + "?"; break; case RelationshipType::PendingOutgoing: - str = "Are you sure you want to cancel your request to " + user->Username + "#" + user->Discriminator + "?"; + str = "Are you sure you want to cancel your request to " + user->GetUsername() + "?"; break; default: break; @@ -244,7 +244,7 @@ bool FriendsListAddComponent::OnKeyPress(GdkEventKey *e) { FriendsListFriendRow::FriendsListFriendRow(RelationshipType type, const UserData &data) : ID(data.ID) , Type(type) - , Name(data.Username + "#" + data.Discriminator) + , Name(data.GetUsername()) , Status(Abaddon::Get().GetDiscordClient().GetUserStatus(data.ID)) , m_accept("Accept") { auto *ev = Gtk::manage(new Gtk::EventBox); diff --git a/src/windows/guildsettings/banspane.cpp b/src/windows/guildsettings/banspane.cpp index bfc7331..68a232d 100644 --- a/src/windows/guildsettings/banspane.cpp +++ b/src/windows/guildsettings/banspane.cpp @@ -72,7 +72,7 @@ void GuildSettingsBansPane::OnGuildBanFetch(const BanData &ban) { auto row = *m_model->append(); row[m_columns.m_col_id] = ban.User.ID; if (user.has_value()) - row[m_columns.m_col_user] = user->Username + "#" + user->Discriminator; + row[m_columns.m_col_user] = user->GetUsername(); else row[m_columns.m_col_user] = "<@" + std::to_string(ban.User.ID) + ">"; @@ -84,7 +84,7 @@ void GuildSettingsBansPane::OnGuildBansFetch(const std::vector &bans) { const auto user = Abaddon::Get().GetDiscordClient().GetUser(ban.User.ID); auto row = *m_model->append(); row[m_columns.m_col_id] = user->ID; - row[m_columns.m_col_user] = user->Username + "#" + user->Discriminator; + row[m_columns.m_col_user] = user->GetUsername(); row[m_columns.m_col_reason] = ban.Reason; } } @@ -148,7 +148,7 @@ void GuildSettingsBansPane::OnBanAdd(Snowflake guild_id, Snowflake user_id) { auto user = *discord.GetUser(user_id); auto row = *m_model->append(); row[m_columns.m_col_id] = user_id; - row[m_columns.m_col_user] = user.Username + "#" + user.Discriminator; + row[m_columns.m_col_user] = user.GetUsername(); row[m_columns.m_col_reason] = ""; } } diff --git a/src/windows/guildsettings/emojispane.cpp b/src/windows/guildsettings/emojispane.cpp index c86ea64..702432f 100644 --- a/src/windows/guildsettings/emojispane.cpp +++ b/src/windows/guildsettings/emojispane.cpp @@ -119,7 +119,7 @@ void GuildSettingsEmojisPane::AddEmojiRow(const EmojiData &emoji) { row[m_columns.m_col_pixbuf] = img.GetPlaceholder(32); row[m_columns.m_col_name] = emoji.Name; if (emoji.Creator.has_value()) - row[m_columns.m_col_creator] = emoji.Creator->Username + "#" + emoji.Creator->Discriminator; + row[m_columns.m_col_creator] = emoji.Creator->GetUsername(); if (emoji.IsAnimated.has_value()) row[m_columns.m_col_animated] = *emoji.IsAnimated ? "Yes" : "No"; else diff --git a/src/windows/guildsettings/invitespane.cpp b/src/windows/guildsettings/invitespane.cpp index 4426f6a..a76b3f2 100644 --- a/src/windows/guildsettings/invitespane.cpp +++ b/src/windows/guildsettings/invitespane.cpp @@ -51,7 +51,7 @@ void GuildSettingsInvitesPane::AppendInvite(const InviteData &invite) { auto row = *m_model->append(); row[m_columns.m_col_code] = invite.Code; if (invite.Inviter.has_value()) - row[m_columns.m_col_inviter] = invite.Inviter->Username + "#" + invite.Inviter->Discriminator; + row[m_columns.m_col_inviter] = invite.Inviter->GetUsername(); if (invite.MaxAge.has_value()) { if (*invite.MaxAge == 0) diff --git a/src/windows/guildsettings/memberspane.cpp b/src/windows/guildsettings/memberspane.cpp index c6fb7c2..8c613d0 100644 --- a/src/windows/guildsettings/memberspane.cpp +++ b/src/windows/guildsettings/memberspane.cpp @@ -103,7 +103,7 @@ GuildSettingsMembersListItem::GuildSettingsMembersListItem(const GuildData &guil else m_avatar.SetURL(member.User->GetAvatarURL("png", "32")); - DisplayTerm = member.User->Username + "#" + member.User->Discriminator; + DisplayTerm = member.User->GetUsername(); const auto member_update_cb = [this](Snowflake guild_id, Snowflake user_id) { if (user_id == UserID) diff --git a/src/windows/voicewindow.cpp b/src/windows/voicewindow.cpp index 9e2efee..35ba8c7 100644 --- a/src/windows/voicewindow.cpp +++ b/src/windows/voicewindow.cpp @@ -39,7 +39,7 @@ public: auto &discord = Abaddon::Get().GetDiscordClient(); const auto user = discord.GetUser(id); if (user.has_value()) { - m_name.set_text(user->Username); + m_name.set_text(user->GetUsername()); m_avatar.SetURL(user->GetAvatarURL("png", "32")); } else { m_name.set_text("Unknown user"); -- cgit v1.2.3 From 52a340e3666e4081b5f284c320404d06ac37b2f3 Mon Sep 17 00:00:00 2001 From: ouwou <26526779+ouwou@users.noreply.github.com> Date: Thu, 13 Jul 2023 18:53:47 -0400 Subject: fix attachments and replies breaking when loading message history --- src/components/chatmessage.cpp | 3 +- src/discord/store.cpp | 71 +++++++++++++++++++----------------------- 2 files changed, 34 insertions(+), 40 deletions(-) (limited to 'src/components/chatmessage.cpp') diff --git a/src/components/chatmessage.cpp b/src/components/chatmessage.cpp index 4fde039..23ee36f 100644 --- a/src/components/chatmessage.cpp +++ b/src/components/chatmessage.cpp @@ -674,8 +674,9 @@ Gtk::Widget *ChatMessageItemContainer::CreateReplyComponent(const Message &data) std::optional> referenced_message = data.ReferencedMessage; if (data.MessageReference.has_value() && data.MessageReference->MessageID.has_value() && !referenced_message.has_value()) { auto refd = discord.GetMessage(*data.MessageReference->MessageID); - if (refd.has_value()) + if (refd.has_value()) { referenced_message = std::make_shared(std::move(*refd)); + } } if (data.Interaction.has_value()) { diff --git a/src/discord/store.cpp b/src/discord/store.cpp index 24b686a..7ee4d87 100644 --- a/src/discord/store.cpp +++ b/src/discord/store.cpp @@ -559,8 +559,9 @@ std::vector Store::GetMessagesBefore(Snowflake channel_id, Snowflake me for (auto &msg : msgs) { if (msg.MessageReference.has_value() && msg.MessageReference->MessageID.has_value()) { auto ref = GetMessage(*msg.MessageReference->MessageID); - if (ref.has_value()) + if (ref.has_value()) { msg.ReferencedMessage = std::make_shared(std::move(*ref)); + } } } @@ -2060,26 +2061,22 @@ bool Store::CreateStatements() { message_interactions.name, message_interactions.type, message_interactions.user_id, - attachments.id, - attachments.filename, - attachments.size, - attachments.url, - attachments.proxy, - attachments.height, - attachments.width, - message_references.message + message_references.message, + message_references.channel, + message_references.guild, + COUNT(attachments.id) FROM messages LEFT OUTER JOIN message_interactions ON messages.id = message_interactions.message_id - LEFT OUTER JOIN - attachments - ON messages.id = attachments.message LEFT OUTER JOIN message_references ON messages.id = message_references.id + LEFT OUTER JOIN + attachments + ON messages.id = attachments.message WHERE channel_id = ? AND pending = 0 AND messages.id < ? ORDER BY id DESC LIMIT ? - ) ORDER BY id ASC + ) WHERE id IS NOT NULL ORDER BY id ASC )"); if (!m_stmt_get_messages_before->OK()) { fprintf(stderr, "failed to prepare get messages before statement: %s\n", m_db.ErrStr()); @@ -2087,32 +2084,28 @@ bool Store::CreateStatements() { } m_stmt_get_pins = std::make_unique(m_db, R"( - SELECT messages.*, - message_interactions.interaction_id, - message_interactions.name, - message_interactions.type, - message_interactions.user_id, - attachments.id, - attachments.filename, - attachments.size, - attachments.url, - attachments.proxy, - attachments.height, - attachments.width, - message_references.message, - message_references.channel, - message_references.guild - FROM messages - LEFT OUTER JOIN - message_interactions - ON messages.id = message_interactions.message_id - LEFT OUTER JOIN - attachments - ON messages.id = attachments.message - LEFT OUTER JOIN - message_references - ON messages.id = message_references.id - WHERE channel_id = ? AND pinned = 1 ORDER BY id ASC + SELECT * FROM ( + SELECT messages.*, + message_interactions.interaction_id, + message_interactions.name, + message_interactions.type, + message_interactions.user_id, + message_references.message, + message_references.channel, + message_references.guild, + COUNT(attachments.id) + FROM messages + LEFT OUTER JOIN + message_interactions + ON messages.id = message_interactions.message_id + LEFT OUTER JOIN + message_references + ON messages.id = message_references.id + LEFT OUTER JOIN + attachments + ON messages.id = attachments.message + WHERE channel_id = ? AND pinned = 1 ORDER BY id ASC + ) WHERE id IS NOT NULL )"); if (!m_stmt_get_pins->OK()) { fprintf(stderr, "failed to prepare get pins statement: %s\n", m_db.ErrStr()); -- cgit v1.2.3