Почему мой бот не может отправлять пользователям приветственное сообщение? (Discord.net C#)

#c# #discord #discord.net

#c# #Discord #discord.net

Вопрос:

Последние несколько дней я работал над ботом discord, и мне удалось заставить работать одну из функций: (команда, которая задает сообщение, которое она должна отправлять пользователям dm при их присоединении). Кажется, я не могу заставить бота отправить фактическое сообщение.

     private async Task Join(SocketGuildUser UID)
    {
        if (UID.IsBot || UID.IsWebhook) return;
         Welcometxt= File.ReadAllText([FILE]);
        await UID.SendMessageAsync("Your Message Was Sucessfully set!");
    }
        private async Task HandleCommandAsync(SocketMessage arg)
    {
        var message = arg as SocketUserMessage;
        var context = new SocketCommandContext(_client, message);
        if (message.Author.IsBot) return;

        int argPos = 0;
        if (message.HasStringPrefix("!", ref argPos))
        {
            var result = await _commands.ExecuteAsync(context, argPos, _services);
            if (!result.IsSuccess) Console.WriteLine(result.ErrorReason);
        }
    }
 

Когда я проверяю журналы, он выдает ошибку нулевой ссылки с сообщением var и контекстом, я попытался найти ошибку в Google и изменить код, но безрезультатно какие-либо советы? Я считаю, что ошибка в одном из этих двух методов, но я не на 100% положительный

Комментарии:

1. Можете поделиться сообщением об ошибке? Нам будет легче определить, где находятся ошибки. Кроме того, вы точно использовали команды для отправки сообщения пользователю, когда они присоединяются? Если да, я думаю, вы можете UserJoined использовать обработчик событий пользователя вместо этого.

2. Обработчик MessageReceived выдал необработанное исключение.: System.NullReferenceException: ссылка на объект не установлена для экземпляра объекта. в Discord. Команды. SocketCommandContext..ctor(клиент DiscordSocketClient, сообщение сообщения SocketUserMessage) в UBot_CodeV2.Program. <HandleCommandAsync>d__9.MoveNext() в C:UserssarahsourcereposUBot_CodeV2UBot_CodeV2Program.cs:line 70 Строка 70 будет var context

Ответ №1:

Я думаю, вы можете использовать UserJoined event для достижения этой цели.

Определите обработчик событий для подключенного пользователя

 public async Task UserJoined(SocketGuildUser user)
{
   await user.SendMessageAsync("Hello");
}
 

Зарегистрируйте его

 private readonly DiscordSocketClient _client = new DiscordSocketClient();
private readonly CommandService _commandService = new CommandService();

public async Task MainAsync()
{
   ....
   _client.UserJoined  = UserJoined;
   ....
}
 

Я не уверен, достаточно ли это связано, но проверьте, включен ли член сервера Intents
введите описание изображения здесь

Комментарии:

1. Большое вам спасибо, я не могу поверить, что пропустил что-то подобное! теперь он отправляет приветствие Dm просто неправильное, по какой-то причине я, вероятно, неправильно установил переменную

2. Я думаю, что на самом деле вам нужно только «намерение участника сервера», чтобы это работало, а не «Намерение присутствия».