diff --git a/telegrambots-extensions/src/main/java/org/telegram/telegrambots/bots/commandbot/commands/helpCommand/HelpCommand.java b/telegrambots-extensions/src/main/java/org/telegram/telegrambots/bots/commandbot/commands/helpCommand/HelpCommand.java new file mode 100644 index 00000000..2926b0e6 --- /dev/null +++ b/telegrambots-extensions/src/main/java/org/telegram/telegrambots/bots/commandbot/commands/helpCommand/HelpCommand.java @@ -0,0 +1,117 @@ +package org.telegram.telegrambots.bots.commandbot.commands.helpCommand; + +import java.util.Collection; + +import org.telegram.telegrambots.api.methods.send.SendMessage; +import org.telegram.telegrambots.api.objects.Chat; +import org.telegram.telegrambots.api.objects.User; +import org.telegram.telegrambots.bots.AbsSender; +import org.telegram.telegrambots.bots.commandbot.TelegramLongPollingCommandBot; +import org.telegram.telegrambots.bots.commandbot.commands.BotCommand; +import org.telegram.telegrambots.bots.commandbot.commands.ICommandRegistry; +import org.telegram.telegrambots.exceptions.TelegramApiException; + +/** + * A special bot command used for printing help messages similiar to the Linux man command. + * The commands printed by this command should implement the {@link IManCommand} interface to provide an extended description. + * @author Lukas Prediger(Chase) + * @version 1.0.0 + * + */ +public class HelpCommand extends ManCommand { + + private static final String COMMAND_IDENTIFIER = "help"; + private static final String COMMAND_DESCRIPTION = "shows all commands. Use /help [command] for more info"; + private static final String EXTENDED_DESCRIPTION = "This command displays all commands the bot has to offer.\n /help [command] can display deeper information"; + + /** + * Returns the command and description of all supplied commands as a formatted String + * @param botCommands the Commands that should be included in the String + * @return a formatted String containing command and description for all supplied commands + */ + public static String getHelpText(BotCommand...botCommands) { + StringBuilder reply = new StringBuilder(); + for (BotCommand com : botCommands) { + reply.append(com.toString()).append(System.lineSeparator()).append(System.lineSeparator()); + } + return reply.toString(); + } + + /** + * Returns the command and description of all supplied commands as a formatted String + * @param botCommands a collection of commands that should be included in the String + * @return a formatted String containing command and description for all supplied commands + */ + public static String getHelpText(Collection botCommands) { + return getHelpText(botCommands.toArray(new BotCommand[botCommands.size()])); + } + + /** + * Returns the command and description of all supplied commands as a formatted String + * @param registry a commandRegistry which commands are formatted into the String + * @return a formatted String containing command and description for all supplied commands + */ + public static String getHelpText(ICommandRegistry registry) { + return getHelpText(registry.getRegisteredCommands()); + } + + /** + * Reads the extended Description from a BotCommand. If the Command is not of Type {@link IManCommand}, it calls toString(); + * @param command a command the extended Descriptions is read from + * @return the extended Description or the toString() if IManCommand is not implemented + */ + public static String getManText(BotCommand command) { + return IManCommand.class.isInstance(command) ? getManText((IManCommand) command) : command.toString(); + } + + /** + * Reads the extended Description from a BotCommand; + * @param command a command the extended Descriptions is read from + * @return the extended Description + */ + public static String getManText(IManCommand command) { + return command.toMan(); + } + + /** + * Create a Help command with the standard Arguments. + */ + public HelpCommand() { + super(COMMAND_IDENTIFIER, COMMAND_DESCRIPTION, EXTENDED_DESCRIPTION); + } + + /** + * Creates a Help Command with custom identifier, description and extended Description + * @param commandIdentifier the unique identifier of this command (e.g. the command string to enter into chat) + * @param description the description of this command + * @param extendedDescription The extended Description for the Command, should provide detailed information about arguments and possible options + */ + public HelpCommand(String commandIdentifier, String description, String extendedDescription) { + super(commandIdentifier, description, extendedDescription); + } + + @Override + public void execute(AbsSender absSender, User user, Chat chat, String[] arguments) { + if (ICommandRegistry.class.isInstance(absSender)) { + ICommandRegistry registry = (ICommandRegistry) absSender; + + if (arguments.length > 0) { + BotCommand command = registry.getRegisteredCommand(arguments[0]); + String reply = getManText(command); + try { + absSender.execute(new SendMessage(chat.getId(), reply).setParseMode("HTML")); + } catch (TelegramApiException e) { + e.printStackTrace(); + } + } else { + String reply = getHelpText(registry); + try { + absSender.execute(new SendMessage(chat.getId(), reply).setParseMode("HTML")); + } catch (TelegramApiException e) { + e.printStackTrace(); + } + } + } + } + +} diff --git a/telegrambots-extensions/src/main/java/org/telegram/telegrambots/bots/commandbot/commands/helpCommand/IManCommand.java b/telegrambots-extensions/src/main/java/org/telegram/telegrambots/bots/commandbot/commands/helpCommand/IManCommand.java new file mode 100644 index 00000000..67e15d63 --- /dev/null +++ b/telegrambots-extensions/src/main/java/org/telegram/telegrambots/bots/commandbot/commands/helpCommand/IManCommand.java @@ -0,0 +1,21 @@ +package org.telegram.telegrambots.bots.commandbot.commands.helpCommand; + +/** + * Represents a Command that, aside the normal command description provides an extended Description similar to the output of the Linux man command + * @author Lukas Prediger(Chase) + * @version 1.0.0 + */ +public interface IManCommand { + /** + * Returns the extended Description of this command + * @return the extendedDescription + */ + String getExtendedDescription(); + + /** + * Returns a String Representations of the Command and it's extended Description. + * @return a String representing the Command and it's extended Description + */ + String toMan(); + +} \ No newline at end of file diff --git a/telegrambots-extensions/src/main/java/org/telegram/telegrambots/bots/commandbot/commands/helpCommand/ManCommand.java b/telegrambots-extensions/src/main/java/org/telegram/telegrambots/bots/commandbot/commands/helpCommand/ManCommand.java new file mode 100644 index 00000000..1f645b7a --- /dev/null +++ b/telegrambots-extensions/src/main/java/org/telegram/telegrambots/bots/commandbot/commands/helpCommand/ManCommand.java @@ -0,0 +1,41 @@ +package org.telegram.telegrambots.bots.commandbot.commands.helpCommand; + +import org.telegram.telegrambots.bots.commandbot.commands.BotCommand; + +public abstract class ManCommand extends BotCommand implements IManCommand { + + private final String extendedDescription; + + /** + * Create a new ManCommand providing a commandIdentifier, a short description and the extended description + * @param commandIdentifier the unique identifier of this command (e.g. the command string to enter into chat) + * @param description the description of this command + * @param extendedDescription The extended Description for the Command, should provide detailed information about arguments and possible options + */ + public ManCommand(String commandIdentifier, String description, String extendedDescription) { + super(commandIdentifier, description); + this.extendedDescription = extendedDescription; + } + + /* (non-Javadoc) + * @see org.telegram.telegrambots.bots.commandbot.commands.helpCommand.IManCommand#getExtendedDescription() + */ + @Override + public String getExtendedDescription() { + return extendedDescription; + } + + /* (non-Javadoc) + * @see org.telegram.telegrambots.bots.commandbot.commands.helpCommand.IManCommand#toMan() + */ + @Override + public String toMan() { + StringBuilder sb = new StringBuilder(toString()); + sb.append(System.lineSeparator()) + .append("-----------------") + .append(System.lineSeparator()); + if (getExtendedDescription() != null) sb.append(getExtendedDescription()); + return sb.toString(); + } + +}