Created
February 5, 2014 16:06
-
-
Save heinrichquirit/8826978 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package main.java.net.bigbadcraft.votelogger; | |
import java.io.File; | |
import java.io.IOException; | |
import java.util.ArrayList; | |
import java.util.Calendar; | |
import java.util.HashMap; | |
import java.util.List; | |
import java.util.Map.Entry; | |
import java.util.TreeMap; | |
import java.util.logging.Level; | |
import org.bukkit.Bukkit; | |
import org.bukkit.ChatColor; | |
import org.bukkit.Material; | |
import org.bukkit.command.Command; | |
import org.bukkit.command.CommandSender; | |
import org.bukkit.configuration.file.FileConfiguration; | |
import org.bukkit.configuration.file.YamlConfiguration; | |
import org.bukkit.entity.Player; | |
import org.bukkit.event.EventHandler; | |
import org.bukkit.event.Listener; | |
import org.bukkit.event.player.PlayerCommandPreprocessEvent; | |
import org.bukkit.event.player.PlayerJoinEvent; | |
import org.bukkit.inventory.ItemStack; | |
import org.bukkit.plugin.java.JavaPlugin; | |
import org.bukkit.scheduler.BukkitRunnable; | |
import com.vexsoftware.votifier.model.VotifierEvent; | |
public class VoteLogger extends JavaPlugin implements Listener { | |
private final HashMap<String, ArrayList<String>> rewarded = new HashMap<String, ArrayList<String>>(); | |
private final HashMap<String, Integer> votes = new HashMap<String, Integer>(); | |
private final ValueComparator comparator = new ValueComparator(votes); | |
private final TreeMap<String, Integer> sortedVotes = new TreeMap<String, Integer>(comparator); | |
private List<String> rewards; | |
private final ChatColor T = ChatColor.DARK_AQUA; | |
private final ChatColor A = ChatColor.AQUA; | |
private final String PREFIX = A + "[VoteLogger]"; | |
public File votesFile; | |
public FileConfiguration votesConf; | |
public File rewardedFile; | |
public FileConfiguration rewardedConf; | |
private ConfigHandler confHandler; | |
private boolean enableLogger; | |
private int topVotes; | |
public void onEnable() { | |
saveDefaultConfig(); | |
enableLogger = getConfig().getBoolean("enableLogging"); | |
topVotes = getConfig().getInt("topVotes"); | |
rewards = getConfig().getStringList("rewards"); | |
votesFile = new File(getDataFolder(), "votes" + getCurrentMonth().substring(0, 3) + ".yml"); | |
rewardedFile = new File(getDataFolder(), "rewarded" + getCurrentMonth().substring(0, 3) + ".yml"); | |
/* Create files */ | |
loadFile(votesFile); | |
loadFile(rewardedFile); | |
confHandler = new ConfigHandler(this); | |
votesConf = YamlConfiguration.loadConfiguration(votesFile); | |
confHandler.reloadVotesConf(); | |
rewardedConf = YamlConfiguration.loadConfiguration(rewardedFile); | |
confHandler.reloadRewardedConf(); | |
getServer().getPluginManager().registerEvents(this, this); | |
getCommand("votelogger").setExecutor(this); | |
} | |
public void onDisable() { | |
confHandler.reloadVotesConf(); | |
confHandler.saveVotesConf(); | |
confHandler.reloadRewardedConf(); | |
confHandler.saveRewardedConf(); | |
votes.clear(); | |
sortedVotes.clear(); | |
rewarded.clear(); | |
} | |
@EventHandler | |
public void onCCommand(PlayerCommandPreprocessEvent event) { | |
if (event.getMessage().startsWith("/warp") || | |
event.getMessage().startsWith("/warp") && event.getMessage().split(" ").length >= 1) { | |
} | |
} | |
@EventHandler | |
public void onJoin(PlayerJoinEvent event) { | |
/* Just to register their name and votes to 0 */ | |
Player player = event.getPlayer(); | |
String name = player.getName(); | |
if (!votesConf.contains(name)) { | |
confHandler.reloadVotesConf(); | |
votesConf.set(name, 0); | |
confHandler.saveVotesConf(); | |
log(Level.INFO, "Registered " + name + " to votes file."); | |
} | |
if (!rewardedConf.contains(name)) { | |
confHandler.reloadRewardedConf(); | |
rewardedConf.set(name, new ArrayList<String>()); | |
confHandler.saveRewardedConf(); | |
log(Level.INFO, "Registered " + name + " to rewarded file."); | |
} | |
/* If the player has any, add it to inventory */ | |
givePendingVoteReward(player); | |
} | |
@EventHandler | |
public void onVote(VotifierEvent event) { | |
String name = event.getVote().getUsername(); | |
if (!votesConf.contains(name)) { | |
confHandler.reloadVotesConf(); | |
votesConf.set(name, 1); | |
confHandler.saveVotesConf(); | |
log(Level.INFO, "Saved " + name + " votes to file."); | |
} else { | |
confHandler.reloadVotesConf(); | |
votesConf.set(name, votesConf.getInt(name) + 1); | |
confHandler.saveVotesConf(); | |
log(Level.INFO, "Saved " + name + " votes to file."); | |
} | |
} | |
public boolean onCommand(CommandSender sender, Command cmdObj, String lbl, String[] args) { | |
if (sender instanceof Player) { | |
Player player = (Player) sender; | |
if (cmdObj.getName().equalsIgnoreCase("votelogger")) { | |
if (args.length == 0) { | |
player.sendMessage(helpMenu()); | |
} | |
else if (args.length == 1) { | |
if (args[0].equalsIgnoreCase("top")) { | |
displayTopVotes(player); | |
} | |
else if (args[0].equalsIgnoreCase("view")) { | |
player.sendMessage(PREFIX + T + " Your votes for " + getCurrentMonth() + " is: " + votesConf.getInt(player.getName())); | |
} | |
} | |
else if (args.length == 2) { | |
if (args[0].equalsIgnoreCase("view")) { | |
String name = args[1]; | |
if (votesConf.contains(name)) { | |
player.sendMessage(PREFIX + T + " " + name + "'s votes for " + getCurrentMonth() + " is: " + votesConf.getInt(name)); | |
} else { | |
player.sendMessage(PREFIX + T + " " + name + " has no votes."); | |
} | |
} | |
} | |
} | |
} | |
return true; | |
} | |
public String getCurrentMonth() { | |
switch(Calendar.getInstance().get(Calendar.MONTH) + 1) { | |
case 1: return "January"; | |
case 2: return "February"; | |
case 3: return "March"; | |
case 4: return "April"; | |
case 5: return "May"; | |
case 6: return "June"; | |
case 7: return "July"; | |
case 8: return "August"; | |
case 9: return "September"; | |
case 10: return "October"; | |
case 11: return "November"; | |
case 12: return "December"; | |
default: return ""; | |
} | |
} | |
private void loadFile(File file) { | |
if (!file.exists()) { | |
try { | |
file.createNewFile(); | |
} catch (IOException e) { | |
e.printStackTrace(); | |
} | |
} | |
} | |
private String helpMenu() { | |
return T + "---------------(" + A + "VoteLogger" + T + ")---------------\n" | |
+ A + "Shortcut:" + T + " /vl or /vlogger\n" | |
+ A + "-/votelogger top" + T + " - Display top " + topVotes + " votes.\n" | |
+ A + "-/votelogger view" + T + " - Display your votes.\n" | |
+ A + "-/votelogger view <player>" + T + " - Display player's votes\n" | |
+ T + "-----------------------------------------"; | |
} | |
private void log(Level level, String message) { | |
if (enableLogger) { | |
Bukkit.getLogger().log(level, message); | |
} | |
} | |
private void displayTopVotes(final Player player) { | |
/* We need to clear the maps and re-update them again for new votes */ | |
if (!votes.isEmpty()) votes.clear(); | |
if (!sortedVotes.isEmpty()) sortedVotes.clear(); | |
for (String pathName : votesConf.getKeys(true)) { | |
if (!votes.containsKey(pathName)) { | |
votes.put(pathName, votesConf.getInt(pathName)); | |
} | |
} | |
sortedVotes.putAll(votes); | |
if (sortedVotes.size() < topVotes) { | |
player.sendMessage(PREFIX + T + " Unable to display. Total votes for " + getCurrentMonth() + " is less than " + topVotes + "."); | |
return; | |
} | |
confHandler.reloadVotesConf(); | |
player.sendMessage(PREFIX + T + " Ordering top votes for " + getCurrentMonth() + "."); | |
Bukkit.getScheduler().scheduleSyncRepeatingTask(this, new BukkitRunnable() { | |
int position = 1; | |
@Override | |
public void run() { | |
player.sendMessage(T + "----------(" + A + "Top Votes" + T + ")----------"); | |
for (Entry<String, Integer> entry : sortedVotes.entrySet()) { | |
if (position != topVotes + 1) { | |
player.sendMessage(A + "" + position++ + ". " + entry.getKey() + ": " + T + entry.getValue()); | |
} | |
} | |
player.sendMessage(T + "------------------------------"); | |
} | |
}, 20 * 1, 20 * 10); | |
} | |
private void givePendingVoteReward(Player player) { | |
String name = player.getName(); | |
if (rewards.size() == 0) { | |
Bukkit.getLogger().severe("You need to add rewards to reward path in your configuration settings."); | |
return; | |
} | |
/* | |
* The real problem | |
* On first join, the rewards path is populate with the appropriate elements | |
* on reload and second join, the rewards path only contains the first element. | |
*/ | |
for (String itemRewards : rewards) { | |
String[] values = itemRewards.split(":"); | |
if (hasBeenRewarded(player, values[0])) return; | |
try { | |
if (votesConf.getInt(name) >= Integer.parseInt(values[2])) { | |
if (player.getInventory().firstEmpty() != -1) { | |
ItemStack item = new ItemStack(Material.valueOf(values[0].toUpperCase()), Integer.parseInt(itemRewards.split(":")[1])); | |
String itemName = item.getType().name().toLowerCase(); | |
player.getInventory().addItem(item); | |
setReceivedItem(name, itemName); | |
player.sendMessage(PREFIX + T + " You have been rewarded " + values[1] + " " + itemName + "(s)"); | |
} | |
} | |
} catch (NumberFormatException e) { | |
Bukkit.getLogger().severe("Check your format for your rewards path in your configuration settings."); | |
e.printStackTrace(); | |
} | |
} | |
} | |
/* Check to see if the player hasn't been rewarded for a certain item */ | |
private boolean hasBeenRewarded(Player player, String reward) { | |
if (rewardedConf.contains(player.getName())) { | |
List<String> list = rewardedConf.getStringList(player.getName()); | |
if (list != null) { | |
for (String line : list) { | |
return line.toLowerCase().substring(0, reward.length()).equals(reward.toLowerCase()); | |
} | |
} | |
} | |
return false; | |
} | |
private void setReceivedItem(String name, String itemName) { | |
/* We create a new array list for each player then | |
* we update the status for the items, so we know | |
* if they've received their items, to prevent them | |
* receiving more. | |
*/ | |
if (!rewarded.containsKey(name)) { | |
ArrayList<String> list = new ArrayList<String>(); | |
list.add(itemName + ":received"); | |
rewarded.put(name, list); | |
} else { | |
ArrayList<String> list = rewarded.get(name); | |
if (list != null) { | |
if (!list.contains(itemName + ":received")) { | |
list.add(itemName + ":received"); | |
rewarded.put(name, list); | |
} | |
} | |
} | |
/* We set the player's path to their array-list from map */ | |
if (rewarded.containsKey(name)) { | |
if (rewarded.get(name) != null) { | |
confHandler.reloadRewardedConf(); | |
rewardedConf.set(name, rewarded.get(name)); | |
confHandler.saveRewardedConf(); | |
} | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment