diff options
-rw-r--r-- | components/channels.cpp | 6 | ||||
-rw-r--r-- | components/channels.hpp | 2 | ||||
-rw-r--r-- | discord/discord.cpp | 20 | ||||
-rw-r--r-- | discord/discord.hpp | 1 | ||||
-rw-r--r-- | discord/objects.cpp | 15 | ||||
-rw-r--r-- | discord/objects.hpp | 22 |
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; |