JIrcBot/src/main/java/ru/bvn13/jircbot/listeners/CalculatorListener.java

108 lines
4.1 KiB
Java

package ru.bvn13.jircbot.listeners;
import net.objecthunter.exp4j.Expression;
import net.objecthunter.exp4j.ExpressionBuilder;
import org.pircbotx.hooks.ListenerAdapter;
import org.pircbotx.hooks.WaitForQueue;
import org.pircbotx.hooks.events.MessageEvent;
import org.pircbotx.hooks.types.GenericMessageEvent;
public class CalculatorListener extends ListenerAdapter {
private static final String COMMAND = "?calc ";
@Override
public void onGenericMessage(final GenericMessageEvent event) throws Exception {
if (event.getUser().getUserId().equals(event.getBot().getUserBot().getUserId())) {
return;
}
if (!event.getMessage().startsWith(COMMAND.trim())) {
return;
}
String message = event.getMessage().replace(COMMAND, "").trim();
String[] commands = message.split(" ", 2);
if (commands.length == 0 || commands[0].isEmpty() || commands[0].trim().equalsIgnoreCase("help")) {
event.respond(this.helpMessage());
return;
}
if (this.checkComand(commands[0].trim())) {
return;
}
String expressionString = message;
event.respond("EXPRESSION: "+expressionString);
ExpressionBuilder expressionBuilder = new ExpressionBuilder(expressionString);
Expression exp = null;
WaitForQueue queue = new WaitForQueue(event.getBot());
while (true) {
MessageEvent currentEvent = queue.waitFor(MessageEvent.class);
if (currentEvent.getMessage().startsWith(COMMAND)) {
message = currentEvent.getMessage().replace(COMMAND, "").trim();
commands = message.split(" ", 2);
if (commands.length == 0 || commands[0].isEmpty()) {
currentEvent.respond("Command is expected.");
currentEvent.respond(this.helpMessage());
} else if (commands[0].trim().equalsIgnoreCase("vars")) {
exp = expressionBuilder.variables(commands[1].trim()).build();
currentEvent.respond("VARIABLES: "+commands[1].trim());
} else if (commands[0].trim().equalsIgnoreCase("set")) {
String[] variableData = commands[1].trim().split("=", 2);
if (variableData.length < 2 || variableData[0].isEmpty() || variableData[1].isEmpty()) {
currentEvent.respond("FORMAT: variable = value");
} else {
if (exp == null) {
//currentEvent.respond("Variables are not set!");
exp = expressionBuilder.build();
} else {
Double value = Double.parseDouble(variableData[1].trim());
exp = exp.setVariable(variableData[0].trim(), value);
currentEvent.respond(String.format("VARIABLE SET: %s = %f", variableData[0].trim(), value));
}
}
} else if (commands[0].trim().equalsIgnoreCase("done")) {
if (exp == null) {
exp = expressionBuilder.build();
}
Double result = exp.evaluate();
currentEvent.respond(String.format("%s = %f", expressionString, result));
expressionBuilder = null;
exp = null;
queue.close();
return;
} else {
currentEvent.respond(this.helpMessage());
}
}
}
}
private Boolean checkComand(String command) {
return command.equalsIgnoreCase("vars")
|| command.equalsIgnoreCase("set")
|| command.equalsIgnoreCase("done");
}
private String helpMessage() {
return "CALCULATOR (powered by Exp4J) | "+
"Commands: | "+
"vars - set variables names delimetered by comma, i.e.: a, b | "+
"set - set variable, i.e.: a = 2 | "+
"done - evaluate expression";
}
}