mirror of
https://github.com/oliverbooth/X10D
synced 2024-11-22 13:48:47 +00:00
refactor: remove X10D.DSharpPlus
This commit is contained in:
parent
27e0ec54be
commit
1e71029f38
1
.github/workflows/nightly.yml
vendored
1
.github/workflows/nightly.yml
vendored
@ -33,7 +33,6 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
mkdir build
|
mkdir build
|
||||||
dotnet pack X10D --configuration Debug --no-build -p:SymbolPackageFormat=snupkg --include-symbols --include-source -o build -p:VersionSuffix='nightly' -p:BuildNumber=${{ github.run_number }}
|
dotnet pack X10D --configuration Debug --no-build -p:SymbolPackageFormat=snupkg --include-symbols --include-source -o build -p:VersionSuffix='nightly' -p:BuildNumber=${{ github.run_number }}
|
||||||
dotnet pack X10D.DSharpPlus --configuration Debug --no-build -p:SymbolPackageFormat=snupkg --include-symbols --include-source -o build -p:VersionSuffix='nightly' -p:BuildNumber=${{ github.run_number }}
|
|
||||||
dotnet pack X10D.Hosting --configuration Debug --no-build -p:SymbolPackageFormat=snupkg --include-symbols --include-source -o build -p:VersionSuffix='nightly' -p:BuildNumber=${{ github.run_number }}
|
dotnet pack X10D.Hosting --configuration Debug --no-build -p:SymbolPackageFormat=snupkg --include-symbols --include-source -o build -p:VersionSuffix='nightly' -p:BuildNumber=${{ github.run_number }}
|
||||||
dotnet pack X10D.Unity --configuration Debug --no-build -p:SymbolPackageFormat=snupkg --include-symbols --include-source -o build -p:VersionSuffix='nightly' -p:BuildNumber=${{ github.run_number }}
|
dotnet pack X10D.Unity --configuration Debug --no-build -p:SymbolPackageFormat=snupkg --include-symbols --include-source -o build -p:VersionSuffix='nightly' -p:BuildNumber=${{ github.run_number }}
|
||||||
|
|
||||||
|
1
.github/workflows/prerelease.yml
vendored
1
.github/workflows/prerelease.yml
vendored
@ -32,7 +32,6 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
mkdir build
|
mkdir build
|
||||||
dotnet pack X10D --configuration Release --no-build -p:SymbolPackageFormat=snupkg --include-symbols --include-source -o build -p:VersionSuffix='prerelease' -p:BuildNumber=${{ github.run_number }}
|
dotnet pack X10D --configuration Release --no-build -p:SymbolPackageFormat=snupkg --include-symbols --include-source -o build -p:VersionSuffix='prerelease' -p:BuildNumber=${{ github.run_number }}
|
||||||
dotnet pack X10D.DSharpPlus --configuration Release --no-build -p:SymbolPackageFormat=snupkg --include-symbols --include-source -o build -p:VersionSuffix='prerelease' -p:BuildNumber=${{ github.run_number }}
|
|
||||||
dotnet pack X10D.Hosting --configuration Release --no-build -p:SymbolPackageFormat=snupkg --include-symbols --include-source -o build -p:VersionSuffix='prerelease' -p:BuildNumber=${{ github.run_number }}
|
dotnet pack X10D.Hosting --configuration Release --no-build -p:SymbolPackageFormat=snupkg --include-symbols --include-source -o build -p:VersionSuffix='prerelease' -p:BuildNumber=${{ github.run_number }}
|
||||||
dotnet pack X10D.Unity --configuration Release --no-build -p:SymbolPackageFormat=snupkg --include-symbols --include-source -o build -p:VersionSuffix='prerelease' -p:BuildNumber=${{ github.run_number }}
|
dotnet pack X10D.Unity --configuration Release --no-build -p:SymbolPackageFormat=snupkg --include-symbols --include-source -o build -p:VersionSuffix='prerelease' -p:BuildNumber=${{ github.run_number }}
|
||||||
|
|
||||||
|
1
.github/workflows/release.yml
vendored
1
.github/workflows/release.yml
vendored
@ -32,7 +32,6 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
mkdir build
|
mkdir build
|
||||||
dotnet pack X10D --configuration Release --no-build -p:SymbolPackageFormat=snupkg --include-symbols --include-source -o build
|
dotnet pack X10D --configuration Release --no-build -p:SymbolPackageFormat=snupkg --include-symbols --include-source -o build
|
||||||
dotnet pack X10D.DSharpPlus --configuration Release --no-build -p:SymbolPackageFormat=snupkg --include-symbols --include-source -o build
|
|
||||||
dotnet pack X10D.Hosting --configuration Release --no-build -p:SymbolPackageFormat=snupkg --include-symbols --include-source -o build
|
dotnet pack X10D.Hosting --configuration Release --no-build -p:SymbolPackageFormat=snupkg --include-symbols --include-source -o build
|
||||||
dotnet pack X10D.Unity --configuration Release --no-build -p:SymbolPackageFormat=snupkg --include-symbols --include-source -o build
|
dotnet pack X10D.Unity --configuration Release --no-build -p:SymbolPackageFormat=snupkg --include-symbols --include-source -o build
|
||||||
|
|
||||||
|
@ -34,6 +34,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
### Removed
|
### Removed
|
||||||
|
|
||||||
- X10D: Removed `IEnumerable<T>.ConcatOne` - this functionality already exists with `Append`.
|
- X10D: Removed `IEnumerable<T>.ConcatOne` - this functionality already exists with `Append`.
|
||||||
|
- X10D.DSharpPlus: Complete sunset of library. This library will not be updated to support DSharpPlus v5.0.0.
|
||||||
|
|
||||||
## [3.3.1] - 2023-08-21
|
## [3.3.1] - 2023-08-21
|
||||||
|
|
||||||
|
@ -1,12 +0,0 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
|
||||||
|
|
||||||
<PropertyGroup>
|
|
||||||
<TargetFrameworks>net7.0;net6.0;netstandard2.1</TargetFrameworks>
|
|
||||||
<ExcludeFromCodeCoverage>true</ExcludeFromCodeCoverage>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<PackageReference Include="DSharpPlus" Version="4.3.0" PrivateAssets="All"/>
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
</Project>
|
|
@ -1 +0,0 @@
|
|||||||
[assembly: CLSCompliant(false)]
|
|
@ -1,71 +0,0 @@
|
|||||||
using DSharpPlus;
|
|
||||||
using DSharpPlus.Entities;
|
|
||||||
|
|
||||||
namespace X10D.DSharpPlus;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Extension methods for <see cref="DiscordChannel" />.
|
|
||||||
/// </summary>
|
|
||||||
public static class DiscordChannelExtensions
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Gets the category of this channel.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="channel">The channel whose category to retrieve.</param>
|
|
||||||
/// <returns>
|
|
||||||
/// The category of <paramref name="channel" />, or <paramref name="channel" /> itself if it is already a category;
|
|
||||||
/// <see langword="null" /> if this channel is not defined in a category.
|
|
||||||
/// </returns>
|
|
||||||
/// <exception cref="ArgumentNullException"><paramref name="channel" /> is <see langword="null" />.</exception>
|
|
||||||
public static DiscordChannel? GetCategory(this DiscordChannel channel)
|
|
||||||
{
|
|
||||||
if (channel is null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException(nameof(channel));
|
|
||||||
}
|
|
||||||
|
|
||||||
while (true)
|
|
||||||
{
|
|
||||||
if (channel.IsCategory)
|
|
||||||
{
|
|
||||||
return channel;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (channel.Parent is not { } parent)
|
|
||||||
{
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
channel = parent;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Normalizes a <see cref="DiscordChannel" /> so that the internal client is assured to be a specified value.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="channel">The <see cref="DiscordChannel" /> to normalize.</param>
|
|
||||||
/// <param name="client">The target client.</param>
|
|
||||||
/// <returns>
|
|
||||||
/// A <see cref="DiscordChannel" /> whose public values will match <paramref name="channel" />, but whose internal client
|
|
||||||
/// is <paramref name="client" />.
|
|
||||||
/// </returns>
|
|
||||||
/// <exception cref="ArgumentNullException">
|
|
||||||
/// <para><paramref name="channel" /> is <see langword="null" /></para>
|
|
||||||
/// -or-
|
|
||||||
/// <para><paramref name="client" /> is <see langword="null" /></para>
|
|
||||||
/// </exception>
|
|
||||||
public static async Task<DiscordChannel> NormalizeClientAsync(this DiscordChannel channel, DiscordClient client)
|
|
||||||
{
|
|
||||||
if (channel is null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException(nameof(channel));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (client is null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException(nameof(client));
|
|
||||||
}
|
|
||||||
|
|
||||||
return await client.GetChannelAsync(channel.Id).ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,71 +0,0 @@
|
|||||||
using DSharpPlus;
|
|
||||||
using DSharpPlus.Entities;
|
|
||||||
using DSharpPlus.Exceptions;
|
|
||||||
|
|
||||||
namespace X10D.DSharpPlus;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Extension methods for <see cref="DiscordClient" />.
|
|
||||||
/// </summary>
|
|
||||||
public static class DiscordClientExtensions
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Instructs the client to automatically join all existing threads, and any newly-created threads.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="client">The <see cref="DiscordClient" /> whose events should be subscribed.</param>
|
|
||||||
/// <param name="rejoinIfRemoved">
|
|
||||||
/// <see langword="true" /> to automatically rejoin a thread if this client was removed; otherwise,
|
|
||||||
/// <see langword="false" />.
|
|
||||||
/// </param>
|
|
||||||
/// <exception cref="ArgumentNullException"><paramref name="client" /> is <see langword="null" />.</exception>
|
|
||||||
public static void AutoJoinThreads(this DiscordClient client, bool rejoinIfRemoved = true)
|
|
||||||
{
|
|
||||||
if (client is null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException(nameof(client));
|
|
||||||
}
|
|
||||||
|
|
||||||
client.GuildAvailable += (_, args) => args.Guild.JoinAllThreadsAsync();
|
|
||||||
client.ThreadCreated += (_, args) => args.Thread.JoinThreadAsync();
|
|
||||||
|
|
||||||
if (rejoinIfRemoved)
|
|
||||||
{
|
|
||||||
client.ThreadMembersUpdated += (_, args) =>
|
|
||||||
{
|
|
||||||
if (args.RemovedMembers.Any(m => m.Id == client.CurrentUser.Id))
|
|
||||||
return args.Thread.JoinThreadAsync();
|
|
||||||
|
|
||||||
return Task.CompletedTask;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets a user by their ID. If the user is not found, <see langword="null" /> is returned instead of
|
|
||||||
/// <see cref="NotFoundException" /> being thrown.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="client">The Discord client.</param>
|
|
||||||
/// <param name="userId">The ID of the user to retrieve.</param>
|
|
||||||
/// <exception cref="ArgumentNullException"><paramref name="client" /> is <see langword="null" />.</exception>
|
|
||||||
public static async Task<DiscordUser?> GetUserOrNullAsync(this DiscordClient client, ulong userId)
|
|
||||||
{
|
|
||||||
if (client is null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException(nameof(client));
|
|
||||||
}
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
// we should never use exceptions for flow control but this is D#+ we're talking about.
|
|
||||||
// NotFoundException isn't even documented, and yet it gets thrown when a user doesn't exist.
|
|
||||||
// so this method should hopefully clearly express that - and at least using exceptions for flow control *here*,
|
|
||||||
// removes the need to do the same in consumer code.
|
|
||||||
// god I hate this.
|
|
||||||
return await client.GetUserAsync(userId).ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
catch (NotFoundException)
|
|
||||||
{
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,212 +0,0 @@
|
|||||||
using DSharpPlus.Entities;
|
|
||||||
|
|
||||||
namespace X10D.DSharpPlus;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Extension methods for <see cref="DiscordEmbedBuilder" />.
|
|
||||||
/// </summary>
|
|
||||||
public static class DiscordEmbedBuilderExtensions
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Adds a field of any value type to the embed.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="builder">The <see cref="DiscordEmbedBuilder" /> to modify.</param>
|
|
||||||
/// <param name="name">The name of the embed field.</param>
|
|
||||||
/// <param name="value">The value of the embed field.</param>
|
|
||||||
/// <param name="inline"><see langword="true" /> to display this field inline; otherwise, <see langword="false" />.</param>
|
|
||||||
/// <typeparam name="T">The type of <paramref name="value" />.</typeparam>
|
|
||||||
/// <returns>The current instance of <see cref="DiscordEmbedBuilder" />; that is, <paramref name="builder" />.</returns>
|
|
||||||
/// <exception cref="ArgumentNullException"><paramref name="builder" /> is <see langword="null" />.</exception>
|
|
||||||
public static DiscordEmbedBuilder AddField<T>(
|
|
||||||
this DiscordEmbedBuilder builder,
|
|
||||||
string name,
|
|
||||||
T? value,
|
|
||||||
bool inline = false)
|
|
||||||
{
|
|
||||||
if (builder is null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException(nameof(builder));
|
|
||||||
}
|
|
||||||
|
|
||||||
return builder.AddField(name, value?.ToString(), inline);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Conditionally adds a field to the embed.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="builder">The <see cref="DiscordEmbedBuilder" /> to modify.</param>
|
|
||||||
/// <param name="condition">The condition whose value is used to determine whether the field will be added.</param>
|
|
||||||
/// <param name="name">The name of the embed field.</param>
|
|
||||||
/// <param name="value">The value of the embed field.</param>
|
|
||||||
/// <param name="inline"><see langword="true" /> to display this field inline; otherwise, <see langword="false" />.</param>
|
|
||||||
/// <typeparam name="T">The type of <paramref name="value" />.</typeparam>
|
|
||||||
/// <returns>The current instance of <see cref="DiscordEmbedBuilder" />; that is, <paramref name="builder" />.</returns>
|
|
||||||
/// <exception cref="ArgumentNullException"><paramref name="builder" /> is <see langword="null" />.</exception>
|
|
||||||
public static DiscordEmbedBuilder AddFieldIf<T>(
|
|
||||||
this DiscordEmbedBuilder builder,
|
|
||||||
bool condition,
|
|
||||||
string name,
|
|
||||||
T? value,
|
|
||||||
bool inline = false)
|
|
||||||
{
|
|
||||||
if (builder is null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException(nameof(builder));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (condition)
|
|
||||||
{
|
|
||||||
builder.AddField(name, value?.ToString(), inline);
|
|
||||||
}
|
|
||||||
|
|
||||||
return builder;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Conditionally adds a field to the embed.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="builder">The <see cref="DiscordEmbedBuilder" /> to modify.</param>
|
|
||||||
/// <param name="predicate">The predicate whose return value is used to determine whether the field will be added.</param>
|
|
||||||
/// <param name="name">The name of the embed field.</param>
|
|
||||||
/// <param name="value">The value of the embed field.</param>
|
|
||||||
/// <param name="inline"><see langword="true" /> to display this field inline; otherwise, <see langword="false" />.</param>
|
|
||||||
/// <typeparam name="T">The type of <paramref name="value" />.</typeparam>
|
|
||||||
/// <returns>The current instance of <see cref="DiscordEmbedBuilder" />; that is, <paramref name="builder" />.</returns>
|
|
||||||
/// <exception cref="ArgumentNullException">
|
|
||||||
/// <para><paramref name="builder" /> is <see langword="null" />.</para>
|
|
||||||
/// -or-
|
|
||||||
/// <para><paramref name="predicate" /> is <see langword="null" />.</para>
|
|
||||||
/// </exception>
|
|
||||||
public static DiscordEmbedBuilder AddFieldIf<T>(
|
|
||||||
this DiscordEmbedBuilder builder,
|
|
||||||
Func<bool> predicate,
|
|
||||||
string name,
|
|
||||||
T? value,
|
|
||||||
bool inline = false)
|
|
||||||
{
|
|
||||||
if (builder is null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException(nameof(builder));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (predicate is null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException(nameof(predicate));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (predicate.Invoke())
|
|
||||||
{
|
|
||||||
builder.AddField(name, value?.ToString(), inline);
|
|
||||||
}
|
|
||||||
|
|
||||||
return builder;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Conditionally adds a field to the embed.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="builder">The <see cref="DiscordEmbedBuilder" /> to modify.</param>
|
|
||||||
/// <param name="predicate">The predicate whose return value is used to determine whether the field will be added.</param>
|
|
||||||
/// <param name="name">The name of the embed field.</param>
|
|
||||||
/// <param name="valueFactory">The delegate whose return value will be used as the value of the embed field.</param>
|
|
||||||
/// <param name="inline"><see langword="true" /> to display this field inline; otherwise, <see langword="false" />.</param>
|
|
||||||
/// <typeparam name="T">The return type of <paramref name="valueFactory" />.</typeparam>
|
|
||||||
/// <returns>The current instance of <see cref="DiscordEmbedBuilder" />; that is, <paramref name="builder" />.</returns>
|
|
||||||
/// <exception cref="ArgumentNullException">
|
|
||||||
/// <para><paramref name="builder" /> is <see langword="null" />.</para>
|
|
||||||
/// -or-
|
|
||||||
/// <para><paramref name="predicate" /> is <see langword="null" />.</para>
|
|
||||||
/// -or-
|
|
||||||
/// <para><paramref name="valueFactory" /> is <see langword="null" />.</para>
|
|
||||||
/// </exception>
|
|
||||||
public static DiscordEmbedBuilder AddFieldIf<T>(
|
|
||||||
this DiscordEmbedBuilder builder,
|
|
||||||
Func<bool> predicate,
|
|
||||||
string name,
|
|
||||||
Func<T?> valueFactory,
|
|
||||||
bool inline = false)
|
|
||||||
{
|
|
||||||
if (builder is null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException(nameof(builder));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (predicate is null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException(nameof(predicate));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (valueFactory is null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException(nameof(valueFactory));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (predicate.Invoke())
|
|
||||||
{
|
|
||||||
builder.AddField(name, valueFactory.Invoke()?.ToString(), inline);
|
|
||||||
}
|
|
||||||
|
|
||||||
return builder;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Conditionally adds a field to the embed.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="builder">The <see cref="DiscordEmbedBuilder" /> to modify.</param>
|
|
||||||
/// <param name="condition">The condition whose value is used to determine whether the field will be added.</param>
|
|
||||||
/// <param name="name">The name of the embed field.</param>
|
|
||||||
/// <param name="valueFactory">The delegate whose return value will be used as the value of the embed field.</param>
|
|
||||||
/// <param name="inline"><see langword="true" /> to display this field inline; otherwise, <see langword="false" />.</param>
|
|
||||||
/// <typeparam name="T">The return type of <paramref name="valueFactory" />.</typeparam>
|
|
||||||
/// <returns>The current instance of <see cref="DiscordEmbedBuilder" />; that is, <paramref name="builder" />.</returns>
|
|
||||||
/// <exception cref="ArgumentNullException">
|
|
||||||
/// <para><paramref name="builder" /> is <see langword="null" />.</para>
|
|
||||||
/// -or-
|
|
||||||
/// <para><paramref name="valueFactory" /> is <see langword="null" />.</para>
|
|
||||||
/// </exception>
|
|
||||||
public static DiscordEmbedBuilder AddFieldIf<T>(
|
|
||||||
this DiscordEmbedBuilder builder,
|
|
||||||
bool condition,
|
|
||||||
string name,
|
|
||||||
Func<T?> valueFactory,
|
|
||||||
bool inline = false)
|
|
||||||
{
|
|
||||||
if (builder is null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException(nameof(builder));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (valueFactory is null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException(nameof(valueFactory));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (condition)
|
|
||||||
{
|
|
||||||
builder.AddField(name, valueFactory.Invoke()?.ToString(), inline);
|
|
||||||
}
|
|
||||||
|
|
||||||
return builder;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Sets the embed's author.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="builder">The embed builder to modify.</param>
|
|
||||||
/// <param name="user">The author.</param>
|
|
||||||
/// <returns>The current instance of <see cref="DiscordEmbedBuilder" />.</returns>
|
|
||||||
public static DiscordEmbedBuilder WithAuthor(this DiscordEmbedBuilder builder, DiscordUser user)
|
|
||||||
{
|
|
||||||
if (builder is null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException(nameof(builder));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (user is null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException(nameof(user));
|
|
||||||
}
|
|
||||||
|
|
||||||
return builder.WithAuthor(user.GetUsernameWithDiscriminator(), iconUrl: user.AvatarUrl);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,84 +0,0 @@
|
|||||||
using DSharpPlus;
|
|
||||||
using DSharpPlus.Entities;
|
|
||||||
using DSharpPlus.Exceptions;
|
|
||||||
|
|
||||||
namespace X10D.DSharpPlus;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Extension methods for <see cref="DiscordGuild" />.
|
|
||||||
/// </summary>
|
|
||||||
public static class DiscordGuildExtensions
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Joins all active threads in the guild that this client has permission to view.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="guild">The guild whose active threads to join.</param>
|
|
||||||
/// <exception cref="ArgumentNullException"><paramref name="guild" /> is <see langword="null" />.</exception>
|
|
||||||
public static async Task JoinAllThreadsAsync(this DiscordGuild guild)
|
|
||||||
{
|
|
||||||
if (guild is null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException(nameof(guild));
|
|
||||||
}
|
|
||||||
|
|
||||||
await Task.WhenAll(guild.Threads.Values.Select(t => t.JoinThreadAsync())).ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets a guild member by their ID. If the member is not found, <see langword="null" /> is returned instead of
|
|
||||||
/// <see cref="NotFoundException" /> being thrown.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="guild">The guild whose member list to search.</param>
|
|
||||||
/// <param name="userId">The ID of the member to retrieve.</param>
|
|
||||||
/// <exception cref="ArgumentNullException"><paramref name="guild" /> is <see langword="null" />.</exception>
|
|
||||||
public static async Task<DiscordMember?> GetMemberOrNullAsync(this DiscordGuild guild, ulong userId)
|
|
||||||
{
|
|
||||||
if (guild is null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException(nameof(guild));
|
|
||||||
}
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
// we should never use exceptions for flow control but this is D#+ we're talking about.
|
|
||||||
// NotFoundException isn't even documented, and yet it gets thrown when a member doesn't exist.
|
|
||||||
// so this method should hopefully clearly express that - and at least using exceptions for flow control *here*,
|
|
||||||
// removes the need to do the same in consumer code.
|
|
||||||
// god I hate this.
|
|
||||||
return await guild.GetMemberAsync(userId).ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
catch (NotFoundException)
|
|
||||||
{
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Normalizes a <see cref="DiscordGuild" /> so that the internal client is assured to be a specified value.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="guild">The <see cref="DiscordGuild" /> to normalize.</param>
|
|
||||||
/// <param name="client">The target client.</param>
|
|
||||||
/// <returns>
|
|
||||||
/// A <see cref="DiscordGuild" /> whose public values will match <paramref name="guild" />, but whose internal client is
|
|
||||||
/// <paramref name="client" />.
|
|
||||||
/// </returns>
|
|
||||||
/// <exception cref="ArgumentNullException">
|
|
||||||
/// <para><paramref name="guild" /> is <see langword="null" /></para>
|
|
||||||
/// -or-
|
|
||||||
/// <para><paramref name="client" /> is <see langword="null" /></para>
|
|
||||||
/// </exception>
|
|
||||||
public static async Task<DiscordGuild> NormalizeClientAsync(this DiscordGuild guild, DiscordClient client)
|
|
||||||
{
|
|
||||||
if (guild is null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException(nameof(guild));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (client is null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException(nameof(client));
|
|
||||||
}
|
|
||||||
|
|
||||||
return await client.GetGuildAsync(guild.Id).ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,63 +0,0 @@
|
|||||||
using DSharpPlus;
|
|
||||||
using DSharpPlus.Entities;
|
|
||||||
|
|
||||||
namespace X10D.DSharpPlus;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Extension methods for <see cref="DiscordMember" />.
|
|
||||||
/// </summary>
|
|
||||||
public static class DiscordMemberExtensions
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Returns a value indicating whether this member has the specified role.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="member">The member whose roles to search.</param>
|
|
||||||
/// <param name="role">The role for which to check.</param>
|
|
||||||
/// <returns>
|
|
||||||
/// <see langword="true" /> if <paramref name="member" /> has the role; otherwise, <see langword="false" />.
|
|
||||||
/// </returns>
|
|
||||||
public static bool HasRole(this DiscordMember member, DiscordRole role)
|
|
||||||
{
|
|
||||||
if (member is null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException(nameof(member));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (role is null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException(nameof(role));
|
|
||||||
}
|
|
||||||
|
|
||||||
return member.Roles.Contains(role);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Normalizes a <see cref="DiscordMember" /> so that the internal client is assured to be a specified value.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="member">The <see cref="DiscordMember" /> to normalize.</param>
|
|
||||||
/// <param name="client">The target client.</param>
|
|
||||||
/// <returns>
|
|
||||||
/// A <see cref="DiscordMember" /> whose public values will match <paramref name="member" />, but whose internal client
|
|
||||||
/// is <paramref name="client" />.
|
|
||||||
/// </returns>
|
|
||||||
/// <exception cref="ArgumentNullException">
|
|
||||||
/// <para><paramref name="member" /> is <see langword="null" /></para>
|
|
||||||
/// -or-
|
|
||||||
/// <para><paramref name="client" /> is <see langword="null" /></para>
|
|
||||||
/// </exception>
|
|
||||||
public static async Task<DiscordMember> NormalizeClientAsync(this DiscordMember member, DiscordClient client)
|
|
||||||
{
|
|
||||||
if (member is null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException(nameof(member));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (client is null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException(nameof(client));
|
|
||||||
}
|
|
||||||
|
|
||||||
DiscordGuild guild = await member.Guild.NormalizeClientAsync(client).ConfigureAwait(false);
|
|
||||||
return await guild.GetMemberAsync(member.Id).ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,76 +0,0 @@
|
|||||||
using DSharpPlus;
|
|
||||||
using DSharpPlus.Entities;
|
|
||||||
|
|
||||||
namespace X10D.DSharpPlus;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Extension methods for <see cref="DiscordMessage" />.
|
|
||||||
/// </summary>
|
|
||||||
public static class DiscordMessageExtensions
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Deletes this message after a specified delay.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="message">The message to delete.</param>
|
|
||||||
/// <param name="delay">The delay before deletion.</param>
|
|
||||||
/// <param name="reason">The reason for the deletion.</param>
|
|
||||||
/// <exception cref="ArgumentNullException"><paramref name="message" /> is <see langword="null" />.</exception>
|
|
||||||
public static async Task DeleteAfterAsync(this DiscordMessage message, TimeSpan delay, string? reason = null)
|
|
||||||
{
|
|
||||||
if (message is null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException(nameof(message));
|
|
||||||
}
|
|
||||||
|
|
||||||
await Task.Delay(delay).ConfigureAwait(false);
|
|
||||||
await message.DeleteAsync(reason).ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Deletes the message as created by this task after a specified delay.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="task">The task whose <see cref="DiscordMessage" /> result should be deleted.</param>
|
|
||||||
/// <param name="delay">The delay before deletion.</param>
|
|
||||||
/// <param name="reason">The reason for the deletion.</param>
|
|
||||||
/// <exception cref="ArgumentNullException"><paramref name="task" /> is <see langword="null" />.</exception>
|
|
||||||
public static async Task DeleteAfterAsync(this Task<DiscordMessage> task, TimeSpan delay, string? reason = null)
|
|
||||||
{
|
|
||||||
if (task is null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException(nameof(task));
|
|
||||||
}
|
|
||||||
|
|
||||||
DiscordMessage message = await task.ConfigureAwait(false);
|
|
||||||
await message.DeleteAfterAsync(delay, reason).ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Normalizes a <see cref="DiscordMessage" /> so that the internal client is assured to be a specified value.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="message">The <see cref="DiscordMessage" /> to normalize.</param>
|
|
||||||
/// <param name="client">The target client.</param>
|
|
||||||
/// <returns>
|
|
||||||
/// A <see cref="DiscordMessage" /> whose public values will match <paramref name="message" />, but whose internal client
|
|
||||||
/// is <paramref name="client" />.
|
|
||||||
/// </returns>
|
|
||||||
/// <exception cref="ArgumentNullException">
|
|
||||||
/// <para><paramref name="message" /> is <see langword="null" /></para>
|
|
||||||
/// -or-
|
|
||||||
/// <para><paramref name="client" /> is <see langword="null" /></para>
|
|
||||||
/// </exception>
|
|
||||||
public static async Task<DiscordMessage> NormalizeClientAsync(this DiscordMessage message, DiscordClient client)
|
|
||||||
{
|
|
||||||
if (message is null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException(nameof(message));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (client is null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException(nameof(client));
|
|
||||||
}
|
|
||||||
|
|
||||||
DiscordChannel channel = await message.Channel.NormalizeClientAsync(client).ConfigureAwait(false);
|
|
||||||
return await channel.GetMessageAsync(message.Id).ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,145 +0,0 @@
|
|||||||
using DSharpPlus;
|
|
||||||
using DSharpPlus.Entities;
|
|
||||||
using DSharpPlus.Exceptions;
|
|
||||||
|
|
||||||
namespace X10D.DSharpPlus;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Extension methods for <see cref="DiscordUser" />.
|
|
||||||
/// </summary>
|
|
||||||
public static class DiscordUserExtensions
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Returns the current <see cref="DiscordUser" /> as a member of the specified guild.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="user">The user to transform.</param>
|
|
||||||
/// <param name="guild">The guild whose member list to search.</param>
|
|
||||||
/// <returns>
|
|
||||||
/// A <see cref="DiscordMember" /> whose <see cref="DiscordMember.Guild" /> is equal to <paramref name="guild" />, or
|
|
||||||
/// <see langword="null" /> if this user is not in the specified <paramref name="guild" />.
|
|
||||||
/// </returns>
|
|
||||||
/// <exception cref="ArgumentNullException">
|
|
||||||
/// <para><paramref name="user" /> is <see langword="null" />.</para>
|
|
||||||
/// -or-
|
|
||||||
/// <para><paramref name="guild" /> is <see langword="null" />.</para>
|
|
||||||
/// </exception>
|
|
||||||
public static async Task<DiscordMember?> GetAsMemberOfAsync(this DiscordUser user, DiscordGuild guild)
|
|
||||||
{
|
|
||||||
if (user is null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException(nameof(user));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (guild is null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException(nameof(guild));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (user is DiscordMember member && member.Guild == guild)
|
|
||||||
{
|
|
||||||
return member;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (guild.Members.TryGetValue(user.Id, out member!))
|
|
||||||
{
|
|
||||||
return member;
|
|
||||||
}
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
return await guild.GetMemberAsync(user.Id).ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
catch (NotFoundException)
|
|
||||||
{
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Returns the user's username with the discriminator, in the format <c>username#discriminator</c>.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="user">The user whose username and discriminator to retrieve.</param>
|
|
||||||
/// <returns>A string in the format <c>username#discriminator</c></returns>
|
|
||||||
/// <exception cref="ArgumentNullException"><paramref name="user" /> is <see langword="null" />.</exception>
|
|
||||||
public static string GetUsernameWithDiscriminator(this DiscordUser user)
|
|
||||||
{
|
|
||||||
if (user is null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException(nameof(user));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (user.Discriminator == "0")
|
|
||||||
{
|
|
||||||
// user has a new username. see: https://discord.com/blog/usernames
|
|
||||||
return user.Username;
|
|
||||||
}
|
|
||||||
|
|
||||||
return $"{user.Username}#{user.Discriminator}";
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Returns a value indicating whether the current user is in the specified guild.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="user">The user to check.</param>
|
|
||||||
/// <param name="guild">The guild whose member list to search.</param>
|
|
||||||
/// <returns>
|
|
||||||
/// <see langword="true" /> if <paramref name="user" /> is a member of <paramref name="guild" />; otherwise,
|
|
||||||
/// <see langword="false" />.
|
|
||||||
/// </returns>
|
|
||||||
public static async Task<bool> IsInGuildAsync(this DiscordUser user, DiscordGuild guild)
|
|
||||||
{
|
|
||||||
if (user is null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException(nameof(user));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (guild is null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException(nameof(guild));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (guild.Members.TryGetValue(user.Id, out _))
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
DiscordMember? member = await guild.GetMemberAsync(user.Id).ConfigureAwait(false);
|
|
||||||
return member is not null;
|
|
||||||
}
|
|
||||||
catch (NotFoundException)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Normalizes a <see cref="DiscordUser" /> so that the internal client is assured to be a specified value.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="user">The <see cref="DiscordUser" /> to normalize.</param>
|
|
||||||
/// <param name="client">The target client.</param>
|
|
||||||
/// <returns>
|
|
||||||
/// A <see cref="DiscordUser" /> whose public values will match <paramref name="user" />, but whose internal client is
|
|
||||||
/// <paramref name="client" />.
|
|
||||||
/// </returns>
|
|
||||||
/// <exception cref="ArgumentNullException">
|
|
||||||
/// <para><paramref name="user" /> is <see langword="null" /></para>
|
|
||||||
/// -or-
|
|
||||||
/// <para><paramref name="client" /> is <see langword="null" /></para>
|
|
||||||
/// </exception>
|
|
||||||
public static async Task<DiscordUser> NormalizeClientAsync(this DiscordUser user, DiscordClient client)
|
|
||||||
{
|
|
||||||
if (user is null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException(nameof(user));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (client is null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException(nameof(client));
|
|
||||||
}
|
|
||||||
|
|
||||||
return await client.GetUserAsync(user.Id).ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,329 +0,0 @@
|
|||||||
using System.Globalization;
|
|
||||||
|
|
||||||
namespace X10D.DSharpPlus;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Provides methods for encoding and decoding Discord mention strings.
|
|
||||||
/// </summary>
|
|
||||||
/// <remarks>
|
|
||||||
/// The implementations in this class are designed to resemble <c>MentionUtils</c> as provided by Discord.NET. The source is
|
|
||||||
/// available
|
|
||||||
/// <a href="https://github.com/discord-net/Discord.Net/blob/dev/src/Discord.Net.Core/Utils/MentionUtils.cs">
|
|
||||||
/// here
|
|
||||||
/// </a>.
|
|
||||||
/// </remarks>
|
|
||||||
public static class MentionUtility
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Returns a channel mention string built from the specified channel ID.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="id">The ID of the channel to mention.</param>
|
|
||||||
/// <returns>A channel mention string in the format <c><#123></c>.</returns>
|
|
||||||
public static string MentionChannel(decimal id)
|
|
||||||
{
|
|
||||||
return $"<#{id:N0}>";
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Returns a channel mention string built from the specified channel ID.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="id">The ID of the channel to mention.</param>
|
|
||||||
/// <returns>A channel mention string in the format <c><#123></c>.</returns>
|
|
||||||
[CLSCompliant(false)]
|
|
||||||
public static string MentionChannel(ulong id)
|
|
||||||
{
|
|
||||||
return $"<#{id}>";
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Returns a role mention string built from the specified channel ID.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="id">The ID of the role to mention.</param>
|
|
||||||
/// <returns>A role mention string in the format <c><@&123></c>.</returns>
|
|
||||||
public static string MentionRole(decimal id)
|
|
||||||
{
|
|
||||||
return $"<@&{id:N0}>";
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Returns a role mention string built from the specified role ID.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="id">The ID of the role to mention.</param>
|
|
||||||
/// <returns>A role mention string in the format <c><@&123></c>.</returns>
|
|
||||||
[CLSCompliant(false)]
|
|
||||||
public static string MentionRole(ulong id)
|
|
||||||
{
|
|
||||||
return $"<@&{id}>";
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Returns a user mention string built from the specified user ID.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="id">The ID of the user to mention.</param>
|
|
||||||
/// <returns>A user mention string in the format <c><@123></c>.</returns>
|
|
||||||
[CLSCompliant(false)]
|
|
||||||
public static string MentionUser(decimal id)
|
|
||||||
{
|
|
||||||
return MentionUser(id, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Returns a user mention string built from the specified user ID.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="id">The ID of the user to mention.</param>
|
|
||||||
/// <param name="nickname">
|
|
||||||
/// <see langword="true" /> if the mention string should account for nicknames; otherwise, <see langword="false" />.
|
|
||||||
/// </param>
|
|
||||||
/// <returns>
|
|
||||||
/// A user mention string in the format <c><@!123></c> if <paramref name="nickname" /> is <see langword="true" />,
|
|
||||||
/// or in the format <c><@123></c> if <paramref name="nickname" /> is <see langword="false" />.
|
|
||||||
/// </returns>
|
|
||||||
[CLSCompliant(false)]
|
|
||||||
public static string MentionUser(decimal id, bool nickname)
|
|
||||||
{
|
|
||||||
return nickname ? $"<@!{id:N0}>" : $"<@{id:N0}>";
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Returns a user mention string built from the specified user ID.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="id">The ID of the user to mention.</param>
|
|
||||||
/// <returns>A user mention string in the format <c><@123></c>.</returns>
|
|
||||||
[CLSCompliant(false)]
|
|
||||||
public static string MentionUser(ulong id)
|
|
||||||
{
|
|
||||||
return MentionUser(id, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Returns a user mention string built from the specified user ID.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="id">The ID of the user to mention.</param>
|
|
||||||
/// <param name="nickname">
|
|
||||||
/// <see langword="true" /> if the mention string should account for nicknames; otherwise, <see langword="false" />.
|
|
||||||
/// </param>
|
|
||||||
/// <returns>
|
|
||||||
/// A user mention string in the format <c><@!123></c> if <paramref name="nickname" /> is <see langword="true" />,
|
|
||||||
/// or in the format <c><@123></c> if <paramref name="nickname" /> is <see langword="false" />.
|
|
||||||
/// </returns>
|
|
||||||
[CLSCompliant(false)]
|
|
||||||
public static string MentionUser(ulong id, bool nickname)
|
|
||||||
{
|
|
||||||
return nickname ? $"<@!{id}>" : $"<@{id}>";
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Parses a provided channel mention string to a decimal value representing the channel ID. A return value indicates
|
|
||||||
/// whether the parse succeeded.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="value">A string containing a mention string to parse, in the format <c><#123></c>.</param>
|
|
||||||
/// <param name="result">
|
|
||||||
/// When this method returns, contains the decimal value representing the channel ID contained within
|
|
||||||
/// <paramref name="value" />, if the conversion succeeded, or zero if the conversion failed. The conversion fails if the
|
|
||||||
/// <paramref name="value" /> parameter is <see langword="null" /> or <see cref="string.Empty" />, is not of the correct
|
|
||||||
/// format, or represents a number less than <see cref="ulong.MinValue" /> or greater than <see cref="ulong.MaxValue" />.
|
|
||||||
/// </param>
|
|
||||||
/// <returns><see langword="true" /> if the parse was successful; otherwise, <see langword="false" />.</returns>
|
|
||||||
public static bool TryParseChannel(string? value, out decimal result)
|
|
||||||
{
|
|
||||||
result = 0;
|
|
||||||
if (string.IsNullOrWhiteSpace(value))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (value.Length < 3 || value[0] != '<' || value[1] != '#' || value[^1] != '>')
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
value = value.Substring(2, value.Length - 3); // <#123>
|
|
||||||
if (!ulong.TryParse(value, NumberStyles.None, CultureInfo.InvariantCulture, out ulong actual))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
result = actual;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Parses a provided channel mention string to a 64-bit unsigned integer representing the channel ID. A return value
|
|
||||||
/// indicates whether the parse succeeded.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="value">A string containing a mention string to parse, in the format <c><#123></c>.</param>
|
|
||||||
/// <param name="result">
|
|
||||||
/// When this method returns, contains the 64-bit unsigned integer value representing the channel ID contained within
|
|
||||||
/// <paramref name="value" />, if the conversion succeeded, or zero if the conversion failed. The conversion fails if the
|
|
||||||
/// <paramref name="value" /> parameter is <see langword="null" /> or <see cref="string.Empty" />, is not of the correct
|
|
||||||
/// format, or represents a number less than <see cref="ulong.MinValue" /> or greater than <see cref="ulong.MaxValue" />.
|
|
||||||
/// </param>
|
|
||||||
/// <returns><see langword="true" /> if the parse was successful; otherwise, <see langword="false" />.</returns>
|
|
||||||
[CLSCompliant(false)]
|
|
||||||
public static bool TryParseChannel(string? value, out ulong result)
|
|
||||||
{
|
|
||||||
result = 0;
|
|
||||||
if (string.IsNullOrWhiteSpace(value))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (value.Length < 3 || value[0] != '<' || value[1] != '#' || value[^1] != '>')
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
value = value.Substring(2, value.Length - 3); // <#123>
|
|
||||||
return ulong.TryParse(value, NumberStyles.None, CultureInfo.InvariantCulture, out result);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Parses a provided role mention string to a decimal value representing the role ID. A return value indicates whether
|
|
||||||
/// the parse succeeded.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="value">A string containing a mention string to parse, in the format <c><@&123></c>.</param>
|
|
||||||
/// <param name="result">
|
|
||||||
/// When this method returns, contains the decimal value representing the role ID contained within
|
|
||||||
/// <paramref name="value" />, if the conversion succeeded, or zero if the conversion failed. The conversion fails if the
|
|
||||||
/// <paramref name="value" /> parameter is <see langword="null" /> or <see cref="string.Empty" />, is not of the correct
|
|
||||||
/// format, or represents a number less than <see cref="ulong.MinValue" /> or greater than <see cref="ulong.MaxValue" />.
|
|
||||||
/// </param>
|
|
||||||
/// <returns><see langword="true" /> if the parse was successful; otherwise, <see langword="false" />.</returns>
|
|
||||||
public static bool TryParseRole(string? value, out decimal result)
|
|
||||||
{
|
|
||||||
result = 0;
|
|
||||||
if (string.IsNullOrWhiteSpace(value))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (value.Length < 4 || value[0] != '<' || value[1] != '@' || value[2] != '&' || value[^1] != '>')
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
value = value.Substring(3, value.Length - 4); // <@&123>
|
|
||||||
if (!ulong.TryParse(value, NumberStyles.None, CultureInfo.InvariantCulture, out ulong actual))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
result = actual;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Parses a provided role mention string to a 64-bit unsigned integer representing the role ID. A return value indicates
|
|
||||||
/// whether the parse succeeded.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="value">A string containing a mention string to parse, in the format <c><@&123></c>.</param>
|
|
||||||
/// <param name="result">
|
|
||||||
/// When this method returns, contains the 64-bit unsigned integer value representing the role ID contained within
|
|
||||||
/// <paramref name="value" />, if the conversion succeeded, or zero if the conversion failed. The conversion fails if the
|
|
||||||
/// <paramref name="value" /> parameter is <see langword="null" /> or <see cref="string.Empty" />, is not of the correct
|
|
||||||
/// format, or represents a number less than <see cref="ulong.MinValue" /> or greater than <see cref="ulong.MaxValue" />.
|
|
||||||
/// </param>
|
|
||||||
/// <returns><see langword="true" /> if the parse was successful; otherwise, <see langword="false" />.</returns>
|
|
||||||
[CLSCompliant(false)]
|
|
||||||
public static bool TryParseRole(string? value, out ulong result)
|
|
||||||
{
|
|
||||||
result = 0;
|
|
||||||
if (string.IsNullOrWhiteSpace(value))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (value.Length < 4 || value[0] != '<' || value[1] != '@' || value[2] != '&' || value[^1] != '>')
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
value = value.Substring(3, value.Length - 4); // <@&123>
|
|
||||||
return ulong.TryParse(value, NumberStyles.None, CultureInfo.InvariantCulture, out result);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Parses a provided user mention string to a decimal value representing the user ID. A return value indicates whether
|
|
||||||
/// the parse succeeded.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="value">
|
|
||||||
/// A string containing a mention string to parse, in the format <c><@123></c> or <c><@!123></c>.
|
|
||||||
/// </param>
|
|
||||||
/// <param name="result">
|
|
||||||
/// When this method returns, contains the decimal value representing the user ID contained within
|
|
||||||
/// <paramref name="value" />, if the conversion succeeded, or zero if the conversion failed. The conversion fails if the
|
|
||||||
/// <paramref name="value" /> parameter is <see langword="null" /> or <see cref="string.Empty" />, is not of the correct
|
|
||||||
/// format, or represents a number less than <see cref="ulong.MinValue" /> or greater than <see cref="ulong.MaxValue" />.
|
|
||||||
/// </param>
|
|
||||||
/// <returns><see langword="true" /> if the parse was successful; otherwise, <see langword="false" />.</returns>
|
|
||||||
public static bool TryParseUser(string? value, out decimal result)
|
|
||||||
{
|
|
||||||
result = 0;
|
|
||||||
if (string.IsNullOrWhiteSpace(value))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (value.Length < 3 || value[0] != '<' || value[1] != '@' || value[^1] != '>')
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (value.Length >= 4 && value[2] == '!')
|
|
||||||
{
|
|
||||||
value = value.Substring(3, value.Length - 4); // <@!123>
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
value = value.Substring(2, value.Length - 3); // <@123>
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!ulong.TryParse(value, NumberStyles.None, CultureInfo.InvariantCulture, out ulong actual))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
result = actual;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Parses a provided user mention string to a 64-bit unsigned integer representing the user ID. A return value indicates
|
|
||||||
/// whether the parse succeeded.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="value">
|
|
||||||
/// A string containing a mention string to parse, in the format <c><@123></c> or <c><@!123></c>.
|
|
||||||
/// </param>
|
|
||||||
/// <param name="result">
|
|
||||||
/// When this method returns, contains the 64-bit unsigned integer value representing the user ID contained within
|
|
||||||
/// <paramref name="value" />, if the conversion succeeded, or zero if the conversion failed. The conversion fails if the
|
|
||||||
/// <paramref name="value" /> parameter is <see langword="null" /> or <see cref="string.Empty" />, is not of the correct
|
|
||||||
/// format, or represents a number less than <see cref="ulong.MinValue" /> or greater than <see cref="ulong.MaxValue" />.
|
|
||||||
/// </param>
|
|
||||||
/// <returns><see langword="true" /> if the parse was successful; otherwise, <see langword="false" />.</returns>
|
|
||||||
[CLSCompliant(false)]
|
|
||||||
public static bool TryParseUser(string? value, out ulong result)
|
|
||||||
{
|
|
||||||
result = 0;
|
|
||||||
if (string.IsNullOrWhiteSpace(value))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (value.Length < 3 || value[0] != '<' || value[1] != '@' || value[^1] != '>')
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (value.Length >= 4 && value[2] == '!')
|
|
||||||
{
|
|
||||||
value = value.Substring(3, value.Length - 4); // <@!123>
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
value = value.Substring(2, value.Length - 3); // <@123>
|
|
||||||
}
|
|
||||||
|
|
||||||
return ulong.TryParse(value, NumberStyles.None, CultureInfo.InvariantCulture, out result);
|
|
||||||
}
|
|
||||||
}
|
|
6
X10D.sln
6
X10D.sln
@ -25,8 +25,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "X10D.Unity", "X10D.Unity\X1
|
|||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SourceGenerator", "tools\SourceGenerator\SourceGenerator.csproj", "{077A5D33-AD55-4C55-8A67-972CEBC32C7A}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SourceGenerator", "tools\SourceGenerator\SourceGenerator.csproj", "{077A5D33-AD55-4C55-8A67-972CEBC32C7A}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "X10D.DSharpPlus", "X10D.DSharpPlus\X10D.DSharpPlus.csproj", "{675D3B25-7EA0-4FC3-B513-8DF27874F2CF}"
|
|
||||||
EndProject
|
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "X10D.Hosting", "X10D.Hosting\X10D.Hosting.csproj", "{B04AF429-30CF-4B69-81BA-38F560CA9126}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "X10D.Hosting", "X10D.Hosting\X10D.Hosting.csproj", "{B04AF429-30CF-4B69-81BA-38F560CA9126}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Workflows", "Workflows", "{1FC74E58-F3BA-4F1A-8693-5F80895DA69D}"
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Workflows", "Workflows", "{1FC74E58-F3BA-4F1A-8693-5F80895DA69D}"
|
||||||
@ -79,10 +77,6 @@ Global
|
|||||||
{077A5D33-AD55-4C55-8A67-972CEBC32C7A}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{077A5D33-AD55-4C55-8A67-972CEBC32C7A}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{077A5D33-AD55-4C55-8A67-972CEBC32C7A}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{077A5D33-AD55-4C55-8A67-972CEBC32C7A}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{077A5D33-AD55-4C55-8A67-972CEBC32C7A}.Release|Any CPU.Build.0 = Release|Any CPU
|
{077A5D33-AD55-4C55-8A67-972CEBC32C7A}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
{675D3B25-7EA0-4FC3-B513-8DF27874F2CF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{675D3B25-7EA0-4FC3-B513-8DF27874F2CF}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{675D3B25-7EA0-4FC3-B513-8DF27874F2CF}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{675D3B25-7EA0-4FC3-B513-8DF27874F2CF}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{B04AF429-30CF-4B69-81BA-38F560CA9126}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{B04AF429-30CF-4B69-81BA-38F560CA9126}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{B04AF429-30CF-4B69-81BA-38F560CA9126}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{B04AF429-30CF-4B69-81BA-38F560CA9126}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{B04AF429-30CF-4B69-81BA-38F560CA9126}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{B04AF429-30CF-4B69-81BA-38F560CA9126}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
Loading…
Reference in New Issue
Block a user