summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorouwou <26526779+ouwou@users.noreply.github.com>2021-02-09 16:47:17 -0500
committerouwou <26526779+ouwou@users.noreply.github.com>2021-02-09 16:47:17 -0500
commitaaef45752648ff5d99ebac3a11341da9a2b95aaf (patch)
tree2c36627a43a20e103b0ae5573332b21f7c40dc1e
parent2ddac42575aee5370d01701ce50444713d4d44b9 (diff)
downloadabaddon-portaudio-aaef45752648ff5d99ebac3a11341da9a2b95aaf.tar.gz
abaddon-portaudio-aaef45752648ff5d99ebac3a11341da9a2b95aaf.zip
show status indicator in dm list, handle (some of) READY_SUPPLEMENTAL
-rw-r--r--components/channels.cpp6
-rw-r--r--components/channels.hpp2
-rw-r--r--discord/discord.cpp20
-rw-r--r--discord/discord.hpp1
-rw-r--r--discord/objects.cpp15
-rw-r--r--discord/objects.hpp22
6 files changed, 66 insertions, 0 deletions
diff --git a/components/channels.cpp b/components/channels.cpp
index 391a1a1..cd5fee9 100644
--- a/components/channels.cpp
+++ b/components/channels.cpp
@@ -5,6 +5,7 @@
#include "../abaddon.hpp"
#include "../imgmanager.hpp"
#include "../util.hpp"
+#include "statusindicator.hpp"
void ChannelListRow::Collapse() {}
@@ -61,6 +62,9 @@ ChannelListRowDMChannel::ChannelListRowDMChannel(const ChannelData *data) {
top_recipient = recipients[0];
if (data->Type == ChannelType::DM) {
+ m_status = Gtk::manage(new StatusIndicator(top_recipient.ID));
+ m_status->set_margin_start(5);
+
if (top_recipient.HasAvatar()) {
m_icon = Gtk::manage(new Gtk::Image(Abaddon::Get().GetImageManager().GetPlaceholder(24)));
auto cb = [this](const Glib::RefPtr<Gdk::Pixbuf> &pb) {
@@ -82,6 +86,8 @@ ChannelListRowDMChannel::ChannelListRowDMChannel(const ChannelData *data) {
m_box->set_halign(Gtk::ALIGN_START);
if (m_icon != nullptr)
m_box->pack_start(*m_icon);
+ if (m_status != nullptr)
+ m_box->pack_start(*m_status);
m_box->pack_start(*m_lbl);
m_ev->add(*m_box);
add(*m_ev);
diff --git a/components/channels.hpp b/components/channels.hpp
index f537043..d7fda18 100644
--- a/components/channels.hpp
+++ b/components/channels.hpp
@@ -33,6 +33,7 @@ protected:
Gtk::Label *m_lbl;
};
+class StatusIndicator;
class ChannelListRowDMChannel : public ChannelListRow {
public:
ChannelListRowDMChannel(const ChannelData *data);
@@ -40,6 +41,7 @@ public:
protected:
Gtk::EventBox *m_ev;
Gtk::Box *m_box;
+ StatusIndicator *m_status = nullptr;
Gtk::TextView *m_lbl;
Gtk::Image *m_icon = nullptr;
};
diff --git a/discord/discord.cpp b/discord/discord.cpp
index eb323f9..5b6bf4e 100644
--- a/discord/discord.cpp
+++ b/discord/discord.cpp
@@ -791,6 +791,9 @@ void DiscordClient::HandleGatewayMessage(std::string str) {
case GatewayEvent::USER_NOTE_UPDATE: {
HandleGatewayUserNoteUpdate(m);
} break;
+ case GatewayEvent::READY_SUPPLEMENTAL: {
+ HandleGatewayReadySupplemental(m);
+ } break;
}
} break;
default:
@@ -1174,6 +1177,22 @@ void DiscordClient::HandleGatewayUserNoteUpdate(const GatewayMessage &msg) {
m_signal_note_update.emit(data.ID, data.Note);
}
+void DiscordClient::HandleGatewayReadySupplemental(const GatewayMessage &msg) {
+ ReadySupplementalData data = msg.Data;
+ for (const auto &p : data.MergedPresences.Friends) {
+ const auto s = p.Presence.Status;
+ if (s == "online")
+ m_user_to_status[p.UserID] = PresenceStatus::Online;
+ else if (s == "offline")
+ m_user_to_status[p.UserID] = PresenceStatus::Offline;
+ else if (s == "idle")
+ m_user_to_status[p.UserID] = PresenceStatus::Idle;
+ else if (s == "dnd")
+ m_user_to_status[p.UserID] = PresenceStatus::DND;
+ m_signal_presence_update.emit(p.UserID, m_user_to_status.at(p.UserID));
+ }
+}
+
void DiscordClient::HandleGatewayReconnect(const GatewayMessage &msg) {
printf("received reconnect\n");
m_signal_disconnected.emit(true, GatewayCloseCode::Reconnecting);
@@ -1455,6 +1474,7 @@ void DiscordClient::LoadEventMap() {
m_event_map["INVITE_CREATE"] = GatewayEvent::INVITE_CREATE;
m_event_map["INVITE_DELETE"] = GatewayEvent::INVITE_DELETE;
m_event_map["USER_NOTE_UPDATE"] = GatewayEvent::USER_NOTE_UPDATE;
+ m_event_map["READY_SUPPLEMENTAL"] = GatewayEvent::READY_SUPPLEMENTAL;
}
DiscordClient::type_signal_gateway_ready DiscordClient::signal_gateway_ready() {
diff --git a/discord/discord.hpp b/discord/discord.hpp
index 1601a21..42eb197 100644
--- a/discord/discord.hpp
+++ b/discord/discord.hpp
@@ -179,6 +179,7 @@ private:
void HandleGatewayInviteCreate(const GatewayMessage &msg);
void HandleGatewayInviteDelete(const GatewayMessage &msg);
void HandleGatewayUserNoteUpdate(const GatewayMessage &msg);
+ void HandleGatewayReadySupplemental(const GatewayMessage &msg);
void HandleGatewayReconnect(const GatewayMessage &msg);
void HandleGatewayInvalidSession(const GatewayMessage &msg);
void HeartbeatThread();
diff --git a/discord/objects.cpp b/discord/objects.cpp
index 09f7939..e4275a3 100644
--- a/discord/objects.cpp
+++ b/discord/objects.cpp
@@ -120,6 +120,21 @@ void from_json(const nlohmann::json &j, ReadyEventData &m) {
JS_ON("merged_members", m.MergedMembers);
}
+void from_json(const nlohmann::json &j, MergedPresence &m) {
+ JS_D("user_id", m.UserID);
+ JS_O("last_modified", m.LastModified);
+ m.Presence = j;
+}
+
+void from_json(const nlohmann::json &j, SupplementalMergedPresencesData &m) {
+ JS_D("guilds", m.Guilds);
+ JS_D("friends", m.Friends);
+}
+
+void from_json(const nlohmann::json &j, ReadySupplementalData &m) {
+ JS_D("merged_presences", m.MergedPresences);
+}
+
void to_json(nlohmann::json &j, const IdentifyProperties &m) {
j["os"] = m.OS;
j["browser"] = m.Browser;
diff --git a/discord/objects.hpp b/discord/objects.hpp
index 85f940f..2f97805 100644
--- a/discord/objects.hpp
+++ b/discord/objects.hpp
@@ -62,6 +62,7 @@ enum class GatewayEvent : int {
INVITE_CREATE,
INVITE_DELETE,
USER_NOTE_UPDATE,
+ READY_SUPPLEMENTAL,
};
enum class GatewayCloseCode : uint16_t {
@@ -213,6 +214,27 @@ struct ReadyEventData {
friend void from_json(const nlohmann::json &j, ReadyEventData &m);
};
+struct MergedPresence {
+ Snowflake UserID;
+ std::optional<uint64_t> LastModified;
+ PresenceData Presence;
+
+ friend void from_json(const nlohmann::json &j, MergedPresence &m);
+};
+
+struct SupplementalMergedPresencesData {
+ std::vector<std::vector<MergedPresence>> Guilds;
+ std::vector<MergedPresence> Friends;
+
+ friend void from_json(const nlohmann::json &j, SupplementalMergedPresencesData &m);
+};
+
+struct ReadySupplementalData {
+ SupplementalMergedPresencesData MergedPresences;
+
+ friend void from_json(const nlohmann::json &j, ReadySupplementalData &m);
+};
+
struct IdentifyProperties {
std::string OS;
std::string Browser;