/// <summary> /// Handles the given slash command /// </summary> /// <param name="command">The slash command arguments</param> /// <param name="cmd">The handler name</param> /// <returns>A task that represents the completion of the handling of the command</returns> public async Task HandleCommand(SocketSlashCommand command, string cmd) { var handler = _commands.ReflectionCommands[cmd]; var parent = _services.GetService(handler.ParentType); if (parent == null) { _logger.LogWarning("No parent service found for \"{0}\" from \"{1}\"", handler.ParentType.Name, cmd); return; } var args = GetParameters(command, handler); if (args == null) { return; } if (handler.Attribute.LongRunning) { await command.DeferAsync(); } var result = handler.Method.Invoke(parent, args); if (result == null) { return; } var resType = result.GetType(); if (resType == typeof(void)) { return; } if (result is not Task) { return; } await(Task) result; }
private async Task SlashCommand(SocketSlashCommand command) { if (command.ChannelId.HasValue && command.Data.Options.Count > 0 && PixivChannels.TryGetValue(command.ChannelId.Value, out var channelPixivSettings)) { await command.DeferAsync(); try { var param = command.Data.Options.FirstOrDefault(); if (param != null && param.Value != null) { switch (param.Name) { case "id": var illust = await PixivDownloader.GetIllustration((long)param.Value); bool isFirstSent = true; var pagesToDownload = Enumerable.Range(0, illust.PageCount); //var attachments = new List<FileAttachment>(); if (illust != null && illust.PageCount > 0 && !CheckRestricted(channelPixivSettings, illust)) { await command.DeleteOriginalResponseAsync(); foreach (var imageTask in PixivDownloader.DownloadIllistrationAsync(illust, maxPages: channelPixivSettings.MaxPages, maxBytes: MaxUploadBytes)) { using (var image = await imageTask) { string text = isFirstSent ? illust.ToString() : string.Empty; if (isFirstSent && channelPixivSettings.MaxPages.HasValue && pagesToDownload.Count() > channelPixivSettings.MaxPages) { text += $" [Showing {channelPixivSettings.MaxPages} images out of {pagesToDownload.Count()}]"; } if (!image.IsOriginal) { text += " (preview version)"; } text = text.Trim(); isFirstSent = false; Console.WriteLine($"Sending page {image.PageNumber}"); await Uploader.SendImage(command.Channel, image, string.IsNullOrEmpty(text)?null : text); //command.Channel.SendFileAsync(image.ImageData, ) //var ms = new MemoryStream(); //image.ImageData.CopyTo(ms); //ms.Position = 0; //attachments.Add(new FileAttachment(ms, image.Filename)); } } } else { await command.ModifyOriginalResponseAsync(mp => mp.Content = "Error"); } //if (attachments.Any()) { // ////await command.ModifyOriginalResponseAsync(mp => mp.Content = illust.ToString()); // //await command.DeleteOriginalResponseAsync(); // ////await command.FollowupWithFilesAsync(attachments); // ////await command.RespondWithFilesAsync(attachments, text: illust.ToString()); //} //else break; case "artist": break; case "search": break; default: await command.ModifyOriginalResponseAsync(mp => mp.Content = "Error: Invalid Command"); break; } } } catch (Exception ex) { Console.WriteLine(ex.Message + Environment.NewLine + ex.StackTrace); await command.ModifyOriginalResponseAsync(mp => mp.Content = "Error"); } } else { await command.RespondAsync("Invalid Comment", ephemeral : true); }; return; }