forked from OpenGamers/abaddon
add ability to edit messages
This commit is contained in:
parent
44b7989f50
commit
9b1bc8f145
@ -148,6 +148,7 @@
|
||||
<ClCompile Include="components\chatmessage.cpp" />
|
||||
<ClCompile Include="components\chatwindow.cpp" />
|
||||
<ClCompile Include="components\memberlist.cpp" />
|
||||
<ClCompile Include="dialogs\editmessage.cpp" />
|
||||
<ClCompile Include="dialogs\token.cpp" />
|
||||
<ClCompile Include="discord\discord.cpp" />
|
||||
<ClCompile Include="discord\http.cpp" />
|
||||
@ -162,6 +163,7 @@
|
||||
<ClInclude Include="components\chatmessage.hpp" />
|
||||
<ClInclude Include="components\chatwindow.hpp" />
|
||||
<ClInclude Include="components\memberlist.hpp" />
|
||||
<ClInclude Include="dialogs\editmessage.hpp" />
|
||||
<ClInclude Include="dialogs\token.hpp" />
|
||||
<ClInclude Include="discord\discord.hpp" />
|
||||
<ClInclude Include="discord\http.hpp" />
|
||||
|
@ -51,6 +51,9 @@
|
||||
<ClCompile Include="discord\objects.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="dialogs\editmessage.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="windows\mainwindow.hpp">
|
||||
@ -89,5 +92,8 @@
|
||||
<ClInclude Include="discord\objects.hpp">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="dialogs\editmessage.hpp">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
</Project>
|
10
abaddon.cpp
10
abaddon.cpp
@ -4,6 +4,7 @@
|
||||
#include <algorithm>
|
||||
#include "discord/discord.hpp"
|
||||
#include "dialogs/token.hpp"
|
||||
#include "dialogs/editmessage.hpp"
|
||||
#include "abaddon.hpp"
|
||||
|
||||
#ifdef _WIN32
|
||||
@ -205,6 +206,15 @@ void Abaddon::ActionChatDeleteMessage(Snowflake channel_id, Snowflake id) {
|
||||
m_discord.DeleteMessage(channel_id, id);
|
||||
}
|
||||
|
||||
void Abaddon::ActionChatEditMessage(Snowflake channel_id, Snowflake id) {
|
||||
EditMessageDialog dlg(*m_main_window);
|
||||
auto response = dlg.run();
|
||||
if (response == Gtk::RESPONSE_OK) {
|
||||
auto new_content = dlg.GetContent();
|
||||
m_discord.EditMessage(channel_id, id, new_content);
|
||||
}
|
||||
}
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
Gtk::Main::init_gtkmm_internals(); // why???
|
||||
Abaddon abaddon;
|
||||
|
@ -28,6 +28,7 @@ public:
|
||||
void ActionChatInputSubmit(std::string msg, Snowflake channel);
|
||||
void ActionChatLoadHistory(Snowflake id);
|
||||
void ActionChatDeleteMessage(Snowflake channel_id, Snowflake id);
|
||||
void ActionChatEditMessage(Snowflake channel_id, Snowflake id);
|
||||
|
||||
std::string GetDiscordToken() const;
|
||||
bool IsDiscordActive() const;
|
||||
|
@ -62,6 +62,10 @@ ChatMessageItem::ChatMessageItem() {
|
||||
m_menu_delete_message->signal_activate().connect(sigc::mem_fun(*this, &ChatMessageItem::on_menu_message_delete));
|
||||
m_menu.append(*m_menu_delete_message);
|
||||
|
||||
m_menu_edit_message = Gtk::manage(new Gtk::MenuItem("_Edit Message", true));
|
||||
m_menu_edit_message->signal_activate().connect(sigc::mem_fun(*this, &ChatMessageItem::on_menu_message_edit));
|
||||
m_menu.append(*m_menu_edit_message);
|
||||
|
||||
m_menu.show_all();
|
||||
}
|
||||
|
||||
@ -73,6 +77,10 @@ void ChatMessageItem::on_menu_message_delete() {
|
||||
m_abaddon->ActionChatDeleteMessage(ChannelID, ID);
|
||||
}
|
||||
|
||||
void ChatMessageItem::on_menu_message_edit() {
|
||||
m_abaddon->ActionChatEditMessage(ChannelID, ID);
|
||||
}
|
||||
|
||||
void ChatMessageItem::on_menu_copy_id() {
|
||||
Gtk::Clipboard::get()->set_text(std::to_string(ID));
|
||||
}
|
||||
@ -94,7 +102,9 @@ void ChatMessageItem::AttachMenuHandler(Gtk::Widget *widget) {
|
||||
void ChatMessageItem::ShowMenu(const GdkEvent *event) {
|
||||
auto &client = m_abaddon->GetDiscordClient();
|
||||
auto *data = client.GetMessage(ID);
|
||||
m_menu_delete_message->set_sensitive(client.GetUserData().ID == data->Author.ID);
|
||||
bool can_manage = client.GetUserData().ID == data->Author.ID;
|
||||
m_menu_delete_message->set_sensitive(can_manage);
|
||||
m_menu_edit_message->set_sensitive(can_manage);
|
||||
m_menu.popup_at_pointer(event);
|
||||
}
|
||||
|
||||
|
@ -43,10 +43,12 @@ protected:
|
||||
void AttachMenuHandler(Gtk::Widget *widget);
|
||||
void on_menu_copy_id();
|
||||
void on_menu_message_delete();
|
||||
void on_menu_message_edit();
|
||||
|
||||
Gtk::Menu m_menu;
|
||||
Gtk::MenuItem *m_menu_copy_id;
|
||||
Gtk::MenuItem *m_menu_delete_message;
|
||||
Gtk::MenuItem *m_menu_edit_message;
|
||||
|
||||
Abaddon *m_abaddon = nullptr;
|
||||
};
|
||||
|
39
dialogs/editmessage.cpp
Normal file
39
dialogs/editmessage.cpp
Normal file
@ -0,0 +1,39 @@
|
||||
#include "editmessage.hpp"
|
||||
|
||||
EditMessageDialog::EditMessageDialog(Gtk::Window &parent)
|
||||
: Gtk::Dialog("Edit Message", parent, true)
|
||||
, m_layout(Gtk::ORIENTATION_VERTICAL)
|
||||
, m_bbox(Gtk::ORIENTATION_HORIZONTAL)
|
||||
, m_ok("OK")
|
||||
, m_cancel("Cancel") {
|
||||
set_default_size(300, 50);
|
||||
|
||||
m_ok.signal_clicked().connect([&]() {
|
||||
m_content = m_text.get_buffer()->get_text();
|
||||
response(Gtk::RESPONSE_OK);
|
||||
});
|
||||
|
||||
m_cancel.signal_clicked().connect([&]() {
|
||||
response(Gtk::RESPONSE_CANCEL);
|
||||
});
|
||||
|
||||
m_bbox.pack_start(m_ok, Gtk::PACK_SHRINK);
|
||||
m_bbox.pack_start(m_cancel, Gtk::PACK_SHRINK);
|
||||
m_bbox.set_layout(Gtk::BUTTONBOX_END);
|
||||
|
||||
m_text.set_hexpand(true);
|
||||
|
||||
m_scroll.set_hexpand(true);
|
||||
m_scroll.set_vexpand(true);
|
||||
m_scroll.add(m_text);
|
||||
|
||||
m_layout.add(m_scroll);
|
||||
m_layout.add(m_bbox);
|
||||
get_content_area()->add(m_layout);
|
||||
|
||||
show_all_children();
|
||||
}
|
||||
|
||||
std::string EditMessageDialog::GetContent() {
|
||||
return m_content;
|
||||
}
|
20
dialogs/editmessage.hpp
Normal file
20
dialogs/editmessage.hpp
Normal file
@ -0,0 +1,20 @@
|
||||
#pragma once
|
||||
#include <gtkmm.h>
|
||||
#include <string>
|
||||
|
||||
class EditMessageDialog : public Gtk::Dialog {
|
||||
public:
|
||||
EditMessageDialog(Gtk::Window &parent);
|
||||
std::string GetContent();
|
||||
|
||||
protected:
|
||||
Gtk::Box m_layout;
|
||||
Gtk::Button m_ok;
|
||||
Gtk::Button m_cancel;
|
||||
Gtk::ButtonBox m_bbox;
|
||||
Gtk::ScrolledWindow m_scroll;
|
||||
Gtk::TextView m_text;
|
||||
|
||||
private:
|
||||
std::string m_content;
|
||||
};
|
@ -172,6 +172,14 @@ void DiscordClient::DeleteMessage(Snowflake channel_id, Snowflake id) {
|
||||
m_http.MakeDELETE(path, [](auto) {});
|
||||
}
|
||||
|
||||
void DiscordClient::EditMessage(Snowflake channel_id, Snowflake id, std::string content) {
|
||||
std::string path = "/channels/" + std::to_string(channel_id) + "/messages/" + std::to_string(id);
|
||||
MessageEditObject obj;
|
||||
obj.Content = content;
|
||||
nlohmann::json j = obj;
|
||||
m_http.MakePATCH(path, j.dump(), [](auto) {});
|
||||
}
|
||||
|
||||
void DiscordClient::UpdateToken(std::string token) {
|
||||
m_token = token;
|
||||
m_http.SetAuth(token);
|
||||
|
@ -70,6 +70,7 @@ public:
|
||||
|
||||
void SendChatMessage(std::string content, Snowflake channel);
|
||||
void DeleteMessage(Snowflake channel_id, Snowflake id);
|
||||
void EditMessage(Snowflake channel_id, Snowflake id, std::string content);
|
||||
|
||||
void UpdateToken(std::string token);
|
||||
|
||||
|
@ -295,6 +295,18 @@ void to_json(nlohmann::json &j, const CreateMessageObject &m) {
|
||||
j["content"] = m.Content;
|
||||
}
|
||||
|
||||
void to_json(nlohmann::json &j, const MessageEditObject &m) {
|
||||
if (m.Content.size() > 0)
|
||||
j["content"] = m.Content;
|
||||
|
||||
// todo EmbedData to_json
|
||||
// if (m.Embeds.size() > 0)
|
||||
// j["embeds"] = m.Embeds;
|
||||
|
||||
if (m.Flags != -1)
|
||||
j["flags"] = m.Flags;
|
||||
}
|
||||
|
||||
Snowflake::Snowflake()
|
||||
: m_num(Invalid) {}
|
||||
|
||||
|
@ -424,3 +424,11 @@ struct CreateMessageObject {
|
||||
|
||||
friend void to_json(nlohmann::json &j, const CreateMessageObject &m);
|
||||
};
|
||||
|
||||
struct MessageEditObject {
|
||||
std::string Content; // opt, null
|
||||
std::vector<EmbedData> Embeds; // opt, null
|
||||
int Flags = -1; // opt, null
|
||||
|
||||
friend void to_json(nlohmann::json &j, const MessageEditObject &m);
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user