summaryrefslogtreecommitdiff
path: root/discord/discord.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'discord/discord.cpp')
-rw-r--r--discord/discord.cpp51
1 files changed, 49 insertions, 2 deletions
diff --git a/discord/discord.cpp b/discord/discord.cpp
index b5ed9da..4d7464b 100644
--- a/discord/discord.cpp
+++ b/discord/discord.cpp
@@ -345,18 +345,57 @@ bool DiscordClient::CanManageMember(Snowflake guild_id, Snowflake actor, Snowfla
return actor_highest->Position > target_highest->Position;
}
+void DiscordClient::ChatMessageCallback(std::string nonce, const http::response_type &response) {
+ if (!CheckCode(response)) {
+ m_signal_message_send_fail.emit(nonce);
+ }
+}
+
void DiscordClient::SendChatMessage(const std::string &content, Snowflake channel) {
// @([^@#]{1,32})#(\\d{4})
+ const auto nonce = std::to_string(Snowflake::FromNow());
CreateMessageObject obj;
obj.Content = content;
- m_http.MakePOST("/channels/" + std::to_string(channel) + "/messages", nlohmann::json(obj).dump(), [](auto) {});
+ obj.Nonce = nonce;
+ m_http.MakePOST("/channels/" + std::to_string(channel) + "/messages", nlohmann::json(obj).dump(), sigc::bind<0>(sigc::mem_fun(*this, &DiscordClient::ChatMessageCallback), nonce));
+ // dummy data so the content can be shown while waiting for MESSAGE_CREATE
+ Message tmp;
+ tmp.Content = content;
+ tmp.ID = nonce;
+ tmp.ChannelID = channel;
+ tmp.Author = GetUserData();
+ tmp.IsTTS = false;
+ tmp.DoesMentionEveryone = false;
+ tmp.Type = MessageType::DEFAULT;
+ tmp.IsPinned = false;
+ tmp.Timestamp = "2000-01-01T00:00:00.000000+00:00";
+ tmp.Nonce = obj.Nonce;
+ tmp.IsPending = true;
+ m_store.SetMessage(tmp.ID, tmp);
+ m_signal_message_sent.emit(tmp);
}
void DiscordClient::SendChatMessage(const std::string &content, Snowflake channel, Snowflake referenced_message) {
+ const auto nonce = std::to_string(Snowflake::FromNow());
CreateMessageObject obj;
obj.Content = content;
+ obj.Nonce = nonce;
obj.MessageReference.emplace().MessageID = referenced_message;
- m_http.MakePOST("/channels/" + std::to_string(channel) + "/messages", nlohmann::json(obj).dump(), [](auto) {});
+ m_http.MakePOST("/channels/" + std::to_string(channel) + "/messages", nlohmann::json(obj).dump(), sigc::bind<0>(sigc::mem_fun(*this, &DiscordClient::ChatMessageCallback), nonce));
+ Message tmp;
+ tmp.Content = content;
+ tmp.ID = nonce;
+ tmp.ChannelID = channel;
+ tmp.Author = GetUserData();
+ tmp.IsTTS = false;
+ tmp.DoesMentionEveryone = false;
+ tmp.Type = MessageType::DEFAULT;
+ tmp.IsPinned = false;
+ tmp.Timestamp = "2000-01-01T00:00:00.000000+00:00";
+ tmp.Nonce = obj.Nonce;
+ tmp.IsPending = true;
+ m_store.SetMessage(tmp.ID, tmp);
+ m_signal_message_sent.emit(tmp);
}
void DiscordClient::DeleteMessage(Snowflake channel_id, Snowflake id) {
@@ -1861,3 +1900,11 @@ DiscordClient::type_signal_guild_join_request_update DiscordClient::signal_guild
DiscordClient::type_signal_guild_join_request_delete DiscordClient::signal_guild_join_request_delete() {
return m_signal_guild_join_request_delete;
}
+
+DiscordClient::type_signal_message_sent DiscordClient::signal_message_sent() {
+ return m_signal_message_sent;
+}
+
+DiscordClient::type_signal_message_send_fail DiscordClient::signal_message_send_fail() {
+ return m_signal_message_send_fail;
+}