Skip to content

Instantly share code, notes, and snippets.

@vemacs
Last active August 29, 2015 13:58
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save vemacs/10335218 to your computer and use it in GitHub Desktop.
Save vemacs/10335218 to your computer and use it in GitHub Desktop.
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