This commit is contained in:
ouwou 2020-08-29 01:14:20 -04:00
parent 299ecc71d9
commit 713ed0f927
6 changed files with 99 additions and 6 deletions

View File

@ -86,6 +86,54 @@ void ChannelList::on_row_activated(Gtk::ListBoxRow *row) {
}
}
void ChannelList::AddPrivateChannels() {
auto dms = m_abaddon->GetDiscordClient().GetPrivateChannels();
auto *parent_row = Gtk::manage(new Gtk::ListBoxRow);
auto *parent_ev = Gtk::manage(new Gtk::EventBox);
auto *parent_box = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_HORIZONTAL));
auto *parent_label = Gtk::manage(new Gtk::Label);
parent_label->set_use_markup(true);
parent_label->set_markup("<b>Direct Messages</b>");
parent_box->set_halign(Gtk::ALIGN_START);
parent_box->pack_start(*parent_label);
parent_ev->add(*parent_box);
parent_row->add(*parent_ev);
parent_row->show_all();
m_list->add(*parent_row);
ListItemInfo parent_info;
parent_info.IsUserCollapsed = true;
parent_info.IsHidden = false;
parent_info.Type = ListItemInfo::ListItemType::Guild; // good nuf
for (const auto &dmid : dms) {
auto *data = m_abaddon->GetDiscordClient().GetChannel(dmid);
auto *dm_row = Gtk::manage(new Gtk::ListBoxRow);
auto *dm_ev = Gtk::manage(new Gtk::EventBox);
auto *dm_box = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_HORIZONTAL));
auto *dm_label = Gtk::manage(new Gtk::Label);
dm_label->set_text(data->Recipients[0].Username);
dm_box->set_halign(Gtk::ALIGN_START);
dm_box->pack_start(*dm_label);
dm_ev->add(*dm_box);
dm_row->add(*dm_ev);
dm_row->show_all_children();
m_list->add(*dm_row);
ListItemInfo info;
info.ID = dmid;
info.IsUserCollapsed = false;
info.IsHidden = false;
info.Type = ListItemInfo::ListItemType::Channel;
m_infos[dm_row] = std::move(info);
parent_info.Children.insert(dm_row);
}
m_infos[parent_row] = std::move(parent_info);
}
void ChannelList::SetListingFromGuildsInternal() {
DiscordClient::Guilds_t *guilds;
{
@ -109,6 +157,8 @@ void ChannelList::SetListingFromGuildsInternal() {
return;
}
AddPrivateChannels();
// map each category to its channels
std::unordered_map<Snowflake, std::vector<const ChannelData *>> cat_to_channels;
std::unordered_map<Snowflake, std::vector<const ChannelData *>> orphan_channels;

View File

@ -51,6 +51,7 @@ protected:
Glib::Dispatcher m_update_dispatcher;
mutable std::mutex m_update_mutex;
std::queue<DiscordClient::Guilds_t> m_update_queue;
void AddPrivateChannels(); // retard moment
void SetListingFromGuildsInternal();
void AttachMenuHandler(Gtk::ListBoxRow* row);

View File

@ -145,6 +145,10 @@ const MessageData *DiscordClient::GetMessage(Snowflake id) const {
return &m_messages.at(id);
}
const ChannelData *DiscordClient::GetChannel(Snowflake id) const {
return &m_channels.at(id);
}
void DiscordClient::SendChatMessage(std::string content, Snowflake channel) {
// @([^@#]{1,32})#(\\d{4})
CreateMessageObject obj;
@ -260,9 +264,17 @@ void DiscordClient::HandleGatewayReady(const GatewayMessage &msg) {
for (const auto &g : data.Guilds) {
if (g.IsUnavailable)
printf("guild (%lld) unavailable\n", g.ID);
else
else {
StoreGuild(g.ID, g);
for (const auto &c : g.Channels)
StoreChannel(c.ID, c);
}
}
for (const auto &dm : data.PrivateChannels) {
StoreChannel(dm.ID, dm);
}
m_abaddon->DiscordNotifyReady();
m_user_settings = data.UserSettings;
}
@ -291,6 +303,21 @@ void DiscordClient::StoreMessage(Snowflake id, const MessageData &m) {
m_chan_to_message_map[m.ChannelID].insert(&m_messages[id]);
}
void DiscordClient::StoreChannel(Snowflake id, const ChannelData &c) {
m_channels[id] = c;
}
std::set<Snowflake> DiscordClient::GetPrivateChannels() const {
auto ret = std::set<Snowflake>();
for (const auto &[id, chan] : m_channels) {
if (chan.Type == ChannelType::DM || chan.Type == ChannelType::GROUP_DM)
ret.insert(id);
}
return ret;
}
void DiscordClient::HeartbeatThread() {
while (m_client_connected) {
if (!m_heartbeat_acked) {

View File

@ -57,6 +57,7 @@ public:
void Stop();
bool IsStarted() const;
using Channels_t = std::unordered_map<Snowflake, ChannelData>;
using Guilds_t = std::unordered_map<Snowflake, GuildData>;
using Messages_t = std::unordered_map<Snowflake, MessageData>;
@ -64,11 +65,13 @@ public:
const UserSettingsData &GetUserSettings() const;
std::vector<std::pair<Snowflake, GuildData>> GetUserSortedGuilds() const;
std::unordered_set<const MessageData *> GetMessagesForChannel(Snowflake id) const;
std::set<Snowflake> GetPrivateChannels() const;
void UpdateSettingsGuildPositions(const std::vector<Snowflake> &pos);
void FetchMessagesInChannel(Snowflake id, std::function<void(const std::vector<MessageData> &)> cb);
void FetchMessagesInChannelBefore(Snowflake channel_id, Snowflake before_id, std::function<void(const std::vector<MessageData> &)> cb);
const MessageData *GetMessage(Snowflake id) const;
const ChannelData *GetChannel(Snowflake id) const;
void SendChatMessage(std::string content, Snowflake channel);
@ -103,6 +106,9 @@ private:
Messages_t m_messages;
std::unordered_map<Snowflake, std::unordered_set<const MessageData *>> m_chan_to_message_map;
void StoreChannel(Snowflake id, const ChannelData &c);
Channels_t m_channels;
UserSettingsData m_user_settings;
Websocket m_websocket;

View File

@ -169,6 +169,7 @@ void from_json(const nlohmann::json &j, ReadyEventData &m) {
JS_D("analytics_token", m.AnalyticsToken);
JS_D("friend_suggestion_count", m.FriendSuggestionCount);
JS_D("user_settings", m.UserSettings);
JS_D("private_channels", m.PrivateChannels);
}
void from_json(const nlohmann::json &j, UserSettingsData &m) {

View File

@ -361,12 +361,20 @@ struct MessageData {
friend void from_json(const nlohmann::json &j, MessageData &m);
};
struct MessageDeleteData {
Snowflake ID; //
Snowflake ChannelID; //
Snowflake GuildID; // opt
friend void from_json(const nlohmann::json &j, MessageDeleteData &m);
};
struct ReadyEventData {
int GatewayVersion; //
UserData User; //
std::vector<GuildData> Guilds; //
std::string SessionID; //
// std::vector<ChannelData?/PrivateChannelData?> PrivateChannels;
int GatewayVersion; //
UserData User; //
std::vector<GuildData> Guilds; //
std::string SessionID; //
std::vector<ChannelData> PrivateChannels; //
// undocumented
std::string AnalyticsToken; // opt