diff --git a/src/Discord.Net/DiscordClient.Permissions.cs b/src/Discord.Net/DiscordClient.Permissions.cs index 32052e900..f8ea29353 100644 --- a/src/Discord.Net/DiscordClient.Permissions.cs +++ b/src/Discord.Net/DiscordClient.Permissions.cs @@ -1,4 +1,3 @@ -using Discord.Net; using System; using System.Linq; using System.Net; @@ -20,6 +19,18 @@ namespace Discord => SetChannelPermissions(channel, userId, PermissionTarget.Member, allow, deny); public Task SetChannelUserPermissions(string channelId, string userId, ChannelPermissions allow = null, ChannelPermissions deny = null) => SetChannelPermissions(_channels[channelId], userId, PermissionTarget.Member, allow, deny); + public Task SetChannelUserPermissions(Channel channel, Member member, DualChannelPermissions permissions = null) + => SetChannelPermissions(channel, member?.UserId, PermissionTarget.Member, permissions?.Allow, permissions?.Deny); + public Task SetChannelUserPermissions(string channelId, Member member, DualChannelPermissions permissions = null) + => SetChannelPermissions(_channels[channelId], member?.UserId, PermissionTarget.Member, permissions?.Allow, permissions?.Deny); + public Task SetChannelUserPermissions(Channel channel, User user, DualChannelPermissions permissions = null) + => SetChannelPermissions(channel, user?.Id, PermissionTarget.Member, permissions?.Allow, permissions?.Deny); + public Task SetChannelUserPermissions(string channelId, User user, DualChannelPermissions permissions = null) + => SetChannelPermissions(_channels[channelId], user?.Id, PermissionTarget.Member, permissions?.Allow, permissions?.Deny); + public Task SetChannelUserPermissions(Channel channel, string userId, DualChannelPermissions permissions = null) + => SetChannelPermissions(channel, userId, PermissionTarget.Member, permissions?.Allow, permissions?.Deny); + public Task SetChannelUserPermissions(string channelId, string userId, DualChannelPermissions permissions = null) + => SetChannelPermissions(_channels[channelId], userId, PermissionTarget.Member, permissions?.Allow, permissions?.Deny); public Task SetChannelRolePermissions(Channel channel, Role role, ChannelPermissions allow = null, ChannelPermissions deny = null) => SetChannelPermissions(channel, role?.Id, PermissionTarget.Role, allow, deny); @@ -29,6 +40,14 @@ namespace Discord => SetChannelPermissions(channel, userId, PermissionTarget.Role, allow, deny); public Task SetChannelRolePermissions(string channelId, string userId, ChannelPermissions allow = null, ChannelPermissions deny = null) => SetChannelPermissions(_channels[channelId], userId, PermissionTarget.Role, allow, deny); + public Task SetChannelRolePermissions(Channel channel, Role role, DualChannelPermissions permissions = null) + => SetChannelPermissions(channel, role?.Id, PermissionTarget.Role, permissions?.Allow, permissions?.Deny); + public Task SetChannelRolePermissions(string channelId, Role role, DualChannelPermissions permissions = null) + => SetChannelPermissions(_channels[channelId], role?.Id, PermissionTarget.Role, permissions?.Allow, permissions?.Deny); + public Task SetChannelRolePermissions(Channel channel, string userId, DualChannelPermissions permissions = null) + => SetChannelPermissions(channel, userId, PermissionTarget.Role, permissions?.Allow, permissions?.Deny); + public Task SetChannelRolePermissions(string channelId, string userId, DualChannelPermissions permissions = null) + => SetChannelPermissions(_channels[channelId], userId, PermissionTarget.Role, permissions?.Allow, permissions?.Deny); private async Task SetChannelPermissions(Channel channel, string targetId, string targetType, ChannelPermissions allow = null, ChannelPermissions deny = null) { diff --git a/src/Discord.Net/Models/Permissions.cs b/src/Discord.Net/Models/Permissions.cs index 1a8824946..741cae5b1 100644 --- a/src/Discord.Net/Models/Permissions.cs +++ b/src/Discord.Net/Models/Permissions.cs @@ -33,8 +33,8 @@ namespace Discord public sealed class ServerPermissions : Permissions { - public static readonly ServerPermissions None = Preset(); - public static readonly ServerPermissions All = Preset("00000011111100111111110000111111"); + public static ServerPermissions None { get; } = new ServerPermissions(); + public static ServerPermissions All { get; } = new ServerPermissions(Convert.ToUInt32("00000011111100111111110000111111", 2)); public ServerPermissions() : base() { } public ServerPermissions(uint rawValue) : base(rawValue) { } @@ -54,10 +54,10 @@ namespace Discord public sealed class ChannelPermissions : Permissions { - public static readonly ChannelPermissions None = Preset(); - public static readonly ChannelPermissions TextOnly = Preset("00000000000000111111110000011001"); - public static readonly ChannelPermissions PrivateOnly = Preset("00000000000000011100110000000000"); - public static readonly ChannelPermissions VoiceOnly = Preset("00000011111100000000000000011001"); + public static ChannelPermissions None { get; } = new ChannelPermissions(); + public static ChannelPermissions TextOnly { get; } = new ChannelPermissions(Convert.ToUInt32("00000000000000111111110000011001", 2)); + public static ChannelPermissions PrivateOnly { get; } = new ChannelPermissions(Convert.ToUInt32("00000000000000011100110000000000", 2)); + public static ChannelPermissions VoiceOnly { get; } = new ChannelPermissions(Convert.ToUInt32("00000011111100000000000000011001", 2)); public static ChannelPermissions All(Channel channel) => All(channel.Type, channel.IsPrivate); public static ChannelPermissions All(string channelType, bool isPrivate) { @@ -71,7 +71,6 @@ namespace Discord public ChannelPermissions(uint rawValue) : base(rawValue) { } public ChannelPermissions Copy() => new ChannelPermissions(RawValue); - /// If True, a user may adjust permissions. This also implictly grants all other permissions. public bool ManagePermissions { get { return GetBit(PermissionsBits.ManageRolesOrPermissions); } set { SetBit(PermissionsBits.ManageRolesOrPermissions, value); } } /// If True, a user may create, delete and modify this channel. @@ -144,16 +143,82 @@ namespace Discord if (_isLocked) throw new InvalidOperationException("Unable to edit cached permissions directly, use Copy() to make an editable copy."); } + } - protected static T Preset(string binaryInput = null) - where T : Permissions, new() + public sealed class DualChannelPermissions + { + public ChannelPermissions Allow { get; } + public ChannelPermissions Deny { get; } + + public DualChannelPermissions(uint allow = 0, uint deny = 0) { - var perms = new T(); - if (binaryInput != null) - perms.SetRawValueInternal(Convert.ToUInt32(binaryInput, 2)); - perms.Lock(); - return perms; + Allow = new ChannelPermissions(allow); + Deny = new ChannelPermissions(deny); } - } + /// If True, a user may create invites. + public bool? CreateInstantInvite { get { return GetBit(PermissionsBits.CreateInstantInvite); } set { SetBit(PermissionsBits.CreateInstantInvite, value); } } + /// If True, a user may join channels. + public bool? ReadMessages { get { return GetBit(PermissionsBits.ReadMessages); } set { SetBit(PermissionsBits.ReadMessages, value); } } + /// If True, a user may send messages. + public bool? SendMessages { get { return GetBit(PermissionsBits.SendMessages); } set { SetBit(PermissionsBits.SendMessages, value); } } + /// If True, a user may send text-to-speech messages. + public bool? SendTTSMessages { get { return GetBit(PermissionsBits.SendTTSMessages); } set { SetBit(PermissionsBits.SendTTSMessages, value); } } + /// If True, a user may delete messages. + public bool? ManageMessages { get { return GetBit(PermissionsBits.ManageMessages); } set { SetBit(PermissionsBits.ManageMessages, value); } } + /// If True, Discord will auto-embed links sent by this user. + public bool? EmbedLinks { get { return GetBit(PermissionsBits.EmbedLinks); } set { SetBit(PermissionsBits.EmbedLinks, value); } } + /// If True, a user may send files. + public bool? AttachFiles { get { return GetBit(PermissionsBits.AttachFiles); } set { SetBit(PermissionsBits.AttachFiles, value); } } + /// If True, a user may read previous messages. + public bool? ReadMessageHistory { get { return GetBit(PermissionsBits.ReadMessageHistory); } set { SetBit(PermissionsBits.ReadMessageHistory, value); } } + /// If True, a user may mention @everyone. + public bool? MentionEveryone { get { return GetBit(PermissionsBits.MentionEveryone); } set { SetBit(PermissionsBits.MentionEveryone, value); } } + + /// If True, a user may connect to a voice channel. + public bool? Connect { get { return GetBit(PermissionsBits.Connect); } set { SetBit(PermissionsBits.Connect, value); } } + /// If True, a user may speak in a voice channel. + public bool? Speak { get { return GetBit(PermissionsBits.Speak); } set { SetBit(PermissionsBits.Speak, value); } } + /// If True, a user may mute users. + public bool? MuteMembers { get { return GetBit(PermissionsBits.MuteMembers); } set { SetBit(PermissionsBits.MuteMembers, value); } } + /// If True, a user may deafen users. + public bool? DeafenMembers { get { return GetBit(PermissionsBits.DeafenMembers); } set { SetBit(PermissionsBits.DeafenMembers, value); } } + /// If True, a user may move other users between voice channels. + public bool? MoveMembers { get { return GetBit(PermissionsBits.MoveMembers); } set { SetBit(PermissionsBits.MoveMembers, value); } } + /// If True, a user may use voice activation rather than push-to-talk. + public bool? UseVoiceActivation { get { return GetBit(PermissionsBits.UseVoiceActivation); } set { SetBit(PermissionsBits.UseVoiceActivation, value); } } + + /// If True, a user may adjust permissions. This also implictly grants all other permissions. + public bool? ManagePermissions { get { return GetBit(PermissionsBits.ManageRolesOrPermissions); } set { SetBit(PermissionsBits.ManageRolesOrPermissions, value); } } + /// If True, a user may create, delete and modify this channel. + public bool? ManageChannel { get { return GetBit(PermissionsBits.ManageChannel); } set { SetBit(PermissionsBits.ManageChannel, value); } } + + private bool? GetBit(PermissionsBits pos) + { + if (Allow.GetBit(pos)) + return true; + else if (Deny.GetBit(pos)) + return true; + else + return false; + } + private void SetBit(PermissionsBits pos, bool? value) + { + if (value == true) + { + Allow.SetBit(pos, true); + Deny.SetBit(pos, false); + } + else if (value == false) + { + Allow.SetBit(pos, false); + Deny.SetBit(pos, true); + } + else + { + Allow.SetBit(pos, false); + Deny.SetBit(pos, false); + } + } + } }