summaryrefslogtreecommitdiff
path: root/discord
diff options
context:
space:
mode:
authorouwou <26526779+ouwou@users.noreply.github.com>2020-10-13 02:35:02 -0400
committerouwou <26526779+ouwou@users.noreply.github.com>2020-10-13 02:35:02 -0400
commit99597a80d2eb9752882791d458036c2c17969767 (patch)
tree653aafc326b79875c9117b29b8c4ca5407b3023e /discord
parentc17842c16f10f55f2f0923e94033a482ef98838e (diff)
downloadabaddon-portaudio-99597a80d2eb9752882791d458036c2c17969767.tar.gz
abaddon-portaudio-99597a80d2eb9752882791d458036c2c17969767.zip
add PRESENCE_UPDATE handling (for user object only)
Diffstat (limited to 'discord')
-rw-r--r--discord/discord.cpp10
-rw-r--r--discord/discord.hpp1
-rw-r--r--discord/objects.cpp14
-rw-r--r--discord/objects.hpp19
-rw-r--r--discord/user.cpp19
-rw-r--r--discord/user.hpp1
6 files changed, 64 insertions, 0 deletions
diff --git a/discord/discord.cpp b/discord/discord.cpp
index 73b03a3..298bb8a 100644
--- a/discord/discord.cpp
+++ b/discord/discord.cpp
@@ -519,6 +519,9 @@ void DiscordClient::HandleGatewayMessage(std::string str) {
case GatewayEvent::GUILD_MEMBER_UPDATE: {
HandleGatewayGuildMemberUpdate(m);
} break;
+ case GatewayEvent::PRESENCE_UPDATE: {
+ HandleGatewayPresenceUpdate(m);
+ } break;
}
} break;
default:
@@ -600,6 +603,12 @@ void DiscordClient::HandleGatewayGuildMemberUpdate(const GatewayMessage &msg) {
m_store.SetGuildMemberData(data.GuildID, data.User.ID, member);
}
+void DiscordClient::HandleGatewayPresenceUpdate(const GatewayMessage &msg) {
+ PresenceUpdateMessage data = msg.Data;
+ auto cur = m_store.GetUser(data.User.at("id").get<Snowflake>());
+ User::update_from_json(data.User, *cur);
+}
+
void DiscordClient::HandleGatewayMessageUpdate(const GatewayMessage &msg) {
Snowflake id = msg.Data.at("id");
@@ -728,6 +737,7 @@ void DiscordClient::LoadEventMap() {
m_event_map["GUILD_DELETE"] = GatewayEvent::GUILD_DELETE;
m_event_map["MESSAGE_DELETE_BULK"] = GatewayEvent::MESSAGE_DELETE_BULK;
m_event_map["GUILD_MEMBER_UPDATE"] = GatewayEvent::GUILD_MEMBER_UPDATE;
+ m_event_map["PRESENCE_UPDATE"] = GatewayEvent::PRESENCE_UPDATE;
}
DiscordClient::type_signal_gateway_ready DiscordClient::signal_gateway_ready() {
diff --git a/discord/discord.hpp b/discord/discord.hpp
index d479433..76a64af 100644
--- a/discord/discord.hpp
+++ b/discord/discord.hpp
@@ -124,6 +124,7 @@ private:
void HandleGatewayGuildDelete(const GatewayMessage &msg);
void HandleGatewayMessageDeleteBulk(const GatewayMessage &msg);
void HandleGatewayGuildMemberUpdate(const GatewayMessage &msg);
+ void HandleGatewayPresenceUpdate(const GatewayMessage &msg);
void HeartbeatThread();
void SendIdentify();
diff --git a/discord/objects.cpp b/discord/objects.cpp
index c3f1e4f..0324ce3 100644
--- a/discord/objects.cpp
+++ b/discord/objects.cpp
@@ -141,3 +141,17 @@ void from_json(const nlohmann::json &j, GuildMemberUpdateMessage &m) {
JS_ON("nick", m.Nick);
JS_D("joined_at", m.JoinedAt);
}
+
+void from_json(const nlohmann::json &j, ClientStatus &m) {
+ JS_O("desktop", m.Desktop);
+ JS_O("mobile", m.Mobile);
+ JS_O("web", m.Web);
+}
+
+void from_json(const nlohmann::json &j, PresenceUpdateMessage &m) {
+ m.User = j.at("user");
+ JS_D("guild_id", m.GuildID);
+ JS_D("status", m.Status);
+ // JS_D("activities", m.Activities);
+ JS_D("client_status", m.ClientStatus);
+}
diff --git a/discord/objects.hpp b/discord/objects.hpp
index 602991b..3b4491c 100644
--- a/discord/objects.hpp
+++ b/discord/objects.hpp
@@ -36,6 +36,7 @@ enum class GatewayEvent : int {
GUILD_DELETE,
MESSAGE_DELETE_BULK,
GUILD_MEMBER_UPDATE,
+ PRESENCE_UPDATE,
};
struct GatewayMessage {
@@ -201,3 +202,21 @@ struct GuildMemberUpdateMessage {
friend void from_json(const nlohmann::json &j, GuildMemberUpdateMessage &m);
};
+
+struct ClientStatus {
+ std::string Desktop; // opt
+ std::string Mobile; // opt
+ std::string Web; // opt
+
+ friend void from_json(const nlohmann::json &j, ClientStatus &m);
+};
+
+struct PresenceUpdateMessage {
+ nlohmann::json User; // the client updates an existing object from this data
+ Snowflake GuildID;
+ std::string Status;
+ // std::vector<Activity> Activities;
+ ClientStatus ClientStatus;
+
+ friend void from_json(const nlohmann::json &j, PresenceUpdateMessage &m);
+};
diff --git a/discord/user.cpp b/discord/user.cpp
index 2e136e1..c7858d5 100644
--- a/discord/user.cpp
+++ b/discord/user.cpp
@@ -32,3 +32,22 @@ void from_json(const nlohmann::json &j, User &m) {
JS_ON("nsfw_allowed", m.IsNSFWAllowed);
JS_ON("phone", m.Phone);
}
+
+void User::update_from_json(const nlohmann::json &j, User &m) {
+ JS_ON("username", m.Username);
+ JS_ON("discriminator", m.Discriminator);
+ JS_ON("avatar", m.Avatar);
+ JS_ON("bot", m.IsBot);
+ JS_ON("system", m.IsSystem);
+ JS_ON("mfa_enabled", m.IsMFAEnabled);
+ JS_ON("locale", m.Locale);
+ JS_ON("verified", m.IsVerified);
+ JS_ON("email", m.Email);
+ JS_ON("flags", m.Flags);
+ JS_ON("premium_type", m.PremiumType);
+ JS_ON("public_flags", m.PublicFlags);
+ JS_ON("desktop", m.IsDesktop);
+ JS_ON("mobile", m.IsMobile);
+ JS_ON("nsfw_allowed", m.IsNSFWAllowed);
+ JS_ON("phone", m.Phone);
+}
diff --git a/discord/user.hpp b/discord/user.hpp
index 54f082f..e3d893d 100644
--- a/discord/user.hpp
+++ b/discord/user.hpp
@@ -25,6 +25,7 @@ struct User {
std::string Phone; // null?
friend void from_json(const nlohmann::json &j, User &m);
+ static void update_from_json(const nlohmann::json &j, User &m);
bool HasAvatar() const;
std::string GetAvatarURL(std::string ext = "png", std::string size = "32") const;