diff options
author | ouwou <26526779+ouwou@users.noreply.github.com> | 2021-02-18 14:38:40 -0500 |
---|---|---|
committer | ouwou <26526779+ouwou@users.noreply.github.com> | 2021-02-18 14:38:40 -0500 |
commit | 3ab3119602c46e7c4802b2b8e017752738cd7031 (patch) | |
tree | 5b69db1fc8159212e988ffbcb74dde402dfc9023 /discord | |
parent | a721600016686cebb39bc359916a35f12a70766a (diff) | |
download | abaddon-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.cpp | 18 | ||||
-rw-r--r-- | discord/discord.hpp | 5 | ||||
-rw-r--r-- | discord/httpclient.cpp | 3 | ||||
-rw-r--r-- | discord/objects.cpp | 1 | ||||
-rw-r--r-- | discord/objects.hpp | 3 | ||||
-rw-r--r-- | discord/relationship.cpp | 6 | ||||
-rw-r--r-- | discord/relationship.hpp | 21 |
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); +}; |