package handlers;
import com.github.masahitojp.botan.Robot;
import com.github.masahitojp.botan.brain.BotanBrain;
import com.github.masahitojp.botan.handler.BotanMessageHandlers;
import java.util.concurrent.locks.StampedLock;
import java.util.function.Function;
@SuppressWarnings("unused")
public class PlusPlusHandlers implements BotanMessageHandlers {
private static String KEY_FORMAT = "plusplus.key.%s";
@Override
public void register(final Robot robot) {
robot.respond(
"\\s*(?<body>.+)\\Q++\\E\\z",
"string++",
message -> {
final String body = message.getMatcher().group("body");
final int result = incr(message.getBrain(), String.format(KEY_FORMAT, body));
message.reply(String.format("%s : total(%d)", body, result));
});
}
private final StampedLock lock = new StampedLock();
private int getInteger(BotanBrain brain, String key, Function<Integer, Integer> func) {
final long stamp = lock.writeLock();
final int before;
final String value = brain.getData().getOrDefault(key, "");
if (!value.equals("")) {
before = Integer.parseInt(value);
} else {
before = 0;
}
final int result = func.apply(before);
brain.getData().put(key, String.valueOf(result));
lock.unlock(stamp);
return result;
}
private int incr(BotanBrain brain, final String key) {
return getInteger(brain, key, t -> t + 1);
}
}