summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorouwou <26526779+ouwou@users.noreply.github.com>2023-07-15 21:14:39 -0400
committerouwou <26526779+ouwou@users.noreply.github.com>2023-07-15 21:14:39 -0400
commit52b52eb489caa64e6cea978f2c6917a55fa70979 (patch)
tree740be513f52752cf25479bede9e8e2231bf0ffa6 /src
parentadd48af094ec9111727862d3f2ee1916474a2471 (diff)
downloadabaddon-portaudio-52b52eb489caa64e6cea978f2c6917a55fa70979.tar.gz
abaddon-portaudio-52b52eb489caa64e6cea978f2c6917a55fa70979.zip
check if message is editable
Diffstat (limited to 'src')
-rw-r--r--src/components/chatlist.cpp13
-rw-r--r--src/components/chatlist.hpp2
-rw-r--r--src/components/chatwindow.cpp2
-rw-r--r--src/discord/message.cpp4
-rw-r--r--src/discord/message.hpp10
5 files changed, 19 insertions, 12 deletions
diff --git a/src/components/chatlist.cpp b/src/components/chatlist.cpp
index 28981b2..ba18c0a 100644
--- a/src/components/chatlist.cpp
+++ b/src/components/chatlist.cpp
@@ -133,10 +133,9 @@ void ChatList::ProcessNewMessage(const Message &data, bool prepend) {
m_menu_delete_message->set_sensitive(false);
m_menu_edit_message->set_sensitive(false);
} else {
- const bool can_edit = client.GetUserData().ID == data->Author.ID;
- const bool can_delete = can_edit || has_manage;
+ const bool can_delete = (client.GetUserData().ID == data->Author.ID) || has_manage;
m_menu_delete_message->set_sensitive(can_delete);
- m_menu_edit_message->set_sensitive(can_edit);
+ m_menu_edit_message->set_sensitive(data->IsEditable());
}
m_menu.popup_at_pointer(reinterpret_cast<GdkEvent *>(ev));
@@ -253,18 +252,20 @@ void ChatList::ActuallyRemoveMessage(Snowflake id) {
RemoveMessageAndHeader(it->second);
}
-std::optional<Snowflake> ChatList::GetLastSentMessage() {
+std::optional<Snowflake> ChatList::GetLastSentEditableMessage() {
const auto &discord = Abaddon::Get().GetDiscordClient();
const auto self_id = discord.GetUserData().ID;
std::map<Snowflake, Gtk::Widget *> ordered(m_id_to_widget.begin(), m_id_to_widget.end());
for (auto it = ordered.crbegin(); it != ordered.crend(); it++) {
- const auto *widget = dynamic_cast<ChatMessageItemContainer*>(it->second);
+ const auto *widget = dynamic_cast<ChatMessageItemContainer *>(it->second);
if (widget == nullptr) continue;
const auto msg = discord.GetMessage(widget->ID);
if (!msg.has_value()) continue;
- if (msg->Author.ID == self_id) return msg->ID;
+ if (msg->Author.ID != self_id) continue;
+ if (!msg->IsEditable()) continue;
+ return msg->ID;
}
return std::nullopt;
diff --git a/src/components/chatlist.hpp b/src/components/chatlist.hpp
index 5d4ec4a..9f12df9 100644
--- a/src/components/chatlist.hpp
+++ b/src/components/chatlist.hpp
@@ -23,7 +23,7 @@ public:
void SetSeparateAll(bool separate);
void SetUsePinnedMenu(); // i think i need a better way to do menus
void ActuallyRemoveMessage(Snowflake id); // perhaps not the best method name
- std::optional<Snowflake> GetLastSentMessage();
+ std::optional<Snowflake> GetLastSentEditableMessage();
private:
void SetupMenu();
diff --git a/src/components/chatwindow.cpp b/src/components/chatwindow.cpp
index 17f5601..aeed4ed 100644
--- a/src/components/chatwindow.cpp
+++ b/src/components/chatwindow.cpp
@@ -288,7 +288,7 @@ bool ChatWindow::OnInputSubmit(ChatSubmitParams data) {
bool ChatWindow::ProcessKeyEvent(GdkEventKey *e) {
if (e->type != GDK_KEY_PRESS) return false;
if (e->keyval == GDK_KEY_Up && !(e->state & GDK_SHIFT_MASK) && m_input->IsEmpty()) {
- const auto edit_id = m_chat->GetLastSentMessage();
+ const auto edit_id = m_chat->GetLastSentEditableMessage();
if (edit_id.has_value()) {
StartEditing(*edit_id);
}
diff --git a/src/discord/message.cpp b/src/discord/message.cpp
index f5d8ad8..9adc7e6 100644
--- a/src/discord/message.cpp
+++ b/src/discord/message.cpp
@@ -265,6 +265,10 @@ bool Message::IsEdited() const {
return m_edited;
}
+bool Message::IsEditable() const noexcept {
+ return (Abaddon::Get().GetDiscordClient().GetUserData().ID == Author.ID) && !IsDeleted() && !IsPending && (Type == MessageType::DEFAULT || Type == MessageType::INLINE_REPLY);
+}
+
bool Message::DoesMentionEveryoneOrUser(Snowflake id) const noexcept {
if (DoesMentionEveryone) return true;
return std::any_of(Mentions.begin(), Mentions.end(), [id](const UserData &user) {
diff --git a/src/discord/message.hpp b/src/discord/message.hpp
index 5028104..fb11604 100644
--- a/src/discord/message.hpp
+++ b/src/discord/message.hpp
@@ -219,11 +219,13 @@ struct Message {
void SetDeleted();
void SetEdited();
- [[nodiscard]] bool IsDeleted() const;
- [[nodiscard]] bool IsEdited() const;
+ bool IsDeleted() const;
+ bool IsEdited() const;
- [[nodiscard]] bool DoesMentionEveryoneOrUser(Snowflake id) const noexcept;
- [[nodiscard]] bool DoesMention(Snowflake id) const noexcept;
+ bool IsEditable() const noexcept;
+
+ bool DoesMentionEveryoneOrUser(Snowflake id) const noexcept;
+ bool DoesMention(Snowflake id) const noexcept;
private:
bool m_deleted = false;