From 8ecb4fe8c1550be2b8ff0d7c49cad6ae4d886174 Mon Sep 17 00:00:00 2001 From: Angelo Breuer Date: Sun, 21 Jan 2024 21:38:39 +0100 Subject: [PATCH] feat: Add player state preconditions --- .../Players/Preconditions/PlayerPrecondition.cs | 6 ++++++ .../Preconditions/PlayerStatePrecondition.cs | 17 +++++++++++++++++ .../Players/Preconditions/SimplePrecondition.cs | 2 +- 3 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 src/Lavalink4NET/Players/Preconditions/PlayerStatePrecondition.cs diff --git a/src/Lavalink4NET/Players/Preconditions/PlayerPrecondition.cs b/src/Lavalink4NET/Players/Preconditions/PlayerPrecondition.cs index 1d4f3519..05305547 100644 --- a/src/Lavalink4NET/Players/Preconditions/PlayerPrecondition.cs +++ b/src/Lavalink4NET/Players/Preconditions/PlayerPrecondition.cs @@ -31,4 +31,10 @@ public static IPlayerPrecondition All(ImmutableArray precon public static IPlayerPrecondition All(params IPlayerPrecondition[] preconditions) => new AggregateAllPrecondition(preconditions.ToImmutableArray()); + + public static IPlayerPrecondition Status(ImmutableArray states) + => new PlayerStatePrecondition(states); + + public static IPlayerPrecondition Status(params PlayerState[] states) + => new PlayerStatePrecondition(states.ToImmutableArray()); } diff --git a/src/Lavalink4NET/Players/Preconditions/PlayerStatePrecondition.cs b/src/Lavalink4NET/Players/Preconditions/PlayerStatePrecondition.cs new file mode 100644 index 00000000..c494ea7a --- /dev/null +++ b/src/Lavalink4NET/Players/Preconditions/PlayerStatePrecondition.cs @@ -0,0 +1,17 @@ +namespace Lavalink4NET.Players.Preconditions; + +using System; +using System.Collections.Immutable; +using System.Threading; +using System.Threading.Tasks; + +internal sealed record class PlayerStatePrecondition(ImmutableArray AllowedStates) : IPlayerPrecondition +{ + public ValueTask CheckAsync(ILavalinkPlayer player, CancellationToken cancellationToken = default) + { + cancellationToken.ThrowIfCancellationRequested(); + ArgumentNullException.ThrowIfNull(player); + + return new ValueTask(AllowedStates.Contains(player.State)); + } +} \ No newline at end of file diff --git a/src/Lavalink4NET/Players/Preconditions/SimplePrecondition.cs b/src/Lavalink4NET/Players/Preconditions/SimplePrecondition.cs index 184fb29d..ddbde6c3 100644 --- a/src/Lavalink4NET/Players/Preconditions/SimplePrecondition.cs +++ b/src/Lavalink4NET/Players/Preconditions/SimplePrecondition.cs @@ -13,4 +13,4 @@ public ValueTask CheckAsync(ILavalinkPlayer player, CancellationToken canc return new ValueTask(player.State == State); } -} \ No newline at end of file +}