如何在 Discord.NET 命令中调用 API?

问题描述

我在 discord Bot 中调用 API 时遇到问题,我正在尝试学习异步,等待,但似乎卡住了。

这是我调用 API 的调用 API 类。

public async Task<Root> GetInfoAsync()
    {
        string path = "https://onemocneni-aktualne.mzcr.cz/api/v2/covid-19/zakladni-prehled.json";
        Root data = null;
        HttpResponseMessage response = await client.GetAsync(path);
        if (response.IsSuccessstatusCode)
        {
            string json = await response.Content.ReadAsstringAsync();
            data = JsonConvert.DeserializeObject<Root>(json);
        }
        return data;
    }

    public async Task<string> VypisAsync()
    {
        Root data = await this.GetInfoAsync();
        int deaths = data.data[0].umrti,recovered = data.data[0].vyleceni,positive = data.data[0].aktivni_pripady,hospitalized = data.data[0].aktualne_hospitalizovani;
        return $"Aktualni situace v ČR:\n" +
               $"vyleceni: {recovered}\n"  +
               $"aktualne nemocni: {positive}\n" +
               $"hospitalizovani: {hospitalized}\n" +
               $"zemreli: {deaths}";
    }

这是我的 covid 命令

public class CovidModule : ModuleBase<SocketCommandContext>
{
    // ~void -> current covid situation in CZ
    [Command("covid")]
    [Summary("shows current covid situation in CZ")]
    public async Task<Task> CovidAsync()
    {
        CovidApi api = new CovidApi();
        return ReplyAsync(await api.VypisAsync());
    }
}

我知道所有其他命令都返回 Task,但我不知道如何让它变成那样。

解决方法

ReplyAsync() 是一个异步方法,所以你需要等待它。

您的 CovidAsync() 方法没有返回实际值,因此在同步世界中,它的返回值将是 void。由于它是一个异步方法,因此您返回 Task

public async Task CovidAsync()
{
    CovidApi api = new CovidApi();
    await ReplyAsync(await api.VypisAsync());
}

顺便说一句,最好让 CovidApi 作为您的 CovidModule 的成员。这样你就不需要在每个方法中不断更新它。