#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 содержит ссылку для скачивания отправленного файла.