From 815a9dcca22b108c158fcf41035edac2ff4b7178 Mon Sep 17 00:00:00 2001 From: ElgarL Date: Wed, 14 Dec 2011 16:24:47 +0000 Subject: Removed op permissions from admins in the default GloblaGroups.yml. --- EssentialsGroupManager/src/Changelog.txt | 3 ++- EssentialsGroupManager/src/globalgroups.yml | 6 +++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/EssentialsGroupManager/src/Changelog.txt b/EssentialsGroupManager/src/Changelog.txt index 47a0f6b79..1f5f0313d 100644 --- a/EssentialsGroupManager/src/Changelog.txt +++ b/EssentialsGroupManager/src/Changelog.txt @@ -85,4 +85,5 @@ v 1.7: - Offline player checks now support partial name matches. - Added custom events so plugins can now be notified of changes within GroupManager. - GM now registers with Bukkits ServicesManager. - - deleting the contents of GlobalGroups.yml will no longer thrown a NullPointerException. \ No newline at end of file + - deleting the contents of GlobalGroups.yml will no longer thrown a NullPointerException. + - Removed op permissions from admins in the default GloblaGroups.yml. \ No newline at end of file diff --git a/EssentialsGroupManager/src/globalgroups.yml b/EssentialsGroupManager/src/globalgroups.yml index 9662baf43..066f4faea 100644 --- a/EssentialsGroupManager/src/globalgroups.yml +++ b/EssentialsGroupManager/src/globalgroups.yml @@ -150,9 +150,9 @@ groups: - bukkit.command.kill - bukkit.command.list - bukkit.command.me - - bukkit.command.op - - bukkit.command.op.give - - bukkit.command.op.take + - -bukkit.command.op + - -bukkit.command.op.give + - -bukkit.command.op.take - bukkit.command.plugins - bukkit.command.reload - bukkit.command.save -- cgit v1.2.3 From ac77bbb0b4f405598b8fc8271d520818d0646da9 Mon Sep 17 00:00:00 2001 From: ElgarL Date: Sun, 18 Dec 2011 04:25:54 +0000 Subject: Changed ServicesManager registration to lowest from normal. --- EssentialsGroupManager/src/Changelog.txt | 3 ++- .../src/org/anjocaido/groupmanager/GroupManager.java | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/EssentialsGroupManager/src/Changelog.txt b/EssentialsGroupManager/src/Changelog.txt index 1f5f0313d..76782e99a 100644 --- a/EssentialsGroupManager/src/Changelog.txt +++ b/EssentialsGroupManager/src/Changelog.txt @@ -86,4 +86,5 @@ v 1.7: - Added custom events so plugins can now be notified of changes within GroupManager. - GM now registers with Bukkits ServicesManager. - deleting the contents of GlobalGroups.yml will no longer thrown a NullPointerException. - - Removed op permissions from admins in the default GloblaGroups.yml. \ No newline at end of file + - Removed op permissions from admins in the default GloblaGroups.yml. + - Changed ServicesManager registration to lowest from normal. \ No newline at end of file diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/GroupManager.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/GroupManager.java index 2d46e74c8..c51efb8be 100644 --- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/GroupManager.java +++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/GroupManager.java @@ -161,7 +161,7 @@ public class GroupManager extends JavaPlugin { System.out.println(pdfFile.getName() + " version " + pdfFile.getVersion() + " is enabled!"); // Register as a service - this.getServer().getServicesManager().register(AnjoPermissionsHandler.class, this.permissionHandler, this, ServicePriority.Normal); + this.getServer().getServicesManager().register(AnjoPermissionsHandler.class, this.permissionHandler, this, ServicePriority.Lowest); } public static boolean isLoaded() { -- cgit v1.2.3 From de40f7f556513d4997779f0c5cc1d77fe050a02a Mon Sep 17 00:00:00 2001 From: ElgarL Date: Sun, 18 Dec 2011 14:26:00 +0000 Subject: Fixed 'manucheckp' returning a null for the searched node when it's a group/subgroup. --- EssentialsGroupManager/src/Changelog.txt | 4 +++- .../anjocaido/groupmanager/permissions/AnjoPermissionsHandler.java | 3 +++ EssentialsGroupManager/src/plugin.yml | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/EssentialsGroupManager/src/Changelog.txt b/EssentialsGroupManager/src/Changelog.txt index 76782e99a..69f921bb3 100644 --- a/EssentialsGroupManager/src/Changelog.txt +++ b/EssentialsGroupManager/src/Changelog.txt @@ -87,4 +87,6 @@ v 1.7: - GM now registers with Bukkits ServicesManager. - deleting the contents of GlobalGroups.yml will no longer thrown a NullPointerException. - Removed op permissions from admins in the default GloblaGroups.yml. - - Changed ServicesManager registration to lowest from normal. \ No newline at end of file +v 1.8: + - Changed ServicesManager registration to lowest from normal. + - Fixed 'manucheckp' returning a null for the searched node when it's a group/subgroup. \ No newline at end of file diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/AnjoPermissionsHandler.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/AnjoPermissionsHandler.java index 6e18bf3f8..9b7253c41 100644 --- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/AnjoPermissionsHandler.java +++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/AnjoPermissionsHandler.java @@ -711,12 +711,14 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface { PermissionCheckResult resultUser = checkUserOnlyPermission(user, targetPermission); if (resultUser.resultType != PermissionCheckResult.Type.NOTFOUND) { + resultUser.accessLevel = targetPermission; return resultUser; } // IT ONLY CHECKS GROUPS PERMISSIONS IF RESULT FOR USER IS NOT FOUND PermissionCheckResult resultGroup = checkGroupPermissionWithInheritance(user.getGroup(), targetPermission); if (resultGroup.resultType != PermissionCheckResult.Type.NOTFOUND) { + result.accessLevel = targetPermission; return resultGroup; } @@ -724,6 +726,7 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface { for (Group subGroup : user.subGroupListCopy()) { PermissionCheckResult resultSubGroup = checkGroupPermissionWithInheritance(subGroup, targetPermission); if (resultSubGroup.resultType != PermissionCheckResult.Type.NOTFOUND) { + resultSubGroup.accessLevel = targetPermission; return resultSubGroup; } } diff --git a/EssentialsGroupManager/src/plugin.yml b/EssentialsGroupManager/src/plugin.yml index 115e92ba2..da5164ce1 100644 --- a/EssentialsGroupManager/src/plugin.yml +++ b/EssentialsGroupManager/src/plugin.yml @@ -1,5 +1,5 @@ name: GroupManager -version: "1.7 (Phoenix)" +version: "1.8 (Phoenix)" main: org.anjocaido.groupmanager.GroupManager website: http://www.anjocaido.info/ description: Provides on-the-fly system for permissions system created by Nijikokun. But all in memory, and with flat-file saving schedule. -- cgit v1.2.3 From 244673e1fb8a8583c95df765e7b64f18c2c631c3 Mon Sep 17 00:00:00 2001 From: ElgarL Date: Sun, 18 Dec 2011 14:35:14 +0000 Subject: Fixed manucheckp on group (missed it in last commit) --- .../org/anjocaido/groupmanager/permissions/AnjoPermissionsHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/AnjoPermissionsHandler.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/AnjoPermissionsHandler.java index 9b7253c41..b23fc01d4 100644 --- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/AnjoPermissionsHandler.java +++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/AnjoPermissionsHandler.java @@ -718,7 +718,7 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface { // IT ONLY CHECKS GROUPS PERMISSIONS IF RESULT FOR USER IS NOT FOUND PermissionCheckResult resultGroup = checkGroupPermissionWithInheritance(user.getGroup(), targetPermission); if (resultGroup.resultType != PermissionCheckResult.Type.NOTFOUND) { - result.accessLevel = targetPermission; + resultGroup.accessLevel = targetPermission; return resultGroup; } -- cgit v1.2.3 From afe8ecd3dfd26d49c1133e330c942c90e7826e1f Mon Sep 17 00:00:00 2001 From: ElgarL Date: Sun, 18 Dec 2011 15:21:56 +0000 Subject: Fixed a typo --- EssentialsGroupManager/src/org/anjocaido/groupmanager/GroupManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/GroupManager.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/GroupManager.java index c51efb8be..062d3df21 100644 --- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/GroupManager.java +++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/GroupManager.java @@ -805,7 +805,7 @@ public class GroupManager extends JavaPlugin { sender.sendMessage(ChatColor.YELLOW + "Permission Node: " + permissionResult.accessLevel); } else if (permissionResult.owner instanceof Group) { if (permissionResult.resultType.equals(PermissionCheckResult.Type.NEGATION)) { - sender.sendMessage(ChatColor.RED + "The user inherits the a negation permission from group: " + permissionResult.owner.getName()); + sender.sendMessage(ChatColor.RED + "The user inherits a negation permission from group: " + permissionResult.owner.getName()); } else { sender.sendMessage(ChatColor.YELLOW + "The user inherits the permission from group: " + permissionResult.owner.getName()); } -- cgit v1.2.3 From 7c8c40c7903852e3ee2d5740729f2e94b5982240 Mon Sep 17 00:00:00 2001 From: ElgarL Date: Mon, 19 Dec 2011 15:44:27 +0000 Subject: manpromote and mandemote now correctly sent the notification to the console if the command was issued there. --- EssentialsGroupManager/src/Changelog.txt | 3 ++- .../src/org/anjocaido/groupmanager/GroupManager.java | 6 +++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/EssentialsGroupManager/src/Changelog.txt b/EssentialsGroupManager/src/Changelog.txt index 69f921bb3..4b85fa94f 100644 --- a/EssentialsGroupManager/src/Changelog.txt +++ b/EssentialsGroupManager/src/Changelog.txt @@ -89,4 +89,5 @@ v 1.7: - Removed op permissions from admins in the default GloblaGroups.yml. v 1.8: - Changed ServicesManager registration to lowest from normal. - - Fixed 'manucheckp' returning a null for the searched node when it's a group/subgroup. \ No newline at end of file + - Fixed 'manucheckp' returning a null for the searched node when it's a group/subgroup. + - manpromote and mandemote now correctly send the notification to the console if the command was issued there. \ No newline at end of file diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/GroupManager.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/GroupManager.java index 062d3df21..9762a35a7 100644 --- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/GroupManager.java +++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/GroupManager.java @@ -415,7 +415,7 @@ public class GroupManager extends JavaPlugin { // PARECE OK auxUser.setGroup(auxGroup); - if (!sender.hasPermission("groupmanager.notify.other")) + if (!sender.hasPermission("groupmanager.notify.other") || (isConsole)) sender.sendMessage(ChatColor.YELLOW + "You changed player '" + auxUser.getName() + "' group to '" + auxGroup.getName() + "'."); targetPlayer = this.getServer().getPlayer(auxUser.getName()); @@ -1610,7 +1610,7 @@ public class GroupManager extends JavaPlugin { } // PARECE OK auxUser.setGroup(auxGroup); - if (!sender.hasPermission("groupmanager.notify.other")) + if (!sender.hasPermission("groupmanager.notify.other") || (isConsole)) sender.sendMessage(ChatColor.YELLOW + "You changed " + auxUser.getName() + " group to " + auxGroup.getName() + "."); targetPlayer = this.getServer().getPlayer(auxUser.getName()); @@ -1666,7 +1666,7 @@ public class GroupManager extends JavaPlugin { } // PARECE OK auxUser.setGroup(auxGroup); - if (!sender.hasPermission("groupmanager.notify.other")) + if (!sender.hasPermission("groupmanager.notify.other") || (isConsole)) sender.sendMessage(ChatColor.YELLOW + "You changed " + auxUser.getName() + " group to " + auxGroup.getName() + "."); targetPlayer = this.getServer().getPlayer(auxUser.getName()); -- cgit v1.2.3 From a2202439bb1aeddaaad08c3b6607ce11b98356f3 Mon Sep 17 00:00:00 2001 From: ElgarL Date: Mon, 19 Dec 2011 19:22:04 +0000 Subject: Expanded GlobalGroups.yml and Groups.yml to include Towny permissions. --- EssentialsGroupManager/src/Changelog.txt | 3 +- EssentialsGroupManager/src/globalgroups.yml | 57 +++++++++++++++++++++++++++-- EssentialsGroupManager/src/groups.yml | 3 ++ 3 files changed, 58 insertions(+), 5 deletions(-) diff --git a/EssentialsGroupManager/src/Changelog.txt b/EssentialsGroupManager/src/Changelog.txt index 4b85fa94f..6611c3e1b 100644 --- a/EssentialsGroupManager/src/Changelog.txt +++ b/EssentialsGroupManager/src/Changelog.txt @@ -90,4 +90,5 @@ v 1.7: v 1.8: - Changed ServicesManager registration to lowest from normal. - Fixed 'manucheckp' returning a null for the searched node when it's a group/subgroup. - - manpromote and mandemote now correctly send the notification to the console if the command was issued there. \ No newline at end of file + - manpromote and mandemote now correctly send the notification to the console if the command was issued there. + - Expanded GlobalGroups.yml and Groups.yml to include Towny permissions. \ No newline at end of file diff --git a/EssentialsGroupManager/src/globalgroups.yml b/EssentialsGroupManager/src/globalgroups.yml index 066f4faea..fe7b7df99 100644 --- a/EssentialsGroupManager/src/globalgroups.yml +++ b/EssentialsGroupManager/src/globalgroups.yml @@ -1,9 +1,5 @@ groups: - g:bukkit_default: - permissions: - - bukkit.broadcast.user - g:essentials_default: permissions: - essentials.help @@ -129,6 +125,10 @@ groups: - groupmanager.manucheckp - groupmanager.manulistp + g:bukkit_default: + permissions: + - bukkit.broadcast.user + g:bukkit_moderator: permissions: - bukkit.command.ban @@ -174,3 +174,52 @@ groups: - bukkit.command.whitelist.list - bukkit.command.whitelist.reload - bukkit.command.whitelist.remove + + g:towny_builder: + permissions: + - towny.town.* + - towny.nation.* + - towny.chat.tc + - towny.chat.nc + - towny.wild.block.6.* + - towny.wild.block.14.destroy + - towny.wild.block.15.destroy + - towny.wild.block.16.destroy + - towny.wild.block.17.* + - towny.wild.block.18.destroy + - towny.wild.block.21.destroy + - towny.wild.block.31.destroy + - towny.wild.block.37.destroy + - towny.wild.block.38.destroy + - towny.wild.block.39.destroy + - towny.wild.block.40.destroy + - towny.wild.block.50.destroy + - towny.wild.block.56.destroy + - towny.wild.block.73.destroy + - towny.wild.block.74.destroy + - towny.wild.block.78.destroy + - towny.wild.block.81.destroy + - towny.wild.block.82.destroy + - towny.wild.block.83.destroy + - towny.wild.block.86.destroy + - towny.wild.block.103.destroy + - towny.wild.block.106.destroy + - towny.wild.block.111.destroy + - towny.wild.block.115.destroy + + g:towny_moderator: + permissions: + - towny.chat.mod + - towny.wild.block.64.switch + - towny.wild.block.83.build + - towny.wild.block.86.build + - towny.wild.block.103.build + - towny.wild.block.111.build + - towny.wild.block.115.build + + g:towny_admin: + permissions: + - towny.admin + - -towny.wild.block.119.destroy + - -towny.wild.block.120.destroy + - towny.chat.admin \ No newline at end of file diff --git a/EssentialsGroupManager/src/groups.yml b/EssentialsGroupManager/src/groups.yml index 81fb4f030..e50054c9f 100644 --- a/EssentialsGroupManager/src/groups.yml +++ b/EssentialsGroupManager/src/groups.yml @@ -24,6 +24,7 @@ groups: inheritance: - default - g:essentials_builder + - g:towny_moderator info: prefix: '&2' build: true @@ -35,6 +36,7 @@ groups: - builder - g:essentials_moderator - g:bukkit_moderator + - g:towny_moderator info: prefix: '&5' build: true @@ -46,6 +48,7 @@ groups: - moderator - g:essentials_admin - g:bukkit_admin + - g:towny_admin info: prefix: '&c' build: true -- cgit v1.2.3 From debcf4714a3db9065219e3701137e8dea6439970 Mon Sep 17 00:00:00 2001 From: ElgarL Date: Tue, 20 Dec 2011 17:21:55 +0000 Subject: Delayed GroupManager events so Superperms will be fully updated before plugins receive the events. --- EssentialsGroupManager/src/Changelog.txt | 3 ++- .../src/org/anjocaido/groupmanager/GroupManager.java | 14 ++++++++++++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/EssentialsGroupManager/src/Changelog.txt b/EssentialsGroupManager/src/Changelog.txt index 6611c3e1b..dc661f7c3 100644 --- a/EssentialsGroupManager/src/Changelog.txt +++ b/EssentialsGroupManager/src/Changelog.txt @@ -91,4 +91,5 @@ v 1.8: - Changed ServicesManager registration to lowest from normal. - Fixed 'manucheckp' returning a null for the searched node when it's a group/subgroup. - manpromote and mandemote now correctly send the notification to the console if the command was issued there. - - Expanded GlobalGroups.yml and Groups.yml to include Towny permissions. \ No newline at end of file + - Expanded GlobalGroups.yml and Groups.yml to include Towny permissions. + - Delayed GroupManager events so Superperms will be fully updated before plugins receive the events. \ No newline at end of file diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/GroupManager.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/GroupManager.java index 9762a35a7..5ced1fb47 100644 --- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/GroupManager.java +++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/GroupManager.java @@ -1840,11 +1840,21 @@ public class GroupManager extends JavaPlugin { /** * Triggers all GroupManager events for other plugins to see. + * Schedules events for 1 tick later to allow GM to finish populating super perms. * * @param event */ - public static void callEvent(GroupManagerEvent event) { - Bukkit.getServer().getPluginManager().callEvent(event); + public static void callEvent(final GroupManagerEvent event) { + + if (Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(Bukkit.getPluginManager().getPlugin("GroupManager"), new Runnable() { + + @Override + public void run() { + Bukkit.getServer().getPluginManager().callEvent(event); + } + }) == -1) + GroupManager.logger.warning("Could not schedule GM Event."); + } /** -- cgit v1.2.3 From 69847af08aa1ebc91c7808310bb7c7c1183b137f Mon Sep 17 00:00:00 2001 From: ElgarL Date: Thu, 22 Dec 2011 17:01:10 +0000 Subject: Decreased ranks of default users so idiots who don't remove them can't get 'hacked' when in offline mode. --- EssentialsGroupManager/src/users.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/EssentialsGroupManager/src/users.yml b/EssentialsGroupManager/src/users.yml index 28fa79910..72a7b652f 100644 --- a/EssentialsGroupManager/src/users.yml +++ b/EssentialsGroupManager/src/users.yml @@ -3,7 +3,7 @@ users: snowleo: subgroups: [] permissions: [] - group: Admin + group: Builder KHobbits: subgroups: [] permissions: [] @@ -11,5 +11,5 @@ users: ElgarL: subgroups: [] permissions: [] - group: Owner + group: Moderator -- cgit v1.2.3 From 3aba996e97bd5bb90e65ed3166f3666d9122a729 Mon Sep 17 00:00:00 2001 From: ElgarL Date: Thu, 29 Dec 2011 14:52:42 +0000 Subject: Changed the way events are raised to prevent variable corruption. --- EssentialsGroupManager/src/Changelog.txt | 3 ++- .../org/anjocaido/groupmanager/GroupManager.java | 19 ------------------- .../groupmanager/events/GroupManagerEvent.java | 22 +++++++++++++++++++++- .../events/GroupManagerEventHandler.java | 8 +++----- 4 files changed, 26 insertions(+), 26 deletions(-) diff --git a/EssentialsGroupManager/src/Changelog.txt b/EssentialsGroupManager/src/Changelog.txt index dc661f7c3..3929b9d22 100644 --- a/EssentialsGroupManager/src/Changelog.txt +++ b/EssentialsGroupManager/src/Changelog.txt @@ -92,4 +92,5 @@ v 1.8: - Fixed 'manucheckp' returning a null for the searched node when it's a group/subgroup. - manpromote and mandemote now correctly send the notification to the console if the command was issued there. - Expanded GlobalGroups.yml and Groups.yml to include Towny permissions. - - Delayed GroupManager events so Superperms will be fully updated before plugins receive the events. \ No newline at end of file + - Delayed GroupManager events so Superperms will be fully updated before plugins receive the events. + - Changed the way events are raised to prevent variable corruption. \ No newline at end of file diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/GroupManager.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/GroupManager.java index 5ced1fb47..c0e9ef2f8 100644 --- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/GroupManager.java +++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/GroupManager.java @@ -1837,25 +1837,6 @@ public class GroupManager extends JavaPlugin { return match; } - - /** - * Triggers all GroupManager events for other plugins to see. - * Schedules events for 1 tick later to allow GM to finish populating super perms. - * - * @param event - */ - public static void callEvent(final GroupManagerEvent event) { - - if (Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(Bukkit.getPluginManager().getPlugin("GroupManager"), new Runnable() { - - @Override - public void run() { - Bukkit.getServer().getPluginManager().callEvent(event); - } - }) == -1) - GroupManager.logger.warning("Could not schedule GM Event."); - - } /** * @return the config diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/events/GroupManagerEvent.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/events/GroupManagerEvent.java index 856abbc28..0834b3ada 100644 --- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/events/GroupManagerEvent.java +++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/events/GroupManagerEvent.java @@ -1,6 +1,8 @@ package org.anjocaido.groupmanager.events; +import org.anjocaido.groupmanager.GroupManager; +import org.bukkit.Bukkit; import org.bukkit.event.Event; /** @@ -13,10 +15,28 @@ public abstract class GroupManagerEvent extends Event { * */ private static final long serialVersionUID = 8790362185329926951L; - + protected GroupManagerEvent(String name) { super(name); } + /** + * Triggers all GroupManager events for other plugins to see. + * Schedules events for 1 tick later to allow GM to finish populating super perms. + * + * @param event + */ + public void schedule(final GroupManagerEvent event) { + + if (Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(Bukkit.getPluginManager().getPlugin("GroupManager"), new Runnable() { + + @Override + public void run() { + Bukkit.getServer().getPluginManager().callEvent(event); + } + }, 1) == -1) + GroupManager.logger.warning("Could not schedule GM Event."); + } + } \ No newline at end of file diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/events/GroupManagerEventHandler.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/events/GroupManagerEventHandler.java index 83cac393d..3c077b6c6 100644 --- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/events/GroupManagerEventHandler.java +++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/events/GroupManagerEventHandler.java @@ -1,11 +1,9 @@ package org.anjocaido.groupmanager.events; -import org.anjocaido.groupmanager.GroupManager; import org.anjocaido.groupmanager.data.Group; import org.anjocaido.groupmanager.data.User; - /** * @author ElgarL * @@ -13,13 +11,13 @@ import org.anjocaido.groupmanager.data.User; public class GroupManagerEventHandler { protected static void callEvent(GMGroupEvent event) { - GroupManager.callEvent(event); + event.schedule(event); } protected static void callEvent(GMUserEvent event) { - GroupManager.callEvent(event); + event.schedule(event); } protected static void callEvent(GMSystemEvent event) { - GroupManager.callEvent(event); + event.schedule(event); } public static void callEvent(Group group, GMGroupEvent.Action action) { -- cgit v1.2.3 From 7726fd0081346b59e4c555476f6c62e1aa38b69f Mon Sep 17 00:00:00 2001 From: ElgarL Date: Tue, 3 Jan 2012 02:04:48 +0000 Subject: Reload GlobalGroups when you perform a world load. Changed GlobalGroups to save/load before local groups in the scheduled data saving/loading --- EssentialsGroupManager/src/Changelog.txt | 4 +++- .../src/org/anjocaido/groupmanager/GroupManager.java | 2 ++ .../groupmanager/dataholder/worlds/WorldsHolder.java | 19 ++++++++++--------- 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/EssentialsGroupManager/src/Changelog.txt b/EssentialsGroupManager/src/Changelog.txt index 3929b9d22..9b43fddbb 100644 --- a/EssentialsGroupManager/src/Changelog.txt +++ b/EssentialsGroupManager/src/Changelog.txt @@ -93,4 +93,6 @@ v 1.8: - manpromote and mandemote now correctly send the notification to the console if the command was issued there. - Expanded GlobalGroups.yml and Groups.yml to include Towny permissions. - Delayed GroupManager events so Superperms will be fully updated before plugins receive the events. - - Changed the way events are raised to prevent variable corruption. \ No newline at end of file + - Changed the way events are raised to prevent variable corruption. + - Reload GlobalGroups when you perform a world load. + - Changed GlobalGroups to save/load before local groups in the scheduled data saving/loading \ No newline at end of file diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/GroupManager.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/GroupManager.java index c0e9ef2f8..16e0222d8 100644 --- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/GroupManager.java +++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/GroupManager.java @@ -1504,7 +1504,9 @@ public class GroupManager extends JavaPlugin { isLoaded = false; // Disable Bukkit Perms update + globalGroups.load(); worldsHolder.loadWorld(auxString); + sender.sendMessage("The request to world '" + auxString + "' was sent."); isLoaded = true; diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/worlds/WorldsHolder.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/worlds/WorldsHolder.java index 25eaf8526..dbdd17f34 100644 --- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/worlds/WorldsHolder.java +++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/worlds/WorldsHolder.java @@ -176,6 +176,16 @@ public class WorldsHolder { ArrayList alreadyDone = new ArrayList(); Tasks.removeOldFiles(plugin, plugin.getBackupFolder()); + // Write Global Groups + if (GroupManager.getGlobalGroups().haveGroupsChanged()) { + GroupManager.getGlobalGroups().writeGroups(overwrite); + } else { + if (GroupManager.getGlobalGroups().getTimeStampGroups() < GroupManager.getGlobalGroups().getGlobalGroupsFile().lastModified()) { + System.out.print("Newer GlobalGroups file found (Loading changes)!"); + GroupManager.getGlobalGroups().load(); + } + } + for (OverloadedWorldHolder w : worldsData.values()) { if (alreadyDone.contains(w)) { continue; @@ -228,15 +238,6 @@ public class WorldsHolder { } alreadyDone.add(w); } - // Write Global Groups - if (GroupManager.getGlobalGroups().haveGroupsChanged()) { - GroupManager.getGlobalGroups().writeGroups(overwrite); - } else { - if (GroupManager.getGlobalGroups().getTimeStampGroups() < GroupManager.getGlobalGroups().getGlobalGroupsFile().lastModified()) { - System.out.print("Newer GlobalGroups file found (Loading changes)!"); - GroupManager.getGlobalGroups().load(); - } - } } /** -- cgit v1.2.3 From 4c485f31476825993ba8edac00a71080d51d6a2d Mon Sep 17 00:00:00 2001 From: ElgarL Date: Thu, 5 Jan 2012 19:43:30 +0000 Subject: Fix 'manucheckp' to correctly report if a permission is available from GroupManager or Bukkit. --- EssentialsGroupManager/src/Changelog.txt | 3 +- .../org/anjocaido/groupmanager/GroupManager.java | 40 +++++++++++----------- 2 files changed, 22 insertions(+), 21 deletions(-) diff --git a/EssentialsGroupManager/src/Changelog.txt b/EssentialsGroupManager/src/Changelog.txt index 9b43fddbb..8e4996b01 100644 --- a/EssentialsGroupManager/src/Changelog.txt +++ b/EssentialsGroupManager/src/Changelog.txt @@ -95,4 +95,5 @@ v 1.8: - Delayed GroupManager events so Superperms will be fully updated before plugins receive the events. - Changed the way events are raised to prevent variable corruption. - Reload GlobalGroups when you perform a world load. - - Changed GlobalGroups to save/load before local groups in the scheduled data saving/loading \ No newline at end of file + - Changed GlobalGroups to save/load before local groups in the scheduled data saving/loading + - Fix 'manucheckp' to correctly report if a permission is available from GroupManager or Bukkit. \ No newline at end of file diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/GroupManager.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/GroupManager.java index 16e0222d8..4ba2624bf 100644 --- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/GroupManager.java +++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/GroupManager.java @@ -787,29 +787,29 @@ public class GroupManager extends JavaPlugin { } targetPlayer = this.getServer().getPlayer(auxUser.getName()); // VALIDANDO PERMISSAO - permissionResult = permissionHandler.checkFullUserPermission(auxUser, args[1]); + permissionResult = permissionHandler.checkFullGMPermission(auxUser, args[1], false); + if (permissionResult.resultType.equals(PermissionCheckResult.Type.NOTFOUND)) { + //No permissions found in GM so fall through and check Bukkit. sender.sendMessage(ChatColor.RED + "The player doesn't have access to that permission"); - sender.sendMessage(ChatColor.YELLOW + "SuperPerms reports Node: " + targetPlayer.hasPermission(args[1])); - return false; - } - // PARECE OK - // auxString = - // permissionHandler.checkUserOnlyPermission(auxUser, args[1]); - if (permissionResult.owner instanceof User) { - if (permissionResult.resultType.equals(PermissionCheckResult.Type.NEGATION)) { - sender.sendMessage(ChatColor.RED + "The user has directly a negation node for that permission."); - } else { - sender.sendMessage(ChatColor.YELLOW + "The user has directly this permission."); - } - sender.sendMessage(ChatColor.YELLOW + "Permission Node: " + permissionResult.accessLevel); - } else if (permissionResult.owner instanceof Group) { - if (permissionResult.resultType.equals(PermissionCheckResult.Type.NEGATION)) { - sender.sendMessage(ChatColor.RED + "The user inherits a negation permission from group: " + permissionResult.owner.getName()); - } else { - sender.sendMessage(ChatColor.YELLOW + "The user inherits the permission from group: " + permissionResult.owner.getName()); + + } else { + // This permission was found in groupmanager. + if (permissionResult.owner instanceof User) { + if (permissionResult.resultType.equals(PermissionCheckResult.Type.NEGATION)) { + sender.sendMessage(ChatColor.RED + "The user has directly a negation node for that permission."); + } else { + sender.sendMessage(ChatColor.YELLOW + "The user has directly this permission."); + } + sender.sendMessage(ChatColor.YELLOW + "Permission Node: " + permissionResult.accessLevel); + } else if (permissionResult.owner instanceof Group) { + if (permissionResult.resultType.equals(PermissionCheckResult.Type.NEGATION)) { + sender.sendMessage(ChatColor.RED + "The user inherits a negation permission from group: " + permissionResult.owner.getName()); + } else { + sender.sendMessage(ChatColor.YELLOW + "The user inherits the permission from group: " + permissionResult.owner.getName()); + } + sender.sendMessage(ChatColor.YELLOW + "Permission Node: " + permissionResult.accessLevel); } - sender.sendMessage(ChatColor.YELLOW + "Permission Node: " + permissionResult.accessLevel); } // superperms -- cgit v1.2.3 From 58057a771d4e8e971d8531e1ad208eb6bbb0df54 Mon Sep 17 00:00:00 2001 From: ElgarL Date: Mon, 9 Jan 2012 02:00:58 +0000 Subject: Changed over to a reflection method for populating superperms as Bukkit lags when you handle permissions one at a time. --- EssentialsGroupManager/src/Changelog.txt | 3 +- EssentialsGroupManager/src/config.yml | 4 +- EssentialsGroupManager/src/globalgroups.yml | 1 + .../groupmanager/Tasks/BukkitPermsUpdateTask.java | 2 +- .../permissions/BukkitPermissions.java | 117 +++++++++++++++------ 5 files changed, 88 insertions(+), 39 deletions(-) diff --git a/EssentialsGroupManager/src/Changelog.txt b/EssentialsGroupManager/src/Changelog.txt index 8e4996b01..6ac58e8ff 100644 --- a/EssentialsGroupManager/src/Changelog.txt +++ b/EssentialsGroupManager/src/Changelog.txt @@ -96,4 +96,5 @@ v 1.8: - Changed the way events are raised to prevent variable corruption. - Reload GlobalGroups when you perform a world load. - Changed GlobalGroups to save/load before local groups in the scheduled data saving/loading - - Fix 'manucheckp' to correctly report if a permission is available from GroupManager or Bukkit. \ No newline at end of file + - Fix 'manucheckp' to correctly report if a permission is available from GroupManager or Bukkit. + - Changed over to a reflection method for populating superperms as Bukkit lags when you handle permissions one at a time. \ No newline at end of file diff --git a/EssentialsGroupManager/src/config.yml b/EssentialsGroupManager/src/config.yml index 2fe5e509c..17ffc5b6e 100644 --- a/EssentialsGroupManager/src/config.yml +++ b/EssentialsGroupManager/src/config.yml @@ -4,9 +4,9 @@ settings: # The user will be able to promote players to the same group or even above. opOverrides: true - # If enabled any plugins bukkit permissions which default to true will be left enabled. + # If enabled any bukkit permissiosn which default to true will be left enabled. # If the player is op any permissions set to Op will follow suit. - bukkit_perms_override: false + bukkit_perms_override: true # Default setting for 'mantoglevalidate' # true will cause GroupManager to attempt name matching by default. diff --git a/EssentialsGroupManager/src/globalgroups.yml b/EssentialsGroupManager/src/globalgroups.yml index fe7b7df99..c9ecc2673 100644 --- a/EssentialsGroupManager/src/globalgroups.yml +++ b/EssentialsGroupManager/src/globalgroups.yml @@ -128,6 +128,7 @@ groups: g:bukkit_default: permissions: - bukkit.broadcast.user + - -bukkit.command.plugins g:bukkit_moderator: permissions: diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/Tasks/BukkitPermsUpdateTask.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/Tasks/BukkitPermsUpdateTask.java index f4b805c35..8788fc83b 100644 --- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/Tasks/BukkitPermsUpdateTask.java +++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/Tasks/BukkitPermsUpdateTask.java @@ -18,7 +18,7 @@ public class BukkitPermsUpdateTask implements Runnable { public void run() { // Signal loaded and update BukkitPermissions. GroupManager.setLoaded(true); - GroupManager.BukkitPermissions.collectPermissions(); + //GroupManager.BukkitPermissions.collectPermissions(); GroupManager.BukkitPermissions.updateAllPlayers(); GroupManager.logger.info("Bukkit Permissions Updated!"); diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/BukkitPermissions.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/BukkitPermissions.java index 202e27e3a..7c157a2f7 100644 --- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/BukkitPermissions.java +++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/BukkitPermissions.java @@ -16,6 +16,7 @@ package org.anjocaido.groupmanager.permissions; +import java.lang.reflect.Field; import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedList; @@ -23,9 +24,9 @@ import java.util.List; import java.util.Map; import org.anjocaido.groupmanager.GroupManager; -import org.anjocaido.groupmanager.data.User; +//import org.anjocaido.groupmanager.data.User; import org.anjocaido.groupmanager.dataholder.OverloadedWorldHolder; -import org.anjocaido.groupmanager.utils.PermissionCheckResult; +//import org.anjocaido.groupmanager.utils.PermissionCheckResult; import org.bukkit.Bukkit; import org.bukkit.entity.Player; @@ -43,8 +44,7 @@ import org.bukkit.event.server.ServerListener; import org.bukkit.permissions.Permission; import org.bukkit.permissions.PermissionAttachment; import org.bukkit.permissions.PermissionAttachmentInfo; -import org.bukkit.permissions.PermissionDefault; -import org.bukkit.plugin.Plugin; +//import org.bukkit.permissions.PermissionDefault; import org.bukkit.plugin.PluginManager; @@ -52,7 +52,7 @@ import org.bukkit.plugin.PluginManager; * * BukkitPermissions overrides to force GM reponses to Superperms * - * @author ElgarL, based upon PermissionsEX implementation + * @author ElgarL, originally based upon PermissionsEX implementation */ public class BukkitPermissions { @@ -62,13 +62,25 @@ public class BukkitPermissions { protected boolean dumpAllPermissions = true; protected boolean dumpMatchedPermissions = true; public boolean player_join = false; + + private static Field permissions; + + // Setup reflection (Thanks to Codename_B for the reflection source) + static { + try { + permissions = PermissionAttachment.class.getDeclaredField("permissions"); + permissions.setAccessible(true); + } catch (SecurityException e) { + e.printStackTrace(); + } catch (NoSuchFieldException e) { + e.printStackTrace(); + } + } public BukkitPermissions(GroupManager plugin) { this.plugin = plugin; - - this.collectPermissions(); + //this.collectPermissions(); this.registerEvents(); - this.updateAllPlayers(); GroupManager.logger.info("Superperms support enabled."); @@ -93,6 +105,7 @@ public class BukkitPermissions { manager.registerEvent(Event.Type.PLUGIN_DISABLE, serverListener, Event.Priority.Normal, plugin); } + /* public void collectPermissions() { registeredPermissions.clear(); for (Plugin bukkitPlugin : Bukkit.getServer().getPluginManager().getPlugins()) { @@ -100,43 +113,56 @@ public class BukkitPermissions { registeredPermissions.push(permission); } } + */ public void updatePermissions(Player player) { this.updatePermissions(player, null); } + + /** + * Push all permissions which are registered with GM for this player, on this world to Bukkit + * and make it update for the child nodes. + * + * @param player + * @param world + */ public void updatePermissions(Player player, String world) { if (player == null || !GroupManager.isLoaded()) { return; } - if (!this.attachments.containsKey(player)) { - this.attachments.put(player, player.addAttachment(plugin)); + PermissionAttachment attachment; + // Find the players current attachment, or add a new one. + if (this.attachments.containsKey(player)) { + attachment = this.attachments.get(player); + } else { + attachment = player.addAttachment(plugin); + this.attachments.put(player, attachment);; } if (world == null) { world = player.getWorld().getName(); } - // All permissions registered with Bukkit for this player - PermissionAttachment attachment = this.attachments.get(player); - OverloadedWorldHolder worldData = plugin.getWorldsHolder().getWorldData(world); + Boolean value = false; + //User user = worldData.getUser(player.getName()); - User user = worldData.getUser(player.getName()); - + /* // clear permissions for (String permission : attachment.getPermissions().keySet()) attachment.unsetPermission(permission); - + */ + /* * find matching permissions * * and base bukkit perms if we are set to allow bukkit permissions to * override. */ - Boolean value = false; - + + /* for (Permission permission : registeredPermissions) { PermissionCheckResult result = worldData.getPermissionsHandler().checkFullGMPermission(user, permission.getName(), false); @@ -163,35 +189,47 @@ public class BukkitPermissions { if ((value == true) || (result.resultType == PermissionCheckResult.Type.NEGATION)) { attachment.setPermission(permission, value); } - /* - if ((value == true) || (result.resultType == PermissionCheckResult.Type.NOTFOUND)) { - // fetch and set all children of this permission node - Map children = permission.getChildren(); - if (children != null) { - for (String child : children.keySet()) { - if (children.get(child)) - attachment.setPermission(child, value); - } - } - }*/ - } + */ - // Add any missing permissions for this player (non bukkit plugins and child nodes) + // Add all permissions for this player (GM only) + // child nodes will be calculated by Bukkit. List playerPermArray = worldData.getPermissionsHandler().getAllPlayersPermissions(player.getName()); - + Map newPerms = new HashMap(); + for (String permission : playerPermArray) { value = true; if (permission.startsWith("-")) { permission = permission.substring(1); // cut off - value = false; } - + /* if (!attachment.getPermissions().containsKey(permission)) { attachment.setPermission(permission, value); } + */ + newPerms.put(permission, value); + } + //player.recalculatePermissions(); + + /** + * This is put in place until such a time as Bukkit pull 466 is implemented + * https://github.com/Bukkit/Bukkit/pull/466 + */ + try { // Codename_B source + @SuppressWarnings("unchecked") + Map orig = (Map) permissions.get(attachment); + // Clear the map (faster than removing the attachment and recalculating) + orig.clear(); + // Then whack our map into there + orig.putAll(newPerms); + // That's all folks! + attachment.getPermissible().recalculatePermissions(); + } catch (IllegalArgumentException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); } - player.recalculatePermissions(); } /** @@ -245,6 +283,12 @@ public class BukkitPermissions { return null; } + /** + * List all effective permissions for this player. + * + * @param player + * @return + */ public List listPerms(Player player) { List perms = new ArrayList(); @@ -266,6 +310,9 @@ public class BukkitPermissions { return perms; } + /** + * force Bukkit to update every OnlinePlayers permissions. + */ public void updateAllPlayers() { for (Player player : Bukkit.getServer().getOnlinePlayers()) { updatePermissions(player); @@ -326,7 +373,7 @@ public class BukkitPermissions { if (!GroupManager.isLoaded()) return; - collectPermissions(); + //collectPermissions(); updateAllPlayers(); } -- cgit v1.2.3 From 2a478fe03d97c97eeb189f90721724ec6d7fcad5 Mon Sep 17 00:00:00 2001 From: ElgarL Date: Tue, 10 Jan 2012 18:40:34 +0000 Subject: Optimize fetching of Mirrored world data. --- EssentialsGroupManager/src/Changelog.txt | 3 ++- EssentialsGroupManager/src/config.yml | 10 +++++----- .../groupmanager/dataholder/worlds/WorldsHolder.java | 12 +++++++----- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/EssentialsGroupManager/src/Changelog.txt b/EssentialsGroupManager/src/Changelog.txt index 6ac58e8ff..d9ac389cd 100644 --- a/EssentialsGroupManager/src/Changelog.txt +++ b/EssentialsGroupManager/src/Changelog.txt @@ -97,4 +97,5 @@ v 1.8: - Reload GlobalGroups when you perform a world load. - Changed GlobalGroups to save/load before local groups in the scheduled data saving/loading - Fix 'manucheckp' to correctly report if a permission is available from GroupManager or Bukkit. - - Changed over to a reflection method for populating superperms as Bukkit lags when you handle permissions one at a time. \ No newline at end of file + - Changed over to a reflection method for populating superperms as Bukkit lags when you handle permissions one at a time. + - Optimize fetching of Mirrored world data. \ No newline at end of file diff --git a/EssentialsGroupManager/src/config.yml b/EssentialsGroupManager/src/config.yml index 17ffc5b6e..2847dfe0e 100644 --- a/EssentialsGroupManager/src/config.yml +++ b/EssentialsGroupManager/src/config.yml @@ -25,14 +25,14 @@ settings: level: INFO mirrors: - # Worlds listed here have their permissions mirrored in their children. + # Worlds listed here have their settings mirrored in their children. # the first element 'world' is the main worlds name - # subsequent elements '- world_nether' are worlds which will use the same - # user/groups permissions as the parent. + # subsequent elements 'world_nether' and 'world_the_end' are worlds which will use the same + # user/groups files as the parent. world: - world_nether - world_the_end - - world2 - - world3 + # - world2 + # - world3 # world4: # - world5 \ No newline at end of file diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/worlds/WorldsHolder.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/worlds/WorldsHolder.java index dbdd17f34..49205e4fb 100644 --- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/worlds/WorldsHolder.java +++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/worlds/WorldsHolder.java @@ -270,11 +270,12 @@ public class WorldsHolder { */ public OverloadedWorldHolder getWorldData(String worldName) { String worldNameLowered = worldName.toLowerCase(); - OverloadedWorldHolder data = worldsData.get(worldNameLowered); + // If a mirror change to the real world to load. if (mirrors.containsKey(worldNameLowered)) { - String realOne = mirrors.get(worldNameLowered); - data = worldsData.get(realOne.toLowerCase()); - } + worldNameLowered = mirrors.get(worldNameLowered); + } + OverloadedWorldHolder data = worldsData.get(worldNameLowered); + if (data == null) { GroupManager.logger.finest("Requested world " + worldName + " not found or badly mirrored. Returning default world..."); data = getDefaultWorld(); @@ -283,8 +284,9 @@ public class WorldsHolder { } /** - * Do a matching of playerName, if it s found only one player, do + * Do a matching of playerName, if its found only one player, do * getWorldData(player) + * * @param playerName * @return null if matching returned no player, or more than one. */ -- cgit v1.2.3 From 768c92e5bfe42ae9acb4d3ecdb6ebe8777534b11 Mon Sep 17 00:00:00 2001 From: ElgarL Date: Wed, 11 Jan 2012 05:51:40 +0000 Subject: Major, MAJOR changes to support partial/full world mirroring. You can now mirror groups.yml, users.yml or both files between different worlds. --- EssentialsGroupManager/src/Changelog.txt | 3 +- EssentialsGroupManager/src/config.yml | 26 +- .../org/anjocaido/groupmanager/GroupManager.java | 6 +- .../groupmanager/dataholder/GroupsDataHolder.java | 118 +++++ .../dataholder/OverloadedWorldHolder.java | 50 +- .../groupmanager/dataholder/UsersDataHolder.java | 106 +++++ .../groupmanager/dataholder/WorldDataHolder.java | 524 +++++++-------------- .../dataholder/worlds/WorldsHolder.java | 305 +++++++----- .../permissions/BukkitPermissions.java | 2 +- 9 files changed, 613 insertions(+), 527 deletions(-) create mode 100644 EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/GroupsDataHolder.java create mode 100644 EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/UsersDataHolder.java diff --git a/EssentialsGroupManager/src/Changelog.txt b/EssentialsGroupManager/src/Changelog.txt index d9ac389cd..364ae5952 100644 --- a/EssentialsGroupManager/src/Changelog.txt +++ b/EssentialsGroupManager/src/Changelog.txt @@ -98,4 +98,5 @@ v 1.8: - Changed GlobalGroups to save/load before local groups in the scheduled data saving/loading - Fix 'manucheckp' to correctly report if a permission is available from GroupManager or Bukkit. - Changed over to a reflection method for populating superperms as Bukkit lags when you handle permissions one at a time. - - Optimize fetching of Mirrored world data. \ No newline at end of file + - Major, MAJOR changes to support partial/full world mirroring. + You can now mirror groups.yml, users.yml or both files between different worlds. \ No newline at end of file diff --git a/EssentialsGroupManager/src/config.yml b/EssentialsGroupManager/src/config.yml index 2847dfe0e..13b59d343 100644 --- a/EssentialsGroupManager/src/config.yml +++ b/EssentialsGroupManager/src/config.yml @@ -26,13 +26,21 @@ settings: mirrors: # Worlds listed here have their settings mirrored in their children. - # the first element 'world' is the main worlds name - # subsequent elements 'world_nether' and 'world_the_end' are worlds which will use the same - # user/groups files as the parent. + # The first element 'world' is the main worlds name + # subsequent elements 'world_nether' and 'world_the_end' are worlds which will use + # the same user/groups files as the parent. + # Each child world can be configured to mirror the 'groups', 'users' or both files from it's parent. world: - - world_nether - - world_the_end - # - world2 - # - world3 - # world4: - # - world5 \ No newline at end of file + world_nether: + - users + - groups + world_the_end: + - users + - groups + # world2: (World2 would have it's own set of user and groups files) + # world3: + # - users (World3 would use the users.yml from world2, but it's own groups.yml) + # world4: + # - groups (World4 would use the groups.yml from world2, but it's own users.yml) + # world5: + # - world6 (this would cause world6 to mirror both files from world5) \ No newline at end of file diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/GroupManager.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/GroupManager.java index 4ba2624bf..8134a1c23 100644 --- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/GroupManager.java +++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/GroupManager.java @@ -948,7 +948,7 @@ public class GroupManager extends JavaPlugin { } } else { - sender.sendMessage(ChatColor.YELLOW + "The grpup '" + auxGroup.getName() + "' has no specific permissions."); + sender.sendMessage(ChatColor.YELLOW + "The group '" + auxGroup.getName() + "' has no specific permissions."); auxString = ""; for (String grp : auxGroup.getInherits()) { auxString += grp + ", "; @@ -1522,7 +1522,8 @@ public class GroupManager extends JavaPlugin { } // WORKING config.load(); - + worldsHolder.mirrorSetUp(); + isLoaded = false; if (args.length > 0) { @@ -1539,7 +1540,6 @@ public class GroupManager extends JavaPlugin { worldsHolder.reloadAll(); sender.sendMessage(ChatColor.YELLOW + " The current world was reloaded."); } - worldsHolder.mirrorSetUp(); isLoaded = true; diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/GroupsDataHolder.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/GroupsDataHolder.java new file mode 100644 index 000000000..4fc819245 --- /dev/null +++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/GroupsDataHolder.java @@ -0,0 +1,118 @@ +package org.anjocaido.groupmanager.dataholder; + +import java.io.File; +import java.util.HashMap; +import java.util.Map; + +import org.anjocaido.groupmanager.data.Group; + + + +/** + * @author ElgarL + * + */ +public class GroupsDataHolder { + + /** + * Root World name this set of groups is associated with. + */ + private String name; + private Group defaultGroup = null; + private File groupsFile; + private boolean haveGroupsChanged = false; + private long timeStampGroups = 0; + + /** + * The actual groups holder + */ + private Map groups = new HashMap(); + + /** + * Constructor + */ + protected GroupsDataHolder() { + } + + protected void setWorldName(String worldName) { + name = worldName; + } + + /** + * @return the name + */ + public String getWorldName() { + return name; + } + + /** + * @return the defaultGroup + */ + public Group getDefaultGroup() { + return defaultGroup; + } + + /** + * @param defaultGroup the defaultGroup to set + */ + public void setDefaultGroup(Group defaultGroup) { + this.defaultGroup = defaultGroup; + } + + /** + * @return the groups + */ + public Map getGroups() { + return groups; + } + + /** + * @param groups the groups to set + */ + public void setGroups(Map groups) { + this.groups = groups; + } + + /** + * @return the groupsFile + */ + public File getGroupsFile() { + return groupsFile; + } + + /** + * @param groupsFile the groupsFile to set + */ + public void setGroupsFile(File groupsFile) { + this.groupsFile = groupsFile; + } + + /** + * @return the haveGroupsChanged + */ + public boolean HaveGroupsChanged() { + return haveGroupsChanged; + } + + /** + * @param haveGroupsChanged the haveGroupsChanged to set + */ + public void setGroupsChanged(boolean haveGroupsChanged) { + this.haveGroupsChanged = haveGroupsChanged; + } + + /** + * @return the timeStampGroups + */ + public long getTimeStampGroups() { + return timeStampGroups; + } + + /** + * @param timeStampGroups the timeStampGroups to set + */ + public void setTimeStampGroups(long timeStampGroups) { + this.timeStampGroups = timeStampGroups; + } + +} \ No newline at end of file diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/OverloadedWorldHolder.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/OverloadedWorldHolder.java index 8e2df5d10..b37c55e51 100644 --- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/OverloadedWorldHolder.java +++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/OverloadedWorldHolder.java @@ -25,13 +25,11 @@ public class OverloadedWorldHolder extends WorldDataHolder { * * @param ph */ - @SuppressWarnings("deprecation") public OverloadedWorldHolder(WorldDataHolder ph) { super(ph.getName()); - this.f = ph.f; - this.groupsFile = ph.groupsFile; - this.usersFile = ph.usersFile; - this.defaultGroup = ph.defaultGroup; + this.setGroupsFile(ph.getGroupsFile()); + this.setUsersFile(ph.getUsersFile()); + //this.setDefaultGroup(ph.getDefaultGroup()); this.groups = ph.groups; this.users = ph.users; } @@ -49,11 +47,11 @@ public class OverloadedWorldHolder extends WorldDataHolder { return overloadedUsers.get(userNameLowered); } //END CODE - if (users.containsKey(userNameLowered)) { - return users.get(userNameLowered); + if (getUsers().containsKey(userNameLowered)) { + return getUsers().get(userNameLowered); } User newUser = createUser(userName); - haveUsersChanged = true; + setUsersChanged(true); return newUser; } @@ -69,8 +67,8 @@ public class OverloadedWorldHolder extends WorldDataHolder { if (theUser == null) { return; } - if ((theUser.getGroup() == null) || (!groups.containsKey(theUser.getGroupName().toLowerCase()))) { - theUser.setGroup(defaultGroup); + if ((theUser.getGroup() == null) || (!getGroups().containsKey(theUser.getGroupName().toLowerCase()))) { + theUser.setGroup(getDefaultGroup()); } //OVERLOADED CODE if (overloadedUsers.containsKey(theUser.getName().toLowerCase())) { @@ -80,8 +78,8 @@ public class OverloadedWorldHolder extends WorldDataHolder { } //END CODE removeUser(theUser.getName()); - users.put(theUser.getName().toLowerCase(), theUser); - haveUsersChanged = true; + getUsers().put(theUser.getName().toLowerCase(), theUser); + setUsersChanged(true); } /** @@ -97,9 +95,9 @@ public class OverloadedWorldHolder extends WorldDataHolder { return true; } //END CODE - if (users.containsKey(userName.toLowerCase())) { - users.remove(userName.toLowerCase()); - haveUsersChanged = true; + if (getUsers().containsKey(userName.toLowerCase())) { + getUsers().remove(userName.toLowerCase()); + setUsersChanged(true); return true; } return false; @@ -107,16 +105,16 @@ public class OverloadedWorldHolder extends WorldDataHolder { @Override public boolean removeGroup(String groupName) { - if (groupName.equals(defaultGroup)) { + if (groupName.equals(getDefaultGroup())) { return false; } - for (String key : groups.keySet()) { + for (String key : getGroups().keySet()) { if (groupName.equalsIgnoreCase(key)) { - groups.remove(key); - for (String userKey : users.keySet()) { - User user = users.get(userKey); + getGroups().remove(key); + for (String userKey : getUsers().keySet()) { + User user = getUsers().get(userKey); if (user.getGroupName().equalsIgnoreCase(key)) { - user.setGroup(defaultGroup); + user.setGroup(getDefaultGroup()); } } @@ -124,12 +122,12 @@ public class OverloadedWorldHolder extends WorldDataHolder { for (String userKey : overloadedUsers.keySet()) { User user = overloadedUsers.get(userKey); if (user.getGroupName().equalsIgnoreCase(key)) { - user.setGroup(defaultGroup); + user.setGroup(getDefaultGroup()); } } //END OVERLOAD - haveGroupsChanged = true; + setGroupsChanged(true); return true; } } @@ -143,7 +141,7 @@ public class OverloadedWorldHolder extends WorldDataHolder { @Override public Collection getUserList() { Collection overloadedList = new ArrayList(); - Collection normalList = users.values(); + Collection normalList = getUsers().values(); for (User u : normalList) { if (overloadedUsers.containsKey(u.getName().toLowerCase())) { overloadedList.add(overloadedUsers.get(u.getName().toLowerCase())); @@ -198,8 +196,8 @@ public class OverloadedWorldHolder extends WorldDataHolder { if (!isOverloaded(userName)) { return getUser(userName); } - if (users.containsKey(userName.toLowerCase())) { - return users.get(userName.toLowerCase()); + if (getUsers().containsKey(userName.toLowerCase())) { + return getUsers().get(userName.toLowerCase()); } User newUser = createUser(userName); return newUser; diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/UsersDataHolder.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/UsersDataHolder.java new file mode 100644 index 000000000..37e1c4b43 --- /dev/null +++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/UsersDataHolder.java @@ -0,0 +1,106 @@ +package org.anjocaido.groupmanager.dataholder; + +import java.io.File; +import java.util.HashMap; +import java.util.Map; + +import org.anjocaido.groupmanager.data.User; + + + +/** + * @author ElgarL + * + */ +public class UsersDataHolder { + + /** + * Root World name this set of groups is associated with. + */ + private String name; + private File usersFile; + private boolean haveUsersChanged = false; + private long timeStampUsers = 0; + + /** + * The actual groups holder + */ + private Map users = new HashMap(); + + /** + * Constructor + */ + protected UsersDataHolder() { + } + + /** + * @param worldName + */ + public void setWorldName(String worldName) { + this.name = worldName; + } + + /** + * @return the name + */ + public String getWorldName() { + return this.name; + } + + /** + * @return the users + */ + public Map getUsers() { + return users; + } + + /** + * @param users the users to set + */ + public void setUsers(Map users) { + this.users = users; + } + + /** + * @return the usersFile + */ + public File getUsersFile() { + return usersFile; + } + + /** + * @param usersFile the usersFile to set + */ + public void setUsersFile(File usersFile) { + this.usersFile = usersFile; + } + + /** + * @return the haveUsersChanged + */ + public boolean HaveUsersChanged() { + return haveUsersChanged; + } + + /** + * @param haveUsersChanged the haveUsersChanged to set + */ + public void setUsersChanged(boolean haveUsersChanged) { + this.haveUsersChanged = haveUsersChanged; + } + + /** + * @return the timeStampUsers + */ + public long getTimeStampUsers() { + return timeStampUsers; + } + + /** + * @param timeStampUsers the timeStampUsers to set + */ + public void setTimeStampUsers(long timeStampUsers) { + this.timeStampUsers = timeStampUsers; + } + +} \ No newline at end of file diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/WorldDataHolder.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/WorldDataHolder.java index 2a944856b..73c4dca0f 100644 --- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/WorldDataHolder.java +++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/WorldDataHolder.java @@ -8,7 +8,6 @@ import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; -import java.io.FileWriter; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; @@ -49,72 +48,37 @@ public class WorldDataHolder { /** * The actual groups holder */ - protected Map groups = new HashMap(); + protected GroupsDataHolder groups = new GroupsDataHolder(); /** * The actual users holder */ - protected Map users = new HashMap(); - - /** - * Points to the default group - */ - protected Group defaultGroup = null; - - /** - * The file, which this class loads/save data from/to - * @deprecated - */ - @Deprecated - protected File f; - + protected UsersDataHolder users = new UsersDataHolder(); /** * */ protected AnjoPermissionsHandler permissionsHandler; - /** - * - */ - protected File usersFile; - /** - * - */ - protected File groupsFile; - /** - * - */ - protected boolean haveUsersChanged = false; - /** - * - */ - protected boolean haveGroupsChanged = false; - /** - * - */ - protected long timeStampGroups = 0; - /** - * - */ - protected long timeStampUsers = 0; /** * Prevent direct instantiation * @param worldName */ - protected WorldDataHolder(String worldName) { + public WorldDataHolder(String worldName) { name = worldName; } /** * The main constructor for a new WorldDataHolder - * Please don't set the default group as null * @param worldName - * @param defaultGroup the default group. its good to start with one + * @param groups + * @param users */ - public WorldDataHolder(String worldName, Group defaultGroup) { + public WorldDataHolder(String worldName, GroupsDataHolder groups, UsersDataHolder users) { this.name = worldName; - groups.put(defaultGroup.getName().toLowerCase(), defaultGroup); - this.defaultGroup = defaultGroup; + this.groups = groups; + this.users = users; + + //this.defaultGroup = defaultGroup; } /** @@ -125,8 +89,8 @@ public class WorldDataHolder { * @return class that manage that user permission */ public User getUser(String userName) { - if (users.containsKey(userName.toLowerCase())) { - return users.get(userName.toLowerCase()); + if (getUsers().containsKey(userName.toLowerCase())) { + return getUsers().get(userName.toLowerCase()); } User newUser = createUser(userName); return newUser; @@ -144,11 +108,11 @@ public class WorldDataHolder { return; } if ((theUser.getGroup() == null)) { - theUser.setGroup(defaultGroup); + theUser.setGroup(groups.getDefaultGroup()); } removeUser(theUser.getName()); - users.put(theUser.getName().toLowerCase(), theUser); - haveUsersChanged = true; + getUsers().put(theUser.getName().toLowerCase(), theUser); + setUsersChanged(true); if (GroupManager.isLoaded()) GroupManagerEventHandler.callEvent(theUser, Action.USER_ADDED); } @@ -159,9 +123,9 @@ public class WorldDataHolder { * @return true if it had something to remove */ public boolean removeUser(String userName) { - if (users.containsKey(userName.toLowerCase())) { - users.remove(userName.toLowerCase()); - haveUsersChanged = true; + if (getUsers().containsKey(userName.toLowerCase())) { + getUsers().remove(userName.toLowerCase()); + setUsersChanged(true); if (GroupManager.isLoaded()) GroupManagerEventHandler.callEvent(userName, GMUserEvent.Action.USER_REMOVED); return true; @@ -175,7 +139,7 @@ public class WorldDataHolder { * @return true if we have data for this player. */ public boolean isUserDeclared(String userName) { - return users.containsKey(userName.toLowerCase()); + return getUsers().containsKey(userName.toLowerCase()); } /** @@ -183,11 +147,11 @@ public class WorldDataHolder { * @param group the group you want make default. */ public void setDefaultGroup(Group group) { - if (!groups.containsKey(group.getName().toLowerCase()) || (group.getDataSource() != this)) { + if (!getGroups().containsKey(group.getName().toLowerCase()) || (group.getDataSource() != this)) { addGroup(group); } - defaultGroup = this.getGroup(group.getName()); - haveGroupsChanged = true; + groups.setDefaultGroup(getGroup(group.getName())); + setGroupsChanged(true); if (GroupManager.isLoaded()) GroupManagerEventHandler.callEvent(GMSystemEvent.Action.DEFAULT_GROUP_CHANGED); } @@ -197,7 +161,7 @@ public class WorldDataHolder { * @return the default group */ public Group getDefaultGroup() { - return defaultGroup; + return groups.getDefaultGroup(); } /** @@ -209,7 +173,7 @@ public class WorldDataHolder { if (groupName.toLowerCase().startsWith("g:")) return GroupManager.getGlobalGroups().getGroup(groupName); else - return groups.get(groupName.toLowerCase()); + return getGroups().get(groupName.toLowerCase()); } /** @@ -222,7 +186,7 @@ public class WorldDataHolder { if (groupName.toLowerCase().startsWith("g:")) return GroupManager.getGlobalGroups().hasGroup(groupName); else - return groups.containsKey(groupName.toLowerCase()); + return getGroups().containsKey(groupName.toLowerCase()); } /** @@ -240,8 +204,8 @@ public class WorldDataHolder { groupToAdd = groupToAdd.clone(this); } removeGroup(groupToAdd.getName()); - groups.put(groupToAdd.getName().toLowerCase(), groupToAdd); - haveGroupsChanged = true; + getGroups().put(groupToAdd.getName().toLowerCase(), groupToAdd); + setGroupsChanged(true); if (GroupManager.isLoaded()) GroupManagerEventHandler.callEvent(groupToAdd, GMGroupEvent.Action.GROUP_ADDED); } @@ -256,12 +220,12 @@ public class WorldDataHolder { return GroupManager.getGlobalGroups().removeGroup(groupName); } - if (defaultGroup != null && groupName.equalsIgnoreCase(defaultGroup.getName())) { + if (getDefaultGroup() != null && groupName.equalsIgnoreCase(getDefaultGroup().getName())) { return false; } - if (groups.containsKey(groupName.toLowerCase())) { - groups.remove(groupName.toLowerCase()); - haveGroupsChanged = true; + if (getGroups().containsKey(groupName.toLowerCase())) { + getGroups().remove(groupName.toLowerCase()); + setGroupsChanged(true); if (GroupManager.isLoaded()) GroupManagerEventHandler.callEvent(groupName.toLowerCase(), GMGroupEvent.Action.GROUP_REMOVED); return true; @@ -277,13 +241,13 @@ public class WorldDataHolder { * @return null if user already exists. or new User */ public User createUser(String userName) { - if (this.users.containsKey(userName.toLowerCase())) { + if (getUsers().containsKey(userName.toLowerCase())) { return null; } User newUser = new User(this, userName); - newUser.setGroup(defaultGroup); - this.addUser(newUser); - haveUsersChanged = true; + newUser.setGroup(groups.getDefaultGroup()); + addUser(newUser); + setUsersChanged(true); return newUser; } @@ -299,13 +263,13 @@ public class WorldDataHolder { return GroupManager.getGlobalGroups().newGroup(newGroup); } - if (this.groups.containsKey(groupName.toLowerCase())) { + if (getGroups().containsKey(groupName.toLowerCase())) { return null; } Group newGroup = new Group(this, groupName); - this.addGroup(newGroup); - haveGroupsChanged = true; + addGroup(newGroup); + setGroupsChanged(true); return newGroup; } @@ -314,7 +278,7 @@ public class WorldDataHolder { * @return a collection of the groups */ public Collection getGroupList() { - return groups.values(); + return getGroups().values(); } /** @@ -322,7 +286,7 @@ public class WorldDataHolder { * @return a collection of the users */ public Collection getUserList() { - return users.values(); + return getUsers().values(); } /** @@ -352,9 +316,9 @@ public class WorldDataHolder { for (Group tempGroup : ph.getGroupList()) { tempGroup.clone(this); } - this.setDefaultGroup(this.getGroup(ph.getDefaultGroup().getName())); + this.setDefaultGroup(getGroup(ph.getDefaultGroup().getName())); this.removeGroupsChangedFlag(); - this.timeStampGroups = getGroupsFile().lastModified(); + this.setTimeStampGroups(getGroupsFile().lastModified()); ph = null; } catch (Exception ex) { @@ -377,7 +341,7 @@ public class WorldDataHolder { tempGroup.clone(ph); } // setup the default group before loading user data. - ph.setDefaultGroup(ph.getGroup(this.getDefaultGroup().getName())); + ph.setDefaultGroup(ph.getGroup(getDefaultGroup().getName())); loadUsers(ph, getUsersFile()); // transfer new data resetUsers(); @@ -385,7 +349,7 @@ public class WorldDataHolder { tempUser.clone(this); } this.removeUsersChangedFlag(); - this.timeStampUsers = getUsersFile().lastModified(); + this.setTimeStampUsers(getUsersFile().lastModified()); ph = null; } catch (Exception ex) { @@ -395,165 +359,39 @@ public class WorldDataHolder { GroupManagerEventHandler.callEvent(GMSystemEvent.Action.RELOADED); } - /** - * Save by yourself! - * @deprecated - */ - @Deprecated - public void commit() { - writeGroups(this, getGroupsFile()); - writeUsers(this, getUsersFile()); - } - - /** - * Returns a data holder for the given file - * - * @param worldName - * @param file - * @return a new WorldDataHolder - * - * @throws Exception - * @deprecated - */ - @SuppressWarnings({"rawtypes", "unchecked"}) - @Deprecated - public static WorldDataHolder load(String worldName, File file) throws Exception { - WorldDataHolder ph = new WorldDataHolder(worldName); - ph.f = file; - final Yaml yaml = new Yaml(new SafeConstructor()); - Map rootDataNode; - if (!file.exists()) { - throw new Exception("The file which should contain permissions does not exist!\n" + file.getPath()); - } - FileInputStream rx = new FileInputStream(file); - try { - rootDataNode = (Map) yaml.load(new UnicodeReader(rx)); - if (rootDataNode == null) { - throw new NullPointerException(); - } - } catch (Exception ex) { - throw new Exception("The following file couldn't pass on Parser.\n" + file.getPath(), ex); - } finally { - rx.close(); - } - Map> inheritance = new HashMap>(); - try { - Map allGroupsNode = (Map) rootDataNode.get("groups"); - for (String groupKey : allGroupsNode.keySet()) { - Map thisGroupNode = (Map) allGroupsNode.get(groupKey); - Group thisGrp = ph.createGroup(groupKey); - if (thisGrp == null) { - throw new IllegalArgumentException("I think this group was declared more than once: " + groupKey); - } - if (thisGroupNode.get("default") == null) { - thisGroupNode.put("default", false); - } - if ((Boolean.parseBoolean(thisGroupNode.get("default").toString()))) { - if (ph.getDefaultGroup() != null) { - GroupManager.logger.warning("The group " + thisGrp.getName() + " is declaring be default where" + ph.getDefaultGroup().getName() + " already was."); - GroupManager.logger.warning("Overriding first request."); - } - ph.setDefaultGroup(thisGrp); - } - - //PERMISSIONS NODE - if (thisGroupNode.get("permissions") == null) { - thisGroupNode.put("permissions", new ArrayList()); - } - if (thisGroupNode.get("permissions") instanceof List) { - for (Object o : ((List) thisGroupNode.get("permissions"))) { - thisGrp.addPermission(o.toString()); - } - } else if (thisGroupNode.get("permissions") instanceof String) { - thisGrp.addPermission((String) thisGroupNode.get("permissions")); - } else { - throw new IllegalArgumentException("Unknown type of permissions node(Should be String or List): " + thisGroupNode.get("permissions").getClass().getName()); - } - - //INFO NODE - Map infoNode = (Map) thisGroupNode.get("info"); - if (infoNode != null) { - thisGrp.setVariables(infoNode); - } - - //END INFO NODE - - Object inheritNode = thisGroupNode.get("inheritance"); - if (inheritNode == null) { - thisGroupNode.put("inheritance", new ArrayList()); - } else if (inheritNode instanceof List) { - List groupsInh = (List) inheritNode; - for (String grp : groupsInh) { - if (inheritance.get(groupKey) == null) { - List thisInherits = new ArrayList(); - inheritance.put(groupKey, thisInherits); - } - inheritance.get(groupKey).add(grp); - - } - } - } - } catch (Exception ex) { - ex.printStackTrace(); - throw new Exception("Your Permissions config file is invalid. See console for details."); - } - if (ph.defaultGroup == null) { - throw new IllegalArgumentException("There was no Default Group declared."); - } - for (String groupKey : inheritance.keySet()) { - List inheritedList = inheritance.get(groupKey); - Group thisGroup = ph.getGroup(groupKey); - for (String inheritedKey : inheritedList) { - Group inheritedGroup = ph.getGroup(inheritedKey); - if (thisGroup != null && inheritedGroup != null) { - thisGroup.addInherits(inheritedGroup); - } - } - } - // Process USERS - Map allUsersNode = (Map) rootDataNode.get("users"); - for (String usersKey : allUsersNode.keySet()) { - Map thisUserNode = (Map) allUsersNode.get(usersKey); - User thisUser = ph.createUser(usersKey); - if (thisUser == null) { - GroupManager.logger.warning("I think this user was declared more than once: " + usersKey); - continue; - } - if (thisUserNode.get("permissions") == null) { - thisUserNode.put("permissions", new ArrayList()); - } - if (thisUserNode.get("permissions") instanceof List) { - for (Object o : ((List) thisUserNode.get("permissions"))) { - thisUser.addPermission(o.toString()); - } - } else if (thisUserNode.get("permissions") instanceof String) { - thisUser.addPermission(thisUserNode.get("permissions").toString()); - } + public void loadGroups(File groupsFile) { + GroupManager.setLoaded(false); + try { + setGroupsFile(groupsFile); + loadGroups(this, groupsFile); + } catch (FileNotFoundException e) { + e.printStackTrace(); + throw new IllegalArgumentException("The file which should contain groups does not exist!\n" + groupsFile.getPath()); + } catch (IOException e) { + e.printStackTrace(); + throw new IllegalArgumentException("Error access the groups file!\n" + groupsFile.getPath()); + } - //USER INFO NODE - BETA + GroupManager.setLoaded(true); + } + + public void loadUsers(File usersFile) { - //INFO NODE - Map infoNode = (Map) thisUserNode.get("info"); - if (infoNode != null) { - thisUser.setVariables(infoNode); - } - //END INFO NODE - BETA + GroupManager.setLoaded(false); + try { + setUsersFile(usersFile); + loadUsers(this, usersFile); + } catch (FileNotFoundException e) { + e.printStackTrace(); + throw new IllegalArgumentException("The file which should contain users does not exist!\n" + usersFile.getPath()); + } catch (IOException e) { + e.printStackTrace(); + throw new IllegalArgumentException("Error access the users file!\n" + usersFile.getPath()); + } - if (thisUserNode.get("group") != null) { - Group hisGroup = ph.getGroup(thisUserNode.get("group").toString()); - if (hisGroup == null) { - GroupManager.logger.warning("There is no group " + thisUserNode.get("group").toString() + ", as stated for player " + thisUser.getName()); - thisUser.setGroup(ph.defaultGroup); - } - thisUser.setGroup(hisGroup); - } else { - thisUser.setGroup(ph.defaultGroup); - } - } - return ph; + GroupManager.setLoaded(true); } - /** * Returns a NEW data holder containing data read from the files * @@ -568,8 +406,8 @@ public class WorldDataHolder { WorldDataHolder ph = new WorldDataHolder(worldName); GroupManager.setLoaded(false); - loadGroups(ph, groupsFile); - loadUsers(ph, usersFile); + if (groupsFile != null) loadGroups(ph, groupsFile); + if (usersFile != null) loadUsers(ph, usersFile); GroupManager.setLoaded(true); return ph; @@ -673,7 +511,7 @@ public class WorldDataHolder { // ex.printStackTrace(); // throw new IllegalArgumentException("Your Permissions config file is invalid. See console for details."); //} - if (ph.defaultGroup == null) { + if (ph.getDefaultGroup() == null) { throw new IllegalArgumentException("There was no Default Group declared in file: " + groupsFile.getPath()); } for (String groupKey : inheritance.keySet()) { @@ -689,7 +527,7 @@ public class WorldDataHolder { ph.removeGroupsChangedFlag(); // Update the LastModified time. - ph.groupsFile = groupsFile; + ph.setGroupsFile(groupsFile); ph.setTimeStampGroups(groupsFile.lastModified()); //return ph; @@ -788,108 +626,21 @@ public class WorldDataHolder { Group hisGroup = ph.getGroup(thisUserNode.get("group").toString()); if (hisGroup == null) { GroupManager.logger.warning("There is no group " + thisUserNode.get("group").toString() + ", as stated for player " + thisUser.getName() + ": Set to '" + ph.getDefaultGroup().getName() + "' for file: " + usersFile.getPath()); - hisGroup = ph.defaultGroup; + hisGroup = ph.getDefaultGroup(); //throw new IllegalArgumentException("There is no group " + thisUserNode.get("group").toString() + ", as stated for player " + thisUser.getName()); } thisUser.setGroup(hisGroup); } else { - thisUser.setGroup(ph.defaultGroup); + thisUser.setGroup(ph.getDefaultGroup()); } } ph.removeUsersChangedFlag(); // Update the LastModified time. - ph.usersFile = usersFile; + ph.setUsersFile(usersFile); ph.setTimeStampUsers(usersFile.lastModified()); } - /** - * Write a dataHolder in a specified file - * @param ph - * @param file - * @deprecated - */ - @Deprecated - public static void write(WorldDataHolder ph, File file) { - Map root = new HashMap(); - - Map pluginMap = new HashMap(); - root.put("plugin", pluginMap); - - Map permissionsMap = new HashMap(); - pluginMap.put("permissions", permissionsMap); - - permissionsMap.put("system", "default"); - - Map groupsMap = new HashMap(); - root.put("groups", groupsMap); - for (String groupKey : ph.groups.keySet()) { - Group group = ph.groups.get(groupKey); - - Map aGroupMap = new HashMap(); - groupsMap.put(group.getName(), aGroupMap); - - aGroupMap.put("default", group.equals(ph.defaultGroup)); - - Map infoMap = new HashMap(); - aGroupMap.put("info", infoMap); - - for (String infoKey : group.getVariables().getVarKeyList()) { - infoMap.put(infoKey, group.getVariables().getVarObject(infoKey)); - } - - aGroupMap.put("inheritance", group.getInherits()); - - aGroupMap.put("permissions", group.getPermissionList()); - } - - Map usersMap = new HashMap(); - root.put("users", usersMap); - for (String userKey : ph.users.keySet()) { - User user = ph.users.get(userKey); - if ((user.getGroup() == null || user.getGroup().equals(ph.defaultGroup)) && user.getPermissionList().isEmpty()) { - continue; - } - - Map aUserMap = new HashMap(); - usersMap.put(user.getName(), aUserMap); - - if (user.getGroup() == null) { - aUserMap.put("group", ph.defaultGroup.getName()); - } else { - aUserMap.put("group", user.getGroup().getName()); - } - //USER INFO NODE - BETA - if (user.getVariables().getSize() > 0) { - Map infoMap = new HashMap(); - aUserMap.put("info", infoMap); - - for (String infoKey : user.getVariables().getVarKeyList()) { - infoMap.put(infoKey, user.getVariables().getVarObject(infoKey)); - } - } - //END USER INFO NODE - BETA - - aUserMap.put("permissions", user.getPermissionList()); - } - DumperOptions opt = new DumperOptions(); - opt.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK); - final Yaml yaml = new Yaml(opt); - - FileWriter tx = null; - try { - tx = new FileWriter(file, false); - tx.write(yaml.dump(root)); - tx.flush(); - } catch (Exception e) { - } finally { - try { - tx.close(); - } catch (IOException ex) { - } - } - } - /** * Write a dataHolder in a specified file * @param ph @@ -901,16 +652,16 @@ public class WorldDataHolder { Map groupsMap = new HashMap(); root.put("groups", groupsMap); - for (String groupKey : ph.groups.keySet()) { - Group group = ph.groups.get(groupKey); + for (String groupKey : ph.getGroups().keySet()) { + Group group = ph.getGroups().get(groupKey); Map aGroupMap = new HashMap(); groupsMap.put(group.getName(), aGroupMap); - if (ph.defaultGroup == null) { + if (ph.getDefaultGroup() == null) { GroupManager.logger.severe("There is no default group for world: " + ph.getName()); } - aGroupMap.put("default", group.equals(ph.defaultGroup)); + aGroupMap.put("default", group.equals(ph.getDefaultGroup())); Map infoMap = new HashMap(); aGroupMap.put("info", infoMap); @@ -951,7 +702,7 @@ public class WorldDataHolder { } // Update the LastModified time. - ph.groupsFile = groupsFile; + ph.setGroupsFile(groupsFile); ph.setTimeStampGroups(groupsFile.lastModified()); ph.removeGroupsChangedFlag(); @@ -982,9 +733,9 @@ public class WorldDataHolder { Map usersMap = new HashMap(); root.put("users", usersMap); - for (String userKey : ph.users.keySet()) { - User user = ph.users.get(userKey); - if ((user.getGroup() == null || user.getGroup().equals(ph.defaultGroup)) && user.getPermissionList().isEmpty() && user.getVariables().isEmpty() && user.isSubGroupsEmpty()) { + for (String userKey : ph.getUsers().keySet()) { + User user = ph.getUsers().get(userKey); + if ((user.getGroup() == null || user.getGroup().equals(ph.getDefaultGroup())) && user.getPermissionList().isEmpty() && user.getVariables().isEmpty() && user.isSubGroupsEmpty()) { continue; } @@ -992,7 +743,7 @@ public class WorldDataHolder { usersMap.put(user.getName(), aUserMap); if (user.getGroup() == null) { - aUserMap.put("group", ph.defaultGroup.getName()); + aUserMap.put("group", ph.getDefaultGroup().getName()); } else { aUserMap.put("group", user.getGroup().getName()); } @@ -1027,7 +778,7 @@ public class WorldDataHolder { } // Update the LastModified time. - ph.usersFile = usersFile; + ph.setUsersFile(usersFile); ph.setTimeStampUsers(usersFile.lastModified()); ph.removeUsersChangedFlag(); @@ -1083,16 +834,23 @@ public class WorldDataHolder { } return permissionsHandler; } + + /** + * @param haveUsersChanged the haveUsersChanged to set + */ + public void setUsersChanged(boolean haveUsersChanged) { + users.setUsersChanged(haveUsersChanged); + } /** * * @return true if any user data has changed */ public boolean haveUsersChanged() { - if (haveUsersChanged) { + if (users.HaveUsersChanged()) { return true; } - for (User u : users.values()) { + for (User u : users.getUsers().values()) { if (u.isChanged()) { return true; } @@ -1100,15 +858,22 @@ public class WorldDataHolder { return false; } + /** + * @param setGroupsChanged the haveGroupsChanged to set + */ + public void setGroupsChanged(boolean setGroupsChanged) { + groups.setGroupsChanged(setGroupsChanged); + } + /** * * @return true if any group data has changed. */ public boolean haveGroupsChanged() { - if (haveGroupsChanged) { + if (groups.HaveGroupsChanged()) { return true; } - for (Group g : groups.values()) { + for (Group g : groups.getGroups().values()) { if (g.isChanged()) { return true; } @@ -1120,8 +885,8 @@ public class WorldDataHolder { * */ public void removeUsersChangedFlag() { - haveUsersChanged = false; - for (User u : users.values()) { + setUsersChanged(false); + for (User u : getUsers().values()) { u.flagAsSaved(); } } @@ -1130,8 +895,8 @@ public class WorldDataHolder { * */ public void removeGroupsChangedFlag() { - haveGroupsChanged = false; - for (Group g : groups.values()) { + setGroupsChanged(false); + for (Group g : getGroups().values()) { g.flagAsSaved(); } } @@ -1140,14 +905,28 @@ public class WorldDataHolder { * @return the usersFile */ public File getUsersFile() { - return usersFile; + return users.getUsersFile(); + } + + /** + * @param file the usersFile to set + */ + public void setUsersFile(File file) { + users.setUsersFile(file); } /** * @return the groupsFile */ public File getGroupsFile() { - return groupsFile; + return groups.getGroupsFile(); + } + + /** + * @param file the groupsFile to set + */ + public void setGroupsFile(File file) { + groups.setGroupsFile(file); } /** @@ -1161,60 +940,85 @@ public class WorldDataHolder { * Resets Groups. */ public void resetGroups() { - this.defaultGroup = null; - this.groups = new HashMap(); + //setDefaultGroup(null); + groups.setGroups(new HashMap()); } /** * Resets Users */ public void resetUsers() { - this.users = new HashMap(); + users.setUsers(new HashMap()); } /** * @return the groups */ public Map getGroups() { - return groups; + return groups.getGroups(); } /** * @return the users */ public Map getUsers() { + return users.getUsers(); + } + + /** + * @return the groups + */ + public GroupsDataHolder getGroupsObject() { + return groups; + } + /** + * @param groupsDataHolder the GroupsDataHolder to set + */ + public void setGroupsObject(GroupsDataHolder groupsDataHolder) { + groups = groupsDataHolder; + } + /** + * @return the users + */ + public UsersDataHolder getUsersObject() { return users; } + /** + * @param usersDataHolder the UsersDataHolder to set + */ + public void setUsersObject(UsersDataHolder usersDataHolder) { + users = usersDataHolder; + } /** * @return the timeStampGroups */ public long getTimeStampGroups() { - return timeStampGroups; + return groups.getTimeStampGroups(); } /** * @return the timeStampUsers */ public long getTimeStampUsers() { - return timeStampUsers; + return users.getTimeStampUsers(); } /** * @param timeStampGroups the timeStampGroups to set */ protected void setTimeStampGroups(long timeStampGroups) { - this.timeStampGroups = timeStampGroups; + groups.setTimeStampGroups(timeStampGroups); } /** * @param timeStampUsers the timeStampUsers to set */ protected void setTimeStampUsers(long timeStampUsers) { - this.timeStampUsers = timeStampUsers; + users.setTimeStampUsers(timeStampUsers); } public void setTimeStamps() { - if (groupsFile != null) - setTimeStampGroups(groupsFile.lastModified()); - if (usersFile != null) - setTimeStampUsers(usersFile.lastModified()); + if (getGroupsFile() != null) + setTimeStampGroups(getGroupsFile().lastModified()); + if (getUsersFile() != null) + setTimeStampUsers(getUsersFile().lastModified()); } } diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/worlds/WorldsHolder.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/worlds/WorldsHolder.java index 49205e4fb..1a765c7b4 100644 --- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/worlds/WorldsHolder.java +++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/worlds/WorldsHolder.java @@ -6,7 +6,6 @@ package org.anjocaido.groupmanager.dataholder.worlds; import java.io.File; import java.io.FileInputStream; -import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; @@ -22,6 +21,7 @@ import org.anjocaido.groupmanager.dataholder.OverloadedWorldHolder; import org.anjocaido.groupmanager.permissions.AnjoPermissionsHandler; import org.anjocaido.groupmanager.utils.Tasks; import org.bukkit.World; +import org.bukkit.configuration.MemorySection; import org.bukkit.entity.Player; /** @@ -34,6 +34,7 @@ public class WorldsHolder { * Map with instances of loaded worlds. */ private Map worldsData = new HashMap(); + /** * Map of mirrors: * The key is the mirror. @@ -41,7 +42,9 @@ public class WorldsHolder { * * Mirror shows the same data of mirrored. */ - private Map mirrors = new HashMap(); + private Map mirrorsGroup = new HashMap(); + private Map mirrorsUser = new HashMap(); + private OverloadedWorldHolder defaultWorld; private String serverDefaultWorldName; private GroupManager plugin; @@ -85,7 +88,7 @@ public class WorldsHolder { */ for (World world: plugin.getServer().getWorlds()) if ((!worldsData.containsKey(world.getName().toLowerCase())) - && (!mirrors.containsKey(world.getName().toLowerCase()))) + && ((!mirrorsGroup.containsKey(world.getName().toLowerCase())) || (!mirrorsUser.containsKey(world.getName().toLowerCase())))) setupWorldFolder(world.getName()); /* * Loop over all folders within the worlds folder @@ -97,10 +100,11 @@ public class WorldsHolder { /* * don't load any worlds which are already loaded - * or mirrored worlds that don't need data. + * or fully mirrored worlds that don't need data. */ if (!worldsData.containsKey(folder.getName().toLowerCase()) - && !mirrors.containsKey(folder.getName().toLowerCase())) { + && ((!mirrorsGroup.containsKey(folder.getName().toLowerCase())) + || (!mirrorsUser.containsKey(folder.getName().toLowerCase())))) { loadWorld(folder.getName()); } @@ -110,7 +114,8 @@ public class WorldsHolder { @SuppressWarnings("rawtypes") public void mirrorSetUp() { - mirrors.clear(); + mirrorsGroup.clear(); + mirrorsUser.clear(); Map mirrorsMap = plugin.getGMConfig().getMirrorsMap(); if (mirrorsMap != null) { for (String source : mirrorsMap.keySet()) { @@ -122,16 +127,52 @@ public class WorldsHolder { if (mirrorsMap.get(source) instanceof ArrayList) { ArrayList mirrorList = (ArrayList) mirrorsMap.get(source); + + // These worlds fully mirror their parent for (Object o : mirrorList) { try { - mirrors.remove(o.toString().toLowerCase()); + mirrorsGroup.remove(o.toString().toLowerCase()); + mirrorsUser.remove(o.toString().toLowerCase()); } catch (Exception e) { } - mirrors.put(o.toString().toLowerCase(), getWorldData(source).getName()); + mirrorsGroup.put(o.toString().toLowerCase(), getWorldData(source).getName()); + mirrorsUser.put(o.toString().toLowerCase(), getWorldData(source).getName()); } - } else if (mirrorsMap.get(source) instanceof Object) { - String aMirror = mirrorsMap.get(source).toString(); - mirrors.put(aMirror.toLowerCase(), getWorldData(source).getName()); + } else if (mirrorsMap.get(source) instanceof MemorySection) { + MemorySection subSection = (MemorySection) mirrorsMap.get(source); + + for (String key : subSection.getKeys(true)) { + //System.out.print("Key - " + key); + + if (subSection.get(key) instanceof ArrayList) { + ArrayList mirrorList = (ArrayList) subSection.get(key); + + // These worlds have defined mirroring + for (Object o : mirrorList) { + String type = o.toString().toLowerCase(); + try { + if (type.equals("groups")) + mirrorsGroup.remove(key.toLowerCase()); + + if (type.equals("users")) + mirrorsUser.remove(key.toLowerCase()); + + } catch (Exception e) { + } + if (type.equals("groups")) + mirrorsGroup.put(key.toLowerCase(), getWorldData(source).getName()); + + if (type.equals("users")) + mirrorsUser.put(key.toLowerCase(), getWorldData(source).getName()); + } + + + + } else { + throw new IllegalStateException("Unknown mirroring format for " + key); + } + + } } } } @@ -141,16 +182,22 @@ public class WorldsHolder { * */ public void reloadAll() { + // Load global groups + GroupManager.getGlobalGroups().load(); + ArrayList alreadyDone = new ArrayList(); for (WorldDataHolder w : worldsData.values()) { if (alreadyDone.contains(w)) { continue; } - w.reload(); + if (!mirrorsGroup.containsKey(w.getName().toLowerCase())) + w.reloadGroups(); + if (!mirrorsUser.containsKey(w.getName().toLowerCase())) + w.reloadUsers(); + alreadyDone.add(w); } - // Load global groups - GroupManager.getGlobalGroups().load(); + } /** @@ -158,7 +205,10 @@ public class WorldsHolder { * @param worldName */ public void reloadWorld(String worldName) { - getWorldData(worldName).reload(); + if (!mirrorsGroup.containsKey(worldName.toLowerCase())) + getWorldData(worldName).reloadGroups(); + if (!mirrorsUser.containsKey(worldName.toLowerCase())) + getWorldData(worldName).reloadUsers(); } /** @@ -194,48 +244,50 @@ public class WorldsHolder { GroupManager.logger.severe("WHAT HAPPENED?"); continue; } - if (w.haveGroupsChanged()) { - if (overwrite || (!overwrite && (w.getTimeStampGroups() >= w.getGroupsFile().lastModified()))) { - // Backup Groups file - backupFile(w,true); - - WorldDataHolder.writeGroups(w, w.getGroupsFile()); - //w.removeGroupsChangedFlag(); - } else { - // Newer file found. - GroupManager.logger.log(Level.WARNING, "Newer Groups file found for " + w.getName() + ", but we have local changes!"); - throw new IllegalStateException("Unable to save unless you issue a '/mansave force'"); - } - } else { - //Check for newer file as no local changes. - if (w.getTimeStampGroups() < w.getGroupsFile().lastModified()) { - System.out.print("Newer Groups file found (Loading changes)!"); - // Backup Groups file - backupFile(w,true); - w.reloadGroups(); - } - } - if (w.haveUsersChanged()) { - if (overwrite || (!overwrite && (w.getTimeStampUsers() >= w.getUsersFile().lastModified()))) { - // Backup Users file - backupFile(w,false); - - WorldDataHolder.writeUsers(w, w.getUsersFile()); - //w.removeUsersChangedFlag(); - } else { - // Newer file found. - GroupManager.logger.log(Level.WARNING, "Newer Users file found for " + w.getName() + ", but we have local changes!"); - throw new IllegalStateException("Unable to save unless you issue a '/mansave force'"); - } - } else { - //Check for newer file as no local changes. - if (w.getTimeStampUsers() < w.getUsersFile().lastModified()) { - System.out.print("Newer Users file found (Loading changes)!"); - // Backup Users file - backupFile(w,false); - w.reloadUsers(); - } - } + if (!mirrorsGroup.containsKey(w.getName().toLowerCase())) + if (w.haveGroupsChanged()) { + if (overwrite || (!overwrite && (w.getTimeStampGroups() >= w.getGroupsFile().lastModified()))) { + // Backup Groups file + backupFile(w,true); + + WorldDataHolder.writeGroups(w, w.getGroupsFile()); + //w.removeGroupsChangedFlag(); + } else { + // Newer file found. + GroupManager.logger.log(Level.WARNING, "Newer Groups file found for " + w.getName() + ", but we have local changes!"); + throw new IllegalStateException("Unable to save unless you issue a '/mansave force'"); + } + } else { + //Check for newer file as no local changes. + if (w.getTimeStampGroups() < w.getGroupsFile().lastModified()) { + System.out.print("Newer Groups file found (Loading changes)!"); + // Backup Groups file + backupFile(w,true); + w.reloadGroups(); + } + } + if (!mirrorsUser.containsKey(w.getName().toLowerCase())) + if (w.haveUsersChanged()) { + if (overwrite || (!overwrite && (w.getTimeStampUsers() >= w.getUsersFile().lastModified()))) { + // Backup Users file + backupFile(w,false); + + WorldDataHolder.writeUsers(w, w.getUsersFile()); + //w.removeUsersChangedFlag(); + } else { + // Newer file found. + GroupManager.logger.log(Level.WARNING, "Newer Users file found for " + w.getName() + ", but we have local changes!"); + throw new IllegalStateException("Unable to save unless you issue a '/mansave force'"); + } + } else { + //Check for newer file as no local changes. + if (w.getTimeStampUsers() < w.getUsersFile().lastModified()) { + System.out.print("Newer Users file found (Loading changes)!"); + // Backup Users file + backupFile(w,false); + w.reloadUsers(); + } + } alreadyDone.add(w); } } @@ -271,8 +323,8 @@ public class WorldsHolder { public OverloadedWorldHolder getWorldData(String worldName) { String worldNameLowered = worldName.toLowerCase(); // If a mirror change to the real world to load. - if (mirrors.containsKey(worldNameLowered)) { - worldNameLowered = mirrors.get(worldNameLowered); + if (mirrorsGroup.containsKey(worldNameLowered)) { + worldNameLowered = mirrorsGroup.get(worldNameLowered); } OverloadedWorldHolder data = worldsData.get(worldNameLowered); @@ -353,60 +405,45 @@ public class WorldsHolder { } - public void setupWorldFolder(String worldName) { - worldsFolder = new File(plugin.getDataFolder(), "worlds"); - if (!worldsFolder.exists()) { - worldsFolder.mkdirs(); - } - - File defaultWorldFolder = new File(worldsFolder, worldName); - if (!defaultWorldFolder.exists()) { - defaultWorldFolder.mkdirs(); - } - if (defaultWorldFolder.exists()) { - File groupsFile = new File(defaultWorldFolder, "groups.yml"); - File usersFile = new File(defaultWorldFolder, "users.yml"); - File oldDataFile = new File(plugin.getDataFolder(), "data.yml"); - if (!groupsFile.exists() || groupsFile.length() == 0) { - if (oldDataFile.exists()) { - try { - Tasks.copy(oldDataFile, groupsFile); - } catch (IOException ex) { - GroupManager.logger.log(Level.SEVERE, null, ex); - } - } else { - InputStream template = plugin.getResourceAsStream("groups.yml"); - try { - Tasks.copy(template, groupsFile); - } catch (IOException ex) { - GroupManager.logger.log(Level.SEVERE, null, ex); - } - } - } - if (!usersFile.exists() || usersFile.length() == 0) { - if (oldDataFile.exists()) { - try { - Tasks.copy(oldDataFile, usersFile); - } catch (IOException ex) { - GroupManager.logger.log(Level.SEVERE, null, ex); - } - } else { - InputStream template = plugin.getResourceAsStream("users.yml"); - try { - Tasks.copy(template, usersFile); - } catch (IOException ex) { - GroupManager.logger.log(Level.SEVERE, null, ex); - } - } - } - try { - if (oldDataFile.exists()) { - oldDataFile.renameTo(new File(plugin.getDataFolder(), "NOT_USED_ANYMORE_data.yml")); - } - } catch (Exception ex) { - } - } - } + public void setupWorldFolder(String worldName) { + worldsFolder = new File(plugin.getDataFolder(), "worlds"); + if (!worldsFolder.exists()) { + worldsFolder.mkdirs(); + } + + File defaultWorldFolder = new File(worldsFolder, worldName); + if ((!defaultWorldFolder.exists()) && ((!mirrorsGroup.containsKey(worldName.toLowerCase()))) || (!mirrorsUser.containsKey(worldName.toLowerCase()))) { + defaultWorldFolder.mkdirs(); + } + if (defaultWorldFolder.exists()) { + if (!mirrorsGroup.containsKey(worldName.toLowerCase())) { + File groupsFile = new File(defaultWorldFolder, "groups.yml"); + if (!groupsFile.exists() || groupsFile.length() == 0) { + + InputStream template = plugin.getResourceAsStream("groups.yml"); + try { + Tasks.copy(template, groupsFile); + } catch (IOException ex) { + GroupManager.logger.log(Level.SEVERE, null, ex); + } + } + } + + if (!mirrorsUser.containsKey(worldName.toLowerCase())) { + File usersFile = new File(defaultWorldFolder, "users.yml"); + if (!usersFile.exists() || usersFile.length() == 0) { + + InputStream template = plugin.getResourceAsStream("users.yml"); + try { + Tasks.copy(template, usersFile); + } catch (IOException ex) { + GroupManager.logger.log(Level.SEVERE, null, ex); + } + + } + } + } + } /** * Copies the specified world data to another world @@ -451,16 +488,36 @@ public class WorldsHolder { GroupManager.logger.finest("Trying to load world " + worldName + "..."); File thisWorldFolder = new File(worldsFolder, worldName); if (thisWorldFolder.exists() && thisWorldFolder.isDirectory()) { - File groupsFile = new File(thisWorldFolder, "groups.yml"); - File usersFile = new File(thisWorldFolder, "users.yml"); - if (!groupsFile.exists()) { + + // Setup file handles, if not mirrored + File groupsFile = (mirrorsGroup.containsKey(worldName.toLowerCase()))? null : new File(thisWorldFolder, "groups.yml"); + File usersFile = (mirrorsUser.containsKey(worldName.toLowerCase()))? null : new File(thisWorldFolder, "users.yml"); + + if ((groupsFile != null) && (!groupsFile.exists())) { throw new IllegalArgumentException("Groups file for world '" + worldName + "' doesnt exist: " + groupsFile.getPath()); } - if (!usersFile.exists()) { + if ((usersFile != null) && (!usersFile.exists())) { throw new IllegalArgumentException("Users file for world '" + worldName + "' doesnt exist: " + usersFile.getPath()); } - try { - OverloadedWorldHolder thisWorldData = new OverloadedWorldHolder(WorldDataHolder.load(worldName, groupsFile, usersFile)); + + WorldDataHolder tempHolder = new WorldDataHolder(worldName); + + // Map the group object for any mirror + if (mirrorsGroup.containsKey(worldName.toLowerCase())) + tempHolder.setGroupsObject(this.getWorldData(mirrorsGroup.get(worldName.toLowerCase())).getGroupsObject()); + else + tempHolder.loadGroups(groupsFile); + + // Map the user object for any mirror + if (mirrorsUser.containsKey(worldName.toLowerCase())) + tempHolder.setUsersObject(this.getWorldData(mirrorsUser.get(worldName.toLowerCase())).getUsersObject()); + else + tempHolder.loadUsers(usersFile); + + OverloadedWorldHolder thisWorldData = new OverloadedWorldHolder(tempHolder); + + // null the object so we don't keep file handles open where we shouldn't + tempHolder = null; // Set the file TimeStamps as it will be default from the initial load. thisWorldData.setTimeStamps(); @@ -470,13 +527,7 @@ public class WorldsHolder { worldsData.put(worldName.toLowerCase(), thisWorldData); return; } - } catch (FileNotFoundException ex) { - GroupManager.logger.log(Level.SEVERE, null, ex); - return; - } catch (IOException ex) { - GroupManager.logger.log(Level.SEVERE, null, ex); - return; - } + //GroupManager.logger.severe("Failed to load world " + worldName + "..."); } } @@ -490,7 +541,7 @@ public class WorldsHolder { * @return true if world is loaded or mirrored. false if not listed */ public boolean isInList(String worldName) { - if (worldsData.containsKey(worldName.toLowerCase()) || mirrors.containsKey(worldName.toLowerCase())) { + if (worldsData.containsKey(worldName.toLowerCase()) || mirrorsGroup.containsKey(worldName.toLowerCase())) { return true; } return false; diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/BukkitPermissions.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/BukkitPermissions.java index 7c157a2f7..ebaadf8bd 100644 --- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/BukkitPermissions.java +++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/BukkitPermissions.java @@ -287,7 +287,7 @@ public class BukkitPermissions { * List all effective permissions for this player. * * @param player - * @return + * @return List of permissions */ public List listPerms(Player player) { List perms = new ArrayList(); -- cgit v1.2.3 From 256d202d50db621eb9b89fc29291fe9d111072c6 Mon Sep 17 00:00:00 2001 From: KHobbits Date: Fri, 13 Jan 2012 22:41:47 +0000 Subject: Adjusting default spawn behavior. Moving option in config file. --- Essentials/src/com/earth2me/essentials/UserData.java | 17 ----------------- Essentials/src/config.yml | 12 ++++++------ .../com/earth2me/essentials/spawn/EssentialsSpawn.java | 2 +- .../spawn/EssentialsSpawnPlayerListener.java | 18 +++++++++++++----- 4 files changed, 20 insertions(+), 29 deletions(-) diff --git a/Essentials/src/com/earth2me/essentials/UserData.java b/Essentials/src/com/earth2me/essentials/UserData.java index 9df1b0342..d08704484 100644 --- a/Essentials/src/com/earth2me/essentials/UserData.java +++ b/Essentials/src/com/earth2me/essentials/UserData.java @@ -53,7 +53,6 @@ public abstract class UserData extends PlayerExtension implements IConf lastLogout = _getLastLogout(); lastLoginAddress = _getLastLoginAddress(); afk = getAfk(); - newplayer = getNew(); geolocation = _getGeoLocation(); isSocialSpyEnabled = _isSocialSpyEnabled(); isNPC = _isNPC(); @@ -736,22 +735,6 @@ public abstract class UserData extends PlayerExtension implements IConf } private boolean newplayer; - private boolean getNew() - { - return config.getBoolean("newplayer", true); - } - - public boolean isNew() - { - return newplayer; - } - - public void setNew(boolean set) - { - newplayer = set; - config.setProperty("newplayer", set); - config.save(); - } private String geolocation; private String _getGeoLocation() diff --git a/Essentials/src/config.yml b/Essentials/src/config.yml index 2254bdbab..877ff0c42 100644 --- a/Essentials/src/config.yml +++ b/Essentials/src/config.yml @@ -253,10 +253,7 @@ register-back-in-listener: false # +------------------------------------------------------+ # ############################################################ -# When users die, should they respawn at their first home, instead of the spawnpoint or bed? -respawn-at-home: false - -# If no home is set send you to bed or spawn when /home is used +# If no home is set, send players to spawn when /home is used spawn-if-no-home: true # Allows people to set their bed at daytime @@ -532,8 +529,11 @@ newbies: spawnpoint: newbies # Set this to lowest, if you want Multiverse to handle the respawning -# Set this to normal, if you want EssentialsSpawn to handle the respawning +# Set this to high, if you want EssentialsSpawn to handle the respawning # Set this to highest, if you want to force EssentialsSpawn to handle the respawning -respawn-listener-priority: normal +respawn-listener-priority: high + +# When users die, should they respawn at their first home or bed, instead of the spawnpoint? +respawn-at-home: false # End of File <-- No seriously, you're done with configuration. diff --git a/EssentialsSpawn/src/com/earth2me/essentials/spawn/EssentialsSpawn.java b/EssentialsSpawn/src/com/earth2me/essentials/spawn/EssentialsSpawn.java index c4cd7c727..813220a16 100644 --- a/EssentialsSpawn/src/com/earth2me/essentials/spawn/EssentialsSpawn.java +++ b/EssentialsSpawn/src/com/earth2me/essentials/spawn/EssentialsSpawn.java @@ -39,7 +39,7 @@ public class EssentialsSpawn extends JavaPlugin final EssentialsSpawnPlayerListener playerListener = new EssentialsSpawnPlayerListener(ess, spawns); pluginManager.registerEvent(Type.PLAYER_RESPAWN, playerListener, ess.getSettings().getRespawnPriority(), this); - pluginManager.registerEvent(Type.PLAYER_JOIN, playerListener, Priority.Low, this); + pluginManager.registerEvent(Type.PLAYER_JOIN, playerListener, ess.getSettings().getRespawnPriority(), this); LOGGER.info(_("loadinfo", this.getDescription().getName(), this.getDescription().getVersion(), "essentials team")); } diff --git a/EssentialsSpawn/src/com/earth2me/essentials/spawn/EssentialsSpawnPlayerListener.java b/EssentialsSpawn/src/com/earth2me/essentials/spawn/EssentialsSpawnPlayerListener.java index 530a00faa..2a9efe4b1 100644 --- a/EssentialsSpawn/src/com/earth2me/essentials/spawn/EssentialsSpawnPlayerListener.java +++ b/EssentialsSpawn/src/com/earth2me/essentials/spawn/EssentialsSpawnPlayerListener.java @@ -4,6 +4,7 @@ import static com.earth2me.essentials.I18n._; import com.earth2me.essentials.IEssentials; import com.earth2me.essentials.User; import java.util.logging.Level; +import java.util.logging.Logger; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.event.player.PlayerJoinEvent; @@ -16,6 +17,7 @@ public class EssentialsSpawnPlayerListener extends PlayerListener { private final transient IEssentials ess; private final transient SpawnStorage spawns; + private static final Logger LOGGER = Bukkit.getLogger(); public EssentialsSpawnPlayerListener(final IEssentials ess, final SpawnStorage spawns) { @@ -26,7 +28,7 @@ public class EssentialsSpawnPlayerListener extends PlayerListener @Override public void onPlayerRespawn(final PlayerRespawnEvent event) - { + { final User user = ess.getUser(event.getPlayer()); if (ess.getSettings().getRespawnAtHome()) @@ -45,8 +47,12 @@ public class EssentialsSpawnPlayerListener extends PlayerListener final Location spawn = spawns.getSpawn(user.getGroup()); if (spawn != null) { + LOGGER.log(Level.INFO, "setting respawn location"); event.setRespawnLocation(spawn); } + else { + LOGGER.log(Level.INFO, "spawn was null"); + } } @Override @@ -54,20 +60,22 @@ public class EssentialsSpawnPlayerListener extends PlayerListener { final User user = ess.getUser(event.getPlayer()); - if (!user.isNew() || user.getBedSpawnLocation() != null) + if (user.hasPlayedBefore()) { + LOGGER.log(Level.FINE, "Old player join"); return; - } - user.setNew(false); + } if (!"none".equalsIgnoreCase(ess.getSettings().getNewbieSpawn())) { - ess.scheduleSyncDelayedTask(new NewPlayerTeleport(user)); + ess.scheduleSyncDelayedTask(new NewPlayerTeleport(user), 1L); } if (ess.getSettings().getAnnounceNewPlayers()) { ess.broadcastMessage(user, ess.getSettings().getAnnounceNewPlayerFormat(user)); } + + LOGGER.log(Level.FINE, "New player join"); } -- cgit v1.2.3 From 43f1c0f89d62cf3b273045d2d3b42b53a950bc56 Mon Sep 17 00:00:00 2001 From: KHobbits Date: Fri, 13 Jan 2012 22:50:48 +0000 Subject: Removing debugging messages. --- .../com/earth2me/essentials/spawn/EssentialsSpawnPlayerListener.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/EssentialsSpawn/src/com/earth2me/essentials/spawn/EssentialsSpawnPlayerListener.java b/EssentialsSpawn/src/com/earth2me/essentials/spawn/EssentialsSpawnPlayerListener.java index 2a9efe4b1..81e8f6e9e 100644 --- a/EssentialsSpawn/src/com/earth2me/essentials/spawn/EssentialsSpawnPlayerListener.java +++ b/EssentialsSpawn/src/com/earth2me/essentials/spawn/EssentialsSpawnPlayerListener.java @@ -47,12 +47,8 @@ public class EssentialsSpawnPlayerListener extends PlayerListener final Location spawn = spawns.getSpawn(user.getGroup()); if (spawn != null) { - LOGGER.log(Level.INFO, "setting respawn location"); event.setRespawnLocation(spawn); } - else { - LOGGER.log(Level.INFO, "spawn was null"); - } } @Override -- cgit v1.2.3 From 856cef32862ba9c15d45b85e00c69fba624c9aa5 Mon Sep 17 00:00:00 2001 From: KHobbits Date: Sat, 14 Jan 2012 15:04:16 +0000 Subject: Update Essentials/src/com/earth2me/essentials/commands/Commanditemdb.java --- Essentials/src/com/earth2me/essentials/commands/Commanditemdb.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Essentials/src/com/earth2me/essentials/commands/Commanditemdb.java b/Essentials/src/com/earth2me/essentials/commands/Commanditemdb.java index 2fff20e8c..c35656c72 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commanditemdb.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commanditemdb.java @@ -10,7 +10,7 @@ public class Commanditemdb extends EssentialsCommand { public Commanditemdb() { - super("find"); + super("itemdb"); } @Override -- cgit v1.2.3 From d0e5685ac0afb7bb69df9a17aafe0f78f5fc5aef Mon Sep 17 00:00:00 2001 From: ElgarL Date: Sat, 14 Jan 2012 15:48:55 +0000 Subject: Catch NullPointerErrors generated by blank permission nodes. --- EssentialsGroupManager/src/Changelog.txt | 3 ++- .../anjocaido/groupmanager/dataholder/WorldDataHolder.java | 14 ++++++++++++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/EssentialsGroupManager/src/Changelog.txt b/EssentialsGroupManager/src/Changelog.txt index 364ae5952..2ed032267 100644 --- a/EssentialsGroupManager/src/Changelog.txt +++ b/EssentialsGroupManager/src/Changelog.txt @@ -99,4 +99,5 @@ v 1.8: - Fix 'manucheckp' to correctly report if a permission is available from GroupManager or Bukkit. - Changed over to a reflection method for populating superperms as Bukkit lags when you handle permissions one at a time. - Major, MAJOR changes to support partial/full world mirroring. - You can now mirror groups.yml, users.yml or both files between different worlds. \ No newline at end of file + You can now mirror groups.yml, users.yml or both files between different worlds. + - Catch NullPointerErrors generated by blank permission nodes. \ No newline at end of file diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/WorldDataHolder.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/WorldDataHolder.java index 73c4dca0f..c9c1d2b64 100644 --- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/WorldDataHolder.java +++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/WorldDataHolder.java @@ -470,7 +470,12 @@ public class WorldDataHolder { } if (thisGroupNode.get("permissions") instanceof List) { for (Object o : ((List) thisGroupNode.get("permissions"))) { - thisGrp.addPermission(o.toString()); + try { + thisGrp.addPermission(o.toString()); + } catch (NullPointerException e) { + // Ignore this entry as it's null. + //throw new IllegalArgumentException("Invalid permission node in group: " + thisGrp.getName() + " in file: " + groupsFile.getPath()); + } } } else if (thisGroupNode.get("permissions") instanceof String) { thisGrp.addPermission((String) thisGroupNode.get("permissions")); @@ -582,7 +587,12 @@ public class WorldDataHolder { thisUser.addPermission(o.toString()); } } else if (thisUserNode.get("permissions") instanceof String) { - thisUser.addPermission(thisUserNode.get("permissions").toString()); + try { + thisUser.addPermission(thisUserNode.get("permissions").toString()); + } catch (NullPointerException e) { + // Ignore this entry as it's null. + //throw new IllegalArgumentException("Invalid permission node for user: " + thisUser.getName() + " in file: " + UserFile.getPath()); + } } //SUBGROUPS LOADING -- cgit v1.2.3 From 29d4e09983a6c4602e0a8d5fbf6bf716da9ae0db Mon Sep 17 00:00:00 2001 From: KHobbits Date: Sat, 14 Jan 2012 16:36:19 +0000 Subject: Fixing {WorldDate} Test #1353 --- Essentials/src/com/earth2me/essentials/textreader/KeywordReplacer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Essentials/src/com/earth2me/essentials/textreader/KeywordReplacer.java b/Essentials/src/com/earth2me/essentials/textreader/KeywordReplacer.java index 182dba9d3..782798bff 100644 --- a/Essentials/src/com/earth2me/essentials/textreader/KeywordReplacer.java +++ b/Essentials/src/com/earth2me/essentials/textreader/KeywordReplacer.java @@ -41,7 +41,7 @@ public class KeywordReplacer implements IText world = user.getLocation().getWorld().getName(); worldTime12 = DescParseTickFormat.format12(user.getWorld().getTime()); worldTime24 = DescParseTickFormat.format24(user.getWorld().getTime()); - worldDate = DateFormat.getDateInstance(DateFormat.MEDIUM, ess.getI18n().getCurrentLocale()).format(DescParseTickFormat.ticksToDate(user.getWorld().getTime())); + worldDate = DateFormat.getDateInstance(DateFormat.MEDIUM, ess.getI18n().getCurrentLocale()).format(DescParseTickFormat.ticksToDate(user.getWorld().getFullTime())); } else { -- cgit v1.2.3 From 3f6b9586b4da7fc5d9f2ec0a9c2d76d28b1b5a7c Mon Sep 17 00:00:00 2001 From: KHobbits Date: Sat, 14 Jan 2012 16:42:53 +0000 Subject: Fixing double charges on /home Test #1426 --- Essentials/src/com/earth2me/essentials/commands/Commandhome.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandhome.java b/Essentials/src/com/earth2me/essentials/commands/Commandhome.java index d1db6c523..55bd75d0c 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandhome.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandhome.java @@ -50,7 +50,7 @@ public class Commandhome extends EssentialsCommand if (bed != null) { user.getTeleport().teleport(bed, charge, TeleportCause.COMMAND); - return; + throw new NoChargeException(); } } user.getTeleport().home(player, homeName.toLowerCase(Locale.ENGLISH), charge); @@ -64,10 +64,10 @@ public class Commandhome extends EssentialsCommand if (bed != null) { user.getTeleport().teleport(bed, charge, TeleportCause.COMMAND); - return; + throw new NoChargeException(); } user.getTeleport().respawn(charge, TeleportCause.COMMAND); - return; + } else if (homes.isEmpty()) { @@ -76,7 +76,6 @@ public class Commandhome extends EssentialsCommand else if (homes.size() == 1 && player.equals(user)) { user.getTeleport().home(player, homes.get(0), charge); - return; } else { -- cgit v1.2.3 From 6e82419c1573b7f8ee912862cedc65e83af2b93d Mon Sep 17 00:00:00 2001 From: KHobbits Date: Sat, 14 Jan 2012 16:53:18 +0000 Subject: Allowing use of aliases in help/info/motd, for command suggestions. Test #1441 --- Essentials/src/com/earth2me/essentials/commands/Commandhelp.java | 2 +- Essentials/src/com/earth2me/essentials/commands/Commandinfo.java | 2 +- Essentials/src/com/earth2me/essentials/commands/Commandmotd.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandhelp.java b/Essentials/src/com/earth2me/essentials/commands/Commandhelp.java index 328f692ea..769aac483 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandhelp.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandhelp.java @@ -41,7 +41,7 @@ public class Commandhelp extends EssentialsCommand output = new KeywordReplacer(input, user, ess); } final TextPager pager = new TextPager(output); - pager.showPage(pageStr, chapterPageStr, "help", user); + pager.showPage(pageStr, chapterPageStr, commandLabel, user); } @Override diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandinfo.java b/Essentials/src/com/earth2me/essentials/commands/Commandinfo.java index e75eeed9a..afe1add72 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandinfo.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandinfo.java @@ -21,6 +21,6 @@ public class Commandinfo extends EssentialsCommand final IText input = new TextInput(sender, "info", true, ess); final IText output = new KeywordReplacer(input, sender, ess); final TextPager pager = new TextPager(output); - pager.showPage(args.length > 0 ? args[0] : null, args.length > 1 ? args[1] : null, "info", sender); + pager.showPage(args.length > 0 ? args[0] : null, args.length > 1 ? args[1] : null, commandLabel, sender); } } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandmotd.java b/Essentials/src/com/earth2me/essentials/commands/Commandmotd.java index 78ca5c306..0031504e8 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandmotd.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandmotd.java @@ -21,6 +21,6 @@ public class Commandmotd extends EssentialsCommand final IText input = new TextInput(sender, "motd", true, ess); final IText output = new KeywordReplacer(input, sender, ess); final TextPager pager = new TextPager(output); - pager.showPage(args.length > 0 ? args[0] : null, args.length > 1 ? args[1] : null, "motd", sender); + pager.showPage(args.length > 0 ? args[0] : null, args.length > 1 ? args[1] : null, commandLabel, sender); } } -- cgit v1.2.3 From c584d74852b219b8f217a909aa124e3a0c63c30a Mon Sep 17 00:00:00 2001 From: snowleo Date: Sat, 14 Jan 2012 23:13:58 +0100 Subject: Temporary fix for Spawns and Jails when Worlds are loaded after Essentials. This will be replaced by BetterLocation fix in 3.0 branch. --- .../src/com/earth2me/essentials/Essentials.java | 35 ++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/Essentials/src/com/earth2me/essentials/Essentials.java b/Essentials/src/com/earth2me/essentials/Essentials.java index fe550279e..223363c3a 100644 --- a/Essentials/src/com/earth2me/essentials/Essentials.java +++ b/Essentials/src/com/earth2me/essentials/Essentials.java @@ -49,6 +49,9 @@ import org.bukkit.event.Event.Priority; import org.bukkit.event.Event.Type; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerListener; +import org.bukkit.event.world.WorldListener; +import org.bukkit.event.world.WorldLoadEvent; +import org.bukkit.event.world.WorldUnloadEvent; import org.bukkit.plugin.InvalidDescriptionException; import org.bukkit.plugin.Plugin; import org.bukkit.plugin.PluginDescriptionFile; @@ -242,6 +245,10 @@ public class Essentials extends JavaPlugin implements IEssentials pm.registerEvent(Type.ENTITY_DEATH, entityListener, Priority.Lowest, this); pm.registerEvent(Type.ENTITY_REGAIN_HEALTH, entityListener, Priority.Lowest, this); pm.registerEvent(Type.FOOD_LEVEL_CHANGE, entityListener, Priority.Lowest, this); + + final EssentialsWorldListener worldListener = new EssentialsWorldListener(this); + pm.registerEvent(Type.WORLD_LOAD, worldListener, Priority.Monitor, this); + pm.registerEvent(Type.WORLD_UNLOAD, worldListener, Priority.Monitor, this); //TODO: Check if this should be here, and not above before reload() jails = new Jails(this); @@ -594,4 +601,32 @@ public class Essentials extends JavaPlugin implements IEssentials { return i18n; } + + private static class EssentialsWorldListener extends WorldListener implements Runnable { + private transient final IEssentials ess; + + public EssentialsWorldListener(IEssentials ess) + { + this.ess = ess; + } + + + @Override + public void onWorldLoad(WorldLoadEvent event) + { + ess.scheduleSyncDelayedTask(this); + } + + @Override + public void onWorldUnload(WorldUnloadEvent event) + { + ess.scheduleSyncDelayedTask(this); + } + + @Override + public void run() + { + ess.reload(); + } + } } -- cgit v1.2.3 From c860b1c6685240222ad10c94ca8f873a21148ac9 Mon Sep 17 00:00:00 2001 From: snowleo Date: Sat, 14 Jan 2012 23:25:52 +0100 Subject: Reload less --- Essentials/src/com/earth2me/essentials/Essentials.java | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/Essentials/src/com/earth2me/essentials/Essentials.java b/Essentials/src/com/earth2me/essentials/Essentials.java index 223363c3a..5287e299b 100644 --- a/Essentials/src/com/earth2me/essentials/Essentials.java +++ b/Essentials/src/com/earth2me/essentials/Essentials.java @@ -614,13 +614,27 @@ public class Essentials extends JavaPlugin implements IEssentials @Override public void onWorldLoad(WorldLoadEvent event) { - ess.scheduleSyncDelayedTask(this); + ess.getJails().onReload(); + ess.getWarps().reloadConfig(); + for (IConf iConf : ((Essentials)ess).confList) + { + if (iConf instanceof IEssentialsModule) { + iConf.reloadConfig(); + } + } } @Override public void onWorldUnload(WorldUnloadEvent event) { - ess.scheduleSyncDelayedTask(this); + ess.getJails().onReload(); + ess.getWarps().reloadConfig(); + for (IConf iConf : ((Essentials)ess).confList) + { + if (iConf instanceof IEssentialsModule) { + iConf.reloadConfig(); + } + } } @Override -- cgit v1.2.3 From 1a0b03db4dfb814258b3ce4b45c52e8c090773c7 Mon Sep 17 00:00:00 2001 From: ElgarL Date: Sun, 15 Jan 2012 01:43:42 +0000 Subject: Removed '- bukkit.command' form the globalgroups permission nodes. --- EssentialsGroupManager/src/Changelog.txt | 3 ++- EssentialsGroupManager/src/globalgroups.yml | 1 - 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/EssentialsGroupManager/src/Changelog.txt b/EssentialsGroupManager/src/Changelog.txt index 2ed032267..71a4c3482 100644 --- a/EssentialsGroupManager/src/Changelog.txt +++ b/EssentialsGroupManager/src/Changelog.txt @@ -100,4 +100,5 @@ v 1.8: - Changed over to a reflection method for populating superperms as Bukkit lags when you handle permissions one at a time. - Major, MAJOR changes to support partial/full world mirroring. You can now mirror groups.yml, users.yml or both files between different worlds. - - Catch NullPointerErrors generated by blank permission nodes. \ No newline at end of file + - Catch NullPointerErrors generated by blank permission nodes. + - Removed '- bukkit.command' form the globalgroups permission nodes. \ No newline at end of file diff --git a/EssentialsGroupManager/src/globalgroups.yml b/EssentialsGroupManager/src/globalgroups.yml index c9ecc2673..f21034237 100644 --- a/EssentialsGroupManager/src/globalgroups.yml +++ b/EssentialsGroupManager/src/globalgroups.yml @@ -145,7 +145,6 @@ groups: permissions: - bukkit.broadcast - bukkit.broadcast.admin - - bukkit.command - bukkit.command.give - bukkit.command.help - bukkit.command.kill -- cgit v1.2.3 From 359ea194b8d5348b5d2f0b3c67f83ee7a6539513 Mon Sep 17 00:00:00 2001 From: snowleo Date: Mon, 16 Jan 2012 00:50:52 +0100 Subject: Speed improvements for Move and Interact Event. --- .../essentials/EssentialsPlayerListener.java | 20 ++-- Essentials/src/com/earth2me/essentials/User.java | 125 +++++++++++---------- .../src/com/earth2me/essentials/UserData.java | 5 + .../src/com/earth2me/essentials/UserMap.java | 77 +++++++------ Essentials/src/com/earth2me/essentials/Util.java | 5 +- 5 files changed, 128 insertions(+), 104 deletions(-) diff --git a/Essentials/src/com/earth2me/essentials/EssentialsPlayerListener.java b/Essentials/src/com/earth2me/essentials/EssentialsPlayerListener.java index bb6741d30..9edc80364 100644 --- a/Essentials/src/com/earth2me/essentials/EssentialsPlayerListener.java +++ b/Essentials/src/com/earth2me/essentials/EssentialsPlayerListener.java @@ -282,22 +282,22 @@ public class EssentialsPlayerListener extends PlayerListener { final User user = ess.getUser(event.getPlayer()); user.updateActivity(true); - usePowertools(event); + if (event.getAnimationType() == PlayerAnimationType.ARM_SWING + && user.hasPowerTools() && user.arePowerToolsEnabled()) + { + usePowertools(user); + } } - private void usePowertools(final PlayerAnimationEvent event) + private void usePowertools(final User user) { - if (event.getAnimationType() != PlayerAnimationType.ARM_SWING) - { - return; - } - final User user = ess.getUser(event.getPlayer()); final ItemStack is = user.getItemInHand(); - if (is == null || is.getType() == Material.AIR || !user.arePowerToolsEnabled()) + int id; + if (is == null || (id = is.getTypeId()) == 0) { return; } - final List commandList = user.getPowertool(is); + final List commandList = user.getPowertool(id); if (commandList == null || commandList.isEmpty()) { return; @@ -317,7 +317,7 @@ public class EssentialsPlayerListener extends PlayerListener } else { - user.getServer().dispatchCommand(event.getPlayer(), command); + user.getServer().dispatchCommand(user.getBase(), command); } } } diff --git a/Essentials/src/com/earth2me/essentials/User.java b/Essentials/src/com/earth2me/essentials/User.java index daf756e5b..e23fe1de0 100644 --- a/Essentials/src/com/earth2me/essentials/User.java +++ b/Essentials/src/com/earth2me/essentials/User.java @@ -23,34 +23,37 @@ public class User extends UserData implements Comparable, IReplyTo, IUser private transient long lastOnlineActivity; private transient long lastActivity = System.currentTimeMillis(); private boolean hidden = false; - private transient Location afkPosition; + private transient Location afkPosition = null; private static final Logger logger = Logger.getLogger("Minecraft"); - + User(final Player base, final IEssentials ess) { super(base, ess); teleport = new Teleport(this, ess); - afkPosition = getLocation(); + if (isAfk()) + { + afkPosition = getLocation(); + } } - + User update(final Player base) { setBase(base); return this; } - + @Override public boolean isAuthorized(final IEssentialsCommand cmd) { return isAuthorized(cmd, "essentials."); } - + @Override public boolean isAuthorized(final IEssentialsCommand cmd, final String permissionPrefix) { return isAuthorized(permissionPrefix + (cmd.getName().equals("r") ? "msg" : cmd.getName())); } - + @Override public boolean isAuthorized(final String node) { @@ -58,20 +61,20 @@ public class User extends UserData implements Comparable, IReplyTo, IUser { return false; } - + if (isOp()) { return true; } - + if (isJailed()) { return false; } - + return ess.getPermissionsHandler().hasPermission(base, node); } - + public void healCooldown() throws Exception { final Calendar now = new GregorianCalendar(); @@ -89,13 +92,13 @@ public class User extends UserData implements Comparable, IReplyTo, IUser } setLastHealTimestamp(now.getTimeInMillis()); } - + @Override public void giveMoney(final double value) { giveMoney(value, null); } - + public void giveMoney(final double value, final CommandSender initiator) { if (value == 0) @@ -109,7 +112,7 @@ public class User extends UserData implements Comparable, IReplyTo, IUser initiator.sendMessage(_("addedToOthersAccount", Util.formatCurrency(value, ess), this.getDisplayName())); } } - + public void payUser(final User reciever, final double value) throws Exception { if (value == 0) @@ -128,13 +131,13 @@ public class User extends UserData implements Comparable, IReplyTo, IUser throw new Exception(_("notEnoughMoney")); } } - + @Override public void takeMoney(final double value) { takeMoney(value, null); } - + public void takeMoney(final double value, final CommandSender initiator) { if (value == 0) @@ -148,36 +151,36 @@ public class User extends UserData implements Comparable, IReplyTo, IUser initiator.sendMessage(_("takenFromOthersAccount", Util.formatCurrency(value, ess), this.getDisplayName())); } } - + public boolean canAfford(final double cost) { final double mon = getMoney(); return mon >= cost || isAuthorized("essentials.eco.loan"); } - + public void dispose() { this.base = new OfflinePlayer(getName(), ess); } - + @Override public void setReplyTo(final CommandSender user) { replyTo = user; } - + @Override public CommandSender getReplyTo() { return replyTo; } - + @Override public int compareTo(final User other) { return Util.stripColor(this.getDisplayName()).compareToIgnoreCase(Util.stripColor(other.getDisplayName())); } - + @Override public boolean equals(final Object object) { @@ -186,58 +189,58 @@ public class User extends UserData implements Comparable, IReplyTo, IUser return false; } return this.getName().equalsIgnoreCase(((User)object).getName()); - + } - + @Override public int hashCode() { return this.getName().hashCode(); } - + public Boolean canSpawnItem(final int itemId) { return !ess.getSettings().itemSpawnBlacklist().contains(itemId); } - + public Location getHome() throws Exception { return getHome(getHomes().get(0)); } - + public void setHome() { setHome("home", getLocation()); } - + public void setHome(final String name) { setHome(name, getLocation()); } - + @Override public void setLastLocation() { setLastLocation(getLocation()); } - + public void requestTeleport(final User player, final boolean here) { teleportRequestTime = System.currentTimeMillis(); teleportRequester = player; teleportRequestHere = here; } - + public User getTeleportRequest() { return teleportRequester; } - + public boolean isTeleportRequestHere() { return teleportRequestHere; } - + public String getNick(boolean addprefixsuffix) { final StringBuilder nickname = new StringBuilder(); @@ -261,7 +264,7 @@ public class User extends UserData implements Comparable, IReplyTo, IUser { } } - + if (addprefixsuffix && ess.getSettings().addPrefixSuffix()) { if (!ess.getSettings().disablePrefix()) @@ -283,10 +286,10 @@ public class User extends UserData implements Comparable, IReplyTo, IUser nickname.append("§f"); } } - + return nickname.toString(); } - + public void setDisplayNick() { String name = getNick(true); @@ -308,7 +311,7 @@ public class User extends UserData implements Comparable, IReplyTo, IUser logger.log(Level.INFO, "Playerlist for " + name + " was not updated. Use a shorter displayname prefix."); } } - + @Override public String getDisplayName() { @@ -318,22 +321,22 @@ public class User extends UserData implements Comparable, IReplyTo, IUser } return super.getDisplayName() == null ? super.getName() : super.getDisplayName(); } - + public Teleport getTeleport() { return teleport; } - + public long getLastOnlineActivity() { return lastOnlineActivity; } - + public void setLastOnlineActivity(final long timestamp) { lastOnlineActivity = timestamp; } - + @Override public double getMoney() { @@ -355,7 +358,7 @@ public class User extends UserData implements Comparable, IReplyTo, IUser } return super.getMoney(); } - + @Override public void setMoney(final double value) { @@ -377,7 +380,7 @@ public class User extends UserData implements Comparable, IReplyTo, IUser } super.setMoney(value); } - + @Override public void setAfk(final boolean set) { @@ -386,9 +389,13 @@ public class User extends UserData implements Comparable, IReplyTo, IUser { afkPosition = getLocation(); } + else if (!set && isAfk()) + { + afkPosition = null; + } super.setAfk(set); } - + @Override public boolean toggleAfk() { @@ -396,13 +403,13 @@ public class User extends UserData implements Comparable, IReplyTo, IUser this.setSleepingIgnored(this.isAuthorized("essentials.sleepingignored") ? true : now); return now; } - + @Override public boolean isHidden() { return hidden; } - + public void setHidden(final boolean hidden) { this.hidden = hidden; @@ -453,7 +460,7 @@ public class User extends UserData implements Comparable, IReplyTo, IUser } return false; } - + public void updateActivity(final boolean broadcast) { if (isAfk()) @@ -466,7 +473,7 @@ public class User extends UserData implements Comparable, IReplyTo, IUser } lastActivity = System.currentTimeMillis(); } - + public void checkActivity() { final long autoafkkick = ess.getSettings().getAutoAfkKick(); @@ -476,8 +483,8 @@ public class User extends UserData implements Comparable, IReplyTo, IUser final String kickReason = _("autoAfkKickReason", autoafkkick / 60.0); lastActivity = 0; kickPlayer(kickReason); - - + + for (Player player : ess.getServer().getOnlinePlayers()) { final User user = ess.getUser(player); @@ -497,12 +504,12 @@ public class User extends UserData implements Comparable, IReplyTo, IUser } } } - + public Location getAfkPosition() { return afkPosition; } - + @Override public boolean toggleGodModeEnabled() { @@ -512,36 +519,36 @@ public class User extends UserData implements Comparable, IReplyTo, IUser } return super.toggleGodModeEnabled(); } - + @Override public boolean isGodModeEnabled() { return (super.isGodModeEnabled() && !ess.getSettings().getNoGodWorlds().contains(getLocation().getWorld().getName())) || (isAfk() && ess.getSettings().getFreezeAfkPlayers()); } - + public boolean isGodModeEnabledRaw() { return super.isGodModeEnabled(); } - + public String getGroup() { return ess.getPermissionsHandler().getGroup(base); } - + public boolean inGroup(final String group) { return ess.getPermissionsHandler().inGroup(base, group); } - + public boolean canBuild() { return ess.getPermissionsHandler().canBuild(base, getGroup()); } - + public long getTeleportRequestTime() { return teleportRequestTime; - } + } } diff --git a/Essentials/src/com/earth2me/essentials/UserData.java b/Essentials/src/com/earth2me/essentials/UserData.java index d08704484..e2a365ad2 100644 --- a/Essentials/src/com/earth2me/essentials/UserData.java +++ b/Essentials/src/com/earth2me/essentials/UserData.java @@ -264,6 +264,11 @@ public abstract class UserData extends PlayerExtension implements IConf { return (List)powertools.get(stack.getTypeId()); } + + public List getPowertool(int id) + { + return (List)powertools.get(id); + } public void setPowertool(ItemStack stack, List commandList) { diff --git a/Essentials/src/com/earth2me/essentials/UserMap.java b/Essentials/src/com/earth2me/essentials/UserMap.java index f6b75c3a5..c979e5046 100644 --- a/Essentials/src/com/earth2me/essentials/UserMap.java +++ b/Essentials/src/com/earth2me/essentials/UserMap.java @@ -1,23 +1,20 @@ package com.earth2me.essentials; -import com.google.common.cache.Cache; -import com.google.common.cache.CacheBuilder; -import com.google.common.cache.CacheLoader; -import com.google.common.util.concurrent.UncheckedExecutionException; import java.io.File; -import java.util.Collections; -import java.util.Locale; +import java.lang.ref.SoftReference; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; import java.util.Set; -import java.util.concurrent.ConcurrentSkipListSet; -import java.util.concurrent.ExecutionException; import org.bukkit.entity.Player; -public class UserMap extends CacheLoader implements IConf +public class UserMap implements IConf { private final transient IEssentials ess; - private final transient Cache users = CacheBuilder.newBuilder().softValues().build(this); - private final transient ConcurrentSkipListSet keys = new ConcurrentSkipListSet(); + private final transient Map> users = new HashMap>(); + //CacheBuilder.newBuilder().softValues().build(this); + //private final transient ConcurrentSkipListSet keys = new ConcurrentSkipListSet(); public UserMap(final IEssentials ess) { @@ -38,16 +35,19 @@ public class UserMap extends CacheLoader implements IConf { return; } - keys.clear(); - users.invalidateAll(); - for (String string : userdir.list()) + synchronized (users) { - if (!string.endsWith(".yml")) + users.clear(); + + for (String string : userdir.list()) { - continue; + if (!string.endsWith(".yml")) + { + continue; + } + final String name = string.substring(0, string.length() - 4); + users.put(Util.sanitizeFileName(name), null); } - final String name = string.substring(0, string.length() - 4); - keys.add(Util.sanitizeFileName(name)); } } }); @@ -55,40 +55,43 @@ public class UserMap extends CacheLoader implements IConf public boolean userExists(final String name) { - return keys.contains(Util.sanitizeFileName(name)); + return users.containsKey(Util.sanitizeFileName(name)); } public User getUser(final String name) { try { - return users.get(Util.sanitizeFileName(name)); - } - catch (ExecutionException ex) - { - return null; + synchronized (users) + { + final SoftReference softRef = users.get(Util.sanitizeFileName(name)); + User user = softRef == null ? null : softRef.get(); + if (user == null) + { + user = load(name); + users.put(name, new SoftReference(user)); + } + return user; + } } - catch (UncheckedExecutionException ex) + catch (Exception ex) { return null; } } - @Override public User load(final String name) throws Exception { for (Player player : ess.getServer().getOnlinePlayers()) { if (player.getName().equalsIgnoreCase(name)) { - keys.add(Util.sanitizeFileName(name)); return new User(player, ess); } } final File userFile = getUserFile(name); if (userFile.exists()) { - keys.add(Util.sanitizeFileName(name)); return new User(new OfflinePlayer(name, ess), ess); } throw new Exception("User not found!"); @@ -102,20 +105,28 @@ public class UserMap extends CacheLoader implements IConf public void removeUser(final String name) { - keys.remove(Util.sanitizeFileName(name)); - users.invalidate(Util.sanitizeFileName(name)); + synchronized (users) + { + users.remove(Util.sanitizeFileName(name)); + } } public Set getAllUniqueUsers() { - return Collections.unmodifiableSet(keys); + synchronized (users) + { + return new HashSet(users.keySet()); + } } public int getUniqueUsers() { - return keys.size(); + synchronized (users) + { + return users.size(); + } } - + public File getUserFile(final String name) { final File userFolder = new File(ess.getDataFolder(), "userdata"); diff --git a/Essentials/src/com/earth2me/essentials/Util.java b/Essentials/src/com/earth2me/essentials/Util.java index 6a1df197f..a8a0cb1e4 100644 --- a/Essentials/src/com/earth2me/essentials/Util.java +++ b/Essentials/src/com/earth2me/essentials/Util.java @@ -21,10 +21,11 @@ public class Util { } private final static Logger logger = Logger.getLogger("Minecraft"); + private final static Pattern INVALIDCHARS = Pattern.compile("[^a-z0-9]"); - public static String sanitizeFileName(String name) + public static String sanitizeFileName(final String name) { - return name.toLowerCase(Locale.ENGLISH).replaceAll("[^a-z0-9]", "_"); + return INVALIDCHARS.matcher(name.toLowerCase(Locale.ENGLISH)).replaceAll("_"); } public static String formatDateDiff(long date) -- cgit v1.2.3 From 91563e9dca63e8a850be0ac5accb70d10efa8b3d Mon Sep 17 00:00:00 2001 From: snowleo Date: Mon, 16 Jan 2012 01:55:04 +0100 Subject: Optimize Break in Protect --- .../protect/EssentialsProtectBlockListener.java | 62 ++++++++++++++++++++-- 1 file changed, 58 insertions(+), 4 deletions(-) diff --git a/EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsProtectBlockListener.java b/EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsProtectBlockListener.java index 03ad19cb4..a1d16af25 100644 --- a/EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsProtectBlockListener.java +++ b/EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsProtectBlockListener.java @@ -56,7 +56,7 @@ public class EssentialsProtectBlockListener extends BlockListener final Block below = blockPlaced.getRelative(BlockFace.DOWN); if ((below.getType() == Material.RAILS || below.getType() == Material.POWERED_RAIL || below.getType() == Material.DETECTOR_RAIL) && prot.getSettingBool(ProtectConfig.prevent_block_on_rail) - && prot.getStorage().isProtected(below, user.getName())) + && isProtected(below, user)) { event.setCancelled(true); return; @@ -69,7 +69,7 @@ public class EssentialsProtectBlockListener extends BlockListener { protect.add(blockPlaced); if (prot.getSettingBool(ProtectConfig.protect_below_rails) - && !prot.getStorage().isProtected(blockPlaced.getRelative(BlockFace.DOWN), user.getName())) + && !isProtected(blockPlaced.getRelative(BlockFace.DOWN), user)) { protect.add(blockPlaced.getRelative(BlockFace.DOWN)); } @@ -82,7 +82,7 @@ public class EssentialsProtectBlockListener extends BlockListener if (prot.getSettingBool(ProtectConfig.protect_against_signs) && event.getBlockAgainst().getType() != Material.SIGN_POST && event.getBlockAgainst().getType() != Material.WALL_SIGN - && !prot.getStorage().isProtected(event.getBlockAgainst(), user.getName())) + && !isProtected(event.getBlockAgainst(), user)) { protect.add(event.getBlockAgainst()); } @@ -283,7 +283,7 @@ public class EssentialsProtectBlockListener extends BlockListener else { - final boolean isProtected = storage.isProtected(block, user.getName()); + final boolean isProtected = isProtected(block, user); if (isProtected) { event.setCancelled(true); @@ -422,4 +422,58 @@ public class EssentialsProtectBlockListener extends BlockListener } } } + + private boolean isProtected(final Block block, final User user) + { + final Material type = block.getType(); + if (prot.getSettingBool(ProtectConfig.protect_signs)) + { + if (type == Material.WALL_SIGN || type == Material.SIGN_POST) + { + return prot.getStorage().isProtected(block, user.getName()); + } + if (prot.getSettingBool(ProtectConfig.protect_against_signs)) + { + final Block up = block.getRelative(BlockFace.UP); + if (up != null && up.getType() == Material.SIGN_POST) + { + return prot.getStorage().isProtected(block, user.getName()); + } + final BlockFace[] directions = new BlockFace[] + { + BlockFace.NORTH, + BlockFace.EAST, + BlockFace.SOUTH, + BlockFace.WEST + }; + for (BlockFace blockFace : directions) + { + final Block signblock = block.getRelative(blockFace); + if (signblock.getType() == Material.WALL_SIGN) + { + final org.bukkit.material.Sign signMat = (org.bukkit.material.Sign)signblock.getState().getData(); + if (signMat != null && signMat.getFacing() == blockFace) + { + return prot.getStorage().isProtected(block, user.getName()); + } + } + } + } + } + if (prot.getSettingBool(ProtectConfig.protect_rails)) { + if (type == Material.RAILS || type == Material.POWERED_RAIL || type == Material.DETECTOR_RAIL) + { + return prot.getStorage().isProtected(block, user.getName()); + } + if (prot.getSettingBool(ProtectConfig.protect_below_rails)) + { + final Block up = block.getRelative(BlockFace.UP); + if (up != null && (type == Material.RAILS || type == Material.POWERED_RAIL || type == Material.DETECTOR_RAIL)) + { + return prot.getStorage().isProtected(block, user.getName()); + } + } + } + return false; + } } -- cgit v1.2.3 From 81ec87d893db63a749828fba9af851ed07076cca Mon Sep 17 00:00:00 2001 From: snowleo Date: Mon, 16 Jan 2012 02:12:20 +0100 Subject: Revert changes to Usermap --- .../src/com/earth2me/essentials/UserMap.java | 76 +++++++++------------- 1 file changed, 32 insertions(+), 44 deletions(-) diff --git a/Essentials/src/com/earth2me/essentials/UserMap.java b/Essentials/src/com/earth2me/essentials/UserMap.java index c979e5046..d15438c7d 100644 --- a/Essentials/src/com/earth2me/essentials/UserMap.java +++ b/Essentials/src/com/earth2me/essentials/UserMap.java @@ -1,20 +1,22 @@ package com.earth2me.essentials; +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.util.concurrent.UncheckedExecutionException; import java.io.File; -import java.lang.ref.SoftReference; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; +import java.util.Collections; import java.util.Set; +import java.util.concurrent.ConcurrentSkipListSet; +import java.util.concurrent.ExecutionException; import org.bukkit.entity.Player; -public class UserMap implements IConf +public class UserMap extends CacheLoader implements IConf { private final transient IEssentials ess; - private final transient Map> users = new HashMap>(); - //CacheBuilder.newBuilder().softValues().build(this); - //private final transient ConcurrentSkipListSet keys = new ConcurrentSkipListSet(); + private final transient Cache users = CacheBuilder.newBuilder().softValues().build(this); + private final transient ConcurrentSkipListSet keys = new ConcurrentSkipListSet(); public UserMap(final IEssentials ess) { @@ -35,19 +37,16 @@ public class UserMap implements IConf { return; } - synchronized (users) + keys.clear(); + users.invalidateAll(); + for (String string : userdir.list()) { - users.clear(); - - for (String string : userdir.list()) + if (!string.endsWith(".yml")) { - if (!string.endsWith(".yml")) - { - continue; - } - final String name = string.substring(0, string.length() - 4); - users.put(Util.sanitizeFileName(name), null); + continue; } + final String name = string.substring(0, string.length() - 4); + keys.add(Util.sanitizeFileName(name)); } } }); @@ -55,43 +54,40 @@ public class UserMap implements IConf public boolean userExists(final String name) { - return users.containsKey(Util.sanitizeFileName(name)); + return keys.contains(Util.sanitizeFileName(name)); } public User getUser(final String name) { try { - synchronized (users) - { - final SoftReference softRef = users.get(Util.sanitizeFileName(name)); - User user = softRef == null ? null : softRef.get(); - if (user == null) - { - user = load(name); - users.put(name, new SoftReference(user)); - } - return user; - } + return users.get(Util.sanitizeFileName(name)); + } + catch (ExecutionException ex) + { + return null; } - catch (Exception ex) + catch (UncheckedExecutionException ex) { return null; } } + @Override public User load(final String name) throws Exception { for (Player player : ess.getServer().getOnlinePlayers()) { if (player.getName().equalsIgnoreCase(name)) { + keys.add(Util.sanitizeFileName(name)); return new User(player, ess); } } final File userFile = getUserFile(name); if (userFile.exists()) { + keys.add(Util.sanitizeFileName(name)); return new User(new OfflinePlayer(name, ess), ess); } throw new Exception("User not found!"); @@ -105,28 +101,20 @@ public class UserMap implements IConf public void removeUser(final String name) { - synchronized (users) - { - users.remove(Util.sanitizeFileName(name)); - } + keys.remove(Util.sanitizeFileName(name)); + users.invalidate(Util.sanitizeFileName(name)); } public Set getAllUniqueUsers() { - synchronized (users) - { - return new HashSet(users.keySet()); - } + return Collections.unmodifiableSet(keys); } public int getUniqueUsers() { - synchronized (users) - { - return users.size(); - } + return keys.size(); } - + public File getUserFile(final String name) { final File userFolder = new File(ess.getDataFolder(), "userdata"); -- cgit v1.2.3 From f26cccb663b3cd255bbfe3b72499b0efdd3da279 Mon Sep 17 00:00:00 2001 From: snowleo Date: Mon, 16 Jan 2012 04:51:27 +0100 Subject: Optimize TextInput to cache motd and info textfiles. --- .../essentials/textreader/KeywordReplacer.java | 13 ++-- .../earth2me/essentials/textreader/TextInput.java | 77 +++++++++++++++------- 2 files changed, 62 insertions(+), 28 deletions(-) diff --git a/Essentials/src/com/earth2me/essentials/textreader/KeywordReplacer.java b/Essentials/src/com/earth2me/essentials/textreader/KeywordReplacer.java index 782798bff..a7aab67ba 100644 --- a/Essentials/src/com/earth2me/essentials/textreader/KeywordReplacer.java +++ b/Essentials/src/com/earth2me/essentials/textreader/KeywordReplacer.java @@ -4,6 +4,7 @@ import com.earth2me.essentials.DescParseTickFormat; import com.earth2me.essentials.IEssentials; import com.earth2me.essentials.User; import java.text.DateFormat; +import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Map; @@ -16,15 +17,17 @@ import org.bukkit.plugin.Plugin; public class KeywordReplacer implements IText { private final transient IText input; + private final transient List replaced; private final transient IEssentials ess; - + public KeywordReplacer(final IText input, final CommandSender sender, final IEssentials ess) { this.input = input; + this.replaced = new ArrayList(this.input.getLines().size()); this.ess = ess; replaceKeywords(sender); } - + private void replaceKeywords(final CommandSender sender) { String displayName, ipAddress, balance, mails, world; @@ -98,7 +101,7 @@ public class KeywordReplacer implements IText date = DateFormat.getDateInstance(DateFormat.MEDIUM, ess.getI18n().getCurrentLocale()).format(new Date()); time = DateFormat.getTimeInstance(DateFormat.MEDIUM, ess.getI18n().getCurrentLocale()).format(new Date()); - + version = ess.getServer().getVersion(); for (int i = 0; i < input.getLines().size(); i++) @@ -120,14 +123,14 @@ public class KeywordReplacer implements IText line = line.replace("{WORLDDATE}", worldDate); line = line.replace("{PLUGINS}", plugins); line = line.replace("{VERSION}", version); - input.getLines().set(i, line); + replaced.add(line); } } @Override public List getLines() { - return input.getLines(); + return replaced; } @Override diff --git a/Essentials/src/com/earth2me/essentials/textreader/TextInput.java b/Essentials/src/com/earth2me/essentials/textreader/TextInput.java index b25c30d51..316a0b576 100644 --- a/Essentials/src/com/earth2me/essentials/textreader/TextInput.java +++ b/Essentials/src/com/earth2me/essentials/textreader/TextInput.java @@ -4,6 +4,7 @@ import com.earth2me.essentials.IEssentials; import com.earth2me.essentials.User; import com.earth2me.essentials.Util; import java.io.*; +import java.lang.ref.SoftReference; import java.util.*; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -11,9 +12,11 @@ import org.bukkit.entity.Player; public class TextInput implements IText { - private final transient List lines = new ArrayList(); - private final transient List chapters = new ArrayList(); - private final transient Map bookmarks = new HashMap(); + private final transient List lines; + private final transient List chapters; + private final transient Map bookmarks; + private final transient long lastChange; + private final static HashMap> cache = new HashMap>(); public TextInput(final CommandSender sender, final String filename, final boolean createFile, final IEssentials ess) throws IOException { @@ -34,33 +37,62 @@ public class TextInput implements IText } if (file.exists()) { - final BufferedReader bufferedReader = new BufferedReader(new FileReader(file)); - try + lastChange = file.lastModified(); + boolean readFromfile; + synchronized (cache) { - int lineNumber = 0; - while (bufferedReader.ready()) + final SoftReference inputRef = cache.get(file.getName()); + TextInput input; + if (inputRef == null || (input = inputRef.get()) == null || input.lastChange < lastChange) { - final String line = bufferedReader.readLine(); - if (line == null) - { - break; - } - if (line.length() > 0 && line.charAt(0) == '#') - { - bookmarks.put(line.substring(1).toLowerCase(Locale.ENGLISH).replaceAll("&[0-9a-f]", ""), lineNumber); - chapters.add(line.substring(1).replace('&', '§').replace("§§", "&")); - } - lines.add(line.replace('&', '§').replace("§§", "&")); - lineNumber++; + lines = new ArrayList(); + chapters = new ArrayList(); + bookmarks = new HashMap(); + cache.put(file.getName(), new SoftReference(this)); + readFromfile = true; + } + else + { + lines = Collections.unmodifiableList(input.getLines()); + chapters = Collections.unmodifiableList(input.getChapters()); + bookmarks = Collections.unmodifiableMap(input.getBookmarks()); + readFromfile = false; } } - finally + if (readFromfile) { - bufferedReader.close(); + final BufferedReader bufferedReader = new BufferedReader(new FileReader(file)); + try + { + int lineNumber = 0; + while (bufferedReader.ready()) + { + final String line = bufferedReader.readLine(); + if (line == null) + { + break; + } + if (line.length() > 0 && line.charAt(0) == '#') + { + bookmarks.put(line.substring(1).toLowerCase(Locale.ENGLISH).replaceAll("&[0-9a-f]", ""), lineNumber); + chapters.add(line.substring(1).replace('&', '§').replace("§§", "&")); + } + lines.add(line.replace('&', '§').replace("§§", "&")); + lineNumber++; + } + } + finally + { + bufferedReader.close(); + } } } else { + lastChange = 0; + lines = Collections.emptyList(); + chapters = Collections.emptyList(); + bookmarks = Collections.emptyMap(); if (createFile) { final InputStream input = ess.getResource(filename + ".txt"); @@ -68,8 +100,7 @@ public class TextInput implements IText try { final byte[] buffer = new byte[1024]; - int length = 0; - length = input.read(buffer); + int length = input.read(buffer); while (length > 0) { output.write(buffer, 0, length); -- cgit v1.2.3 From 149ce7d74d3481b120b236ae00831226cbd07380 Mon Sep 17 00:00:00 2001 From: KHobbits Date: Mon, 16 Jan 2012 18:00:43 +0000 Subject: Adding support for Vault as a fallback economy method. --- Essentials/nbproject/pmd.settings | 1 + Essentials/nbproject/project.properties | 4 +- .../essentials/register/payment/Methods.java | 53 ++-- .../register/payment/methods/VaultEco.java | 272 +++++++++++++++++++++ lib/Vault.jar | Bin 0 -> 180183 bytes 5 files changed, 306 insertions(+), 24 deletions(-) create mode 100644 Essentials/src/com/earth2me/essentials/register/payment/methods/VaultEco.java create mode 100644 lib/Vault.jar diff --git a/Essentials/nbproject/pmd.settings b/Essentials/nbproject/pmd.settings index 29baf7ea1..cea9eaa13 100644 --- a/Essentials/nbproject/pmd.settings +++ b/Essentials/nbproject/pmd.settings @@ -1,3 +1,4 @@ DoNotUseThreads LongVariable SignatureDeclareThrowsException +LocalVariableCouldBeFinal diff --git a/Essentials/nbproject/project.properties b/Essentials/nbproject/project.properties index 87e522254..0c8b44650 100644 --- a/Essentials/nbproject/project.properties +++ b/Essentials/nbproject/project.properties @@ -76,6 +76,7 @@ file.reference.MultiCurrency.jar=../lib/MultiCurrency.jar file.reference.Permissions3.jar=../lib/Permissions3.jar file.reference.PermissionsBukkit-1.2.jar=../lib/PermissionsBukkit-1.2.jar file.reference.PermissionsEx.jar=../lib/PermissionsEx.jar +file.reference.Vault.jar=../lib/Vault.jar includes=** jar.archive.disabled=${jnlp.enabled} jar.compress=true @@ -93,7 +94,8 @@ javac.classpath=\ ${file.reference.lombok-0.10.1.jar}:\ ${reference.EssentialsGroupManager.jar}:\ ${file.reference.bukkit.jar}:\ - ${file.reference.craftbukkit.jar} + ${file.reference.craftbukkit.jar}:\ + ${file.reference.Vault.jar} # Space-separated list of extra javac options javac.compilerargs= javac.deprecation=false diff --git a/Essentials/src/com/earth2me/essentials/register/payment/Methods.java b/Essentials/src/com/earth2me/essentials/register/payment/Methods.java index 32acc0442..f8729923e 100644 --- a/Essentials/src/com/earth2me/essentials/register/payment/Methods.java +++ b/Essentials/src/com/earth2me/essentials/register/payment/Methods.java @@ -7,23 +7,23 @@ import org.bukkit.plugin.PluginManager; /** - * The Methods initializes Methods that utilize the Method interface - * based on a "first come, first served" basis. + * The + * Methods initializes Methods that utilize the Method interface based on a "first come, first served" + * basis. * * Allowing you to check whether a payment method exists or not. * - * Methods also allows you to set a preferred method of payment before it captures - * payment plugins in the initialization process. + * Methods also allows you to set a preferred method of payment before it captures payment plugins in the initialization + * process. * - * in bukkit.yml: - *
+ * in
+ * bukkit.yml: 
  *  economy:
  *      preferred: "iConomy"
  * 
* - * @author: Nijikokun (@nijikokun) - * @copyright: Copyright (C) 2011 - * @license: AOL license + * @author: Nijikokun (@nijikokun) @copyright: Copyright (C) 2011 @license: AOL license + * */ public class Methods { @@ -52,6 +52,7 @@ public class Methods addMethod("BOSEconomy", new com.earth2me.essentials.register.payment.methods.BOSE7()); addMethod("Currency", new com.earth2me.essentials.register.payment.methods.MCUR()); Dependencies.add("MultiCurrency"); + addMethod("Vault", new com.earth2me.essentials.register.payment.methods.VaultEco()); } /** @@ -78,6 +79,7 @@ public class Methods /** * Use to get version of Register plugin + * * @return version */ public static String getVersion() @@ -86,10 +88,11 @@ public class Methods } /** - * Returns an array of payment method names that have been loaded - * through the _init method. + * Returns an array of payment method names that have been loaded through the + * _init method. * - * @return Set - Array of payment methods that are loaded. + * @return + * Set - Array of payment methods that are loaded. * @see #setMethod(org.bukkit.plugin.Plugin) */ public static Set getDependencies() @@ -98,8 +101,8 @@ public class Methods } /** - * Interprets Plugin class data to verify whether it is compatible with an existing payment - * method to use for payments and other various economic activity. + * Interprets Plugin class data to verify whether it is compatible with an existing payment method to use for + * payments and other various economic activity. * * @param plugin Plugin data from bukkit, Internal Class file. * @return Method or Null @@ -127,7 +130,8 @@ public class Methods /** * Verifies if Register has set a payment method for usage yet. * - * @return boolean + * @return + * boolean * @see #setMethod(org.bukkit.plugin.Plugin) * @see #checkDisabled(org.bukkit.plugin.Plugin) */ @@ -137,11 +141,11 @@ public class Methods } /** - * Checks Plugin Class against a multitude of checks to verify it's usability - * as a payment method. + * Checks Plugin Class against a multitude of checks to verify it's usability as a payment method. * * @param PluginManager the plugin manager for the server - * @return boolean True on success, False on failure. + * @return + * boolean True on success, False on failure. */ public static boolean setMethod(PluginManager manager) { @@ -242,7 +246,8 @@ public class Methods /** * Sets the preferred economy * - * @return boolean + * @return + * boolean */ public static boolean setPreferred(String check) { @@ -258,7 +263,9 @@ public class Methods /** * Grab the existing and initialized (hopefully) Method Class. * - * @return Method or Null + * @return + * Method or + * Null */ public static Method getMethod() { @@ -266,11 +273,11 @@ public class Methods } /** - * Verify is a plugin is disabled, only does this if we there is an existing payment - * method initialized in Register. + * Verify is a plugin is disabled, only does this if we there is an existing payment method initialized in Register. * * @param method Plugin data from bukkit, Internal Class file. - * @return boolean + * @return + * boolean */ public static boolean checkDisabled(Plugin method) { diff --git a/Essentials/src/com/earth2me/essentials/register/payment/methods/VaultEco.java b/Essentials/src/com/earth2me/essentials/register/payment/methods/VaultEco.java new file mode 100644 index 000000000..64160891c --- /dev/null +++ b/Essentials/src/com/earth2me/essentials/register/payment/methods/VaultEco.java @@ -0,0 +1,272 @@ +package com.earth2me.essentials.register.payment.methods; + +import net.milkbowl.vault.Vault; +import net.milkbowl.vault.economy.Economy; + +import org.bukkit.plugin.Plugin; +import org.bukkit.plugin.RegisteredServiceProvider; + +import com.earth2me.essentials.register.payment.Method; + +public class VaultEco implements Method { + + private Vault vault; + private Economy economy; + + @Override + public Vault getPlugin() { + return this.vault; + } + + @Override + public boolean createAccount(String name, Double amount) { + if (hasAccount(name)) { + return false; + } + + return false; + } + + @Override + public String getName() { + + return this.vault.getDescription().getName().concat(" - Economy: ").concat(economy == null ? "NoEco" : economy.getName()); + } + + @Override + public String getVersion() { + return this.vault.getDescription().getVersion(); + } + + @Override + public int fractionalDigits() { + return 0; + } + + @Override + public String format(double amount) { + return this.economy.format(amount); + } + + @Override + public boolean hasBanks() { + return this.economy.hasBankSupport(); + } + + @Override + public boolean hasBank(String bank) { + return this.economy.getBanks().contains(bank); + } + + @Override + public boolean hasAccount(String name) { + return this.economy.hasAccount(name); + } + + @Override + public boolean hasBankAccount(String bank, String name) { + return this.economy.isBankOwner(bank, name).transactionSuccess() + || this.economy.isBankMember(bank, name).transactionSuccess(); + } + + @Override + public boolean createAccount(String name) { + return this.economy.createBank(name, "").transactionSuccess(); + } + + public boolean createAccount(String name, double balance) { + if(!this.economy.createBank(name, "").transactionSuccess()) { + return false; + } + return this.economy.bankDeposit(name, balance).transactionSuccess(); + } + + @Override + public MethodAccount getAccount(String name) { + if(!hasAccount(name)) + return null; + + return new VaultAccount(name, this.economy); + } + + @Override + public MethodBankAccount getBankAccount(String bank, String name) { + if(!hasBankAccount(bank, name)) + return null; + + return new VaultBankAccount(bank, economy); + } + + @Override + public boolean isCompatible(Plugin plugin) { + RegisteredServiceProvider ecoPlugin = plugin.getServer().getServicesManager().getRegistration(net.milkbowl.vault.economy.Economy.class); + return plugin instanceof Vault && ecoPlugin != null && !ecoPlugin.getProvider().getName().equals("Essentials Economy"); + } + + @Override + public void setPlugin(Plugin plugin) { + this.vault = (Vault) plugin; + RegisteredServiceProvider economyProvider = this.vault.getServer().getServicesManager().getRegistration(net.milkbowl.vault.economy.Economy.class); + if (economyProvider != null) { + this.economy = economyProvider.getProvider(); + } + } + + public class VaultAccount implements MethodAccount { + private final String name; + private final Economy economy; + + public VaultAccount(String name, Economy economy) { + this.name = name; + this.economy = economy; + } + + @Override + public double balance() { + return this.economy.getBalance(this.name); + } + + @Override + public boolean set(double amount) { + if(!this.economy.withdrawPlayer(this.name, this.balance()).transactionSuccess()) { + return false; + } + if(amount == 0) { + return true; + } + return this.economy.depositPlayer(this.name, amount).transactionSuccess(); + } + + @Override + public boolean add(double amount) { + return this.economy.depositPlayer(this.name, amount).transactionSuccess(); + } + + @Override + public boolean subtract(double amount) { + return this.economy.withdrawPlayer(this.name, amount).transactionSuccess(); + } + + @Override + public boolean multiply(double amount) { + double balance = this.balance(); + return this.set(balance * amount); + } + + @Override + public boolean divide(double amount) { + double balance = this.balance(); + return this.set(balance / amount); + } + + @Override + public boolean hasEnough(double amount) { + return (this.balance() >= amount); + } + + @Override + public boolean hasOver(double amount) { + return (this.balance() > amount); + } + + @Override + public boolean hasUnder(double amount) { + return (this.balance() < amount); + } + + @Override + public boolean isNegative() { + return (this.balance() < 0); + } + + @Override + public boolean remove() { + return this.set(0.0); + } + } + + public class VaultBankAccount implements MethodBankAccount { + + private final String bank; + private final Economy economy; + + public VaultBankAccount(String bank, Economy economy) { + this.bank = bank; + this.economy = economy; + } + + @Override + public String getBankName() { + return this.bank; + } + + @Override + public int getBankId() { + return -1; + } + + @Override + public double balance() { + return this.economy.bankBalance(this.bank).balance; + } + + @Override + public boolean set(double amount) { + if(!this.economy.bankWithdraw(this.bank, this.balance()).transactionSuccess()) { + return false; + } + if(amount == 0) { + return true; + } + return this.economy.bankDeposit(this.bank, amount).transactionSuccess(); + } + + @Override + public boolean add(double amount) { + return this.economy.bankDeposit(this.bank, amount).transactionSuccess(); + } + + @Override + public boolean subtract(double amount) { + return this.economy.bankWithdraw(this.bank, amount).transactionSuccess(); + } + + @Override + public boolean multiply(double amount) { + double balance = this.balance(); + return this.set(balance * amount); + } + + @Override + public boolean divide(double amount) { + double balance = this.balance(); + return this.set(balance / amount); + } + + @Override + public boolean hasEnough(double amount) { + return (this.balance() >= amount); + } + + @Override + public boolean hasOver(double amount) { + return (this.balance() > amount); + } + + @Override + public boolean hasUnder(double amount) { + return (this.balance() < amount); + } + + @Override + public boolean isNegative() { + return (this.balance() < 0); + } + + @Override + public boolean remove() { + return this.set(0.0); + } + + } +} \ No newline at end of file diff --git a/lib/Vault.jar b/lib/Vault.jar new file mode 100644 index 000000000..96b1625c4 Binary files /dev/null and b/lib/Vault.jar differ -- cgit v1.2.3 From cd2f819c29a786f693f90b352af99defc2ae69b5 Mon Sep 17 00:00:00 2001 From: snowleo Date: Mon, 16 Jan 2012 19:11:41 +0100 Subject: Cleanup --- Essentials/nbproject/pmd.settings | 1 - .../register/payment/methods/VaultEco.java | 412 ++++++++++++--------- 2 files changed, 234 insertions(+), 179 deletions(-) diff --git a/Essentials/nbproject/pmd.settings b/Essentials/nbproject/pmd.settings index cea9eaa13..29baf7ea1 100644 --- a/Essentials/nbproject/pmd.settings +++ b/Essentials/nbproject/pmd.settings @@ -1,4 +1,3 @@ DoNotUseThreads LongVariable SignatureDeclareThrowsException -LocalVariableCouldBeFinal diff --git a/Essentials/src/com/earth2me/essentials/register/payment/methods/VaultEco.java b/Essentials/src/com/earth2me/essentials/register/payment/methods/VaultEco.java index 64160891c..c7757f66b 100644 --- a/Essentials/src/com/earth2me/essentials/register/payment/methods/VaultEco.java +++ b/Essentials/src/com/earth2me/essentials/register/payment/methods/VaultEco.java @@ -8,265 +8,321 @@ import org.bukkit.plugin.RegisteredServiceProvider; import com.earth2me.essentials.register.payment.Method; -public class VaultEco implements Method { - private Vault vault; - private Economy economy; +public class VaultEco implements Method +{ + private Vault vault; + private Economy economy; @Override - public Vault getPlugin() { - return this.vault; - } - - @Override - public boolean createAccount(String name, Double amount) { - if (hasAccount(name)) { - return false; - } - - return false; - } - + public Vault getPlugin() + { + return this.vault; + } + @Override - public String getName() { - - return this.vault.getDescription().getName().concat(" - Economy: ").concat(economy == null ? "NoEco" : economy.getName()); - } + public boolean createAccount(String name, Double amount) + { + if (hasAccount(name)) + { + return false; + } + + return false; + } @Override - public String getVersion() { - return this.vault.getDescription().getVersion(); - } + public String getName() + { + + return this.vault.getDescription().getName().concat(" - Economy: ").concat(economy == null ? "NoEco" : economy.getName()); + } @Override - public int fractionalDigits() { - return 0; - } + public String getVersion() + { + return this.vault.getDescription().getVersion(); + } @Override - public String format(double amount) { - return this.economy.format(amount); - } + public int fractionalDigits() + { + return 0; + } @Override - public boolean hasBanks() { - return this.economy.hasBankSupport(); - } + public String format(double amount) + { + return this.economy.format(amount); + } @Override - public boolean hasBank(String bank) { - return this.economy.getBanks().contains(bank); - } + public boolean hasBanks() + { + return this.economy.hasBankSupport(); + } @Override - public boolean hasAccount(String name) { - return this.economy.hasAccount(name); - } + public boolean hasBank(String bank) + { + return this.economy.getBanks().contains(bank); + } @Override - public boolean hasBankAccount(String bank, String name) { - return this.economy.isBankOwner(bank, name).transactionSuccess() - || this.economy.isBankMember(bank, name).transactionSuccess(); - } + public boolean hasAccount(String name) + { + return this.economy.hasAccount(name); + } @Override - public boolean createAccount(String name) { - return this.economy.createBank(name, "").transactionSuccess(); - } + public boolean hasBankAccount(String bank, String name) + { + return this.economy.isBankOwner(bank, name).transactionSuccess() + || this.economy.isBankMember(bank, name).transactionSuccess(); + } - public boolean createAccount(String name, double balance) { - if(!this.economy.createBank(name, "").transactionSuccess()) { - return false; - } - return this.economy.bankDeposit(name, balance).transactionSuccess(); - } + @Override + public boolean createAccount(String name) + { + return this.economy.createBank(name, "").transactionSuccess(); + } + + public boolean createAccount(String name, double balance) + { + if (!this.economy.createBank(name, "").transactionSuccess()) + { + return false; + } + return this.economy.bankDeposit(name, balance).transactionSuccess(); + } @Override - public MethodAccount getAccount(String name) { - if(!hasAccount(name)) - return null; + public MethodAccount getAccount(String name) + { + if (!hasAccount(name)) + { + return null; + } - return new VaultAccount(name, this.economy); - } + return new VaultAccount(name, this.economy); + } @Override - public MethodBankAccount getBankAccount(String bank, String name) { - if(!hasBankAccount(bank, name)) - return null; + public MethodBankAccount getBankAccount(String bank, String name) + { + if (!hasBankAccount(bank, name)) + { + return null; + } - return new VaultBankAccount(bank, economy); - } + return new VaultBankAccount(bank, economy); + } @Override - public boolean isCompatible(Plugin plugin) { - RegisteredServiceProvider ecoPlugin = plugin.getServer().getServicesManager().getRegistration(net.milkbowl.vault.economy.Economy.class); + public boolean isCompatible(Plugin plugin) + { + RegisteredServiceProvider ecoPlugin = plugin.getServer().getServicesManager().getRegistration(net.milkbowl.vault.economy.Economy.class); return plugin instanceof Vault && ecoPlugin != null && !ecoPlugin.getProvider().getName().equals("Essentials Economy"); - } + } @Override - public void setPlugin(Plugin plugin) { - this.vault = (Vault) plugin; - RegisteredServiceProvider economyProvider = this.vault.getServer().getServicesManager().getRegistration(net.milkbowl.vault.economy.Economy.class); - if (economyProvider != null) { - this.economy = economyProvider.getProvider(); - } - } - - public class VaultAccount implements MethodAccount { - private final String name; - private final Economy economy; - - public VaultAccount(String name, Economy economy) { - this.name = name; - this.economy = economy; - } + public void setPlugin(Plugin plugin) + { + this.vault = (Vault)plugin; + RegisteredServiceProvider economyProvider = this.vault.getServer().getServicesManager().getRegistration(net.milkbowl.vault.economy.Economy.class); + if (economyProvider != null) + { + this.economy = economyProvider.getProvider(); + } + } + + + public class VaultAccount implements MethodAccount + { + private final String name; + private final Economy economy; + + public VaultAccount(String name, Economy economy) + { + this.name = name; + this.economy = economy; + } @Override - public double balance() { - return this.economy.getBalance(this.name); - } + public double balance() + { + return this.economy.getBalance(this.name); + } @Override - public boolean set(double amount) { - if(!this.economy.withdrawPlayer(this.name, this.balance()).transactionSuccess()) { - return false; - } - if(amount == 0) { - return true; - } - return this.economy.depositPlayer(this.name, amount).transactionSuccess(); - } + public boolean set(double amount) + { + if (!this.economy.withdrawPlayer(this.name, this.balance()).transactionSuccess()) + { + return false; + } + if (amount == 0) + { + return true; + } + return this.economy.depositPlayer(this.name, amount).transactionSuccess(); + } @Override - public boolean add(double amount) { - return this.economy.depositPlayer(this.name, amount).transactionSuccess(); - } + public boolean add(double amount) + { + return this.economy.depositPlayer(this.name, amount).transactionSuccess(); + } @Override - public boolean subtract(double amount) { - return this.economy.withdrawPlayer(this.name, amount).transactionSuccess(); - } + public boolean subtract(double amount) + { + return this.economy.withdrawPlayer(this.name, amount).transactionSuccess(); + } @Override - public boolean multiply(double amount) { - double balance = this.balance(); - return this.set(balance * amount); - } + public boolean multiply(double amount) + { + double balance = this.balance(); + return this.set(balance * amount); + } @Override - public boolean divide(double amount) { - double balance = this.balance(); - return this.set(balance / amount); - } + public boolean divide(double amount) + { + double balance = this.balance(); + return this.set(balance / amount); + } @Override - public boolean hasEnough(double amount) { - return (this.balance() >= amount); - } + public boolean hasEnough(double amount) + { + return (this.balance() >= amount); + } @Override - public boolean hasOver(double amount) { - return (this.balance() > amount); - } + public boolean hasOver(double amount) + { + return (this.balance() > amount); + } @Override - public boolean hasUnder(double amount) { - return (this.balance() < amount); - } + public boolean hasUnder(double amount) + { + return (this.balance() < amount); + } @Override - public boolean isNegative() { - return (this.balance() < 0); - } + public boolean isNegative() + { + return (this.balance() < 0); + } @Override - public boolean remove() { - return this.set(0.0); - } - } + public boolean remove() + { + return this.set(0.0); + } + } - public class VaultBankAccount implements MethodBankAccount { - private final String bank; - private final Economy economy; + public class VaultBankAccount implements MethodBankAccount + { + private final String bank; + private final Economy economy; - public VaultBankAccount(String bank, Economy economy) { - this.bank = bank; - this.economy = economy; - } + public VaultBankAccount(String bank, Economy economy) + { + this.bank = bank; + this.economy = economy; + } @Override - public String getBankName() { - return this.bank; - } + public String getBankName() + { + return this.bank; + } @Override - public int getBankId() { - return -1; - } + public int getBankId() + { + return -1; + } @Override - public double balance() { - return this.economy.bankBalance(this.bank).balance; - } + public double balance() + { + return this.economy.bankBalance(this.bank).balance; + } @Override - public boolean set(double amount) { - if(!this.economy.bankWithdraw(this.bank, this.balance()).transactionSuccess()) { - return false; - } - if(amount == 0) { - return true; - } - return this.economy.bankDeposit(this.bank, amount).transactionSuccess(); - } + public boolean set(double amount) + { + if (!this.economy.bankWithdraw(this.bank, this.balance()).transactionSuccess()) + { + return false; + } + if (amount == 0) + { + return true; + } + return this.economy.bankDeposit(this.bank, amount).transactionSuccess(); + } @Override - public boolean add(double amount) { - return this.economy.bankDeposit(this.bank, amount).transactionSuccess(); - } + public boolean add(double amount) + { + return this.economy.bankDeposit(this.bank, amount).transactionSuccess(); + } @Override - public boolean subtract(double amount) { - return this.economy.bankWithdraw(this.bank, amount).transactionSuccess(); - } + public boolean subtract(double amount) + { + return this.economy.bankWithdraw(this.bank, amount).transactionSuccess(); + } @Override - public boolean multiply(double amount) { - double balance = this.balance(); - return this.set(balance * amount); - } + public boolean multiply(double amount) + { + double balance = this.balance(); + return this.set(balance * amount); + } @Override - public boolean divide(double amount) { - double balance = this.balance(); - return this.set(balance / amount); - } + public boolean divide(double amount) + { + double balance = this.balance(); + return this.set(balance / amount); + } @Override - public boolean hasEnough(double amount) { - return (this.balance() >= amount); - } + public boolean hasEnough(double amount) + { + return (this.balance() >= amount); + } @Override - public boolean hasOver(double amount) { - return (this.balance() > amount); - } + public boolean hasOver(double amount) + { + return (this.balance() > amount); + } @Override - public boolean hasUnder(double amount) { - return (this.balance() < amount); - } + public boolean hasUnder(double amount) + { + return (this.balance() < amount); + } @Override - public boolean isNegative() { - return (this.balance() < 0); - } + public boolean isNegative() + { + return (this.balance() < 0); + } @Override - public boolean remove() { - return this.set(0.0); - } - - } + public boolean remove() + { + return this.set(0.0); + } + } } \ No newline at end of file -- cgit v1.2.3 From 0fb07d4cc16f541989a5a9860aa36b7f6bf7389b Mon Sep 17 00:00:00 2001 From: KHobbits Date: Mon, 16 Jan 2012 18:58:44 +0000 Subject: Removing debugging message from player login. --- Essentials/src/com/earth2me/essentials/EssentialsPlayerListener.java | 1 - 1 file changed, 1 deletion(-) diff --git a/Essentials/src/com/earth2me/essentials/EssentialsPlayerListener.java b/Essentials/src/com/earth2me/essentials/EssentialsPlayerListener.java index 9edc80364..b6cb728d2 100644 --- a/Essentials/src/com/earth2me/essentials/EssentialsPlayerListener.java +++ b/Essentials/src/com/earth2me/essentials/EssentialsPlayerListener.java @@ -183,7 +183,6 @@ public class EssentialsPlayerListener extends PlayerListener { if (event.getResult() != Result.ALLOWED && event.getResult() != Result.KICK_FULL && event.getResult() != Result.KICK_BANNED) { - LOGGER.log(Level.INFO, "Disconnecting user " + event.getPlayer().toString() + " due to " + event.getResult().toString()); return; } User user = ess.getUser(event.getPlayer()); -- cgit v1.2.3 From 26d63f36668cd111706f6406f0d10f8d08197020 Mon Sep 17 00:00:00 2001 From: snowleo Date: Mon, 16 Jan 2012 20:29:55 +0100 Subject: Strip colors from chat, if the user does not have the permission. --- Essentials/src/com/earth2me/essentials/Util.java | 2 +- .../earth2me/essentials/chat/EssentialsChatPlayerListenerLowest.java | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Essentials/src/com/earth2me/essentials/Util.java b/Essentials/src/com/earth2me/essentials/Util.java index a8a0cb1e4..eeb2dd6d6 100644 --- a/Essentials/src/com/earth2me/essentials/Util.java +++ b/Essentials/src/com/earth2me/essentials/Util.java @@ -478,7 +478,7 @@ public class Util } return buf.toString(); } - private static transient final Pattern COLOR_PATTERN = Pattern.compile("(?i)\u00A7[0-9A-F]"); + private static transient final Pattern COLOR_PATTERN = Pattern.compile("\u00A7+[0-9A-FKa-fk]"); public static String stripColor(final String input) { diff --git a/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChatPlayerListenerLowest.java b/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChatPlayerListenerLowest.java index de5757951..82241a1f5 100644 --- a/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChatPlayerListenerLowest.java +++ b/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChatPlayerListenerLowest.java @@ -2,6 +2,7 @@ package com.earth2me.essentials.chat; import com.earth2me.essentials.IEssentials; import com.earth2me.essentials.User; +import com.earth2me.essentials.Util; import java.util.Locale; import java.util.Map; import org.bukkit.Server; @@ -32,6 +33,8 @@ public class EssentialsChatPlayerListenerLowest extends EssentialsChatPlayer if (user.isAuthorized("essentials.chat.color")) { event.setMessage(event.getMessage().replaceAll("&([0-9a-f])", "\u00a7$1")); + } else { + event.setMessage(Util.stripColor(event.getMessage())); } event.setFormat(ess.getSettings().getChatFormat(user.getGroup()).replace('&', '\u00a7').replace("\u00a7\u00a7", "&").replace("{DISPLAYNAME}", "%1$s").replace("{GROUP}", user.getGroup()).replace("{MESSAGE}", "%2$s").replace("{WORLDNAME}", user.getWorld().getName()).replace("{SHORTWORLDNAME}", user.getWorld().getName().substring(0, 1).toUpperCase(Locale.ENGLISH))); } -- cgit v1.2.3 From 813e66b4f2f2759065f98c5f472bad9a0e0bf2db Mon Sep 17 00:00:00 2001 From: snowleo Date: Mon, 16 Jan 2012 20:38:53 +0100 Subject: Fix /nick command colors --- Essentials/src/com/earth2me/essentials/commands/Commandnick.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandnick.java b/Essentials/src/com/earth2me/essentials/commands/Commandnick.java index 95ad5ea84..b9fbccb37 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandnick.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandnick.java @@ -2,6 +2,7 @@ package com.earth2me.essentials.commands; import static com.earth2me.essentials.I18n._; import com.earth2me.essentials.User; +import com.earth2me.essentials.Util; import java.util.Locale; import org.bukkit.Server; import org.bukkit.command.CommandSender; @@ -65,9 +66,10 @@ public class Commandnick extends EssentialsCommand { if (user == null || user.isAuthorized("essentials.nick.color")) { - return nick.replace('&', '\u00a7').replace("\u00a7\u00a7", "&"); + return nick.replace('&', '\u00a7').replaceAll("\u00a7+k", ""); + } else { + return Util.stripColor(nick); } - return nick; } private void resetAllNicknames(final Server server) @@ -86,7 +88,7 @@ public class Commandnick extends EssentialsCommand private void setNickname(final Server server, final User target, final String nick) throws Exception { - if (nick.matches("[^a-zA-Z_0-9]")) + if (!nick.matches("^[a-zA-Z_0-9\u00a7]+$")) { throw new Exception(_("nickNamesAlpha")); } -- cgit v1.2.3 From 4435121c840aac5de4ac69b3463515f5cde060da Mon Sep 17 00:00:00 2001 From: KHobbits Date: Mon, 16 Jan 2012 19:42:15 +0000 Subject: Stripping vanilla colours from /msg --- .../earth2me/essentials/commands/Commandmsg.java | 33 +++++++++++----------- .../essentials/chat/EssentialsChatPlayer.java | 11 +++++--- 2 files changed, 24 insertions(+), 20 deletions(-) diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandmsg.java b/Essentials/src/com/earth2me/essentials/commands/Commandmsg.java index 34754ec9c..63bce435a 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandmsg.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandmsg.java @@ -4,6 +4,7 @@ import com.earth2me.essentials.Console; import static com.earth2me.essentials.I18n._; import com.earth2me.essentials.IReplyTo; import com.earth2me.essentials.User; +import com.earth2me.essentials.Util; import java.util.List; import org.bukkit.Server; import org.bukkit.command.CommandSender; @@ -34,11 +35,11 @@ public class Commandmsg extends EssentialsCommand } } - String message = getFinalArg(args, 1); - String translatedMe = _("me"); + final String message = Util.stripColor(getFinalArg(args, 1)); + final String translatedMe = _("me"); - IReplyTo replyTo = sender instanceof Player ? ess.getUser((Player)sender) : Console.getConsoleReplyTo(); - String senderName = sender instanceof Player ? ((Player)sender).getDisplayName() : Console.NAME; + final IReplyTo replyTo = sender instanceof Player ? ess.getUser((Player)sender) : Console.getConsoleReplyTo(); + final String senderName = sender instanceof Player ? ((Player)sender).getDisplayName() : Console.NAME; if (args[0].equalsIgnoreCase(Console.NAME)) { @@ -50,38 +51,38 @@ public class Commandmsg extends EssentialsCommand return; } - List matches = server.matchPlayer(args[0]); + final List matchedPlayers = server.matchPlayer(args[0]); - if (matches.isEmpty()) + if (matchedPlayers.isEmpty()) { throw new Exception(_("playerNotFound")); } int i = 0; - for (Player p : matches) + for (Player matchedPlayer : matchedPlayers) { - final User u = ess.getUser(p); + final User u = ess.getUser(matchedPlayer); if (u.isHidden()) { i++; } } - if (i == matches.size()) + if (i == matchedPlayers.size()) { throw new Exception(_("playerNotFound")); } - for (Player p : matches) + for (Player matchedPlayer : matchedPlayers) { - sender.sendMessage(_("msgFormat", translatedMe, p.getDisplayName(), message)); - final User u = ess.getUser(p); - if (sender instanceof Player && (u.isIgnoredPlayer(((Player)sender).getName()) || u.isHidden())) + sender.sendMessage(_("msgFormat", translatedMe, matchedPlayer.getDisplayName(), message)); + final User matchedUser = ess.getUser(matchedPlayer); + if (sender instanceof Player && (matchedUser.isIgnoredPlayer(((Player)sender).getName()) || matchedUser.isHidden())) { continue; } - p.sendMessage(_("msgFormat", senderName, translatedMe, message)); - replyTo.setReplyTo(ess.getUser(p)); - ess.getUser(p).setReplyTo(sender); + matchedPlayer.sendMessage(_("msgFormat", senderName, translatedMe, message)); + replyTo.setReplyTo(ess.getUser(matchedPlayer)); + ess.getUser(matchedPlayer).setReplyTo(sender); } } } diff --git a/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChatPlayer.java b/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChatPlayer.java index 2d6e1ae4e..432e2309c 100644 --- a/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChatPlayer.java +++ b/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChatPlayer.java @@ -112,7 +112,7 @@ public abstract class EssentialsChatPlayer extends PlayerListener logger.info(_("localFormat", sender.getName(), event.getMessage())); final Location loc = sender.getLocation(); final World world = loc.getWorld(); - + for (Player onlinePlayer : server.getOnlinePlayers()) { String type = "[L]"; @@ -123,11 +123,14 @@ public abstract class EssentialsChatPlayer extends PlayerListener continue; } if (!user.equals(sender)) - { + { final Location playerLoc = user.getLocation(); - if (playerLoc.getWorld() != world) { continue; } + if (playerLoc.getWorld() != world) + { + continue; + } final double delta = playerLoc.distanceSquared(loc); - + if (delta > radius) { if (user.isAuthorized("essentials.chat.spy")) -- cgit v1.2.3 From 1f2c669eca786debc3ee5ee8a3de5ad98bd6470a Mon Sep 17 00:00:00 2001 From: KHobbits Date: Mon, 16 Jan 2012 20:25:36 +0000 Subject: Stripping vanilla colour from /helpop and /mail Adding support for &k in EssChat Adding support for colour in /msg and /r - New perm: essentials.msg.color --- .../essentials/commands/Commandhelpop.java | 3 ++- .../earth2me/essentials/commands/Commandmail.java | 5 ++-- .../earth2me/essentials/commands/Commandme.java | 7 +++++- .../earth2me/essentials/commands/Commandmsg.java | 14 ++++++++++- .../com/earth2me/essentials/commands/Commandr.java | 29 +++++++++++++++++++--- .../chat/EssentialsChatPlayerListenerLowest.java | 2 +- 6 files changed, 51 insertions(+), 9 deletions(-) diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandhelpop.java b/Essentials/src/com/earth2me/essentials/commands/Commandhelpop.java index f558a1b52..20cd5cdd3 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandhelpop.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandhelpop.java @@ -2,6 +2,7 @@ package com.earth2me.essentials.commands; import static com.earth2me.essentials.I18n._; import com.earth2me.essentials.User; +import com.earth2me.essentials.Util; import java.util.logging.Level; import org.bukkit.Server; import org.bukkit.entity.Player; @@ -22,7 +23,7 @@ public class Commandhelpop extends EssentialsCommand throw new NotEnoughArgumentsException(); } - final String message = _("helpOp", user.getDisplayName(), getFinalArg(args, 0)); + final String message = _("helpOp", user.getDisplayName(), Util.stripColor(getFinalArg(args, 0))); logger.log(Level.INFO, message); for (Player onlinePlayer : server.getOnlinePlayers()) { diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandmail.java b/Essentials/src/com/earth2me/essentials/commands/Commandmail.java index 6a66186e7..4a9928b85 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandmail.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandmail.java @@ -2,6 +2,7 @@ package com.earth2me.essentials.commands; import static com.earth2me.essentials.I18n._; import com.earth2me.essentials.User; +import com.earth2me.essentials.Util; import java.util.List; import org.bukkit.ChatColor; import org.bukkit.Server; @@ -58,7 +59,7 @@ public class Commandmail extends EssentialsCommand } if (!u.isIgnoredPlayer(user.getName())) { - u.addMail(user.getName() + ": " + getFinalArg(args, 2)); + u.addMail(user.getName() + ": " + Util.stripColor(getFinalArg(args, 2))); } user.sendMessage(_("mailSent")); return; @@ -69,7 +70,7 @@ public class Commandmail extends EssentialsCommand { throw new Exception(_("noPerm","essentials.mail.sendall")); } - ess.scheduleAsyncDelayedTask(new SendAll(user.getName() + ": " + getFinalArg(args, 1))); + ess.scheduleAsyncDelayedTask(new SendAll(user.getName() + ": " + Util.stripColor(getFinalArg(args, 1)))); user.sendMessage(_("mailSent")); return; } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandme.java b/Essentials/src/com/earth2me/essentials/commands/Commandme.java index 7ae87251d..3cdddf99c 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandme.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandme.java @@ -2,6 +2,7 @@ package com.earth2me.essentials.commands; import static com.earth2me.essentials.I18n._; import com.earth2me.essentials.User; +import com.earth2me.essentials.Util; import org.bukkit.Server; @@ -28,8 +29,12 @@ public class Commandme extends EssentialsCommand String message = getFinalArg(args, 0); if (user.isAuthorized("essentials.chat.color")) { - message = message.replaceAll("&([0-9a-f])", "§$1"); + message = message.replaceAll("&([0-9a-fk])", "§$1"); } + else { + message = Util.stripColor(message); + } + ess.broadcastMessage(user, _("action", user.getDisplayName(), message)); } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandmsg.java b/Essentials/src/com/earth2me/essentials/commands/Commandmsg.java index 63bce435a..de4b921e6 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandmsg.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandmsg.java @@ -26,6 +26,7 @@ public class Commandmsg extends EssentialsCommand throw new NotEnoughArgumentsException(); } + String message = getFinalArg(args, 1); if (sender instanceof Player) { User user = ess.getUser(sender); @@ -33,9 +34,20 @@ public class Commandmsg extends EssentialsCommand { throw new Exception(_("voiceSilenced")); } + if (user.isAuthorized("essentials.msg.color")) + { + message = message.replaceAll("&([0-9a-fk])", "§$1"); + } + else + { + message = Util.stripColor(message); + } + } + else + { + message = message.replaceAll("&([0-9a-fk])", "§$1"); } - final String message = Util.stripColor(getFinalArg(args, 1)); final String translatedMe = _("me"); final IReplyTo replyTo = sender instanceof Player ? ess.getUser((Player)sender) : Console.getConsoleReplyTo(); diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandr.java b/Essentials/src/com/earth2me/essentials/commands/Commandr.java index 1da198444..9e30225ac 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandr.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandr.java @@ -4,6 +4,7 @@ import com.earth2me.essentials.Console; import static com.earth2me.essentials.I18n._; import com.earth2me.essentials.IReplyTo; import com.earth2me.essentials.User; +import com.earth2me.essentials.Util; import org.bukkit.Server; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -24,9 +25,31 @@ public class Commandr extends EssentialsCommand throw new NotEnoughArgumentsException(); } - final String message = getFinalArg(args, 0); - final IReplyTo replyTo = sender instanceof Player ? ess.getUser((Player)sender) : Console.getConsoleReplyTo(); - final String senderName = sender instanceof Player ? ((Player)sender).getDisplayName() : Console.NAME; + String message = getFinalArg(args, 0); + IReplyTo replyTo; + String senderName; + + if (sender instanceof Player) + { + User user = ess.getUser(sender); + if (user.isAuthorized("essentials.msg.color")) + { + message = message.replaceAll("&([0-9a-fk])", "§$1"); + } + else + { + message = Util.stripColor(message); + } + replyTo = user; + senderName = user.getDisplayName(); + } + else + { + message = message.replaceAll("&([0-9a-fk])", "§$1"); + replyTo = Console.getConsoleReplyTo(); + senderName = Console.NAME; + } + final CommandSender target = replyTo.getReplyTo(); final String targetName = target instanceof Player ? ((Player)target).getDisplayName() : Console.NAME; diff --git a/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChatPlayerListenerLowest.java b/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChatPlayerListenerLowest.java index 82241a1f5..5c674d05d 100644 --- a/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChatPlayerListenerLowest.java +++ b/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChatPlayerListenerLowest.java @@ -32,7 +32,7 @@ public class EssentialsChatPlayerListenerLowest extends EssentialsChatPlayer final User user = ess.getUser(event.getPlayer()); if (user.isAuthorized("essentials.chat.color")) { - event.setMessage(event.getMessage().replaceAll("&([0-9a-f])", "\u00a7$1")); + event.setMessage(event.getMessage().replaceAll("&([0-9a-fk])", "\u00a7$1")); } else { event.setMessage(Util.stripColor(event.getMessage())); } -- cgit v1.2.3 From a66ffd892172092d0ee95086267c22bdd6fbc31f Mon Sep 17 00:00:00 2001 From: snowleo Date: Tue, 17 Jan 2012 01:45:03 +0100 Subject: Shorter names for enchantment signs. --- Essentials/src/com/earth2me/essentials/Enchantments.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Essentials/src/com/earth2me/essentials/Enchantments.java b/Essentials/src/com/earth2me/essentials/Enchantments.java index 3553142fa..5ce10d75d 100644 --- a/Essentials/src/com/earth2me/essentials/Enchantments.java +++ b/Essentials/src/com/earth2me/essentials/Enchantments.java @@ -57,7 +57,9 @@ public class Enchantments ENCHANTMENTS.put("firearrow", Enchantment.ARROW_FIRE); ENCHANTMENTS.put("arrowdamage", Enchantment.ARROW_DAMAGE); ENCHANTMENTS.put("arrowknockback", Enchantment.ARROW_KNOCKBACK); + ENCHANTMENTS.put("arrowkb", Enchantment.ARROW_KNOCKBACK); ENCHANTMENTS.put("infinitearrows", Enchantment.ARROW_INFINITE); + ENCHANTMENTS.put("infarrows", Enchantment.ARROW_INFINITE); } public static Enchantment getByName(String name) { -- cgit v1.2.3 From 8fc66842905549f7ed9e7906f7be65e6c7a30cbb Mon Sep 17 00:00:00 2001 From: KHobbits Date: Tue, 17 Jan 2012 17:24:22 +0000 Subject: Auto Update GM Version --- build.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/build.xml b/build.xml index 6d99694fb..c69c0f075 100644 --- a/build.xml +++ b/build.xml @@ -2,6 +2,7 @@ + -- cgit v1.2.3 From 89c41b0508edd847316a293926fb56a7b249e6ba Mon Sep 17 00:00:00 2001 From: ElgarL Date: Tue, 17 Jan 2012 18:03:16 +0000 Subject: v 1.9: Optimize populating Bukkit perms so we no longer calculate the child nodes (Bukkit already does this). --- EssentialsGroupManager/src/Changelog.txt | 4 +- .../permissions/AnjoPermissionsHandler.java | 61 ++++++++++++++-------- .../permissions/BukkitPermissions.java | 18 ++++--- .../permissions/PermissionsReaderInterface.java | 2 + EssentialsGroupManager/src/plugin.yml | 3 +- 5 files changed, 58 insertions(+), 30 deletions(-) diff --git a/EssentialsGroupManager/src/Changelog.txt b/EssentialsGroupManager/src/Changelog.txt index 71a4c3482..876dc28b7 100644 --- a/EssentialsGroupManager/src/Changelog.txt +++ b/EssentialsGroupManager/src/Changelog.txt @@ -101,4 +101,6 @@ v 1.8: - Major, MAJOR changes to support partial/full world mirroring. You can now mirror groups.yml, users.yml or both files between different worlds. - Catch NullPointerErrors generated by blank permission nodes. - - Removed '- bukkit.command' form the globalgroups permission nodes. \ No newline at end of file + - Removed '- bukkit.command' form the globalgroups permission nodes. +v 1.9: + - Optimize populating Bukkit perms so we no longer calculate the child nodes (Bukkit already does this). \ No newline at end of file diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/AnjoPermissionsHandler.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/AnjoPermissionsHandler.java index b23fc01d4..167103796 100644 --- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/AnjoPermissionsHandler.java +++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/AnjoPermissionsHandler.java @@ -90,13 +90,24 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface { /** * Returns All permissions (including inheritance and sub groups) for the - * player. + * player, including child nodes from Bukkit. * * @param userName * @return List of all players permissions. */ @Override public List getAllPlayersPermissions(String userName) { + return getAllPlayersPermissions(userName, true); + } + /** + * Returns All permissions (including inheritance and sub groups) for the + * player. With or without Bukkit child nodes. + * + * @param userName + * @return List of all players permissions. + */ + @Override + public List getAllPlayersPermissions(String userName, Boolean includeChildren) { List playerPermArray = new ArrayList(); @@ -104,14 +115,16 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface { if ((!playerPermArray.contains(perm)) && (!playerPermArray.contains("-" + perm))) { playerPermArray.add(perm); - Map children = GroupManager.BukkitPermissions.getAllChildren(perm, playerPermArray); - - if (children != null) { - for (String child : children.keySet()) { - if (children.get(child)) - if ((!playerPermArray.contains(child)) && (!playerPermArray.contains("-" + child))) { - playerPermArray.add(child); - } + if (includeChildren) { + Map children = GroupManager.BukkitPermissions.getAllChildren(perm, playerPermArray); + + if (children != null) { + for (String child : children.keySet()) { + if (children.get(child)) + if ((!playerPermArray.contains(child)) && (!playerPermArray.contains("-" + child))) { + playerPermArray.add(child); + } + } } } } @@ -122,12 +135,14 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface { if ((!playerPermArray.contains(perm)) && (!playerPermArray.contains("-" + perm))) { playerPermArray.add(perm); - Map children = GroupManager.BukkitPermissions.getAllChildren(perm, playerPermArray); - if (children != null) { - for (String child : children.keySet()) { - if (children.get(child)) - if ((!playerPermArray.contains(child)) && (!playerPermArray.contains("-" + child))) - playerPermArray.add(child); + if (includeChildren) { + Map children = GroupManager.BukkitPermissions.getAllChildren(perm, playerPermArray); + if (children != null) { + for (String child : children.keySet()) { + if (children.get(child)) + if ((!playerPermArray.contains(child)) && (!playerPermArray.contains("-" + child))) + playerPermArray.add(child); + } } } } @@ -137,13 +152,15 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface { if ((!playerPermArray.contains(perm)) && (!playerPermArray.contains("-" + perm))) { playerPermArray.add(perm); - Map children = GroupManager.BukkitPermissions.getAllChildren(perm, playerPermArray); - if (children != null) { - for (String child : children.keySet()) { - if (children.get(child)) - if ((!playerPermArray.contains(child)) && (!playerPermArray.contains("-" + child))) { - playerPermArray.add(child); - } + if (includeChildren) { + Map children = GroupManager.BukkitPermissions.getAllChildren(perm, playerPermArray); + if (children != null) { + for (String child : children.keySet()) { + if (children.get(child)) + if ((!playerPermArray.contains(child)) && (!playerPermArray.contains("-" + child))) { + playerPermArray.add(child); + } + } } } } diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/BukkitPermissions.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/BukkitPermissions.java index ebaadf8bd..91f9a9bd6 100644 --- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/BukkitPermissions.java +++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/BukkitPermissions.java @@ -79,7 +79,7 @@ public class BukkitPermissions { public BukkitPermissions(GroupManager plugin) { this.plugin = plugin; - //this.collectPermissions(); + this.collectPermissions(); this.registerEvents(); this.updateAllPlayers(); @@ -105,15 +105,20 @@ public class BukkitPermissions { manager.registerEvent(Event.Type.PLUGIN_DISABLE, serverListener, Event.Priority.Normal, plugin); } - /* + public void collectPermissions() { registeredPermissions.clear(); + /* for (Plugin bukkitPlugin : Bukkit.getServer().getPluginManager().getPlugins()) { for (Permission permission : bukkitPlugin.getDescription().getPermissions()) registeredPermissions.push(permission); } + */ + + registeredPermissions = new LinkedList(Bukkit.getPluginManager().getPermissions()); + } - */ + public void updatePermissions(Player player) { this.updatePermissions(player, null); @@ -194,7 +199,7 @@ public class BukkitPermissions { // Add all permissions for this player (GM only) // child nodes will be calculated by Bukkit. - List playerPermArray = worldData.getPermissionsHandler().getAllPlayersPermissions(player.getName()); + List playerPermArray = worldData.getPermissionsHandler().getAllPlayersPermissions(player.getName(), false); Map newPerms = new HashMap(); for (String permission : playerPermArray) { @@ -210,6 +215,7 @@ public class BukkitPermissions { */ newPerms.put(permission, value); } + //player.recalculatePermissions(); /** @@ -373,13 +379,13 @@ public class BukkitPermissions { if (!GroupManager.isLoaded()) return; - //collectPermissions(); + collectPermissions(); updateAllPlayers(); } @Override public void onPluginDisable(PluginDisableEvent event) { - // collectPermissions(); + collectPermissions(); // updateAllPlayers(); } } diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/PermissionsReaderInterface.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/PermissionsReaderInterface.java index c0383c160..cf11bd37f 100644 --- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/PermissionsReaderInterface.java +++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/PermissionsReaderInterface.java @@ -234,4 +234,6 @@ public abstract class PermissionsReaderInterface { ////////////////////////////// public abstract List getAllPlayersPermissions(String userName); + + public abstract List getAllPlayersPermissions(String userName, Boolean includeChildren); } diff --git a/EssentialsGroupManager/src/plugin.yml b/EssentialsGroupManager/src/plugin.yml index da5164ce1..dc9b4c29c 100644 --- a/EssentialsGroupManager/src/plugin.yml +++ b/EssentialsGroupManager/src/plugin.yml @@ -1,11 +1,12 @@ name: GroupManager -version: "1.8 (Phoenix)" +version: GMBuildVer (Phoenix) main: org.anjocaido.groupmanager.GroupManager website: http://www.anjocaido.info/ description: Provides on-the-fly system for permissions system created by Nijikokun. But all in memory, and with flat-file saving schedule. authors: - AnjoCaido - Gabriel Couto + - ElgarL commands: manuadd: description: Move a player to desired group.(Adds to the file if not exists) -- cgit v1.2.3