示例#1
0
        /// <summary>
        /// Posts the archived roleplay to the guild's archive channel, if it has one.
        /// </summary>
        /// <param name="guild">The guild.</param>
        /// <param name="serverService">The server service.</param>
        /// <param name="serverSettings">The server settings service.</param>
        /// <param name="roleplay">The roleplay.</param>
        /// <returns>A <see cref="Task"/> representing the asynchronous operation.</returns>
        private async Task PostArchivedRoleplayAsync
        (
            SocketGuild guild,
            ServerService serverService,
            RoleplayServerSettingsService serverSettings,
            Roleplay roleplay
        )
        {
            var getServer = await serverService.GetOrRegisterServerAsync(guild);

            if (!getServer.IsSuccess)
            {
                this.Log.LogWarning("Failed to get the server for the current guild. Bug?");
                return;
            }

            var server = getServer.Entity;

            var getSettings = await serverSettings.GetOrCreateServerRoleplaySettingsAsync(server);

            if (!getSettings.IsSuccess)
            {
                this.Log.LogWarning("Failed to get the server settings for the current guild. Bug?");
                return;
            }

            var settings = getSettings.Entity;

            if (settings.ArchiveChannel is null)
            {
                return;
            }

            var archiveChannel = guild.GetTextChannel((ulong)settings.ArchiveChannel);

            if (archiveChannel is null)
            {
                this.Log.LogWarning("Failed to get the archive channel for the current guild. Deleted?");
                return;
            }

            var exporter = new PDFRoleplayExporter(guild);

            using var exportedRoleplay = await exporter.ExportAsync(roleplay);

            var eb = _feedback.CreateEmbedBase();

            eb.WithTitle($"{exportedRoleplay.Title} - Archived");
            eb.WithDescription(roleplay.Summary);
            eb.WithFooter($"Archived on {DateTime.Now:d}.");

            await archiveChannel.SendFileAsync
            (
                exportedRoleplay.Data,
                $"{exportedRoleplay.Title}.{exportedRoleplay.Format.GetFileExtension()}",
                string.Empty,
                embed : eb.Build()
            );
        }
    public async Task <IResult> ExportRoleplayAsync
    (
        [RequireEntityOwner]
        [AutocompleteProvider("roleplay::owned")]
        Roleplay roleplay,
        ExportFormat format = ExportFormat.PDF
    )
    {
        IRoleplayExporter exporter;

        switch (format)
        {
        case ExportFormat.PDF:
        {
            exporter = new PDFRoleplayExporter();
            break;
        }

        case ExportFormat.Plaintext:
        {
            exporter = new PlaintextRoleplayExporter();
            break;
        }

        default:
        {
            return(Result.FromError
                   (
                       new UserError("That export format hasn't been implemented yet.")
                   ));
        }
        }

        var send = await _feedback.SendContextualNeutralAsync("Compiling the roleplay...");

        if (!send.IsSuccess)
        {
            return(Result <FeedbackMessage> .FromError(send));
        }

        using var output = await exporter.ExportAsync(_services, roleplay);

        var fileData = new FileData
                       (
            $"{output.Title}.{output.Format.GetFileExtension()}",
            output.Data
                       );

        return(await _channelAPI.CreateMessageAsync
               (
                   _context.ChannelID,
                   attachments : new List <OneOf <FileData, IPartialAttachment> > {
            fileData
        }
               ));
    }
    private static async Task <Result> PostArchivedRoleplayAsync
    (
        IServiceProvider services,
        FeedbackService feedback,
        RoleplayServerSettingsService serverSettings,
        Roleplay roleplay
    )
    {
        var channelAPI = services.GetRequiredService <IDiscordRestChannelAPI>();

        var getSettings = await serverSettings.GetOrCreateServerRoleplaySettingsAsync(roleplay.Server.DiscordID);

        if (!getSettings.IsSuccess)
        {
            return(Result.FromError(getSettings));
        }

        var settings = getSettings.Entity;

        if (settings.ArchiveChannel is null)
        {
            return(new UserError("No archive channel has been set."));
        }

        var exporter = new PDFRoleplayExporter();

        using var exportedRoleplay = await exporter.ExportAsync(services, roleplay);

        var embed = new Embed
        {
            Colour      = feedback.Theme.Secondary,
            Title       = $"{exportedRoleplay.Title} - Archived",
            Description = roleplay.GetSummaryOrDefault(),
            Footer      = new EmbedFooter($"Archived on {DateTimeOffset.UtcNow:d}.")
        };

        var fileData = new FileData
                       (
            $"{exportedRoleplay.Title}.{exportedRoleplay.Format.GetFileExtension()}",
            exportedRoleplay.Data
                       );

        var send = await channelAPI.CreateMessageAsync
                   (
            settings.ArchiveChannel.Value,
            embeds : new[] { embed },
            attachments : new List <OneOf <FileData, IPartialAttachment> > {
            fileData
        }
                   );

        return(send.IsSuccess
            ? Result.FromSuccess()
            : Result.FromError(send));
    }
示例#4
0
        public async Task ExportRoleplayAsync
        (
            [NotNull]
            [RequireEntityOwnerOrPermission(typeof(ExportRoleplay), PermissionTarget.Other)]
            Roleplay roleplay,
            [OverrideTypeReader(typeof(HumanizerEnumTypeReader <ExportFormat>))]
            ExportFormat format = ExportFormat.PDF
        )
        {
            IRoleplayExporter exporter;

            switch (format)
            {
            case ExportFormat.PDF:
            {
                exporter = new PDFRoleplayExporter(this.Context.Guild);
                break;
            }

            case ExportFormat.Plaintext:
            {
                exporter = new PlaintextRoleplayExporter(this.Context.Guild);
                break;
            }

            default:
            {
                await _feedback.SendErrorAsync(this.Context, "That export format hasn't been implemented yet.");

                return;
            }
            }

            await _feedback.SendConfirmationAsync(this.Context, "Compiling the roleplay...");

            using (var output = await exporter.ExportAsync(roleplay))
            {
                await this.Context.Channel.SendFileAsync(output.Data, $"{output.Title}.{output.Format.GetFileExtension()}");
            }
        }