From 778da9d56b03ba0a51c1544822f2c57e368ca511 Mon Sep 17 00:00:00 2001 From: Your Name Date: Sun, 24 Jul 2011 16:37:39 +0200 Subject: [PATCH] Fix for Permissions 3.x (2.x should still work) --- META-INF/MANIFEST.MF | 8 + .../Permissions/GroupManagerResolver.java | 66 ++++++ .../Permissions/NijiPermissionsResolver.java | 6 +- com/nidefawl/Stats/Stats.java | 2 +- com/nidefawl/Stats/StatsServerListener.java | 44 ++++ com/nidefawl/Stats/StatsView.java | 223 ++++++++++++++++++ com/nidefawl/Stats/udpates/Update1.java | 15 ++ com/nidefawl/Stats/udpates/Update2.java | 96 ++++++++ plugin.yml | 2 +- 9 files changed, 459 insertions(+), 3 deletions(-) create mode 100755 META-INF/MANIFEST.MF create mode 100755 com/nidefawl/Stats/Permissions/GroupManagerResolver.java create mode 100755 com/nidefawl/Stats/StatsServerListener.java create mode 100755 com/nidefawl/Stats/StatsView.java create mode 100755 com/nidefawl/Stats/udpates/Update1.java create mode 100755 com/nidefawl/Stats/udpates/Update2.java diff --git a/META-INF/MANIFEST.MF b/META-INF/MANIFEST.MF new file mode 100755 index 0000000..8cf8961 --- /dev/null +++ b/META-INF/MANIFEST.MF @@ -0,0 +1,8 @@ +Manifest-Version: 1.0 +Class-Path: Stats/lib/sqlite.jar Stats/lib/mysql.jar GroupManager.jar Permissions.jar + + + + + + diff --git a/com/nidefawl/Stats/Permissions/GroupManagerResolver.java b/com/nidefawl/Stats/Permissions/GroupManagerResolver.java new file mode 100755 index 0000000..0beea7f --- /dev/null +++ b/com/nidefawl/Stats/Permissions/GroupManagerResolver.java @@ -0,0 +1,66 @@ +package com.nidefawl.Stats.Permissions; + +import java.util.logging.Logger; + +import org.anjocaido.groupmanager.GroupManager; +import org.anjocaido.groupmanager.data.Group; +import org.anjocaido.groupmanager.data.User; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; + +public class GroupManagerResolver implements PermissionsResolver { + public static final Logger log = Logger.getLogger("Minecraft"); + Plugin plugin = null; + private GroupManager perms = null; + + public GroupManagerResolver(Plugin plugin) { + this.plugin = plugin; + } + + @Override + public boolean load() { + if (perms == null) { + Plugin checkPlugin = plugin.getServer().getPluginManager().getPlugin("GroupManager"); + if (checkPlugin != null && checkPlugin.isEnabled() && checkPlugin instanceof GroupManager) { + perms = (GroupManager) checkPlugin; + } else + return false; + } + return true; + } + + @Override + public boolean permission(CommandSender sender, String permCmd) { + if(sender.isOp()) return true; + if(!(sender instanceof Player)) return false; + if (!load()) + return false; + final Player player = (Player)sender; + return perms.getWorldsHolder().getWorldData(player).getPermissionsHandler().has(player, permCmd); + } + + + @Override + public boolean inGroup(Player player, String group) { + if (!load()) + return false; + Group g = perms.getWorldsHolder().getWorldData(player).getGroup(group); + if(g==null) return false; + User u = perms.getWorldsHolder().getWorldData(player).getUser(player.getName()); + if(u==null) return false; + return u.containsSubGroup(g)||u.getGroup().equals(g); + } + + @Override + public void reloadPerms() { + } + + @Override + public String getGroup(Player player) { + User u = perms.getWorldsHolder().getWorldData(player).getUser(player.getName()); + if(u==null) return ""; + return u.getGroupName(); + } + +} diff --git a/com/nidefawl/Stats/Permissions/NijiPermissionsResolver.java b/com/nidefawl/Stats/Permissions/NijiPermissionsResolver.java index 33e7145..f8e1da8 100755 --- a/com/nidefawl/Stats/Permissions/NijiPermissionsResolver.java +++ b/com/nidefawl/Stats/Permissions/NijiPermissionsResolver.java @@ -59,7 +59,11 @@ public class NijiPermissionsResolver implements PermissionsResolver { public void reloadPerms() { if (!load()) return; - perms.setupPermissions(); + if(Permissions.version.toLowerCase().startsWith("3.")) { + ((Permissions)Permissions.instance).getHandler().reload(); + } else { + perms.setupPermissions(); + } } } diff --git a/com/nidefawl/Stats/Stats.java b/com/nidefawl/Stats/Stats.java index eaea16f..8345025 100755 --- a/com/nidefawl/Stats/Stats.java +++ b/com/nidefawl/Stats/Stats.java @@ -41,7 +41,7 @@ import com.nidefawl.Stats.util.Updater; public class Stats extends JavaPlugin { public final static Logger log = Logger.getLogger("Minecraft"); - public final static double version = 0.985; + public final static double version = 0.99; public final static String logprefix = "[Stats-" + version + "]"; public final static String defaultCategory = "stats"; public boolean enabled = false; diff --git a/com/nidefawl/Stats/StatsServerListener.java b/com/nidefawl/Stats/StatsServerListener.java new file mode 100755 index 0000000..93f8627 --- /dev/null +++ b/com/nidefawl/Stats/StatsServerListener.java @@ -0,0 +1,44 @@ +package com.nidefawl.Stats; + +import org.bukkit.event.server.PluginDisableEvent; +import org.bukkit.event.server.PluginEnableEvent; +import org.bukkit.event.server.ServerListener; +import org.bukkit.plugin.Plugin; + +import com.nidefawl.Stats.Permissions.GroupManagerResolver; +import com.nidefawl.Stats.Permissions.NijiPermissionsResolver; +import com.nidefawl.Stats.Permissions.defaultResolver; + +public class StatsServerListener extends ServerListener { + Stats stats = null; + public StatsServerListener(Stats plugin) { + this.stats = plugin; + } + @Override + public void onPluginEnable(PluginEnableEvent event) { + Plugin plugin = event.getPlugin(); + String name = plugin.getDescription().getName(); + if (name.equals("GroupManager")) { + stats.setPerms(new GroupManagerResolver(plugin)); + } else if (name.equals("Permissions")) { + stats.setPerms(new NijiPermissionsResolver(plugin)); + } + } + + /** + * Called when a plugin is disabled + * + * @param event Relevant event details + */ + @Override + public void onPluginDisable(PluginDisableEvent event) { + Plugin plugin = event.getPlugin(); + String name = plugin.getDescription().getName(); + if (name.equals("GroupManager")) { + stats.setPerms(new defaultResolver()); + } else if (name.equals("Permissions")) { + stats.setPerms(new defaultResolver()); + } + } + +} diff --git a/com/nidefawl/Stats/StatsView.java b/com/nidefawl/Stats/StatsView.java new file mode 100755 index 0000000..b63d53f --- /dev/null +++ b/com/nidefawl/Stats/StatsView.java @@ -0,0 +1,223 @@ +package com.nidefawl.Stats; + +import java.sql.Date; +import java.text.SimpleDateFormat; +import java.util.List; +import java.util.Set; +import org.bukkit.ChatColor; +import org.bukkit.Server; +import org.bukkit.command.CommandSender; +import org.bukkit.command.ConsoleCommandSender; +import org.bukkit.entity.Player; +import com.nidefawl.Stats.datasource.Category; +import com.nidefawl.Stats.datasource.PlayerStat; + +public class StatsView { + + public static boolean onCommand(Stats plugin, CommandSender sender, String[] args) { + if (!plugin.Perms().permission(sender, "stats.view.own")) { + sender.sendMessage(ChatColor.RED + "You don't have permission to view your stats!"); + return true; + } + Player who = null; + if (sender instanceof Player) { + who = (Player) sender; + } + int offs = 0; + if (args.length > 0) { + who = playerMatch(plugin.getServer(), args[0]); + if (who != null) { + if (!plugin.Perms().permission(sender, "stats.view.others")) { + sender.sendMessage(ChatColor.RED + "You don't have permission to view others stats!"); + return true; + } + offs++; + } else { + if ((sender instanceof ConsoleCommandSender)) { + sender.sendMessage(ChatColor.RED + "Player '" + args[0] + "' is not online!"); + return false; + } else { + who = (Player) sender; + } + } + } + if (args.length == offs + 1) { + if (isStat(plugin, who.getName(), args[offs])) { + printStat(plugin, sender, who, "stats", args[offs]); + return true; + } else if (plugin.getItems().getItem(args[offs]) != 0 && !(args[offs].equals("boat") || args[offs].equals("minecart"))) { + printStat(plugin, sender, who, "blockcreate", args[offs]); + printStat(plugin, sender, who, "blockdestroy", args[offs]); + return true; + } else if (isCat(plugin, who.getName(), args[offs])) { + sender.sendMessage(StatsSettings.premessage + "Please choose: (/stats " + args[offs] + " )"); + sender.sendMessage(StatsSettings.premessage + ChatColor.WHITE + getCatEntries(plugin, who.getName(), args[offs])); + return true; + } else { + sender.sendMessage(StatsSettings.premessage + ChatColor.RED + "stat/category '" + args[offs] + "' not found. Possible values:"); + sender.sendMessage(StatsSettings.premessage + ChatColor.WHITE + getCats(plugin, who.getName())); + return true; + } + } else if (args.length == offs + 2) { + if (isCat(plugin, who.getName(), args[offs])) { + printStat(plugin, sender, who, args[offs], args[offs + 1]); + return true; + } else { + sender.sendMessage(StatsSettings.premessage + ChatColor.RED + "stat/category '" + args[offs] + "' not found. Possible values:"); + sender.sendMessage(StatsSettings.premessage + ChatColor.WHITE + getCats(plugin, who.getName())); + return true; + } + } + int playedTime = plugin.get(who.getName(), "stats", "playedfor"); + int movedBlocks = plugin.get(who.getName(), "stats", "move"); + int totalCreate = plugin.get(who.getName(), "stats", "totalblockcreate"); + int totalDestroy = plugin.get(who.getName(), "stats", "totalblockdestroy"); + int tkills = plugin.get(who.getName(), "kills", "total"); + int tdeaths = plugin.get(who.getName(), "deaths", "total"); + int pdeaths = plugin.get(who.getName(), "deaths", "player"); + int pkills = plugin.get(who.getName(), "kills", "player"); + int totalDamage = plugin.get(who.getName(), "damagetaken", "total"); + int totalDamageDealt = plugin.get(who.getName(), "damagedealt", "total"); + try { + sender.sendMessage("------------------------------------------------"); + sender.sendMessage(ChatColor.GOLD + " stats for " + ChatColor.WHITE + who.getName() + ChatColor.GOLD + ": (" + ChatColor.WHITE + "/stats help for more" + ChatColor.GOLD + ")"); + sender.sendMessage("------------------------------------------------"); + String s1 = ChatColor.GOLD + "[" + ChatColor.YELLOW + "Playedtime" + ChatColor.GOLD + "]" + ChatColor.YELLOW; + while (MinecraftFontWidthCalculator.getStringWidth(sender, s1) < 120) + s1 += " "; + s1 += ChatColor.WHITE + GetTimeString(playedTime); + sender.sendMessage(s1); + s1 = ChatColor.GOLD + "[" + ChatColor.YELLOW + "Moved" + ChatColor.GOLD + "]" + ChatColor.YELLOW; + while (MinecraftFontWidthCalculator.getStringWidth(sender, s1) < 120) + s1 += " "; + s1 += ChatColor.WHITE + String.valueOf(movedBlocks) + " blocks"; + sender.sendMessage(s1); + printStatFormatted(sender, "Blocks", "created", totalCreate, "destroyed", totalDestroy); + printStatFormatted(sender, "Deaths", "total", tdeaths, "player", pdeaths); + printStatFormatted(sender, "Kills", "total", tkills, "player", pkills); + printStatFormatted(sender, "Damage", "dealt", totalDamageDealt, "taken", totalDamage); + sender.sendMessage("------------------------------------------------"); + } catch (Exception e) { + // TODO: handle exception + } + return true; + } + + public static Player playerMatch(Server server, String name) { + List list = server.matchPlayer(name); + for (Player p : list) + if (p != null && p.getName().equalsIgnoreCase(name)) + return p; + return null; + } + + private static void printStatFormatted(CommandSender sender, String name, String title1, int value1, String title2, int value2) { + String s1 = ChatColor.GOLD + "[" + ChatColor.YELLOW + name + ChatColor.GOLD + "]" + ChatColor.YELLOW; + while (MinecraftFontWidthCalculator.getStringWidth(sender, s1) < 120) + s1 += " "; + if (title2 != null) + s1 += ChatColor.WHITE + title1 + "/" + title2; + else + s1 += ChatColor.WHITE + title1; + while (MinecraftFontWidthCalculator.getStringWidth(sender, s1) < 240) + s1 += " "; + if (title2 != null) + s1 += value1 + "/" + value2; + else + s1 += value1; + sender.sendMessage(s1); + } + + public static boolean isCat(Stats plugin, String player, String category) { + PlayerStat ps = plugin.getStats().get(player); + if (ps == null) + return false; + Category cat = ps.get(category); + if (cat == null) + return false; + return true; + } + + public static void printStat(Stats plugin, CommandSender sendTo, Player statPlayer, String cat, String stat) { + long statVal = plugin.get(statPlayer.getName(), cat, stat); + String statString = "" + statVal; + if (stat.equalsIgnoreCase("playedfor")) { + statString = GetTimeString((int) statVal); + } + if (stat.equalsIgnoreCase("lastlogout") || stat.equalsIgnoreCase("lastlogin")) { + Date logDate = new Date(statVal * 1000); + SimpleDateFormat format = new SimpleDateFormat("dd-MMM-yy hh:mm"); + statString = format.format(logDate); + } + sendTo.sendMessage(StatsSettings.premessage + cat + "/" + stat + ": " + ChatColor.WHITE + statString); + } + + public static String GetTimeString(int Seconds) { + int days = (int) Math.ceil(Seconds / (24 * 3600)); + int hours = (int) Math.ceil((Seconds - (24 * 3600 * days)) / 3600); + int minutes = (int) Math.ceil((Seconds - (24 * 3600 * days + 3600 * hours)) / 60); + String timeString = ""; + timeString += days + "d " + hours + "h " + minutes + "m"; + return timeString; + } + + public static String getCatEntries(Stats plugin, String player, String category) { + PlayerStat ps = plugin.getStats().get(player); + if (ps == null) + return "player not found"; + Set cats = ps.getCats(); + if (cats.size() == 0) + return "no categories founnd"; + Category cat = ps.get(category); + if (cat == null) + return "category not found"; + Set entris = cat.getEntries(); + int length = (entris.size() - 1); + int on = 0; + String list = ""; + for (String currentName : entris) { + if (currentName == null) { + ++on; + continue; + } + list += (on >= length) ? currentName : currentName + ", "; + ++on; + } + list += " "; + return list; + } + + public static String getCats(Stats plugin, String player) { + PlayerStat ps = plugin.getStats().get(player); + if (ps == null) + return "no categories found"; + Set cats = ps.getCats(); + if (cats.size() == 0) + return "no categories found"; + int length = (cats.size() - 1); + int on = 0; + String list = ""; + for (String currentName : cats) { + if (currentName == null) { + ++on; + continue; + } + list += (on >= length) ? currentName : currentName + ", "; + ++on; + } + list += " "; + return list; + } + + public static boolean isStat(Stats plugin, String player, String stat) { + PlayerStat ps = plugin.getStats().get(player); + if (ps == null) + return false; + Category cat = ps.get("stats"); + if (cat == null) + return false; + if (cat.get(stat) == 0) + return false; + return true; + } +} diff --git a/com/nidefawl/Stats/udpates/Update1.java b/com/nidefawl/Stats/udpates/Update1.java new file mode 100755 index 0000000..a58aba1 --- /dev/null +++ b/com/nidefawl/Stats/udpates/Update1.java @@ -0,0 +1,15 @@ +package com.nidefawl.Stats.udpates; + +import java.io.File; + +import com.nidefawl.Stats.Stats; + +public class Update1 { + public static void execute(Stats plugin) { + File oldLoc = new File("items.txt"); + if(oldLoc.exists()) { + Stats.LogInfo("Moving items.txt to "+plugin.getDataFolder().getPath()+"/items.txt"); + oldLoc.renameTo(new File(plugin.getDataFolder(),"items.txt")); + } + } +} diff --git a/com/nidefawl/Stats/udpates/Update2.java b/com/nidefawl/Stats/udpates/Update2.java new file mode 100755 index 0000000..b2283d8 --- /dev/null +++ b/com/nidefawl/Stats/udpates/Update2.java @@ -0,0 +1,96 @@ +package com.nidefawl.Stats.udpates; + +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +import com.nidefawl.Stats.Stats; +import com.nidefawl.Stats.StatsSettings; +import com.nidefawl.Stats.ItemResolver.hModItemResolver; +import com.nidefawl.Stats.ItemResolver.itemResolver; +import com.nidefawl.Stats.datasource.StatsSQLConnectionManager; + +public class Update2 { + public static void execute(Stats plugin) { + FileWriter writer; + itemResolver items = new hModItemResolver(new File(plugin.getDataFolder(),"items.txt")); + try { + writer = new FileWriter(new File(plugin.getDataFolder(),"items.txt"),true); + if (writer != null) { + try { + if(items.getItem(26).equals("26")) { + Stats.LogInfo("Adding bedblock (26) to items.txt"); + writer.write("bedblock:26\r\n"); + Stats.LogInfo("Updating stats in database"); + UpdateItemStatKey("26","bedblock"); + } + if(items.getItem(93).equals("93")) { + Stats.LogInfo("Adding repeateron (93) to items.txt"); + writer.write("repeateron:93\r\n"); + Stats.LogInfo("Updating stats in database"); + UpdateItemStatKey("93","repeateron"); + } + if(items.getItem(94).equals("94")) { + Stats.LogInfo("Adding repeateroff (94) to items.txt"); + writer.write("repeateroff:94\r\n"); + Stats.LogInfo("Updating stats in database"); + UpdateItemStatKey("94","repeateroff"); + } + if(items.getItem(355).equals("355")) { + Stats.LogInfo("Adding bed (355) to items.txt"); + writer.write("bed:355\r\n"); + Stats.LogInfo("Updating stats in database"); + UpdateItemStatKey("355","bed"); + } + if(items.getItem(356).equals("356")) { + Stats.LogInfo("Adding repeater (356) to items.txt"); + writer.write("repeater:356\r\n"); + Stats.LogInfo("Updating stats in database"); + UpdateItemStatKey("356","repeater"); + } + writer.close(); + plugin.setItems( new hModItemResolver(new File(plugin.getDataFolder(),"items.txt"))); + } catch (IOException e) { + Stats.LogError("Exception while updating "+plugin.getDataFolder().getPath()+"/items.txt "+ e); + e.printStackTrace(); + } + } + } catch (IOException e1) { + e1.printStackTrace(); + } + } + static void UpdateItemStatKey(String oldKey,String newKey) { + + int result = 0; + Connection conn = null; + PreparedStatement ps = null; + ResultSet rs = null; + try { + conn = StatsSQLConnectionManager.getConnection(StatsSettings.useMySQL); + ps = conn.prepareStatement("UPDATE " + StatsSettings.dbTable + " set stat = ? where stat = ? and (category = 'blockdestroy' or category = 'blockcreate' or category = 'itemuse' or category = 'itemdrop' or category = 'itempickup');"); + ps.setString(1, newKey); + ps.setString(2, oldKey); + result = ps.executeUpdate(); + } catch (SQLException ex) { + Stats.LogError("SQL exception" + ex); + ex.printStackTrace(); + } finally { + try { + if (rs != null) + rs.close(); + if (ps != null) + ps.close(); + if (conn != null) + conn.close(); + } catch (SQLException ex) { + Stats.LogError("SQL exception on close"+ ex); + ex.printStackTrace(); + } + } + Stats.LogInfo("Updated " + result + " stats."); + } +} diff --git a/plugin.yml b/plugin.yml index 6ffe305..038efe6 100755 --- a/plugin.yml +++ b/plugin.yml @@ -1,6 +1,6 @@ name: Stats main: com.nidefawl.Stats.Stats -version: 0.985 +version: 0.99 author: nidefawl commands: stats: