package org.freecode.irc.votebot.modules.common; import org.freecode.irc.Notice; import org.freecode.irc.Privmsg; import org.freecode.irc.votebot.NoticeFilter; import org.freecode.irc.votebot.api.CommandModule; import org.freecode.irc.votebot.dao.PollDAO; import org.freecode.irc.votebot.dao.VoteDAO; import org.freecode.irc.votebot.entity.Poll; import org.freecode.irc.votebot.entity.Vote; import java.sql.Date; import java.sql.SQLException; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Locale; import java.util.TimeZone; /** * Processes and validates voting commands sent by users * * @author Shivam Mistry */ public class VoteModule extends CommandModule { private PollDAO pollDAO; private VoteDAO voteDAO; public void processMessage(Privmsg privmsg) { String message = privmsg.getMessage(); if (message.startsWith("!v ") || message.startsWith("!vote ")) { final String msg = privmsg.getMessage().substring(privmsg.getMessage().indexOf(' ')).trim(); System.out.println(msg); final String[] split = msg.split(" ", 2); if (split.length == 2) { String ids = split[0]; String vote = split[1].toLowerCase(); final int nId; switch (vote) { case "yes": nId = 0; break; case "no": nId = 1; break; case "abstain": nId = 2; break; default: return; } if (!ids.matches("\\d+")) { return; } final int id = Integer.parseInt(ids); vote(nId, id, privmsg); } else if (split.length == 1) { String id = split[0]; if (!id.matches("\\d+")) { return; } try { int pollId = Integer.parseInt(id); Poll poll = pollDAO.getPoll(pollId); if (poll != null) { String expiry = getDateFormatter().format(new Date(poll.getExpiry())); String closed = poll.isClosed() ? "Closed" : "Open"; if (System.currentTimeMillis() >= poll.getExpiry()) { closed = "Expired"; } Vote[] votes = voteDAO.getVotesOnPoll(pollId); int yes = 0, no = 0, abstain = 0; for (Vote vote : votes) { int answerIndex = vote.getAnswerIndex(); if (answerIndex == 0) { yes++; } else if (answerIndex == 1) { no++; } else if (answerIndex == 2) { abstain++; } } boolean open = closed.equals("Open"); privmsg.send("Poll #" + poll.getId() + ": " + poll.getQuestion() + " Created by: " + poll.getCreator() + " Yes: " + yes + " No: " + no + " Abstain: " + abstain + " Status: \u00030" + (open ? "3" : "4") + closed + "\u0003" + (open ? " Ends: " : " Ended: ") + expiry); } } catch (SQLException e) { privmsg.send(e.getMessage()); } } } else if (message.startsWith("!y ")) { String id = message.replace("!y", "").trim(); if (id.matches("\\d+")) { voteYes(Integer.parseInt(id), privmsg); } } else if (message.startsWith("!n ")) { String id = message.replace("!n", "").trim(); if (id.matches("\\d+")) { voteNo(Integer.parseInt(id), privmsg); } } else if (message.startsWith("!a ")) { String id = message.replace("!a", "").trim(); if (id.matches("\\d+")) { voteAbstain(Integer.parseInt(id), privmsg); } } } private void voteYes(final int pollId, final Privmsg privmsg) { vote(0, pollId, privmsg); } private void voteNo(final int pollId, final Privmsg privmsg) { vote(1, pollId, privmsg); } private void voteAbstain(final int pollId, final Privmsg privmsg) { vote(2, pollId, privmsg); } private void vote(final int answerIndex, final int pollId, final Privmsg privmsg) { privmsg.getIrcConnection().addListener(new NoticeFilter() { public boolean accept(Notice notice) { if (notice.getNick().equals("ChanServ") && notice.getMessage().equals("Permission denied.")) { notice.getIrcConnection().removeListener(this); return false; } return notice.getNick().equals("ChanServ") && notice.getMessage().contains("Main nick:") && notice.getMessage().contains(privmsg.getNick()); } public void run(Notice notice) { try { String mainNick = notice.getMessage().substring(notice.getMessage().indexOf("Main nick:") + 10).trim(); System.out.println(mainNick); Poll poll = pollDAO.getPoll(pollId); if (poll != null) { long time = poll.getExpiry(); if (System.currentTimeMillis() < time && !poll.isClosed()) { Vote vote = voteDAO.getUsersVoteOnPoll(mainNick, pollId); if (vote != null) { if (vote.getAnswerIndex() == answerIndex) { privmsg.getIrcConnection().send(new Notice(privmsg.getNick(), "You've already voted with this option!", privmsg.getIrcConnection())); } else { vote.setAnswerIndex(answerIndex); voteDAO.updateUsersVote(vote); privmsg.getIrcConnection().send(new Notice(privmsg.getNick(), "Vote updated.", privmsg.getIrcConnection())); } } else { voteDAO.addUsersVote(mainNick, pollId, answerIndex); privmsg.getIrcConnection().send(new Notice(privmsg.getNick(), "Vote cast.", privmsg.getIrcConnection())); } } else { privmsg.getIrcConnection().send(new Notice(privmsg.getNick(), "Voting is closed for this poll.", privmsg.getIrcConnection())); } } } catch (Exception e) { e.printStackTrace(); } privmsg.getIrcConnection().removeListener(this); } }); askChanServForUserCreds(privmsg); } private DateFormat getDateFormatter() { DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z", Locale.UK); dateFormat.setTimeZone(TimeZone.getTimeZone("Europe/London")); return dateFormat; } public String getName() { return "(vote|v|y|n|a)"; } public void setPollDAO(PollDAO pollDAO) { this.pollDAO = pollDAO; } public void setVoteDAO(VoteDAO voteDAO) { this.voteDAO = voteDAO; } }