DSharpPlus Command-Registration mit Sharding?

Moin Moin.

Ich habe Sharding implementiert und wollte meine Slash-Commands zu Testzwecken erstmal auf einer speziellen Guilde registrieren.

Das Problem ist, dass sich die Commands nur global registrieren lassen. (Sie werden zwar in Discord angezeigt, werfen beim Ausführen allerdings einen Fehler "Error while executing command: A slash command was executed, but no command was registered for it.")

Hier der wesentliche Code:

public class BotBackgroundService : BackgroundService
{
    private readonly InteractionManager _interactionManager;
    private readonly DiscordShardedClient _client;
    private IReadOnlyDictionary<int, SlashCommandsExtension> _slashCommands;
    private readonly DiscordConfig _config;
    private readonly Logger _logger;
    private readonly IServiceScopeFactory _scopeFactory;
    private bool _isRunning => _executingTask != null && !_executingTask.IsCompleted;
    public bool IsRunning
    {
        get => _isRunning;
        private set { }
    }


    private CancellationTokenSource _internalCancellationTokenSource;
    private Task _executingTask;


    public BotBackgroundService(IOptions<DiscordConfig> config, DiscordShardedClient discordClient, Logger logger, IServiceProvider serviceProvider, IServiceScopeFactory scopeFactory)
    {
        _config = config.Value;
        _client = discordClient;
        _interactionManager = new InteractionManager();
        Setup(serviceProvider).Wait();
        _logger = logger;
        _internalCancellationTokenSource = new CancellationTokenSource();
        _scopeFactory = scopeFactory;
    }
    public async Task Setup(IServiceProvider serviceProvider)
    {
        _slashCommands = await _client.UseSlashCommandsAsync(new SlashCommandsConfiguration
        {
            Services = serviceProvider
        });
    }


    protected override Task ExecuteAsync(CancellationToken stoppingToken)
    {
        _executingTask = RunBotAsync(_internalCancellationTokenSource.Token);


        return _executingTask.IsCompleted ? _executingTask : Task.CompletedTask;
    }


    private async Task RunBotAsync(CancellationToken internalToken)
    {
        await _logger.Log("Discord Bot is starting...", Logger.LogPriority.Info);




        foreach (var cmd in _slashCommands.Values)
        {
            cmd.RegisterCommands<AdminCommands>(_config.MainServerId);
            cmd.RegisterCommands<BaseCommands>(_config.MainServerId);


            cmd.SlashCommandErrored += async (s, e) =>
            {
                if (e.Exception is SlashExecutionChecksFailedException slex)
                {
                    foreach (var check in slex.FailedChecks)
                        if (check is OnlyTeam att)
                            await e.Context.CreateResponseAsync(InteractionResponseType.ChannelMessageWithSource, new DiscordInteractionResponseBuilder().WithContent($"Only team members can run this command!").AsEphemeral());
                }


                await _logger.Log($"Error while executing command: {e.Exception.Message}", Logger.LogPriority.Error);
            };
        }


        await _client.StartAsync();


        try
        {
            await Task.Delay(-1, internalToken);
        }
        catch (TaskCanceledException)
        {
            await _logger.Log("Discord Bot internal shutdown.", Logger.LogPriority.Info);
        }
        finally
        {
            await _client.StopAsync();
        }
    }


    public override async Task StopAsync(CancellationToken stoppingToken)
    {
        if (_executingTask == null) return;


        _internalCancellationTokenSource.Cancel();


        await Task.WhenAny(_executingTask, Task.Delay(-1, stoppingToken));


        await base.StopAsync(stoppingToken);
    }
}

Die Ressourcen zu DSharpPlus sind dahingehend etwas beschränkt. Habe dazu leider nicht viel gefunden.

Ich habe schon probiert, die Commands auf die Shards zu registrieren. Hat leider nicht funktioniert.

C Sharp, Code, Visual Studio, Discord, Discord Bot
Ist diese Beschleunigungs-Rechnung richtig?

Hi. Ich habe mich mal spaßeshalber an eine Physikaufgabe gesetzt und bin mir nicht ganz sicher, ob ich diese richtig gerechnet habe.

Hier einmal die Aufgabenstellung:
Bei einer wissenschaftlichen Untersuchung beschleunigte ein Wanderfalke, der auf einer Höhe von 372 m flog, von 40km/h, um nach 16 Sekunden eine Taube auf einer Höhe von 38m über dem Erdboden zu schlagen. Die horizontale Distanz zwischen den Messpunkten betrug dabei 702m.

a) Berechne die mittlere Beschleunigung des Wanderfalken während seines Sturzfluges.
Hier einmal meine Rechnung:

Ich habe zur Überprüfung auch noch einmal ChatGPT gefragt.
Die Lösung von ChatGPT und mir stimmen nicht überein.
Hier der Lösungsansatz von ChatGPT:

Zunächst müssen wir die Endgeschwindigkeit des Wanderfalken berechnen, wenn er die Taube schlägt. Wir können die kinematische Gleichung verwenden:

v_f^2 = v_i^2 + 2ad

wobei v_f die Endgeschwindigkeit ist, v_i die Anfangsgeschwindigkeit, a die mittlere Beschleunigung und d die Entfernung zwischen den Messpunkten.

Da der Wanderfalke von 40 km/h auf Null beschleunigt, ist seine Anfangsgeschwindigkeit v_i = 40 km/h = 11.11 m/s. Die Entfernung zwischen den Messpunkten ist d = 702 m. Wir setzen diese Werte in die Gleichung ein und lösen nach v_f auf:

v_f^2 = (11.11 m/s)^2 + 2a(702 m)
v_f^2 = 123.21 m^2/s^2 + 1404a
v_f^2 - 1404a = 123.21 m^2/s^2
v_f^2 = 123.21 m^2/s^2 + 1404a
v_f = sqrt(123.21 m^2/s^2 + 1404a)

Als nächstes müssen wir die Zeit berechnen, die der Wanderfalke benötigt hat, um von einer Höhe von 372 m auf eine Höhe von 38 m zu fallen. Wir können die kinematische Gleichung verwenden:

d = v_it + 0.5a*t^2

wobei d die Höhendifferenz, v_i die Anfangsgeschwindigkeit, a die mittlere Beschleunigung und t die Zeit ist. Da die Anfangsgeschwindigkeit des Wanderfalken Null ist, vereinfacht sich die Gleichung zu:

d = 0.5at^2

Wir setzen die Werte ein und lösen nach t auf:

334 m = 0.5a(16 s)^2 334 m = 128a a = 2.61 m/s^2

Schließlich können wir die mittlere Beschleunigung des Wanderfalken während des Sturzfluges berechnen, indem wir v_f und v_i sowie die Zeit, die der Wanderfalke benötigt hat, um von 372 m auf 38 m zu fallen, kennen:

a = (v_f - v_i) / t
a = (sqrt(123.21 m^2/s^2 + 1404a) - 11.11 m/s) / 16 s
a = (sqrt(123.21 m^2/s^2 + 1404*2.61 m/s^2) - 11.11 m/s) / 16 s
a = 9.81 m/s^2

Die mittlere Beschleunigung des Wanderfalken während seines Sturzfluges beträgt 9.81 m/s^2, was der Beschleunigung aufgrund der Schwerkraft entspricht.

Bild zum Beitrag
Bewegung, Schule, Mathematik, Geschwindigkeit, rechnen, Beschleunigung, Formel, Physik, Kinematik
Weitere Inhalte können nur Nutzer sehen, die bei uns eingeloggt sind.