예제 #1
0
        /// <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;
        }
예제 #2
0
        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;
        }