summaryrefslogtreecommitdiff
path: root/discord
diff options
context:
space:
mode:
authorouwou <26526779+ouwou@users.noreply.github.com>2020-10-07 17:22:20 -0400
committerouwou <26526779+ouwou@users.noreply.github.com>2020-10-07 17:22:20 -0400
commit2798bf96d5ec788cf7ecbcb7fbc53198ce2e5569 (patch)
tree209f46dbf500bb69639ecda7d9326860ac00b075 /discord
parent5a20b282a575c631906b5fc6e149959a15674fae (diff)
downloadabaddon-portaudio-2798bf96d5ec788cf7ecbcb7fbc53198ce2e5569.tar.gz
abaddon-portaudio-2798bf96d5ec788cf7ecbcb7fbc53198ce2e5569.zip
store emoji data
Diffstat (limited to 'discord')
-rw-r--r--discord/discord.cpp8
-rw-r--r--discord/discord.hpp1
-rw-r--r--discord/emoji.cpp20
-rw-r--r--discord/emoji.hpp22
-rw-r--r--discord/guild.cpp2
-rw-r--r--discord/guild.hpp39
-rw-r--r--discord/objects.hpp1
-rw-r--r--discord/store.cpp18
-rw-r--r--discord/store.hpp7
9 files changed, 96 insertions, 22 deletions
diff --git a/discord/discord.cpp b/discord/discord.cpp
index 79f2886..c2e1f36 100644
--- a/discord/discord.cpp
+++ b/discord/discord.cpp
@@ -5,7 +5,6 @@
DiscordClient::DiscordClient()
: m_http(DiscordAPI)
, m_decompress_buf(InflateChunkSize) {
-
m_msg_dispatch.connect(sigc::mem_fun(*this, &DiscordClient::MessageDispatch));
LoadEventMap();
@@ -206,6 +205,10 @@ const PermissionOverwrite *DiscordClient::GetPermissionOverwrite(Snowflake chann
return m_store.GetPermissionOverwrite(channel_id, id);
}
+const Emoji *DiscordClient::GetEmoji(Snowflake id) const {
+ return m_store.GetEmoji(id);
+}
+
Snowflake DiscordClient::GetMemberHoistedRole(Snowflake guild_id, Snowflake user_id, bool with_color) const {
auto *data = m_store.GetGuildMemberData(guild_id, user_id);
if (data == nullptr) return Snowflake::Invalid;
@@ -504,6 +507,9 @@ void DiscordClient::ProcessNewGuild(Guild &guild) {
for (auto &r : guild.Roles)
m_store.SetRole(r.ID, r);
+
+ for (auto &e : guild.Emojis)
+ m_store.SetEmoji(e.ID, e);
}
void DiscordClient::HandleGatewayReady(const GatewayMessage &msg) {
diff --git a/discord/discord.hpp b/discord/discord.hpp
index 47486fb..a2bbea0 100644
--- a/discord/discord.hpp
+++ b/discord/discord.hpp
@@ -82,6 +82,7 @@ public:
const Guild *GetGuild(Snowflake id) const;
const GuildMember *GetMember(Snowflake user_id, Snowflake guild_id) const;
const PermissionOverwrite *GetPermissionOverwrite(Snowflake channel_id, Snowflake id) const;
+ const Emoji *GetEmoji(Snowflake id) const;
Snowflake GetMemberHoistedRole(Snowflake guild_id, Snowflake user_id, bool with_color = false) const;
std::unordered_set<Snowflake> GetUsersInGuild(Snowflake id) const;
std::unordered_set<Snowflake> GetRolesInGuild(Snowflake id) const;
diff --git a/discord/emoji.cpp b/discord/emoji.cpp
new file mode 100644
index 0000000..1804945
--- /dev/null
+++ b/discord/emoji.cpp
@@ -0,0 +1,20 @@
+#include "emoji.hpp"
+
+void from_json(const nlohmann::json &j, Emoji &m) {
+ JS_N("id", m.ID);
+ JS_N("name", m.Name);
+ JS_O("roles", m.Roles);
+ JS_O("user", m.Creator);
+ JS_O("require_colons", m.NeedsColons);
+ JS_O("managed", m.IsManaged);
+ JS_O("animated", m.IsAnimated);
+ JS_O("available", m.IsAvailable);
+}
+
+std::string Emoji::GetURL() const {
+ return "https://cdn.discordapp.com/emojis/" + std::to_string(ID) + ".png";
+}
+
+std::string Emoji::URLFromID(std::string emoji_id) {
+ return "https://cdn.discordapp.com/emojis/" + emoji_id + ".png";
+}
diff --git a/discord/emoji.hpp b/discord/emoji.hpp
new file mode 100644
index 0000000..e4839f2
--- /dev/null
+++ b/discord/emoji.hpp
@@ -0,0 +1,22 @@
+#pragma once
+#include <string>
+#include <vector>
+#include "json.hpp"
+#include "snowflake.hpp"
+#include "user.hpp"
+
+struct Emoji {
+ Snowflake ID; // null
+ std::string Name; // null (in reactions)
+ std::vector<Snowflake> Roles; // opt
+ User Creator; // opt
+ bool NeedsColons = false; // opt
+ bool IsManaged = false; // opt
+ bool IsAnimated = false; // opt
+ bool IsAvailable = false; // opt
+
+ friend void from_json(const nlohmann::json &j, Emoji &m);
+
+ std::string GetURL() const;
+ static std::string URLFromID(std::string emoji_id);
+};
diff --git a/discord/guild.cpp b/discord/guild.cpp
index 8062575..602cdb2 100644
--- a/discord/guild.cpp
+++ b/discord/guild.cpp
@@ -26,7 +26,7 @@ void from_json(const nlohmann::json &j, Guild &m) {
JS_D("default_message_notifications", m.DefaultMessageNotifications);
JS_D("explicit_content_filter", m.ExplicitContentFilter);
JS_D("roles", m.Roles);
- // JS_D("emojis", m.Emojis);
+ JS_D("emojis", m.Emojis);
JS_D("features", m.Features);
JS_D("mfa_level", m.MFALevel);
JS_N("application_id", m.ApplicationID);
diff --git a/discord/guild.hpp b/discord/guild.hpp
index a618335..74ea851 100644
--- a/discord/guild.hpp
+++ b/discord/guild.hpp
@@ -3,31 +3,32 @@
#include "snowflake.hpp"
#include "role.hpp"
#include "channel.hpp"
+#include "emoji.hpp"
#include <vector>
#include <string>
// a bot is apparently only supposed to receive the `id` and `unavailable` as false
// but user tokens seem to get the full objects (minus users)
struct Guild {
- Snowflake ID; //
- std::string Name; //
- std::string Icon; // null
- std::string Splash; // null
- std::string DiscoverySplash; // opt, null (docs wrong)
- bool IsOwner = false; // opt
- Snowflake OwnerID; //
- int Permissions = 0; // opt
- std::string PermissionsNew; // opt
- std::string VoiceRegion; // opt
- Snowflake AFKChannelID; // null
- int AFKTimeout; //
- bool IsEmbedEnabled = false; // opt, deprecated
- Snowflake EmbedChannelID; // opt, null, deprecated
- int VerificationLevel; //
- int DefaultMessageNotifications; //
- int ExplicitContentFilter; //
- std::vector<Role> Roles; //
- // std::vector<EmojiData> Emojis; //
+ Snowflake ID; //
+ std::string Name; //
+ std::string Icon; // null
+ std::string Splash; // null
+ std::string DiscoverySplash; // opt, null (docs wrong)
+ bool IsOwner = false; // opt
+ Snowflake OwnerID; //
+ int Permissions = 0; // opt
+ std::string PermissionsNew; // opt
+ std::string VoiceRegion; // opt
+ Snowflake AFKChannelID; // null
+ int AFKTimeout; //
+ bool IsEmbedEnabled = false; // opt, deprecated
+ Snowflake EmbedChannelID; // opt, null, deprecated
+ int VerificationLevel; //
+ int DefaultMessageNotifications; //
+ int ExplicitContentFilter; //
+ std::vector<Role> Roles; //
+ std::vector<Emoji> Emojis; //
std::vector<std::string> Features; //
int MFALevel; //
Snowflake ApplicationID; // null
diff --git a/discord/objects.hpp b/discord/objects.hpp
index 00a4110..43182a6 100644
--- a/discord/objects.hpp
+++ b/discord/objects.hpp
@@ -13,6 +13,7 @@
#include "message.hpp"
#include "invite.hpp"
#include "permissions.hpp"
+#include "emoji.hpp"
// most stuff below should just be objects that get processed and thrown away immediately
diff --git a/discord/store.cpp b/discord/store.cpp
index cce9c3e..cb5204f 100644
--- a/discord/store.cpp
+++ b/discord/store.cpp
@@ -28,6 +28,10 @@ void Store::SetPermissionOverwrite(Snowflake channel_id, Snowflake id, const Per
m_permissions[channel_id][id] = perm;
}
+void Store::SetEmoji(Snowflake id, const Emoji &emoji) {
+ m_emojis[id] = emoji;
+}
+
User *Store::GetUser(Snowflake id) {
auto it = m_users.find(id);
if (it == m_users.end())
@@ -118,6 +122,13 @@ PermissionOverwrite *Store::GetPermissionOverwrite(Snowflake channel_id, Snowfla
return &pit->second;
}
+Emoji *Store::GetEmoji(Snowflake id) {
+ auto it = m_emojis.find(id);
+ if (it != m_emojis.end())
+ return &it->second;
+ return nullptr;
+}
+
const GuildMember *Store::GetGuildMemberData(Snowflake guild_id, Snowflake user_id) const {
auto git = m_members.find(guild_id);
if (git == m_members.end())
@@ -138,6 +149,13 @@ const PermissionOverwrite *Store::GetPermissionOverwrite(Snowflake channel_id, S
return &pit->second;
}
+const Emoji *Store::GetEmoji(Snowflake id) const {
+ auto it = m_emojis.find(id);
+ if (it != m_emojis.end())
+ return &it->second;
+ return nullptr;
+}
+
void Store::ClearGuild(Snowflake id) {
m_guilds.erase(id);
}
diff --git a/discord/store.hpp b/discord/store.hpp
index f805dd3..06b8faf 100644
--- a/discord/store.hpp
+++ b/discord/store.hpp
@@ -16,6 +16,7 @@ public:
void SetMessage(Snowflake id, const Message &message);
void SetGuildMemberData(Snowflake guild_id, Snowflake user_id, const GuildMember &data);
void SetPermissionOverwrite(Snowflake channel_id, Snowflake id, const PermissionOverwrite &perm);
+ void SetEmoji(Snowflake id, const Emoji &emoji);
User *GetUser(Snowflake id);
Channel *GetChannel(Snowflake id);
@@ -24,6 +25,7 @@ public:
Message *GetMessage(Snowflake id);
GuildMember *GetGuildMemberData(Snowflake guild_id, Snowflake user_id);
PermissionOverwrite *GetPermissionOverwrite(Snowflake channel_id, Snowflake id);
+ Emoji *GetEmoji(Snowflake id);
const User *GetUser(Snowflake id) const;
const Channel *GetChannel(Snowflake id) const;
const Guild *GetGuild(Snowflake id) const;
@@ -31,6 +33,7 @@ public:
const Message *GetMessage(Snowflake id) const;
const GuildMember *GetGuildMemberData(Snowflake guild_id, Snowflake user_id) const;
const PermissionOverwrite *GetPermissionOverwrite(Snowflake channel_id, Snowflake id) const;
+ const Emoji *GetEmoji(Snowflake id) const;
void ClearGuild(Snowflake id);
void ClearChannel(Snowflake id);
@@ -40,8 +43,9 @@ public:
using guilds_type = std::unordered_map<Snowflake, Guild>;
using roles_type = std::unordered_map<Snowflake, Role>;
using messages_type = std::unordered_map<Snowflake, Message>;
- using members_type = std::unordered_map<Snowflake, std::unordered_map<Snowflake, GuildMember>>; // [guild][user]
+ using members_type = std::unordered_map<Snowflake, std::unordered_map<Snowflake, GuildMember>>; // [guild][user]
using permission_overwrites_type = std::unordered_map<Snowflake, std::unordered_map<Snowflake, PermissionOverwrite>>; // [channel][user/role]
+ using emojis_type = std::unordered_map<Snowflake, Emoji>;
const channels_type &GetChannels() const;
const guilds_type &GetGuilds() const;
@@ -57,4 +61,5 @@ private:
messages_type m_messages;
members_type m_members;
permission_overwrites_type m_permissions;
+ emojis_type m_emojis;
};