diff --git a/Discord.Net.targets b/Discord.Net.targets
index 958b2053f..079ec7749 100644
--- a/Discord.Net.targets
+++ b/Discord.Net.targets
@@ -16,13 +16,7 @@
$(VersionSuffix)-$(BuildNumber)
build-$(BuildNumber)
-
-
- $(DefineConstants);FILESYSTEM;DEFAULTUDPCLIENT;DEFAULTWEBSOCKET
-
-
- $(DefineConstants);FORMATSTR;UNIXTIME;MSTRYBUFFER;UDPDISPOSE
-
+
$(NoWarn);CS1573;CS1591
true
diff --git a/samples/02_commands_framework/02_commands_framework.csproj b/samples/02_commands_framework/02_commands_framework.csproj
index 77fdc65e1..f479ee0b0 100644
--- a/samples/02_commands_framework/02_commands_framework.csproj
+++ b/samples/02_commands_framework/02_commands_framework.csproj
@@ -6,7 +6,7 @@
-
+
diff --git a/src/Discord.Net.Analyzers/Discord.Net.Analyzers.csproj b/src/Discord.Net.Analyzers/Discord.Net.Analyzers.csproj
index 8ab398ff5..5da3d506d 100644
--- a/src/Discord.Net.Analyzers/Discord.Net.Analyzers.csproj
+++ b/src/Discord.Net.Analyzers/Discord.Net.Analyzers.csproj
@@ -7,7 +7,7 @@
netstandard1.3
-
+
diff --git a/src/Discord.Net.Commands/Discord.Net.Commands.csproj b/src/Discord.Net.Commands/Discord.Net.Commands.csproj
index eaac79a55..a754486dd 100644
--- a/src/Discord.Net.Commands/Discord.Net.Commands.csproj
+++ b/src/Discord.Net.Commands/Discord.Net.Commands.csproj
@@ -1,15 +1,19 @@
-
+
Discord.Net.Commands
Discord.Commands
A Discord.Net extension adding support for bot commands.
- netstandard1.1
+ net46;netstandard1.3;netstandard2.0
+ netstandard1.3;netstandard2.0
-
+
+
+
+
\ No newline at end of file
diff --git a/src/Discord.Net.Core/Discord.Net.Core.csproj b/src/Discord.Net.Core/Discord.Net.Core.csproj
index 321803114..6a58367e6 100644
--- a/src/Discord.Net.Core/Discord.Net.Core.csproj
+++ b/src/Discord.Net.Core/Discord.Net.Core.csproj
@@ -1,15 +1,15 @@
-
+
Discord.Net.Core
Discord
The core components for the Discord.Net library.
- net45;netstandard1.1;netstandard1.3;netstandard2.0
- netstandard1.1;netstandard1.3;netstandard2.0
+ net46;netstandard1.3;netstandard2.0
+ netstandard1.3;netstandard2.0
-
-
+
+
diff --git a/src/Discord.Net.Core/Entities/Channels/ICategoryChannel.cs b/src/Discord.Net.Core/Entities/Channels/ICategoryChannel.cs
index 0f7f5aa62..c004cafd5 100644
--- a/src/Discord.Net.Core/Entities/Channels/ICategoryChannel.cs
+++ b/src/Discord.Net.Core/Entities/Channels/ICategoryChannel.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
diff --git a/src/Discord.Net.Core/Entities/Channels/IGuildChannel.cs b/src/Discord.Net.Core/Entities/Channels/IGuildChannel.cs
index c9841cb15..6514d46cd 100644
--- a/src/Discord.Net.Core/Entities/Channels/IGuildChannel.cs
+++ b/src/Discord.Net.Core/Entities/Channels/IGuildChannel.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
using System.Collections.Generic;
using System.Threading.Tasks;
@@ -9,10 +9,6 @@ namespace Discord
/// Gets the position of this channel in the guild's channel list, relative to others of the same type.
int Position { get; }
- /// Gets the parentid (category) of this channel in the guild's channel list.
- ulong? CategoryId { get; }
- /// Gets the parent channel (category) of this channel.
- Task GetCategoryAsync();
/// Gets the guild this channel is a member of.
IGuild Guild { get; }
/// Gets the id of the guild this channel is a member of.
@@ -49,4 +45,4 @@ namespace Discord
/// Gets a user in this channel with the provided id.
new Task GetUserAsync(ulong id, CacheMode mode = CacheMode.AllowDownload, RequestOptions options = null);
}
-}
\ No newline at end of file
+}
diff --git a/src/Discord.Net.Core/Entities/Channels/IMessageChannel.cs b/src/Discord.Net.Core/Entities/Channels/IMessageChannel.cs
index 262b865ea..ef5a6fa7a 100644
--- a/src/Discord.Net.Core/Entities/Channels/IMessageChannel.cs
+++ b/src/Discord.Net.Core/Entities/Channels/IMessageChannel.cs
@@ -9,10 +9,9 @@ namespace Discord
{
/// Sends a message to this message channel.
Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null);
-#if FILESYSTEM
/// Sends a file to this text channel, with an optional caption.
Task SendFileAsync(string filePath, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null);
-#endif
+
/// Sends a file to this text channel, with an optional caption.
Task SendFileAsync(Stream stream, string filename, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null);
diff --git a/src/Discord.Net.Core/Entities/Channels/INestedChannel.cs b/src/Discord.Net.Core/Entities/Channels/INestedChannel.cs
new file mode 100644
index 000000000..c8d2bcaaf
--- /dev/null
+++ b/src/Discord.Net.Core/Entities/Channels/INestedChannel.cs
@@ -0,0 +1,16 @@
+using System.Threading.Tasks;
+
+namespace Discord
+{
+ ///
+ /// A type of guild channel that can be nested within a category.
+ /// Contains a CategoryId that is set to the parent category, if it is set.
+ ///
+ public interface INestedChannel : IGuildChannel
+ {
+ /// Gets the parentid (category) of this channel in the guild's channel list.
+ ulong? CategoryId { get; }
+ /// Gets the parent channel (category) of this channel, if it is set. If unset, returns null.
+ Task GetCategoryAsync(CacheMode mode = CacheMode.AllowDownload, RequestOptions options = null);
+ }
+}
diff --git a/src/Discord.Net.Core/Entities/Channels/ITextChannel.cs b/src/Discord.Net.Core/Entities/Channels/ITextChannel.cs
index 7c6ec3908..2aa070b03 100644
--- a/src/Discord.Net.Core/Entities/Channels/ITextChannel.cs
+++ b/src/Discord.Net.Core/Entities/Channels/ITextChannel.cs
@@ -1,11 +1,11 @@
-using System;
+using System;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
namespace Discord
{
- public interface ITextChannel : IMessageChannel, IMentionable, IGuildChannel
+ public interface ITextChannel : IMessageChannel, IMentionable, INestedChannel
{
/// Checks if the channel is NSFW.
bool IsNsfw { get; }
@@ -28,4 +28,4 @@ namespace Discord
/// Gets the webhooks for this text channel.
Task> GetWebhooksAsync(RequestOptions options = null);
}
-}
\ No newline at end of file
+}
diff --git a/src/Discord.Net.Core/Entities/Channels/IVoiceChannel.cs b/src/Discord.Net.Core/Entities/Channels/IVoiceChannel.cs
index e2a2ad8eb..2e345bfda 100644
--- a/src/Discord.Net.Core/Entities/Channels/IVoiceChannel.cs
+++ b/src/Discord.Net.Core/Entities/Channels/IVoiceChannel.cs
@@ -1,9 +1,9 @@
-using System;
+using System;
using System.Threading.Tasks;
namespace Discord
{
- public interface IVoiceChannel : IGuildChannel, IAudioChannel
+ public interface IVoiceChannel : INestedChannel, IAudioChannel
{
/// Gets the bitrate, in bits per second, clients in this voice channel are requested to use.
int Bitrate { get; }
@@ -13,4 +13,4 @@ namespace Discord
/// Modifies this voice channel.
Task ModifyAsync(Action func, RequestOptions options = null);
}
-}
\ No newline at end of file
+}
diff --git a/src/Discord.Net.Core/Entities/Image.cs b/src/Discord.Net.Core/Entities/Image.cs
index c2c997365..3b946ce80 100644
--- a/src/Discord.Net.Core/Entities/Image.cs
+++ b/src/Discord.Net.Core/Entities/Image.cs
@@ -1,4 +1,4 @@
-using System.IO;
+using System.IO;
namespace Discord
{
///
@@ -15,7 +15,7 @@ namespace Discord
{
Stream = stream;
}
-#if FILESYSTEM
+
///
/// Create the image from a file path.
///
@@ -27,6 +27,6 @@ namespace Discord
{
Stream = File.OpenRead(path);
}
-#endif
+
}
}
diff --git a/src/Discord.Net.Core/Entities/Permissions/GuildPermissions.cs b/src/Discord.Net.Core/Entities/Permissions/GuildPermissions.cs
index 2b7fb4ee5..7704a62d6 100644
--- a/src/Discord.Net.Core/Entities/Permissions/GuildPermissions.cs
+++ b/src/Discord.Net.Core/Entities/Permissions/GuildPermissions.cs
@@ -93,7 +93,7 @@ namespace Discord
bool? manageGuild = null,
bool? addReactions = null,
bool? viewAuditLog = null,
- bool? readMessages = null,
+ bool? viewChannel = null,
bool? sendMessages = null,
bool? sendTTSMessages = null,
bool? manageMessages = null,
@@ -124,7 +124,7 @@ namespace Discord
Permissions.SetValue(ref value, manageGuild, GuildPermission.ManageGuild);
Permissions.SetValue(ref value, addReactions, GuildPermission.AddReactions);
Permissions.SetValue(ref value, viewAuditLog, GuildPermission.ViewAuditLog);
- Permissions.SetValue(ref value, readMessages, GuildPermission.ReadMessages);
+ Permissions.SetValue(ref value, viewChannel, GuildPermission.ViewChannel);
Permissions.SetValue(ref value, sendMessages, GuildPermission.SendMessages);
Permissions.SetValue(ref value, sendTTSMessages, GuildPermission.SendTTSMessages);
Permissions.SetValue(ref value, manageMessages, GuildPermission.ManageMessages);
@@ -158,7 +158,7 @@ namespace Discord
bool manageGuild = false,
bool addReactions = false,
bool viewAuditLog = false,
- bool readMessages = false,
+ bool viewChannel = false,
bool sendMessages = false,
bool sendTTSMessages = false,
bool manageMessages = false,
@@ -188,7 +188,7 @@ namespace Discord
manageGuild: manageGuild,
addReactions: addReactions,
viewAuditLog: viewAuditLog,
- readMessages: readMessages,
+ viewChannel: viewChannel,
sendMessages: sendMessages,
sendTTSMessages: sendTTSMessages,
manageMessages: manageMessages,
@@ -219,7 +219,7 @@ namespace Discord
bool? manageGuild = null,
bool? addReactions = null,
bool? viewAuditLog = null,
- bool? readMessages = null,
+ bool? viewChannel = null,
bool? sendMessages = null,
bool? sendTTSMessages = null,
bool? manageMessages = null,
@@ -240,7 +240,7 @@ namespace Discord
bool? manageWebhooks = null,
bool? manageEmojis = null)
=> new GuildPermissions(RawValue, createInstantInvite, kickMembers, banMembers, administrator, manageChannels, manageGuild, addReactions,
- viewAuditLog, readMessages, sendMessages, sendTTSMessages, manageMessages, embedLinks, attachFiles,
+ viewAuditLog, viewChannel, sendMessages, sendTTSMessages, manageMessages, embedLinks, attachFiles,
readMessageHistory, mentionEveryone, useExternalEmojis, connect, speak, muteMembers, deafenMembers, moveMembers,
useVoiceActivation, changeNickname, manageNicknames, manageRoles, manageWebhooks, manageEmojis);
diff --git a/src/Discord.Net.Core/Extensions/UserExtensions.cs b/src/Discord.Net.Core/Extensions/UserExtensions.cs
index 3296d00fd..951e8ca4b 100644
--- a/src/Discord.Net.Core/Extensions/UserExtensions.cs
+++ b/src/Discord.Net.Core/Extensions/UserExtensions.cs
@@ -32,7 +32,6 @@ namespace Discord
return await (await user.GetOrCreateDMChannelAsync().ConfigureAwait(false)).SendFileAsync(stream, filename, text, isTTS, embed, options).ConfigureAwait(false);
}
-#if FILESYSTEM
///
/// Sends a file to the user via DM.
///
@@ -45,7 +44,6 @@ namespace Discord
{
return await (await user.GetOrCreateDMChannelAsync().ConfigureAwait(false)).SendFileAsync(filePath, text, isTTS, embed, options).ConfigureAwait(false);
}
-#endif
public static Task BanAsync(this IGuildUser user, int pruneDays = 0, string reason = null, RequestOptions options = null)
=> user.Guild.AddBanAsync(user, pruneDays, reason, options);
diff --git a/src/Discord.Net.Core/Logging/LogManager.cs b/src/Discord.Net.Core/Logging/LogManager.cs
index 995a5d96a..a69519fa2 100644
--- a/src/Discord.Net.Core/Logging/LogManager.cs
+++ b/src/Discord.Net.Core/Logging/LogManager.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
using System.Threading.Tasks;
namespace Discord.Logging
@@ -35,7 +35,7 @@ namespace Discord.Logging
}
catch { }
}
-#if FORMATSTR
+
public async Task LogAsync(LogSeverity severity, string source, FormattableString message, Exception ex = null)
{
try
@@ -45,52 +45,49 @@ namespace Discord.Logging
}
catch { }
}
-#endif
+
public Task ErrorAsync(string source, Exception ex)
=> LogAsync(LogSeverity.Error, source, ex);
public Task ErrorAsync(string source, string message, Exception ex = null)
=> LogAsync(LogSeverity.Error, source, message, ex);
-#if FORMATSTR
+
public Task ErrorAsync(string source, FormattableString message, Exception ex = null)
=> LogAsync(LogSeverity.Error, source, message, ex);
-#endif
+
public Task WarningAsync(string source, Exception ex)
=> LogAsync(LogSeverity.Warning, source, ex);
public Task WarningAsync(string source, string message, Exception ex = null)
=> LogAsync(LogSeverity.Warning, source, message, ex);
-#if FORMATSTR
+
public Task WarningAsync(string source, FormattableString message, Exception ex = null)
=> LogAsync(LogSeverity.Warning, source, message, ex);
-#endif
+
public Task InfoAsync(string source, Exception ex)
=> LogAsync(LogSeverity.Info, source, ex);
public Task InfoAsync(string source, string message, Exception ex = null)
=> LogAsync(LogSeverity.Info, source, message, ex);
-#if FORMATSTR
public Task InfoAsync(string source, FormattableString message, Exception ex = null)
=> LogAsync(LogSeverity.Info, source, message, ex);
-#endif
+
public Task VerboseAsync(string source, Exception ex)
=> LogAsync(LogSeverity.Verbose, source, ex);
public Task VerboseAsync(string source, string message, Exception ex = null)
=> LogAsync(LogSeverity.Verbose, source, message, ex);
-#if FORMATSTR
public Task VerboseAsync(string source, FormattableString message, Exception ex = null)
=> LogAsync(LogSeverity.Verbose, source, message, ex);
-#endif
+
public Task DebugAsync(string source, Exception ex)
=> LogAsync(LogSeverity.Debug, source, ex);
public Task DebugAsync(string source, string message, Exception ex = null)
=> LogAsync(LogSeverity.Debug, source, message, ex);
-#if FORMATSTR
public Task DebugAsync(string source, FormattableString message, Exception ex = null)
=> LogAsync(LogSeverity.Debug, source, message, ex);
-#endif
+
public Logger CreateLogger(string name) => new Logger(this, name);
diff --git a/src/Discord.Net.Core/Logging/Logger.cs b/src/Discord.Net.Core/Logging/Logger.cs
index a8d88b2b4..e71c56992 100644
--- a/src/Discord.Net.Core/Logging/Logger.cs
+++ b/src/Discord.Net.Core/Logging/Logger.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
using System.Threading.Tasks;
namespace Discord.Logging
@@ -20,54 +20,53 @@ namespace Discord.Logging
=> _manager.LogAsync(severity, Name, exception);
public Task LogAsync(LogSeverity severity, string message, Exception exception = null)
=> _manager.LogAsync(severity, Name, message, exception);
-#if FORMATSTR
public Task LogAsync(LogSeverity severity, FormattableString message, Exception exception = null)
=> _manager.LogAsync(severity, Name, message, exception);
-#endif
+
public Task ErrorAsync(Exception exception)
=> _manager.ErrorAsync(Name, exception);
public Task ErrorAsync(string message, Exception exception = null)
=> _manager.ErrorAsync(Name, message, exception);
-#if FORMATSTR
+
public Task ErrorAsync(FormattableString message, Exception exception = null)
=> _manager.ErrorAsync(Name, message, exception);
-#endif
+
public Task WarningAsync(Exception exception)
=> _manager.WarningAsync(Name, exception);
public Task WarningAsync(string message, Exception exception = null)
=> _manager.WarningAsync(Name, message, exception);
-#if FORMATSTR
+
public Task WarningAsync(FormattableString message, Exception exception = null)
=> _manager.WarningAsync(Name, message, exception);
-#endif
+
public Task InfoAsync(Exception exception)
=> _manager.InfoAsync(Name, exception);
public Task InfoAsync(string message, Exception exception = null)
=> _manager.InfoAsync(Name, message, exception);
-#if FORMATSTR
+
public Task InfoAsync(FormattableString message, Exception exception = null)
=> _manager.InfoAsync(Name, message, exception);
-#endif
+
public Task VerboseAsync(Exception exception)
=> _manager.VerboseAsync(Name, exception);
public Task VerboseAsync(string message, Exception exception = null)
=> _manager.VerboseAsync(Name, message, exception);
-#if FORMATSTR
+
public Task VerboseAsync(FormattableString message, Exception exception = null)
=> _manager.VerboseAsync(Name, message, exception);
-#endif
+
public Task DebugAsync(Exception exception)
=> _manager.DebugAsync(Name, exception);
public Task DebugAsync(string message, Exception exception = null)
=> _manager.DebugAsync(Name, message, exception);
-#if FORMATSTR
+
public Task DebugAsync(FormattableString message, Exception exception = null)
=> _manager.DebugAsync(Name, message, exception);
-#endif
+
}
}
diff --git a/src/Discord.Net.Core/Utils/DateTimeUtils.cs b/src/Discord.Net.Core/Utils/DateTimeUtils.cs
index af2126853..e2a8faa75 100644
--- a/src/Discord.Net.Core/Utils/DateTimeUtils.cs
+++ b/src/Discord.Net.Core/Utils/DateTimeUtils.cs
@@ -1,57 +1,14 @@
-using System;
+using System;
namespace Discord
{
//Source: https://github.com/dotnet/coreclr/blob/master/src/mscorlib/src/System/DateTimeOffset.cs
internal static class DateTimeUtils
{
-#if !UNIXTIME
- private const long UnixEpochTicks = 621_355_968_000_000_000;
- private const long UnixEpochSeconds = 62_135_596_800;
- private const long UnixEpochMilliseconds = 62_135_596_800_000;
-#endif
-
public static DateTimeOffset FromTicks(long ticks)
=> new DateTimeOffset(ticks, TimeSpan.Zero);
public static DateTimeOffset? FromTicks(long? ticks)
=> ticks != null ? new DateTimeOffset(ticks.Value, TimeSpan.Zero) : (DateTimeOffset?)null;
-
- public static DateTimeOffset FromUnixSeconds(long seconds)
- {
-#if UNIXTIME
- return DateTimeOffset.FromUnixTimeSeconds(seconds);
-#else
- long ticks = seconds * TimeSpan.TicksPerSecond + UnixEpochTicks;
- return new DateTimeOffset(ticks, TimeSpan.Zero);
-#endif
- }
- public static DateTimeOffset FromUnixMilliseconds(long milliseconds)
- {
-#if UNIXTIME
- return DateTimeOffset.FromUnixTimeMilliseconds(milliseconds);
-#else
- long ticks = milliseconds * TimeSpan.TicksPerMillisecond + UnixEpochTicks;
- return new DateTimeOffset(ticks, TimeSpan.Zero);
-#endif
- }
-
- public static long ToUnixSeconds(DateTimeOffset dto)
- {
-#if UNIXTIME
- return dto.ToUnixTimeSeconds();
-#else
- long seconds = dto.UtcDateTime.Ticks / TimeSpan.TicksPerSecond;
- return seconds - UnixEpochSeconds;
-#endif
- }
- public static long ToUnixMilliseconds(DateTimeOffset dto)
- {
-#if UNIXTIME
- return dto.ToUnixTimeMilliseconds();
-#else
- long milliseconds = dto.UtcDateTime.Ticks / TimeSpan.TicksPerMillisecond;
- return milliseconds - UnixEpochMilliseconds;
-#endif
- }
+
}
}
diff --git a/src/Discord.Net.Core/Utils/SnowflakeUtils.cs b/src/Discord.Net.Core/Utils/SnowflakeUtils.cs
index c9d0d130b..eecebfb24 100644
--- a/src/Discord.Net.Core/Utils/SnowflakeUtils.cs
+++ b/src/Discord.Net.Core/Utils/SnowflakeUtils.cs
@@ -5,8 +5,8 @@ namespace Discord
public static class SnowflakeUtils
{
public static DateTimeOffset FromSnowflake(ulong value)
- => DateTimeUtils.FromUnixMilliseconds((long)((value >> 22) + 1420070400000UL));
+ => DateTimeOffset.FromUnixTimeMilliseconds((long)((value >> 22) + 1420070400000UL));
public static ulong ToSnowflake(DateTimeOffset value)
- => ((ulong)DateTimeUtils.ToUnixMilliseconds(value) - 1420070400000UL) << 22;
+ => ((ulong)value.ToUnixTimeMilliseconds() - 1420070400000UL) << 22;
}
}
diff --git a/src/Discord.Net.Rest/Discord.Net.Rest.csproj b/src/Discord.Net.Rest/Discord.Net.Rest.csproj
index 0eb07a4b2..75b69bd04 100644
--- a/src/Discord.Net.Rest/Discord.Net.Rest.csproj
+++ b/src/Discord.Net.Rest/Discord.Net.Rest.csproj
@@ -1,20 +1,19 @@
-
+
Discord.Net.Rest
Discord.Rest
A core Discord.Net library containing the REST client and models.
- net45;netstandard1.1;netstandard1.3
- netstandard1.1;netstandard1.3
+ net46;netstandard1.3;netstandard2.0
+ netstandard1.3;netstandard2.0
-
-
-
+
+
-
+
diff --git a/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/ChannelUpdateAuditLogData.cs b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/ChannelUpdateAuditLogData.cs
index f3403138d..491cb5717 100644
--- a/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/ChannelUpdateAuditLogData.cs
+++ b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/ChannelUpdateAuditLogData.cs
@@ -39,7 +39,7 @@ namespace Discord.Rest
}
public ulong ChannelId { get; }
- public ChannelInfo Before { get; set; }
- public ChannelInfo After { get; set; }
+ public ChannelInfo Before { get; }
+ public ChannelInfo After { get; }
}
}
diff --git a/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/MemberRoleAuditLogData.cs b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/MemberRoleAuditLogData.cs
index b0f0a1fe1..3bcbce440 100644
--- a/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/MemberRoleAuditLogData.cs
+++ b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/MemberRoleAuditLogData.cs
@@ -9,7 +9,7 @@ namespace Discord.Rest
{
public class MemberRoleAuditLogData : IAuditLogData
{
- private MemberRoleAuditLogData(IReadOnlyCollection roles, IUser target)
+ private MemberRoleAuditLogData(IReadOnlyCollection roles, IUser target)
{
Roles = roles;
Target = target;
@@ -21,7 +21,7 @@ namespace Discord.Rest
var roleInfos = changes.SelectMany(x => x.NewValue.ToObject(),
(model, role) => new { model.ChangedProperty, Role = role })
- .Select(x => new RoleInfo(x.Role.Name, x.Role.Id, x.ChangedProperty == "$add"))
+ .Select(x => new MemberRoleEditInfo(x.Role.Name, x.Role.Id, x.ChangedProperty == "$add"))
.ToList();
var userInfo = log.Users.FirstOrDefault(x => x.Id == entry.TargetId);
@@ -30,21 +30,7 @@ namespace Discord.Rest
return new MemberRoleAuditLogData(roleInfos.ToReadOnlyCollection(), user);
}
- public IReadOnlyCollection Roles { get; }
+ public IReadOnlyCollection Roles { get; }
public IUser Target { get; }
-
- public struct RoleInfo
- {
- internal RoleInfo(string name, ulong roleId, bool added)
- {
- Name = name;
- RoleId = roleId;
- Added = added;
- }
-
- public string Name { get; }
- public ulong RoleId { get; }
- public bool Added { get; }
- }
}
}
diff --git a/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/MemberRoleEditInfo.cs b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/MemberRoleEditInfo.cs
new file mode 100644
index 000000000..4838b75c9
--- /dev/null
+++ b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/MemberRoleEditInfo.cs
@@ -0,0 +1,16 @@
+namespace Discord.Rest
+{
+ public struct MemberRoleEditInfo
+ {
+ internal MemberRoleEditInfo(string name, ulong roleId, bool added)
+ {
+ Name = name;
+ RoleId = roleId;
+ Added = added;
+ }
+
+ public string Name { get; }
+ public ulong RoleId { get; }
+ public bool Added { get; }
+ }
+}
diff --git a/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/RoleCreateAuditLogData.cs b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/RoleCreateAuditLogData.cs
index aa951d6e7..dcc1c6ab6 100644
--- a/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/RoleCreateAuditLogData.cs
+++ b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/RoleCreateAuditLogData.cs
@@ -7,7 +7,7 @@ namespace Discord.Rest
{
public class RoleCreateAuditLogData : IAuditLogData
{
- private RoleCreateAuditLogData(ulong id, RoleInfo props)
+ private RoleCreateAuditLogData(ulong id, RoleEditInfo props)
{
RoleId = id;
Properties = props;
@@ -38,10 +38,10 @@ namespace Discord.Rest
permissions = new GuildPermissions(permissionsRaw.Value);
return new RoleCreateAuditLogData(entry.TargetId.Value,
- new RoleInfo(color, mentionable, hoist, name, permissions));
+ new RoleEditInfo(color, mentionable, hoist, name, permissions));
}
public ulong RoleId { get; }
- public RoleInfo Properties { get; }
+ public RoleEditInfo Properties { get; }
}
}
diff --git a/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/RoleDeleteAuditLogData.cs b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/RoleDeleteAuditLogData.cs
index e90d70d4d..263909daf 100644
--- a/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/RoleDeleteAuditLogData.cs
+++ b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/RoleDeleteAuditLogData.cs
@@ -7,7 +7,7 @@ namespace Discord.Rest
{
public class RoleDeleteAuditLogData : IAuditLogData
{
- private RoleDeleteAuditLogData(ulong id, RoleInfo props)
+ private RoleDeleteAuditLogData(ulong id, RoleEditInfo props)
{
RoleId = id;
Properties = props;
@@ -38,10 +38,10 @@ namespace Discord.Rest
permissions = new GuildPermissions(permissionsRaw.Value);
return new RoleDeleteAuditLogData(entry.TargetId.Value,
- new RoleInfo(color, mentionable, hoist, name, permissions));
+ new RoleEditInfo(color, mentionable, hoist, name, permissions));
}
public ulong RoleId { get; }
- public RoleInfo Properties { get; }
+ public RoleEditInfo Properties { get; }
}
}
diff --git a/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/RoleEditInfo.cs b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/RoleEditInfo.cs
new file mode 100644
index 000000000..186ea8d11
--- /dev/null
+++ b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/RoleEditInfo.cs
@@ -0,0 +1,21 @@
+namespace Discord.Rest
+{
+ public struct RoleEditInfo
+ {
+ internal RoleEditInfo(Color? color, bool? mentionable, bool? hoist, string name,
+ GuildPermissions? permissions)
+ {
+ Color = color;
+ Mentionable = mentionable;
+ Hoist = hoist;
+ Name = name;
+ Permissions = permissions;
+ }
+
+ public Color? Color { get; }
+ public bool? Mentionable { get; }
+ public bool? Hoist { get; }
+ public string Name { get; }
+ public GuildPermissions? Permissions { get; }
+ }
+}
diff --git a/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/RoleInfo.cs b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/RoleInfo.cs
deleted file mode 100644
index 2208990e6..000000000
--- a/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/RoleInfo.cs
+++ /dev/null
@@ -1,21 +0,0 @@
-namespace Discord.Rest
-{
- public struct RoleInfo
- {
- internal RoleInfo(Color? color, bool? mentionable, bool? hoist, string name,
- GuildPermissions? permissions)
- {
- Color = color;
- Mentionable = mentionable;
- Hoist = hoist;
- Name = name;
- Permissions = permissions;
- }
-
- public Color? Color { get; }
- public bool? Mentionable { get; }
- public bool? Hoist { get; }
- public string Name { get; }
- public GuildPermissions? Permissions { get; }
- }
-}
diff --git a/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/RoleUpdateAuditLogData.cs b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/RoleUpdateAuditLogData.cs
index be484e2d5..b645ef7ae 100644
--- a/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/RoleUpdateAuditLogData.cs
+++ b/src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/RoleUpdateAuditLogData.cs
@@ -7,7 +7,7 @@ namespace Discord.Rest
{
public class RoleUpdateAuditLogData : IAuditLogData
{
- private RoleUpdateAuditLogData(ulong id, RoleInfo oldProps, RoleInfo newProps)
+ private RoleUpdateAuditLogData(ulong id, RoleEditInfo oldProps, RoleEditInfo newProps)
{
RoleId = id;
Before = oldProps;
@@ -49,14 +49,14 @@ namespace Discord.Rest
if (newPermissionsRaw.HasValue)
newPermissions = new GuildPermissions(newPermissionsRaw.Value);
- var oldProps = new RoleInfo(oldColor, oldMentionable, oldHoist, oldName, oldPermissions);
- var newProps = new RoleInfo(newColor, newMentionable, newHoist, newName, newPermissions);
+ var oldProps = new RoleEditInfo(oldColor, oldMentionable, oldHoist, oldName, oldPermissions);
+ var newProps = new RoleEditInfo(newColor, newMentionable, newHoist, newName, newPermissions);
return new RoleUpdateAuditLogData(entry.TargetId.Value, oldProps, newProps);
}
public ulong RoleId { get; }
- public RoleInfo Before { get; }
- public RoleInfo After { get; }
+ public RoleEditInfo Before { get; }
+ public RoleEditInfo After { get; }
}
}
diff --git a/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs b/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs
index dbbabbd72..4047b7014 100644
--- a/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs
+++ b/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs
@@ -168,7 +168,6 @@ namespace Discord.Rest
return RestUserMessage.Create(client, channel, client.CurrentUser, model);
}
-#if FILESYSTEM
public static async Task SendFileAsync(IMessageChannel channel, BaseDiscordClient client,
string filePath, string text, bool isTTS, Embed embed, RequestOptions options)
{
@@ -176,7 +175,7 @@ namespace Discord.Rest
using (var file = File.OpenRead(filePath))
return await SendFileAsync(channel, client, file, filename, text, isTTS, embed, options).ConfigureAwait(false);
}
-#endif
+
public static async Task SendFileAsync(IMessageChannel channel, BaseDiscordClient client,
Stream stream, string filename, string text, bool isTTS, Embed embed, RequestOptions options)
{
@@ -317,6 +316,16 @@ namespace Discord.Rest
return models.Select(x => RestWebhook.Create(client, channel, x))
.ToImmutableArray();
}
+ // Categories
+ public static async Task GetCategoryAsync(INestedChannel channel, BaseDiscordClient client, RequestOptions options)
+ {
+ // if no category id specified, return null
+ if (!channel.CategoryId.HasValue)
+ return null;
+ // CategoryId will contain a value here
+ var model = await client.ApiClient.GetChannelAsync(channel.CategoryId.Value, options).ConfigureAwait(false);
+ return RestCategoryChannel.Create(client, model) as ICategoryChannel;
+ }
//Helpers
private static IUser GetAuthor(BaseDiscordClient client, IGuild guild, UserModel model, ulong? webhookId)
diff --git a/src/Discord.Net.Rest/Entities/Channels/IRestMessageChannel.cs b/src/Discord.Net.Rest/Entities/Channels/IRestMessageChannel.cs
index b6f891f40..e0095c7b1 100644
--- a/src/Discord.Net.Rest/Entities/Channels/IRestMessageChannel.cs
+++ b/src/Discord.Net.Rest/Entities/Channels/IRestMessageChannel.cs
@@ -8,10 +8,9 @@ namespace Discord.Rest
{
/// Sends a message to this message channel.
new Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null);
-#if FILESYSTEM
/// Sends a file to this text channel, with an optional caption.
new Task SendFileAsync(string filePath, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null);
-#endif
+
/// Sends a file to this text channel, with an optional caption.
new Task SendFileAsync(Stream stream, string filename, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null);
diff --git a/src/Discord.Net.Rest/Entities/Channels/RestCategoryChannel.cs b/src/Discord.Net.Rest/Entities/Channels/RestCategoryChannel.cs
index 397e14e76..321f1f1d2 100644
--- a/src/Discord.Net.Rest/Entities/Channels/RestCategoryChannel.cs
+++ b/src/Discord.Net.Rest/Entities/Channels/RestCategoryChannel.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
@@ -25,10 +25,6 @@ namespace Discord.Rest
private string DebuggerDisplay => $"{Name} ({Id}, Category)";
// IGuildChannel
- IAsyncEnumerable> IGuildChannel.GetUsersAsync(CacheMode mode, RequestOptions options)
- => throw new NotSupportedException();
- Task IGuildChannel.GetUserAsync(ulong id, CacheMode mode, RequestOptions options)
- => throw new NotSupportedException();
Task IGuildChannel.CreateInviteAsync(int? maxAge, int? maxUses, bool isTemporary, bool isUnique, RequestOptions options)
=> throw new NotSupportedException();
Task> IGuildChannel.GetInvitesAsync(RequestOptions options)
diff --git a/src/Discord.Net.Rest/Entities/Channels/RestChannel.cs b/src/Discord.Net.Rest/Entities/Channels/RestChannel.cs
index 04cc5a937..5860d8283 100644
--- a/src/Discord.Net.Rest/Entities/Channels/RestChannel.cs
+++ b/src/Discord.Net.Rest/Entities/Channels/RestChannel.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
@@ -24,6 +24,8 @@ namespace Discord.Rest
case ChannelType.DM:
case ChannelType.Group:
return CreatePrivate(discord, model) as RestChannel;
+ case ChannelType.Category:
+ return RestCategoryChannel.Create(discord, new RestGuild(discord, model.GuildId.Value), model);
default:
return new RestChannel(discord, model.Id);
}
diff --git a/src/Discord.Net.Rest/Entities/Channels/RestDMChannel.cs b/src/Discord.Net.Rest/Entities/Channels/RestDMChannel.cs
index 21cd579e6..64efcf24b 100644
--- a/src/Discord.Net.Rest/Entities/Channels/RestDMChannel.cs
+++ b/src/Discord.Net.Rest/Entities/Channels/RestDMChannel.cs
@@ -65,10 +65,10 @@ namespace Discord.Rest
public Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null)
=> ChannelHelper.SendMessageAsync(this, Discord, text, isTTS, embed, options);
-#if FILESYSTEM
+
public Task SendFileAsync(string filePath, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null)
=> ChannelHelper.SendFileAsync(this, Discord, filePath, text, isTTS, embed, options);
-#endif
+
public Task SendFileAsync(Stream stream, string filename, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null)
=> ChannelHelper.SendFileAsync(this, Discord, stream, filename, text, isTTS, embed, options);
@@ -126,10 +126,9 @@ namespace Discord.Rest
async Task> IMessageChannel.GetPinnedMessagesAsync(RequestOptions options)
=> await GetPinnedMessagesAsync(options).ConfigureAwait(false);
-#if FILESYSTEM
async Task IMessageChannel.SendFileAsync(string filePath, string text, bool isTTS, Embed embed, RequestOptions options)
=> await SendFileAsync(filePath, text, isTTS, embed, options).ConfigureAwait(false);
-#endif
+
async Task IMessageChannel.SendFileAsync(Stream stream, string filename, string text, bool isTTS, Embed embed, RequestOptions options)
=> await SendFileAsync(stream, filename, text, isTTS, embed, options).ConfigureAwait(false);
async Task IMessageChannel.SendMessageAsync(string text, bool isTTS, Embed embed, RequestOptions options)
diff --git a/src/Discord.Net.Rest/Entities/Channels/RestGroupChannel.cs b/src/Discord.Net.Rest/Entities/Channels/RestGroupChannel.cs
index 901016a6b..367abfb4a 100644
--- a/src/Discord.Net.Rest/Entities/Channels/RestGroupChannel.cs
+++ b/src/Discord.Net.Rest/Entities/Channels/RestGroupChannel.cs
@@ -83,10 +83,10 @@ namespace Discord.Rest
public Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null)
=> ChannelHelper.SendMessageAsync(this, Discord, text, isTTS, embed, options);
-#if FILESYSTEM
+
public Task SendFileAsync(string filePath, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null)
=> ChannelHelper.SendFileAsync(this, Discord, filePath, text, isTTS, embed, options);
-#endif
+
public Task SendFileAsync(Stream stream, string filename, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null)
=> ChannelHelper.SendFileAsync(this, Discord, stream, filename, text, isTTS, embed, options);
@@ -136,10 +136,9 @@ namespace Discord.Rest
async Task> IMessageChannel.GetPinnedMessagesAsync(RequestOptions options)
=> await GetPinnedMessagesAsync(options).ConfigureAwait(false);
-#if FILESYSTEM
async Task IMessageChannel.SendFileAsync(string filePath, string text, bool isTTS, Embed embed, RequestOptions options)
=> await SendFileAsync(filePath, text, isTTS, embed, options).ConfigureAwait(false);
-#endif
+
async Task IMessageChannel.SendFileAsync(Stream stream, string filename, string text, bool isTTS, Embed embed, RequestOptions options)
=> await SendFileAsync(stream, filename, text, isTTS, embed, options).ConfigureAwait(false);
async Task IMessageChannel.SendMessageAsync(string text, bool isTTS, Embed embed, RequestOptions options)
diff --git a/src/Discord.Net.Rest/Entities/Channels/RestGuildChannel.cs b/src/Discord.Net.Rest/Entities/Channels/RestGuildChannel.cs
index 026d03cc8..7355e3673 100644
--- a/src/Discord.Net.Rest/Entities/Channels/RestGuildChannel.cs
+++ b/src/Discord.Net.Rest/Entities/Channels/RestGuildChannel.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
@@ -16,7 +16,6 @@ namespace Discord.Rest
internal IGuild Guild { get; }
public string Name { get; private set; }
public int Position { get; private set; }
- public ulong? CategoryId { get; private set; }
public ulong GuildId => Guild.Id;
internal RestGuildChannel(BaseDiscordClient discord, IGuild guild, ulong id)
@@ -35,7 +34,6 @@ namespace Discord.Rest
case ChannelType.Category:
return RestCategoryChannel.Create(discord, guild, model);
default:
- // TODO: Channel categories
return new RestGuildChannel(discord, guild, model.Id);
}
}
@@ -64,13 +62,6 @@ namespace Discord.Rest
public Task DeleteAsync(RequestOptions options = null)
=> ChannelHelper.DeleteAsync(this, Discord, options);
- public async Task GetCategoryAsync()
- {
- if (CategoryId.HasValue)
- return (await Guild.GetChannelAsync(CategoryId.Value).ConfigureAwait(false)) as ICategoryChannel;
- return null;
- }
-
public OverwritePermissions? GetPermissionOverwrite(IUser user)
{
for (int i = 0; i < _overwrites.Length; i++)
diff --git a/src/Discord.Net.Rest/Entities/Channels/RestTextChannel.cs b/src/Discord.Net.Rest/Entities/Channels/RestTextChannel.cs
index 841aad666..a08585cd8 100644
--- a/src/Discord.Net.Rest/Entities/Channels/RestTextChannel.cs
+++ b/src/Discord.Net.Rest/Entities/Channels/RestTextChannel.cs
@@ -12,6 +12,7 @@ namespace Discord.Rest
public class RestTextChannel : RestGuildChannel, IRestMessageChannel, ITextChannel
{
public string Topic { get; private set; }
+ public ulong? CategoryId { get; private set; }
public string Mention => MentionUtils.MentionChannel(Id);
@@ -31,7 +32,7 @@ namespace Discord.Rest
internal override void Update(Model model)
{
base.Update(model);
-
+ CategoryId = model.CategoryId;
Topic = model.Topic.Value;
_nsfw = model.Nsfw.GetValueOrDefault();
}
@@ -46,7 +47,7 @@ namespace Discord.Rest
=> ChannelHelper.GetUserAsync(this, Guild, Discord, id, options);
public IAsyncEnumerable> GetUsersAsync(RequestOptions options = null)
=> ChannelHelper.GetUsersAsync(this, Guild, Discord, null, null, options);
-
+
public Task GetMessageAsync(ulong id, RequestOptions options = null)
=> ChannelHelper.GetMessageAsync(this, Discord, id, options);
public IAsyncEnumerable> GetMessagesAsync(int limit = DiscordConfig.MaxMessagesPerBatch, RequestOptions options = null)
@@ -60,10 +61,10 @@ namespace Discord.Rest
public Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null)
=> ChannelHelper.SendMessageAsync(this, Discord, text, isTTS, embed, options);
-#if FILESYSTEM
+
public Task SendFileAsync(string filePath, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null)
=> ChannelHelper.SendFileAsync(this, Discord, filePath, text, isTTS, embed, options);
-#endif
+
public Task SendFileAsync(Stream stream, string filename, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null)
=> ChannelHelper.SendFileAsync(this, Discord, stream, filename, text, isTTS, embed, options);
@@ -88,16 +89,19 @@ namespace Discord.Rest
=> ChannelHelper.GetWebhookAsync(this, Discord, id, options);
public Task> GetWebhooksAsync(RequestOptions options = null)
=> ChannelHelper.GetWebhooksAsync(this, Discord, options);
+
+ public Task GetCategoryAsync(RequestOptions options = null)
+ => ChannelHelper.GetCategoryAsync(this, Discord, options);
private string DebuggerDisplay => $"{Name} ({Id}, Text)";
//ITextChannel
async Task ITextChannel.CreateWebhookAsync(string name, Stream avatar, RequestOptions options)
- => await CreateWebhookAsync(name, avatar, options);
+ => await CreateWebhookAsync(name, avatar, options).ConfigureAwait(false);
async Task ITextChannel.GetWebhookAsync(ulong id, RequestOptions options)
- => await GetWebhookAsync(id, options);
+ => await GetWebhookAsync(id, options).ConfigureAwait(false);
async Task> ITextChannel.GetWebhooksAsync(RequestOptions options)
- => await GetWebhooksAsync(options);
+ => await GetWebhooksAsync(options).ConfigureAwait(false);
//IMessageChannel
async Task IMessageChannel.GetMessageAsync(ulong id, CacheMode mode, RequestOptions options)
@@ -114,6 +118,7 @@ namespace Discord.Rest
else
return AsyncEnumerable.Empty>();
}
+
IAsyncEnumerable> IMessageChannel.GetMessagesAsync(ulong fromMessageId, Direction dir, int limit, CacheMode mode, RequestOptions options)
{
if (mode == CacheMode.AllowDownload)
@@ -131,10 +136,9 @@ namespace Discord.Rest
async Task> IMessageChannel.GetPinnedMessagesAsync(RequestOptions options)
=> await GetPinnedMessagesAsync(options).ConfigureAwait(false);
-#if FILESYSTEM
async Task IMessageChannel.SendFileAsync(string filePath, string text, bool isTTS, Embed embed, RequestOptions options)
=> await SendFileAsync(filePath, text, isTTS, embed, options).ConfigureAwait(false);
-#endif
+
async Task IMessageChannel.SendFileAsync(Stream stream, string filename, string text, bool isTTS, Embed embed, RequestOptions options)
=> await SendFileAsync(stream, filename, text, isTTS, embed, options).ConfigureAwait(false);
async Task IMessageChannel.SendMessageAsync(string text, bool isTTS, Embed embed, RequestOptions options)
@@ -173,5 +177,13 @@ namespace Discord.Rest
else
return AsyncEnumerable.Empty>();
}
+
+ // INestedChannel
+ async Task INestedChannel.GetCategoryAsync(CacheMode mode, RequestOptions options)
+ {
+ if (CategoryId.HasValue && mode == CacheMode.AllowDownload)
+ return (await Guild.GetChannelAsync(CategoryId.Value, mode, options).ConfigureAwait(false)) as ICategoryChannel;
+ return null;
+ }
}
}
diff --git a/src/Discord.Net.Rest/Entities/Channels/RestVoiceChannel.cs b/src/Discord.Net.Rest/Entities/Channels/RestVoiceChannel.cs
index 300ebd08d..a2bead45f 100644
--- a/src/Discord.Net.Rest/Entities/Channels/RestVoiceChannel.cs
+++ b/src/Discord.Net.Rest/Entities/Channels/RestVoiceChannel.cs
@@ -1,4 +1,4 @@
-using Discord.Audio;
+using Discord.Audio;
using System;
using System.Collections.Generic;
using System.Diagnostics;
@@ -13,6 +13,7 @@ namespace Discord.Rest
{
public int Bitrate { get; private set; }
public int? UserLimit { get; private set; }
+ public ulong? CategoryId { get; private set; }
internal RestVoiceChannel(BaseDiscordClient discord, IGuild guild, ulong id)
: base(discord, guild, id)
@@ -27,7 +28,7 @@ namespace Discord.Rest
internal override void Update(Model model)
{
base.Update(model);
-
+ CategoryId = model.CategoryId;
Bitrate = model.Bitrate.Value;
UserLimit = model.UserLimit.Value != 0 ? model.UserLimit.Value : (int?)null;
}
@@ -38,6 +39,9 @@ namespace Discord.Rest
Update(model);
}
+ public Task GetCategoryAsync(RequestOptions options = null)
+ => ChannelHelper.GetCategoryAsync(this, Discord, options);
+
private string DebuggerDisplay => $"{Name} ({Id}, Voice)";
//IAudioChannel
@@ -48,5 +52,13 @@ namespace Discord.Rest
=> Task.FromResult(null);
IAsyncEnumerable> IGuildChannel.GetUsersAsync(CacheMode mode, RequestOptions options)
=> AsyncEnumerable.Empty>();
+
+ // INestedChannel
+ async Task INestedChannel.GetCategoryAsync(CacheMode mode, RequestOptions options)
+ {
+ if (CategoryId.HasValue && mode == CacheMode.AllowDownload)
+ return (await Guild.GetChannelAsync(CategoryId.Value, mode, options).ConfigureAwait(false)) as ICategoryChannel;
+ return null;
+ }
}
}
diff --git a/src/Discord.Net.Rest/Entities/Channels/RpcVirtualMessageChannel.cs b/src/Discord.Net.Rest/Entities/Channels/RpcVirtualMessageChannel.cs
index 8f69388d4..e8b939e65 100644
--- a/src/Discord.Net.Rest/Entities/Channels/RpcVirtualMessageChannel.cs
+++ b/src/Discord.Net.Rest/Entities/Channels/RpcVirtualMessageChannel.cs
@@ -35,11 +35,10 @@ namespace Discord.Rest
public Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null)
=> ChannelHelper.SendMessageAsync(this, Discord, text, isTTS, embed, options);
-#if FILESYSTEM
public Task SendFileAsync(string filePath, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null)
=> ChannelHelper.SendFileAsync(this, Discord, filePath, text, isTTS, embed, options);
-#endif
public Task SendFileAsync(Stream stream, string filename, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null)
+
=> ChannelHelper.SendFileAsync(this, Discord, stream, filename, text, isTTS, embed, options);
public Task DeleteMessageAsync(ulong messageId, RequestOptions options = null)
@@ -86,10 +85,9 @@ namespace Discord.Rest
async Task> IMessageChannel.GetPinnedMessagesAsync(RequestOptions options)
=> await GetPinnedMessagesAsync(options);
-#if FILESYSTEM
async Task IMessageChannel.SendFileAsync(string filePath, string text, bool isTTS, Embed embed, RequestOptions options)
=> await SendFileAsync(filePath, text, isTTS, embed, options);
-#endif
+
async Task IMessageChannel.SendFileAsync(Stream stream, string filename, string text, bool isTTS, Embed embed, RequestOptions options)
=> await SendFileAsync(stream, filename, text, isTTS, embed, options);
async Task IMessageChannel.SendMessageAsync(string text, bool isTTS, Embed embed, RequestOptions options)
diff --git a/src/Discord.Net.Rest/Net/Converters/DiscordContractResolver.cs b/src/Discord.Net.Rest/Net/Converters/DiscordContractResolver.cs
index 9213c5d75..8a3c1037b 100644
--- a/src/Discord.Net.Rest/Net/Converters/DiscordContractResolver.cs
+++ b/src/Discord.Net.Rest/Net/Converters/DiscordContractResolver.cs
@@ -1,4 +1,4 @@
-using Discord.API;
+using Discord.API;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using System;
@@ -25,7 +25,6 @@ namespace Discord.Net.Converters
if (converter != null)
{
property.Converter = converter;
- property.MemberConverter = converter;
}
}
else
diff --git a/src/Discord.Net.Rest/Net/Queue/RequestQueueBucket.cs b/src/Discord.Net.Rest/Net/Queue/RequestQueueBucket.cs
index 3346681b5..c4f5996c5 100644
--- a/src/Discord.Net.Rest/Net/Queue/RequestQueueBucket.cs
+++ b/src/Discord.Net.Rest/Net/Queue/RequestQueueBucket.cs
@@ -230,7 +230,7 @@ namespace Discord.Net.Queue
#endif
}
- var now = DateTimeUtils.ToUnixSeconds(DateTimeOffset.UtcNow);
+ var now = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
DateTimeOffset? resetTick = null;
//Using X-RateLimit-Remaining causes a race condition
diff --git a/src/Discord.Net.Rest/Net/RateLimitInfo.cs b/src/Discord.Net.Rest/Net/RateLimitInfo.cs
index 9421221ed..a517f290c 100644
--- a/src/Discord.Net.Rest/Net/RateLimitInfo.cs
+++ b/src/Discord.Net.Rest/Net/RateLimitInfo.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
using System.Collections.Generic;
namespace Discord.Net
@@ -21,7 +21,7 @@ namespace Discord.Net
Remaining = headers.TryGetValue("X-RateLimit-Remaining", out temp) &&
int.TryParse(temp, out var remaining) ? remaining : (int?)null;
Reset = headers.TryGetValue("X-RateLimit-Reset", out temp) &&
- int.TryParse(temp, out var reset) ? DateTimeUtils.FromUnixSeconds(reset) : (DateTimeOffset?)null;
+ int.TryParse(temp, out var reset) ? DateTimeOffset.FromUnixTimeSeconds(reset) : (DateTimeOffset?)null;
RetryAfter = headers.TryGetValue("Retry-After", out temp) &&
int.TryParse(temp, out var retryAfter) ? retryAfter : (int?)null;
Lag = headers.TryGetValue("Date", out temp) &&
diff --git a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj
index 251cdb18b..ddd3b7954 100644
--- a/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj
+++ b/src/Discord.Net.WebSocket/Discord.Net.WebSocket.csproj
@@ -1,11 +1,11 @@
-
+
Discord.Net.WebSocket
Discord.WebSocket
A core Discord.Net library containing the WebSocket client and models.
- net45;netstandard1.1;netstandard1.3
- netstandard1.1;netstandard1.3
+ net46;netstandard1.3;netstandard2.0
+ netstandard1.3;netstandard2.0
true
@@ -13,6 +13,6 @@
-
+
diff --git a/src/Discord.Net.WebSocket/DiscordSocketClient.cs b/src/Discord.Net.WebSocket/DiscordSocketClient.cs
index 72b0b022b..01322a3cc 100644
--- a/src/Discord.Net.WebSocket/DiscordSocketClient.cs
+++ b/src/Discord.Net.WebSocket/DiscordSocketClient.cs
@@ -365,7 +365,7 @@ namespace Discord.WebSocket
await ApiClient.SendStatusUpdateAsync(
status,
status == UserStatus.AFK,
- statusSince != null ? DateTimeUtils.ToUnixMilliseconds(_statusSince.Value) : (long?)null,
+ statusSince != null ? _statusSince.Value.ToUnixTimeMilliseconds() : (long?)null,
gameModel).ConfigureAwait(false);
}
diff --git a/src/Discord.Net.WebSocket/DiscordVoiceApiClient.cs b/src/Discord.Net.WebSocket/DiscordVoiceApiClient.cs
index 25dc2cf7b..0eb92caed 100644
--- a/src/Discord.Net.WebSocket/DiscordVoiceApiClient.cs
+++ b/src/Discord.Net.WebSocket/DiscordVoiceApiClient.cs
@@ -1,4 +1,4 @@
-#pragma warning disable CS1591
+#pragma warning disable CS1591
using Discord.API;
using Discord.API.Voice;
using Discord.Net.Converters;
@@ -129,7 +129,7 @@ namespace Discord.Audio
//WebSocket
public async Task SendHeartbeatAsync(RequestOptions options = null)
{
- await SendAsync(VoiceOpCode.Heartbeat, DateTimeUtils.ToUnixMilliseconds(DateTimeOffset.UtcNow), options: options).ConfigureAwait(false);
+ await SendAsync(VoiceOpCode.Heartbeat, DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(), options: options).ConfigureAwait(false);
}
public async Task SendIdentityAsync(ulong userId, string sessionId, string token)
{
diff --git a/src/Discord.Net.WebSocket/Entities/Channels/ISocketMessageChannel.cs b/src/Discord.Net.WebSocket/Entities/Channels/ISocketMessageChannel.cs
index 971dbe8f1..5fef7e4cd 100644
--- a/src/Discord.Net.WebSocket/Entities/Channels/ISocketMessageChannel.cs
+++ b/src/Discord.Net.WebSocket/Entities/Channels/ISocketMessageChannel.cs
@@ -12,10 +12,9 @@ namespace Discord.WebSocket
/// Sends a message to this message channel.
new Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null);
-#if FILESYSTEM
/// Sends a file to this text channel, with an optional caption.
new Task SendFileAsync(string filePath, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null);
-#endif
+
/// Sends a file to this text channel, with an optional caption.
new Task SendFileAsync(Stream stream, string filename, string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null);
diff --git a/src/Discord.Net.WebSocket/Entities/Channels/SocketCategoryChannel.cs b/src/Discord.Net.WebSocket/Entities/Channels/SocketCategoryChannel.cs
index e7a165c2f..74ca02dba 100644
--- a/src/Discord.Net.WebSocket/Entities/Channels/SocketCategoryChannel.cs
+++ b/src/Discord.Net.WebSocket/Entities/Channels/SocketCategoryChannel.cs
@@ -20,7 +20,7 @@ namespace Discord.WebSocket
ChannelPermission.ViewChannel)).ToImmutableArray();
public IReadOnlyCollection Channels
- => Guild.Channels.Where(x => x.CategoryId == Id).ToImmutableArray();
+ => Guild.Channels.Where(x => x is INestedChannel nestedChannel && nestedChannel.CategoryId == Id).ToImmutableArray();
internal SocketCategoryChannel(DiscordSocketClient discord, ulong id, SocketGuild guild)
: base(discord, id, guild)
diff --git a/src/Discord.Net.WebSocket/Entities/Channels/SocketDMChannel.cs b/src/Discord.Net.WebSocket/Entities/Channels/SocketDMChannel.cs
index d95d45890..11b7ce25a 100644
--- a/src/Discord.Net.WebSocket/Entities/Channels/SocketDMChannel.cs
+++ b/src/Discord.Net.WebSocket/Entities/Channels/SocketDMChannel.cs
@@ -69,10 +69,10 @@ namespace Discord.WebSocket
public Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null)
=> ChannelHelper.SendMessageAsync(this, Discord, text, isTTS, embed, options);
-#if FILESYSTEM
+
public Task SendFileAsync(string filePath, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null)
=> ChannelHelper.SendFileAsync(this, Discord, filePath, text, isTTS, embed, options);
-#endif
+
public Task SendFileAsync(Stream stream, string filename, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null)
=> ChannelHelper.SendFileAsync(this, Discord, stream, filename, text, isTTS, embed, options);
@@ -135,10 +135,8 @@ namespace Discord.WebSocket
=> SocketChannelHelper.GetMessagesAsync(this, Discord, _messages, fromMessage.Id, dir, limit, mode, options);
async Task> IMessageChannel.GetPinnedMessagesAsync(RequestOptions options)
=> await GetPinnedMessagesAsync(options).ConfigureAwait(false);
-#if FILESYSTEM
async Task IMessageChannel.SendFileAsync(string filePath, string text, bool isTTS, Embed embed, RequestOptions options)
=> await SendFileAsync(filePath, text, isTTS, embed, options).ConfigureAwait(false);
-#endif
async Task IMessageChannel.SendFileAsync(Stream stream, string filename, string text, bool isTTS, Embed embed, RequestOptions options)
=> await SendFileAsync(stream, filename, text, isTTS, embed, options).ConfigureAwait(false);
async Task IMessageChannel.SendMessageAsync(string text, bool isTTS, Embed embed, RequestOptions options)
diff --git a/src/Discord.Net.WebSocket/Entities/Channels/SocketGroupChannel.cs b/src/Discord.Net.WebSocket/Entities/Channels/SocketGroupChannel.cs
index 3d6f60db2..81b5cfbf3 100644
--- a/src/Discord.Net.WebSocket/Entities/Channels/SocketGroupChannel.cs
+++ b/src/Discord.Net.WebSocket/Entities/Channels/SocketGroupChannel.cs
@@ -97,10 +97,10 @@ namespace Discord.WebSocket
public Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null)
=> ChannelHelper.SendMessageAsync(this, Discord, text, isTTS, embed, options);
-#if FILESYSTEM
+
public Task SendFileAsync(string filePath, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null)
=> ChannelHelper.SendFileAsync(this, Discord, filePath, text, isTTS, embed, options);
-#endif
+
public Task SendFileAsync(Stream stream, string filename, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null)
=> ChannelHelper.SendFileAsync(this, Discord, stream, filename, text, isTTS, embed, options);
@@ -199,10 +199,10 @@ namespace Discord.WebSocket
=> SocketChannelHelper.GetMessagesAsync(this, Discord, _messages, fromMessage.Id, dir, limit, mode, options);
async Task> IMessageChannel.GetPinnedMessagesAsync(RequestOptions options)
=> await GetPinnedMessagesAsync(options).ConfigureAwait(false);
-#if FILESYSTEM
+
async Task IMessageChannel.SendFileAsync(string filePath, string text, bool isTTS, Embed embed, RequestOptions options)
=> await SendFileAsync(filePath, text, isTTS, embed, options).ConfigureAwait(false);
-#endif
+
async Task IMessageChannel.SendFileAsync(Stream stream, string filename, string text, bool isTTS, Embed embed, RequestOptions options)
=> await SendFileAsync(stream, filename, text, isTTS, embed, options).ConfigureAwait(false);
async Task IMessageChannel.SendMessageAsync(string text, bool isTTS, Embed embed, RequestOptions options)
diff --git a/src/Discord.Net.WebSocket/Entities/Channels/SocketGuildChannel.cs b/src/Discord.Net.WebSocket/Entities/Channels/SocketGuildChannel.cs
index 2163daf55..bfcffa35f 100644
--- a/src/Discord.Net.WebSocket/Entities/Channels/SocketGuildChannel.cs
+++ b/src/Discord.Net.WebSocket/Entities/Channels/SocketGuildChannel.cs
@@ -1,4 +1,4 @@
-using Discord.Rest;
+using Discord.Rest;
using System;
using System.Collections.Generic;
using System.Collections.Immutable;
@@ -16,10 +16,7 @@ namespace Discord.WebSocket
public SocketGuild Guild { get; }
public string Name { get; private set; }
- public int Position { get; private set; }
- public ulong? CategoryId { get; private set; }
- public ICategoryChannel Category
- => CategoryId.HasValue ? Guild.GetChannel(CategoryId.Value) as ICategoryChannel : null;
+ public int Position { get; private set; }
public IReadOnlyCollection PermissionOverwrites => _overwrites;
public new virtual IReadOnlyCollection Users => ImmutableArray.Create();
@@ -48,8 +45,7 @@ namespace Discord.WebSocket
{
Name = model.Name.Value;
Position = model.Position.Value;
- CategoryId = model.CategoryId;
-
+
var overwrites = model.PermissionOverwrites.Value;
var newOverwrites = ImmutableArray.CreateBuilder(overwrites.Length);
for (int i = 0; i < overwrites.Length; i++)
@@ -135,9 +131,6 @@ namespace Discord.WebSocket
IGuild IGuildChannel.Guild => Guild;
ulong IGuildChannel.GuildId => Guild.Id;
- Task IGuildChannel.GetCategoryAsync()
- => Task.FromResult(Category);
-
async Task> IGuildChannel.GetInvitesAsync(RequestOptions options)
=> await GetInvitesAsync(options).ConfigureAwait(false);
async Task IGuildChannel.CreateInviteAsync(int? maxAge, int? maxUses, bool isTemporary, bool isUnique, RequestOptions options)
diff --git a/src/Discord.Net.WebSocket/Entities/Channels/SocketTextChannel.cs b/src/Discord.Net.WebSocket/Entities/Channels/SocketTextChannel.cs
index 9373c431a..1d8041585 100644
--- a/src/Discord.Net.WebSocket/Entities/Channels/SocketTextChannel.cs
+++ b/src/Discord.Net.WebSocket/Entities/Channels/SocketTextChannel.cs
@@ -16,6 +16,9 @@ namespace Discord.WebSocket
private readonly MessageCache _messages;
public string Topic { get; private set; }
+ public ulong? CategoryId { get; private set; }
+ public ICategoryChannel Category
+ => CategoryId.HasValue ? Guild.GetChannel(CategoryId.Value) as ICategoryChannel : null;
private bool _nsfw;
public bool IsNsfw => _nsfw || ChannelHelper.IsNsfw(this);
@@ -42,7 +45,7 @@ namespace Discord.WebSocket
internal override void Update(ClientState state, Model model)
{
base.Update(state, model);
-
+ CategoryId = model.CategoryId;
Topic = model.Topic.Value;
_nsfw = model.Nsfw.GetValueOrDefault();
}
@@ -77,10 +80,10 @@ namespace Discord.WebSocket
public Task SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null, RequestOptions options = null)
=> ChannelHelper.SendMessageAsync(this, Discord, text, isTTS, embed, options);
-#if FILESYSTEM
+
public Task SendFileAsync(string filePath, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null)
=> ChannelHelper.SendFileAsync(this, Discord, filePath, text, isTTS, embed, options);
-#endif
+
public Task SendFileAsync(Stream stream, string filename, string text, bool isTTS = false, Embed embed = null, RequestOptions options = null)
=> ChannelHelper.SendFileAsync(this, Discord, stream, filename, text, isTTS, embed, options);
@@ -159,15 +162,19 @@ namespace Discord.WebSocket
=> SocketChannelHelper.GetMessagesAsync(this, Discord, _messages, fromMessage.Id, dir, limit, mode, options);
async Task> IMessageChannel.GetPinnedMessagesAsync(RequestOptions options)
=> await GetPinnedMessagesAsync(options).ConfigureAwait(false);
-#if FILESYSTEM
+
async Task IMessageChannel.SendFileAsync(string filePath, string text, bool isTTS, Embed embed, RequestOptions options)
=> await SendFileAsync(filePath, text, isTTS, embed, options).ConfigureAwait(false);
-#endif
+
async Task IMessageChannel.SendFileAsync(Stream stream, string filename, string text, bool isTTS, Embed embed, RequestOptions options)
=> await SendFileAsync(stream, filename, text, isTTS, embed, options).ConfigureAwait(false);
async Task IMessageChannel.SendMessageAsync(string text, bool isTTS, Embed embed, RequestOptions options)
=> await SendMessageAsync(text, isTTS, embed, options).ConfigureAwait(false);
IDisposable IMessageChannel.EnterTypingState(RequestOptions options)
=> EnterTypingState(options);
+
+ // INestedChannel
+ Task INestedChannel.GetCategoryAsync(CacheMode mode, RequestOptions options)
+ => Task.FromResult(Category);
}
}
diff --git a/src/Discord.Net.WebSocket/Entities/Channels/SocketVoiceChannel.cs b/src/Discord.Net.WebSocket/Entities/Channels/SocketVoiceChannel.cs
index e8a669845..349621fac 100644
--- a/src/Discord.Net.WebSocket/Entities/Channels/SocketVoiceChannel.cs
+++ b/src/Discord.Net.WebSocket/Entities/Channels/SocketVoiceChannel.cs
@@ -1,4 +1,4 @@
-using Discord.Audio;
+using Discord.Audio;
using Discord.Rest;
using System;
using System.Collections.Generic;
@@ -15,6 +15,9 @@ namespace Discord.WebSocket
{
public int Bitrate { get; private set; }
public int? UserLimit { get; private set; }
+ public ulong? CategoryId { get; private set; }
+ public ICategoryChannel Category
+ => CategoryId.HasValue ? Guild.GetChannel(CategoryId.Value) as ICategoryChannel : null;
public override IReadOnlyCollection Users
=> Guild.Users.Where(x => x.VoiceChannel?.Id == Id).ToImmutableArray();
@@ -32,7 +35,7 @@ namespace Discord.WebSocket
internal override void Update(ClientState state, Model model)
{
base.Update(state, model);
-
+ CategoryId = model.CategoryId;
Bitrate = model.Bitrate.Value;
UserLimit = model.UserLimit.Value != 0 ? model.UserLimit.Value : (int?)null;
}
@@ -52,7 +55,7 @@ namespace Discord.WebSocket
return user;
return null;
}
-
+
private string DebuggerDisplay => $"{Name} ({Id}, Voice)";
internal new SocketVoiceChannel Clone() => MemberwiseClone() as SocketVoiceChannel;
@@ -61,5 +64,9 @@ namespace Discord.WebSocket
=> Task.FromResult(GetUser(id));
IAsyncEnumerable> IGuildChannel.GetUsersAsync(CacheMode mode, RequestOptions options)
=> ImmutableArray.Create>(Users).ToAsyncEnumerable();
+
+ // INestedChannel
+ Task INestedChannel.GetCategoryAsync(CacheMode mode, RequestOptions options)
+ => Task.FromResult(Category);
}
}
diff --git a/src/Discord.Net.WebSocket/Net/DefaultUdpSocket.cs b/src/Discord.Net.WebSocket/Net/DefaultUdpSocket.cs
index 6a6194397..251a761d4 100644
--- a/src/Discord.Net.WebSocket/Net/DefaultUdpSocket.cs
+++ b/src/Discord.Net.WebSocket/Net/DefaultUdpSocket.cs
@@ -1,4 +1,3 @@
-#if DEFAULTUDPCLIENT
using System;
using System.Net;
using System.Net.Sockets;
@@ -85,11 +84,7 @@ namespace Discord.Net.Udp
if (_udp != null)
{
-#if UDPDISPOSE
try { _udp.Dispose(); }
-#else
- try { _udp.Close(); }
-#endif
catch { }
_udp = null;
}
@@ -132,4 +127,3 @@ namespace Discord.Net.Udp
}
}
}
-#endif
\ No newline at end of file
diff --git a/src/Discord.Net.WebSocket/Net/DefaultUdpSocketProvider.cs b/src/Discord.Net.WebSocket/Net/DefaultUdpSocketProvider.cs
index 82b6ec4c0..d701fa79a 100644
--- a/src/Discord.Net.WebSocket/Net/DefaultUdpSocketProvider.cs
+++ b/src/Discord.Net.WebSocket/Net/DefaultUdpSocketProvider.cs
@@ -4,7 +4,6 @@ namespace Discord.Net.Udp
{
public static class DefaultUdpSocketProvider
{
-#if DEFAULTUDPCLIENT
public static readonly UdpSocketProvider Instance = () =>
{
try
@@ -16,12 +15,5 @@ namespace Discord.Net.Udp
throw new PlatformNotSupportedException("The default UdpSocketProvider is not supported on this platform.", ex);
}
};
-#else
- public static readonly UdpSocketProvider Instance = () =>
- {
- throw new PlatformNotSupportedException("The default UdpSocketProvider is not supported on this platform.\n" +
- "You must specify a UdpSocketProvider or target a runtime supporting .NET Standard 1.3, such as .NET Framework 4.6+.");
- };
-#endif
}
-}
\ No newline at end of file
+}
diff --git a/src/Discord.Net.WebSocket/Net/DefaultWebSocketClient.cs b/src/Discord.Net.WebSocket/Net/DefaultWebSocketClient.cs
index a250acec9..c60368da0 100644
--- a/src/Discord.Net.WebSocket/Net/DefaultWebSocketClient.cs
+++ b/src/Discord.Net.WebSocket/Net/DefaultWebSocketClient.cs
@@ -1,4 +1,3 @@
-#if DEFAULTWEBSOCKET
using System;
using System.Collections.Generic;
using System.ComponentModel;
@@ -209,14 +208,9 @@ namespace Discord.Net.WebSockets
//Use the internal buffer if we can get it
resultCount = (int)stream.Length;
-#if MSTRYBUFFER
- if (stream.TryGetBuffer(out var streamBuffer))
- result = streamBuffer.Array;
- else
- result = stream.ToArray();
-#else
- result = stream.GetBuffer();
-#endif
+
+ result = stream.TryGetBuffer(out var streamBuffer) ? streamBuffer.Array : stream.ToArray();
+
}
}
else
@@ -248,4 +242,3 @@ namespace Discord.Net.WebSockets
}
}
}
-#endif
\ No newline at end of file
diff --git a/src/Discord.Net.WebSocket/Net/DefaultWebSocketClientProvider.cs b/src/Discord.Net.WebSocket/Net/DefaultWebSocketClientProvider.cs
index 68bd67c5b..2d66d5900 100644
--- a/src/Discord.Net.WebSocket/Net/DefaultWebSocketClientProvider.cs
+++ b/src/Discord.Net.WebSocket/Net/DefaultWebSocketClientProvider.cs
@@ -5,7 +5,6 @@ namespace Discord.Net.WebSockets
{
public static class DefaultWebSocketProvider
{
-#if DEFAULTWEBSOCKET
public static readonly WebSocketProvider Instance = Create();
public static WebSocketProvider Create(IWebProxy proxy = null)
@@ -22,12 +21,5 @@ namespace Discord.Net.WebSockets
}
};
}
-#else
- public static readonly WebSocketProvider Instance = () =>
- {
- throw new PlatformNotSupportedException("The default WebSocketProvider is not supported on this platform.\n" +
- "You must specify a WebSocketProvider or target a runtime supporting .NET Standard 1.3, such as .NET Framework 4.6+.");
- };
-#endif
}
-}
\ No newline at end of file
+}
diff --git a/src/Discord.Net.Webhook/Discord.Net.Webhook.csproj b/src/Discord.Net.Webhook/Discord.Net.Webhook.csproj
index 7c224e01e..ba7bbcff8 100644
--- a/src/Discord.Net.Webhook/Discord.Net.Webhook.csproj
+++ b/src/Discord.Net.Webhook/Discord.Net.Webhook.csproj
@@ -1,10 +1,10 @@
-
+
Discord.Net.Webhook
Discord.Webhook
A core Discord.Net library containing the Webhook client and models.
- netstandard1.1
+ netstandard1.3
diff --git a/src/Discord.Net.Webhook/DiscordWebhookClient.cs b/src/Discord.Net.Webhook/DiscordWebhookClient.cs
index 2dea1c1d1..67a5462be 100644
--- a/src/Discord.Net.Webhook/DiscordWebhookClient.cs
+++ b/src/Discord.Net.Webhook/DiscordWebhookClient.cs
@@ -67,12 +67,11 @@ namespace Discord.Webhook
string username = null, string avatarUrl = null, RequestOptions options = null)
=> WebhookClientHelper.SendMessageAsync(this, text, isTTS, embeds, username, avatarUrl, options);
-#if FILESYSTEM
/// Send a message to the channel for this webhook with an attachment. Returns the ID of the created message.
public Task SendFileAsync(string filePath, string text, bool isTTS = false,
IEnumerable
-
-
-
-
-
+
+
+
+
+
diff --git a/test/Discord.Net.Tests/Tests.ChannelPermissions.cs b/test/Discord.Net.Tests/Tests.ChannelPermissions.cs
index 2505cba07..51834e30d 100644
--- a/test/Discord.Net.Tests/Tests.ChannelPermissions.cs
+++ b/test/Discord.Net.Tests/Tests.ChannelPermissions.cs
@@ -105,7 +105,7 @@ namespace Discord
Assert.Equal(groupChannel, ChannelPermissions.Group.RawValue);
return Task.CompletedTask;
}
-
+ [Fact]
public Task TestChannelPermissionModify()
{
// test channel permission modify
diff --git a/test/Discord.Net.Tests/Tests.Channels.cs b/test/Discord.Net.Tests/Tests.Channels.cs
index b528ca5fb..2c189c03f 100644
--- a/test/Discord.Net.Tests/Tests.Channels.cs
+++ b/test/Discord.Net.Tests/Tests.Channels.cs
@@ -1,4 +1,5 @@
using Discord.Rest;
+using System;
using System.Linq;
using System.Threading.Tasks;
using Xunit;
@@ -15,17 +16,28 @@ namespace Discord
var text4 = await guild.CreateTextChannelAsync("text4");
var text5 = await guild.CreateTextChannelAsync("text5");
+ // create a channel category
+ var cat1 = await guild.CreateCategoryChannelAsync("cat1");
+
+ if (text1 == null)
+ {
+ // the guild did not have a default channel, so make a new one
+ text1 = await guild.CreateTextChannelAsync("default");
+ }
+
//Modify #general
await text1.ModifyAsync(x =>
{
x.Name = "text1";
x.Position = 1;
x.Topic = "Topic1";
+ x.CategoryId = cat1.Id;
});
await text2.ModifyAsync(x =>
{
x.Position = 2;
+ x.CategoryId = cat1.Id;
});
await text3.ModifyAsync(x =>
{
@@ -49,35 +61,35 @@ namespace Discord
}
private static void CheckTextChannels(RestGuild guild, params RestTextChannel[] textChannels)
{
- Assert.Equal(textChannels.Length, 5);
+ Assert.Equal(5, textChannels.Length);
Assert.All(textChannels, x =>
{
Assert.NotNull(x);
- Assert.NotEqual(x.Id, 0UL);
+ Assert.NotEqual(0UL, x.Id);
Assert.True(x.Position >= 0);
});
- var text1 = textChannels.Where(x => x.Name == "text1").FirstOrDefault();
- var text2 = textChannels.Where(x => x.Name == "text2").FirstOrDefault();
- var text3 = textChannels.Where(x => x.Name == "text3").FirstOrDefault();
- var text4 = textChannels.Where(x => x.Name == "text4").FirstOrDefault();
- var text5 = textChannels.Where(x => x.Name == "text5").FirstOrDefault();
+ var text1 = textChannels.FirstOrDefault(x => x.Name == "text1");
+ var text2 = textChannels.FirstOrDefault(x => x.Name == "text2");
+ var text3 = textChannels.FirstOrDefault(x => x.Name == "text3");
+ var text4 = textChannels.FirstOrDefault(x => x.Name == "text4");
+ var text5 = textChannels.FirstOrDefault(x => x.Name == "text5");
Assert.NotNull(text1);
//Assert.True(text1.Id == guild.DefaultChannelId);
- Assert.Equal(text1.Position, 1);
- Assert.Equal(text1.Topic, "Topic1");
+ Assert.Equal(1, text1.Position);
+ Assert.Equal("Topic1", text1.Topic);
Assert.NotNull(text2);
- Assert.Equal(text2.Position, 2);
+ Assert.Equal(2, text2.Position);
Assert.Null(text2.Topic);
Assert.NotNull(text3);
- Assert.Equal(text3.Topic, "Topic2");
+ Assert.Equal("Topic2", text3.Topic);
Assert.NotNull(text4);
- Assert.Equal(text4.Position, 3);
- Assert.Equal(text4.Topic, "Topic2");
+ Assert.Equal(3, text4.Position);
+ Assert.Equal("Topic2", text4.Topic);
Assert.NotNull(text5);
Assert.Null(text5.Topic);
@@ -89,10 +101,13 @@ namespace Discord
var voice2 = await guild.CreateVoiceChannelAsync("voice2");
var voice3 = await guild.CreateVoiceChannelAsync("voice3");
+ var cat2 = await guild.CreateCategoryChannelAsync("cat2");
+
await voice1.ModifyAsync(x =>
{
x.Bitrate = 96000;
x.Position = 1;
+ x.CategoryId = cat2.Id;
});
await voice2.ModifyAsync(x =>
{
@@ -103,6 +118,7 @@ namespace Discord
x.Bitrate = 8000;
x.Position = 1;
x.UserLimit = 16;
+ x.CategoryId = cat2.Id;
});
CheckVoiceChannels(voice1, voice2, voice3);
@@ -114,31 +130,89 @@ namespace Discord
}
private static void CheckVoiceChannels(params RestVoiceChannel[] voiceChannels)
{
- Assert.Equal(voiceChannels.Length, 3);
+ Assert.Equal(3, voiceChannels.Length);
Assert.All(voiceChannels, x =>
{
Assert.NotNull(x);
- Assert.NotEqual(x.Id, 0UL);
- Assert.NotEqual(x.UserLimit, 0);
+ Assert.NotEqual(0UL, x.Id);
+ Assert.NotEqual(0, x.UserLimit);
Assert.True(x.Bitrate > 0);
Assert.True(x.Position >= 0);
});
- var voice1 = voiceChannels.Where(x => x.Name == "voice1").FirstOrDefault();
- var voice2 = voiceChannels.Where(x => x.Name == "voice2").FirstOrDefault();
- var voice3 = voiceChannels.Where(x => x.Name == "voice3").FirstOrDefault();
+ var voice1 = voiceChannels.FirstOrDefault(x => x.Name == "voice1");
+ var voice2 = voiceChannels.FirstOrDefault(x => x.Name == "voice2");
+ var voice3 = voiceChannels.FirstOrDefault(x => x.Name == "voice3");
Assert.NotNull(voice1);
- Assert.Equal(voice1.Bitrate, 96000);
- Assert.Equal(voice1.Position, 1);
+ Assert.Equal(96000, voice1.Bitrate);
+ Assert.Equal(1, voice1.Position);
Assert.NotNull(voice2);
- Assert.Equal(voice2.UserLimit, null);
+ Assert.Null(voice2.UserLimit);
+
+ Assert.NotNull(voice3);
+ Assert.Equal(8000, voice3.Bitrate);
+ Assert.Equal(1, voice3.Position);
+ Assert.Equal(16, voice3.UserLimit);
+ }
+
+ [Fact]
+ public async Task TestChannelCategories()
+ {
+ // (await _guild.GetVoiceChannelsAsync()).ToArray()
+ var channels = await _guild.GetCategoryChannelsAsync();
+
+ await CheckChannelCategories(channels.ToArray(), (await _guild.GetChannelsAsync()).ToArray());
+ }
+
+ private async Task CheckChannelCategories(RestCategoryChannel[] categories, RestGuildChannel[] allChannels)
+ {
+ // 2 categories
+ Assert.Equal(categories.Length, 2);
+
+ var cat1 = categories.Where(x => x.Name == "cat1").FirstOrDefault();
+ var cat2 = categories.Where(x => x.Name == "cat2").FirstOrDefault();
+
+ Assert.NotNull(cat1);
+ Assert.NotNull(cat2);
+
+ // get text1, text2, ensure they have category id == cat1
+ var text1 = allChannels.Where(x => x.Name == "text1").FirstOrDefault() as RestTextChannel;
+ var text2 = allChannels.Where(x => x.Name == "text2").FirstOrDefault() as RestTextChannel;
+
+ Assert.NotNull(text1);
+ Assert.NotNull(text2);
+ // check that CategoryID and .GetCategoryAsync work correctly
+ // for both of the text channels
+ Assert.Equal(text1.CategoryId, cat1.Id);
+ var text1Cat = await text1.GetCategoryAsync();
+ Assert.Equal(text1Cat.Id, cat1.Id);
+ Assert.Equal(text1Cat.Name, cat1.Name);
+
+ Assert.Equal(text2.CategoryId, cat1.Id);
+ var text2Cat = await text2.GetCategoryAsync();
+ Assert.Equal(text2Cat.Id, cat1.Id);
+ Assert.Equal(text2Cat.Name, cat1.Name);
+
+ // do the same for the voice channels
+ var voice1 = allChannels.Where(x => x.Name == "voice1").FirstOrDefault() as RestVoiceChannel;
+ var voice3 = allChannels.Where(x => x.Name == "voice3").FirstOrDefault() as RestVoiceChannel;
+
+ Assert.NotNull(voice1);
Assert.NotNull(voice3);
- Assert.Equal(voice3.Bitrate, 8000);
- Assert.Equal(voice3.Position, 1);
- Assert.Equal(voice3.UserLimit, 16);
+
+ Assert.Equal(voice1.CategoryId, cat2.Id);
+ var voice1Cat = await voice1.GetCategoryAsync();
+ Assert.Equal(voice1Cat.Id, cat2.Id);
+ Assert.Equal(voice1Cat.Name, cat2.Name);
+
+ Assert.Equal(voice3.CategoryId, cat2.Id);
+ var voice3Cat = await voice3.GetCategoryAsync();
+ Assert.Equal(voice3Cat.Id, cat2.Id);
+ Assert.Equal(voice3Cat.Name, cat2.Name);
+
}
}
-}
\ No newline at end of file
+}
diff --git a/test/Discord.Net.Tests/Tests.Colors.cs b/test/Discord.Net.Tests/Tests.Colors.cs
index 591778972..10b0bbdac 100644
--- a/test/Discord.Net.Tests/Tests.Colors.cs
+++ b/test/Discord.Net.Tests/Tests.Colors.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
using Xunit;
namespace Discord
@@ -12,6 +12,7 @@ namespace Discord
Assert.Equal(uint.MinValue, new Color(uint.MinValue).RawValue);
Assert.Equal(uint.MaxValue, new Color(uint.MaxValue).RawValue);
}
+ [Fact]
public void Color_Default()
{
Assert.Equal(0u, Color.Default.RawValue);
diff --git a/test/Discord.Net.Tests/Tests.Emotes.cs b/test/Discord.Net.Tests/Tests.Emotes.cs
index 334975ce4..eeadbddf8 100644
--- a/test/Discord.Net.Tests/Tests.Emotes.cs
+++ b/test/Discord.Net.Tests/Tests.Emotes.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
using Xunit;
namespace Discord
@@ -34,6 +34,7 @@ namespace Discord
Assert.Equal(DateTimeOffset.FromUnixTimeMilliseconds(1514056829775), emote.CreatedAt);
Assert.EndsWith("gif", emote.Url);
}
+ [Fact]
public void Test_Invalid_Amimated_Emote_Parse()
{
Assert.False(Emote.TryParse("", out _));
diff --git a/test/Discord.Net.Tests/Tests.GuildPermissions.cs b/test/Discord.Net.Tests/Tests.GuildPermissions.cs
index 6f62642ce..defaf4d02 100644
--- a/test/Discord.Net.Tests/Tests.GuildPermissions.cs
+++ b/test/Discord.Net.Tests/Tests.GuildPermissions.cs
@@ -150,12 +150,12 @@ namespace Discord
// individual permission test
- perm = perm.Modify(readMessages: true);
- Assert.True(perm.ReadMessages);
- Assert.Equal(perm.RawValue, (ulong)GuildPermission.ReadMessages);
+ perm = perm.Modify(viewChannel: true);
+ Assert.True(perm.ViewChannel);
+ Assert.Equal(perm.RawValue, (ulong)GuildPermission.ViewChannel);
- perm = perm.Modify(readMessages: false);
- Assert.False(perm.ReadMessages);
+ perm = perm.Modify(viewChannel: false);
+ Assert.False(perm.ViewChannel);
Assert.Equal(GuildPermissions.None.RawValue, perm.RawValue);
diff --git a/test/Discord.Net.Tests/Tests.Permissions.cs b/test/Discord.Net.Tests/Tests.Permissions.cs
index be8e9e054..5a7b5a16b 100644
--- a/test/Discord.Net.Tests/Tests.Permissions.cs
+++ b/test/Discord.Net.Tests/Tests.Permissions.cs
@@ -25,15 +25,15 @@ namespace Discord
// check that toggling the bit works
Permissions.UnsetFlag(ref rawValue, flagValue);
- Assert.Equal(false, Permissions.GetValue(rawValue, flagValue));
+ Assert.False(Permissions.GetValue(rawValue, flagValue));
Permissions.SetFlag(ref rawValue, flagValue);
- Assert.Equal(true, Permissions.GetValue(rawValue, flagValue));
+ Assert.True(Permissions.GetValue(rawValue, flagValue));
// do the same, but with the SetValue method
Permissions.SetValue(ref rawValue, true, flagValue);
- Assert.Equal(true, Permissions.GetValue(rawValue, flagValue));
+ Assert.True(Permissions.GetValue(rawValue, flagValue));
Permissions.SetValue(ref rawValue, false, flagValue);
- Assert.Equal(false, Permissions.GetValue(rawValue, flagValue));
+ Assert.False(Permissions.GetValue(rawValue, flagValue));
}
///
@@ -280,7 +280,7 @@ namespace Discord
TestHelper(value, GuildPermission.ManageGuild, false);
TestHelper(value, GuildPermission.AddReactions, false);
TestHelper(value, GuildPermission.ViewAuditLog, false);
- TestHelper(value, GuildPermission.ReadMessages, false);
+ TestHelper(value, GuildPermission.ViewChannel, false);
TestHelper(value, GuildPermission.SendMessages, false);
TestHelper(value, GuildPermission.SendTTSMessages, false);
TestHelper(value, GuildPermission.ManageMessages, false);
@@ -323,7 +323,7 @@ namespace Discord
TestHelper(value, GuildPermission.ManageGuild, true);
TestHelper(value, GuildPermission.AddReactions, true);
TestHelper(value, GuildPermission.ViewAuditLog, true);
- TestHelper(value, GuildPermission.ReadMessages, true);
+ TestHelper(value, GuildPermission.ViewChannel, true);
TestHelper(value, GuildPermission.SendMessages, true);
TestHelper(value, GuildPermission.SendTTSMessages, true);
TestHelper(value, GuildPermission.ManageMessages, true);
@@ -367,7 +367,7 @@ namespace Discord
TestHelper(value, GuildPermission.ManageGuild, false);
TestHelper(value, GuildPermission.AddReactions, false);
TestHelper(value, GuildPermission.ViewAuditLog, false);
- TestHelper(value, GuildPermission.ReadMessages, false);
+ TestHelper(value, GuildPermission.ViewChannel, false);
TestHelper(value, GuildPermission.SendMessages, true);
TestHelper(value, GuildPermission.SendTTSMessages, true);
TestHelper(value, GuildPermission.ManageMessages, false);