В настоящее время я работаю над ботом 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-секундным таймаутом события «Готово»). Кто-нибудь может мне помочь? Заранее спасибо.