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