Browse Source

WOW! Now "/rscp player <player> <-n(--by-name)|-u(--by-uuid)|-i(--by-ip)> ..." is identical to "/rscp user new <name|uuid|ip of a player> ..."!

master
Stanislav Usenkov 9 years ago
parent
commit
e0a75cb51d
  1. 31
      src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitUtilities.java
  2. 6
      src/main/java/ru/simsonic/rscPermissions/Bukkit/Commands/BukkitCommands.java
  3. 153
      src/main/java/ru/simsonic/rscPermissions/Bukkit/Commands/CommandEntity.java

31
src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitUtilities.java

@ -2,6 +2,7 @@ package ru.simsonic.rscPermissions.Bukkit;
import java.net.InetSocketAddress;
import java.util.ArrayList;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player;
import ru.simsonic.rscMinecraftLibrary.Bukkit.Tools;
@ -15,6 +16,36 @@ public class BukkitUtilities
return online;
return null;
}
public static OfflinePlayer findOfflinePlayer(String player)
{
OfflinePlayer result = null;
for(OfflinePlayer offline : Bukkit.getOfflinePlayers())
{
try
{
// Immediately return if UUID is the same
if(offline.getUniqueId().toString().replace("-", "").equalsIgnoreCase(player))
{
result = offline;
break;
}
} catch(RuntimeException | NoSuchMethodError ex) {
}
try
{
// Find that player who had this name at last
final String name = offline.getName();
if(name != null && name.equalsIgnoreCase(player))
{
if(result != null && result.getLastPlayed() > offline.getLastPlayed())
continue;
result = offline;
}
} catch(RuntimeException | NoSuchMethodError ex) {
}
}
return result;
}
public static String[] getOfflinePlayerIdentifiers(OfflinePlayer offline)
{
final ArrayList<String> result = new ArrayList<>();

6
src/main/java/ru/simsonic/rscPermissions/Bukkit/Commands/BukkitCommands.java

@ -140,15 +140,15 @@ public class BukkitCommands
return;
case "group":
case "g":
cmdEntity.onEntityCommandHub(sender, CommandEntity.TargetType.GROUP, args);
cmdEntity.onCommandHub(sender, CommandEntity.TargetType.GROUP, args);
return;
case "user":
case "u":
cmdEntity.onEntityCommandHub(sender, CommandEntity.TargetType.USER, args);
cmdEntity.onCommandHub(sender, CommandEntity.TargetType.USER, args);
return;
case "player":
case "p":
cmdEntity.onEntityCommandHub(sender, CommandEntity.TargetType.PLAYER, args);
cmdEntity.onCommandHub(sender, CommandEntity.TargetType.PLAYER, args);
return;
case "lock":
cmdLock.executeLock(sender, args);

153
src/main/java/ru/simsonic/rscPermissions/Bukkit/Commands/CommandEntity.java

@ -7,6 +7,7 @@ import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.bukkit.OfflinePlayer;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import ru.simsonic.rscMinecraftLibrary.Bukkit.CommandAnswerException;
@ -80,33 +81,95 @@ public class CommandEntity
answer.add(line.replace("{:T}", typeId));
return answer;
}
public void onEntityCommandHub(CommandSender sender, TargetType type, String[] args) throws CommandAnswerException
public void onCommandHub(CommandSender sender, TargetType type, String[] args) throws CommandAnswerException
{
if(sender.hasPermission("rscp.admin") == false)
throw new CommandAnswerException("Not enough permissions.");
args = Arrays.copyOfRange(args, 1, args.length);
if(args.length == 0)
throw new CommandAnswerException(getHelpForType(type));
final boolean forceEntityCreation = args.length > 1 && "new".equalsIgnoreCase(args[0]);
boolean forceEntityCreation = args.length > 1 && "new".equalsIgnoreCase(args[0]);
if(forceEntityCreation)
{
// Remove this optional argument from the battlefront
args = Arrays.copyOfRange(args, 1, args.length);
}
// Find what is the target for operation
ResolutionResult result = null;
RowEntity entity = null;
switch(type)
if(type.equals(TargetType.PLAYER))
{
// Search for online or offline player object
String target = args[0];
final Player online = BukkitUtilities.findOnlinePlayer(target);
final OfflinePlayer offline = online != null
? online
: BukkitUtilities.findOfflinePlayer(target);
// Does command sender require convertion of game Player into database User?
boolean convertToName = false;
boolean convertToUUID = false;
boolean convertToIPv4 = false;
if(args.length > 1 && args[1] != null && !"".equals(args[1]))
{
switch(args[1].toLowerCase())
{
case "--by-name":
case "-n":
convertToName = true;
break;
case "--by-uuid":
case "-u":
convertToUUID = true;
break;
case "--by-ip":
case "-i":
convertToIPv4 = true;
break;
}
}
// Crop parameter #1 from arguments list
if(convertToName || convertToUUID || convertToIPv4)
{
case PLAYER:
final Player online = BukkitUtilities.findOnlinePlayer(args[0]);
// Convert player into user with specified parameter
try
{
if(offline != null && convertToName)
{
target = offline.getName();
forceEntityCreation = true;
}
} catch(RuntimeException | NoSuchMethodError ex) {
}
try
{
if(offline != null && convertToUUID)
{
target = offline.getUniqueId().toString();
forceEntityCreation = true;
}
} catch(RuntimeException | NoSuchMethodError ex) {
}
if(online != null && convertToIPv4)
{
target = online.getAddress().getAddress().getHostAddress();
forceEntityCreation = true;
}
args = Arrays.copyOfRange(args, 1, args.length);
args[0] = target;
type = TargetType.USER;
} else {
// Calculate player's permission tree
if(online != null)
{
args[0] = online.getName();
result = rscp.permissionManager.getResult(online);
break;
}
} else if(offline != null) {
args[0] = offline.getName();
result = rscp.permissionManager.getResult(offline);
} else
result = rscp.permissionManager.getResult(args[0]);
break;
}
}
switch(type)
{
case USER:
entity = rscp.internalCache.findUserEntity(args[0]);
if(entity == null && forceEntityCreation)
@ -117,6 +180,8 @@ public class CommandEntity
if(entity == null && forceEntityCreation)
entity = createEntity(EntityType.GROUP, args[0]);
break;
case PLAYER:
// Already dispatched
}
if(entity == null && result == null)
throw new CommandAnswerException(new String[]
@ -124,44 +189,39 @@ public class CommandEntity
"{_LR}Sorry, I don't know such identifier!",
"{_LR}Do you want to force it's creation with special keyword {_YL}new{_LR} before name?",
});
final String targetName = args[0];
if(result != null)
onPlayerCommand(result, args);
else
onEntityCommand(entity, type, args);
throw new CommandAnswerException(getHelpForType(type));
}
private void onEntityCommand(RowEntity entity, TargetType type, String[] args) throws CommandAnswerException
{
final String subcommand = args.length > 1 && args[1] != null
? args[1].toLowerCase()
: "info";
// Subcommands that doesn't require more arguments
switch(subcommand)
{
case "prefix":
case "p":
if(result != null)
showPlayerPrefix(result, targetName);
else
showEntityPrefix(entity);
break;
case "suffix":
case "s":
if(result != null)
showPlayerSuffix(result, targetName);
else
showEntitySuffix(entity);
break;
case "listpermissions":
case "permissions":
case "lp":
if(result != null)
showPlayerPermissions(result, targetName);
else
showEntityPermissions(entity);
break;
case "listgroups":
case "groups":
case "lg":
if(result != null)
showPlayerParents(result, targetName);
else
showEntityParents(entity);
break;
case "info":
if(entity != null)
throw new CommandAnswerException(showEntityDetails(entity));
case "help":
throw new CommandAnswerException(getHelpForType(type));
@ -173,6 +233,14 @@ public class CommandEntity
final OptionalParams optional = ArgumentUtilities.parseCommandParams(args);
switch(subcommand)
{
case "setprefix":
case "sp":
// TO DO HERE
break;
case "setsuffix":
case "ss":
// TO DO HERE
break;
case "addgroup":
case "ag":
addGroup (entity, target, optional);
@ -189,16 +257,39 @@ public class CommandEntity
case "rp":
removePermission(entity, target);
break;
case "setprefix":
case "sp":
// TO DO HERE
}
}
private void onPlayerCommand(ResolutionResult result, String[] args) throws CommandAnswerException
{
final String targetName = args[0];
final String subcommand = args.length > 1 && args[1] != null
? args[1].toLowerCase()
: "info";
switch(subcommand)
{
case "prefix":
case "p":
showPlayerPrefix(result, args[0]);
break;
case "setsuffix":
case "ss":
// TO DO HERE
case "suffix":
case "s":
showPlayerSuffix(result, targetName);
break;
case "listpermissions":
case "permissions":
case "lp":
showPlayerPermissions(result, targetName);
break;
case "listgroups":
case "groups":
case "lg":
showPlayerParents(result, targetName);
break;
case "info":
// Should I show some INFO for this result? not now ...
case "help":
throw new CommandAnswerException(getHelpForType(TargetType.PLAYER));
}
throw new CommandAnswerException(getHelpForType(type));
}
private RowEntity createEntity(EntityType type, String name)
{

Loading…
Cancel
Save