This repository has been archived on 2025-03-02. You can view files and clone it, but cannot push or open issues or pull requests.
Cassette/Cassette/Commands/TrustedCommandGroup.cs
mctaylors 4eba6f3b96
Add /repeat command
Signed-off-by: mctaylors <cantsendmails@mctaylors.ru>
2023-12-19 14:56:50 +03:00

135 lines
4.5 KiB
C#

using System.ComponentModel;
using Cassette.Extensions;
using JetBrains.Annotations;
using Lavalink4NET;
using Lavalink4NET.Players.Queued;
using Remora.Discord.Commands.Contexts;
using Remora.Commands.Attributes;
using Remora.Commands.Groups;
using Remora.Discord.API.Abstractions.Objects;
using Remora.Discord.Commands.Attributes;
using Remora.Discord.Commands.Feedback.Services;
using Remora.Discord.Extensions.Formatting;
using Remora.Results;
namespace Cassette.Commands;
/// <summary>
/// A <see cref="CommandGroup"/> that controls the music player and requires higher permissions.
/// <remarks>Trusted role support is not implemented yet.</remarks>
/// </summary>
public sealed class TrustedCommandGroup(
ICommandContext commandContext,
IAudioService audioService,
FeedbackService feedbackService) : CommandGroup
{
private const DiscordPermission RequiredPermission = DiscordPermission.MuteMembers;
[Command("repeat")]
[Description("Changes player repeat mode")]
[DiscordDefaultMemberPermissions(RequiredPermission)]
[DiscordDefaultDMPermission(false)]
[UsedImplicitly]
public async Task<Result> RepeatCommandAsync(
TrackRepeatMode mode)
{
var player = await LavalinkPlayer.GetPlayerAsync(
commandContext, audioService, feedbackService);
if (player is null)
{
return Result.FromSuccess();
}
if (player.RepeatMode is TrackRepeatMode.Queue
&& mode is not TrackRepeatMode.Queue)
{
var queue = player.Queue;
await queue.RemoveAsync(queue[^1]);
}
if (player.RepeatMode is not TrackRepeatMode.Queue
&& mode is TrackRepeatMode.Queue
&& player.CurrentTrack is not null)
{
await player.PlayAsync(player.CurrentTrack);
}
player.RepeatMode = mode;
return await feedbackService.SendContextualMessageResult(
$"Repeat mode is now set to {Markdown.Bold(mode.ToString())}",
feedbackService.Theme.Success);
}
[Command("setvolume")]
[Description("Adjusts the volume of the music player")]
[DiscordDefaultMemberPermissions(RequiredPermission)]
[DiscordDefaultDMPermission(false)]
[UsedImplicitly]
public async Task<Result> SetVolumeCommandAsync(
[MinValue(1)] [MaxValue(200)] float percentage)
{
var player = await LavalinkPlayer.GetPlayerAsync(
commandContext, audioService, feedbackService);
if (player is null)
{
return Result.FromSuccess();
}
var previousVolume = player.Volume / 100;
await player.SetVolumeAsync(percentage / 100);
return await feedbackService.SendContextualMessageResult(
$"Volume changed {Markdown.Bold($"{previousVolume}%")} to {Markdown.Bold($"{percentage}%")}",
feedbackService.Theme.Success);
}
[Command("stop")]
[Description("Stops the current track and clears the queue")]
[DiscordDefaultMemberPermissions(RequiredPermission)]
[DiscordDefaultDMPermission(false)]
[UsedImplicitly]
public async Task<Result> StopCommandAsync()
{
var player = await LavalinkPlayer.GetPlayerAsync(
commandContext, audioService, feedbackService);
if (player is null)
{
return Result.FromSuccess();
}
if (player.CurrentTrack is null)
{
return await feedbackService.SendContextualMessageResult(
"There's nothing playing right now.",
feedbackService.Theme.FaultOrDanger);
}
var track = player.CurrentTrack;
await player.StopAsync();
return await feedbackService.SendContextualMessageResult(
$"Stopped {track.Display()} and cleared the queue.", feedbackService.Theme.Success);
}
[Command("disconnect")]
[Description("Disconnects the bot and clears the queue")]
[DiscordDefaultMemberPermissions(RequiredPermission)]
[DiscordDefaultDMPermission(false)]
[UsedImplicitly]
public async Task<Result> DisconnectCommandAsync()
{
var player = await LavalinkPlayer.GetPlayerAsync(
commandContext, audioService, feedbackService);
if (player is null)
{
return Result.FromSuccess();
}
await player.DisconnectAsync();
return await feedbackService.SendContextualMessageResult(
"Disconnected.", feedbackService.Theme.Success);
}
}