Skip to content

Commit

Permalink
Implement radius argument in bukkit implementation.
Browse files Browse the repository at this point in the history
  • Loading branch information
dscalzi committed Oct 6, 2019
1 parent ee4b952 commit f47e474
Show file tree
Hide file tree
Showing 14 changed files with 296 additions and 81 deletions.
10 changes: 10 additions & 0 deletions SkyChanger-Bukkit/build.gradle
Expand Up @@ -47,6 +47,7 @@ bukkit {
children = [
'skychanger.changesky.self',
'skychanger.changesky.others',
'skychanger.changesky.radius.*',
'skychanger.changesky.world.*',
'skychanger.changesky.all'
]
Expand All @@ -59,6 +60,10 @@ bukkit {
description = 'Access to change the sky color for a specific player.'
setDefault('OP')
}
'skychanger.changesky.radius.*' {
description = 'Access to change the sky color for players within a radius.'
setDefault('OP')
}
'skychanger.changesky.world.*' {
description = 'Access to change the sky color of a specific world.'
setDefault('OP')
Expand All @@ -72,6 +77,7 @@ bukkit {
children = [
'skychanger.freeze.self',
'skychanger.freeze.others',
'skychanger.freeze.radius.*',
'skychanger.freeze.world.*',
'skychanger.freeze.all'
]
Expand All @@ -84,6 +90,10 @@ bukkit {
description = 'Access to freeze/unfreeze a specific person.'
setDefault('OP')
}
'skychanger.freeze.radius.*' {
description = 'Access to freeze/unfreeze a players within a radius.'
setDefault('OP')
}
'skychanger.freeze.world.*' {
description = 'Access to freeze/unfreeze a specific world.'
setDefault('OP')
Expand Down
Expand Up @@ -29,11 +29,14 @@
import java.util.regex.Pattern;

import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.OfflinePlayer;
import org.bukkit.World;
import org.bukkit.command.BlockCommandSender;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.command.ConsoleCommandSender;
import org.bukkit.command.TabCompleter;
import org.bukkit.entity.Player;

Expand Down Expand Up @@ -101,8 +104,9 @@ private void cmdChangeSky(CommandSender sender, String[] args) {
boolean s = sender.hasPermission(basePerm + ".self");
boolean o = sender.hasPermission(basePerm + ".others");
boolean a = sender.hasPermission(basePerm + ".all");
boolean w = WorldPermissionUtil.hasGeneralChangeskyPerm(sender);
if (!s && !o && !a && !w) {
boolean w = WildcardPermissionUtil.hasGeneralChangeskyWorldPerm(sender);
boolean r = WildcardPermissionUtil.hasGeneralChangeskyRadiusPerm(sender);
if (!s && !o && !a && !w && !r) {
mm.noPermission(sender);
return;
}
Expand Down Expand Up @@ -155,7 +159,7 @@ private void cmdChangeSky(CommandSender sender, String[] args) {
}
t = ((Player) sender).getWorld();
}
if (!WorldPermissionUtil.hasChangeskyPerm(sender, t)) {
if (!WildcardPermissionUtil.hasChangeskyWorldPerm(sender, t)) {
mm.noPermission(sender);
return;
}
Expand All @@ -165,6 +169,49 @@ private void cmdChangeSky(CommandSender sender, String[] args) {
mm.packetSent(sender, mm.getString("message.allPlayersIn") + " " + t.getName());
return;
}
// Check if requested for radius
if (args[1].equalsIgnoreCase("-r")) {
if (sender instanceof ConsoleCommandSender) {
MessageManager.getInstance().denyNonPlayer(sender);
return;
}
if(args.length > 2) {
double radius;
double radiusSq;
try {
radius = Double.parseDouble(args[2]);

if (!WildcardPermissionUtil.hasChangeskyRadiusPerm(sender, radius)) {
mm.noPermission(sender);
return;
}

radiusSq = Math.pow(radius, 2);
} catch (NumberFormatException e) {
MessageManager.getInstance().radiusFormatError(sender);
return;
}
Location origin;
if (sender instanceof Player) {
origin = ((Player)sender).getLocation();
} else if (sender instanceof BlockCommandSender) {
origin = ((BlockCommandSender)sender).getBlock().getLocation();
} else {
MessageManager.getInstance().denyNonPlayer(sender);
return;
}
for(Player p : origin.getWorld().getPlayers()) {
if(Math.abs(origin.distanceSquared(p.getLocation())) <= radiusSq) {
api.changeSky(p, pN);
}
}
mm.packetSent(sender, mm.getString("message.allPlayersInRadius") + " " + args[2]);
return;
} else {
mm.mustSpecifyRadius(sender);
return;
}
}
// Check if param is a player
if (!o) {
mm.noPermission(sender);
Expand Down Expand Up @@ -209,8 +256,9 @@ private void cmdFreeze(CommandSender sender, boolean unfreeze, String[] args) {
boolean s = sender.hasPermission(basePerm + ".self");
boolean o = sender.hasPermission(basePerm + ".others");
boolean a = sender.hasPermission(basePerm + ".all");
boolean w = WorldPermissionUtil.hasGeneralFreezePerm(sender);
if (!s && !o && !a && !w) {
boolean w = WildcardPermissionUtil.hasGeneralFreezeWorldPerm(sender);
boolean r = WildcardPermissionUtil.hasGeneralFreezeRadiusPerm(sender);
if (!s && !o && !a && !w && !r) {
mm.noPermission(sender);
return;
}
Expand Down Expand Up @@ -250,7 +298,7 @@ private void cmdFreeze(CommandSender sender, boolean unfreeze, String[] args) {
}
t = ((Player) sender).getWorld();
}
if (!WorldPermissionUtil.hasFreezePerm(sender, t)) {
if (!WildcardPermissionUtil.hasFreezeWorldPerm(sender, t)) {
mm.noPermission(sender);
return;
}
Expand All @@ -266,6 +314,55 @@ private void cmdFreeze(CommandSender sender, boolean unfreeze, String[] args) {
mm.packetSent(sender, mm.getString("message.allPlayersIn") + " " + t.getName());
return;
}
// Check if requested for radius
if (args[1].equalsIgnoreCase("-r")) {
if (sender instanceof ConsoleCommandSender) {
MessageManager.getInstance().denyNonPlayer(sender);
return;
}
if(args.length > 2) {
double radius;
double radiusSq;
try {
radius = Double.parseDouble(args[2]);

if (!WildcardPermissionUtil.hasFreezeRadiusPerm(sender, radius)) {
mm.noPermission(sender);
return;
}

radiusSq = Math.pow(radius, 2);
} catch (NumberFormatException e) {
MessageManager.getInstance().radiusFormatError(sender);
return;
}
Location origin;
if (sender instanceof Player) {
origin = ((Player)sender).getLocation();
} else if (sender instanceof BlockCommandSender) {
origin = ((BlockCommandSender)sender).getBlock().getLocation();
} else {
MessageManager.getInstance().denyNonPlayer(sender);
return;
}
for(Player p : origin.getWorld().getPlayers()) {
if(Math.abs(origin.distanceSquared(p.getLocation())) <= radiusSq) {
if (unfreeze)
api.unfreeze(p);
else
api.freeze(p);
}
}
if (unfreeze)
mm.packetUnfreeze(sender, mm.getString("message.allPlayersInRadius") + " " + args[2]);
else
mm.packetSent(sender, mm.getString("message.allPlayersInRadius") + " " + args[2]);
return;
} else {
mm.mustSpecifyRadius(sender);
return;
}
}
// Check if param is a player
if (!o) {
mm.noPermission(sender);
Expand Down Expand Up @@ -334,7 +431,8 @@ public List<String> onTabComplete(CommandSender sender, Command command, String
List<String> ret = new ArrayList<String>();

boolean b = sender.hasPermission("skychanger.freeze.self") || sender.hasPermission("skychanger.freeze.others")
|| sender.hasPermission("skychanger.freeze.all") || WorldPermissionUtil.hasGeneralFreezePerm(sender);
|| sender.hasPermission("skychanger.freeze.all") || WildcardPermissionUtil.hasGeneralFreezeWorldPerm(sender)
|| WildcardPermissionUtil.hasGeneralFreezeRadiusPerm(sender);

if (args.length == 1) {
if ("help".startsWith(args[0].toLowerCase()))
Expand Down Expand Up @@ -365,14 +463,24 @@ public List<String> onTabComplete(CommandSender sender, Command command, String
}
// World flag
if (args[0].equalsIgnoreCase("freeze") || args[0].equalsIgnoreCase("unfreeze")) {
if ("-w".startsWith(args[1].toLowerCase()) && WorldPermissionUtil.hasGeneralFreezePerm(sender)) {
if ("-w".startsWith(args[1].toLowerCase()) && WildcardPermissionUtil.hasGeneralFreezeWorldPerm(sender)) {
ret.add("-w");
}
} else {
if ("-w".startsWith(args[1].toLowerCase()) && WorldPermissionUtil.hasGeneralChangeskyPerm(sender)) {
if ("-w".startsWith(args[1].toLowerCase()) && WildcardPermissionUtil.hasGeneralChangeskyWorldPerm(sender)) {
ret.add("-w");
}
}
// Radius flag
if (args[0].equalsIgnoreCase("freeze") || args[0].equalsIgnoreCase("unfreeze")) {
if ("-r".startsWith(args[1].toLowerCase()) && WildcardPermissionUtil.hasGeneralFreezeRadiusPerm(sender)) {
ret.add("-r");
}
} else {
if ("-r".startsWith(args[1].toLowerCase()) && WildcardPermissionUtil.hasGeneralChangeskyRadiusPerm(sender)) {
ret.add("-r");
}
}
}

// World names
Expand All @@ -381,14 +489,14 @@ public List<String> onTabComplete(CommandSender sender, Command command, String
if (packetNum.matcher(args[0]).matches()) {
for (World w : plugin.getServer().getWorlds()) {
if (w.getName().toLowerCase().startsWith(args[2].toLowerCase())
&& WorldPermissionUtil.hasChangeskyPerm(sender, w)) {
&& WildcardPermissionUtil.hasChangeskyWorldPerm(sender, w)) {
ret.add(w.getName());
}
}
} else if (args[0].equalsIgnoreCase("freeze") || args[0].equalsIgnoreCase("unfreeze")) {
for (World w : plugin.getServer().getWorlds()) {
if (w.getName().toLowerCase().startsWith(args[2].toLowerCase())
&& WorldPermissionUtil.hasFreezePerm(sender, w)) {
&& WildcardPermissionUtil.hasFreezeWorldPerm(sender, w)) {
ret.add(w.getName());
}
}
Expand Down
Expand Up @@ -24,22 +24,35 @@

package com.dscalzi.skychanger.bukkit.internal;

import java.util.function.Predicate;

import org.bukkit.World;
import org.bukkit.permissions.Permissible;
import org.bukkit.permissions.PermissionAttachmentInfo;

public class WorldPermissionUtil {
public class WildcardPermissionUtil {

private static final String CWORLDPERM = "skychanger.changesky.world";
private static final String FWORLDPERM = "skychanger.freeze.world";

private static final String CRADIUSPERM = "skychanger.changesky.radius";
private static final String FRADIUSPERM = "skychanger.freeze.radius";

public static boolean hasGeneralChangeskyPerm(Permissible p) {
public static boolean hasGeneralChangeskyWorldPerm(Permissible p) {
return hasGeneralPerm(p, CWORLDPERM);
}

public static boolean hasGeneralFreezePerm(Permissible p) {
public static boolean hasGeneralFreezeWorldPerm(Permissible p) {
return hasGeneralPerm(p, FWORLDPERM);
}

public static boolean hasGeneralChangeskyRadiusPerm(Permissible p) {
return hasGeneralPerm(p, CRADIUSPERM);
}

public static boolean hasGeneralFreezeRadiusPerm(Permissible p) {
return hasGeneralPerm(p, FRADIUSPERM);
}

private static boolean hasGeneralPerm(Permissible p, String perm) {
for (PermissionAttachmentInfo i : p.getEffectivePermissions()) {
Expand All @@ -49,36 +62,69 @@ private static boolean hasGeneralPerm(Permissible p, String perm) {
}
}
}
return false;
return p.hasPermission(perm + ".*");
}

public static boolean hasChangeskyPerm(Permissible p, World w) {
public static boolean hasChangeskyWorldPerm(Permissible p, World w) {
return hasWorldPerm(p, w, CWORLDPERM);
}

public static boolean hasFreezePerm(Permissible p, World w) {
public static boolean hasFreezeWorldPerm(Permissible p, World w) {
return hasWorldPerm(p, w, FWORLDPERM);
}

private static boolean hasWorldPerm(Permissible p, World w, String perm) {
return hasPerm(p, (i) -> i.getPermission().substring(perm.length() + 1).equals(w.getName()), perm)
|| p.hasPermission(perm + ".*");
}

public static boolean hasChangeskyRadiusPerm(Permissible p, double radius) {
return hasRadiusPerm(p, radius, CRADIUSPERM);
}

public static boolean hasFreezeRadiusPerm(Permissible p, double radius) {
return hasRadiusPerm(p, radius, FRADIUSPERM);
}

public static boolean hasRadiusPerm(Permissible p, double radius, String perm) {
return hasPerm(p, (i) -> {
try {
double radiusLimit = Double.parseDouble(i.getPermission().substring(perm.length() + 1));
return radius <= radiusLimit;
} catch (NumberFormatException e) {
// Malformed permission.
return false;
}
}, perm) || p.hasPermission(perm + ".*");
}

public static boolean hasPerm(Permissible p, Predicate<PermissionAttachmentInfo> hasSpecificPermissionTest, String perm) {
boolean canByRight = false;
for (PermissionAttachmentInfo i : p.getEffectivePermissions()) {
final String effective = i.getPermission().toLowerCase();
if (effective.equals(perm + ".*")) {
canByRight = i.getValue();
} else if (effective.indexOf(perm) > -1 && i.getPermission().substring(perm.length() + 1).equals(w.getName())) {
} else if (effective.indexOf(perm + '.') > -1 && hasSpecificPermissionTest.test(i)) {
return i.getValue();
}
}
return canByRight;
}

public static String changeskyBasePerm() {
public static String changeskyWorldBasePerm() {
return CWORLDPERM;
}

public static String freezeBasePerm() {
public static String freezeWorldBasePerm() {
return FWORLDPERM;
}

public static String changeskyRadiusBasePerm() {
return CRADIUSPERM;
}

public static String freezeRadiusBasePerm() {
return FRADIUSPERM;
}

}

0 comments on commit f47e474

Please sign in to comment.