forked from OpenGamers/abaddon
handle THREAD_CREATE
also fix compilation also change channel_create signal to emit ChannelData
This commit is contained in:
@@ -128,6 +128,7 @@ ChannelList::ChannelList()
|
||||
discord.signal_channel_delete().connect(sigc::mem_fun(*this, &ChannelList::UpdateRemoveChannel));
|
||||
discord.signal_channel_update().connect(sigc::mem_fun(*this, &ChannelList::UpdateChannel));
|
||||
discord.signal_channel_create().connect(sigc::mem_fun(*this, &ChannelList::UpdateCreateChannel));
|
||||
discord.signal_thread_create().connect(sigc::mem_fun(*this, &ChannelList::UpdateCreateThread));
|
||||
discord.signal_guild_update().connect(sigc::mem_fun(*this, &ChannelList::UpdateGuild));
|
||||
}
|
||||
|
||||
@@ -211,32 +212,31 @@ void ChannelList::UpdateChannel(Snowflake id) {
|
||||
channel_row[m_columns.m_sort] = *channel->Position;
|
||||
}
|
||||
|
||||
void ChannelList::UpdateCreateChannel(Snowflake id) {
|
||||
const auto channel = Abaddon::Get().GetDiscordClient().GetChannel(id);
|
||||
if (!channel.has_value()) return;
|
||||
if (channel->Type == ChannelType::GUILD_CATEGORY) return (void)UpdateCreateChannelCategory(*channel);
|
||||
if (channel->Type == ChannelType::DM || channel->Type == ChannelType::GROUP_DM) return UpdateCreateDMChannel(*channel);
|
||||
if (channel->Type != ChannelType::GUILD_TEXT && channel->Type != ChannelType::GUILD_NEWS) return;
|
||||
void ChannelList::UpdateCreateChannel(const ChannelData &channel) {
|
||||
;
|
||||
if (channel.Type == ChannelType::GUILD_CATEGORY) return (void)UpdateCreateChannelCategory(channel);
|
||||
if (channel.Type == ChannelType::DM || channel.Type == ChannelType::GROUP_DM) return UpdateCreateDMChannel(channel);
|
||||
if (channel.Type != ChannelType::GUILD_TEXT && channel.Type != ChannelType::GUILD_NEWS) return;
|
||||
|
||||
Gtk::TreeRow channel_row;
|
||||
bool orphan;
|
||||
if (channel->ParentID.has_value()) {
|
||||
if (channel.ParentID.has_value()) {
|
||||
orphan = false;
|
||||
auto iter = GetIteratorForChannelFromID(*channel->ParentID);
|
||||
auto iter = GetIteratorForChannelFromID(*channel.ParentID);
|
||||
channel_row = *m_model->append(iter->children());
|
||||
} else {
|
||||
orphan = true;
|
||||
auto iter = GetIteratorForGuildFromID(*channel->GuildID);
|
||||
auto iter = GetIteratorForGuildFromID(*channel.GuildID);
|
||||
channel_row = *m_model->append(iter->children());
|
||||
}
|
||||
channel_row[m_columns.m_type] = RenderType::TextChannel;
|
||||
channel_row[m_columns.m_id] = channel->ID;
|
||||
channel_row[m_columns.m_name] = "#" + Glib::Markup::escape_text(*channel->Name);
|
||||
channel_row[m_columns.m_nsfw] = channel->NSFW();
|
||||
channel_row[m_columns.m_id] = channel.ID;
|
||||
channel_row[m_columns.m_name] = "#" + Glib::Markup::escape_text(*channel.Name);
|
||||
channel_row[m_columns.m_nsfw] = channel.NSFW();
|
||||
if (orphan)
|
||||
channel_row[m_columns.m_sort] = *channel->Position + OrphanChannelSortOffset;
|
||||
channel_row[m_columns.m_sort] = *channel.Position + OrphanChannelSortOffset;
|
||||
else
|
||||
channel_row[m_columns.m_sort] = *channel->Position;
|
||||
channel_row[m_columns.m_sort] = *channel.Position;
|
||||
}
|
||||
|
||||
void ChannelList::UpdateGuild(Snowflake id) {
|
||||
@@ -265,6 +265,12 @@ void ChannelList::UpdateGuild(Snowflake id) {
|
||||
}
|
||||
}
|
||||
|
||||
void ChannelList::UpdateCreateThread(const ChannelData &channel) {
|
||||
auto parent_row = GetIteratorForChannelFromID(*channel.ParentID);
|
||||
if (parent_row)
|
||||
CreateThreadRow(parent_row->children(), channel);
|
||||
}
|
||||
|
||||
void ChannelList::SetActiveChannel(Snowflake id) {
|
||||
const auto channel_iter = GetIteratorForChannelFromID(id);
|
||||
if (channel_iter) {
|
||||
@@ -330,14 +336,8 @@ Gtk::TreeModel::iterator ChannelList::AddGuild(const GuildData &guild) {
|
||||
const auto it = threads.find(channel.ID);
|
||||
if (it == threads.end()) return;
|
||||
|
||||
for (const auto &thread : it->second) {
|
||||
auto thread_row = *m_model->append(row.children());
|
||||
thread_row[m_columns.m_type] = RenderType::Thread;
|
||||
thread_row[m_columns.m_id] = thread.ID;
|
||||
thread_row[m_columns.m_name] = "- " + Glib::Markup::escape_text(*thread.Name);
|
||||
thread_row[m_columns.m_sort] = thread.ID;
|
||||
thread_row[m_columns.m_nsfw] = false;
|
||||
}
|
||||
for (const auto &thread : it->second)
|
||||
CreateThreadRow(row.children(), thread);
|
||||
};
|
||||
|
||||
for (const auto &channel : orphan_channels) {
|
||||
@@ -389,6 +389,18 @@ Gtk::TreeModel::iterator ChannelList::UpdateCreateChannelCategory(const ChannelD
|
||||
return cat_row;
|
||||
}
|
||||
|
||||
Gtk::TreeModel::iterator ChannelList::CreateThreadRow(const Gtk::TreeNodeChildren &children, const ChannelData &channel) {
|
||||
auto thread_iter = m_model->append(children);
|
||||
auto thread_row = *thread_iter;
|
||||
thread_row[m_columns.m_type] = RenderType::Thread;
|
||||
thread_row[m_columns.m_id] = channel.ID;
|
||||
thread_row[m_columns.m_name] = "- " + Glib::Markup::escape_text(*channel.Name);
|
||||
thread_row[m_columns.m_sort] = channel.ID;
|
||||
thread_row[m_columns.m_nsfw] = false;
|
||||
|
||||
return thread_iter;
|
||||
}
|
||||
|
||||
void ChannelList::UpdateChannelCategory(const ChannelData &channel) {
|
||||
auto iter = GetIteratorForChannelFromID(channel.ID);
|
||||
if (!iter) return;
|
||||
|
||||
@@ -139,7 +139,8 @@ protected:
|
||||
void UpdateRemoveGuild(Snowflake id);
|
||||
void UpdateRemoveChannel(Snowflake id);
|
||||
void UpdateChannel(Snowflake id);
|
||||
void UpdateCreateChannel(Snowflake id);
|
||||
void UpdateCreateChannel(const ChannelData &channel);
|
||||
void UpdateCreateThread(const ChannelData &channel);
|
||||
void UpdateGuild(Snowflake id);
|
||||
|
||||
Gtk::TreeView m_view;
|
||||
@@ -168,6 +169,7 @@ protected:
|
||||
|
||||
Gtk::TreeModel::iterator AddGuild(const GuildData &guild);
|
||||
Gtk::TreeModel::iterator UpdateCreateChannelCategory(const ChannelData &channel);
|
||||
Gtk::TreeModel::iterator CreateThreadRow(const Gtk::TreeNodeChildren &children, const ChannelData &channel);
|
||||
|
||||
void UpdateChannelCategory(const ChannelData &channel);
|
||||
|
||||
|
||||
@@ -1,13 +1,20 @@
|
||||
#include "../abaddon.hpp"
|
||||
#include "channel.hpp"
|
||||
|
||||
void from_json(const nlohmann::json &j, ThreadMetadata &m) {
|
||||
void from_json(const nlohmann::json &j, ThreadMetadataData &m) {
|
||||
JS_D("archived", m.IsArchived);
|
||||
JS_D("auto_archive_duration", m.AutoArchiveDuration);
|
||||
JS_D("archive_timestamp", m.ArchiveTimestamp);
|
||||
JS_O("locked", m.IsLocked);
|
||||
}
|
||||
|
||||
void from_json(const nlohmann::json &j, ThreadMemberObject &m) {
|
||||
JS_O("id", m.ThreadID);
|
||||
JS_O("user_id", m.ThreadID);
|
||||
JS_D("join_timestamp", m.JoinTimestamp);
|
||||
JS_D("flags", m.Flags);
|
||||
}
|
||||
|
||||
void from_json(const nlohmann::json &j, ChannelData &m) {
|
||||
JS_D("id", m.ID);
|
||||
JS_D("type", m.Type);
|
||||
@@ -29,6 +36,7 @@ void from_json(const nlohmann::json &j, ChannelData &m) {
|
||||
JS_ON("parent_id", m.ParentID);
|
||||
JS_ON("last_pin_timestamp", m.LastPinTimestamp);
|
||||
JS_O("thread_metadata", m.ThreadMetadata);
|
||||
JS_O("member", m.ThreadMember);
|
||||
}
|
||||
|
||||
void ChannelData::update_from_json(const nlohmann::json &j) {
|
||||
|
||||
@@ -38,13 +38,24 @@ constexpr const char *GetStagePrivacyDisplayString(StagePrivacy e) {
|
||||
}
|
||||
}
|
||||
|
||||
struct ThreadMetadata {
|
||||
// should be moved somewhere?
|
||||
|
||||
struct ThreadMetadataData {
|
||||
bool IsArchived;
|
||||
int AutoArchiveDuration;
|
||||
std::string ArchiveTimestamp;
|
||||
std::optional<bool> IsLocked;
|
||||
|
||||
friend void from_json(const nlohmann::json &j, ThreadMetadata &m);
|
||||
friend void from_json(const nlohmann::json &j, ThreadMetadataData &m);
|
||||
};
|
||||
|
||||
struct ThreadMemberObject {
|
||||
std::optional<Snowflake> ThreadID;
|
||||
std::optional<Snowflake> UserID;
|
||||
std::string JoinTimestamp;
|
||||
int Flags;
|
||||
|
||||
friend void from_json(const nlohmann::json &j, ThreadMemberObject &m);
|
||||
};
|
||||
|
||||
struct ChannelData {
|
||||
@@ -67,7 +78,8 @@ struct ChannelData {
|
||||
std::optional<Snowflake> ApplicationID;
|
||||
std::optional<Snowflake> ParentID; // null
|
||||
std::optional<std::string> LastPinTimestamp; // null
|
||||
std::optional<ThreadMetadata> ThreadMetadata;
|
||||
std::optional<ThreadMetadataData> ThreadMetadata;
|
||||
std::optional<ThreadMemberObject> ThreadMember;
|
||||
|
||||
friend void from_json(const nlohmann::json &j, ChannelData &m);
|
||||
void update_from_json(const nlohmann::json &j);
|
||||
|
||||
@@ -1155,6 +1155,9 @@ void DiscordClient::HandleGatewayMessage(std::string str) {
|
||||
case GatewayEvent::RELATIONSHIP_ADD: {
|
||||
HandleGatewayRelationshipAdd(m);
|
||||
} break;
|
||||
case GatewayEvent::THREAD_CREATE: {
|
||||
HandleGatewayThreadCreate(m);
|
||||
} break;
|
||||
}
|
||||
} break;
|
||||
default:
|
||||
@@ -1381,7 +1384,7 @@ void DiscordClient::HandleGatewayChannelCreate(const GatewayMessage &msg) {
|
||||
for (const auto &p : *data.PermissionOverwrites)
|
||||
m_store.SetPermissionOverwrite(data.ID, p.ID, p);
|
||||
m_store.EndTransaction();
|
||||
m_signal_channel_create.emit(data.ID);
|
||||
m_signal_channel_create.emit(data);
|
||||
}
|
||||
|
||||
void DiscordClient::HandleGatewayGuildUpdate(const GatewayMessage &msg) {
|
||||
@@ -1635,6 +1638,14 @@ void DiscordClient::HandleGatewayRelationshipAdd(const GatewayMessage &msg) {
|
||||
m_signal_relationship_add.emit(std::move(data));
|
||||
}
|
||||
|
||||
void DiscordClient::HandleGatewayThreadCreate(const GatewayMessage &msg) {
|
||||
ThreadCreateData data = msg.Data;
|
||||
|
||||
m_store.SetChannel(data.Channel.ID, data.Channel);
|
||||
|
||||
m_signal_thread_create.emit(data.Channel);
|
||||
}
|
||||
|
||||
void DiscordClient::HandleGatewayReadySupplemental(const GatewayMessage &msg) {
|
||||
ReadySupplementalData data = msg.Data;
|
||||
for (const auto &p : data.MergedPresences.Friends) {
|
||||
@@ -1997,6 +2008,7 @@ void DiscordClient::LoadEventMap() {
|
||||
m_event_map["GUILD_JOIN_REQUEST_DELETE"] = GatewayEvent::GUILD_JOIN_REQUEST_DELETE;
|
||||
m_event_map["RELATIONSHIP_REMOVE"] = GatewayEvent::RELATIONSHIP_REMOVE;
|
||||
m_event_map["RELATIONSHIP_ADD"] = GatewayEvent::RELATIONSHIP_ADD;
|
||||
m_event_map["THREAD_CREATE"] = GatewayEvent::THREAD_CREATE;
|
||||
}
|
||||
|
||||
DiscordClient::type_signal_gateway_ready DiscordClient::signal_gateway_ready() {
|
||||
@@ -2135,6 +2147,10 @@ DiscordClient::type_signal_message_pinned DiscordClient::signal_message_pinned()
|
||||
return m_signal_message_pinned;
|
||||
}
|
||||
|
||||
DiscordClient::type_signal_thread_create DiscordClient::signal_thread_create() {
|
||||
return m_signal_thread_create;
|
||||
}
|
||||
|
||||
DiscordClient::type_signal_message_sent DiscordClient::signal_message_sent() {
|
||||
return m_signal_message_sent;
|
||||
}
|
||||
|
||||
@@ -236,6 +236,7 @@ private:
|
||||
void HandleGatewayGuildJoinRequestDelete(const GatewayMessage &msg);
|
||||
void HandleGatewayRelationshipRemove(const GatewayMessage &msg);
|
||||
void HandleGatewayRelationshipAdd(const GatewayMessage &msg);
|
||||
void HandleGatewayThreadCreate(const GatewayMessage &msg);
|
||||
void HandleGatewayReadySupplemental(const GatewayMessage &msg);
|
||||
void HandleGatewayReconnect(const GatewayMessage &msg);
|
||||
void HandleGatewayInvalidSession(const GatewayMessage &msg);
|
||||
@@ -308,7 +309,7 @@ public:
|
||||
typedef sigc::signal<void, Snowflake> type_signal_guild_delete;
|
||||
typedef sigc::signal<void, Snowflake> type_signal_channel_delete;
|
||||
typedef sigc::signal<void, Snowflake> type_signal_channel_update;
|
||||
typedef sigc::signal<void, Snowflake> type_signal_channel_create;
|
||||
typedef sigc::signal<void, ChannelData> type_signal_channel_create;
|
||||
typedef sigc::signal<void, Snowflake> type_signal_guild_update;
|
||||
typedef sigc::signal<void, Snowflake, Snowflake> type_signal_role_update; // guild id, role id
|
||||
typedef sigc::signal<void, Snowflake, Snowflake> type_signal_role_create; // guild id, role id
|
||||
@@ -329,6 +330,7 @@ public:
|
||||
typedef sigc::signal<void, GuildJoinRequestDeleteData> type_signal_guild_join_request_delete;
|
||||
typedef sigc::signal<void, Snowflake, RelationshipType> type_signal_relationship_remove;
|
||||
typedef sigc::signal<void, RelationshipAddData> type_signal_relationship_add;
|
||||
typedef sigc::signal<void, ChannelData> type_signal_thread_create;
|
||||
typedef sigc::signal<void, Message> type_signal_message_unpinned; // not a real event
|
||||
typedef sigc::signal<void, Message> type_signal_message_pinned; // not a real event either
|
||||
typedef sigc::signal<void, Message> type_signal_message_sent;
|
||||
@@ -368,6 +370,7 @@ public:
|
||||
type_signal_relationship_add signal_relationship_add();
|
||||
type_signal_message_unpinned signal_message_unpinned();
|
||||
type_signal_message_pinned signal_message_pinned();
|
||||
type_signal_thread_create signal_thread_create();
|
||||
type_signal_message_sent signal_message_sent();
|
||||
type_signal_message_send_fail signal_message_send_fail();
|
||||
type_signal_disconnected signal_disconnected();
|
||||
@@ -406,6 +409,7 @@ protected:
|
||||
type_signal_relationship_add m_signal_relationship_add;
|
||||
type_signal_message_unpinned m_signal_message_unpinned;
|
||||
type_signal_message_pinned m_signal_message_pinned;
|
||||
type_signal_thread_create m_signal_thread_create;
|
||||
type_signal_message_sent m_signal_message_sent;
|
||||
type_signal_message_send_fail m_signal_message_send_fail;
|
||||
type_signal_disconnected m_signal_disconnected;
|
||||
|
||||
@@ -472,3 +472,7 @@ void to_json(nlohmann::json &j, const FriendRequestObject &m) {
|
||||
void to_json(nlohmann::json &j, const PutRelationshipObject &m) {
|
||||
JS_IF("type", m.Type);
|
||||
}
|
||||
|
||||
void from_json(const nlohmann::json &j, ThreadCreateData &m) {
|
||||
j.get_to(m.Channel);
|
||||
}
|
||||
|
||||
@@ -71,6 +71,12 @@ enum class GatewayEvent : int {
|
||||
GUILD_JOIN_REQUEST_DELETE,
|
||||
RELATIONSHIP_REMOVE,
|
||||
RELATIONSHIP_ADD,
|
||||
THREAD_CREATE,
|
||||
THREAD_UPDATE,
|
||||
THREAD_DELETE,
|
||||
THREAD_LIST_SYNC,
|
||||
THREAD_MEMBER_UPDATE,
|
||||
THREAD_MEMBERS_UPDATE,
|
||||
};
|
||||
|
||||
enum class GatewayCloseCode : uint16_t {
|
||||
@@ -659,3 +665,9 @@ struct PutRelationshipObject {
|
||||
|
||||
friend void to_json(nlohmann::json &j, const PutRelationshipObject &m);
|
||||
};
|
||||
|
||||
struct ThreadCreateData {
|
||||
ChannelData Channel;
|
||||
|
||||
friend void from_json(const nlohmann::json &j, ThreadCreateData &m);
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user