Прослушайте только изображение в discord.net

#c# #discord.net

#c# #discord.net

Вопрос:

У меня проблема, из-за которой я ищу, чтобы наш бот discord искал только полученные изображения и игнорировал любой введенный текст. Из руководств, которые я прочитал, я еще не встречал ни одного, для которого не требовалась команда.

Я пытался использовать команду без команды в строке, однако она не строится, поскольку не содержит параметра.

Есть ли у кого-нибудь идеи, как я могу просто прослушать только изображение?

Ниже приведен пример моего кода.

     private async Task _client_MessageReceived(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) || message.Attachments.Count > 0)
            {
                var result = await _commands.ExecuteAsync(context, argPos, _services);
                
                if (!result.IsSuccess) Console.WriteLine(result.ErrorReason);
            }
            else
                await message.DeleteAsync();
    }

        [Command("")]
    public async Task Photo()
    {
        var attachments = Context.Message.Attachments;

        WebClient myWebClient = new WebClient();

        string file = attachments.ElementAt(0).Filename;
        string url = attachments.ElementAt(0).Url;

        myWebClient.DownloadFile(url, @"mydirect");

        _ = Task.Run(async () =>
        {
            AWS.AWS.Get_kv_map(@"mydirect");
        });
    }
 

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

1. Вам не нужны команды, чтобы что-то делать. Просто поместите свою логику в обработчик событий, полученных сообщением.

2. Я не думаю, что смогу это сделать? Я хотел бы по-прежнему иметь асинхронную задачу и хотел бы попробовать разместить код во всех одном и том же месте.

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

Ответ №1:

мое предложение состоит в том, чтобы проверить, есть ли сообщение.Вложения ! = 0 ==> делайте свое дело, с этим вы можете проверить, есть ли на нем какие-либо вложения, и после этого вы можете проверить, заканчивается ли оно на .jpg или .png или около того.

пример:

 if(message.Attachments.Count != 0){
var image attachements = message.Attachments.Where(x => 
x.Filename.EndsWith(".jpg") || x.Filename.EndsWith(".png") || 
x.Filename.EndsWith(".gif")); // or what you want as "image"

if(image.Any()){
// do your stuff from your method Photo() here or just call here your method your decision
}else{
// ignore or whatever you want to do it with it
}
 

Я надеюсь, что это помогло и удачи в вашем проекте: D

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

1. Как насчет переименования virus.exe в virus.jpg ? ваш код думает, что это изображение!

Ответ №2:

 var image = message.Attachments.Where(x => x.Filename.EndsWith("*.png") ...);
 

Этот код будет одним из отличных решений, но если вы хотите проверить, что это реальное изображение, то.

Сначала загрузите изображение.

Вторая проверка магического числа.

https://en.wikipedia.org/wiki/List_of_file_signatures Эта ссылка на Википедию содержит список магических чисел, например, MZ означает PE-файл.

Если байт файла не начинается с MZ, Windows запретит выполнение.

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

1. Кроме того, изображение. URL содержит ссылку для скачивания отправленного файла.