| @@ -199,6 +199,9 @@ | |||||
| <Compile Include="..\Discord.Net\Models\Message.cs"> | <Compile Include="..\Discord.Net\Models\Message.cs"> | ||||
| <Link>Models\Message.cs</Link> | <Link>Models\Message.cs</Link> | ||||
| </Compile> | </Compile> | ||||
| <Compile Include="..\Discord.Net\Models\PackedColor.cs"> | |||||
| <Link>Models\PackedColor.cs</Link> | |||||
| </Compile> | |||||
| <Compile Include="..\Discord.Net\Models\PackedPermissions.cs"> | <Compile Include="..\Discord.Net\Models\PackedPermissions.cs"> | ||||
| <Link>Models\PackedPermissions.cs</Link> | <Link>Models\PackedPermissions.cs</Link> | ||||
| </Compile> | </Compile> | ||||
| @@ -270,7 +270,7 @@ namespace Discord | |||||
| return _rest.Delete(Endpoints.ServerRole(serverId, roleId)); | return _rest.Delete(Endpoints.ServerRole(serverId, roleId)); | ||||
| } | } | ||||
| public Task EditRole(string serverId, string roleId, string name = null, uint? permissions = null, bool? hoist = null, uint? color = null) | |||||
| public Task EditRole(string serverId, string roleId, string name = null, uint? permissions = null, uint? color = null, bool? hoist = null) | |||||
| { | { | ||||
| if (serverId == null) throw new ArgumentNullException(nameof(serverId)); | if (serverId == null) throw new ArgumentNullException(nameof(serverId)); | ||||
| if (roleId == null) throw new ArgumentNullException(nameof(roleId)); | if (roleId == null) throw new ArgumentNullException(nameof(roleId)); | ||||
| @@ -654,13 +654,13 @@ namespace Discord | |||||
| public Task EditRole(Role role, string newName) | public Task EditRole(Role role, string newName) | ||||
| => EditRole(role?.ServerId, role?.Id, newName); | => EditRole(role?.ServerId, role?.Id, newName); | ||||
| public Task EditRole(string serverId, string roleId, string name = null, PackedServerPermissions permissions = null, bool? hoist = null, uint? color = null) | |||||
| public Task EditRole(string serverId, string roleId, string name = null, PackedServerPermissions permissions = null, PackedColor color = null, bool? hoist = null) | |||||
| { | { | ||||
| CheckReady(); | CheckReady(); | ||||
| if (serverId == null) throw new NullReferenceException(nameof(serverId)); | if (serverId == null) throw new NullReferenceException(nameof(serverId)); | ||||
| if (roleId == null) throw new NullReferenceException(nameof(roleId)); | if (roleId == null) throw new NullReferenceException(nameof(roleId)); | ||||
| return _api.EditRole(serverId, roleId, name: name, permissions: permissions?.RawValue, hoist: hoist, color: color); | |||||
| return _api.EditRole(serverId, roleId, name: name, permissions: permissions?.RawValue, color: color?.RawValue, hoist: hoist); | |||||
| } | } | ||||
| public Task DeleteRole(Role role) | public Task DeleteRole(Role role) | ||||
| @@ -0,0 +1,46 @@ | |||||
| using System; | |||||
| namespace Discord | |||||
| { | |||||
| public class PackedColor | |||||
| { | |||||
| private bool _isLocked; | |||||
| private uint _rawValue; | |||||
| public uint RawValue | |||||
| { | |||||
| get { return _rawValue; } | |||||
| set | |||||
| { | |||||
| if (_isLocked) | |||||
| throw new InvalidOperationException("Unable to edit cached permissions directly, use Copy() to make an editable copy."); | |||||
| _rawValue = value; | |||||
| } | |||||
| } | |||||
| public PackedColor(uint rawValue) { _rawValue = rawValue; } | |||||
| /// <summary> If True, a user may join channels. </summary> | |||||
| public byte Red { get { return GetByte(3); } set { SetByte(3, value); } } | |||||
| /// <summary> If True, a user may send messages. </summary> | |||||
| public byte Green { get { return GetByte(2); } set { SetByte(2, value); } } | |||||
| /// <summary> If True, a user may send text-to-speech messages. </summary> | |||||
| public byte Blue { get { return GetByte(1); } set { SetByte(1, value); } } | |||||
| internal void Lock() => _isLocked = true; | |||||
| internal void SetRawValue(uint rawValue) | |||||
| { | |||||
| //Bypasses isLocked for API changes. | |||||
| _rawValue = rawValue; | |||||
| } | |||||
| protected byte GetByte(int pos) => (byte)((_rawValue >> (8 * (pos - 1))) & 0xFF); | |||||
| protected void SetByte(int pos, byte value) | |||||
| { | |||||
| if (_isLocked) | |||||
| throw new InvalidOperationException("Unable to edit cached permissions directly, use Copy() to make an editable copy."); | |||||
| int bit = 8 * (pos - 1); | |||||
| uint mask = (uint)((1 << bit) - 1); | |||||
| _rawValue = ((uint)value << bit) | (_rawValue & mask); | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -15,7 +15,7 @@ namespace Discord | |||||
| /// <summary> If true, this role is displayed isolated from other users. </summary> | /// <summary> If true, this role is displayed isolated from other users. </summary> | ||||
| public bool Hoist { get; private set; } | public bool Hoist { get; private set; } | ||||
| /// <summary> Returns the color of this role. </summary> | /// <summary> Returns the color of this role. </summary> | ||||
| public uint Color { get; private set; } | |||||
| public PackedColor Color { get; private set; } | |||||
| /// <summary> Returns the the permissions contained by this role. </summary> | /// <summary> Returns the the permissions contained by this role. </summary> | ||||
| public PackedServerPermissions Permissions { get; } | public PackedServerPermissions Permissions { get; } | ||||
| @@ -38,9 +38,11 @@ namespace Discord | |||||
| _client = client; | _client = client; | ||||
| Id = id; | Id = id; | ||||
| ServerId = serverId; | ServerId = serverId; | ||||
| IsEveryone = isEveryone; | |||||
| Permissions = new PackedServerPermissions(0); | Permissions = new PackedServerPermissions(0); | ||||
| Permissions.Lock(); | Permissions.Lock(); | ||||
| IsEveryone = isEveryone; | |||||
| Color = new PackedColor(0); | |||||
| Color.Lock(); | |||||
| } | } | ||||
| internal void Update(API.RoleInfo model) | internal void Update(API.RoleInfo model) | ||||
| @@ -50,7 +52,7 @@ namespace Discord | |||||
| if (model.Hoist != null) | if (model.Hoist != null) | ||||
| Hoist = model.Hoist.Value; | Hoist = model.Hoist.Value; | ||||
| if (model.Color != null) | if (model.Color != null) | ||||
| Color = model.Color.Value; | |||||
| Color.SetRawValue(model.Color.Value); | |||||
| if (model.Permissions != null) | if (model.Permissions != null) | ||||
| Permissions.SetRawValue(model.Permissions.Value); | Permissions.SetRawValue(model.Permissions.Value); | ||||