Skip to content

Instantly share code, notes, and snippets.

@heinrichquirit
Created February 5, 2014 16:06
Show Gist options
  • Save heinrichquirit/8826978 to your computer and use it in GitHub Desktop.
Save heinrichquirit/8826978 to your computer and use it in GitHub Desktop.
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