forked from OpenGamers/abaddon
basic THREAD_MEMBERS_UPDATE handling for updating channel list
This commit is contained in:
@@ -142,7 +142,8 @@ ChannelList::ChannelList()
|
||||
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_thread_delete().connect(sigc::mem_fun(*this, &ChannelList::UpdateDeleteThread));
|
||||
discord.signal_thread_delete().connect(sigc::mem_fun(*this, &ChannelList::OnThreadDelete));
|
||||
discord.signal_thread_members_update().connect(sigc::mem_fun(*this, &ChannelList::OnThreadMembersUpdate));
|
||||
discord.signal_guild_update().connect(sigc::mem_fun(*this, &ChannelList::UpdateGuild));
|
||||
}
|
||||
|
||||
@@ -279,14 +280,25 @@ void ChannelList::UpdateGuild(Snowflake id) {
|
||||
}
|
||||
}
|
||||
|
||||
void ChannelList::OnThreadDelete(const ThreadDeleteData &data) {
|
||||
UpdateDeleteThread(data.ID);
|
||||
}
|
||||
|
||||
void ChannelList::OnThreadMembersUpdate(const ThreadMembersUpdateData &data) {
|
||||
auto &r = data.RemovedMemberIDs;
|
||||
if (r.has_value() && std::find(r->begin(), r->end(), Abaddon::Get().GetDiscordClient().GetUserData().ID) != r->end()) {
|
||||
UpdateDeleteThread(data.ID);
|
||||
}
|
||||
}
|
||||
|
||||
void ChannelList::UpdateCreateThread(const ChannelData &channel) {
|
||||
auto parent_row = GetIteratorForChannelFromID(*channel.ParentID);
|
||||
if (parent_row)
|
||||
CreateThreadRow(parent_row->children(), channel);
|
||||
}
|
||||
|
||||
void ChannelList::UpdateDeleteThread(const ThreadDeleteData &data) {
|
||||
auto iter = GetIteratorForChannelFromID(data.ID);
|
||||
void ChannelList::UpdateDeleteThread(Snowflake id) {
|
||||
auto iter = GetIteratorForChannelFromID(id);
|
||||
if (iter)
|
||||
m_model->erase(iter);
|
||||
}
|
||||
|
||||
@@ -141,9 +141,12 @@ protected:
|
||||
void UpdateChannel(Snowflake id);
|
||||
void UpdateCreateChannel(const ChannelData &channel);
|
||||
void UpdateCreateThread(const ChannelData &channel);
|
||||
void UpdateDeleteThread(const ThreadDeleteData &data);
|
||||
void UpdateDeleteThread(Snowflake id);
|
||||
void UpdateGuild(Snowflake id);
|
||||
|
||||
void OnThreadDelete(const ThreadDeleteData &data);
|
||||
void OnThreadMembersUpdate(const ThreadMembersUpdateData &data);
|
||||
|
||||
Gtk::TreeView m_view;
|
||||
|
||||
class ModelColumns : public Gtk::TreeModel::ColumnRecord {
|
||||
|
||||
@@ -764,7 +764,7 @@ void DiscordClient::Unpin(Snowflake channel_id, Snowflake message_id, sigc::slot
|
||||
// i dont know if the location parameter is necessary at all but discord's thread implementation is extremely strange
|
||||
// so its here just in case
|
||||
void DiscordClient::LeaveThread(Snowflake channel_id, const std::string &location, sigc::slot<void(DiscordError code)> callback) {
|
||||
m_http.MakeDELETE("/channels/" + std::to_string(channel_id) + "/thread-members/@me?location=" + location, [this, callback](const http::response_type& response) {
|
||||
m_http.MakeDELETE("/channels/" + std::to_string(channel_id) + "/thread-members/@me?location=" + location, [this, callback](const http::response_type &response) {
|
||||
if (CheckCode(response, 204))
|
||||
callback(DiscordError::NONE);
|
||||
else
|
||||
@@ -1176,6 +1176,9 @@ void DiscordClient::HandleGatewayMessage(std::string str) {
|
||||
case GatewayEvent::THREAD_LIST_SYNC: {
|
||||
HandleGatewayThreadListSync(m);
|
||||
} break;
|
||||
case GatewayEvent::THREAD_MEMBERS_UPDATE: {
|
||||
HandleGatewayThreadMembersUpdate(m);
|
||||
} break;
|
||||
}
|
||||
} break;
|
||||
default:
|
||||
@@ -1680,6 +1683,11 @@ void DiscordClient::HandleGatewayThreadListSync(const GatewayMessage &msg) {
|
||||
m_signal_thread_list_sync.emit(data);
|
||||
}
|
||||
|
||||
void DiscordClient::HandleGatewayThreadMembersUpdate(const GatewayMessage &msg) {
|
||||
ThreadMembersUpdateData data = msg.Data;
|
||||
m_signal_thread_members_update.emit(data);
|
||||
}
|
||||
|
||||
void DiscordClient::HandleGatewayReadySupplemental(const GatewayMessage &msg) {
|
||||
ReadySupplementalData data = msg.Data;
|
||||
for (const auto &p : data.MergedPresences.Friends) {
|
||||
@@ -2045,6 +2053,7 @@ void DiscordClient::LoadEventMap() {
|
||||
m_event_map["THREAD_CREATE"] = GatewayEvent::THREAD_CREATE;
|
||||
m_event_map["THREAD_DELETE"] = GatewayEvent::THREAD_DELETE;
|
||||
m_event_map["THREAD_LIST_SYNC"] = GatewayEvent::THREAD_LIST_SYNC;
|
||||
m_event_map["THREAD_MEMBERS_UPDATE"] = GatewayEvent::THREAD_MEMBERS_UPDATE;
|
||||
}
|
||||
|
||||
DiscordClient::type_signal_gateway_ready DiscordClient::signal_gateway_ready() {
|
||||
@@ -2195,6 +2204,10 @@ DiscordClient::type_signal_thread_list_sync DiscordClient::signal_thread_list_sy
|
||||
return m_signal_thread_list_sync;
|
||||
}
|
||||
|
||||
DiscordClient::type_signal_thread_members_update DiscordClient::signal_thread_members_update() {
|
||||
return m_signal_thread_members_update;
|
||||
}
|
||||
|
||||
DiscordClient::type_signal_message_sent DiscordClient::signal_message_sent() {
|
||||
return m_signal_message_sent;
|
||||
}
|
||||
|
||||
@@ -240,6 +240,7 @@ private:
|
||||
void HandleGatewayThreadCreate(const GatewayMessage &msg);
|
||||
void HandleGatewayThreadDelete(const GatewayMessage &msg);
|
||||
void HandleGatewayThreadListSync(const GatewayMessage &msg);
|
||||
void HandleGatewayThreadMembersUpdate(const GatewayMessage &msg);
|
||||
void HandleGatewayReadySupplemental(const GatewayMessage &msg);
|
||||
void HandleGatewayReconnect(const GatewayMessage &msg);
|
||||
void HandleGatewayInvalidSession(const GatewayMessage &msg);
|
||||
@@ -336,6 +337,7 @@ public:
|
||||
typedef sigc::signal<void, ChannelData> type_signal_thread_create;
|
||||
typedef sigc::signal<void, ThreadDeleteData> type_signal_thread_delete;
|
||||
typedef sigc::signal<void, ThreadListSyncData> type_signal_thread_list_sync;
|
||||
typedef sigc::signal<void, ThreadMembersUpdateData> type_signal_thread_members_update;
|
||||
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;
|
||||
@@ -378,6 +380,7 @@ public:
|
||||
type_signal_thread_create signal_thread_create();
|
||||
type_signal_thread_delete signal_thread_delete();
|
||||
type_signal_thread_list_sync signal_thread_list_sync();
|
||||
type_signal_thread_members_update signal_thread_members_update();
|
||||
type_signal_message_sent signal_message_sent();
|
||||
type_signal_message_send_fail signal_message_send_fail();
|
||||
type_signal_disconnected signal_disconnected();
|
||||
@@ -419,6 +422,7 @@ protected:
|
||||
type_signal_thread_create m_signal_thread_create;
|
||||
type_signal_thread_delete m_signal_thread_delete;
|
||||
type_signal_thread_list_sync m_signal_thread_list_sync;
|
||||
type_signal_thread_members_update m_signal_thread_members_update;
|
||||
type_signal_message_sent m_signal_message_sent;
|
||||
type_signal_message_send_fail m_signal_message_send_fail;
|
||||
type_signal_disconnected m_signal_disconnected;
|
||||
|
||||
@@ -489,3 +489,11 @@ void from_json(const nlohmann::json &j, ThreadListSyncData &m) {
|
||||
JS_D("threads", m.Threads);
|
||||
JS_D("guild_id", m.GuildID);
|
||||
}
|
||||
|
||||
void from_json(const nlohmann::json &j, ThreadMembersUpdateData &m) {
|
||||
JS_D("id", m.ID);
|
||||
JS_D("guild_id", m.GuildID);
|
||||
JS_D("member_count", m.MemberCount);
|
||||
JS_O("added_members", m.AddedMembers);
|
||||
JS_O("removed_member_ids", m.RemovedMemberIDs);
|
||||
}
|
||||
|
||||
@@ -690,3 +690,13 @@ struct ThreadListSyncData {
|
||||
|
||||
friend void from_json(const nlohmann::json &j, ThreadListSyncData &m);
|
||||
};
|
||||
|
||||
struct ThreadMembersUpdateData {
|
||||
Snowflake ID;
|
||||
Snowflake GuildID;
|
||||
int MemberCount;
|
||||
std::optional<std::vector<ThreadMemberObject>> AddedMembers;
|
||||
std::optional<std::vector<Snowflake>> RemovedMemberIDs;
|
||||
|
||||
friend void from_json(const nlohmann::json &j, ThreadMembersUpdateData &m);
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user