Example #1
0
        public async Task WriteHelpFileAsync()
        {
            StringBuilder markdownBuilder = new StringBuilder();

            markdownBuilder.Append("# ").AppendLine(m_Plugin.DisplayName);
            markdownBuilder.Append("Id: ").AppendLine(m_Plugin.OpenModComponentId);
            markdownBuilder.Append("Version: ").AppendLine(m_Plugin.Version.ToString());
            if (!string.IsNullOrEmpty(m_Plugin.Author))
            {
                markdownBuilder.Append("Author: ").AppendLine(m_Plugin.Author);
            }
            if (!string.IsNullOrEmpty(m_Plugin.Website))
            {
                markdownBuilder.Append("Website: ").AppendLine(m_Plugin.Website);
            }

            var commands = (await m_CommandStore.GetCommandsAsync())
                           .Where(d => d.Component == m_Plugin)
                           .ToList();

            var rootCommands = commands
                               .Where(d => string.IsNullOrEmpty(d.ParentId))
                               .ToList();

            if (rootCommands.Any())
            {
                markdownBuilder.AppendLine();
                markdownBuilder.AppendLine("## Commands");
                foreach (var currentCommand in rootCommands)
                {
                    var actor = new PseudoActor();
                    var ctx   = m_CommandContextBuilder.CreateContext(actor, new[] { currentCommand.Name }, string.Empty, commands);
                    AppendCommand(markdownBuilder, currentCommand, commands, ctx);
                }
            }

            var permissions = m_PermissionRegistry.GetPermissions(m_Plugin)
                              .Where(d => !m_PrintedCommandPermissions.Any(e =>
                                                                           e.Permission.Equals(d.Permission, StringComparison.OrdinalIgnoreCase)))
                              .ToList();

            if (permissions.Any())
            {
                markdownBuilder.AppendLine();
                markdownBuilder.AppendLine("## Permissions");
                foreach (var permission in permissions)
                {
                    markdownBuilder.Append("- ").Append(permission.Owner.OpenModComponentId).Append(':').Append(permission.Permission);
                    if (!string.IsNullOrEmpty(permission.Description))
                    {
                        markdownBuilder.Append(": ").Append(permission.Description);
                    }

                    markdownBuilder.AppendLine();
                }
            }

            var directory = m_Plugin.WorkingDirectory;

            if (!Directory.Exists(directory))
            {
                Directory.CreateDirectory(directory);
            }

            var filePath = Path.Combine(directory, "help.md");

            File.WriteAllText(filePath, markdownBuilder.ToString());
        }
Example #2
0
        private void AppendCommand(
            StringBuilder markdownBuilder,
            ICommandRegistration command,
            List <ICommandRegistration> commands,
            ICommandContext commandContext)
        {
            markdownBuilder.Append("- ").Append(commandContext.CommandPrefix).Append(commandContext.CommandAlias);
            if (!string.IsNullOrEmpty(command.Syntax))
            {
                markdownBuilder.Append(' ').Append(command.Syntax);
            }

            if (!string.IsNullOrEmpty(command.Description))
            {
                markdownBuilder.Append(": ").Append(command.Description);
            }

            markdownBuilder.AppendLine();
            markdownBuilder.Append("  id: ").AppendLine(command.Id);
            var permissionRegistrations = new List <IPermissionRegistration>();

            var commandPermission = m_PermissionBuilder.GetPermission(command, commands);

            var commandPermissionRegistration = m_PermissionRegistry.FindPermission(m_Plugin, commandPermission);

            if (commandPermissionRegistration != null)
            {
                permissionRegistrations.Add(commandPermissionRegistration);
            }

            if (command.PermissionRegistrations != null)
            {
                var prefixedPermissions = new List <IPermissionRegistration>();

                foreach (var permission in command.PermissionRegistrations)
                {
                    prefixedPermissions.Add(new PermissionRegistration
                    {
                        Permission   = commandPermission + "." + permission.Permission,
                        Description  = permission.Description,
                        DefaultGrant = permission.DefaultGrant,
                        Owner        = permission.Owner
                    });
                }

                permissionRegistrations.AddRange(prefixedPermissions);
            }

            if (permissionRegistrations.Count > 0)
            {
                markdownBuilder.AppendLine("  permissions:");

                foreach (var permissionRegistration in permissionRegistrations)
                {
                    markdownBuilder.Append("  - ").Append(permissionRegistration.Permission);
                    if (!string.IsNullOrEmpty(permissionRegistration.Description))
                    {
                        markdownBuilder.Append(": ").Append(permissionRegistration.Description);
                    }

                    markdownBuilder.AppendLine();
                }

                m_PrintedCommandPermissions.AddRange(permissionRegistrations);
            }

            var childCommands = commands
                                .Where(d => string.Equals(d.ParentId, command.Id, StringComparison.OrdinalIgnoreCase));

            foreach (var child in childCommands)
            {
                var actor = new PseudoActor();
                var ctx2  = m_CommandContextBuilder.CreateContext(actor, new[] { command.Name, child.Name }, string.Empty, commands);
                AppendCommand(markdownBuilder, child, commands, ctx2);
            }
            commandContext.DisposeAsync().GetAwaiter().GetResult();
        }