Skip to content

Commit bc1e2ca

Browse files
committed
fix command permission checks in DMs
1 parent 67bf5b9 commit bc1e2ca

File tree

2 files changed

+23
-4
lines changed

2 files changed

+23
-4
lines changed

CommandChecks/HomeServerPerms.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public enum ServerPermLevel
2525

2626
public static async Task<ServerPermLevel> GetPermLevelAsync(DiscordMember target)
2727
{
28-
if (target.Guild.Id != Program.cfgjson.ServerID)
28+
if (target is null || target.Guild is null || target.Guild.Id != Program.cfgjson.ServerID)
2929
return ServerPermLevel.Nothing;
3030

3131
// Torch approved of this.

Commands/GlobalCmds.cs

+22-3
Original file line numberDiff line numberDiff line change
@@ -316,6 +316,25 @@ private async Task<IEnumerable<ContextCheckAttribute>> CheckPermissionsAsync(Com
316316
var contextChecks = cmd.Attributes.Where(x => x is ContextCheckAttribute);
317317
var failedChecks = new List<ContextCheckAttribute>();
318318

319+
// similar to home server perm check logic
320+
DiscordMember member = null;
321+
if (ctx.Channel.IsPrivate || ctx.Guild.Id != Program.cfgjson.ServerID)
322+
{
323+
var guild = await ctx.Client.GetGuildAsync(Program.cfgjson.ServerID);
324+
try
325+
{
326+
member = await guild.GetMemberAsync(ctx.User.Id);
327+
}
328+
catch (DSharpPlus.Exceptions.NotFoundException)
329+
{
330+
// member is null, remember this for later
331+
}
332+
}
333+
else
334+
{
335+
member = ctx.Member;
336+
}
337+
319338
foreach (var check in contextChecks)
320339
{
321340
if (check is HomeServerAttribute homeServerAttribute)
@@ -329,13 +348,13 @@ private async Task<IEnumerable<ContextCheckAttribute>> CheckPermissionsAsync(Com
329348
if (check is RequireHomeserverPermAttribute requireHomeserverPermAttribute)
330349
{
331350
// Fail if guild member is null but this cmd does not work outside of the home server
332-
if (ctx.Member is null && !requireHomeserverPermAttribute.WorkOutside)
351+
if (member is null && !requireHomeserverPermAttribute.WorkOutside)
333352
{
334353
failedChecks.Add(requireHomeserverPermAttribute);
335354
}
336355
else
337356
{
338-
var level = await GetPermLevelAsync(ctx.Member);
357+
var level = await GetPermLevelAsync(member);
339358
if (level < requireHomeserverPermAttribute.TargetLvl)
340359
{
341360
if (requireHomeserverPermAttribute.OwnerOverride && !Program.cfgjson.BotOwners.Contains(ctx.User.Id)
@@ -349,7 +368,7 @@ private async Task<IEnumerable<ContextCheckAttribute>> CheckPermissionsAsync(Com
349368

350369
if (check is RequirePermissionsAttribute requirePermissionsAttribute)
351370
{
352-
if (ctx.Member is null || ctx.Guild is null
371+
if (member is null || ctx.Guild is null
353372
|| !ctx.Channel.PermissionsFor(ctx.Member).HasAllPermissions(requirePermissionsAttribute.UserPermissions)
354373
|| !ctx.Channel.PermissionsFor(ctx.Guild.CurrentMember).HasAllPermissions(requirePermissionsAttribute.BotPermissions))
355374
{

0 commit comments

Comments
 (0)