summaryrefslogtreecommitdiff
path: root/discord
diff options
context:
space:
mode:
authorouwou <26526779+ouwou@users.noreply.github.com>2021-02-18 14:38:40 -0500
committerouwou <26526779+ouwou@users.noreply.github.com>2021-02-18 14:38:40 -0500
commit3ab3119602c46e7c4802b2b8e017752738cd7031 (patch)
tree5b69db1fc8159212e988ffbcb74dde402dfc9023 /discord
parenta721600016686cebb39bc359916a35f12a70766a (diff)
downloadabaddon-portaudio-3ab3119602c46e7c4802b2b8e017752738cd7031.tar.gz
abaddon-portaudio-3ab3119602c46e7c4802b2b8e017752738cd7031.zip
add menu item to add recipient to group dm
Diffstat (limited to 'discord')
-rw-r--r--discord/discord.cpp18
-rw-r--r--discord/discord.hpp5
-rw-r--r--discord/httpclient.cpp3
-rw-r--r--discord/objects.cpp1
-rw-r--r--discord/objects.hpp3
-rw-r--r--discord/relationship.cpp6
-rw-r--r--discord/relationship.hpp21
7 files changed, 55 insertions, 2 deletions
diff --git a/discord/discord.cpp b/discord/discord.cpp
index 0055229..5f356f2 100644
--- a/discord/discord.cpp
+++ b/discord/discord.cpp
@@ -522,6 +522,12 @@ void DiscordClient::DeleteInvite(const std::string &code, sigc::slot<void(bool s
});
}
+void DiscordClient::AddGroupDMRecipient(Snowflake channel_id, Snowflake user_id) {
+ m_http.MakePUT("/channels/" + std::to_string(channel_id) + "/recipients/" + std::to_string(user_id), "", [this](const http::response_type &response) {
+ CheckCode(response);
+ });
+}
+
void DiscordClient::RemoveGroupDMRecipient(Snowflake channel_id, Snowflake user_id) {
m_http.MakeDELETE("/channels/" + std::to_string(channel_id) + "/recipients/" + std::to_string(user_id), [this](const http::response_type &response) {
CheckCode(response);
@@ -645,6 +651,14 @@ std::optional<PresenceStatus> DiscordClient::GetUserStatus(Snowflake id) const {
return std::nullopt;
}
+std::unordered_set<Snowflake> DiscordClient::GetRelationships(RelationshipType type) const {
+ std::unordered_set<Snowflake> ret;
+ for (const auto &[id, rtype] : m_user_relationships)
+ if (rtype == type)
+ ret.insert(id);
+ return ret;
+}
+
void DiscordClient::HandleGatewayMessageRaw(std::string str) {
// handles multiple zlib compressed messages, calling HandleGatewayMessage when a full message is received
std::vector<uint8_t> buf(str.begin(), str.end());
@@ -890,6 +904,10 @@ void DiscordClient::HandleGatewayReady(const GatewayMessage &msg) {
}
}
+ if (data.Relationships.has_value())
+ for (const auto &relationship : *data.Relationships)
+ m_user_relationships[relationship.ID] = relationship.Type;
+
m_store.EndTransaction();
m_session_id = data.SessionID;
diff --git a/discord/discord.hpp b/discord/discord.hpp
index 0fdf0e4..0e9dab7 100644
--- a/discord/discord.hpp
+++ b/discord/discord.hpp
@@ -120,6 +120,7 @@ public:
void UnbanUser(Snowflake guild_id, Snowflake user_id, sigc::slot<void(bool success)> callback);
void DeleteInvite(const std::string &code);
void DeleteInvite(const std::string &code, sigc::slot<void(bool success)> callback);
+ void AddGroupDMRecipient(Snowflake channel_id, Snowflake user_id);
void RemoveGroupDMRecipient(Snowflake channel_id, Snowflake user_id);
// FetchGuildBans fetches all bans+reasons via api, this func fetches stored bans (so usually just GUILD_BAN_ADD data)
@@ -143,6 +144,8 @@ public:
std::optional<PresenceStatus> GetUserStatus(Snowflake id) const;
+ std::unordered_set<Snowflake> GetRelationships(RelationshipType type) const;
+
private:
static const constexpr int InflateChunkSize = 0x10000;
std::vector<uint8_t> m_compressed_buf;
@@ -207,6 +210,8 @@ private:
std::unordered_map<Snowflake, PresenceStatus> m_user_to_status;
+ std::unordered_map<Snowflake, RelationshipType> m_user_relationships;
+
UserData m_user_data;
UserSettings m_user_settings;
diff --git a/discord/httpclient.cpp b/discord/httpclient.cpp
index dc94566..fa43810 100644
--- a/discord/httpclient.cpp
+++ b/discord/httpclient.cpp
@@ -75,7 +75,8 @@ void HTTPClient::MakePUT(const std::string &path, const std::string &payload, st
m_futures.push_back(std::async(std::launch::async, [this, path, cb, payload] {
http::request req(http::REQUEST_PUT, m_api_base + path);
req.set_header("Authorization", m_authorization);
- req.set_header("Content-Type", "application/json");
+ if (payload != "")
+ req.set_header("Content-Type", "application/json");
req.set_user_agent(m_agent != "" ? m_agent : "Abaddon");
req.set_body(payload);
#ifdef USE_LOCAL_PROXY
diff --git a/discord/objects.cpp b/discord/objects.cpp
index e4275a3..16ae320 100644
--- a/discord/objects.cpp
+++ b/discord/objects.cpp
@@ -118,6 +118,7 @@ void from_json(const nlohmann::json &j, ReadyEventData &m) {
JS_D("private_channels", m.PrivateChannels);
JS_O("users", m.Users);
JS_ON("merged_members", m.MergedMembers);
+ JS_O("relationships", m.Relationships);
}
void from_json(const nlohmann::json &j, MergedPresence &m) {
diff --git a/discord/objects.hpp b/discord/objects.hpp
index 2f97805..6cbef69 100644
--- a/discord/objects.hpp
+++ b/discord/objects.hpp
@@ -18,6 +18,7 @@
#include "sticker.hpp"
#include "ban.hpp"
#include "auditlog.hpp"
+#include "relationship.hpp"
// most stuff below should just be objects that get processed and thrown away immediately
@@ -200,6 +201,7 @@ struct ReadyEventData {
std::optional<int> FriendSuggestionCount;
UserSettings Settings;
std::optional<std::vector<std::vector<GuildMember>>> MergedMembers;
+ std::optional<std::vector<RelationshipData>> Relationships;
// std::vector<Unknown> ConnectedAccounts; // opt
// std::map<std::string, Unknown> Consents; // opt
// std::vector<Unknown> Experiments; // opt
@@ -207,7 +209,6 @@ struct ReadyEventData {
// std::map<Unknown, Unknown> Notes; // opt
// std::vector<PresenceData> Presences; // opt
// std::vector<ReadStateData> ReadStates; // opt
- // std::vector<RelationshipData> Relationships; // opt
// Unknown Tutorial; // opt, null
// std::vector<GuildSettingData> UserGuildSettings; // opt
diff --git a/discord/relationship.cpp b/discord/relationship.cpp
new file mode 100644
index 0000000..d65d2c1
--- /dev/null
+++ b/discord/relationship.cpp
@@ -0,0 +1,6 @@
+#include "relationship.hpp"
+
+void from_json(const nlohmann::json &j, RelationshipData &m) {
+ JS_D("type", m.Type);
+ JS_D("id", m.ID);
+}
diff --git a/discord/relationship.hpp b/discord/relationship.hpp
new file mode 100644
index 0000000..d492bd3
--- /dev/null
+++ b/discord/relationship.hpp
@@ -0,0 +1,21 @@
+#pragma once
+#include "json.hpp"
+#include "user.hpp"
+
+enum class RelationshipType {
+ None = 0,
+ Friend = 1,
+ Blocked = 2,
+ PendingIncoming = 3,
+ PendingOutgoing = 4,
+ Implicit = 5,
+};
+
+struct RelationshipData {
+ // Snowflake UserID; this is the same as ID apparently but it looks new so i wont touch it
+ RelationshipType Type;
+ Snowflake ID;
+ // Unknown Nickname; // null
+
+ friend void from_json(const nlohmann::json &j, RelationshipData &m);
+};