Discord.Net SendMessageAsync без команды

Я делаю программу, которая большую часть времени работает без человека, сидящего перед компьютером. Я подумал, что было бы неплохо, если бы эта программа могла отправлять вам личное сообщение на Discord, если что-то случится, что нужно будет сделать вручную. Таким образом, Пользователь устанавливает свое имя и # номер в конфигурации, и программа отправляет сообщение этому человеку, если что-то происходит. Итак, я все настроил, и Discordbot работает, пока использует событие MessageRecced-Event. Я пробовал использовать Ready-Event, но это не сработало.

Мой стартовый код:

public async Task startDiscordBot(string DiscordName, string DiscordID, string DiscordMessage)
{
    _client = new DiscordSocketClient();

    setDiscordID(DiscordID); // Sets the #Number of the User
    setDiscordMessage(DiscordMessage); // Sets the Message to be send
    setDiscordName(DiscordName); // Sets the Name of the User

    await _client.LoginAsync(TokenType.Bot, Token);
    await _client.StartAsync();

    await Task.Delay(-1);
}

Изменить: Моя текущая функция выглядит примерно так:

public Task Notification() // not working
{
    DiscordSocketClient _client = new DiscordSocketClient();

    IUser user = _client.GetUser(Name, ID); // Get the User <--- Returns null
    MessageBox.Show($"{user}"); // For debug
    IDMChannel channel = (IDMChannel)user.GetOrCreateDMChannelAsync(); // Get a DM Channel
    channel.SendMessageAsync(Message); // Send a DM

    return Task.CompletedTask;
}

person CeadeusX    schedule 11.04.2021    source источник
comment
Пользовательские данные не всегда присутствуют в Ready. Также попробуйте users_" rel="nofol   -  person Xenohon    schedule 12.04.2021
comment
То, что у вас есть, будет работать , пока пользователь находится в кеше   -  person Anu6is    schedule 12.04.2021
comment
Как мне получить пользователя в кеше? Я также пробовал использовать GetOrCreateDMChannelAsync(), но GetUser каждый раз возвращает null. Я попытался подождать 60 секунд после запуска Ready-Event, я попытался подождать 5 минут после запуска бота. Каждый раз, когда _client.GetUser(Name,Number) возвращает ноль   -  person CeadeusX    schedule 12.04.2021


Ответы (1)


Я нашел Anwser. Прежде всего спасибо за помощь. Я смог немного сократить свой код.

public async Task startDiscordBot()
{
    await _client.LoginAsync(TokenType.Bot, Token);
    await _client.StartAsync();
}

public async Task Notification(string message) // Working
{
    IUser user = _client.GetUser(Name, ID); // Get the User (wait atleast 10sec after starting)
    var channel = await user.GetOrCreateDMChannelAsync(); // Get/Create a DM Channel
    await channel.SendMessageAsync(message); // Send a DM
}

Это не сработает ... ну, любое решение не будет работать, потому что вам нужно включить НАМЕРЕНИЕ ЧЛЕНОВ СЕРВЕРА на портале разработчиков Discord. Вы можете найти его в разделе Bot.

person CeadeusX    schedule 12.04.2021