package org.freecode.irc.votebot.modules.admin; import org.freecode.irc.Privmsg; import org.freecode.irc.votebot.PollExpiryAnnouncer; import org.freecode.irc.votebot.api.AdminModule; import org.freecode.irc.votebot.dao.PollDAO; import java.sql.SQLException; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; public class CreatePollModule extends AdminModule { private static final long DEFAULT_LIFE_SPAN = 604800000L; public static final String LIFESPAN_PATTERN = "\\d{1,6}[whsdmWHSDM]?"; public static final String CREATE_POLL_WITH_LIFESPAN_PATTERN = "!createpoll " + LIFESPAN_PATTERN + " .+"; private PollDAO pollDAO; @Override public void processMessage(final Privmsg privmsg) { if (privmsg.getMessage().trim().equals("!createpoll")) { return; } long lifeSpan = DEFAULT_LIFE_SPAN; final String question; if (privmsg.getMessage().matches(CREATE_POLL_WITH_LIFESPAN_PATTERN)) { try { final String[] parts = privmsg.getMessage().split(" ", 3); lifeSpan = parseExpiry(parts[1]); question = parts[2]; } catch (IllegalArgumentException e) { privmsg.getIrcConnection().send(new Privmsg(privmsg.getTarget(), e.getMessage(), privmsg.getIrcConnection())); throw e; } } else { final String[] parts = privmsg.getMessage().split(" ", 2); question = parts[1]; } if (question.isEmpty() || question.length() < 5) { privmsg.getIrcConnection().send(new Privmsg(privmsg.getTarget(), "Question is too short.", privmsg.getIrcConnection())); return; } try { final long expiration = System.currentTimeMillis() + lifeSpan; int id = pollDAO.addNewPoll(question.trim(), expiration, privmsg.getNick()); privmsg.getIrcConnection().send(new Privmsg(privmsg.getTarget(), "Created poll, type !vote " + id + " yes/no/abstain to vote.", privmsg.getIrcConnection())); PollExpiryAnnouncer exp = new PollExpiryAnnouncer(expiration, id, getFvb()); ScheduledFuture<?> future = getFvb().pollExecutor.scheduleAtFixedRate(exp, 5000L, 500L, TimeUnit.MILLISECONDS); exp.setFuture(future); getFvb().pollFutures.put(id, future); } catch (Exception e) { e.printStackTrace(); } } private long parseExpiry(String lifespan) { if (lifespan.matches(LIFESPAN_PATTERN)) { long multiplier = 1000; if (Character.isLetter(lifespan.charAt(lifespan.length() - 1))) { char c = Character.toLowerCase(lifespan.charAt(lifespan.length() - 1)); switch (c) { case 'w': multiplier *= 604800; break; case 'h': multiplier *= 3600; break; case 'm': multiplier *= 60; break; case 'd': multiplier *= 86400; break; } lifespan = lifespan.substring(0, lifespan.length() - 1); } return Long.parseLong(lifespan) * multiplier; } else { throw new IllegalArgumentException("CreatePollModule - Given lifespan is incorrectly formatted."); } } @Override public String getName() { return "createpoll"; } @Override public String getParameterRegex() { return ".+"; } public void setPollDAO(PollDAO pollDAO) { this.pollDAO = pollDAO; } protected Right[] getRights() { return new Right[]{Right.AOP, Right.SOP, Right.FOUNDER, Right.HOP}; } }