Last active
August 29, 2015 13:58
-
-
Save vemacs/10335218 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 net.thechunk.purchases; | |
import net.thechunk.chunklib.uuid.UUIDFetcher; | |
import net.thechunk.chunklib.uuid.UUIDUtils; | |
import org.bukkit.Bukkit; | |
import org.bukkit.ChatColor; | |
import org.bukkit.command.Command; | |
import org.bukkit.command.CommandSender; | |
import org.bukkit.entity.Player; | |
import org.bukkit.event.EventHandler; | |
import org.bukkit.event.Listener; | |
import org.bukkit.event.player.AsyncPlayerPreLoginEvent; | |
import org.bukkit.event.player.PlayerJoinEvent; | |
import org.bukkit.event.player.PlayerKickEvent; | |
import org.bukkit.event.player.PlayerQuitEvent; | |
import org.bukkit.permissions.PermissionAttachment; | |
import org.bukkit.plugin.java.JavaPlugin; | |
import org.bukkit.scheduler.BukkitRunnable; | |
import redis.clients.jedis.Jedis; | |
import redis.clients.jedis.JedisPool; | |
import redis.clients.jedis.JedisPoolConfig; | |
import java.util.*; | |
public class ChunkPurchases extends JavaPlugin implements Listener { | |
private JedisPool pool; | |
private final String PREFIX = "purchases:"; | |
private final String PREFIX_UUID = "purchases-uuid:"; | |
private final Map<String, Set<String>> purchases = new HashMap<>(); | |
private final Map<String, PermissionAttachment> attachments = new HashMap<>(); | |
// Plugin | |
@Override | |
public void onEnable() { | |
saveDefaultConfig(); | |
pool = new JedisPool(new JedisPoolConfig(), getConfig().getString("ip"), getConfig().getInt("port"), 0); | |
getServer().getPluginManager().registerEvents(this, this); | |
} | |
@Override | |
public void onDisable() { | |
for (Player player : Bukkit.getOnlinePlayers()) | |
player.removeAttachment(attachments.get(player.getName().toLowerCase())); | |
} | |
// Command Handler | |
@Override | |
public boolean onCommand(final CommandSender sender, Command cmd, String label, final String[] args) { | |
if (args.length < 2) return false; | |
final String playerName = args[0]; | |
PermissionAttachment attachment = attachments.get(playerName.toLowerCase()); | |
final Jedis jedis = pool.getResource(); | |
try { | |
switch (args[1].toLowerCase()) { | |
case "add": | |
if (args.length != 3) return false; | |
Bukkit.getScheduler().runTaskAsynchronously(this, new BukkitRunnable() { | |
@Override | |
public void run() { | |
String uuid = UUIDUtils.fetchUuid(playerName).toString(); | |
jedis.sadd(PREFIX + playerName.toLowerCase(), args[2].toLowerCase()); | |
jedis.sadd(PREFIX_UUID + uuid, args[2].toLowerCase()); | |
sender.sendMessage(ChatColor.GREEN + "Added " + args[2] + " to " + playerName + "."); | |
} | |
}); | |
if (attachment != null) | |
attachment.setPermission(args[2].toLowerCase(), true); | |
break; | |
case "remove": | |
if (args.length != 3) return false; | |
Bukkit.getScheduler().runTaskAsynchronously(this, new BukkitRunnable() { | |
@Override | |
public void run() { | |
String uuid = UUIDUtils.fetchUuid(playerName).toString(); | |
jedis.srem(PREFIX + playerName.toLowerCase(), args[2].toLowerCase()); | |
jedis.srem(PREFIX_UUID + uuid, args[2].toLowerCase()); | |
sender.sendMessage(ChatColor.YELLOW + "Removed " + args[2] + " from " + playerName + "."); | |
} | |
}); | |
if (attachment != null) | |
attachment.unsetPermission(args[2].toLowerCase()); | |
break; | |
case "clear": | |
Bukkit.getScheduler().runTaskAsynchronously(this, new BukkitRunnable() { | |
@Override | |
public void run() { | |
String uuid = UUIDUtils.fetchUuid(playerName).toString(); | |
jedis.del(PREFIX + playerName.toLowerCase()); | |
jedis.del(PREFIX_UUID + uuid); | |
sender.sendMessage(ChatColor.YELLOW + "Cleared purchases from " + playerName + "."); | |
} | |
}); | |
if (attachment != null) | |
for (String permission : attachment.getPermissions().keySet()) | |
attachment.unsetPermission(permission); | |
break; | |
case "list": | |
Bukkit.getScheduler().runTaskAsynchronously(this, new BukkitRunnable() { | |
@Override | |
public void run() { | |
String uuid = UUIDUtils.fetchUuid(playerName).toString(); | |
Set<String> purchases = jedis.smembers(PREFIX_UUID + uuid); | |
if (purchases == null || purchases.size() == 0) | |
purchases = jedis.smembers(PREFIX + playerName.toLowerCase()); | |
sender.sendMessage(ChatColor.GREEN + "Purchases for " + playerName + ":"); | |
for (String purchase : purchases) | |
sender.sendMessage(ChatColor.GREEN + "- " + purchase); | |
} | |
}); | |
break; | |
default: | |
return false; | |
} | |
} finally { | |
pool.returnResource(jedis); | |
} | |
return true; | |
} | |
// Listener | |
@EventHandler(ignoreCancelled = true) | |
public void onAsyncPlayerPreLogin(AsyncPlayerPreLoginEvent event) { | |
Jedis jedis = pool.getResource(); | |
try { | |
String uuidKey = PREFIX_UUID + event.getUniqueId().toString(); | |
String nameKey = PREFIX + event.getName().toLowerCase(); | |
if (!jedis.exists(uuidKey) && jedis.exists(nameKey)) | |
jedis.sdiffstore(uuidKey, nameKey, "EMPTY_SET_KEY"); | |
Set<String> members = jedis.smembers(PREFIX_UUID + event.getUniqueId().toString()); | |
purchases.put(event.getName().toLowerCase(), members == null ? new HashSet<String>() : members); | |
} finally { | |
pool.returnResource(jedis); | |
} | |
} | |
@EventHandler | |
public void onPlayerJoin(PlayerJoinEvent event) { | |
Player player = event.getPlayer(); | |
PermissionAttachment attachment = player.addAttachment(this); | |
Set<String> purchaseSet = purchases.get(player.getName().toLowerCase()); | |
for (String purchase : purchaseSet) | |
attachment.setPermission(purchase, true); | |
attachments.put(player.getName().toLowerCase(), attachment); | |
purchases.remove(player.getName().toLowerCase()); | |
} | |
@EventHandler | |
public void onPlayerQuit(PlayerQuitEvent event) { | |
Player player = event.getPlayer(); | |
player.removeAttachment(attachments.get(player.getName().toLowerCase())); | |
attachments.remove(player.getName().toLowerCase()); | |
} | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment