forked from OpenGamers/abaddon
@@ -1699,23 +1699,13 @@ void DiscordClient::HandleGatewayGuildRoleUpdate(const GatewayMessage &msg) {
|
|||||||
|
|
||||||
void DiscordClient::HandleGatewayGuildRoleCreate(const GatewayMessage &msg) {
|
void DiscordClient::HandleGatewayGuildRoleCreate(const GatewayMessage &msg) {
|
||||||
GuildRoleCreateObject data = msg.Data;
|
GuildRoleCreateObject data = msg.Data;
|
||||||
auto guild = *m_store.GetGuild(data.GuildID);
|
m_store.SetRole(data.GuildID, data.Role);
|
||||||
guild.Roles->push_back(data.Role);
|
|
||||||
m_store.BeginTransaction();
|
|
||||||
m_store.SetRole(guild.ID, data.Role);
|
|
||||||
m_store.SetGuild(guild.ID, guild);
|
|
||||||
m_store.EndTransaction();
|
|
||||||
m_signal_role_create.emit(data.GuildID, data.Role.ID);
|
m_signal_role_create.emit(data.GuildID, data.Role.ID);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DiscordClient::HandleGatewayGuildRoleDelete(const GatewayMessage &msg) {
|
void DiscordClient::HandleGatewayGuildRoleDelete(const GatewayMessage &msg) {
|
||||||
GuildRoleDeleteObject data = msg.Data;
|
GuildRoleDeleteObject data = msg.Data;
|
||||||
auto guild = *m_store.GetGuild(data.GuildID);
|
m_store.ClearRole(data.RoleID);
|
||||||
const auto pred = [id = data.RoleID](const RoleData &role) -> bool {
|
|
||||||
return role.ID == id;
|
|
||||||
};
|
|
||||||
guild.Roles->erase(std::remove_if(guild.Roles->begin(), guild.Roles->end(), pred), guild.Roles->end());
|
|
||||||
m_store.SetGuild(guild.ID, guild);
|
|
||||||
m_signal_role_delete.emit(data.GuildID, data.RoleID);
|
m_signal_role_delete.emit(data.GuildID, data.RoleID);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1078,6 +1078,14 @@ void Store::ClearRecipient(Snowflake channel_id, Snowflake user_id) {
|
|||||||
s->Reset();
|
s->Reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Store::ClearRole(Snowflake id) {
|
||||||
|
auto &s = m_stmt_clr_role;
|
||||||
|
|
||||||
|
s->Bind(1, id);
|
||||||
|
s->Step();
|
||||||
|
s->Reset();
|
||||||
|
}
|
||||||
|
|
||||||
std::unordered_set<Snowflake> Store::GetChannels() const {
|
std::unordered_set<Snowflake> Store::GetChannels() const {
|
||||||
auto &s = m_stmt_get_chan_ids;
|
auto &s = m_stmt_get_chan_ids;
|
||||||
std::unordered_set<Snowflake> r;
|
std::unordered_set<Snowflake> r;
|
||||||
@@ -1522,6 +1530,16 @@ bool Store::CreateTables() {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (m_db.Execute(R"(
|
||||||
|
CREATE TRIGGER remove_deleted_roles AFTER DELETE ON roles
|
||||||
|
BEGIN
|
||||||
|
DELETE FROM member_roles WHERE role = old.id;
|
||||||
|
END
|
||||||
|
)") != SQLITE_OK) {
|
||||||
|
fprintf(stderr, "failed to create roles trigger: %s\n", m_db.ErrStr());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2159,6 +2177,17 @@ bool Store::CreateStatements() {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m_stmt_clr_role = std::make_unique<Statement>(m_db, R"(
|
||||||
|
DELETE FROM roles
|
||||||
|
WHERE id = ?1;
|
||||||
|
DELETE FROM member_roles
|
||||||
|
WHERE role = ?1;
|
||||||
|
)");
|
||||||
|
if (!m_stmt_clr_role->OK()) {
|
||||||
|
fprintf(stderr, "failed to prepare clear role statement: %s\n", m_db.ErrStr());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -54,6 +54,7 @@ public:
|
|||||||
void ClearChannel(Snowflake id);
|
void ClearChannel(Snowflake id);
|
||||||
void ClearBan(Snowflake guild_id, Snowflake user_id);
|
void ClearBan(Snowflake guild_id, Snowflake user_id);
|
||||||
void ClearRecipient(Snowflake channel_id, Snowflake user_id);
|
void ClearRecipient(Snowflake channel_id, Snowflake user_id);
|
||||||
|
void ClearRole(Snowflake id);
|
||||||
|
|
||||||
std::unordered_set<Snowflake> GetChannels() const;
|
std::unordered_set<Snowflake> GetChannels() const;
|
||||||
std::unordered_set<Snowflake> GetGuilds() const;
|
std::unordered_set<Snowflake> GetGuilds() const;
|
||||||
@@ -305,5 +306,6 @@ private:
|
|||||||
STMT(get_reactions);
|
STMT(get_reactions);
|
||||||
STMT(get_chan_ids_parent);
|
STMT(get_chan_ids_parent);
|
||||||
STMT(get_guild_member_ids);
|
STMT(get_guild_member_ids);
|
||||||
|
STMT(clr_role);
|
||||||
#undef STMT
|
#undef STMT
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user