package net.diamonddominion.esaych.global;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import net.diamonddominion.esaych.CustomPlugin;
import net.diamonddominion.esaych.util.DonationCredit;
import net.diamonddominion.esaych.util.SQL;
import net.diamonddominion.esaych.util.Vote;
import net.diamonddominion.esaych.util.VoteSQL;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.GameMode;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
public class VoteRewards {
CustomPlugin plugin;
public VoteRewards(CustomPlugin plugin) {
this.plugin = plugin;
}
public Map<String, Map<Integer, Integer>> rewardCache = new HashMap<String, Map<Integer, Integer>>();
String head = "&2|&6-----------=-=-----=-=&2[ &bD D &2]&6=-=-----=-=---------&2|";
@SuppressWarnings("deprecation")
public void enable() {
Bukkit.getScheduler().scheduleAsyncRepeatingTask(plugin, new Runnable() {
@Override
public void run() {
updateRewards();
}
}, 5, 20*5);
log("Enabled");
}
public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) {
if (args.length == 0 || !(sender instanceof Player)) {
msg(sender, head);
msg(sender, " &lGO TO &b&ohttp://www.diamonddominion.net/vote");
msg(sender, " &a&lVOTE FOR US! -=- YOU WILL GET PRIZES");
msg(sender, "&2|&b/vote redeem&6 to exchange votes prizes.");
msg(sender, "&2|&b/vote stats&6 to see what you currently have.");
msg(sender, head);
// msg(sender, "Visit the website to use up donation credits you earn.");
// msg(sender, "Voting helps our server gain popularity on server listing sites.");
return true;
} else {
Player player = (Player) sender;
String arg = args[0];
if (arg.equalsIgnoreCase("redeem")) {
if (args.length < 3) {
msg(player, head);
msg(player, "You have &b" + VoteSQL.getVotesNotRewarded(player.getName()) + "&6 votes to buy prizes.");
msg(player, "Type &b/vote redeem <prize id> <prize amount>");
msg(player, "| &2PrizeID&6 | &2VoteCost&6 | -- &2Prize Name &6--");
for (int x = 1; x <= VotePrize.prizeAmount; x++) {
msg(player, "&6 -- &b" + x + " &6-- | -- &b" + VotePrize.getCost(x) + "&6 --- | &a" + VotePrize.getDescription(x));
}
msg(player, head);
return true;
} else {
String strid = args[1];
int id;
try {
id = Integer.parseInt(strid);
} catch (Exception e) {
msg(player, "&4Error: &cPrize ID is incorrect.");
msg(player, "Type &b/vote redeem <prize id> <prize amount>");
return true;
}
if (!VotePrize.isValid(id)) {
msg(player, "&4Error: &cThere is no such prize id.");
msg(player, "Type &b/vote redeem <prize id> <prize amount>");
return true;
}
String strvotes = args[2];
int votesNum;
try {
votesNum = Integer.parseInt(strvotes);
} catch (Exception e) {
msg(player, "&4Error: &cVote number is incorrect.");
msg(player, "Type &b/vote redeem <prize id> <prize amount>");
return true;
}
redeem(player, id, votesNum);
return true;
}
} else if (arg.equalsIgnoreCase("stats")) {
msg(player, head);
msg(player, "&5Your stats:");
msg(player, "Unredeemed votes: &a" + VoteSQL.getVotesNotRewarded(player.getName()));
msg(player, "Donation credits: &a" + DonationCredit.getCredits(player.getName()));
msg(player, "Total votes ever: &a" + VoteSQL.getAllPlayerVotes(player.getName()));
msg(player, "Votes in last 24 hours: &a" + VoteSQL.getVotesLast24(player.getName()));
msg(player, head);
return true;
} else if (arg.equalsIgnoreCase("complete")) {
if (!redeemQueue.containsKey(player.getName())) {
msg(player, "&4Error: &cYou do not have a pending prize request.");
msg(player, "Type &b/vote redeem <prize id> <prize amount>");
return true;
}
int id = Integer.parseInt(redeemQueue.get(player.getName()).split(";")[0]);
int amount = Integer.parseInt(redeemQueue.get(player.getName()).split(";")[1]);
redeemQueue.remove(player.getName());
ArrayList<Vote> votes = VoteSQL.filterVotes(player.getName(), 0, null, true, false);
int cost = VotePrize.getCost(id) * amount;
int has = votes.size();
if (cost > has) {
msg(player, "&4Error: &cYou can't redeem a prize that costs " + cost + " votes, but only have " + has + " votes to spend.");
return true;
}
if (id == 4 || id == 5) {
msg(player, "&4Error: &cPrizes 4-5 have not been set up yet.");
return true;
}
String name = VotePrize.getName(id).toLowerCase();
if (name.equals("fly")) {
if (player.hasPermission("fly.fly")) {
msg(player, "&4Error: &cYou already have Premium! You don't need to pay votes for Fly Mode");
return true;
}
if (!plugin.detectedServer().equals("survival")) {
msg(player, "&4Error: &cFly Mode is only available on the Survival server");
return true;
}
}
if (name.equals("god")) {
if (player.hasPermission("fairgod.fair")) {
msg(player, "&4Error: &cYou already have Premium! You don't need to pay votes for God Mode");
return true;
}
if (!plugin.detectedServer().equals("survival")) {
msg(player, "&4Error: &cGod Mode is only available on the Survival server");
return true;
}
}
if (name.equals("creative")) {
if (player.hasPermission("customplugin.creative")) {
msg(player, "&4Error: &cYou already have DemiGod! You don't need to pay votes for Creative");
return true;
}
if (!plugin.detectedServer().equals("survival")) {
msg(player, "&4Error: &cCreative Mode is only available on the Survival server");
return true;
}
int a = 0;
for (ItemStack i : player.getInventory()) {
if (i != null)
a++;
}
boolean helm = (player.getInventory().getHelmet() != null);
boolean ches = (player.getInventory().getChestplate() != null);
boolean legg = (player.getInventory().getLeggings() != null);
boolean boot = (player.getInventory().getBoots() != null);
if (a > 0 || helm || ches || legg || boot) {
msg(player, "&4Error: &cYou must clear your inventory completely to switch to creative mode.");
return true;
}
}
// ---- ---- REWARD SCRIPT ---- ----
//Pay Cost
int voteCounter = 1;
for (Vote vote : votes) {
if (voteCounter <= cost) {
vote.rewardVote(id);
} else {
break;
}
voteCounter++;
}
//Add to DB the reward
int mins = VotePrize.getExtraVar(id)*amount;
int expiretime = (int) (System.currentTimeMillis()/1000) + (60*mins);
try {
Statement st = (Statement) SQL.getConnection().createStatement();
ResultSet result = st.executeQuery("SELECT * FROM `dd-voterewards` WHERE `player` = '" + player.getName() + "' && `expiretime` > '" + System.currentTimeMillis()/1000 + "';");
while (result.next()) {
int qid = result.getInt("prizeid");
int qexpire = result.getInt("expiretime");
if (qid == id) {
expiretime = qexpire + (60*mins);
}
}
} catch (Exception e) {
e.printStackTrace();
}
SQL.singleQuery("INSERT INTO `dd-voterewards`(`player`, `prizeid`, `expiretime`) VALUES ('" + player.getName() + "' , '" + id + "', '" + expiretime + "')");
msg(player, head);
if (id <= 5) {
Map<Integer, Integer> data = new HashMap<Integer, Integer>();
if (rewardCache.containsKey(player)) {
data = rewardCache.get(player);
}
data.put(id, expiretime);
rewardCache.put(player.getName(), data);
}
if (name.equals("healing")) {
double health = player.getHealth();
health += VotePrize.getExtraVar(id);
if (health > 20)
health = 20;
player.setFoodLevel((int) health);
msg(player, "You have been healed.");
}
if (name.equals("food")) {
int foodLevel = player.getFoodLevel();
foodLevel += VotePrize.getExtraVar(id);
if (foodLevel > 20)
foodLevel = 20;
player.setFoodLevel(foodLevel);
msg(player, "You have been fed.");
}
if (name.equals("xp")) {
player.giveExp(VotePrize.getExtraVar(id));
msg(player, "You have been given &b" + VotePrize.getExtraVar(id) + "&6 XP.");
}
if (name.equals("fly")) {
player.setAllowFlight(true);
player.setFlying(true);
msg(player, "You are now flying.");
}
if (name.equals("god")) {
if (!plugin.fairGod.isGod(player)) {
plugin.fairGod.toggleGod(player, true);
msg(player, "You now have God mode.");
}
}
if (name.equals("creative")) {
player.setGameMode(GameMode.CREATIVE);
msg(player, "You are now in creative.");
}
// ---- ---- END REWARD SCRIPT ---- ----
msg(player, "You now have &b" + VoteSQL.getVotesNotRewarded(player.getName()) + "&6 votes to spend.");
msg(player, head);
return true;
} else {
msg(player, "Command not found");
return true;
}
}
}
Map<String, String> redeemQueue = new HashMap<String, String>();
public void redeem(Player player, int id, int prizeamount) {
int cost = VotePrize.getCost(id) * prizeamount;
int has = VoteSQL.getVotesNotRewarded(player.getName());
if (cost > has) {
msg(player, "&4Error: &cYou can't redeem a prize that costs " + cost + " votes, but only have " + has + " votes to spend.");
return;
}
msg(player, head);
msg(player, "You are spending &a" + cost + "&6 votes for &a" + prizeamount + "&6 of the prize: &a" + VotePrize.getName(id));
redeemQueue.put(player.getName(), id + ";" + prizeamount);
msg(player, "Type &b/vote complete&6 to complete your spending");
msg(player, head);
}
public void updateRewards() {
Connection con = null;
Map<String, Map<Integer, Integer>> temprewardCache = new HashMap<String, Map<Integer, Integer>>();
try {
con = SQL.getConnection();
Statement st = (Statement) con.createStatement();
ResultSet result = st.executeQuery("SELECT * FROM `dd-voterewards` WHERE `expiretime` > '" + System.currentTimeMillis()/1000 + "';");
while (result.next()) {
String player = result.getString("player");
int prizeid = result.getInt("prizeid");
int expire = result.getInt("expiretime");
Map<Integer, Integer> data = new HashMap<Integer, Integer>();
if (temprewardCache.containsKey(player)) {
data = temprewardCache.get(player);
}
data.put(prizeid, expire);
temprewardCache.put(player, data);
}
} catch (SQLException e1) {
e1.printStackTrace();
return;
}
updatePlayerRewardStatus(temprewardCache);
rewardCache = temprewardCache;
}
private Map<String, Integer> generateData(Map<String, Map<Integer, Integer>> data) {
Map<String, Integer> set = new HashMap<String, Integer>();
for (String player : data.keySet()) {
Map<Integer, Integer> prizeMap = data.get(player);
for (int i : prizeMap.keySet()) {
set.put(player + ";" + i, prizeMap.get(i));
}
}
return set; //RETURNS IN FORMAT: Name;PrizeId > TimeStamp
}
@SuppressWarnings("deprecation")
public void updatePlayerRewardStatus(Map<String, Map<Integer, Integer>> tempSet) {
Map<String, Integer> tempData = generateData(tempSet);
Map<String, Integer> prevData = generateData(rewardCache);
int now = (int) (System.currentTimeMillis()/1000);
String server = plugin.detectedServer();
for (String data : tempData.keySet()) {
Player player = Bukkit.getPlayer(data.split(";")[0]);
int prizeId = Integer.parseInt(data.split(";")[1]);
String name = VotePrize.getName(prizeId).toLowerCase();
if (player != null) {
if (server.equals("survival")) {
if (name.equals("fly")) {
player.setAllowFlight(true);
}
if (name.equals("god")) {
if (!plugin.fairGod.isGod(player)) {
plugin.fairGod.toggleGod(player, true);
}
}
if (name.equals("creative")) {
player.setGameMode(GameMode.CREATIVE);
}
int prizeTime = tempData.get(data) - now;
// if (prizeTime <= 10) {
// msg(player, "You have 10 secs remaining for: " + VotePrize.getName(prizeId));
// } else if (prizeTime <= 60) {
// msg(player, "You have 1 min remaining for: " + VotePrize.getName(prizeId));
// } else if (prizeTime <= 120) {
// msg(player, "You have 2 mins remaining for: " + VotePrize.getName(prizeId));
// } else if (prizeTime <= 300) {
// msg(player, "You have 5 mins remaining for: " + VotePrize.getName(prizeId));
// }
if (prizeTime >= 60)
msg(player, "You have &e" + (int)prizeTime/60 + "&6 mins remaining for: &a" + VotePrize.getName(prizeId));
if (prizeTime < 60)
msg(player, "You have &e" + ((int)prizeTime/5)*5 + "&6 secs remaining for: &a" + VotePrize.getName(prizeId));
//Set player to be doing what their reward requests
//Send reminders of when their reward will run out
}
} else {
msg(player, "Go back to SV! Vote prize time is running out! (And you can't use those prizes in this world)");
}
}
for (String data : prevData.keySet()) {
if (!tempData.containsKey(data)) {
Player player = Bukkit.getPlayer(data.split(";")[0]);
int prizeId = Integer.parseInt(data.split(";")[1]);
String name = VotePrize.getName(prizeId).toLowerCase();
msg(player, "Your prize: &a" + VotePrize.getName(prizeId) + " &6has expired.");
if (name.equals("fly")) {
player.setFlying(false);
player.setAllowFlight(false);
}
if (name.equals("god")) {
if (!plugin.fairGod.isGod(player))
plugin.fairGod.toggleGod(player, true);
}
if (name.equals("creative")) {
player.getInventory().clear();
player.getInventory().setHelmet(new ItemStack(0));
player.getInventory().setChestplate(new ItemStack(0));
player.getInventory().setLeggings(new ItemStack(0));
player.getInventory().setBoots(new ItemStack(0));
player.setGameMode(GameMode.SURVIVAL);
}
//If players not in tempData, set expired & msg
}
}
}
public void msg(CommandSender player, String msg) {
if (player instanceof Player) {
player.sendMessage(ChatColor.translateAlternateColorCodes("&".charAt(0), "&6" + msg.replaceAll("%name", player.getName())));
} else {
log(msg);
}
}
// private void cmd(String player, String cmd) {
// Bukkit.getServer().dispatchCommand(Bukkit.getServer().getConsoleSender(), cmd.replaceAll("%name", player));
// }
public void msg(String player, String msg) {
ByteArrayOutputStream b = new ByteArrayOutputStream();
DataOutputStream out = new DataOutputStream(b);
try {
out.writeUTF("Message");
out.writeUTF(player);
out.writeUTF(ChatColor.translateAlternateColorCodes("&".charAt(0), "&6[&bDD&2Votes&6] " + msg));
} catch (IOException e) {
e.printStackTrace();
}
Player p = Bukkit.getOnlinePlayers()[0];
p.sendPluginMessage(plugin, "BungeeCord", b.toByteArray());
}
public void log(String info) {
plugin.getLogger().info("<VoteRewards> " + info);
}
}