diff --git a/src/NadekoBot.Tests/NadekoBot.Tests.csproj b/src/NadekoBot.Tests/NadekoBot.Tests.csproj
index b3aa8c0d0..01a070066 100644
--- a/src/NadekoBot.Tests/NadekoBot.Tests.csproj
+++ b/src/NadekoBot.Tests/NadekoBot.Tests.csproj
@@ -7,9 +7,9 @@
-
-
-
+
+
+
diff --git a/src/NadekoBot/Modules/Searches/Common/StreamNotifications/Providers/PicartoProvider.cs b/src/NadekoBot/Modules/Searches/Common/StreamNotifications/Providers/PicartoProvider.cs
index 2c6111241..1d53bf02f 100644
--- a/src/NadekoBot/Modules/Searches/Common/StreamNotifications/Providers/PicartoProvider.cs
+++ b/src/NadekoBot/Modules/Searches/Common/StreamNotifications/Providers/PicartoProvider.cs
@@ -74,7 +74,7 @@ namespace NadekoBot.Core.Modules.Searches.Common.StreamNotifications.Providers
if (!res.IsSuccessStatusCode)
continue;
- var userData = JsonConvert.DeserializeObject(await res.Content.ReadAsStringAsync());
+ var userData = JsonConvert.DeserializeObject(await res.Content.ReadAsStringAsync())!;
toReturn.Add(ToStreamData(userData));
_failingStreams.TryRemove(login, out _);
diff --git a/src/NadekoBot/Modules/Searches/Common/StreamNotifications/Providers/TwitchProvider.cs b/src/NadekoBot/Modules/Searches/Common/StreamNotifications/Providers/TwitchProvider.cs
index 89b30d96e..0a0f871bf 100644
--- a/src/NadekoBot/Modules/Searches/Common/StreamNotifications/Providers/TwitchProvider.cs
+++ b/src/NadekoBot/Modules/Searches/Common/StreamNotifications/Providers/TwitchProvider.cs
@@ -72,7 +72,7 @@ namespace NadekoBot.Core.Modules.Searches.Common.StreamNotifications.Providers
// get id based on the username
var idsStr = await http.GetStringAsync($"https://api.twitch.tv/kraken/users?login={login}");
var userData = JsonConvert.DeserializeObject(idsStr);
- var user = userData.Users.FirstOrDefault();
+ var user = userData?.Users.FirstOrDefault();
// if user can't be found, skip, it means there is no such user
if (user is null)
@@ -84,11 +84,11 @@ namespace NadekoBot.Core.Modules.Searches.Common.StreamNotifications.Providers
JsonConvert.DeserializeAnonymousType(str, new {Stream = new TwitchResponseV5.Stream()});
// if stream is null, user is not streaming
- if (resObj.Stream is null)
+ if (resObj?.Stream is null)
{
// if user is not streaming, get his offline banner
var chStr = await http.GetStringAsync($"https://api.twitch.tv/kraken/channels/{user.Id}");
- var ch = JsonConvert.DeserializeObject(chStr);
+ var ch = JsonConvert.DeserializeObject(chStr)!;
toReturn.Add(new StreamData
{
diff --git a/src/NadekoBot/NadekoBot.csproj b/src/NadekoBot/NadekoBot.csproj
index a6385ccfb..b293e1bee 100644
--- a/src/NadekoBot/NadekoBot.csproj
+++ b/src/NadekoBot/NadekoBot.csproj
@@ -9,40 +9,43 @@
-
-
+
+
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+ all
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+
+
+
+
+
+
+
+
+
+
-
+
-
+
-
+
-
-
-
-
+
+
+
+
diff --git a/src/NadekoBot/Services/Impl/RedisCache.cs b/src/NadekoBot/Services/Impl/RedisCache.cs
index 105179278..b83c2d590 100644
--- a/src/NadekoBot/Services/Impl/RedisCache.cs
+++ b/src/NadekoBot/Services/Impl/RedisCache.cs
@@ -24,7 +24,6 @@ namespace NadekoBot.Core.Services.Impl
Redis = ConnectionMultiplexer.Connect(conf);
_redisEndpoint = Redis.GetEndPoints().First();
- Redis.PreserveAsyncOrder = false;
LocalImages = new RedisImagesCache(Redis, creds);
LocalData = new RedisLocalDataCache(Redis, creds, shardId);
_redisKey = creds.RedisKey();
diff --git a/src/ayu/Ayu.Discord.Voice/ArrayBufferWriter.cs b/src/ayu/Ayu.Discord.Voice/ArrayBufferWriter.cs
deleted file mode 100644
index 3eb0a4786..000000000
--- a/src/ayu/Ayu.Discord.Voice/ArrayBufferWriter.cs
+++ /dev/null
@@ -1,209 +0,0 @@
-using System;
-using System.Buffers;
-using System.Diagnostics;
-
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-namespace Ayu.Discord.Voice
-{
- sealed class ArrayBufferWriter : IBufferWriter
- {
- // Copy of Array.MaxLength.
- private const int ArrayMaxLength = 0x7FFFFFC7;
-
- private const int DefaultInitialBufferSize = 256;
-
- private T[] _buffer;
- private int _index;
-
-
- ///
- /// Creates an instance of an , in which data can be written to,
- /// with the default initial capacity.
- ///
- public ArrayBufferWriter()
- {
- _buffer = Array.Empty();
- _index = 0;
- }
-
- ///
- /// Creates an instance of an , in which data can be written to,
- /// with an initial capacity specified.
- ///
- /// The minimum capacity with which to initialize the underlying buffer.
- ///
- /// Thrown when is not positive (i.e. less than or equal to 0).
- ///
- public ArrayBufferWriter(int initialCapacity)
- {
- if (initialCapacity <= 0)
- throw new ArgumentException(null, nameof(initialCapacity));
-
- _buffer = new T[initialCapacity];
- _index = 0;
- }
-
- ///
- /// Returns the data written to the underlying buffer so far, as a .
- ///
- public ReadOnlyMemory WrittenMemory => _buffer.AsMemory(0, _index);
-
- ///
- /// Returns the data written to the underlying buffer so far, as a .
- ///
- public ReadOnlySpan WrittenSpan => _buffer.AsSpan(0, _index);
-
- ///
- /// Returns the amount of data written to the underlying buffer so far.
- ///
- public int WrittenCount => _index;
-
- ///
- /// Returns the total amount of space within the underlying buffer.
- ///
- public int Capacity => _buffer.Length;
-
- ///
- /// Returns the amount of space available that can still be written into without forcing the underlying buffer to grow.
- ///
- public int FreeCapacity => _buffer.Length - _index;
-
- ///
- /// Clears the data written to the underlying buffer.
- ///
- ///
- /// You must clear the before trying to re-use it.
- ///
- public void Clear()
- {
- Debug.Assert(_buffer.Length >= _index);
- _buffer.AsSpan(0, _index).Clear();
- _index = 0;
- }
-
- ///
- /// Notifies that amount of data was written to the output /
- ///
- ///
- /// Thrown when is negative.
- ///
- ///
- /// Thrown when attempting to advance past the end of the underlying buffer.
- ///
- ///
- /// You must request a new buffer after calling Advance to continue writing more data and cannot write to a previously acquired buffer.
- ///
- public void Advance(int count)
- {
- if (count < 0)
- throw new ArgumentException(null, nameof(count));
-
- if (_index > _buffer.Length - count)
- ThrowInvalidOperationException_AdvancedTooFar(_buffer.Length);
-
- _index += count;
- }
-
- ///
- /// Returns a to write to that is at least the requested length (specified by ).
- /// If no is provided (or it's equal to 0
), some non-empty buffer is returned.
- ///
- ///
- /// Thrown when is negative.
- ///
- ///
- /// This will never return an empty .
- ///
- ///
- /// There is no guarantee that successive calls will return the same buffer or the same-sized buffer.
- ///
- ///
- /// You must request a new buffer after calling Advance to continue writing more data and cannot write to a previously acquired buffer.
- ///
- public Memory GetMemory(int sizeHint = 0)
- {
- CheckAndResizeBuffer(sizeHint);
- Debug.Assert(_buffer.Length > _index);
- return _buffer.AsMemory(_index);
- }
-
- ///
- /// Returns a to write to that is at least the requested length (specified by ).
- /// If no is provided (or it's equal to 0
), some non-empty buffer is returned.
- ///
- ///
- /// Thrown when is negative.
- ///
- ///
- /// This will never return an empty .
- ///
- ///
- /// There is no guarantee that successive calls will return the same buffer or the same-sized buffer.
- ///
- ///
- /// You must request a new buffer after calling Advance to continue writing more data and cannot write to a previously acquired buffer.
- ///
- public Span GetSpan(int sizeHint = 0)
- {
- CheckAndResizeBuffer(sizeHint);
- Debug.Assert(_buffer.Length > _index);
- return _buffer.AsSpan(_index);
- }
-
- private void CheckAndResizeBuffer(int sizeHint)
- {
- if (sizeHint < 0)
- throw new ArgumentException(nameof(sizeHint));
-
- if (sizeHint == 0)
- {
- sizeHint = 1;
- }
-
- if (sizeHint > FreeCapacity)
- {
- int currentLength = _buffer.Length;
-
- // Attempt to grow by the larger of the sizeHint and double the current size.
- int growBy = Math.Max(sizeHint, currentLength);
-
- if (currentLength == 0)
- {
- growBy = Math.Max(growBy, DefaultInitialBufferSize);
- }
-
- int newSize = currentLength + growBy;
-
- if ((uint) newSize > int.MaxValue)
- {
- // Attempt to grow to ArrayMaxLength.
- uint needed = (uint) (currentLength - FreeCapacity + sizeHint);
- Debug.Assert(needed > currentLength);
-
- if (needed > ArrayMaxLength)
- {
- ThrowOutOfMemoryException(needed);
- }
-
- newSize = ArrayMaxLength;
- }
-
- Array.Resize(ref _buffer, newSize);
- }
-
- Debug.Assert(FreeCapacity > 0 && FreeCapacity >= sizeHint);
- }
-
- private static void ThrowInvalidOperationException_AdvancedTooFar(int capacity)
- {
- throw new InvalidOperationException();
- }
-
- private static void ThrowOutOfMemoryException(uint capacity)
- {
- throw new OutOfMemoryException();
- }
- }
-}
\ No newline at end of file
diff --git a/src/ayu/Ayu.Discord.Voice/Ayu.Discord.Voice.csproj b/src/ayu/Ayu.Discord.Voice/Ayu.Discord.Voice.csproj
index 1de012fb3..c09d8a89b 100644
--- a/src/ayu/Ayu.Discord.Voice/Ayu.Discord.Voice.csproj
+++ b/src/ayu/Ayu.Discord.Voice/Ayu.Discord.Voice.csproj
@@ -1,13 +1,12 @@
- netcoreapp2.1
- 8.0
+ netstandard2.1
true
CS8632
- 1.0.1
+ 1.0.2
-
+
diff --git a/src/ayu/Ayu.Discord.Voice/SocketClient.cs b/src/ayu/Ayu.Discord.Voice/SocketClient.cs
index 33a53bbd3..0d35c629c 100644
--- a/src/ayu/Ayu.Discord.Voice/SocketClient.cs
+++ b/src/ayu/Ayu.Discord.Voice/SocketClient.cs
@@ -1,9 +1,9 @@
using Serilog;
using System;
+using System.Buffers;
using System.Net.WebSockets;
using System.Threading;
using System.Threading.Tasks;
-using Ayu.Discord.Voice;
namespace Ayu.Discord.Gateway
{