diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000..4e247eee21 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +/.settings +/target +/.classpath +/.project diff --git a/lib/EssentialsGroupManager.jar b/lib/EssentialsGroupManager.jar new file mode 100755 index 0000000000..c47bf56150 Binary files /dev/null and b/lib/EssentialsGroupManager.jar differ diff --git a/lib/Permissions.jar b/lib/Permissions.jar new file mode 100755 index 0000000000..31c3e5d994 Binary files /dev/null and b/lib/Permissions.jar differ diff --git a/lib/PermissionsEx.jar b/lib/PermissionsEx.jar new file mode 100755 index 0000000000..f75038bcac Binary files /dev/null and b/lib/PermissionsEx.jar differ diff --git a/lib/README.md b/lib/README.md deleted file mode 100644 index 746a68b709..0000000000 --- a/lib/README.md +++ /dev/null @@ -1,3 +0,0 @@ -These libraries are automatically downloaded by MyWarp when needed. Copied from LWC. - -You do not need to download these yourself unless you experience errors or are asked to. \ No newline at end of file diff --git a/lib/bpermissions.jar b/lib/bpermissions.jar new file mode 100755 index 0000000000..a757737552 Binary files /dev/null and b/lib/bpermissions.jar differ diff --git a/lib/bpermissions2.jar b/lib/bpermissions2.jar new file mode 100755 index 0000000000..9ab85aaf28 Binary files /dev/null and b/lib/bpermissions2.jar differ diff --git a/lib/linux-amd64.lib b/lib/linux-amd64.lib deleted file mode 100644 index 678b7a24a9..0000000000 Binary files a/lib/linux-amd64.lib and /dev/null differ diff --git a/lib/linux-x86.lib b/lib/linux-x86.lib deleted file mode 100644 index 03c752866f..0000000000 Binary files a/lib/linux-x86.lib and /dev/null differ diff --git a/lib/mac-universal.lib b/lib/mac-universal.lib deleted file mode 100644 index e3c20c0843..0000000000 Binary files a/lib/mac-universal.lib and /dev/null differ diff --git a/lib/mysql-connector-java-bin.jar b/lib/mysql-connector-java-bin.jar new file mode 100644 index 0000000000..2405196f9a Binary files /dev/null and b/lib/mysql-connector-java-bin.jar differ diff --git a/lib/native/Linux/amd64/libsqlitejdbc.so b/lib/native/Linux/amd64/libsqlitejdbc.so deleted file mode 100644 index 4a848d057a..0000000000 Binary files a/lib/native/Linux/amd64/libsqlitejdbc.so and /dev/null differ diff --git a/lib/native/Linux/i386/libsqlitejdbc.so b/lib/native/Linux/i386/libsqlitejdbc.so deleted file mode 100644 index 9e3923d5e5..0000000000 Binary files a/lib/native/Linux/i386/libsqlitejdbc.so and /dev/null differ diff --git a/lib/native/Mac/i386/libsqlitejdbc.jnilib b/lib/native/Mac/i386/libsqlitejdbc.jnilib deleted file mode 100644 index af71e8ddc5..0000000000 Binary files a/lib/native/Mac/i386/libsqlitejdbc.jnilib and /dev/null differ diff --git a/lib/native/Mac/x86_64/libsqlitejdbc.jnilib b/lib/native/Mac/x86_64/libsqlitejdbc.jnilib deleted file mode 100644 index 56503cc819..0000000000 Binary files a/lib/native/Mac/x86_64/libsqlitejdbc.jnilib and /dev/null differ diff --git a/lib/native/Windows/amd64/sqlitejdbc.dll b/lib/native/Windows/amd64/sqlitejdbc.dll deleted file mode 100644 index af0ea570b9..0000000000 Binary files a/lib/native/Windows/amd64/sqlitejdbc.dll and /dev/null differ diff --git a/lib/native/Windows/x86/sqlitejdbc.dll b/lib/native/Windows/x86/sqlitejdbc.dll deleted file mode 100644 index 734ecabad4..0000000000 Binary files a/lib/native/Windows/x86/sqlitejdbc.dll and /dev/null differ diff --git a/lib/sqlite.jar b/lib/sqlite.jar index 68619af129..2030ea0f11 100644 Binary files a/lib/sqlite.jar and b/lib/sqlite.jar differ diff --git a/lib/win-x86.lib b/lib/win-x86.lib deleted file mode 100644 index e7c364ddb6..0000000000 Binary files a/lib/win-x86.lib and /dev/null differ diff --git a/pom.xml b/pom.xml index 87d0566eab..fbb58c0ee2 100644 --- a/pom.xml +++ b/pom.xml @@ -1,46 +1,99 @@ - + 4.0.0 me.taylorkelly.mywarp MyWarp - 2.0 MyWarp + 2.2-b${BUILD_NUMBER} http://www.bukkit.org + + UTF-8 + + + + bukkit-repo + http://repo.bukkit.org/content/groups/public/ + + + vault-repo + http://ci.herocraftonline.com/plugin/repository/project/Vault/LastSuccessful/repository/ + + + maven-repo + http://repo1.maven.org/maven2/ + + org.bukkit bukkit - 0.0.1-SNAPSHOT - jar - compile + 1.3.1-R1.0 - ru.tehkode - PermissionsEx - [1.02,) + commons-lang + commons-lang + 2.3 - com.nijikokun.bukkit - Permissions - [2.5.5,) + net.milkbowl.vault + Vault + 1.2.17-SNAPSHOT - com.nijikokun.bukkit - Permissions - [3.0.6,) + org.xerial + sqlite-jdbc + 3.7.2 - org.anjocaido - GroupManager - 1.0-alpha-5-SNAPSHOT + mysql + mysql-connector-java + 5.1.21 - me.taylorkelly.help - Help - [0.2,) + de.bananaco.permissions.Permissions + bPermissions + 2.0.9a + system + ${project.basedir}/lib/bpermissions.jar + + + de.bananaco.permissions.Permissions + bPermissions2 + 2.9.0 + system + ${project.basedir}/lib/bpermissions2.jar + + + com.nijikokun.bukkit.Permissions.Permissions + Permissions + 3.1.6 + system + ${project.basedir}/lib/Permissions.jar + + + org.anjocaido.groupmanager.GroupManager + GroupManager + 1.9.42 + system + ${project.basedir}/lib/EssentialsGroupManager.jar + + + ru.tehkode + PermissionsEx + 1.19.2 + system + ${project.basedir}/lib/PermissionsEx.jar ${project.name} + clean install + + + src/main/resources + true + + org.apache.maven.plugins @@ -49,29 +102,9 @@ 1.6 1.6 - UTF-8 - - - - org.apache.maven.plugins - maven-resources-plugin - 2.4.3 - UTF-8 - - org.apache.maven.plugins - maven-jar-plugin - 2.3.1 - - - - ../lib/sqlite.jar ../lib/mysql-connector-java-bin.jar - - - - \ No newline at end of file diff --git a/readme.md b/readme.md index 1e483d2b07..c14b459805 100644 --- a/readme.md +++ b/readme.md @@ -9,7 +9,5 @@ For compilation, you need : * JDK 6 (Sun JDK or OpenJDK Highlight recommanded) * Install [Maven 3](http://maven.apache.org/download.html) -* Check out and install [Bukkit](http://github.com/Bukkit/Bukkit) and [CraftBukkit](http://github.com/Bukkit/CraftBukkit) * Check out this repo -* Get the Permissions plugin jar and run `mvn install:install-file -Dfile=Permissions.jar -DgroupId=org.bukkit -DartifactId=permissions -Dversion=2.0 -Dpackaging=jar` * `mvn clean install` diff --git a/src/main/java/me/taylorkelly/mywarp/Lister.java b/src/main/java/me/taylorkelly/mywarp/Lister.java deleted file mode 100644 index f41fb9a47e..0000000000 --- a/src/main/java/me/taylorkelly/mywarp/Lister.java +++ /dev/null @@ -1,96 +0,0 @@ -package me.taylorkelly.mywarp; - -import java.util.ArrayList; - -import org.angelsl.minecraft.randomshit.fontwidth.MinecraftFontWidthCalculator; -import org.bukkit.ChatColor; -import org.bukkit.entity.Player; - - -public class Lister { - private WarpList warpList; - private Player player; - - private int maxPages; - private int page; - - private static final int WARPS_PER_PAGE = 8; - ArrayList sortedWarps; - - public Lister(WarpList warpList) { - this.warpList = warpList; - } - - public void addPlayer(Player player) { - this.player = player; - } - - public void setPage(int page) { - this.page = page; - int start = (page-1)*WARPS_PER_PAGE; - sortedWarps = warpList.getSortedWarps(player, start, WARPS_PER_PAGE); - maxPages = (int)Math.ceil(warpList.getMaxWarps(player)/(double)WARPS_PER_PAGE); - } - - public void list() { - String intro = "------------------- Page " + page + "/" + maxPages + " -------------------"; - player.sendMessage(ChatColor.YELLOW + intro); - for(Warp warp: sortedWarps) { - String name = warp.name; - String creator = (warp.creator.equalsIgnoreCase(player.getName()))?"you":warp.creator; - int x = (int) Math.round(warp.x); - int y = warp.y; - int z = (int) Math.round(warp.z); - String color; - if(warp.playerIsCreator(player.getName())) { - color = ChatColor.AQUA.toString(); - } else if(warp.publicAll) { - color = ChatColor.GREEN.toString(); - } else { - color = ChatColor.RED.toString(); - } - - - String location = " @(" + x + ", " + y + ", " + z + ")"; - String creatorString = (warp.publicAll?"(+)":"(-)") + " by " + creator; - - //Find remaining length left - int left = MinecraftFontWidthCalculator.getStringWidth(intro) - MinecraftFontWidthCalculator.getStringWidth("''" + creatorString + location); - - int nameLength = MinecraftFontWidthCalculator.getStringWidth(name); - if(left > nameLength) { - name = "'" + name + "'" + ChatColor.WHITE + creatorString + whitespace(left - nameLength); - } else if (left < nameLength) { - name = "'" + substring(name, left) + "'" + ChatColor.WHITE + creatorString; - } - - player.sendMessage(color + name + location); - } - } - - /** - * Lob shit off that string till it fits. - */ - private String substring(String name, int left) { - while(MinecraftFontWidthCalculator.getStringWidth(name) > left) { - name = name.substring(0, name.length()-1); - } - return name; - } - - public int getMaxPages(Player player) { - return (int)Math.ceil(warpList.getMaxWarps(player)/(double)WARPS_PER_PAGE); - } - - public String whitespace(int length) { - int spaceWidth = MinecraftFontWidthCalculator.getStringWidth(" "); - - StringBuilder ret = new StringBuilder(); - - for(int i = 0; i < length; i+=spaceWidth) { - ret.append(" "); - } - - return ret.toString(); - } -} diff --git a/src/main/java/me/taylorkelly/mywarp/MWBlockListener.java b/src/main/java/me/taylorkelly/mywarp/MWBlockListener.java deleted file mode 100644 index d4cea55e1a..0000000000 --- a/src/main/java/me/taylorkelly/mywarp/MWBlockListener.java +++ /dev/null @@ -1,27 +0,0 @@ -package me.taylorkelly.mywarp; - -import org.bukkit.ChatColor; -import org.bukkit.entity.Player; -import org.bukkit.event.block.BlockListener; -import org.bukkit.event.block.SignChangeEvent; - -public class MWBlockListener extends BlockListener -{ - public MWBlockListener(WarpList list) - { - } - - public void onSignChange(SignChangeEvent event) - { - Player player = event.getPlayer(); - - if (SignWarp.isSignWarp(event)) - if (WarpPermissions.createSignWarp(player)) { - player.sendMessage(ChatColor.AQUA + "Successfully created a SignWarp"); - } - else { - player.sendMessage(ChatColor.RED + "You do not have permission to create a SignWarp"); - event.setCancelled(true); - } - } -} \ No newline at end of file diff --git a/src/main/java/me/taylorkelly/mywarp/MWPlayerListener.java b/src/main/java/me/taylorkelly/mywarp/MWPlayerListener.java deleted file mode 100644 index f92af60c48..0000000000 --- a/src/main/java/me/taylorkelly/mywarp/MWPlayerListener.java +++ /dev/null @@ -1,52 +0,0 @@ -package me.taylorkelly.mywarp; - -import org.bukkit.Location; -import org.bukkit.Server; -import org.bukkit.Chunk; -import org.bukkit.World; -import org.bukkit.block.Block; -import org.bukkit.block.Sign; -import org.bukkit.entity.Player; -import org.bukkit.event.block.Action; -import org.bukkit.event.player.PlayerChatEvent; -import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.event.player.PlayerListener; -import org.bukkit.event.player.PlayerTeleportEvent; - -public class MWPlayerListener extends PlayerListener -{ - private WarpList warpList; - - public MWPlayerListener(WarpList warpList) - { - this.warpList = warpList; - } - - public void onPlayerInteract(PlayerInteractEvent event) - { - if (event.getAction().equals(Action.RIGHT_CLICK_BLOCK)) { - Block block = event.getClickedBlock(); - if (((block.getState() instanceof Sign)) && (SignWarp.isSignWarp((Sign)block.getState())) && (WarpPermissions.signWarp(event.getPlayer()))) - SignWarp.warpSign((Sign)block.getState(), this.warpList, event.getPlayer()); - } - } - - public void onPlayerChat(PlayerChatEvent event) - { - Player player = event.getPlayer(); - if (this.warpList.waitingForWelcome(player)) { - this.warpList.setWelcomeMessage(player, event.getMessage()); - this.warpList.notWaiting(player); - event.setCancelled(true); - } - } - - @Override - public void onPlayerTeleport(PlayerTeleportEvent event) { - World world = event.getPlayer().getWorld(); - Chunk chunk = world.getChunkAt(event.getTo()); - int x = chunk.getX(); - int z = chunk.getZ(); - world.refreshChunk(x, z); - } -} \ No newline at end of file diff --git a/src/main/java/me/taylorkelly/mywarp/MyWarp.java b/src/main/java/me/taylorkelly/mywarp/MyWarp.java index 35b1e5e27a..113d0580e1 100644 --- a/src/main/java/me/taylorkelly/mywarp/MyWarp.java +++ b/src/main/java/me/taylorkelly/mywarp/MyWarp.java @@ -5,19 +5,38 @@ import java.io.FileOutputStream; import java.io.IOException; import java.sql.Connection; -import java.util.ArrayList; import java.util.logging.Level; import java.util.logging.Logger; +import me.taylorkelly.mywarp.commands.AdminWarpToCommand; +import me.taylorkelly.mywarp.commands.CommandHandler; +import me.taylorkelly.mywarp.commands.CreateCommand; +import me.taylorkelly.mywarp.commands.CreatePrivateCommand; +import me.taylorkelly.mywarp.commands.DeleteCommand; +import me.taylorkelly.mywarp.commands.GiveCommand; +import me.taylorkelly.mywarp.commands.HelpCommand; +import me.taylorkelly.mywarp.commands.InviteCommand; +import me.taylorkelly.mywarp.commands.ListCommand; +import me.taylorkelly.mywarp.commands.PointCommand; +import me.taylorkelly.mywarp.commands.PrivateCommand; +import me.taylorkelly.mywarp.commands.PublicCommand; +import me.taylorkelly.mywarp.commands.ReloadCommand; +import me.taylorkelly.mywarp.commands.ListAllCommand; +import me.taylorkelly.mywarp.commands.SearchCommand; +import me.taylorkelly.mywarp.commands.UninviteCommand; +import me.taylorkelly.mywarp.commands.WarpToCommand; +import me.taylorkelly.mywarp.commands.WelcomeCommand; +import me.taylorkelly.mywarp.data.WarpList; import me.taylorkelly.mywarp.griefcraft.Updater; +import me.taylorkelly.mywarp.listeners.MWBlockListener; +import me.taylorkelly.mywarp.listeners.MWPlayerListener; +import me.taylorkelly.mywarp.permissions.WarpPermissions; +import me.taylorkelly.mywarp.sql.ConnectionManager; +import me.taylorkelly.mywarp.utils.WarpLogger; -import org.bukkit.ChatColor; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.event.Event; -import org.bukkit.event.Event.Priority; -import org.bukkit.event.Event.Type; +import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.java.JavaPlugin; public class MyWarp extends JavaPlugin { @@ -28,7 +47,9 @@ public class MyWarp extends JavaPlugin { public String name; public String version; private Updater updater; - public static final Logger log = Logger.getLogger("Minecraft"); + private PluginManager pm; + private CommandHandler commandHandler; + private static WarpPermissions warpPermissions; @Override public void onDisable() { @@ -39,33 +60,60 @@ public void onDisable() { public void onEnable() { name = this.getDescription().getName(); version = this.getDescription().getVersion(); + pm = getServer().getPluginManager(); - WarpSettings.initialize(getDataFolder()); + WarpSettings.initialize(this); libCheck(); if(!sqlCheck()) { return; } + File newDatabase = new File(getDataFolder(), "warps.db"); + File oldDatabase = new File("homes-warps.db"); + if (!newDatabase.exists() && oldDatabase.exists()) { + updateFiles(oldDatabase, newDatabase); + } + Connection conn = ConnectionManager.initialize(); if (conn == null) { - log.log(Level.SEVERE, "[MYWARP] Could not establish SQL connection. Disabling MyWarp"); + WarpLogger.severe("Could not establish SQL connection. Disabling MyWarp"); getServer().getPluginManager().disablePlugin(this); return; } warpList = new WarpList(getServer()); - blockListener = new MWBlockListener(warpList); - playerListener = new MWPlayerListener(warpList); + warpPermissions = new WarpPermissions(this); + blockListener = new MWBlockListener(this); + playerListener = new MWPlayerListener(this); - WarpPermissions.initialize(getServer()); - WarpHelp.initialize(this); + pm.registerEvents(blockListener, this); + pm.registerEvents(playerListener, this); + + commandHandler = new CommandHandler(this); - getServer().getPluginManager().registerEvent(Type.PLAYER_CHAT, playerListener, Priority.Monitor, this); - getServer().getPluginManager().registerEvent(Type.PLAYER_INTERACT, playerListener, Priority.Monitor, this); - getServer().getPluginManager().registerEvent(Type.SIGN_CHANGE, blockListener, Priority.Monitor, this); - if(WarpSettings.loadChunks) { - // We dont need to register for teleporting if we dont want to load chunks. - getServer().getPluginManager().registerEvent(Event.Type.PLAYER_TELEPORT, playerListener, Priority.Monitor, this); - } + // basic commands + commandHandler.addCommand(new CreateCommand(this)); + commandHandler.addCommand(new CreatePrivateCommand(this)); + commandHandler.addCommand(new DeleteCommand(this)); + commandHandler.addCommand(new ListCommand(this)); + commandHandler.addCommand(new ListAllCommand(this)); + commandHandler.addCommand(new PointCommand(this)); + commandHandler.addCommand(new SearchCommand(this)); + commandHandler.addCommand(new WelcomeCommand(this)); + commandHandler.addCommand(new WarpToCommand(this)); + + // social commands + commandHandler.addCommand(new GiveCommand(this)); + commandHandler.addCommand(new InviteCommand(this)); + commandHandler.addCommand(new PrivateCommand(this)); + commandHandler.addCommand(new PublicCommand(this)); + commandHandler.addCommand(new UninviteCommand(this)); + + // help command + commandHandler.addCommand(new HelpCommand(this)); + + // admin commands + commandHandler.addCommand(new AdminWarpToCommand(this)); + commandHandler.addCommand(new ReloadCommand(this)); WarpLogger.info(name + " " + version + " enabled"); } @@ -140,305 +188,9 @@ private static void copyFile(File fromFile, File toFile) { } } - private boolean warning; - + @Override public boolean onCommand(CommandSender sender, Command command, String commandLabel, String[] args) { - String[] split = args; - String commandName = command.getName().toLowerCase(); - - if (sender instanceof Player) { - Player player = (Player) sender; - if (commandName.equals("warp") || commandName.equals("mywarp") || commandName.equals("mw")) { - /** - * /warp reload - */ - if (split.length == 1 && split[0].equalsIgnoreCase("reload") && WarpPermissions.isAdmin(player)) { - WarpSettings.initialize(getDataFolder()); - player.sendMessage("[MyWarp] Reloading config"); - /** - * /warp list or /warp list # - */ - } else if ((split.length == 1 || (split.length == 2 && isInteger(split[1]))) && split[0].equalsIgnoreCase("list") - && WarpPermissions.list(player)) { - Lister lister = new Lister(warpList); - lister.addPlayer(player); - - if (split.length == 2) { - int page = Integer.parseInt(split[1]); - if (page < 1) { - player.sendMessage(ChatColor.RED + "Page number can't be below 1."); - return true; - } else if (page > lister.getMaxPages(player)) { - player.sendMessage(ChatColor.RED + "There are only " + lister.getMaxPages(player) + " pages of warps"); - return true; - } - lister.setPage(page); - } else { - lister.setPage(1); - } - lister.list(); - - /** - * /warp slist - */ - } else if (split.length == 1 && split[0].equalsIgnoreCase("slist") && WarpPermissions.list(player)) { - warpList.list(player); - /** - * /warp search - */ - } else if (split.length > 1 && split[0].equalsIgnoreCase("search") && WarpPermissions.search(player)) { - String name = ""; - for (int i = 1; i < split.length; i++) { - name += split[i]; - if (i + 1 < split.length) { - name += " "; - } - } - - Searcher searcher = new Searcher(warpList); - searcher.addPlayer(player); - searcher.setQuery(name); - searcher.search(); - /** - * /warp create - */ - } else if (split.length > 1 && (split[0].equalsIgnoreCase("create") || split[0].equalsIgnoreCase("set")) - && (WarpPermissions.publicCreate(player) || WarpPermissions.privateCreate(player))) { - String name = ""; - for (int i = 1; i < split.length; i++) { - name += split[i]; - if (i + 1 < split.length) { - name += " "; - } - } - if (WarpPermissions.publicCreate(player)) { - warpList.addWarp(name, player); - } else { - warpList.addWarpPrivate(name, player); - } - /** - * /warp point - */ - } else if (split.length > 1 && split[0].equalsIgnoreCase("point") && WarpPermissions.compass(player)) { - String name = ""; - for (int i = 1; i < split.length; i++) { - name += split[i]; - if (i + 1 < split.length) { - name += " "; - } - } - warpList.point(name, player); - /** - * /warp pcreate - */ - } else if (split.length > 1 && split[0].equalsIgnoreCase("pcreate") && WarpPermissions.privateCreate(player)) { - String name = ""; - for (int i = 1; i < split.length; i++) { - name += split[i]; - if (i + 1 < split.length) { - name += " "; - } - } - - warpList.addWarpPrivate(name, player); - /** - * /warp delete - */ - } else if (split.length > 1 && split[0].equalsIgnoreCase("delete") && WarpPermissions.delete(player)) { - String name = ""; - for (int i = 1; i < split.length; i++) { - name += split[i]; - if (i + 1 < split.length) { - name += " "; - } - } - - warpList.deleteWarp(name, player); - /** - * /warp welcome - */ - } else if (split.length > 1 && split[0].equalsIgnoreCase("welcome") && WarpPermissions.welcome(player)) { - String name = ""; - for (int i = 1; i < split.length; i++) { - name += split[i]; - if (i + 1 < split.length) { - name += " "; - } - } - - warpList.welcomeMessage(name, player); - /** - * /warp private - */ - } else if (split.length > 1 && split[0].equalsIgnoreCase("private") && WarpPermissions.canPrivate(player)) { - String name = ""; - for (int i = 1; i < split.length; i++) { - name += split[i]; - if (i + 1 < split.length) { - name += " "; - } - } - - warpList.privatize(name, player); - /** - * /warp public - */ - } else if (split.length > 1 && split[0].equalsIgnoreCase("public") && WarpPermissions.canPublic(player)) { - String name = ""; - for (int i = 1; i < split.length; i++) { - name += split[i]; - if (i + 1 < split.length) { - name += " "; - } - } - - warpList.publicize(name, player); - - /** - * /warp give - */ - } else if (split.length > 2 && split[0].equalsIgnoreCase("give") && WarpPermissions.give(player)) { - Player givee = getServer().getPlayer(split[1]); - // TODO Change to matchPlayer - String giveeName = (givee == null) ? split[1] : givee.getName(); - - String name = ""; - for (int i = 2; i < split.length; i++) { - name += split[i]; - if (i + 1 < split.length) { - name += " "; - } - } - - warpList.give(name, player, giveeName); - - /** - * /warp invite - */ - } else if (split.length > 2 && split[0].equalsIgnoreCase("invite") && WarpPermissions.invite(player)) { - Player invitee = getServer().getPlayer(split[1]); - // TODO Change to matchPlayer - String inviteeName = (invitee == null) ? split[1] : invitee.getName(); - - String name = ""; - for (int i = 2; i < split.length; i++) { - name += split[i]; - if (i + 1 < split.length) { - name += " "; - } - } - - warpList.invite(name, player, inviteeName); - /** - * /warp uninvite - */ - } else if (split.length > 2 && split[0].equalsIgnoreCase("uninvite") && WarpPermissions.uninvite(player)) { - Player invitee = getServer().getPlayer(split[1]); - String inviteeName = (invitee == null) ? split[1] : invitee.getName(); - - String name = ""; - for (int i = 2; i < split.length; i++) { - name += split[i]; - if (i + 1 < split.length) { - name += " "; - } - } - - warpList.uninvite(name, player, inviteeName); - - /** - * /warp player - */ - } else if (split.length > 2 && split[0].equalsIgnoreCase("player") && WarpPermissions.isAdmin(player)) { - Player invitee = getServer().getPlayer(split[1]); - //String inviteeName = (invitee == null) ? split[1] : invitee.getName(); - - // TODO ChunkLoading - String name = ""; - for (int i = 2; i < split.length; i++) { - name += split[i]; - if (i + 1 < split.length) { - name += " "; - } - } - warpList.adminWarpTo(name, invitee, player); - - /** - * /warp help - */ - } else if (split.length == 1 && split[0].equalsIgnoreCase("help")) { - ArrayList messages = new ArrayList(); - messages.add(ChatColor.RED + "-------------------- " + ChatColor.WHITE + "/WARP HELP" + ChatColor.RED + " --------------------"); - if (WarpPermissions.warp(player)) { - messages.add(ChatColor.RED + "/warp [name]" + ChatColor.WHITE + " - Warp to " + ChatColor.GRAY + "[name]"); - } - if (WarpPermissions.publicCreate(player) || WarpPermissions.privateCreate(player)) { - messages.add(ChatColor.RED + "/warp create [name]" + ChatColor.WHITE + " - Create warp " + ChatColor.GRAY + "[name]"); - } - if (WarpPermissions.privateCreate(player)) { - messages.add(ChatColor.RED + "/warp pcreate [name]" + ChatColor.WHITE + " - Create warp " + ChatColor.GRAY + "[name]"); - } - - if (WarpPermissions.delete(player)) { - messages.add(ChatColor.RED + "/warp delete [name]" + ChatColor.WHITE + " - Delete warp " + ChatColor.GRAY + "[name]"); - } - - if (WarpPermissions.welcome(player)) { - messages.add(ChatColor.RED + "/warp welcome [name]" + ChatColor.WHITE + " - Change the welcome message of " + ChatColor.GRAY - + "[name]"); - } - - if (WarpPermissions.list(player)) { - messages.add(ChatColor.RED + "/warp list (#)" + ChatColor.WHITE + " - Views warp page " + ChatColor.GRAY + "(#)"); - } - - if (WarpPermissions.search(player)) { - messages.add(ChatColor.RED + "/warp search [query]" + ChatColor.WHITE + " - Search for " + ChatColor.GRAY + "[query]"); - } - if (WarpPermissions.give(player)) { - messages.add(ChatColor.RED + "/warp give [player] [name[" + ChatColor.WHITE + " - Give " + ChatColor.GRAY + "[player]" - + ChatColor.WHITE + " your " + ChatColor.GRAY + "[name]"); - } - if (WarpPermissions.invite(player)) { - messages.add(ChatColor.RED + "/warp invite [player] [name]" + ChatColor.WHITE + " - Invite " + ChatColor.GRAY + "[player]" - + ChatColor.WHITE + " to " + ChatColor.GRAY + "[name]"); - } - if (WarpPermissions.uninvite(player)) { - messages.add(ChatColor.RED + "/warp uninvite [player] [name[" + ChatColor.WHITE + " - Uninvite " + ChatColor.GRAY + "[player]" - + ChatColor.WHITE + " to " + ChatColor.GRAY + "[name]"); - } - if (WarpPermissions.canPublic(player)) { - messages.add(ChatColor.RED + "/warp public [name]" + ChatColor.WHITE + " - Makes warp " + ChatColor.GRAY + "[name]" + ChatColor.WHITE - + " public"); - } - if (WarpPermissions.canPrivate(player)) { - messages.add(ChatColor.RED + "/warp private [name]" + ChatColor.WHITE + " - Makes warp " + ChatColor.GRAY + "[name]" - + ChatColor.WHITE + " private"); - } - for (String message : messages) { - player.sendMessage(message); - } - - /** - * /warp - */ - } else if (split.length > 0 && WarpPermissions.warp(player)) { - // TODO ChunkLoading - String name = ""; - for (int i = 0; i < split.length; i++) { - name += split[i]; - if (i + 1 < split.length) { - name += " "; - } - } - warpList.warpTo(name, player); - } else { - return false; - } - return true; - } - } - return false; + return commandHandler.dispatch(sender, command, commandLabel, args); } public static boolean isInteger(String string) { @@ -449,13 +201,16 @@ public static boolean isInteger(String string) { } return true; } - - public static void severe(String string, Exception ex) { - log.log(Level.SEVERE, "[MYHOME]" + string, ex); - + + public static WarpPermissions getWarpPermissions() { + return warpPermissions; } - - public static void severe(String string) { - log.log(Level.SEVERE, "[MYHOME]" + string); + + public WarpList getWarpList() { + return warpList; + } + + public CommandHandler getCommandHandler() { + return commandHandler; } } diff --git a/src/main/java/me/taylorkelly/mywarp/WarpHelp.java b/src/main/java/me/taylorkelly/mywarp/WarpHelp.java deleted file mode 100644 index 4e2382c133..0000000000 --- a/src/main/java/me/taylorkelly/mywarp/WarpHelp.java +++ /dev/null @@ -1,38 +0,0 @@ -package me.taylorkelly.mywarp; - -import java.util.logging.Level; -import java.util.logging.Logger; -import me.taylorkelly.help.Help; -import org.bukkit.plugin.Plugin; - -class WarpHelp { - - public static void initialize(Plugin plugin) { - Plugin test = plugin.getServer().getPluginManager().getPlugin("Help"); - if (test != null) { - Logger log = Logger.getLogger("Minecraft"); - Help helpPlugin = ((Help) test); - helpPlugin.registerCommand("warp help", "Help for all /warp commands", plugin, true); - helpPlugin.registerCommand("warp [name]", "Warp to [name]", plugin, "mywarp.warp.basic.warp"); - helpPlugin.registerCommand("warp [player] [name]", "Warp [player] to [name]", plugin, "mywarp.admin"); - helpPlugin.registerCommand("warp create [name]", "Create a new warp called [name]", plugin, "mywarp.warp.basic.createpublic", "mywarp.warp.basic.createprivate"); - helpPlugin.registerCommand("warp pcreate [name]", "Create a new private warp called [name]", plugin, "mywarp.warp.basic.createprivate"); - helpPlugin.registerCommand("warp delete [name]", "Deletes the warp [name]", plugin, "mywarp.warp.basic.delete"); - helpPlugin.registerCommand("warp welcome [name]", "Change the welcome message for [name]", plugin, "mywarp.warp.basic.welcome"); - helpPlugin.registerCommand("warp point [name]", "Point your compass to [name]", plugin, "mywarp.warp.basic.compass"); - helpPlugin.registerCommand("warp list (#)", "List the warps you can visit", plugin, "mywarp.warp.basic.list"); - helpPlugin.registerCommand("warp search [query]", "Searches for warps related to [query]", plugin, "mywarp.warp.basic.search"); - helpPlugin.registerCommand("warp give [player] [name]", "Give your warp [name] to [player]", plugin, "mywarp.warp.soc.give"); - helpPlugin.registerCommand("warp invite [player] [name]", "Invite [player] to [name]", plugin, "mywarp.warp.soc.invite"); - helpPlugin.registerCommand("warp uninvite [player] [name]", "Uninvite [player] from [name]", plugin, "mywarp.warp.soc.uninvite"); - helpPlugin.registerCommand("warp public [name]", "Make [name] a public warp", plugin, "mywarp.warp.soc.public"); - helpPlugin.registerCommand("warp private [name]", "Make [name] a private warp", plugin, "mywarp.warp.soc.private"); - helpPlugin.registerCommand("warp convert", "Converts your warps from warps.txt", plugin, "mywarp.admin"); - - log.log(Level.INFO, "[MYWARP] 'Help' support enabled."); - } else { - Logger log = Logger.getLogger("Minecraft"); - log.log(Level.WARNING, "[MYWARP] 'Help' isn't detected. No /help support."); - } - } -} diff --git a/src/main/java/me/taylorkelly/mywarp/WarpPermissions.java b/src/main/java/me/taylorkelly/mywarp/WarpPermissions.java deleted file mode 100644 index f4c02d3dda..0000000000 --- a/src/main/java/me/taylorkelly/mywarp/WarpPermissions.java +++ /dev/null @@ -1,140 +0,0 @@ -package me.taylorkelly.mywarp; - -import ru.tehkode.permissions.bukkit.PermissionsEx; -import com.nijikokun.bukkit.Permissions.Permissions; -import org.anjocaido.groupmanager.GroupManager; - -import me.taylorkelly.mywarp.WarpLogger; - -import org.bukkit.Server; -import org.bukkit.entity.Player; -import org.bukkit.plugin.Plugin; - -public class WarpPermissions { - - private enum PermissionHandler { - PERMISSIONSEX, PERMISSIONS, PERMISSIONS3, GROUPMANAGER, NONE - } - private static PermissionHandler handler; - private static Plugin permissionPlugin; - - public static void initialize(Server server) { - Plugin permissionsEx = server.getPluginManager().getPlugin("PermissionsEx"); - Plugin groupManager = server.getPluginManager().getPlugin("GroupManager"); - Plugin permissions = server.getPluginManager().getPlugin("Permissions"); - - if (permissionsEx != null) { - permissionPlugin = permissionsEx; - handler = PermissionHandler.PERMISSIONSEX; - String version = permissionsEx.getDescription().getVersion(); - WarpLogger.info("Permissions enabled using: PermissionsEx v" + version); - } else if (groupManager != null) { - permissionPlugin = groupManager; - handler = PermissionHandler.GROUPMANAGER; - String version = groupManager.getDescription().getVersion(); - WarpLogger.info("Permissions enabled using: GroupManager v" + version); - } else if (permissions != null) { - permissionPlugin = permissions; - String version = permissions.getDescription().getVersion(); - if (version.contains("3.")) { - handler = PermissionHandler.PERMISSIONS3; - } else { - handler = PermissionHandler.PERMISSIONS; - } - WarpLogger.info("Permissions enabled using: Permissions v" + version); - } else { - handler = PermissionHandler.NONE; - WarpLogger.warning("A permission plugin isn't loaded."); - } - } - - public static boolean permission(Player player, String permission, boolean defaultPerm) { - switch (handler) { - case PERMISSIONSEX: - return ((PermissionsEx) permissionPlugin).getPermissionManager().has(player, permission); - case PERMISSIONS3: - return ((Permissions) permissionPlugin).getHandler().has(player, permission); - case PERMISSIONS: - return ((Permissions) permissionPlugin).getHandler().has(player, permission); - case GROUPMANAGER: - return ((GroupManager) permissionPlugin).getWorldsHolder().getWorldPermissions(player).has(player, permission); - case NONE: - return defaultPerm; - default: - return defaultPerm; - } - } - - - public static boolean isAdmin(Player player) { - return permission(player, "mywarp.admin", player.isOp()); - } - - public static boolean warp(Player player) { - return permission(player, "mywarp.warp.basic.warp", true); - } - - public static boolean delete(Player player) { - return permission(player, "mywarp.warp.basic.delete", true); - } - - public static boolean list(Player player) { - return permission(player, "mywarp.warp.basic.list", true); - } - - public static boolean welcome(Player player) { - return permission(player, "mywarp.warp.basic.welcome", true); - } - - public static boolean search(Player player) { - return permission(player, "mywarp.warp.basic.search", true); - } - - public static boolean give(Player player) { - return permission(player, "mywarp.warp.soc.give", true); - } - - public static boolean invite(Player player) { - return permission(player, "mywarp.warp.soc.invite", true); - } - - public static boolean uninvite(Player player) { - return permission(player, "mywarp.warp.soc.uninvite", true); - } - - public static boolean canPublic(Player player) { - return permission(player, "mywarp.warp.soc.public", true); - } - - public static boolean canPrivate(Player player) { - return permission(player, "mywarp.warp.soc.private", true); - } - - public static boolean signWarp(Player player) { - return permission(player, "mywarp.warp.sign.warp", true); - } - - public static boolean privateCreate(Player player) { - return permission(player, "mywarp.warp.basic.createprivate", true); - } - - public static boolean publicCreate(Player player) { - return permission(player, "mywarp.warp.basic.createpublic", true); - } - - public static boolean compass(Player player) { - return permission(player, "mywarp.warp.basic.compass", true); - } - - public static int maxPrivateWarps(Player player) { - return WarpSettings.maxPrivate; - } - - public static int maxPublicWarps(Player player) { - return WarpSettings.maxPublic; - } - - static boolean createSignWarp(Player player) { - return permission(player, "mywarp.warp.sign.create", true); - } -} diff --git a/src/main/java/me/taylorkelly/mywarp/WarpSettings.java b/src/main/java/me/taylorkelly/mywarp/WarpSettings.java index b24d4b5e22..88b122fd3b 100644 --- a/src/main/java/me/taylorkelly/mywarp/WarpSettings.java +++ b/src/main/java/me/taylorkelly/mywarp/WarpSettings.java @@ -1,12 +1,23 @@ package me.taylorkelly.mywarp; import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; + +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; + +import me.taylorkelly.mywarp.utils.PropertiesFile; +import me.taylorkelly.mywarp.utils.WarpLogger; public class WarpSettings { + private static final String CONFIG_FILE = "config.yml"; private static final String settingsFile = "MyWarp.settings"; public static File dataDir; + public static int maxTotal; public static int maxPublic; public static int maxPrivate; public static boolean adminsObeyLimits; @@ -18,26 +29,95 @@ public class WarpSettings { public static String mySQLpass; public static String mySQLconn; - public static void initialize(File dataFolder) { - if(!dataFolder.exists()) { - dataFolder.mkdirs(); - } + public static boolean opPermissions; + private static FileConfiguration config; + private static File configFile; + private static MyWarp plugin; + + public static void initialize(MyWarp plugin) { + WarpSettings.plugin = plugin; + dataDir = plugin.getDataFolder(); + configFile = new File(dataDir, CONFIG_FILE); + config = getConfig(configFile); + + File oldConfigFile = new File(dataDir, settingsFile); + if (oldConfigFile.exists()) { + PropertiesFile file = new PropertiesFile(oldConfigFile); - File configFile = new File(dataFolder, settingsFile); - PropertiesFile file = new PropertiesFile(configFile); - dataDir = dataFolder; + config.set("maxTotal", file.getInt("maxTotal", 15, "Maximum number of warps any player can make")); + config.set("maxPublic", file.getInt("maxPublic", 5, "Maximum number of public warps any player can make")); + config.set("maxPrivate", file.getInt("maxPrivate", 10, "Maximum number of private warps any player can make")); + config.set("adminsObeyLimits", file.getBoolean("adminsObeyLimits", false, "Whether or not admins can disobey warp limits")); + config.set("adminPrivateWarps", file.getBoolean("adminPrivateWarps", true, "Whether or not admins can see private warps in their list")); + config.set("loadChunks", file.getBoolean("loadChunks", false, "Force sending of the chunk which people teleport to - default: false")); + + config.set("usemySQL", file.getBoolean("usemySQL", false, "MySQL usage -- true = use MySQL database / false = use SQLite")); + config.set("mySQLconn", file.getString("mySQLconn", "jdbc:mysql://localhost:3306/minecraft", "MySQL Connection (only if using MySQL)")); + config.set("mySQLuname", file.getString("mySQLuname", "root", "MySQL Username (only if using MySQL)")); + config.set("mySQLpass", file.getString("mySQLpass", "password", "MySQL Password (only if using MySQL)")); + + config.set("opPermissions", file.getBoolean("opPermissions", true, "Enable OP permissions with SuperPerms")); + + try { + config.save(configFile); + if (!oldConfigFile.renameTo(new File(dataDir, settingsFile + ".old"))) { + WarpLogger.warning("Could not rename old settings file"); + } + else { + WarpLogger.info("Successfully ported old settings file"); + } + } + catch (IOException e) { + WarpLogger.severe("Failed to port old settings file", e); + } + } + + maxTotal = config.getInt("maxTotal"); + maxPublic = config.getInt("maxPublic"); + maxPrivate = config.getInt("maxPrivate"); + adminsObeyLimits = config.getBoolean("adminsObeyLimits"); + adminPrivateWarps = config.getBoolean("adminPrivateWarps"); + loadChunks = config.getBoolean("loadChunks"); - maxPublic = file.getInt("maxPublic", 5, "Maximum number of public warps any player can make"); - maxPrivate = file.getInt("maxPrivate", 10, "Maximum number of private warps any player can make"); - adminsObeyLimits = file.getBoolean("adminsObeyLimits", false, "Whether or not admins can disobey warp limits"); - adminPrivateWarps = file.getBoolean("adminPrivateWarps", true, "Whether or not admins can see private warps in their list"); - loadChunks = file.getBoolean("loadChunks", false, "Force sending of the chunk which people teleport to - default: false"); + usemySQL = config.getBoolean("usemySQL"); + mySQLconn = config.getString("mySQLconn"); + mySQLuname = config.getString("mySQLuname"); + mySQLpass = config.getString("mySQLpass"); - usemySQL = file.getBoolean("usemySQL", false, "MySQL usage -- true = use MySQL database / false = use SQLite"); - mySQLconn = file.getString("mySQLconn", "jdbc:mysql://localhost:3306/minecraft", "MySQL Connection (only if using MySQL)"); - mySQLuname = file.getString("mySQLuname", "root", "MySQL Username (only if using MySQL)"); - mySQLpass = file.getString("mySQLpass", "password", "MySQL Password (only if using MySQL)"); - - file.save(); + opPermissions = config.getBoolean("opPermissions"); + } + + private static FileConfiguration getConfig(File file) + { + FileConfiguration config = null; + + try { + if (!file.exists()) { + file.getParentFile().mkdir(); + file.createNewFile(); + InputStream inputStream = plugin.getResource(file.getName()); + FileOutputStream outputStream = new FileOutputStream(file); + + byte[] buffer = new byte[8192]; + int length = 0; + while ((length = inputStream.read(buffer)) > 0) { + outputStream.write(buffer, 0, length); + } + + inputStream.close(); + outputStream.close(); + + WarpLogger.info("Default config created successfully!"); + } + + config = plugin.getConfig(); + config.setDefaults(YamlConfiguration.loadConfiguration(plugin.getResource(file.getName()))); + config.options().copyDefaults(true); + } + catch (Exception e) { + WarpLogger.warning("Default config could not be created!"); + } + + return config; } } diff --git a/src/main/java/me/taylorkelly/mywarp/commands/AdminWarpToCommand.java b/src/main/java/me/taylorkelly/mywarp/commands/AdminWarpToCommand.java new file mode 100644 index 0000000000..1d7de1f2be --- /dev/null +++ b/src/main/java/me/taylorkelly/mywarp/commands/AdminWarpToCommand.java @@ -0,0 +1,41 @@ +package me.taylorkelly.mywarp.commands; + +import java.util.Arrays; + +import me.taylorkelly.mywarp.MyWarp; + +import org.apache.commons.lang.StringUtils; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +public class AdminWarpToCommand extends BasicCommand implements Command +{ + private MyWarp plugin; + + public AdminWarpToCommand(MyWarp plugin) + { + super("WarpPlayer"); + this.plugin = plugin; + setDescription("Warp §8§e to §9"); + setUsage("/warp player §8 §9"); + setArgumentRange(2, 255); + setIdentifiers("player"); + setPermission("mywarp.admin"); + } + + @Override + public boolean execute(CommandSender executor, String identifier, String[] args) + { + if (executor instanceof Player) { + Player invitee = plugin.getServer().getPlayer(args[0]); + // String inviteeName = (invitee == null) ? args[0] : invitee.getName(); + + // TODO ChunkLoading + plugin.getWarpList().adminWarpTo(StringUtils.join(Arrays.asList(args).subList(1, args.length), ' '), invitee, (Player) executor); + } + else { + executor.sendMessage("Console cannot warp players to locations!"); + } + return true; + } +} diff --git a/src/main/java/me/taylorkelly/mywarp/commands/BasicCommand.java b/src/main/java/me/taylorkelly/mywarp/commands/BasicCommand.java new file mode 100644 index 0000000000..44049e8ee5 --- /dev/null +++ b/src/main/java/me/taylorkelly/mywarp/commands/BasicCommand.java @@ -0,0 +1,112 @@ +package me.taylorkelly.mywarp.commands; + +import org.bukkit.command.CommandSender; + +public abstract class BasicCommand implements Command { + + private String name; + private String description = ""; + private String usage = ""; + private String permission = ""; + private String[] notes = new String[0]; + private String[] identifiers = new String[0]; + private int minArguments = 0; + private int maxArguments = 0; + + public BasicCommand(String name) { + this.name = name; + } + + @Override + public void cancelInteraction(CommandSender executor) {} + + @Override + public String getDescription() { + return description; + } + + @Override + public String[] getIdentifiers() { + return identifiers; + } + + @Override + public int getMaxArguments() { + return maxArguments; + } + + @Override + public int getMinArguments() { + return minArguments; + } + + @Override + public String getName() { + return name; + } + + @Override + public String[] getNotes() { + return notes; + } + + @Override + public String getPermission() { + return permission; + } + + @Override + public String getUsage() { + return usage; + } + + @Override + public boolean isIdentifier(CommandSender executor, String input) { + for (String identifier : identifiers) { + if (input.equalsIgnoreCase(identifier)) + return true; + } + return false; + } + + @Override + public boolean isInProgress(CommandSender executor) { + return false; + } + + @Override + public boolean isInteractive() { + return false; + } + + @Override + public boolean isShownOnHelpMenu() { + return true; + } + + public void setArgumentRange(int min, int max) { + this.minArguments = min; + this.maxArguments = max; + } + + public void setDescription(String description) { + this.description = description; + } + + public void setIdentifiers(String... identifiers) { + this.identifiers = identifiers; + } + + public void setNotes(String... notes) { + this.notes = notes; + } + + public void setPermission(String permission) { + this.permission = permission; + } + + public void setUsage(String usage) { + this.usage = usage; + } + +} diff --git a/src/main/java/me/taylorkelly/mywarp/commands/Command.java b/src/main/java/me/taylorkelly/mywarp/commands/Command.java new file mode 100644 index 0000000000..306e4af26e --- /dev/null +++ b/src/main/java/me/taylorkelly/mywarp/commands/Command.java @@ -0,0 +1,35 @@ +package me.taylorkelly.mywarp.commands; + +import org.bukkit.command.CommandSender; + +public interface Command { + + public void cancelInteraction(CommandSender executor); + + public boolean execute(CommandSender executor, String identifier, String[] args); + + public String getDescription(); + + public String[] getIdentifiers(); + + public int getMaxArguments(); + + public int getMinArguments(); + + public String getName(); + + public String[] getNotes(); + + public String getPermission(); + + public String getUsage(); + + public boolean isIdentifier(CommandSender executor, String input); + + public boolean isInProgress(CommandSender executor); + + public boolean isInteractive(); + + public boolean isShownOnHelpMenu(); + +} diff --git a/src/main/java/me/taylorkelly/mywarp/commands/CommandHandler.java b/src/main/java/me/taylorkelly/mywarp/commands/CommandHandler.java new file mode 100644 index 0000000000..05ed9bd4bd --- /dev/null +++ b/src/main/java/me/taylorkelly/mywarp/commands/CommandHandler.java @@ -0,0 +1,119 @@ +/** + * Copyright (C) 2011 DThielke + * + * This work is licensed under the Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License. + * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/ or send a letter to + * Creative Commons, 171 Second Street, Suite 300, San Francisco, California, 94105, USA. + **/ + +package me.taylorkelly.mywarp.commands; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import me.taylorkelly.mywarp.MyWarp; +import me.taylorkelly.mywarp.permissions.WarpPermissions; + +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +public class CommandHandler { + + private WarpPermissions warpPermissions; + protected Map commands; + + public CommandHandler(MyWarp plugin) { + warpPermissions = MyWarp.getWarpPermissions(); + commands = new LinkedHashMap(); + } + + public void addCommand(Command command) { + commands.put(command.getName().toLowerCase(), command); + } + + public void removeCommand(Command command) { + commands.remove(command.getName().toLowerCase()); + } + + public Command getCommand(String name) { + return commands.get(name.toLowerCase()); + } + + public List getCommands() { + return new ArrayList(commands.values()); + } + + public boolean dispatch(CommandSender sender, org.bukkit.command.Command command, String label, String[] args) { + + String[] arguments; + if (args.length < 1) { + arguments = new String[] { "help" }; + } else { + arguments = args; + } + + for (int argsIncluded = arguments.length; argsIncluded >= 0; argsIncluded--) { + StringBuilder identifierBuilder = new StringBuilder(); + for (int i = 0; i < argsIncluded; i++) { + identifierBuilder.append(' ').append(arguments[i]); + } + + String identifier = identifierBuilder.toString().trim(); + if (identifier.isEmpty()) { + identifier = "warp"; + } + + for (Command cmd : commands.values()) { + if (cmd.isIdentifier(sender, identifier)) { + String[] realArgs = Arrays.copyOfRange(arguments, argsIncluded, arguments.length); + + if (!cmd.isInProgress(sender)) { + if (realArgs.length < cmd.getMinArguments() || realArgs.length > cmd.getMaxArguments()) { + displayCommandHelp(cmd, sender); + return true; + } else if (realArgs.length > 0 && "?".equals(realArgs[0])) { + displayCommandHelp(cmd, sender); + return true; + } + } + + if (!hasPermission(sender, cmd.getPermission())) { + sender.sendMessage("Insufficient permission."); + return true; + } + + cmd.execute(sender, identifier, realArgs); + return true; + } + } + } + + return true; + } + + private void displayCommandHelp(Command cmd, CommandSender sender) { + sender.sendMessage("§cCommand:§e " + cmd.getName()); + sender.sendMessage("§cDescription:§e " + cmd.getDescription()); + sender.sendMessage("§cUsage:§e " + cmd.getUsage()); + if (cmd.getNotes() != null) { + for (String note : cmd.getNotes()) { + sender.sendMessage("§e" + note); + } + } + } + + public boolean hasPermission(CommandSender sender, String permString) { + if (!(sender instanceof Player) || permString == null || permString.isEmpty()) { + return true; + } + + Player player = (Player) sender; + if (warpPermissions != null) { + return warpPermissions.hasPermission(player, permString, false); + } + return player.hasPermission(permString); + } +} diff --git a/src/main/java/me/taylorkelly/mywarp/commands/CreateCommand.java b/src/main/java/me/taylorkelly/mywarp/commands/CreateCommand.java new file mode 100644 index 0000000000..ab09cd4686 --- /dev/null +++ b/src/main/java/me/taylorkelly/mywarp/commands/CreateCommand.java @@ -0,0 +1,36 @@ +package me.taylorkelly.mywarp.commands; + +import me.taylorkelly.mywarp.MyWarp; + +import org.apache.commons.lang.StringUtils; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +public class CreateCommand extends BasicCommand implements Command +{ + private MyWarp plugin; + + public CreateCommand(MyWarp plugin) + { + super("Create"); + this.plugin = plugin; + setDescription("Create a new warp called §9"); + setUsage("/warp create|set §9"); + setArgumentRange(1, 255); + setIdentifiers("create", "set"); + setPermission("mywarp.warp.basic.createpublic"); + } + + @Override + public boolean execute(CommandSender executor, String identifier, String[] args) + { + if (executor instanceof Player) { + plugin.getWarpList().addWarp(StringUtils.join(args, ' '), (Player) executor); + } + else { + executor.sendMessage("Console cannot create warps for themselves!"); + } + + return true; + } +} diff --git a/src/main/java/me/taylorkelly/mywarp/commands/CreatePrivateCommand.java b/src/main/java/me/taylorkelly/mywarp/commands/CreatePrivateCommand.java new file mode 100644 index 0000000000..56c1168c66 --- /dev/null +++ b/src/main/java/me/taylorkelly/mywarp/commands/CreatePrivateCommand.java @@ -0,0 +1,36 @@ +package me.taylorkelly.mywarp.commands; + +import me.taylorkelly.mywarp.MyWarp; + +import org.apache.commons.lang.StringUtils; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +public class CreatePrivateCommand extends BasicCommand implements Command +{ + private MyWarp plugin; + + public CreatePrivateCommand(MyWarp plugin) + { + super("pcreate"); + this.plugin = plugin; + setDescription("Create a new private warp called §9"); + setUsage("/warp pcreate §9"); + setArgumentRange(1, 255); + setIdentifiers("pcreate"); + setPermission("mywarp.warp.basic.createprivate"); + } + + @Override + public boolean execute(CommandSender executor, String identifier, String[] args) + { + if (executor instanceof Player) { + plugin.getWarpList().addWarpPrivate(StringUtils.join(args, ' '), (Player) executor); + } + else { + executor.sendMessage("Console cannot create private warps for themselves!"); + } + + return true; + } +} diff --git a/src/main/java/me/taylorkelly/mywarp/commands/DeleteCommand.java b/src/main/java/me/taylorkelly/mywarp/commands/DeleteCommand.java new file mode 100644 index 0000000000..f52071e951 --- /dev/null +++ b/src/main/java/me/taylorkelly/mywarp/commands/DeleteCommand.java @@ -0,0 +1,36 @@ +package me.taylorkelly.mywarp.commands; + +import me.taylorkelly.mywarp.MyWarp; + +import org.apache.commons.lang.StringUtils; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +public class DeleteCommand extends BasicCommand implements Command +{ + private MyWarp plugin; + + public DeleteCommand(MyWarp plugin) + { + super("Delete"); + this.plugin = plugin; + setDescription("Deletes the warp §9"); + setUsage("/warp delete §9"); + setArgumentRange(1, 255); + setIdentifiers("delete", "remove"); + setPermission("mywarp.warp.basic.delete"); + } + + @Override + public boolean execute(CommandSender executor, String identifier, String[] args) + { + if (executor instanceof Player) { + plugin.getWarpList().deleteWarp(StringUtils.join(args, ' '), (Player) executor); + } + else { + executor.sendMessage("Console cannot delete warps for themselves!"); + } + + return true; + } +} diff --git a/src/main/java/me/taylorkelly/mywarp/commands/GiveCommand.java b/src/main/java/me/taylorkelly/mywarp/commands/GiveCommand.java new file mode 100644 index 0000000000..04df2993c9 --- /dev/null +++ b/src/main/java/me/taylorkelly/mywarp/commands/GiveCommand.java @@ -0,0 +1,42 @@ +package me.taylorkelly.mywarp.commands; + +import java.util.Arrays; + +import me.taylorkelly.mywarp.MyWarp; + +import org.apache.commons.lang.StringUtils; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +public class GiveCommand extends BasicCommand implements Command +{ + private MyWarp plugin; + + public GiveCommand(MyWarp plugin) + { + super("Give"); + this.plugin = plugin; + setDescription("Give your warp §9§e to §8"); + setUsage("/warp give §8 §9"); + setArgumentRange(2, 255); + setIdentifiers("give"); + setPermission("mywarp.warp.soc.give"); + } + + @Override + public boolean execute(CommandSender executor, String identifier, String[] args) + { + if (executor instanceof Player) { + Player givee = plugin.getServer().getPlayer(args[0]); + // TODO Change to matchPlayer + String giveeName = (givee == null) ? args[0] : givee.getName(); + + plugin.getWarpList().give(StringUtils.join(Arrays.asList(args).subList(1, args.length), ' '), (Player) executor, giveeName); + } + else { + executor.sendMessage("Console cannot give warps from themselves!"); + } + + return true; + } +} diff --git a/src/main/java/me/taylorkelly/mywarp/commands/HelpCommand.java b/src/main/java/me/taylorkelly/mywarp/commands/HelpCommand.java new file mode 100644 index 0000000000..66f25d1a55 --- /dev/null +++ b/src/main/java/me/taylorkelly/mywarp/commands/HelpCommand.java @@ -0,0 +1,72 @@ +package me.taylorkelly.mywarp.commands; + +import java.util.ArrayList; +import java.util.List; + +import me.taylorkelly.mywarp.MyWarp; + +import org.bukkit.command.CommandSender; + +public class HelpCommand extends BasicCommand implements Command +{ + private static final int CMDS_PER_PAGE = 8; + private MyWarp plugin; + + public HelpCommand(MyWarp plugin) + { + super("Help"); + this.plugin = plugin; + setDescription("Displays the help menu"); + setUsage("/warp help §8[page#]"); + setArgumentRange(0, 1); + setIdentifiers("help"); + } + + @Override + public boolean execute(CommandSender executor, String identifier, String[] args) + { + int page = 0; + if (args.length != 0) { + try { + page = Integer.parseInt(args[0]) - 1; + } + catch (NumberFormatException e) { + } + } + + List sortCommands = plugin.getCommandHandler().getCommands(); + List commands = new ArrayList(); + + // Build list of permitted commands + for (Command command : sortCommands) { + if (command.isShownOnHelpMenu()) { + if (plugin.getCommandHandler().hasPermission(executor, command.getPermission())) { + commands.add(command); + } + } + } + + int numPages = commands.size() / CMDS_PER_PAGE; + if (commands.size() % CMDS_PER_PAGE != 0) { + numPages++; + } + + if (page >= numPages || page < 0) { + page = 0; + } + executor.sendMessage("§c-----[ " + "§fMyWarp Help <" + (page + 1) + "/" + numPages + ">§c ]-----"); + int start = page * CMDS_PER_PAGE; + int end = start + CMDS_PER_PAGE; + if (end > commands.size()) { + end = commands.size(); + } + for (int c = start; c < end; c++) { + Command cmd = commands.get(c); + executor.sendMessage(" §a" + cmd.getUsage()); + } + + executor.sendMessage("§cFor more info on a particular command, type §f/ ?"); + + return true; + } +} diff --git a/src/main/java/me/taylorkelly/mywarp/commands/InviteCommand.java b/src/main/java/me/taylorkelly/mywarp/commands/InviteCommand.java new file mode 100644 index 0000000000..5fb27fa258 --- /dev/null +++ b/src/main/java/me/taylorkelly/mywarp/commands/InviteCommand.java @@ -0,0 +1,42 @@ +package me.taylorkelly.mywarp.commands; + +import java.util.Arrays; + +import me.taylorkelly.mywarp.MyWarp; + +import org.apache.commons.lang.StringUtils; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +public class InviteCommand extends BasicCommand implements Command +{ + private MyWarp plugin; + + public InviteCommand(MyWarp plugin) + { + super("Invite"); + this.plugin = plugin; + setDescription("Invite §8§e to §9"); + setUsage("/warp invite §8 §9"); + setArgumentRange(2, 255); + setIdentifiers("invite"); + setPermission("mywarp.warp.soc.invite"); + } + + @Override + public boolean execute(CommandSender executor, String identifier, String[] args) + { + if (executor instanceof Player) { + Player invitee = plugin.getServer().getPlayer(args[0]); + // TODO Change to matchPlayer + String inviteeName = (invitee == null) ? args[0] : invitee.getName(); + + plugin.getWarpList().invite(StringUtils.join(Arrays.asList(args).subList(1, args.length), ' '), (Player) executor, inviteeName); + } + else { + executor.sendMessage("Console cannot invite warps for themselves!"); + } + + return true; + } +} diff --git a/src/main/java/me/taylorkelly/mywarp/commands/ListAllCommand.java b/src/main/java/me/taylorkelly/mywarp/commands/ListAllCommand.java new file mode 100644 index 0000000000..0dfbee3fb5 --- /dev/null +++ b/src/main/java/me/taylorkelly/mywarp/commands/ListAllCommand.java @@ -0,0 +1,35 @@ +package me.taylorkelly.mywarp.commands; + +import me.taylorkelly.mywarp.MyWarp; + +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +public class ListAllCommand extends BasicCommand implements Command +{ + private MyWarp plugin; + + public ListAllCommand(MyWarp plugin) + { + super("ListAll"); + this.plugin = plugin; + setDescription("List the warps you can visit"); + setUsage("/warp slist"); + setArgumentRange(0, 0); + setIdentifiers("slist"); + setPermission("mywarp.warp.basic.list"); + } + + @Override + public boolean execute(CommandSender executor, String identifier, String[] args) + { + if (executor instanceof Player) { + plugin.getWarpList().list((Player) executor); + } + else { + executor.sendMessage("Console cannot list warps for themselves!"); + } + + return true; + } +} diff --git a/src/main/java/me/taylorkelly/mywarp/commands/ListCommand.java b/src/main/java/me/taylorkelly/mywarp/commands/ListCommand.java new file mode 100644 index 0000000000..5ffcbcec08 --- /dev/null +++ b/src/main/java/me/taylorkelly/mywarp/commands/ListCommand.java @@ -0,0 +1,83 @@ +package me.taylorkelly.mywarp.commands; + +import me.taylorkelly.mywarp.MyWarp; +import me.taylorkelly.mywarp.data.Lister; + +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +public class ListCommand extends BasicCommand implements Command +{ + private MyWarp plugin; + + public ListCommand(MyWarp plugin) + { + super("List"); + this.plugin = plugin; + setDescription("List the warps you can visit"); + setUsage("/warp list §8[owner] §8[page#]"); + setArgumentRange(0, 2); + setIdentifiers("list"); + setPermission("mywarp.warp.basic.list"); + } + + @Override + public boolean execute(CommandSender executor, String identifier, String[] args) + { + if (executor instanceof Player) { + Lister lister = new Lister(plugin.getWarpList()); + lister.addPlayer((Player) executor); + + if (args.length == 0) { + lister.setPage(1); + } else if (args.length == 1) { + if (args[0].matches("-?\\d+(\\.\\d+)?")) { + int page = Integer.parseInt(args[0]); + if (page < 1) { + executor.sendMessage(ChatColor.RED + + "Page number can't be below 1."); + return true; + } else if (page > lister.getMaxPages((Player) executor)) { + executor.sendMessage(ChatColor.RED + "There are only " + + lister.getMaxPages((Player) executor) + + " pages of warps"); + return true; + } + lister.setPage(page); + } else { + if (args[0].equals("own")) { + lister.setWarpCreator(executor.getName()); + } else { + lister.setWarpCreator(args[0]); + } + lister.setPage(1); + } + } else if (args.length == 2) { + String creator; + if (args[0].equals("own")) { + creator = executor.getName(); + } else { + creator = args[0]; + } + lister.setWarpCreator(creator); + int page = Integer.parseInt(args[1]); + if (page < 1) { + executor.sendMessage(ChatColor.RED + "Page number can't be below 1."); + return true; + } else if (page > lister.getMaxPagesPerCreator((Player) executor, creator)) { + executor.sendMessage(ChatColor.RED + "There are only " + + lister.getMaxPagesPerCreator((Player) executor, executor.getName()) + " pages of warps"); + return true; + } + lister.setPage(page); + } else { + return false; + } + lister.list(); + } else { + executor.sendMessage("Console cannot list warps for themselves!"); + } + return true; + } +} diff --git a/src/main/java/me/taylorkelly/mywarp/commands/PointCommand.java b/src/main/java/me/taylorkelly/mywarp/commands/PointCommand.java new file mode 100644 index 0000000000..a9fe87ba5f --- /dev/null +++ b/src/main/java/me/taylorkelly/mywarp/commands/PointCommand.java @@ -0,0 +1,36 @@ +package me.taylorkelly.mywarp.commands; + +import me.taylorkelly.mywarp.MyWarp; + +import org.apache.commons.lang.StringUtils; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +public class PointCommand extends BasicCommand implements Command +{ + private MyWarp plugin; + + public PointCommand(MyWarp plugin) + { + super("Point"); + this.plugin = plugin; + setDescription("Point your compass to §9"); + setUsage("/warp point §9"); + setArgumentRange(1, 255); + setIdentifiers("point"); + setPermission("mywarp.warp.basic.compass"); + } + + @Override + public boolean execute(CommandSender executor, String identifier, String[] args) + { + if (executor instanceof Player) { + plugin.getWarpList().point(StringUtils.join(args, ' '), (Player) executor); + } + else { + executor.sendMessage("Console cannot search warps for themselves!"); + } + + return true; + } +} diff --git a/src/main/java/me/taylorkelly/mywarp/commands/PrivateCommand.java b/src/main/java/me/taylorkelly/mywarp/commands/PrivateCommand.java new file mode 100644 index 0000000000..c1f7587125 --- /dev/null +++ b/src/main/java/me/taylorkelly/mywarp/commands/PrivateCommand.java @@ -0,0 +1,36 @@ +package me.taylorkelly.mywarp.commands; + +import me.taylorkelly.mywarp.MyWarp; + +import org.apache.commons.lang.StringUtils; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +public class PrivateCommand extends BasicCommand implements Command +{ + private MyWarp plugin; + + public PrivateCommand(MyWarp plugin) + { + super("Private"); + this.plugin = plugin; + setDescription("Make §9§e a private warp"); + setUsage("/warp private §9"); + setArgumentRange(1, 255); + setIdentifiers("private"); + setPermission("mywarp.warp.soc.private"); + } + + @Override + public boolean execute(CommandSender executor, String identifier, String[] args) + { + if (executor instanceof Player) { + plugin.getWarpList().privatize(StringUtils.join(args, ' '), (Player) executor); + } + else { + executor.sendMessage("Console cannot make warps private for themselves!"); + } + + return true; + } +} diff --git a/src/main/java/me/taylorkelly/mywarp/commands/PublicCommand.java b/src/main/java/me/taylorkelly/mywarp/commands/PublicCommand.java new file mode 100644 index 0000000000..63582df007 --- /dev/null +++ b/src/main/java/me/taylorkelly/mywarp/commands/PublicCommand.java @@ -0,0 +1,37 @@ +package me.taylorkelly.mywarp.commands; + +import me.taylorkelly.mywarp.MyWarp; + +import org.apache.commons.lang.StringUtils; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +public class PublicCommand extends BasicCommand implements Command +{ + private MyWarp plugin; + + public PublicCommand(MyWarp plugin) + { + super("Public"); + this.plugin = plugin; + setDescription("Make §9§e a public warp"); + setUsage("/warp public §9"); + setArgumentRange(1, 255); + setIdentifiers("public"); + setPermission("mywarp.warp.soc.public"); + } + + @Override + public boolean execute(CommandSender executor, String identifier, String[] args) + { + + if (executor instanceof Player) { + plugin.getWarpList().publicize(StringUtils.join(args, ' '), (Player) executor); + } + else { + executor.sendMessage("Console cannot make warps public for themselves!"); + } + + return true; + } +} diff --git a/src/main/java/me/taylorkelly/mywarp/commands/ReloadCommand.java b/src/main/java/me/taylorkelly/mywarp/commands/ReloadCommand.java new file mode 100644 index 0000000000..ed187ffe25 --- /dev/null +++ b/src/main/java/me/taylorkelly/mywarp/commands/ReloadCommand.java @@ -0,0 +1,32 @@ +package me.taylorkelly.mywarp.commands; + +import me.taylorkelly.mywarp.MyWarp; +import me.taylorkelly.mywarp.WarpSettings; + +import org.bukkit.command.CommandSender; + +public class ReloadCommand extends BasicCommand implements Command +{ + private MyWarp plugin; + + public ReloadCommand(MyWarp plugin) + { + super("Reload"); + this.plugin = plugin; + setDescription("Reload settings"); + setUsage("/warp reload"); + setArgumentRange(0, 0); + setIdentifiers("reload"); + setPermission("mywarp.admin"); + } + + @Override + public boolean execute(CommandSender executor, String identifier, String[] args) + { + WarpSettings.initialize(plugin); + executor.sendMessage("Reloading MyWarp config"); + + return true; + } + +} diff --git a/src/main/java/me/taylorkelly/mywarp/commands/SearchCommand.java b/src/main/java/me/taylorkelly/mywarp/commands/SearchCommand.java new file mode 100644 index 0000000000..b72f94411f --- /dev/null +++ b/src/main/java/me/taylorkelly/mywarp/commands/SearchCommand.java @@ -0,0 +1,41 @@ +package me.taylorkelly.mywarp.commands; + +import me.taylorkelly.mywarp.MyWarp; +import me.taylorkelly.mywarp.data.Searcher; + +import org.apache.commons.lang.StringUtils; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +public class SearchCommand extends BasicCommand implements Command +{ + private MyWarp plugin; + + public SearchCommand(MyWarp plugin) + { + super("Search"); + this.plugin = plugin; + setDescription("Searches for warps related to §9"); + setUsage("/warp search §9"); + setArgumentRange(1, 255); + setIdentifiers("search"); + setPermission("mywarp.warp.basic.search"); + } + + @Override + public boolean execute(CommandSender executor, String identifier, String[] args) + { + if (executor instanceof Player) { + Searcher searcher = new Searcher(plugin.getWarpList()); + searcher.addPlayer((Player) executor); + searcher.setQuery(StringUtils.join(args, ' ')); + searcher.search(); + } + else { + executor.sendMessage("Console cannot search warps for themselves!"); + } + + return true; + } + +} diff --git a/src/main/java/me/taylorkelly/mywarp/commands/UninviteCommand.java b/src/main/java/me/taylorkelly/mywarp/commands/UninviteCommand.java new file mode 100644 index 0000000000..59ec15dddb --- /dev/null +++ b/src/main/java/me/taylorkelly/mywarp/commands/UninviteCommand.java @@ -0,0 +1,41 @@ +package me.taylorkelly.mywarp.commands; + +import java.util.Arrays; + +import me.taylorkelly.mywarp.MyWarp; + +import org.apache.commons.lang.StringUtils; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +public class UninviteCommand extends BasicCommand implements Command +{ + private MyWarp plugin; + + public UninviteCommand(MyWarp plugin) + { + super("Uninvite"); + this.plugin = plugin; + setDescription("Uinvite §8§e from §9"); + setUsage("/warp uninvite §8 §9"); + setArgumentRange(2, 255); + setIdentifiers("uninvite"); + setPermission("mywarp.warp.soc.uninvite"); + } + + @Override + public boolean execute(CommandSender executor, String identifier, String[] args) + { + if (executor instanceof Player) { + Player invitee = plugin.getServer().getPlayer(args[0]); + String inviteeName = (invitee == null) ? args[0] : invitee.getName(); + + plugin.getWarpList().uninvite(StringUtils.join(Arrays.asList(args).subList(1, args.length), ' '), (Player) executor, inviteeName); + } + else { + executor.sendMessage("Console cannot uninvite warps for themselves!"); + } + + return true; + } +} diff --git a/src/main/java/me/taylorkelly/mywarp/commands/WarpToCommand.java b/src/main/java/me/taylorkelly/mywarp/commands/WarpToCommand.java new file mode 100644 index 0000000000..634cb0edf9 --- /dev/null +++ b/src/main/java/me/taylorkelly/mywarp/commands/WarpToCommand.java @@ -0,0 +1,37 @@ +package me.taylorkelly.mywarp.commands; + +import me.taylorkelly.mywarp.MyWarp; + +import org.apache.commons.lang.StringUtils; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +public class WarpToCommand extends BasicCommand implements Command +{ + private MyWarp plugin; + + public WarpToCommand(MyWarp plugin) + { + super("WarpTo"); + this.plugin = plugin; + setDescription("Warp to §9"); + setUsage("/warp §9"); + setArgumentRange(1, 255); + setIdentifiers("warp", "mywarp", "mw"); + setPermission("mywarp.warp.basic.warp"); + } + + @Override + public boolean execute(CommandSender executor, String identifier, String[] args) + { + if (executor instanceof Player) { + plugin.getWarpList().warpTo(StringUtils.join(args, ' '), (Player) executor); + } + else { + executor.sendMessage("Console cannot warp to locations!"); + } + + return true; + } + +} diff --git a/src/main/java/me/taylorkelly/mywarp/commands/WelcomeCommand.java b/src/main/java/me/taylorkelly/mywarp/commands/WelcomeCommand.java new file mode 100644 index 0000000000..6cda6932c3 --- /dev/null +++ b/src/main/java/me/taylorkelly/mywarp/commands/WelcomeCommand.java @@ -0,0 +1,36 @@ +package me.taylorkelly.mywarp.commands; + +import me.taylorkelly.mywarp.MyWarp; + +import org.apache.commons.lang.StringUtils; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +public class WelcomeCommand extends BasicCommand implements Command +{ + private MyWarp plugin; + + public WelcomeCommand(MyWarp plugin) + { + super("Welcome"); + this.plugin = plugin; + setDescription("Change the welcome message of §9"); + setUsage("/warp welcome §9"); + setArgumentRange(1, 255); + setIdentifiers("welcome"); + setPermission("mywarp.warp.basic.welcome"); + } + + @Override + public boolean execute(CommandSender executor, String identifier, String[] args) + { + if (executor instanceof Player) { + plugin.getWarpList().welcomeMessage(StringUtils.join(args, ' '), (Player) executor); + } + else { + executor.sendMessage("Console cannot change warp welcome messages for themselves!"); + } + + return true; + } +} diff --git a/src/main/java/me/taylorkelly/mywarp/data/Lister.java b/src/main/java/me/taylorkelly/mywarp/data/Lister.java new file mode 100644 index 0000000000..4435c2adf6 --- /dev/null +++ b/src/main/java/me/taylorkelly/mywarp/data/Lister.java @@ -0,0 +1,126 @@ +package me.taylorkelly.mywarp.data; + +import java.util.ArrayList; + +import org.angelsl.minecraft.randomshit.fontwidth.MinecraftFontWidthCalculator; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; + + +public class Lister { + private WarpList warpList; + private Player player; + + private int maxPages; + private int page; + private String warpCreator; + + private static final int WARPS_PER_PAGE = 8; + ArrayList sortedWarps; + + public Lister(WarpList warpList) { + this.warpList = warpList; + } + + public void addPlayer(Player player) { + this.player = player; + } + + public void setWarpCreator(String warpCreator){ + this.warpCreator = warpCreator; + } + + public void setPage(int page) { + this.page = page; + int start = (page - 1) * WARPS_PER_PAGE; + if (warpCreator == null) { + sortedWarps = warpList.getSortedWarps(player, start, WARPS_PER_PAGE); + maxPages = (int) Math.ceil(warpList.getMaxWarps(player) + / (double) WARPS_PER_PAGE); + } else { + String matchingWarpCreator = warpList.getMatchingCreator(player, warpCreator); + sortedWarps = warpList.getSortedWarpsPerCreator(player, matchingWarpCreator, start, + WARPS_PER_PAGE); + maxPages = (int) Math.ceil(warpList.getMaxWarpsPerCreator(player, + matchingWarpCreator) / (double) WARPS_PER_PAGE); + } + } + + public void list() { + if (maxPages == 0) { + player.sendMessage("There are no warps to list."); + } else { + String intro = "------------------- Page " + page + "/" + maxPages + + " -------------------"; + player.sendMessage(ChatColor.YELLOW + intro); + for (Warp warp : sortedWarps) { + String name = warp.name; + String creator = (warp.creator.equalsIgnoreCase(player.getName())) ? "you" + : warp.creator; + int x = (int) Math.round(warp.x); + int y = warp.y; + int z = (int) Math.round(warp.z); + String color; + if (warp.playerIsCreator(player.getName())) { + color = ChatColor.AQUA.toString(); + } else if (warp.publicAll) { + color = ChatColor.GREEN.toString(); + } else { + color = ChatColor.RED.toString(); + } + + String location = " @(" + x + ", " + y + ", " + z + ")"; + String creatorString = (warp.publicAll ? "(+)" : "(-)") + " by " + + creator; + + // Find remaining length left + int left = MinecraftFontWidthCalculator.getStringWidth(intro) + - MinecraftFontWidthCalculator.getStringWidth("''" + + creatorString + location); + + int nameLength = MinecraftFontWidthCalculator.getStringWidth(name); + if (left > nameLength) { + name = "'" + name + "'" + ChatColor.WHITE + creatorString + + whitespace(left - nameLength); + } else if (left < nameLength) { + name = "'" + substring(name, left) + "'" + ChatColor.WHITE + + creatorString; + } + + player.sendMessage(color + name + location); + } + } + } + + /** + * Lob shit off that string till it fits. + */ + private String substring(String name, int left) { + while(MinecraftFontWidthCalculator.getStringWidth(name) > left) { + name = name.substring(0, name.length()-1); + } + return name; + } + + public int getMaxPages(Player player) { + return (int) Math.ceil(warpList.getMaxWarps(player) / (double) WARPS_PER_PAGE); + } + + public int getMaxPagesPerCreator(Player player, String warpCreator) { + String matchingWarpCreator = warpList.getMatchingCreator(player, warpCreator); + return (int) Math.ceil(warpList.getMaxWarpsPerCreator(player, matchingWarpCreator) + / (double) WARPS_PER_PAGE); + } + + public String whitespace(int length) { + int spaceWidth = MinecraftFontWidthCalculator.getStringWidth(" "); + + StringBuilder ret = new StringBuilder(); + + for(int i = 0; i < length; i+=spaceWidth) { + ret.append(" "); + } + + return ret.toString(); + } +} diff --git a/src/main/java/me/taylorkelly/mywarp/Searcher.java b/src/main/java/me/taylorkelly/mywarp/data/Searcher.java similarity index 54% rename from src/main/java/me/taylorkelly/mywarp/Searcher.java rename to src/main/java/me/taylorkelly/mywarp/data/Searcher.java index def6afacb8..c2c3458ecb 100644 --- a/src/main/java/me/taylorkelly/mywarp/Searcher.java +++ b/src/main/java/me/taylorkelly/mywarp/data/Searcher.java @@ -1,7 +1,8 @@ -package me.taylorkelly.mywarp; +package me.taylorkelly.mywarp.data; import java.util.ArrayList; + import org.bukkit.ChatColor; import org.bukkit.entity.Player; @@ -31,6 +32,24 @@ public void setQuery(String name) { } + public void sendWarpMatches(ArrayList warps) { + for (Warp warp : warps) { + String color; + if (warp.playerIsCreator(player.getName())) { + color = ChatColor.AQUA.toString(); + } else if (warp.publicAll) { + color = ChatColor.GREEN.toString(); + } else { + color = ChatColor.RED.toString(); + } + String creator = (warp.creator.equalsIgnoreCase(player.getName())) ? "you" : warp.creator; + int x = (int) Math.round(warp.x); + int y = warp.y; + int z = (int) Math.round(warp.z); + player.sendMessage(color + "'" + warp.name + "'" + ChatColor.WHITE + " by " + creator + " @(" + x + ", " + y + ", " + z + ")"); + } + } + public void search() { if (exactMatches.size() == 0 && matches.size() == 0) { @@ -38,39 +57,11 @@ public void search() { } else { if (exactMatches.size() > 0) { player.sendMessage(ChatColor.YELLOW + "Exact matches for search: " + ChatColor.GRAY + query); - for (Warp warp : exactMatches) { - String color; - if (warp.playerIsCreator(player.getName())) { - color = ChatColor.AQUA.toString(); - } else if (warp.publicAll) { - color = ChatColor.GREEN.toString(); - } else { - color = ChatColor.RED.toString(); - } - String creator = (warp.creator.equalsIgnoreCase(player.getName())) ? "you" : warp.creator; - int x = (int) Math.round(warp.x); - int y = warp.y; - int z = (int) Math.round(warp.z); - player.sendMessage(color + "'" + warp.name + "'" + ChatColor.WHITE + " by " + creator + " @(" + x + ", " + y + ", " + z + ")"); - } + sendWarpMatches(exactMatches); } if (matches.size() > 0) { player.sendMessage(ChatColor.YELLOW + "Partial matches for search: " + ChatColor.GRAY + query); - for (Warp warp : matches) { - String color; - if (warp.playerIsCreator(player.getName())) { - color = ChatColor.AQUA.toString(); - } else if (warp.publicAll) { - color = ChatColor.GREEN.toString(); - } else { - color = ChatColor.RED.toString(); - } - String creator = (warp.creator.equalsIgnoreCase(player.getName())) ? "you" : warp.creator; - int x = (int) Math.round(warp.x); - int y = warp.y; - int z = (int) Math.round(warp.z); - player.sendMessage(color + "'" + warp.name + "'" + ChatColor.WHITE + " by " + creator + " @(" + x + ", " + y + ", " + z + ")"); - } + sendWarpMatches(matches); } } } diff --git a/src/main/java/me/taylorkelly/mywarp/SignWarp.java b/src/main/java/me/taylorkelly/mywarp/data/SignWarp.java similarity index 97% rename from src/main/java/me/taylorkelly/mywarp/SignWarp.java rename to src/main/java/me/taylorkelly/mywarp/data/SignWarp.java index a9c443fa18..43aa8a72e1 100644 --- a/src/main/java/me/taylorkelly/mywarp/SignWarp.java +++ b/src/main/java/me/taylorkelly/mywarp/data/SignWarp.java @@ -1,7 +1,8 @@ -package me.taylorkelly.mywarp; +package me.taylorkelly.mywarp.data; import java.util.ArrayList; + import org.bukkit.block.Sign; import org.bukkit.entity.Player; import org.bukkit.event.block.SignChangeEvent; diff --git a/src/main/java/me/taylorkelly/mywarp/Warp.java b/src/main/java/me/taylorkelly/mywarp/data/Warp.java similarity index 86% rename from src/main/java/me/taylorkelly/mywarp/Warp.java rename to src/main/java/me/taylorkelly/mywarp/data/Warp.java index 1f13aa03f3..88323981fb 100644 --- a/src/main/java/me/taylorkelly/mywarp/Warp.java +++ b/src/main/java/me/taylorkelly/mywarp/data/Warp.java @@ -1,7 +1,10 @@ -package me.taylorkelly.mywarp; +package me.taylorkelly.mywarp.data; import java.util.ArrayList; +import me.taylorkelly.mywarp.MyWarp; +import me.taylorkelly.mywarp.WarpSettings; + import org.bukkit.*; import org.bukkit.entity.Player; @@ -42,19 +45,7 @@ public Warp(int index, String name, String creator, String world, double x, int } public Warp(String name, Player creator) { - this.index = nextIndex; - nextIndex++; - this.name = name; - this.creator = creator.getName(); - this.world = creator.getWorld().getName(); - this.x = creator.getLocation().getX(); - this.y = creator.getLocation().getBlockY(); - this.z = creator.getLocation().getZ(); - this.yaw = Math.round(creator.getLocation().getYaw()) % 360; - this.pitch = Math.round(creator.getLocation().getPitch()) % 360; - this.publicAll = true; - this.permissions = new ArrayList(); - this.welcomeMessage = "Welcome to '" + name + "'"; + this(name, creator, true); } public Warp(String name, Location location) { @@ -117,7 +108,7 @@ public boolean playerCanWarp(Player player) { if (permissions.contains(player.getName())) { return true; } - if (WarpPermissions.isAdmin(player) && WarpSettings.adminPrivateWarps) { + if (MyWarp.getWarpPermissions().isAdmin(player) && WarpSettings.adminPrivateWarps) { return true; } @@ -133,6 +124,10 @@ public void warp(Player player, Server server) { } if (currWorld != null) { Location location = new Location(currWorld, x, y, z, yaw, pitch); + while (currWorld.getBlockAt(location).getType() != Material.AIR) { + location.setY(location.getY() + 1.0); + location = currWorld.getBlockAt(location).getLocation(); + } player.teleport(location); } else { player.sendMessage(ChatColor.RED + "World " + world + " doesn't exist."); @@ -162,7 +157,7 @@ public boolean playerCanModify(Player player) { if (creator.equals(player.getName())) { return true; } - if (WarpPermissions.isAdmin(player)) { + if (MyWarp.getWarpPermissions().isAdmin(player)) { return true; } return false; diff --git a/src/main/java/me/taylorkelly/mywarp/WarpList.java b/src/main/java/me/taylorkelly/mywarp/data/WarpList.java similarity index 55% rename from src/main/java/me/taylorkelly/mywarp/WarpList.java rename to src/main/java/me/taylorkelly/mywarp/data/WarpList.java index b77505eda4..1590996a7e 100644 --- a/src/main/java/me/taylorkelly/mywarp/WarpList.java +++ b/src/main/java/me/taylorkelly/mywarp/data/WarpList.java @@ -1,4 +1,4 @@ -package me.taylorkelly.mywarp; +package me.taylorkelly.mywarp.data; import java.text.Collator; import java.util.ArrayList; @@ -6,6 +6,10 @@ import java.util.HashMap; import java.util.List; +import me.taylorkelly.mywarp.MyWarp; +import me.taylorkelly.mywarp.WarpSettings; +import me.taylorkelly.mywarp.sql.WarpDataSource; + import org.bukkit.*; import org.bukkit.entity.Player; @@ -22,24 +26,53 @@ public WarpList(Server server) { } public void addWarp(String name, Player player) { - if (playerCanBuildPublicWarp(player)) { - if (warpList.containsKey(name)) { - player.sendMessage(ChatColor.RED + "Warp called '" + name + "' already exists."); + if (playerCanBuildWarp(player)) { + if (playerCanBuildPublicWarp(player)) { + if (warpList.containsKey(name)) { + player.sendMessage(ChatColor.RED + "Warp called '" + name + + "' already exists."); + } else { + Warp warp = new Warp(name, player); + warpList.put(name, warp); + WarpDataSource.addWarp(warp); + player.sendMessage(ChatColor.AQUA + "Successfully created '" + name + + "'"); + player.sendMessage("If you'd like to privatize it,"); + player.sendMessage("Use: " + ChatColor.RED + "/warp private " + name); + } } else { - Warp warp = new Warp(name, player); - warpList.put(name, warp); - WarpDataSource.addWarp(warp); - player.sendMessage(ChatColor.AQUA + "Successfully created '" + name + "'"); - player.sendMessage("If you'd like to privatize it,"); - player.sendMessage("Use: " + ChatColor.RED + "/warp private " + name); + player.sendMessage(ChatColor.RED + + "You have reached your max # of public warps " + + ChatColor.YELLOW + "(" + + MyWarp.getWarpPermissions().maxPublicWarps(player) + ")"); + player.sendMessage("Delete some of your warps to make more"); } } else { - player.sendMessage(ChatColor.RED + "You have reached your max # of public warps " + ChatColor.YELLOW + "(" + WarpPermissions.maxPublicWarps(player) - + ")"); + player.sendMessage(ChatColor.RED + + "You have reached your max # of warps " + ChatColor.YELLOW + + "(" + MyWarp.getWarpPermissions().maxTotalWarps(player) + ")"); player.sendMessage("Delete some of your warps to make more"); } } + private int numWarpsPlayer(Player player) { + int size = 0; + for (Warp warp : warpList.values()) { + String creator = warp.creator; + if (creator.equals(player.getName())) + size++; + } + return size; + } + + private boolean playerCanBuildWarp(Player player) { + if(MyWarp.getWarpPermissions().isAdmin(player) && !WarpSettings.adminsObeyLimits) { + return true; + } else{ + return numWarpsPlayer(player) < MyWarp.getWarpPermissions().maxTotalWarps(player); + } + } + private int numPublicWarpsPlayer(Player player) { int size = 0; for (Warp warp : warpList.values()) { @@ -52,37 +85,48 @@ private int numPublicWarpsPlayer(Player player) { } private boolean playerCanBuildPublicWarp(Player player) { - if(WarpPermissions.isAdmin(player) && !WarpSettings.adminsObeyLimits) { + if(MyWarp.getWarpPermissions().isAdmin(player) && !WarpSettings.adminsObeyLimits) { return true; } else{ - return numPublicWarpsPlayer(player) < WarpPermissions.maxPublicWarps(player); + return numPublicWarpsPlayer(player) < MyWarp.getWarpPermissions().maxPublicWarps(player); } } private boolean playerCanBuildPrivateWarp(Player player) { - if(WarpPermissions.isAdmin(player) && !WarpSettings.adminsObeyLimits) { + if(MyWarp.getWarpPermissions().isAdmin(player) && !WarpSettings.adminsObeyLimits) { return true; } else{ - return numPrivateWarpsPlayer(player) < WarpPermissions.maxPrivateWarps(player); + return numPrivateWarpsPlayer(player) < MyWarp.getWarpPermissions().maxPrivateWarps(player); } } - public void addWarpPrivate(String name, Player player) { - if (playerCanBuildPrivateWarp(player)) { - if (warpList.containsKey(name)) { - player.sendMessage(ChatColor.RED + "Warp called '" + name + "' already exists."); + if (playerCanBuildWarp(player)) { + if (playerCanBuildPrivateWarp(player)) { + if (warpList.containsKey(name)) { + player.sendMessage(ChatColor.RED + "Warp called '" + name + + "' already exists."); + } else { + Warp warp = new Warp(name, player, false); + warpList.put(name, warp); + WarpDataSource.addWarp(warp); + player.sendMessage(ChatColor.AQUA + "Successfully created '" + name + + "'"); + player.sendMessage("If you'd like to invite others to it,"); + player.sendMessage("Use: " + ChatColor.RED + + "/warp invite " + name); + } } else { - Warp warp = new Warp(name, player, false); - warpList.put(name, warp); - WarpDataSource.addWarp(warp); - player.sendMessage(ChatColor.AQUA + "Successfully created '" + name + "'"); - player.sendMessage("If you'd like to invite others to it,"); - player.sendMessage("Use: " + ChatColor.RED + "/warp invite " + name); + player.sendMessage(ChatColor.RED + + "You have reached your max # of private warps " + + ChatColor.YELLOW + "(" + + MyWarp.getWarpPermissions().maxPrivateWarps(player) + ")"); + player.sendMessage("Delete some of your warps to make more"); } } else { - player.sendMessage(ChatColor.RED + "You have reached your max # of private warps " + ChatColor.YELLOW + "(" - + WarpPermissions.maxPrivateWarps(player) + ")"); + player.sendMessage(ChatColor.RED + "You have reached your max # of warps " + + ChatColor.YELLOW + "(" + + MyWarp.getWarpPermissions().maxTotalWarps(player) + ")"); player.sendMessage("Delete some of your warps to make more"); } } @@ -141,13 +185,24 @@ public void privatize(String name, Player player) { if (warpList.containsKey(name)) { Warp warp = warpList.get(name); if (warp.playerCanModify(player)) { - warp.publicAll = false; - WarpDataSource.publicizeWarp(warp, false); - player.sendMessage(ChatColor.AQUA + "You have privatized '" + name + "'"); - player.sendMessage("If you'd like to invite others to it,"); - player.sendMessage("Use: " + ChatColor.RED + "/warp invite " + name); + if (playerCanBuildPrivateWarp(player)) { + warp.publicAll = false; + WarpDataSource.publicizeWarp(warp, false); + player.sendMessage(ChatColor.AQUA + "You have privatized '" + name + + "'"); + player.sendMessage("If you'd like to invite others to it,"); + player.sendMessage("Use: " + ChatColor.RED + + "/warp invite " + name); + } else { + player.sendMessage(ChatColor.RED + + "You have reached your max # of private warps " + + ChatColor.YELLOW + "(" + + MyWarp.getWarpPermissions().maxPrivateWarps(player) + ")"); + player.sendMessage("Delete some of your warps to make more"); + } } else { - player.sendMessage(ChatColor.RED + "You do not have permission to privatize '" + name + "'"); + player.sendMessage(ChatColor.RED + + "You do not have permission to privatize '" + name + "'"); } } else { player.sendMessage(ChatColor.RED + "No such warp '" + name + "'"); @@ -191,11 +246,21 @@ public void publicize(String name, Player player) { if (warpList.containsKey(name)) { Warp warp = warpList.get(name); if (warp.playerCanModify(player)) { - warp.publicAll = true; - WarpDataSource.publicizeWarp(warp, true); - player.sendMessage(ChatColor.AQUA + "You have publicized '" + name + "'"); + if (playerCanBuildPublicWarp(player)) { + warp.publicAll = true; + WarpDataSource.publicizeWarp(warp, true); + player.sendMessage(ChatColor.AQUA + "You have publicized '" + name + + "'"); + } else { + player.sendMessage(ChatColor.RED + + "You have reached your max # of public warps " + + ChatColor.YELLOW + "(" + + MyWarp.getWarpPermissions().maxPublicWarps(player) + ")"); + player.sendMessage("Delete some of your warps to make more"); + } } else { - player.sendMessage(ChatColor.RED + "You do not have permission to publicize '" + name + "'"); + player.sendMessage(ChatColor.RED + + "You do not have permission to publicize '" + name + "'"); } } else { player.sendMessage(ChatColor.RED + "No such warp '" + name + "'"); @@ -233,6 +298,14 @@ public void uninvite(String name, Player player, String inviteeName) { } public ArrayList getSortedWarps(Player player, int start, int size) { + return getSortedWarpsPerCreator(player, null, start, size); + } + + public int getSize() { + return warpList.size(); + } + + public ArrayList getSortedWarpsPerCreator(Player player, String creator, int start, int size) { ArrayList ret = new ArrayList(); List names = new ArrayList(warpList.keySet()); Collator collator = Collator.getInstance(); @@ -244,7 +317,7 @@ public ArrayList getSortedWarps(Player player, int start, int size) { while (index < names.size() && ret.size() < size) { String currName = names.get(index); Warp warp = warpList.get(currName); - if (warp.playerCanWarp(player)) { + if (warp.playerCanWarp(player) && (creator != null ? warp.playerIsCreator(creator) : true)) { if (currentCount >= start) { ret.add(warp); } else { @@ -256,10 +329,6 @@ public ArrayList getSortedWarps(Player player, int start, int size) { return ret; } - public int getSize() { - return warpList.size(); - } - public MatchList getMatches(String name, Player player) { ArrayList exactMatches = new ArrayList(); ArrayList matches = new ArrayList(); @@ -292,6 +361,30 @@ public MatchList getMatches(String name, Player player) { } return new MatchList(exactMatches, matches); } + + public String getMatchingCreator(Player player, String creator) { + ArrayList matches = new ArrayList(); + List names = new ArrayList(warpList.keySet()); + Collator collator = Collator.getInstance(); + collator.setStrength(Collator.SECONDARY); + Collections.sort(names, collator); + + for (int i = 0; i < names.size(); i++) { + String currName = names.get(i); + Warp warp = warpList.get(currName); + if (warp.playerCanWarp(player)) { + if (warp.creator.equalsIgnoreCase(creator)) { + return creator; + } else if (warp.creator.toLowerCase().contains(creator.toLowerCase()) && !matches.contains(warp.creator)) { + matches.add(warp.creator); + } + } + } + if (matches.size() == 1) { + return matches.get(0); + } + return ""; + } public void give(String name, Player player, String giveeName) { MatchList matches = this.getMatches(name, player); @@ -300,18 +393,84 @@ public void give(String name, Player player, String giveeName) { Warp warp = warpList.get(name); if (warp.playerCanModify(player)) { if (warp.playerIsCreator(giveeName)) { - player.sendMessage(ChatColor.RED + giveeName + " is already the owner."); + player.sendMessage(ChatColor.RED + giveeName + + " is already the owner."); } else { - warp.setCreator(giveeName); - WarpDataSource.updateCreator(warp); - player.sendMessage(ChatColor.AQUA + "You have given '" + name + "' to " + giveeName); Player match = server.getPlayer(giveeName); - if (match != null) { - match.sendMessage(ChatColor.AQUA + "You've been given '" + name + "' by " + player.getName()); + if (match != null) { // match needs to be online + if (warp.publicAll) { + if (playerCanBuildWarp(match)) { + if (playerCanBuildPublicWarp(match)) { + warp.setCreator(giveeName); + WarpDataSource.updateCreator(warp); + player.sendMessage(ChatColor.AQUA + + "You have given '" + name + "' to " + + giveeName); + match.sendMessage(ChatColor.AQUA + + "You've been given '" + name + "' by " + + player.getName()); + } else { + player.sendMessage(ChatColor.RED + + "Player " + + match.getName() + + " has reached his max # of public warps " + + ChatColor.YELLOW + + "(" + + MyWarp.getWarpPermissions() + .maxPublicWarps(player) + ")"); + player.sendMessage("Tell him to delete some of his warps to receive this one."); + } + } else { + player.sendMessage(ChatColor.RED + + "Player " + + match.getName() + + " has reached his max # of warps " + + ChatColor.YELLOW + + "(" + + MyWarp.getWarpPermissions().maxTotalWarps( + player) + ")"); + player.sendMessage("Delete some of your warps to make more"); + } + } else { + if (playerCanBuildWarp(match)) { + if (playerCanBuildPrivateWarp(match)) { + warp.setCreator(giveeName); + WarpDataSource.updateCreator(warp); + player.sendMessage(ChatColor.AQUA + + "You have given '" + name + "' to " + + giveeName); + match.sendMessage(ChatColor.AQUA + + "You've been given '" + name + "' by " + + player.getName()); + } else { + player.sendMessage(ChatColor.RED + + "Player " + + match.getName() + + " has reached his max # of private warps " + + ChatColor.YELLOW + + "(" + + MyWarp.getWarpPermissions() + .maxPrivateWarps(player) + ")"); + player.sendMessage("Tell him to delete some of his warps to receive this one."); + } + } else { + player.sendMessage(ChatColor.RED + + "Player " + + match.getName() + + " has reached his max # of warps " + + ChatColor.YELLOW + + "(" + + MyWarp.getWarpPermissions().maxTotalWarps( + player) + ")"); + player.sendMessage("Tell him to delete some of his warps to receive this one."); + } + } } } } else { - player.sendMessage(ChatColor.RED + "You do not have permission to uninvite players from '" + name + "'"); + player.sendMessage(ChatColor.RED + + "You do not have permission to uninvite players from '" + name + + "'"); } } else { player.sendMessage(ChatColor.RED + "No such warp '" + name + "'"); @@ -328,6 +487,16 @@ public double getMaxWarps(Player player) { return count; } + public double getMaxWarpsPerCreator(Player player, String creator) { + int count = 0; + for (Warp warp : warpList.values()) { + if (warp.playerCanWarp(player) && warp.playerIsCreator(creator)) { + count++; + } + } + return count; + } + public void welcomeMessage(String name, Player player) { MatchList matches = this.getMatches(name, player); name = matches.getMatch(name); diff --git a/src/main/java/me/taylorkelly/mywarp/griefcraft/Updater.java b/src/main/java/me/taylorkelly/mywarp/griefcraft/Updater.java index 0e249631bc..bc1667dc6d 100644 --- a/src/main/java/me/taylorkelly/mywarp/griefcraft/Updater.java +++ b/src/main/java/me/taylorkelly/mywarp/griefcraft/Updater.java @@ -32,7 +32,7 @@ public class Updater { private Logger logger = Logger.getLogger("Minecraft"); - private final static String UPDATE_SITE = "http://procrafter.de/downloads/"; + private final static String UPDATE_SITE = "https://raw.github.com/mung3r/MyWarp/master/"; private List needsUpdating = new ArrayList(); diff --git a/src/main/java/me/taylorkelly/mywarp/listeners/MWBlockListener.java b/src/main/java/me/taylorkelly/mywarp/listeners/MWBlockListener.java new file mode 100644 index 0000000000..1653087360 --- /dev/null +++ b/src/main/java/me/taylorkelly/mywarp/listeners/MWBlockListener.java @@ -0,0 +1,37 @@ +package me.taylorkelly.mywarp.listeners; + +import me.taylorkelly.mywarp.MyWarp; +import me.taylorkelly.mywarp.data.SignWarp; +import me.taylorkelly.mywarp.permissions.WarpPermissions; + +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.block.SignChangeEvent; + +public class MWBlockListener implements Listener +{ + private WarpPermissions warpPermissions; + + public MWBlockListener(MyWarp plugin) + { + warpPermissions = MyWarp.getWarpPermissions(); + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onSignChange(SignChangeEvent event) + { + Player player = event.getPlayer(); + + if (SignWarp.isSignWarp(event)) + if (warpPermissions.createSignWarp(player)) { + player.sendMessage(ChatColor.AQUA + "Successfully created a SignWarp"); + } + else { + player.sendMessage(ChatColor.RED + "You do not have permission to create a SignWarp"); + event.setCancelled(true); + } + } +} \ No newline at end of file diff --git a/src/main/java/me/taylorkelly/mywarp/listeners/MWPlayerListener.java b/src/main/java/me/taylorkelly/mywarp/listeners/MWPlayerListener.java new file mode 100644 index 0000000000..3542d7bd85 --- /dev/null +++ b/src/main/java/me/taylorkelly/mywarp/listeners/MWPlayerListener.java @@ -0,0 +1,64 @@ +package me.taylorkelly.mywarp.listeners; + +import me.taylorkelly.mywarp.MyWarp; +import me.taylorkelly.mywarp.WarpSettings; +import me.taylorkelly.mywarp.data.SignWarp; +import me.taylorkelly.mywarp.data.WarpList; +import me.taylorkelly.mywarp.permissions.WarpPermissions; + +import org.bukkit.Chunk; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.block.Sign; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.block.Action; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerTeleportEvent; + +public class MWPlayerListener implements Listener +{ + private WarpList warpList; + private WarpPermissions warpPermissions; + + public MWPlayerListener(MyWarp plugin) + { + warpList = plugin.getWarpList(); + warpPermissions = MyWarp.getWarpPermissions(); + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onPlayerInteract(PlayerInteractEvent event) + { + if (event.getAction().equals(Action.RIGHT_CLICK_BLOCK)) { + Block block = event.getClickedBlock(); + if (((block.getState() instanceof Sign)) && (SignWarp.isSignWarp((Sign)block.getState())) && (warpPermissions.signWarp(event.getPlayer()))) + SignWarp.warpSign((Sign)block.getState(), this.warpList, event.getPlayer()); + } + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onPlayerChat(AsyncPlayerChatEvent event) + { + Player player = event.getPlayer(); + if (this.warpList.waitingForWelcome(player)) { + this.warpList.setWelcomeMessage(player, event.getMessage()); + this.warpList.notWaiting(player); + event.setCancelled(true); + } + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onPlayerTeleport(PlayerTeleportEvent event) { + if(WarpSettings.loadChunks) { + World world = event.getPlayer().getWorld(); + Chunk chunk = world.getChunkAt(event.getTo()); + int x = chunk.getX(); + int z = chunk.getZ(); + world.refreshChunk(x, z); + } + } +} \ No newline at end of file diff --git a/src/main/java/me/taylorkelly/mywarp/permissions/BPermissions2Handler.java b/src/main/java/me/taylorkelly/mywarp/permissions/BPermissions2Handler.java new file mode 100644 index 0000000000..86c46938e9 --- /dev/null +++ b/src/main/java/me/taylorkelly/mywarp/permissions/BPermissions2Handler.java @@ -0,0 +1,26 @@ +package me.taylorkelly.mywarp.permissions; + +import org.bukkit.entity.Player; +import de.bananaco.bpermissions.api.ApiLayer; +import de.bananaco.bpermissions.api.util.CalculableType; + +public class BPermissions2Handler implements IPermissionsHandler { + + public BPermissions2Handler() { + + } + + @Override + public boolean hasPermission(final Player player, final String node, boolean defaultPerm) { + return player.hasPermission(node); + } + + public int getInteger(final Player player, final String node, int defaultInt) { + int value = defaultInt; + String retval = ApiLayer.getValue(player.getWorld().getName(), CalculableType.USER, player.getName(), node); + if(retval != "" && retval != null) { + value = Integer.parseInt(retval); + } + return value; + } +} diff --git a/src/main/java/me/taylorkelly/mywarp/permissions/BPermissionsHandler.java b/src/main/java/me/taylorkelly/mywarp/permissions/BPermissionsHandler.java new file mode 100644 index 0000000000..c8a30f0772 --- /dev/null +++ b/src/main/java/me/taylorkelly/mywarp/permissions/BPermissionsHandler.java @@ -0,0 +1,23 @@ +package me.taylorkelly.mywarp.permissions; + +import org.bukkit.entity.Player; +import de.bananaco.permissions.info.InfoReader; + +public class BPermissionsHandler implements IPermissionsHandler { + private final transient InfoReader info; + + public BPermissionsHandler() { + info = new InfoReader(); + info.instantiate(); + } + + @Override + public boolean hasPermission(final Player player, final String node, boolean defaultPerm) { + return player.hasPermission(node); + } + + public int getInteger(final Player player, final String node, int defaultInt) { + int value = Integer.parseInt(info.getValue(player, node)); + return value; + } +} diff --git a/src/main/java/me/taylorkelly/mywarp/permissions/GroupManagerHandler.java b/src/main/java/me/taylorkelly/mywarp/permissions/GroupManagerHandler.java new file mode 100644 index 0000000000..81237bbe06 --- /dev/null +++ b/src/main/java/me/taylorkelly/mywarp/permissions/GroupManagerHandler.java @@ -0,0 +1,27 @@ +package me.taylorkelly.mywarp.permissions; + +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; +import org.anjocaido.groupmanager.GroupManager; +import org.anjocaido.groupmanager.permissions.AnjoPermissionsHandler; + +public class GroupManagerHandler implements IPermissionsHandler { + private final transient GroupManager manager; + + public GroupManagerHandler(final Plugin permissionsPlugin) { + manager = ((GroupManager)permissionsPlugin); + } + + @Override + public boolean hasPermission(final Player player, final String node, final boolean defaultPerm) { + AnjoPermissionsHandler handler = manager.getWorldsHolder().getWorldPermissions(player); + return handler.has(player, node); + } + + @Override + public int getInteger(final Player player, final String node, final int defaultInt) { + String playername = player.getName(); + AnjoPermissionsHandler handler = manager.getWorldsHolder().getWorldPermissions(player); + return handler.getPermissionInteger(playername, node); + } +} diff --git a/src/main/java/me/taylorkelly/mywarp/permissions/IPermissionsHandler.java b/src/main/java/me/taylorkelly/mywarp/permissions/IPermissionsHandler.java new file mode 100644 index 0000000000..aae8c24196 --- /dev/null +++ b/src/main/java/me/taylorkelly/mywarp/permissions/IPermissionsHandler.java @@ -0,0 +1,8 @@ +package me.taylorkelly.mywarp.permissions; + +import org.bukkit.entity.Player; + +public interface IPermissionsHandler { + boolean hasPermission(Player player, String node, boolean defaultPerm); + int getInteger(Player player, String node, int defaultInt); +} diff --git a/src/main/java/me/taylorkelly/mywarp/permissions/NullHandler.java b/src/main/java/me/taylorkelly/mywarp/permissions/NullHandler.java new file mode 100644 index 0000000000..3132eaf16a --- /dev/null +++ b/src/main/java/me/taylorkelly/mywarp/permissions/NullHandler.java @@ -0,0 +1,15 @@ +package me.taylorkelly.mywarp.permissions; + +import org.bukkit.entity.Player; + +public class NullHandler implements IPermissionsHandler { + + @Override + public boolean hasPermission(final Player player, final String node, boolean defaultPerm) { + return false; + } + + public int getInteger(final Player player, final String node, int defaultInt) { + return defaultInt; + } +} diff --git a/src/main/java/me/taylorkelly/mywarp/permissions/Permissions2Handler.java b/src/main/java/me/taylorkelly/mywarp/permissions/Permissions2Handler.java new file mode 100644 index 0000000000..820ad2f985 --- /dev/null +++ b/src/main/java/me/taylorkelly/mywarp/permissions/Permissions2Handler.java @@ -0,0 +1,27 @@ +package me.taylorkelly.mywarp.permissions; + +import org.bukkit.entity.Player; +import com.nijiko.permissions.PermissionHandler; +import com.nijikokun.bukkit.Permissions.Permissions; +import org.bukkit.plugin.Plugin; + +public class Permissions2Handler implements IPermissionsHandler { + private final transient PermissionHandler handler; + + public Permissions2Handler(final Plugin permissionsPlugin) { + handler = ((Permissions)permissionsPlugin).getHandler(); + } + + @Override + public boolean hasPermission(final Player player, final String node, boolean defaultPerm) { + return handler.permission(player, node); + } + + @Override + public int getInteger(final Player player, final String node, final int defaultInt) { + String playername = player.getName(); + String world = player.getWorld().getName(); + return handler.getPermissionInteger(world, playername, node); + } +} + diff --git a/src/main/java/me/taylorkelly/mywarp/permissions/Permissions3Handler.java b/src/main/java/me/taylorkelly/mywarp/permissions/Permissions3Handler.java new file mode 100644 index 0000000000..c52c9efc1a --- /dev/null +++ b/src/main/java/me/taylorkelly/mywarp/permissions/Permissions3Handler.java @@ -0,0 +1,27 @@ +package me.taylorkelly.mywarp.permissions; + +import org.bukkit.entity.Player; +import com.nijiko.permissions.PermissionHandler; +import com.nijikokun.bukkit.Permissions.Permissions; +import org.bukkit.plugin.Plugin; + +public class Permissions3Handler implements IPermissionsHandler { + private final transient PermissionHandler handler; + + public Permissions3Handler(final Plugin permissionsPlugin) { + handler = ((Permissions)permissionsPlugin).getHandler(); + } + + @Override + public boolean hasPermission(final Player player, final String node, boolean defaultPerm) { + return handler.has(player, node); + } + + @Override + public int getInteger(final Player player, final String node, final int defaultInt) { + String playername = player.getName(); + String world = player.getWorld().getName(); + return handler.getPermissionInteger(world, playername, node); + } +} + diff --git a/src/main/java/me/taylorkelly/mywarp/permissions/PermissionsExHandler.java b/src/main/java/me/taylorkelly/mywarp/permissions/PermissionsExHandler.java new file mode 100644 index 0000000000..ff06565ecf --- /dev/null +++ b/src/main/java/me/taylorkelly/mywarp/permissions/PermissionsExHandler.java @@ -0,0 +1,26 @@ +package me.taylorkelly.mywarp.permissions; +import org.bukkit.entity.Player; +import ru.tehkode.permissions.PermissionManager; +import ru.tehkode.permissions.bukkit.PermissionsEx; + +public class PermissionsExHandler implements IPermissionsHandler { + private final transient PermissionManager manager; + + public PermissionsExHandler() { + manager = PermissionsEx.getPermissionManager(); + } + + @Override + public boolean hasPermission(final Player player, final String node, final boolean defaultPerm) { + String playername = player.getName(); + String playerworld = player.getWorld().getName(); + return manager.has(playername, node, playerworld); + } + + @Override + public int getInteger(final Player player, final String node, final int defaultInt) { + String playername = player.getName(); + String world = player.getWorld().getName(); + return manager.getUser(playername).getOptionInteger(node, world, defaultInt); + } +} diff --git a/src/main/java/me/taylorkelly/mywarp/permissions/PermissionsHandler.java b/src/main/java/me/taylorkelly/mywarp/permissions/PermissionsHandler.java new file mode 100644 index 0000000000..0426e794ea --- /dev/null +++ b/src/main/java/me/taylorkelly/mywarp/permissions/PermissionsHandler.java @@ -0,0 +1,124 @@ +package me.taylorkelly.mywarp.permissions; + +import me.taylorkelly.mywarp.utils.WarpLogger; +import net.milkbowl.vault.permission.Permission; + +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; +import org.bukkit.plugin.PluginManager; +import org.bukkit.plugin.RegisteredServiceProvider; + +public class PermissionsHandler implements IPermissionsHandler { + private enum PermHandler { + VAULT, PERMISSIONSEX, PERMISSIONS3, PERMISSIONS2, GROUPMANAGER, BPERMISSIONS, BPERMISSIONS2, SUPERPERMS, NONE + } + private static PermHandler permplugin = PermHandler.NONE; + private transient IPermissionsHandler handler = new NullHandler(); + private final transient Plugin plugin; + + public PermissionsHandler(final Plugin plugin) { + this.plugin = plugin; + checkPermissions(); + } + + @Override + public boolean hasPermission(final Player player, final String node, boolean defaultPerm) { + return handler.hasPermission(player, node, defaultPerm); + } + + @Override + public int getInteger(final Player player, final String node, int defaultInt) { + return handler.getInteger(player, node, defaultInt); + } + + public void checkPermissions() { + final PluginManager pluginManager = plugin.getServer().getPluginManager(); + + try { + RegisteredServiceProvider permissionProvider = Bukkit + .getServicesManager().getRegistration( + net.milkbowl.vault.permission.Permission.class); + if (permissionProvider != null) { + if (!(handler instanceof VaultHandler)) { + permplugin = PermHandler.VAULT; + WarpLogger.info("Access Control: Using Vault"); + handler = new VaultHandler(permissionProvider.getProvider()); + } + return; + } + } catch (NoClassDefFoundError e) { + // Do nothing + } + + final Plugin permExPlugin = pluginManager.getPlugin("PermissionsEx"); + if (permExPlugin != null && permExPlugin.isEnabled()) { + if (!(handler instanceof PermissionsExHandler)) { + permplugin = PermHandler.PERMISSIONSEX; + String version = permExPlugin.getDescription().getVersion(); + WarpLogger.info("Access Control: Using PermissionsEx v"+ version); + handler = new PermissionsExHandler(); + } + return; + } + + final Plugin bPermPlugin = pluginManager.getPlugin("bPermissions"); + if (bPermPlugin != null && bPermPlugin.isEnabled()) { + if (bPermPlugin.getDescription().getVersion().charAt(0) == '2') { + if (!(handler instanceof BPermissions2Handler)) { + permplugin = PermHandler.BPERMISSIONS2; + String version = bPermPlugin.getDescription().getVersion(); + WarpLogger.info("Access Control: Using bPermissions"+ version); + handler = new BPermissions2Handler(); + } + } else { + if (!(handler instanceof BPermissionsHandler)) { + permplugin = PermHandler.BPERMISSIONS; + String version = bPermPlugin.getDescription().getVersion(); + WarpLogger.info("Access Control: Using bPermissions"+ version); + handler = new BPermissionsHandler(); + } + } + return; + } + + + final Plugin GMplugin = pluginManager.getPlugin("GroupManager"); + if (GMplugin != null && GMplugin.isEnabled()) { + if (!(handler instanceof GroupManagerHandler)) { + permplugin = PermHandler.GROUPMANAGER; + String version = GMplugin.getDescription().getVersion(); + WarpLogger.info("Access Control: Using GroupManager v"+ version); + handler = new GroupManagerHandler(GMplugin); + } + return; + } + + final Plugin permPlugin = pluginManager.getPlugin("Permissions"); + if (permPlugin != null && permPlugin.isEnabled()) { + if (permPlugin.getDescription().getVersion().charAt(0) == '3') { + if (!(handler instanceof Permissions3Handler)) { + permplugin = PermHandler.PERMISSIONS3; + String version = permPlugin.getDescription().getVersion(); + WarpLogger.info("Access Control: Using Permissions v"+ version); + handler = new Permissions3Handler(permPlugin); + } + } else { + if (!(handler instanceof Permissions2Handler)) { + permplugin = PermHandler.PERMISSIONS2; + String version = permPlugin.getDescription().getVersion(); + WarpLogger.info("Access Control: Using Permissions v"+ version); + handler = new Permissions2Handler(permPlugin); + } + } + return; + } + + if (permplugin == PermHandler.NONE) { + if (!(handler instanceof SuperpermsHandler)) { + WarpLogger.info("Access Control: Using SuperPerms"); + handler = new SuperpermsHandler(); + } + } + } +} diff --git a/src/main/java/me/taylorkelly/mywarp/permissions/SuperpermsHandler.java b/src/main/java/me/taylorkelly/mywarp/permissions/SuperpermsHandler.java new file mode 100644 index 0000000000..afecf76f33 --- /dev/null +++ b/src/main/java/me/taylorkelly/mywarp/permissions/SuperpermsHandler.java @@ -0,0 +1,25 @@ +package me.taylorkelly.mywarp.permissions; + +import me.taylorkelly.mywarp.WarpSettings; + +import org.bukkit.entity.Player; + +public class SuperpermsHandler implements IPermissionsHandler { + + @Override + public boolean hasPermission(final Player player, final String node, boolean defaultPerm) { + if(player.isOp() && WarpSettings.opPermissions) { + return true; + } + return player.hasPermission(node); + } + + @Override + public int getInteger(final Player player, final String node, final int defaultInt) { + if(player.isOp() && WarpSettings.opPermissions) { + return 0; + } + return defaultInt; + } +} + diff --git a/src/main/java/me/taylorkelly/mywarp/permissions/VaultHandler.java b/src/main/java/me/taylorkelly/mywarp/permissions/VaultHandler.java new file mode 100644 index 0000000000..6e64c150f0 --- /dev/null +++ b/src/main/java/me/taylorkelly/mywarp/permissions/VaultHandler.java @@ -0,0 +1,29 @@ +package me.taylorkelly.mywarp.permissions; + +import me.taylorkelly.mywarp.WarpSettings; +import net.milkbowl.vault.permission.Permission; + +import org.bukkit.entity.Player; + + +public class VaultHandler implements IPermissionsHandler { + + private Permission permission; + + public VaultHandler(Permission permission) { + this.permission = permission; + } + + @Override + public boolean hasPermission(final Player player, final String node, boolean defaultPerm) { + return permission.has(player, node); + } + + @Override + public int getInteger(final Player player, final String node, final int defaultInt) { + if(player.isOp() && WarpSettings.opPermissions) { + return 0; + } + return defaultInt; + } +} diff --git a/src/main/java/me/taylorkelly/mywarp/permissions/WarpPermissions.java b/src/main/java/me/taylorkelly/mywarp/permissions/WarpPermissions.java new file mode 100644 index 0000000000..d9580aeea0 --- /dev/null +++ b/src/main/java/me/taylorkelly/mywarp/permissions/WarpPermissions.java @@ -0,0 +1,98 @@ +package me.taylorkelly.mywarp.permissions; + +import me.taylorkelly.mywarp.WarpSettings; + +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; + +public class WarpPermissions { + private PermissionsHandler permissionsHandler; + + public WarpPermissions(Plugin plugin) { + permissionsHandler = new PermissionsHandler(plugin); + } + + public int integer(Player player, String node, int defaultInt) { + return permissionsHandler.getInteger(player, node, defaultInt); + } + + public boolean hasPermission(Player player, final String node, boolean defaultPerm) { + return permissionsHandler.hasPermission(player, node, defaultPerm); + } + + public boolean isAdmin(Player player) { + return permissionsHandler.hasPermission(player, "mywarp.admin", player.isOp()); + } + + public boolean warp(Player player) { + return permissionsHandler.hasPermission(player, "mywarp.warp.basic.warp", true); + } + + public boolean delete(Player player) { + return permissionsHandler.hasPermission(player, "mywarp.warp.basic.delete", true); + } + + public boolean list(Player player) { + return permissionsHandler.hasPermission(player, "mywarp.warp.basic.list", true); + } + + public boolean welcome(Player player) { + return permissionsHandler.hasPermission(player, "mywarp.warp.basic.welcome", true); + } + + public boolean search(Player player) { + return permissionsHandler.hasPermission(player, "mywarp.warp.basic.search", true); + } + + public boolean give(Player player) { + return permissionsHandler.hasPermission(player, "mywarp.warp.soc.give", true); + } + + public boolean invite(Player player) { + return permissionsHandler.hasPermission(player, "mywarp.warp.soc.invite", true); + } + + public boolean uninvite(Player player) { + return permissionsHandler.hasPermission(player, "mywarp.warp.soc.uninvite", true); + } + + public boolean canPublic(Player player) { + return permissionsHandler.hasPermission(player, "mywarp.warp.soc.public", true); + } + + public boolean canPrivate(Player player) { + return permissionsHandler.hasPermission(player, "mywarp.warp.soc.private", true); + } + + public boolean signWarp(Player player) { + return permissionsHandler.hasPermission(player, "mywarp.warp.sign.warp", true); + } + + public boolean privateCreate(Player player) { + return permissionsHandler.hasPermission(player, "mywarp.warp.basic.createprivate", true); + } + + public boolean publicCreate(Player player) { + return permissionsHandler.hasPermission(player, "mywarp.warp.basic.createpublic", true); + } + + public boolean compass(Player player) { + return permissionsHandler.hasPermission(player, "mywarp.warp.basic.compass", true); + } + + public int maxTotalWarps(Player player) { + return WarpSettings.maxTotal; + } + + public int maxPrivateWarps(Player player) { + return WarpSettings.maxPrivate; + } + + public int maxPublicWarps(Player player) { + return WarpSettings.maxPublic; + } + + public boolean createSignWarp(Player player) { + return permissionsHandler.hasPermission(player, "mywarp.warp.sign.create", true); + } +} \ No newline at end of file diff --git a/src/main/java/me/taylorkelly/mywarp/ConnectionManager.java b/src/main/java/me/taylorkelly/mywarp/sql/ConnectionManager.java similarity index 58% rename from src/main/java/me/taylorkelly/mywarp/ConnectionManager.java rename to src/main/java/me/taylorkelly/mywarp/sql/ConnectionManager.java index e388e42db8..acaa4b1351 100644 --- a/src/main/java/me/taylorkelly/mywarp/ConnectionManager.java +++ b/src/main/java/me/taylorkelly/mywarp/sql/ConnectionManager.java @@ -1,9 +1,11 @@ -package me.taylorkelly.mywarp; +package me.taylorkelly.mywarp.sql; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; +import me.taylorkelly.mywarp.WarpSettings; +import me.taylorkelly.mywarp.utils.WarpLogger; public class ConnectionManager { private static Connection conn; @@ -29,20 +31,35 @@ public static Connection initialize() { return conn; } - public static Connection getConnection() { - if(conn == null) conn = initialize(); - return conn; - } + public static Connection getConnection() { + if(conn == null) conn = initialize(); + if(WarpSettings.usemySQL) { + // We probably dont need to do this for SQLite. + try { + if(!conn.isValid(10)) conn = initialize(); + } catch (SQLException ex) { + WarpLogger.severe("Failed to check SQL status", ex); + } + } + return conn; + } public static void closeConnection() { - if(conn != null) { - try { - conn.close(); - conn = null; - } catch (SQLException ex) { - WarpLogger.severe("Error on Connection close", ex); - } - } + if(conn != null) { + try { + if(WarpSettings.usemySQL){ + if(conn.isValid(10)) { + conn.close(); + } + conn = null; + } else { + conn.close(); + conn = null; + } + } catch (SQLException ex) { + WarpLogger.severe("Error on Connection close", ex); + } + } } diff --git a/src/main/java/me/taylorkelly/mywarp/WarpDataSource.java b/src/main/java/me/taylorkelly/mywarp/sql/WarpDataSource.java similarity index 81% rename from src/main/java/me/taylorkelly/mywarp/WarpDataSource.java rename to src/main/java/me/taylorkelly/mywarp/sql/WarpDataSource.java index 1dbd8693ea..f7cab7d4b0 100644 --- a/src/main/java/me/taylorkelly/mywarp/WarpDataSource.java +++ b/src/main/java/me/taylorkelly/mywarp/sql/WarpDataSource.java @@ -1,4 +1,4 @@ -package me.taylorkelly.mywarp; +package me.taylorkelly.mywarp.sql; import java.sql.Connection; import java.sql.DatabaseMetaData; @@ -9,8 +9,10 @@ import java.sql.Statement; import java.io.File; import java.util.HashMap; -import java.util.logging.Level; -import java.util.logging.Logger; + +import me.taylorkelly.mywarp.WarpSettings; +import me.taylorkelly.mywarp.data.Warp; +import me.taylorkelly.mywarp.utils.WarpLogger; public class WarpDataSource { public final static String sqlitedb = "/warps.db"; @@ -63,9 +65,9 @@ public static HashMap getMap() { Warp warp = new Warp(index, name, creator, world, x, y, z, yaw, pitch, publicAll, permissions, welcomeMessage); ret.put(name, warp); } - WarpLogger.info("[MYWARP]: " + size + " warps loaded"); + WarpLogger.info("" + size + " warps loaded"); } catch (SQLException ex) { - WarpLogger.severe("[MYWARP]: Warp Load Exception"); + WarpLogger.severe("Warp Load Exception"); } finally { try { if (statement != null) @@ -73,7 +75,7 @@ public static HashMap getMap() { if (set != null) set.close(); } catch (SQLException ex) { - WarpLogger.severe("[MYWARP]: Warp Load Exception (on close)"); + WarpLogger.severe("Warp Load Exception (on close)"); } } return ret; @@ -90,16 +92,14 @@ private static boolean tableExists() { return false; return true; } catch (SQLException ex) { - Logger log = Logger.getLogger("Minecraft"); - WarpLogger.severe("[MYWARP]: Table Check Exception", ex); + WarpLogger.severe("Table Check Exception", ex); return false; } finally { try { if (rs != null) rs.close(); } catch (SQLException ex) { - Logger log = Logger.getLogger("Minecraft"); - WarpLogger.severe("[MYWARP]: Table Check SQL Exception (on closing)"); + WarpLogger.severe("Table Check SQL Exception (on closing)"); } } } @@ -107,7 +107,7 @@ private static boolean tableExists() { private static void createTable() { Statement st = null; try { - WarpLogger.info("[MyWarp] Creating Database..."); + WarpLogger.info("Creating Database..."); Connection conn = ConnectionManager.getConnection(); st = conn.createStatement(); st.executeUpdate(WARP_TABLE); @@ -116,7 +116,7 @@ private static void createTable() { if(WarpSettings.usemySQL){ // We need to set auto increment on SQL. String sql = "ALTER TABLE `warpTable` CHANGE `id` `id` INT NOT NULL AUTO_INCREMENT "; - WarpLogger.info("[MyWarp] Modifying database for MySQL support"); + WarpLogger.info("Modifying database for MySQL support"); st = conn.createStatement(); st.executeUpdate(sql); conn.commit(); @@ -124,10 +124,10 @@ private static void createTable() { // Check for old warps.db and import to mysql File sqlitefile = new File(WarpSettings.dataDir.getAbsolutePath() + sqlitedb); if (!sqlitefile.exists()) { - WarpLogger.info("[MyWarp] Could not find old " + sqlitedb); + WarpLogger.info("Could not find old " + sqlitedb); return; } else { - WarpLogger.info("[MyWarp] Trying to import warps from warps.db"); + WarpLogger.info("Trying to import warps from warps.db"); Class.forName("org.sqlite.JDBC"); Connection sqliteconn = DriverManager.getConnection("jdbc:sqlite:" + WarpSettings.dataDir.getAbsolutePath() + sqlitedb); sqliteconn.setAutoCommit(false); @@ -152,10 +152,10 @@ private static void createTable() { Warp warp = new Warp(index, name, creator, world, x, y, z, yaw, pitch, publicAll, permissions, welcomeMessage); addWarp(warp); } - WarpLogger.info("[MyWarp] Imported " + size + " warps from " + sqlitedb); - WarpLogger.info("[MyWarp] Renaming " + sqlitedb + " to " + sqlitedb + ".old"); + WarpLogger.info("Imported " + size + " warps from " + sqlitedb); + WarpLogger.info("Renaming " + sqlitedb + " to " + sqlitedb + ".old"); if (!sqlitefile.renameTo(new File(WarpSettings.dataDir.getAbsolutePath(), sqlitedb + ".old"))) { - WarpLogger.warning("[MyWarp] Failed to rename " + sqlitedb + "! Please rename this manually!"); + WarpLogger.warning("Failed to rename " + sqlitedb + "! Please rename this manually!"); } if (slstatement != null) { slstatement.close(); @@ -170,23 +170,22 @@ private static void createTable() { } } } catch (SQLException e) { - WarpLogger.severe("[MyWarp] Create Table Exception", e); + WarpLogger.severe("Create Table Exception", e); } catch (ClassNotFoundException e) { - WarpLogger.severe("[MyWarp] You need the SQLite library.", e); + WarpLogger.severe("You need the SQLite library.", e); } finally { try { if (st != null) { st.close(); } } catch (SQLException e) { - WarpLogger.severe("[MyWarp] Could not create the table (on close)"); + WarpLogger.severe("Could not create the table (on close)"); } } } public static void addWarp(Warp warp) { PreparedStatement ps = null; - Logger log = Logger.getLogger("Minecraft"); try { Connection conn = ConnectionManager.getConnection(); @@ -207,14 +206,14 @@ public static void addWarp(Warp warp) { ps.executeUpdate(); conn.commit(); } catch (SQLException ex) { - WarpLogger.severe("[MYWARP]: Warp Insert Exception", ex); + WarpLogger.severe("Warp Insert Exception", ex); } finally { try { if (ps != null) { ps.close(); } } catch (SQLException ex) { - WarpLogger.severe("[MYWARP]: Warp Insert Exception (on close)", ex); + WarpLogger.severe("Warp Insert Exception (on close)", ex); } } } @@ -222,7 +221,6 @@ public static void addWarp(Warp warp) { public static void deleteWarp(Warp warp) { PreparedStatement ps = null; ResultSet set = null; - Logger log = Logger.getLogger("Minecraft"); try { Connection conn = ConnectionManager.getConnection(); @@ -231,7 +229,7 @@ public static void deleteWarp(Warp warp) { ps.executeUpdate(); conn.commit(); } catch (SQLException ex) { - WarpLogger.severe("[MYWARP]: Warp Delete Exception", ex); + WarpLogger.severe("Warp Delete Exception", ex); } finally { try { if (ps != null) { @@ -241,7 +239,7 @@ public static void deleteWarp(Warp warp) { set.close(); } } catch (SQLException ex) { - WarpLogger.severe("[MYWARP]: Warp Delete Exception (on close)", ex); + WarpLogger.severe("Warp Delete Exception (on close)", ex); } } } @@ -249,7 +247,6 @@ public static void deleteWarp(Warp warp) { public static void publicizeWarp(Warp warp, boolean publicAll) { PreparedStatement ps = null; ResultSet set = null; - Logger log = Logger.getLogger("Minecraft"); try { Connection conn = ConnectionManager.getConnection(); @@ -259,7 +256,7 @@ public static void publicizeWarp(Warp warp, boolean publicAll) { ps.executeUpdate(); conn.commit(); } catch (SQLException ex) { - WarpLogger.severe("[MYWARP]: Warp Publicize Exception", ex); + WarpLogger.severe("Warp Publicize Exception", ex); } finally { try { if (ps != null) { @@ -269,7 +266,7 @@ public static void publicizeWarp(Warp warp, boolean publicAll) { set.close(); } } catch (SQLException ex) { - WarpLogger.severe("[MYWARP]: Warp Publicize Exception (on close)", ex); + WarpLogger.severe("Warp Publicize Exception (on close)", ex); } } } @@ -277,7 +274,6 @@ public static void publicizeWarp(Warp warp, boolean publicAll) { public static void updatePermissions(Warp warp) { PreparedStatement ps = null; ResultSet set = null; - Logger log = Logger.getLogger("Minecraft"); try { Connection conn = ConnectionManager.getConnection(); @@ -287,7 +283,7 @@ public static void updatePermissions(Warp warp) { ps.executeUpdate(); conn.commit(); } catch (SQLException ex) { - WarpLogger.severe("[MYWARP]: Warp Permissions Exception", ex); + WarpLogger.severe("Warp Permissions Exception", ex); } finally { try { if (ps != null) { @@ -297,7 +293,7 @@ public static void updatePermissions(Warp warp) { set.close(); } } catch (SQLException ex) { - WarpLogger.severe("[MYWARP]: Warp Permissions Exception (on close)", ex); + WarpLogger.severe("Warp Permissions Exception (on close)", ex); } } } @@ -305,7 +301,6 @@ public static void updatePermissions(Warp warp) { public static void updateCreator(Warp warp) { PreparedStatement ps = null; ResultSet set = null; - Logger log = Logger.getLogger("Minecraft"); try { Connection conn = ConnectionManager.getConnection(); @@ -316,7 +311,7 @@ public static void updateCreator(Warp warp) { conn.commit(); } catch (SQLException ex) { - WarpLogger.severe("[MYWARP]: Warp Creator Exception", ex); + WarpLogger.severe("Warp Creator Exception", ex); } finally { try { if (ps != null) { @@ -326,7 +321,7 @@ public static void updateCreator(Warp warp) { set.close(); } } catch (SQLException ex) { - WarpLogger.severe("[MYWARP]: Warp Creator Exception (on close)", ex); + WarpLogger.severe("Warp Creator Exception (on close)", ex); } } } @@ -334,7 +329,6 @@ public static void updateCreator(Warp warp) { public static void updateWelcomeMessage(Warp warp) { PreparedStatement ps = null; ResultSet set = null; - Logger log = Logger.getLogger("Minecraft"); try { Connection conn = ConnectionManager.getConnection(); @@ -345,7 +339,7 @@ public static void updateWelcomeMessage(Warp warp) { conn.commit(); } catch (SQLException ex) { - WarpLogger.severe("[MYWARP]: Warp Creator Exception", ex); + WarpLogger.severe("Warp Creator Exception", ex); } finally { try { if (ps != null) { @@ -355,7 +349,7 @@ public static void updateWelcomeMessage(Warp warp) { set.close(); } } catch (SQLException ex) { - WarpLogger.severe("[MYWARP]: Warp Creator Exception (on close)", ex); + WarpLogger.severe("Warp Creator Exception (on close)", ex); } } } @@ -378,7 +372,7 @@ public static void updateDB(String test, String sqlite, String mysql) { statement.executeQuery(test); statement.close(); } catch(SQLException ex) { - WarpLogger.info("[MYWARP]: Updating database"); + WarpLogger.info("Updating database"); // Failed the test so we need to execute the updates try { String[] query; @@ -396,7 +390,7 @@ public static void updateDB(String test, String sqlite, String mysql) { conn.commit(); sqlst.close(); } catch (SQLException exc) { - WarpLogger.severe("[MYWARP]: Failed to update the database to the new version - ", exc); + WarpLogger.severe("Failed to update the database to the new version - ", exc); ex.printStackTrace(); } } @@ -405,7 +399,7 @@ public static void updateDB(String test, String sqlite, String mysql) { public static void updateFieldType(String field, String type) { try { if (!WarpSettings.usemySQL) return; - WarpLogger.info("[MYWARP]: Updating database"); + WarpLogger.info("Updating database"); Connection conn = ConnectionManager.getConnection(); DatabaseMetaData meta = conn.getMetaData(); @@ -427,7 +421,7 @@ public static void updateFieldType(String field, String type) { } colRS.close(); } catch(SQLException ex) { - WarpLogger.severe("[MYWARP]: Failed to update the database to the new version - ", ex); + WarpLogger.severe("Failed to update the database to the new version - ", ex); ex.printStackTrace(); } } diff --git a/src/main/java/me/taylorkelly/mywarp/PropertiesFile.java b/src/main/java/me/taylorkelly/mywarp/utils/PropertiesFile.java similarity index 89% rename from src/main/java/me/taylorkelly/mywarp/PropertiesFile.java rename to src/main/java/me/taylorkelly/mywarp/utils/PropertiesFile.java index 70bd1c817d..641f87ec33 100644 --- a/src/main/java/me/taylorkelly/mywarp/PropertiesFile.java +++ b/src/main/java/me/taylorkelly/mywarp/utils/PropertiesFile.java @@ -1,4 +1,4 @@ -package me.taylorkelly.mywarp; +package me.taylorkelly.mywarp.utils; import java.io.*; import java.util.*; @@ -40,9 +40,9 @@ public PropertiesFile(File file) { map.put(key, new PropertiesEntry(value, comment)); } } catch (FileNotFoundException e) { - Logger.getLogger("Minecraft").log(Level.SEVERE, "[MYWARP]: Cannot read file " + file.getName()); + Logger.getLogger("Minecraft").log(Level.SEVERE, "Cannot read file " + file.getName()); } catch (IOException e) { - Logger.getLogger("Minecraft").log(Level.SEVERE, "[MYWARP]: Cannot create file " + file.getName()); + Logger.getLogger("Minecraft").log(Level.SEVERE, "Cannot create file " + file.getName()); } } @@ -71,7 +71,7 @@ public int getInt(String key, Integer defaultValue, String defaultComment) { try { return Integer.parseInt(map.get(key).value); } catch (Exception e) { - Logger.getLogger("Minecraft").log(Level.WARNING, "[MYWARP]: Trying to get Integer from " + key + ": " + map.get(key).value); + Logger.getLogger("Minecraft").log(Level.WARNING, "Trying to get Integer from " + key + ": " + map.get(key).value); return 0; } } else { @@ -86,7 +86,7 @@ public long getLong(String key, Long defaultValue, String defaultComment) { try { return Long.parseLong(map.get(key).value); } catch (Exception e) { - Logger.getLogger("Minecraft").log(Level.WARNING, "[MYWARP]: Trying to get Long from " + key + ": " + map.get(key).value); + Logger.getLogger("Minecraft").log(Level.WARNING, "Trying to get Long from " + key + ": " + map.get(key).value); return 0; } } else { @@ -101,7 +101,7 @@ public double getDouble(String key, Double defaultValue, String defaultComment) try { return Double.parseDouble(map.get(key).value); } catch (Exception e) { - Logger.getLogger("Minecraft").log(Level.WARNING, "[MYWARP]: Trying to get Double from " + key + ": " + map.get(key).value); + Logger.getLogger("Minecraft").log(Level.WARNING, "Trying to get Double from " + key + ": " + map.get(key).value); return 0; } } else { @@ -145,7 +145,7 @@ public void save() { } bwriter.flush(); } catch (IOException e) { - Logger.getLogger("Minecraft").log(Level.SEVERE, "[MYWARP]: IO Exception with file " + file.getName()); + Logger.getLogger("Minecraft").log(Level.SEVERE, "IO Exception with file " + file.getName()); } finally { try { if (bwriter != null) { @@ -156,7 +156,7 @@ public void save() { fwriter.close(); } } catch (IOException e) { - Logger.getLogger("Minecraft").log(Level.SEVERE, "[MYWARP]: IO Exception with file " + file.getName() + " (on close)"); + Logger.getLogger("Minecraft").log(Level.SEVERE, "IO Exception with file " + file.getName() + " (on close)"); } } diff --git a/src/main/java/me/taylorkelly/mywarp/utils/WarpLogger.java b/src/main/java/me/taylorkelly/mywarp/utils/WarpLogger.java new file mode 100644 index 0000000000..42ea934520 --- /dev/null +++ b/src/main/java/me/taylorkelly/mywarp/utils/WarpLogger.java @@ -0,0 +1,30 @@ +package me.taylorkelly.mywarp.utils; + +import java.util.logging.Level; +import java.util.logging.Logger; + +public class WarpLogger { + + private static String name = "MyWarp"; + private static final Logger log = Logger.getLogger("Minecraft"); + + public static void severe(String string, Exception ex) { + log.log(Level.SEVERE, format(string), ex); + } + + public static void severe(String string) { + log.severe(format(string)); + } + + public static void info(String string) { + log.info(format(string)); + } + + public static void warning(String string) { + log.warning(format(string)); + } + + public static String format(String msg) { + return String.format("[%s] %s", name, msg); + } +} diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml new file mode 100644 index 0000000000..e7248b0ba5 --- /dev/null +++ b/src/main/resources/config.yml @@ -0,0 +1,32 @@ +#Enable OP permissions with SuperPerms +opPermissions: true + +#Maximum number of warps any player can make +maxTotal: 15 + +#Maximum number of public warps any player can make +maxPublic: 5 + +#Maximum number of private warps any player can make +maxPrivate: 10 + +#MySQL Username (only if using MySQL) +mySQLuname: root + +#MySQL usage -- true = use MySQL database / false = use SQLite +usemySQL: false + +#Whether or not admins can see private warps in their list +adminPrivateWarps: true + +#MySQL Connection (only if using MySQL) +mySQLconn: jdbc:mysql://localhost:3306/minecraft + +#MySQL Password (only if using MySQL) +mySQLpass: password + +#Force sending of the chunk which people teleport to - default: false +loadChunks: false + +#Whether or not admins can disobey warp limits +adminsObeyLimits: false diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 12f3f287d2..eafc9bf157 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,8 +1,98 @@ name: MyWarp -version: 2.0 -author: flames +version: 2.2 +author: spathizilla +authors: + - tkelly + - flames +softdepend: + - Vault main: me.taylorkelly.mywarp.MyWarp commands: warp: + aliases: ['mywarp', 'mw'] description: All of the MyWarp commands - usage: / help - Displays the help for MyWarp \ No newline at end of file + usage: / help - Displays the help for MyWarp +permissions: + mywarp.admin: + description: Admin + default: op + mywarp.warp.basic.warp: + description: Usage of /warp + default: op + mywarp.warp.basic.delete: + description: Can delete warps + default: op + mywarp.warp.basic.list: + description: Can list warps + default: op + mywarp.warp.basic.welcome: + description: Can change the welcome message + default: op + mywarp.warp.basic.search: + description: Can search for a warp + default: op + mywarp.warp.basic.createprivate: + description: Allowed to create private warps + default: op + mywarp.warp.basic.createpublic: + description: Allowed to create public warps + default: op + mywarp.warp.basic.compass: + description: Compass can be used + default: op + mywarp.warp.soc.give: + description: Can give to your /warp + default: op + mywarp.warp.soc.invite: + description: Can invite to your /warp + default: op + mywarp.warp.soc.uninvite: + description: Can uninvite people from your /warp + default: op + mywarp.warp.soc.public: + description: Allow anyone to use your /warp + default: op + mywarp.warp.soc.private: + description: Disallow anyone to use your /warp + default: op + mywarp.warp.sign.warp: + description: Can use sign warps + default: op + mywarp.warp.sign.create: + description: Can make sign warps + default: op + mywarp.warp.basic.*: + description: Basic /warp commands + children: + mywarp.warp.basic.warp: true + mywarp.warp.basic.delete: true + mywarp.warp.basic.list: true + mywarp.warp.basic.welcome: true + mywarp.warp.basic.search: true + mywarp.warp.basic.createprivate: true + mywarp.warp.basic.createpublic: true + mywarp.warp.basic.compass: true + mywarp.warp.soc.*: + description: Social /warp commands + children: + mywarp.warp.soc.give: true + mywarp.warp.soc.invite: true + mywarp.warp.soc.uninvite: true + mywarp.warp.soc.public: true + mywarp.warp.soc.private: true + mywarp.warp.sign.*: + description: All sign based warp permissions + children: + mywarp.warp.sign.warp: true + mywarp.warp.sign.create: true + mywarp.warp.*: + description: All user permissions + children: + mywarp.warp.soc.*: true + mywarp.warp.sign.*: true + mywarp.warp.basic.*: true + mywarp.*: + description: Full access + children: + mywarp.warp.*: true + mywarp.admin: true diff --git a/target/MyWarp.jar b/target/MyWarp.jar deleted file mode 100644 index 69750da0c1..0000000000 Binary files a/target/MyWarp.jar and /dev/null differ