package util.misc;
import gui.forms.GUIMain;
import lib.pircbot.PircBot;
import lib.pircbot.User;
import util.Permissions;
import util.Timer;
import util.Utils;
import java.util.ArrayList;
/**
* Created by Nick on 7/17/2014.
*/
public class Raffle extends Thread {
private PircBot bot = null;
private int time = 0;
private String keyword = null;
private String winner = null;
private ArrayList<String> entrants = null;
private ArrayList<Permissions.Permission> requiredPermissions, denyPerms;
private boolean isDone = false;
private String channel;
private String startMessage;
public String getKeyword() {
return keyword;
}
public void addUser(User u, String channel)
{
if (!isDone && !entrants.contains(u.getDisplayName()))
{
ArrayList<Permissions.Permission> userPerms = Permissions.getUserPermissions(u, channel);
if (userPerms.stream().anyMatch(p -> requiredPermissions.contains(p))
&& userPerms.stream().noneMatch(p -> denyPerms.contains(p)))
entrants.add(u.getDisplayName());
}
}
public void setDone(boolean isDone) {
this.isDone = isDone;
}
public String getWinner() {
return winner;
}
public String getStartMessage() {
return startMessage;
}
public String getChannel()
{
return channel;
}
public int getNumberEntrants()
{
return entrants != null ? entrants.size() : 0;
}
private Timer timer;
// Created from text command
public Raffle(PircBot bot, String key, int time, String channel, int permission) {
this.bot = bot;
this.keyword = key;
this.time = Utils.handleInt(time);
this.channel = channel;
determinePermission(permission);
determineStartMessage();
}
// Created from the GUI
public Raffle(PircBot bot, String key, int time, String channel, ArrayList<Permissions.Permission> allowPerms,
ArrayList<Permissions.Permission> denyPerms)
{
this.bot = bot;
this.keyword = key;
this.time = Utils.handleInt(time);
this.channel = channel;
this.requiredPermissions = allowPerms;
this.denyPerms = denyPerms;
determineStartMessage();
}
// Used by the chat command to make the allow/deny automatically
private void determinePermission(int givenPermission)
{
requiredPermissions = new ArrayList<>();
if (givenPermission <= 0)
requiredPermissions.add(Permissions.Permission.VIEWER);
else
{
switch (givenPermission)
{
default:
case 1:
requiredPermissions.add(Permissions.Permission.SUBSCRIBER);
case 2:
requiredPermissions.add(Permissions.Permission.DONOR);
case 3:
requiredPermissions.add(Permissions.Permission.MODERATOR);
break;
}
}
// No denying it, it's gonna happen
denyPerms = new ArrayList<>();
}
private void determineStartMessage()
{
this.startMessage = "Raffle started! Who can enter: ";
StringBuilder stanSB = new StringBuilder();
// Two cases when the VIEWER perm is in required: 1. everybody else is excluded, or everybody can enter
if (requiredPermissions.contains(Permissions.Permission.VIEWER) && denyPerms.isEmpty())
{
startMessage += "Everybody!";
} else
{
for (Permissions.Permission p : requiredPermissions)
{
stanSB.append(p.toString().substring(0, 1));
stanSB.append(p.toString().substring(1).toLowerCase());
stanSB.append("s, ");
}
startMessage += stanSB.substring(0, stanSB.length() - 2) + ".";
}
if (!denyPerms.isEmpty())
{
stanSB = new StringBuilder(" || Who CANNOT ENTER: ");
for (Permissions.Permission p : denyPerms)
{
stanSB.append(p.toString().substring(0, 1));
stanSB.append(p.toString().substring(1).toLowerCase());
stanSB.append("s, ");
}
startMessage += stanSB.substring(0, stanSB.length() - 2) + ".";
}
startMessage += String.format(" Time limit: %d seconds!", time / 1000);
startMessage += " Keyword to enter: \"" + keyword + "\" !";
}
@Override
public synchronized void start() {
timer = new Timer(time);
entrants = new ArrayList<>();
super.start();
}
@Override
public void run() {
while (!GUIMain.shutDown && timer.isRunning()) {
try {
Thread.sleep(500);
} catch (InterruptedException ignored) {
}
updateGUI();
}
//pick the user
if (!isDone) {
isDone = true;
pickWinner();
}
}
private void updateGUI()
{
if (GUIMain.raffleGUI != null && GUIMain.raffleGUI.isVisible())
GUIMain.raffleGUI.updateRaffle(this);
}
public boolean isDone() {
return isDone;
}
private void pickWinner() {
int size = entrants.size();
if (size > 0) {
winner = entrants.get(Utils.random(0, size));
bot.sendMessage(channel, "!!! CONGRATULATIONS TO " + winner + " !!!");
} else {
bot.sendMessage(channel, "Nobody entered the giveaway... BibleThump");
winner = "Nobody :(";
}
updateGUI();
}
}