package pl.touk.chat.bot.janusz; import com.google.common.collect.Lists; import org.apache.commons.csv.CSVFormat; import org.apache.commons.csv.CSVParser; import pl.touk.chat.bot.janusz.commands.Commands; import pl.touk.chat.bot.janusz.store.Store; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; import static org.apache.commons.lang3.StringUtils.substringAfter; import static org.apache.commons.lang3.StringUtils.substringBefore; public class CommandInvoker { private final Commands commands; private final Store store; private static final String COMMAND_PREFIX = "`"; public CommandInvoker(Commands commands, Store store) { this.commands = commands; this.store = store; } public String invoke(String sender, String messageContent) { try { String command = messageContent; List<String> commandArgs = new ArrayList<>(); if (messageContent.contains(" ")) { command = substringBefore(messageContent, " "); String args = substringAfter(messageContent, " "); CSVParser csvRecords = CSVParser.parse(args, CSVFormat.newFormat(' ').withQuote('"')); commandArgs = Lists.newArrayList(csvRecords.iterator().next().iterator()); commandArgs = commandArgs.stream() .map((arg) -> arg.startsWith("$") ? store.get(sender, substringAfter(arg, "$"), String.class) : arg) .collect(Collectors.toList()); } return commands.get(command).invoke(sender, commandArgs); } catch (Exception ex) { throw new JanuszException(ex); } } public boolean isCommand(String messageContent) { return messageContent.startsWith(COMMAND_PREFIX); } }