summaryrefslogtreecommitdiff
path: root/discord
diff options
context:
space:
mode:
authorouwou <26526779+ouwou@users.noreply.github.com>2020-09-21 18:47:34 -0400
committerouwou <26526779+ouwou@users.noreply.github.com>2020-09-21 18:47:34 -0400
commit3b4edbfa16861b5013663396e1af827ba889e9df (patch)
tree51686baf5997c32a3e3aac0aa20368c404f6f3f1 /discord
parent23b32f8de957204597308f2c1823d5e89f632610 (diff)
downloadabaddon-portaudio-3b4edbfa16861b5013663396e1af827ba889e9df.tar.gz
abaddon-portaudio-3b4edbfa16861b5013663396e1af827ba889e9df.zip
join/leave guild
Diffstat (limited to 'discord')
-rw-r--r--discord/discord.cpp97
-rw-r--r--discord/discord.hpp14
-rw-r--r--discord/http.cpp1
-rw-r--r--discord/invite.cpp14
-rw-r--r--discord/invite.hpp15
-rw-r--r--discord/objects.hpp3
-rw-r--r--discord/store.cpp8
-rw-r--r--discord/store.hpp3
8 files changed, 141 insertions, 14 deletions
diff --git a/discord/discord.cpp b/discord/discord.cpp
index 3b74fd8..9d1842a 100644
--- a/discord/discord.cpp
+++ b/discord/discord.cpp
@@ -108,6 +108,19 @@ std::set<Snowflake> DiscordClient::GetMessagesForChannel(Snowflake id) const {
return ret;
}
+void DiscordClient::FetchInviteData(std::string code, std::function<void(Invite)> cb, std::function<void(bool)> err) {
+ //printf("test: %s\n", code.c_str());
+ //err(true);
+ m_http.MakeGET("/invites/" + code + "?with_counts=true", [this, cb, err](cpr::Response r) {
+ if (!CheckCode(r)) {
+ err(r.status_code == 404);
+ return;
+ };
+
+ cb(nlohmann::json::parse(r.text));
+ });
+}
+
void DiscordClient::UpdateSettingsGuildPositions(const std::vector<Snowflake> &pos) {
nlohmann::json body;
body["guild_positions"] = pos;
@@ -247,6 +260,14 @@ void DiscordClient::SendLazyLoad(Snowflake id) {
m_websocket.Send(j);
}
+void DiscordClient::JoinGuild(std::string code) {
+ m_http.MakePOST("/invites/" + code, "", [](auto) {});
+}
+
+void DiscordClient::LeaveGuild(Snowflake id) {
+ m_http.MakeDELETE("/users/@me/guilds/" + std::to_string(id), [](auto) {});
+}
+
void DiscordClient::UpdateToken(std::string token) {
m_token = token;
m_http.SetAuth(token);
@@ -332,6 +353,12 @@ void DiscordClient::HandleGatewayMessage(std::string str) {
case GatewayEvent::GUILD_MEMBER_LIST_UPDATE: {
HandleGatewayGuildMemberListUpdate(m);
} break;
+ case GatewayEvent::GUILD_CREATE: {
+ HandleGatewayGuildCreate(m);
+ } break;
+ case GatewayEvent::GUILD_DELETE: {
+ HandleGatewayGuildDelete(m);
+ } break;
}
} break;
default:
@@ -343,23 +370,27 @@ void DiscordClient::HandleGatewayMessage(std::string str) {
}
}
+void DiscordClient::ProcessNewGuild(Guild &guild) {
+ if (guild.IsUnavailable) {
+ printf("guild (%lld) unavailable\n", static_cast<uint64_t>(guild.ID));
+ return;
+ }
+
+ m_store.SetGuild(guild.ID, guild);
+ for (auto &c : guild.Channels) {
+ c.GuildID = guild.ID;
+ m_store.SetChannel(c.ID, c);
+ }
+
+ for (auto &r : guild.Roles)
+ m_store.SetRole(r.ID, r);
+}
+
void DiscordClient::HandleGatewayReady(const GatewayMessage &msg) {
m_ready_received = true;
ReadyEventData data = msg.Data;
- for (auto &g : data.Guilds) {
- if (g.IsUnavailable)
- printf("guild (%lld) unavailable\n", (uint64_t)g.ID);
- else {
- m_store.SetGuild(g.ID, g);
- for (auto &c : g.Channels) {
- c.GuildID = g.ID;
- m_store.SetChannel(c.ID, c);
- }
-
- for (auto &r : g.Roles)
- m_store.SetRole(r.ID, r);
- }
- }
+ for (auto &g : data.Guilds)
+ ProcessNewGuild(g);
for (const auto &dm : data.PrivateChannels) {
m_store.SetChannel(dm.ID, dm);
@@ -419,6 +450,34 @@ void DiscordClient::HandleGatewayGuildMemberListUpdate(const GatewayMessage &msg
m_signal_guild_member_list_update.emit(data.GuildID);
}
+void DiscordClient::HandleGatewayGuildCreate(const GatewayMessage &msg) {
+ Guild data = msg.Data;
+ ProcessNewGuild(data);
+
+ m_signal_guild_create.emit(data.ID);
+}
+
+void DiscordClient::HandleGatewayGuildDelete(const GatewayMessage &msg) {
+ Snowflake id = msg.Data.at("id");
+ bool unavailable = msg.Data.contains("unavilable") && msg.Data.at("unavailable").get<bool>();
+
+ if (unavailable)
+ printf("guild %llu became unavailable\n", static_cast<uint64_t>(id));
+
+ auto *guild = m_store.GetGuild(id);
+ if (guild == nullptr) {
+ m_store.ClearGuild(id);
+ m_signal_guild_delete.emit(id);
+ return;
+ }
+
+ m_store.ClearGuild(id);
+ for (const auto &c : guild->Channels)
+ m_store.ClearChannel(c.ID);
+
+ m_signal_guild_delete.emit(id);
+}
+
void DiscordClient::AddMessageToChannel(Snowflake msg_id, Snowflake channel_id) {
m_chan_to_message_map[channel_id].insert(msg_id);
}
@@ -480,6 +539,8 @@ void DiscordClient::LoadEventMap() {
m_event_map["MESSAGE_DELETE"] = GatewayEvent::MESSAGE_DELETE;
m_event_map["MESSAGE_UPDATE"] = GatewayEvent::MESSAGE_UPDATE;
m_event_map["GUILD_MEMBER_LIST_UPDATE"] = GatewayEvent::GUILD_MEMBER_LIST_UPDATE;
+ m_event_map["GUILD_CREATE"] = GatewayEvent::GUILD_CREATE;
+ m_event_map["GUILD_DELETE"] = GatewayEvent::GUILD_DELETE;
}
DiscordClient::type_signal_gateway_ready DiscordClient::signal_gateway_ready() {
@@ -505,3 +566,11 @@ DiscordClient::type_signal_message_update DiscordClient::signal_message_update()
DiscordClient::type_signal_guild_member_list_update DiscordClient::signal_guild_member_list_update() {
return m_signal_guild_member_list_update;
}
+
+DiscordClient::type_signal_guild_create DiscordClient::signal_guild_create() {
+ return m_signal_guild_create;
+}
+
+DiscordClient::type_signal_guild_delete DiscordClient::signal_guild_delete() {
+ return m_signal_guild_delete;
+}
diff --git a/discord/discord.hpp b/discord/discord.hpp
index 93f5527..cda3854 100644
--- a/discord/discord.hpp
+++ b/discord/discord.hpp
@@ -68,6 +68,7 @@ public:
std::set<Snowflake> GetMessagesForChannel(Snowflake id) const;
std::set<Snowflake> GetPrivateChannels() const;
+ void FetchInviteData(std::string code, std::function<void(Invite)> cb, std::function<void(bool)> err);
void UpdateSettingsGuildPositions(const std::vector<Snowflake> &pos);
void FetchMessagesInChannel(Snowflake id, std::function<void(const std::vector<Snowflake> &)> cb);
void FetchMessagesInChannelBefore(Snowflake channel_id, Snowflake before_id, std::function<void(const std::vector<Snowflake> &)> cb);
@@ -83,6 +84,8 @@ public:
void DeleteMessage(Snowflake channel_id, Snowflake id);
void EditMessage(Snowflake channel_id, Snowflake id, std::string content);
void SendLazyLoad(Snowflake id);
+ void JoinGuild(std::string code);
+ void LeaveGuild(Snowflake id);
void UpdateToken(std::string token);
@@ -91,6 +94,9 @@ private:
std::vector<uint8_t> m_compressed_buf;
std::vector<uint8_t> m_decompress_buf;
z_stream m_zstream;
+
+ void ProcessNewGuild(Guild &guild);
+
void HandleGatewayMessageRaw(std::string str);
void HandleGatewayMessage(std::string str);
void HandleGatewayReady(const GatewayMessage &msg);
@@ -98,6 +104,8 @@ private:
void HandleGatewayMessageDelete(const GatewayMessage &msg);
void HandleGatewayMessageUpdate(const GatewayMessage &msg);
void HandleGatewayGuildMemberListUpdate(const GatewayMessage &msg);
+ void HandleGatewayGuildCreate(const GatewayMessage &msg);
+ void HandleGatewayGuildDelete(const GatewayMessage &msg);
void HeartbeatThread();
void SendIdentify();
@@ -137,6 +145,8 @@ public:
typedef sigc::signal<void, Snowflake, Snowflake> type_signal_message_delete;
typedef sigc::signal<void, Snowflake, Snowflake> type_signal_message_update;
typedef sigc::signal<void, Snowflake> type_signal_guild_member_list_update;
+ typedef sigc::signal<void, Snowflake> type_signal_guild_create;
+ typedef sigc::signal<void, Snowflake> type_signal_guild_delete;
type_signal_gateway_ready signal_gateway_ready();
type_signal_channel_list_refresh signal_channel_list_refresh();
@@ -144,6 +154,8 @@ public:
type_signal_message_delete signal_message_delete();
type_signal_message_update signal_message_update();
type_signal_guild_member_list_update signal_guild_member_list_update();
+ type_signal_guild_create signal_guild_create();
+ type_signal_guild_delete signal_guild_delete();
protected:
type_signal_gateway_ready m_signal_gateway_ready;
@@ -152,4 +164,6 @@ protected:
type_signal_message_delete m_signal_message_delete;
type_signal_message_update m_signal_message_update;
type_signal_guild_member_list_update m_signal_guild_member_list_update;
+ type_signal_guild_create m_signal_guild_create;
+ type_signal_guild_delete m_signal_guild_delete;
};
diff --git a/discord/http.cpp b/discord/http.cpp
index 1e9b786..b4a0f4b 100644
--- a/discord/http.cpp
+++ b/discord/http.cpp
@@ -1,5 +1,6 @@
#include "http.hpp"
+//#define USE_LOCAL_PROXY
HTTPClient::HTTPClient(std::string api_base)
: m_api_base(api_base) {}
diff --git a/discord/invite.cpp b/discord/invite.cpp
new file mode 100644
index 0000000..a08bdef
--- /dev/null
+++ b/discord/invite.cpp
@@ -0,0 +1,14 @@
+#include "invite.hpp"
+
+void from_json(const nlohmann::json &j, Invite &m) {
+ JS_D("code", m.Code);
+ JS_O("channel", m.Channel);
+ JS_O("inviter", m.Inviter);
+ JS_O("approximate_member_count", m.Members);
+
+ if (j.contains("guild")) {
+ auto x = j.at("guild");
+ x.at("id").get_to(m.Guild.ID);
+ x.at("name").get_to(m.Guild.Name);
+ }
+}
diff --git a/discord/invite.hpp b/discord/invite.hpp
new file mode 100644
index 0000000..486ecad
--- /dev/null
+++ b/discord/invite.hpp
@@ -0,0 +1,15 @@
+#pragma once
+#include "json.hpp"
+#include "guild.hpp"
+#include <string>
+
+class Invite {
+public:
+ std::string Code; //
+ Guild Guild; // opt
+ Channel Channel; // opt
+ User Inviter; // opt
+ int Members = -1; // opt
+
+ friend void from_json(const nlohmann::json &j, Invite &m);
+};
diff --git a/discord/objects.hpp b/discord/objects.hpp
index 4714c85..e2526fe 100644
--- a/discord/objects.hpp
+++ b/discord/objects.hpp
@@ -11,6 +11,7 @@
#include "guild.hpp"
#include "usersettings.hpp"
#include "message.hpp"
+#include "invite.hpp"
// most stuff below should just be objects that get processed and thrown away immediately
@@ -29,6 +30,8 @@ enum class GatewayEvent : int {
MESSAGE_DELETE,
MESSAGE_UPDATE,
GUILD_MEMBER_LIST_UPDATE,
+ GUILD_CREATE,
+ GUILD_DELETE,
};
struct GatewayMessage {
diff --git a/discord/store.cpp b/discord/store.cpp
index fb0bec1..92ccaa0 100644
--- a/discord/store.cpp
+++ b/discord/store.cpp
@@ -114,6 +114,14 @@ const GuildMember *Store::GetGuildMemberData(Snowflake guild_id, Snowflake user_
return &mit->second;
}
+void Store::ClearGuild(Snowflake id) {
+ m_guilds.erase(id);
+}
+
+void Store::ClearChannel(Snowflake id) {
+ m_channels.erase(id);
+}
+
const Store::channels_type &Store::GetChannels() const {
return m_channels;
}
diff --git a/discord/store.hpp b/discord/store.hpp
index 45b1c41..6477b50 100644
--- a/discord/store.hpp
+++ b/discord/store.hpp
@@ -29,6 +29,9 @@ public:
const Message *GetMessage(Snowflake id) const;
const GuildMember *GetGuildMemberData(Snowflake guild_id, Snowflake user_id) const;
+ void ClearGuild(Snowflake id);
+ void ClearChannel(Snowflake id);
+
using users_type = std::unordered_map<Snowflake, User>;
using channels_type = std::unordered_map<Snowflake, Channel>;
using guilds_type = std::unordered_map<Snowflake, Guild>;