@@ -162,14 +162,14 @@ namespace Discord | |||||
} | } | ||||
/// <summary> Destroys the provided channel. </summary> | /// <summary> Destroys the provided channel. </summary> | ||||
public async Task<Channel> DestroyChannel(Channel channel) | |||||
public async Task DestroyChannel(Channel channel) | |||||
{ | { | ||||
if (channel == null) throw new ArgumentNullException(nameof(channel)); | if (channel == null) throw new ArgumentNullException(nameof(channel)); | ||||
CheckReady(); | CheckReady(); | ||||
try { await _api.DestroyChannel(channel.Id).ConfigureAwait(false); } | try { await _api.DestroyChannel(channel.Id).ConfigureAwait(false); } | ||||
catch (HttpException ex) when (ex.StatusCode == HttpStatusCode.NotFound) { } | catch (HttpException ex) when (ex.StatusCode == HttpStatusCode.NotFound) { } | ||||
return _channels.TryRemove(channel.Id); | |||||
//return _channels.TryRemove(channel.Id); | |||||
} | } | ||||
} | } | ||||
} | } |
@@ -161,7 +161,7 @@ namespace Discord | |||||
/// <summary> Edits the provided message, changing only non-null attributes. </summary> | /// <summary> Edits the provided message, changing only non-null attributes. </summary> | ||||
/// <remarks> While not required, it is recommended to include a mention reference in the text (see Mention.User). </remarks> | /// <remarks> While not required, it is recommended to include a mention reference in the text (see Mention.User). </remarks> | ||||
public async Task EditMessage(Message message, string text) | |||||
public Task EditMessage(Message message, string text) | |||||
{ | { | ||||
if (message == null) throw new ArgumentNullException(nameof(message)); | if (message == null) throw new ArgumentNullException(nameof(message)); | ||||
CheckReady(); | CheckReady(); | ||||
@@ -169,8 +169,7 @@ namespace Discord | |||||
if (text != null && text.Length > MaxMessageSize) | if (text != null && text.Length > MaxMessageSize) | ||||
text = text.Substring(0, MaxMessageSize); | text = text.Substring(0, MaxMessageSize); | ||||
var model = await _api.EditMessage(message.Id, message.Channel.Id, text, Mention.GetUserIds(text)).ConfigureAwait(false); | |||||
message.Update(model); | |||||
return _api.EditMessage(message.Id, message.Channel.Id, text, Mention.GetUserIds(text)); | |||||
} | } | ||||
/// <summary> Deletes the provided message. </summary> | /// <summary> Deletes the provided message. </summary> | ||||
@@ -219,7 +218,7 @@ namespace Discord | |||||
msg = _messages.GetOrAdd(x.Id, x.ChannelId, x.Author.Id); | msg = _messages.GetOrAdd(x.Id, x.ChannelId, x.Author.Id); | ||||
else | else | ||||
msg = _messages[x.Id] ?? new Message(this, x.Id, x.ChannelId, x.Author.Id); | msg = _messages[x.Id] ?? new Message(this, x.Id, x.ChannelId, x.Author.Id); | ||||
msg.Update(x); | |||||
//msg.Update(x); | |||||
if (Config.TrackActivity) | if (Config.TrackActivity) | ||||
{ | { | ||||
if (!channel.IsPrivate) | if (!channel.IsPrivate) | ||||
@@ -39,61 +39,8 @@ namespace Discord | |||||
return SetChannelPermissions(channel, role?.Id, PermissionTarget.Role, permissions?.Allow, permissions?.Deny); | return SetChannelPermissions(channel, role?.Id, PermissionTarget.Role, permissions?.Allow, permissions?.Deny); | ||||
} | } | ||||
private async Task SetChannelPermissions(Channel channel, string targetId, PermissionTarget targetType, ChannelPermissions allow = null, ChannelPermissions deny = null) | |||||
{ | |||||
uint allowValue = allow?.RawValue ?? 0; | |||||
uint denyValue = deny?.RawValue ?? 0; | |||||
bool changed = false; | |||||
var perms = channel.PermissionOverwrites.Where(x => x.TargetType != targetType || x.TargetId != targetId).FirstOrDefault(); | |||||
if (allowValue != 0 || denyValue != 0) | |||||
{ | |||||
await _api.SetChannelPermissions(channel.Id, targetId, targetType.Value, allowValue, denyValue).ConfigureAwait(false); | |||||
if (perms != null) | |||||
{ | |||||
perms.Allow.SetRawValueInternal(allowValue); | |||||
perms.Deny.SetRawValueInternal(denyValue); | |||||
} | |||||
else | |||||
{ | |||||
var oldPerms = channel.PermissionOverwrites.ToArray(); | |||||
var newPerms = new Channel.PermissionOverwrite[oldPerms.Length + 1]; | |||||
Array.Copy(oldPerms, newPerms, oldPerms.Length); | |||||
newPerms[oldPerms.Length] = new Channel.PermissionOverwrite(targetType, targetId, allowValue, denyValue); | |||||
channel.PermissionOverwrites = newPerms; | |||||
} | |||||
changed = true; | |||||
} | |||||
else | |||||
{ | |||||
try | |||||
{ | |||||
await _api.DeleteChannelPermissions(channel.Id, targetId).ConfigureAwait(false); | |||||
if (perms != null) | |||||
{ | |||||
channel.PermissionOverwrites = channel.PermissionOverwrites.Where(x => x.TargetType != targetType || x.TargetId != targetId).ToArray(); | |||||
changed = true; | |||||
} | |||||
} | |||||
catch (HttpException ex) when (ex.StatusCode == HttpStatusCode.NotFound) { } | |||||
} | |||||
if (changed) | |||||
{ | |||||
if (targetType == PermissionTarget.Role) | |||||
{ | |||||
var role = _roles[targetId]; | |||||
if (role != null) | |||||
channel.InvalidatePermissionsCache(role); | |||||
} | |||||
else if (targetType == PermissionTarget.User) | |||||
{ | |||||
var user = _users[targetId, channel.Server?.Id]; | |||||
if (user != null) | |||||
channel.InvalidatePermissionsCache(user); | |||||
} | |||||
} | |||||
} | |||||
private Task SetChannelPermissions(Channel channel, string targetId, PermissionTarget targetType, ChannelPermissions allow = null, ChannelPermissions deny = null) | |||||
=> _api.SetChannelPermissions(channel.Id, targetId, targetType.Value, allow?.RawValue ?? 0, deny?.RawValue ?? 0); | |||||
public Task RemoveChannelUserPermissions(Channel channel, User user) | public Task RemoveChannelUserPermissions(Channel channel, User user) | ||||
{ | { | ||||
@@ -117,22 +64,6 @@ namespace Discord | |||||
{ | { | ||||
var perms = channel.PermissionOverwrites.Where(x => x.TargetType != targetType || x.TargetId != userOrRoleId).FirstOrDefault(); | var perms = channel.PermissionOverwrites.Where(x => x.TargetType != targetType || x.TargetId != userOrRoleId).FirstOrDefault(); | ||||
await _api.DeleteChannelPermissions(channel.Id, userOrRoleId).ConfigureAwait(false); | await _api.DeleteChannelPermissions(channel.Id, userOrRoleId).ConfigureAwait(false); | ||||
if (perms != null) | |||||
{ | |||||
channel.PermissionOverwrites.Where(x => x.TargetType != targetType || x.TargetId != userOrRoleId).ToArray(); | |||||
if (targetType == PermissionTarget.Role) | |||||
{ | |||||
var role = _roles[userOrRoleId]; | |||||
channel.InvalidatePermissionsCache(role); | |||||
} | |||||
else if (targetType == PermissionTarget.User) | |||||
{ | |||||
var user = _users[userOrRoleId, channel.Server?.Id]; | |||||
if (user != null) | |||||
channel.InvalidatePermissionsCache(user); | |||||
} | |||||
} | |||||
} | } | ||||
catch (HttpException ex) when (ex.StatusCode == HttpStatusCode.NotFound) { } | catch (HttpException ex) when (ex.StatusCode == HttpStatusCode.NotFound) { } | ||||
} | } | ||||
@@ -1,6 +1,7 @@ | |||||
using System; | using System; | ||||
using System.Collections.Generic; | using System.Collections.Generic; | ||||
using System.Linq; | using System.Linq; | ||||
using System.Net; | |||||
using System.Threading.Tasks; | using System.Threading.Tasks; | ||||
namespace Discord | namespace Discord | ||||
@@ -62,17 +63,18 @@ namespace Discord | |||||
if (name == null) throw new ArgumentNullException(nameof(name)); | if (name == null) throw new ArgumentNullException(nameof(name)); | ||||
CheckReady(); | CheckReady(); | ||||
if (name.StartsWith("@")) | |||||
/*if (name.StartsWith("@")) | |||||
{ | { | ||||
string name2 = name.Substring(1); | string name2 = name.Substring(1); | ||||
return _roles.Where(x => x.Server.Id == server.Id && | return _roles.Where(x => x.Server.Id == server.Id && | ||||
string.Equals(x.Name, name, StringComparison.OrdinalIgnoreCase) || string.Equals(x.Name, name2, StringComparison.OrdinalIgnoreCase)); | |||||
string.Equals(x.Name, name, StringComparison.OrdinalIgnoreCase) || | |||||
string.Equals(x.Name, name2, StringComparison.OrdinalIgnoreCase)); | |||||
} | } | ||||
else | else | ||||
{ | |||||
{*/ | |||||
return _roles.Where(x => x.Server.Id == server.Id && | return _roles.Where(x => x.Server.Id == server.Id && | ||||
string.Equals(x.Name, name, StringComparison.OrdinalIgnoreCase)); | string.Equals(x.Name, name, StringComparison.OrdinalIgnoreCase)); | ||||
} | |||||
//} | |||||
} | } | ||||
/// <summary> Note: due to current API limitations, the created role cannot be returned. </summary> | /// <summary> Note: due to current API limitations, the created role cannot be returned. </summary> | ||||
@@ -84,10 +86,10 @@ namespace Discord | |||||
var response = await _api.CreateRole(server.Id).ConfigureAwait(false); | var response = await _api.CreateRole(server.Id).ConfigureAwait(false); | ||||
var role = _roles.GetOrAdd(response.Id, server.Id); | var role = _roles.GetOrAdd(response.Id, server.Id); | ||||
await _api.EditRole(server.Id, role.Id, name: name).ConfigureAwait(false); | |||||
response.Name = name; | |||||
role.Update(response); | role.Update(response); | ||||
await EditRole(role, name: name).ConfigureAwait(false); | |||||
return role; | return role; | ||||
} | } | ||||
@@ -128,13 +130,14 @@ namespace Discord | |||||
} | } | ||||
} | } | ||||
public Task DeleteRole(Role role) | |||||
public async Task DeleteRole(Role role) | |||||
{ | { | ||||
if (role == null) throw new ArgumentNullException(nameof(role)); | if (role == null) throw new ArgumentNullException(nameof(role)); | ||||
CheckReady(); | CheckReady(); | ||||
return _api.DeleteRole(role.Server.Id, role.Id); | |||||
} | |||||
try { await _api.DeleteRole(role.Server.Id, role.Id); } | |||||
catch (HttpException ex) when(ex.StatusCode == HttpStatusCode.NotFound) { } | |||||
} | |||||
public Task ReorderRoles(Server server, IEnumerable<Role> roles, int startPos = 0) | public Task ReorderRoles(Server server, IEnumerable<Role> roles, int startPos = 0) | ||||
{ | { | ||||
@@ -104,14 +104,14 @@ namespace Discord | |||||
} | } | ||||
/// <summary> Leaves the provided server, destroying it if you are the owner. </summary> | /// <summary> Leaves the provided server, destroying it if you are the owner. </summary> | ||||
public async Task<Server> LeaveServer(Server server) | |||||
public async Task LeaveServer(Server server) | |||||
{ | { | ||||
if (server == null) throw new ArgumentNullException(nameof(server)); | if (server == null) throw new ArgumentNullException(nameof(server)); | ||||
CheckReady(); | CheckReady(); | ||||
try { await _api.LeaveServer(server.Id).ConfigureAwait(false); } | try { await _api.LeaveServer(server.Id).ConfigureAwait(false); } | ||||
catch (HttpException ex) when (ex.StatusCode == HttpStatusCode.NotFound) { } | catch (HttpException ex) when (ex.StatusCode == HttpStatusCode.NotFound) { } | ||||
return _servers.TryRemove(server.Id); | |||||
//return _servers.TryRemove(server.Id); | |||||
} | } | ||||
} | } | ||||
} | } |
@@ -159,9 +159,7 @@ namespace Discord | |||||
string.Equals(x.Name, name2, StringComparison.OrdinalIgnoreCase)); | string.Equals(x.Name, name2, StringComparison.OrdinalIgnoreCase)); | ||||
} | } | ||||
else | else | ||||
{ | |||||
query = server.Members.Where(x => string.Equals(x.Name, name, StringComparison.OrdinalIgnoreCase)); | query = server.Members.Where(x => string.Equals(x.Name, name, StringComparison.OrdinalIgnoreCase)); | ||||
} | |||||
if (discriminator != null) | if (discriminator != null) | ||||
query = query.Where(x => x.Discriminator == discriminator); | query = query.Where(x => x.Discriminator == discriminator); | ||||
return query; | return query; | ||||
@@ -190,10 +188,10 @@ namespace Discord | |||||
public Task SetStatus(UserStatus status) | public Task SetStatus(UserStatus status) | ||||
{ | { | ||||
if (status == (string)null) throw new ArgumentNullException(nameof(status)); | if (status == (string)null) throw new ArgumentNullException(nameof(status)); | ||||
CheckReady(); | |||||
if (status != UserStatus.Online && status != UserStatus.Idle) | if (status != UserStatus.Online && status != UserStatus.Idle) | ||||
throw new ArgumentException($"Invalid status, must be {UserStatus.Online} or {UserStatus.Idle}"); | |||||
throw new ArgumentException($"Invalid status, must be {UserStatus.Online} or {UserStatus.Idle}", nameof(status)); | |||||
CheckReady(); | |||||
_status = status; | _status = status; | ||||
return SendStatus(); | return SendStatus(); | ||||
} | } | ||||