diff --git a/DisCatSharp.CommandsNext/Converters/TimeConverters.cs b/DisCatSharp.CommandsNext/Converters/TimeConverters.cs
index 7e7c77dfb..c4675b2c1 100644
--- a/DisCatSharp.CommandsNext/Converters/TimeConverters.cs
+++ b/DisCatSharp.CommandsNext/Converters/TimeConverters.cs
@@ -1,148 +1,148 @@
// This file is part of the DisCatSharp project.
//
// Copyright (c) 2021 AITSYS
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
using System;
using System.Globalization;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using DisCatSharp.Entities;
namespace DisCatSharp.CommandsNext.Converters
{
///
/// Represents a date time converter.
///
public class DateTimeConverter : IArgumentConverter
{
///
/// Converts a string.
///
/// The string to convert.
/// The command context.
Task> IArgumentConverter.ConvertAsync(string value, CommandContext ctx)
{
return DateTime.TryParse(value, CultureInfo.InvariantCulture, DateTimeStyles.None, out var result)
? Task.FromResult(new Optional(result))
: Task.FromResult(Optional.FromNoValue());
}
}
///
/// Represents a date time offset converter.
///
public class DateTimeOffsetConverter : IArgumentConverter
{
///
/// Converts a string.
///
/// The string to convert.
/// The command context.
Task> IArgumentConverter.ConvertAsync(string value, CommandContext ctx)
{
return DateTimeOffset.TryParse(value, CultureInfo.InvariantCulture, DateTimeStyles.None, out var result)
? Task.FromResult(Optional.FromValue(result))
: Task.FromResult(Optional.FromNoValue());
}
}
///
/// Represents a time span converter.
///
public class TimeSpanConverter : IArgumentConverter
{
///
/// Gets or sets the time span regex.
///
private static Regex TimeSpanRegex { get; set; }
///
- /// Initializes a new instance of the class.
+ /// Initializes a new instance of the class.
///
static TimeSpanConverter()
{
#if NETSTANDARD1_3
TimeSpanRegex = new Regex(@"^(?\d+d\s*)?(?\d{1,2}h\s*)?(?\d{1,2}m\s*)?(?\d{1,2}s\s*)?$", RegexOptions.ECMAScript);
#else
TimeSpanRegex = new Regex(@"^(?\d+d\s*)?(?\d{1,2}h\s*)?(?\d{1,2}m\s*)?(?\d{1,2}s\s*)?$", RegexOptions.ECMAScript | RegexOptions.Compiled);
#endif
}
///
/// Converts a string.
///
/// The string to convert.
/// The command context.
Task> IArgumentConverter.ConvertAsync(string value, CommandContext ctx)
{
if (value == "0")
return Task.FromResult(Optional.FromValue(TimeSpan.Zero));
if (int.TryParse(value, NumberStyles.Number, CultureInfo.InvariantCulture, out _))
return Task.FromResult(Optional.FromNoValue());
if (!ctx.Config.CaseSensitive)
value = value.ToLowerInvariant();
if (TimeSpan.TryParse(value, CultureInfo.InvariantCulture, out var result))
return Task.FromResult(Optional.FromValue(result));
var gps = new string[] { "days", "hours", "minutes", "seconds" };
var mtc = TimeSpanRegex.Match(value);
if (!mtc.Success)
return Task.FromResult(Optional.FromNoValue());
var d = 0;
var h = 0;
var m = 0;
var s = 0;
foreach (var gp in gps)
{
var gpc = mtc.Groups[gp].Value;
if (string.IsNullOrWhiteSpace(gpc))
continue;
var gpt = gpc[gpc.Length - 1];
int.TryParse(gpc.Substring(0, gpc.Length - 1), NumberStyles.Integer, CultureInfo.InvariantCulture, out var val);
switch (gpt)
{
case 'd':
d = val;
break;
case 'h':
h = val;
break;
case 'm':
m = val;
break;
case 's':
s = val;
break;
}
}
result = new TimeSpan(d, h, m, s);
return Task.FromResult(Optional.FromValue(result));
}
}
}
diff --git a/DisCatSharp.Common/Types/SecureRandom.cs b/DisCatSharp.Common/Types/SecureRandom.cs
index 19bd691eb..e42a11075 100644
--- a/DisCatSharp.Common/Types/SecureRandom.cs
+++ b/DisCatSharp.Common/Types/SecureRandom.cs
@@ -1,348 +1,348 @@
-// This file is part of the DisCatSharp project.
+// This file is part of the DisCatSharp project.
//
// Copyright (c) 2021 AITSYS
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
using System;
using System.Buffers;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Security.Cryptography;
namespace DisCatSharp.Common
{
///
- /// Provides a cryptographically-secure pseudorandom number generator (CSPRNG) implementation compatible with .
+ /// Provides a cryptographically-secure pseudorandom number generator (CSPRNG) implementation compatible with .
///
public sealed class SecureRandom : Random, IDisposable
{
///
/// Gets the r n g.
///
private RandomNumberGenerator RNG { get; } = RandomNumberGenerator.Create();
private volatile bool _isDisposed = false;
///
/// Creates a new instance of .
///
public SecureRandom()
{ }
///
/// Finalizes this instance by disposing it.
///
~SecureRandom()
{
this.Dispose();
}
///
/// Fills a supplied buffer with random bytes.
///
/// Buffer to fill with random bytes.
public void GetBytes(byte[] buffer)
{
this.RNG.GetBytes(buffer);
}
///
/// Fills a supplied buffer with random nonzero bytes.
///
/// Buffer to fill with random nonzero bytes.
public void GetNonZeroBytes(byte[] buffer)
{
this.RNG.GetNonZeroBytes(buffer);
}
///
/// Fills a supplied memory region with random bytes.
///
/// Memmory region to fill with random bytes.
public void GetBytes(Span buffer)
{
#if NETCOREAPP
this.RNG.GetBytes(buffer);
#else
var buff = ArrayPool.Shared.Rent(buffer.Length);
try
{
var buffSpan = buff.AsSpan(0, buffer.Length);
this.RNG.GetBytes(buff);
buffSpan.CopyTo(buffer);
}
finally
{
ArrayPool.Shared.Return(buff);
}
#endif
}
///
/// Fills a supplied memory region with random nonzero bytes.
///
/// Memmory region to fill with random nonzero bytes.
public void GetNonZeroBytes(Span buffer)
{
#if NETCOREAPP
this.RNG.GetNonZeroBytes(buffer);
#else
var buff = ArrayPool.Shared.Rent(buffer.Length);
try
{
var buffSpan = buff.AsSpan(0, buffer.Length);
this.RNG.GetNonZeroBytes(buff);
buffSpan.CopyTo(buffer);
}
finally
{
ArrayPool.Shared.Return(buff);
}
#endif
}
///
/// Generates a signed 8-bit integer within specified range.
///
/// Minimum value to generate. Defaults to 0.
/// Maximum value to generate. Defaults to .
/// Generated random value.
public sbyte GetInt8(sbyte min = 0, sbyte max = sbyte.MaxValue)
{
if (max <= min)
throw new ArgumentException("Maximum needs to be greater than minimum.", nameof(max));
var offset = (sbyte)(min < 0 ? -min : 0);
min += offset;
max += offset;
return (sbyte)(Math.Abs(this.Generate()) % (max - min) + min - offset);
}
///
/// Generates a unsigned 8-bit integer within specified range.
///
/// Minimum value to generate. Defaults to 0.
/// Maximum value to generate. Defaults to .
/// Generated random value.
public byte GetUInt8(byte min = 0, byte max = byte.MaxValue)
{
if (max <= min)
throw new ArgumentException("Maximum needs to be greater than minimum.", nameof(max));
return (byte)(this.Generate() % (max - min) + min);
}
///
/// Generates a signed 16-bit integer within specified range.
///
/// Minimum value to generate. Defaults to 0.
/// Maximum value to generate. Defaults to .
/// Generated random value.
public short GetInt16(short min = 0, short max = short.MaxValue)
{
if (max <= min)
throw new ArgumentException("Maximum needs to be greater than minimum.", nameof(max));
var offset = (short)(min < 0 ? -min : 0);
min += offset;
max += offset;
return (short)(Math.Abs(this.Generate()) % (max - min) + min - offset);
}
///
/// Generates a unsigned 16-bit integer within specified range.
///
/// Minimum value to generate. Defaults to 0.
/// Maximum value to generate. Defaults to .
/// Generated random value.
public ushort GetUInt16(ushort min = 0, ushort max = ushort.MaxValue)
{
if (max <= min)
throw new ArgumentException("Maximum needs to be greater than minimum.", nameof(max));
return (ushort)(this.Generate() % (max - min) + min);
}
///
/// Generates a signed 32-bit integer within specified range.
///
/// Minimum value to generate. Defaults to 0.
/// Maximum value to generate. Defaults to .
/// Generated random value.
public int GetInt32(int min = 0, int max = int.MaxValue)
{
if (max <= min)
throw new ArgumentException("Maximum needs to be greater than minimum.", nameof(max));
var offset = min < 0 ? -min : 0;
min += offset;
max += offset;
return Math.Abs(this.Generate()) % (max - min) + min - offset;
}
///
/// Generates a unsigned 32-bit integer within specified range.
///
/// Minimum value to generate. Defaults to 0.
/// Maximum value to generate. Defaults to .
/// Generated random value.
public uint GetUInt32(uint min = 0, uint max = uint.MaxValue)
{
if (max <= min)
throw new ArgumentException("Maximum needs to be greater than minimum.", nameof(max));
return this.Generate() % (max - min) + min;
}
///
/// Generates a signed 64-bit integer within specified range.
///
/// Minimum value to generate. Defaults to 0.
/// Maximum value to generate. Defaults to .
/// Generated random value.
public long GetInt64(long min = 0, long max = long.MaxValue)
{
if (max <= min)
throw new ArgumentException("Maximum needs to be greater than minimum.", nameof(max));
var offset = min < 0 ? -min : 0;
min += offset;
max += offset;
return Math.Abs(this.Generate()) % (max - min) + min - offset;
}
///
/// Generates a unsigned 64-bit integer within specified range.
///
/// Minimum value to generate. Defaults to 0.
/// Maximum value to generate. Defaults to .
/// Generated random value.
public ulong GetUInt64(ulong min = 0, ulong max = ulong.MaxValue)
{
if (max <= min)
throw new ArgumentException("Maximum needs to be greater than minimum.", nameof(max));
return this.Generate() % (max - min) + min;
}
///
/// Generates a 32-bit floating-point number between 0.0 and 1.0.
///
/// Generated 32-bit floating-point number.
public float GetSingle()
{
var (i1, i2) = ((float)this.GetInt32(), (float)this.GetInt32());
return i1 / i2 % 1.0F;
}
///
/// Generates a 64-bit floating-point number between 0.0 and 1.0.
///
/// Generated 64-bit floating-point number.
public double GetDouble()
{
var (i1, i2) = ((double)this.GetInt64(), (double)this.GetInt64());
return i1 / i2 % 1.0;
}
///
/// Generates a 32-bit integer between 0 and . Upper end exclusive.
///
/// Generated 32-bit integer.
public override int Next()
=> this.GetInt32();
///
/// Generates a 32-bit integer between 0 and . Upper end exclusive.
///
/// Maximum value of the generated integer.
/// Generated 32-bit integer.
public override int Next(int maxValue)
=> this.GetInt32(0, maxValue);
///
/// Generates a 32-bit integer between and . Upper end exclusive.
///
/// Minimum value of the generate integer.
/// Maximum value of the generated integer.
/// Generated 32-bit integer.
public override int Next(int minValue, int maxValue)
=> this.GetInt32(minValue, maxValue);
///
/// Generates a 64-bit floating-point number between 0.0 and 1.0. Upper end exclusive.
///
/// Generated 64-bit floating-point number.
public override double NextDouble()
=> this.GetDouble();
///
/// Fills specified buffer with random bytes.
///
/// Buffer to fill with bytes.
public override void NextBytes(byte[] buffer)
=> this.GetBytes(buffer);
///
/// Fills specified memory region with random bytes.
///
/// Memory region to fill with bytes.
#if NETCOREAPP
override
#endif
public void NextBytes(Span buffer)
=> this.GetBytes(buffer);
///
/// Disposes this instance and its resources.
///
public void Dispose()
{
if (this._isDisposed)
return;
this._isDisposed = true;
this.RNG.Dispose();
}
///
/// Generates a random 64-bit floating-point number between 0.0 and 1.0. Upper end exclusive.
///
/// Generated 64-bit floating-point number.
protected override double Sample()
=> this.GetDouble();
///
/// Generates the.
///
/// A T.
private T Generate() where T : struct
{
var size = Unsafe.SizeOf();
Span buff = stackalloc byte[size];
this.GetBytes(buff);
return MemoryMarshal.Read(buff);
}
}
}
diff --git a/DisCatSharp.Common/Types/Serialization/ComplexDecomposer.cs b/DisCatSharp.Common/Types/Serialization/ComplexDecomposer.cs
index d3331898d..b9e79deec 100644
--- a/DisCatSharp.Common/Types/Serialization/ComplexDecomposer.cs
+++ b/DisCatSharp.Common/Types/Serialization/ComplexDecomposer.cs
@@ -1,116 +1,116 @@
// This file is part of the DisCatSharp project.
//
// Copyright (c) 2021 AITSYS
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Numerics;
namespace DisCatSharp.Common.Serialization
{
///
- /// Decomposes numbers into tuples (arrays of 2).
+ /// Decomposes numbers into tuples (arrays of 2).
///
public sealed class ComplexDecomposer : IDecomposer
{
///
/// Gets the t complex.
///
private static Type TComplex { get; } = typeof(Complex);
///
/// Gets the t double array.
///
private static Type TDoubleArray { get; } = typeof(double[]);
///
/// Gets the t double enumerable.
///
private static Type TDoubleEnumerable { get; } = typeof(IEnumerable);
///
/// Gets the t object array.
///
private static Type TObjectArray { get; } = typeof(object[]);
///
/// Gets the t object enumerable.
///
private static Type TObjectEnumerable { get; } = typeof(IEnumerable