Время ожидания готового обработчика события - PullRequest
1 голос
/ 16 января 2020

В настоящее время я работаю над ботом Discord, написанным на C#. Предполагается отметить день рождения пользователей на сервере после того, как они отправили сообщение, указав свой день и месяц рождения (пары пользователя и дня рождения хранятся в локальном файле .txt). День рождения отмечается отправкой встраивания в основной канал гильдии (с которым он использует параметр ID), если датой выполнения считается чей-то день рождения.

Содержимое обработчика события Ready Элемент DiscordSocketClient в классе Program и частичный стек вызовов показаны ниже:

    public DiscordSocketClient Client;
    //...
    private async Task Client_Ready()
    {
        await Commands.CelebrateUsers(Client);
    }

также

    public static async Task CelebrateUsers(DiscordSocketClient client)
    {
        DateTime now = DateTime.Now;
        List<ulong> users = new List<ulong>();
        using (StreamReader reader = new StreamReader(@"docs\birthdays.txt"))
        {
            string date;
            ulong user;
            while ((date = reader.ReadLine()) != null)
            {
                user = Convert.ToUInt64(reader.ReadLine());
                int[] dm = date.Split(' ').Select(x=>Convert.ToInt32(x)).ToArray();
                if(now.Day == dm[0] && now.Month == dm[1])
                {
                    foreach(SocketGuild g in client.Guilds)
                    {
                        if(g.Users.FirstOrDefault(x=>x.Id == user) != null)
                             await CelebrateUser(user, g);
                    }
                }
            }
        }
    }

    private static async Task CelebrateUser(ulong id, SocketGuild guild)
    {
        var embed = new EmbedBuilder()
        {
            Title = "Auguri ",
            Color = Discord.Color.Green,
            ThumbnailUrl = "https://c7.uihere.com/files/240/249/186/hot-air-balloon-birthday-balloon.jpg",
            ImageUrl = guild.GetUser(id).GetAvatarUrl(size:900),
            Footer =
            {
                IconUrl = "https://cdn.discordapp.com/avatars/406195350903193600/9629b569007720204f7fe775a9be0aeb.png",
                Text = "Generato da DrKikkoCeccato++."
            },
            Timestamp = DateTimeOffset.Now
        };
        await guild.DefaultChannel.SendMessageAsync("",embed:embed.Build());
    }

Однако у меня возникла проблема с последней функцией. Последний фрагмент кода (часть «SendMessageAsyn c») даже не вызывается. После инициализации встраивания событие Log для DiscordSocketClient запускается со следующими записями:

«Обработчик готовности блокирует задачу шлюза.»

«Обработчик готовности выдал необработанное исключение.»

Сразу после этого состояние меняется на «Готово». Излишне говорить, что мой код не отправляется. Я не понимаю, в чем может быть проблема, поскольку каждое действие помечается как «асинхронное» (во избежание проблем с 3-секундным таймаутом события «Готово»). Кто-нибудь может мне помочь? Заранее спасибо.

...