@@ -200,29 +200,54 @@ void DiscordCPP::Guild::unban(const User& user) {
200
200
api_call (url, " DEL" );
201
201
}
202
202
203
- DiscordCPP::Permissions DiscordCPP::Guild::get_member_permissions (const Member& member) {
203
+ DiscordCPP::Permissions DiscordCPP::Guild::get_member_permissions (const Member& member, const ChannelVariant& channel ) {
204
204
if (owner_id.has_value () && owner_id.value () == member.get_id ()) {
205
205
return Permissions::All ();
206
206
}
207
207
208
+ std::vector<std::string> ids;
209
+ ids.push_back (this ->get_id ()); // everyone
210
+ for (const auto & id : member.get_roles ()) {
211
+ ids.push_back (id);
212
+ }
213
+
208
214
std::map<std::string, Permissions> permission_map;
209
- for (const Role & role : roles) {
215
+ for (const auto & role : roles) {
210
216
permission_map.insert ({role.get_id (), role.get_permissions ()});
211
217
}
212
218
213
219
Permissions permissions;
214
- for (std::string role : member. get_roles () ) {
215
- if (permission_map.find (role ) == permission_map.end ()) {
216
- throw DiscordException (" unknown role " + role + " for member " + member.get_id () + " in guild " + get_id ());
220
+ for (const auto & id : ids ) {
221
+ if (permission_map.find (id ) == permission_map.end ()) {
222
+ throw DiscordException (" unknown role " + id + " for member " + member.get_id () + " in guild " + get_id ());
217
223
}
218
224
219
- if (permission_map.at (role).has_permission (Permissions::ADMINISTRATOR)) {
220
- return Permissions::All ();
221
- }
225
+ permissions.add (permission_map.at (id));
226
+ }
227
+
228
+ if (permissions.has_permission (Permissions::ADMINISTRATOR)) {
229
+ return Permissions::All ();
230
+ }
231
+
232
+ ids.push_back (member.get_id ());
233
+
234
+ std::map<std::string, PermissionOverwrites> overwrite_map;
235
+ for (const auto & overwrite : ChannelHelper::get_permission_overwrites (channel)) {
236
+ overwrite_map.emplace (overwrite.get_id (), overwrite);
237
+ }
222
238
223
- permissions.add (permission_map.at (role));
239
+ Permissions denied;
240
+ Permissions allowed;
241
+ for (const auto & id : ids) {
242
+ if (overwrite_map.find (id) != overwrite_map.end ()) {
243
+ denied.add (overwrite_map.at (id).get_denied_permissions ());
244
+ allowed.add (overwrite_map.at (id).get_allowed_permissions ());
245
+ }
224
246
}
225
247
248
+ permissions.remove (denied);
249
+ permissions.add (allowed);
250
+
226
251
return permissions;
227
252
}
228
253
0 commit comments