| @@ -102,12 +102,7 @@ namespace Discord.Commands | |||||
| return cmd; | return cmd; | ||||
| } | } | ||||
| else | else | ||||
| { | |||||
| if (prefix != "") | |||||
| return prefix; | |||||
| else | |||||
| throw new ArgumentOutOfRangeException(nameof(cmd)); | |||||
| } | |||||
| return prefix; | |||||
| } | } | ||||
| } | } | ||||
| public sealed class CommandGroupBuilder | public sealed class CommandGroupBuilder | ||||
| @@ -7,6 +7,29 @@ namespace Discord | |||||
| { | { | ||||
| public partial class DiscordClient | public partial class DiscordClient | ||||
| { | { | ||||
| public DualChannelPermissions GetChannelPermissions(Channel channel, User user) | |||||
| { | |||||
| if (channel == null) throw new ArgumentNullException(nameof(channel)); | |||||
| if (user == null) throw new ArgumentNullException(nameof(user)); | |||||
| CheckReady(); | |||||
| return channel.PermissionOverwrites | |||||
| .Where(x => x.TargetType == PermissionTarget.User && x.TargetId == user.Id) | |||||
| .Select(x => x.Permissions) | |||||
| .FirstOrDefault(); | |||||
| } | |||||
| public DualChannelPermissions GetChannelPermissions(Channel channel, Role role) | |||||
| { | |||||
| if (channel == null) throw new ArgumentNullException(nameof(channel)); | |||||
| if (role == null) throw new ArgumentNullException(nameof(role)); | |||||
| CheckReady(); | |||||
| return channel.PermissionOverwrites | |||||
| .Where(x => x.TargetType == PermissionTarget.User && x.TargetId == role.Id) | |||||
| .Select(x => x.Permissions) | |||||
| .FirstOrDefault(); | |||||
| } | |||||
| public Task SetChannelPermissions(Channel channel, User user, ChannelPermissions allow = null, ChannelPermissions deny = null) | public Task SetChannelPermissions(Channel channel, User user, ChannelPermissions allow = null, ChannelPermissions deny = null) | ||||
| { | { | ||||
| if (channel == null) throw new ArgumentNullException(nameof(channel)); | if (channel == null) throw new ArgumentNullException(nameof(channel)); | ||||
| @@ -12,17 +12,14 @@ namespace Discord | |||||
| { | { | ||||
| public PermissionTarget TargetType { get; } | public PermissionTarget TargetType { get; } | ||||
| public string TargetId { get; } | public string TargetId { get; } | ||||
| public ChannelPermissions Allow { get; } | |||||
| public ChannelPermissions Deny { get; } | |||||
| public DualChannelPermissions Permissions { get; } | |||||
| internal PermissionOverwrite(PermissionTarget targetType, string targetId, uint allow, uint deny) | internal PermissionOverwrite(PermissionTarget targetType, string targetId, uint allow, uint deny) | ||||
| { | { | ||||
| TargetType = targetType; | TargetType = targetType; | ||||
| TargetId = targetId; | TargetId = targetId; | ||||
| Allow = new ChannelPermissions(allow); | |||||
| Allow.Lock(); | |||||
| Deny = new ChannelPermissions(deny); | |||||
| Deny.Lock(); | |||||
| Permissions = new DualChannelPermissions(allow, deny); | |||||
| Permissions.Lock(); | |||||
| } | } | ||||
| } | } | ||||
| @@ -218,6 +218,13 @@ namespace Discord | |||||
| } | } | ||||
| } | } | ||||
| internal void Lock() | |||||
| { | |||||
| Allow.Lock(); | |||||
| Deny.Lock(); | |||||
| } | |||||
| public DualChannelPermissions Copy() => new DualChannelPermissions(Allow.RawValue, Deny.RawValue); | |||||
| public override bool Equals(object obj) => obj is DualChannelPermissions && | public override bool Equals(object obj) => obj is DualChannelPermissions && | ||||
| (obj as DualChannelPermissions).Allow.Equals(Allow) && | (obj as DualChannelPermissions).Allow.Equals(Allow) && | ||||
| (obj as DualChannelPermissions).Deny.Equals(Deny); | (obj as DualChannelPermissions).Deny.Equals(Deny); | ||||
| @@ -309,14 +309,14 @@ namespace Discord | |||||
| //var roles = Roles.OrderBy(x => x.Id); | //var roles = Roles.OrderBy(x => x.Id); | ||||
| var roles = Roles; | var roles = Roles; | ||||
| foreach (var denyRole in channelOverwrites.Where(x => x.TargetType == PermissionTarget.Role && x.Deny.RawValue != 0 && roles.Any(y => y.Id == x.TargetId))) | |||||
| newPermissions &= ~denyRole.Deny.RawValue; | |||||
| foreach (var allowRole in channelOverwrites.Where(x => x.TargetType == PermissionTarget.Role && x.Allow.RawValue != 0 && roles.Any(y => y.Id == x.TargetId))) | |||||
| newPermissions |= allowRole.Allow.RawValue; | |||||
| foreach (var denyUser in channelOverwrites.Where(x => x.TargetType == PermissionTarget.User && x.TargetId == Id && x.Deny.RawValue != 0)) | |||||
| newPermissions &= ~denyUser.Deny.RawValue; | |||||
| foreach (var allowUser in channelOverwrites.Where(x => x.TargetType == PermissionTarget.User && x.TargetId == Id && x.Allow.RawValue != 0)) | |||||
| newPermissions |= allowUser.Allow.RawValue; | |||||
| foreach (var denyRole in channelOverwrites.Where(x => x.TargetType == PermissionTarget.Role && x.Permissions.Deny.RawValue != 0 && roles.Any(y => y.Id == x.TargetId))) | |||||
| newPermissions &= ~denyRole.Permissions.Deny.RawValue; | |||||
| foreach (var allowRole in channelOverwrites.Where(x => x.TargetType == PermissionTarget.Role && x.Permissions.Allow.RawValue != 0 && roles.Any(y => y.Id == x.TargetId))) | |||||
| newPermissions |= allowRole.Permissions.Allow.RawValue; | |||||
| foreach (var denyUser in channelOverwrites.Where(x => x.TargetType == PermissionTarget.User && x.TargetId == Id && x.Permissions.Deny.RawValue != 0)) | |||||
| newPermissions &= ~denyUser.Permissions.Deny.RawValue; | |||||
| foreach (var allowUser in channelOverwrites.Where(x => x.TargetType == PermissionTarget.User && x.TargetId == Id && x.Permissions.Allow.RawValue != 0)) | |||||
| newPermissions |= allowUser.Permissions.Allow.RawValue; | |||||
| } | } | ||||
| var mask = ChannelPermissions.All(channel).RawValue; | var mask = ChannelPermissions.All(channel).RawValue; | ||||