forked from OpenGamers/abaddon
handle archiving via THREAD_UPDATE (sorta)
This commit is contained in:
@@ -142,6 +142,7 @@ ChannelList::ChannelList()
|
|||||||
discord.signal_channel_update().connect(sigc::mem_fun(*this, &ChannelList::UpdateChannel));
|
discord.signal_channel_update().connect(sigc::mem_fun(*this, &ChannelList::UpdateChannel));
|
||||||
discord.signal_channel_create().connect(sigc::mem_fun(*this, &ChannelList::UpdateCreateChannel));
|
discord.signal_channel_create().connect(sigc::mem_fun(*this, &ChannelList::UpdateCreateChannel));
|
||||||
discord.signal_thread_delete().connect(sigc::mem_fun(*this, &ChannelList::OnThreadDelete));
|
discord.signal_thread_delete().connect(sigc::mem_fun(*this, &ChannelList::OnThreadDelete));
|
||||||
|
discord.signal_thread_update().connect(sigc::mem_fun(*this, &ChannelList::OnThreadUpdate));
|
||||||
discord.signal_thread_list_sync().connect(sigc::mem_fun(*this, &ChannelList::OnThreadListSync));
|
discord.signal_thread_list_sync().connect(sigc::mem_fun(*this, &ChannelList::OnThreadListSync));
|
||||||
discord.signal_added_to_thread().connect(sigc::mem_fun(*this, &ChannelList::OnThreadJoined));
|
discord.signal_added_to_thread().connect(sigc::mem_fun(*this, &ChannelList::OnThreadJoined));
|
||||||
discord.signal_removed_from_thread().connect(sigc::mem_fun(*this, &ChannelList::OnThreadRemoved));
|
discord.signal_removed_from_thread().connect(sigc::mem_fun(*this, &ChannelList::OnThreadRemoved));
|
||||||
@@ -291,14 +292,19 @@ void ChannelList::OnThreadJoined(Snowflake id) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ChannelList::OnThreadRemoved(Snowflake id) {
|
void ChannelList::OnThreadRemoved(Snowflake id) {
|
||||||
if (GetIteratorForChannelFromID(id))
|
DeleteThreadRow(id);
|
||||||
DeleteThreadRow(id);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ChannelList::OnThreadDelete(const ThreadDeleteData &data) {
|
void ChannelList::OnThreadDelete(const ThreadDeleteData &data) {
|
||||||
DeleteThreadRow(data.ID);
|
DeleteThreadRow(data.ID);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// todo probably make the row stick around if its selected until the selection changes
|
||||||
|
void ChannelList::OnThreadUpdate(const ThreadUpdateData &data) {
|
||||||
|
if (data.Thread.ThreadMetadata->IsArchived)
|
||||||
|
DeleteThreadRow(data.Thread.ID);
|
||||||
|
}
|
||||||
|
|
||||||
void ChannelList::OnThreadListSync(const ThreadListSyncData &data) {
|
void ChannelList::OnThreadListSync(const ThreadListSyncData &data) {
|
||||||
// get the threads in the guild
|
// get the threads in the guild
|
||||||
std::vector<Snowflake> threads;
|
std::vector<Snowflake> threads;
|
||||||
@@ -317,7 +323,7 @@ void ChannelList::OnThreadListSync(const ThreadListSyncData &data) {
|
|||||||
|
|
||||||
// delete all threads not present in the synced data
|
// delete all threads not present in the synced data
|
||||||
for (auto thread_id : threads) {
|
for (auto thread_id : threads) {
|
||||||
if (std::find_if(data.Threads.begin(), data.Threads.end(), [thread_id](const auto& x) { return x.ID == thread_id; }) == data.Threads.end()) {
|
if (std::find_if(data.Threads.begin(), data.Threads.end(), [thread_id](const auto &x) { return x.ID == thread_id; }) == data.Threads.end()) {
|
||||||
auto iter = GetIteratorForChannelFromID(thread_id);
|
auto iter = GetIteratorForChannelFromID(thread_id);
|
||||||
m_model->erase(iter);
|
m_model->erase(iter);
|
||||||
}
|
}
|
||||||
@@ -336,7 +342,7 @@ void ChannelList::SetActiveChannel(Snowflake id) {
|
|||||||
if (m_temporary_thread_row) {
|
if (m_temporary_thread_row) {
|
||||||
const auto thread_id = static_cast<Snowflake>((*m_temporary_thread_row)[m_columns.m_id]);
|
const auto thread_id = static_cast<Snowflake>((*m_temporary_thread_row)[m_columns.m_id]);
|
||||||
const auto thread = Abaddon::Get().GetDiscordClient().GetChannel(thread_id);
|
const auto thread = Abaddon::Get().GetDiscordClient().GetChannel(thread_id);
|
||||||
if (thread.has_value() && !thread->IsJoinedThread())
|
if (thread.has_value() && (!thread->IsJoinedThread() || thread->ThreadMetadata->IsArchived))
|
||||||
m_model->erase(m_temporary_thread_row);
|
m_model->erase(m_temporary_thread_row);
|
||||||
m_temporary_thread_row = {};
|
m_temporary_thread_row = {};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -146,6 +146,7 @@ protected:
|
|||||||
void OnThreadJoined(Snowflake id);
|
void OnThreadJoined(Snowflake id);
|
||||||
void OnThreadRemoved(Snowflake id);
|
void OnThreadRemoved(Snowflake id);
|
||||||
void OnThreadDelete(const ThreadDeleteData &data);
|
void OnThreadDelete(const ThreadDeleteData &data);
|
||||||
|
void OnThreadUpdate(const ThreadUpdateData &data);
|
||||||
void OnThreadListSync(const ThreadListSyncData &data);
|
void OnThreadListSync(const ThreadListSyncData &data);
|
||||||
|
|
||||||
Gtk::TreeView m_view;
|
Gtk::TreeView m_view;
|
||||||
|
|||||||
@@ -1220,6 +1220,9 @@ void DiscordClient::HandleGatewayMessage(std::string str) {
|
|||||||
case GatewayEvent::THREAD_MEMBER_UPDATE: {
|
case GatewayEvent::THREAD_MEMBER_UPDATE: {
|
||||||
HandleGatewayThreadMemberUpdate(m);
|
HandleGatewayThreadMemberUpdate(m);
|
||||||
} break;
|
} break;
|
||||||
|
case GatewayEvent::THREAD_UPDATE: {
|
||||||
|
HandleGatewayThreadUpdate(m);
|
||||||
|
} break;
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
default:
|
default:
|
||||||
@@ -1749,6 +1752,12 @@ void DiscordClient::HandleGatewayThreadMemberUpdate(const GatewayMessage &msg) {
|
|||||||
m_signal_added_to_thread.emit(*data.Member.ThreadID);
|
m_signal_added_to_thread.emit(*data.Member.ThreadID);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DiscordClient::HandleGatewayThreadUpdate(const GatewayMessage &msg) {
|
||||||
|
ThreadUpdateData data = msg.Data;
|
||||||
|
m_store.SetChannel(data.Thread.ID, data.Thread);
|
||||||
|
m_signal_thread_update.emit(data);
|
||||||
|
}
|
||||||
|
|
||||||
void DiscordClient::HandleGatewayReadySupplemental(const GatewayMessage &msg) {
|
void DiscordClient::HandleGatewayReadySupplemental(const GatewayMessage &msg) {
|
||||||
ReadySupplementalData data = msg.Data;
|
ReadySupplementalData data = msg.Data;
|
||||||
for (const auto &p : data.MergedPresences.Friends) {
|
for (const auto &p : data.MergedPresences.Friends) {
|
||||||
@@ -2116,6 +2125,7 @@ void DiscordClient::LoadEventMap() {
|
|||||||
m_event_map["THREAD_LIST_SYNC"] = GatewayEvent::THREAD_LIST_SYNC;
|
m_event_map["THREAD_LIST_SYNC"] = GatewayEvent::THREAD_LIST_SYNC;
|
||||||
m_event_map["THREAD_MEMBERS_UPDATE"] = GatewayEvent::THREAD_MEMBERS_UPDATE;
|
m_event_map["THREAD_MEMBERS_UPDATE"] = GatewayEvent::THREAD_MEMBERS_UPDATE;
|
||||||
m_event_map["THREAD_MEMBER_UPDATE"] = GatewayEvent::THREAD_MEMBER_UPDATE;
|
m_event_map["THREAD_MEMBER_UPDATE"] = GatewayEvent::THREAD_MEMBER_UPDATE;
|
||||||
|
m_event_map["THREAD_UPDATE"] = GatewayEvent::THREAD_UPDATE;
|
||||||
}
|
}
|
||||||
|
|
||||||
DiscordClient::type_signal_gateway_ready DiscordClient::signal_gateway_ready() {
|
DiscordClient::type_signal_gateway_ready DiscordClient::signal_gateway_ready() {
|
||||||
@@ -2270,6 +2280,10 @@ DiscordClient::type_signal_thread_members_update DiscordClient::signal_thread_me
|
|||||||
return m_signal_thread_members_update;
|
return m_signal_thread_members_update;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DiscordClient::type_signal_thread_update DiscordClient::signal_thread_update() {
|
||||||
|
return m_signal_thread_update;
|
||||||
|
}
|
||||||
|
|
||||||
DiscordClient::type_signal_added_to_thread DiscordClient::signal_added_to_thread() {
|
DiscordClient::type_signal_added_to_thread DiscordClient::signal_added_to_thread() {
|
||||||
return m_signal_added_to_thread;
|
return m_signal_added_to_thread;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -245,6 +245,7 @@ private:
|
|||||||
void HandleGatewayThreadListSync(const GatewayMessage &msg);
|
void HandleGatewayThreadListSync(const GatewayMessage &msg);
|
||||||
void HandleGatewayThreadMembersUpdate(const GatewayMessage &msg);
|
void HandleGatewayThreadMembersUpdate(const GatewayMessage &msg);
|
||||||
void HandleGatewayThreadMemberUpdate(const GatewayMessage &msg);
|
void HandleGatewayThreadMemberUpdate(const GatewayMessage &msg);
|
||||||
|
void HandleGatewayThreadUpdate(const GatewayMessage &msg);
|
||||||
void HandleGatewayReadySupplemental(const GatewayMessage &msg);
|
void HandleGatewayReadySupplemental(const GatewayMessage &msg);
|
||||||
void HandleGatewayReconnect(const GatewayMessage &msg);
|
void HandleGatewayReconnect(const GatewayMessage &msg);
|
||||||
void HandleGatewayInvalidSession(const GatewayMessage &msg);
|
void HandleGatewayInvalidSession(const GatewayMessage &msg);
|
||||||
@@ -340,6 +341,7 @@ public:
|
|||||||
typedef sigc::signal<void, ThreadDeleteData> type_signal_thread_delete;
|
typedef sigc::signal<void, ThreadDeleteData> type_signal_thread_delete;
|
||||||
typedef sigc::signal<void, ThreadListSyncData> type_signal_thread_list_sync;
|
typedef sigc::signal<void, ThreadListSyncData> type_signal_thread_list_sync;
|
||||||
typedef sigc::signal<void, ThreadMembersUpdateData> type_signal_thread_members_update;
|
typedef sigc::signal<void, ThreadMembersUpdateData> type_signal_thread_members_update;
|
||||||
|
typedef sigc::signal<void, ThreadUpdateData> type_signal_thread_update;
|
||||||
|
|
||||||
// not discord dispatch events
|
// not discord dispatch events
|
||||||
typedef sigc::signal<void, Snowflake> type_signal_added_to_thread;
|
typedef sigc::signal<void, Snowflake> type_signal_added_to_thread;
|
||||||
@@ -388,6 +390,7 @@ public:
|
|||||||
type_signal_thread_delete signal_thread_delete();
|
type_signal_thread_delete signal_thread_delete();
|
||||||
type_signal_thread_list_sync signal_thread_list_sync();
|
type_signal_thread_list_sync signal_thread_list_sync();
|
||||||
type_signal_thread_members_update signal_thread_members_update();
|
type_signal_thread_members_update signal_thread_members_update();
|
||||||
|
type_signal_thread_update signal_thread_update();
|
||||||
type_signal_added_to_thread signal_added_to_thread();
|
type_signal_added_to_thread signal_added_to_thread();
|
||||||
type_signal_removed_from_thread signal_removed_from_thread();
|
type_signal_removed_from_thread signal_removed_from_thread();
|
||||||
type_signal_message_sent signal_message_sent();
|
type_signal_message_sent signal_message_sent();
|
||||||
@@ -432,6 +435,7 @@ protected:
|
|||||||
type_signal_thread_delete m_signal_thread_delete;
|
type_signal_thread_delete m_signal_thread_delete;
|
||||||
type_signal_thread_list_sync m_signal_thread_list_sync;
|
type_signal_thread_list_sync m_signal_thread_list_sync;
|
||||||
type_signal_thread_members_update m_signal_thread_members_update;
|
type_signal_thread_members_update m_signal_thread_members_update;
|
||||||
|
type_signal_thread_update m_signal_thread_update;
|
||||||
type_signal_removed_from_thread m_signal_removed_from_thread;
|
type_signal_removed_from_thread m_signal_removed_from_thread;
|
||||||
type_signal_added_to_thread m_signal_added_to_thread;
|
type_signal_added_to_thread m_signal_added_to_thread;
|
||||||
type_signal_message_sent m_signal_message_sent;
|
type_signal_message_sent m_signal_message_sent;
|
||||||
|
|||||||
@@ -507,3 +507,7 @@ void from_json(const nlohmann::json &j, ArchivedThreadsResponseData &m) {
|
|||||||
void from_json(const nlohmann::json &j, ThreadMemberUpdateData &m) {
|
void from_json(const nlohmann::json &j, ThreadMemberUpdateData &m) {
|
||||||
m.Member = j;
|
m.Member = j;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void from_json(const nlohmann::json &j, ThreadUpdateData &m) {
|
||||||
|
m.Thread = j;
|
||||||
|
}
|
||||||
|
|||||||
@@ -714,3 +714,9 @@ struct ThreadMemberUpdateData {
|
|||||||
|
|
||||||
friend void from_json(const nlohmann::json &j, ThreadMemberUpdateData &m);
|
friend void from_json(const nlohmann::json &j, ThreadMemberUpdateData &m);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct ThreadUpdateData {
|
||||||
|
ChannelData Thread;
|
||||||
|
|
||||||
|
friend void from_json(const nlohmann::json &j, ThreadUpdateData &m);
|
||||||
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user