Plex/src/main/java/dev/plex/command/PlexCommand.java

266 lines
7.2 KiB
Java
Raw Normal View History

2021-01-03 07:21:15 +00:00
package dev.plex.command;
2020-10-31 04:51:22 +00:00
import com.google.common.collect.ImmutableList;
2021-01-03 07:21:15 +00:00
import dev.plex.Plex;
import dev.plex.command.annotation.CommandParameters;
import dev.plex.command.annotation.CommandPermissions;
import dev.plex.command.exception.CommandArgumentException;
import dev.plex.command.exception.CommandFailException;
import dev.plex.command.exception.PlayerNotFoundException;
import dev.plex.command.source.CommandSource;
import dev.plex.command.source.RequiredCommandSource;
2020-11-06 01:29:38 +00:00
import java.util.Arrays;
import java.util.List;
import java.util.UUID;
2021-01-03 07:21:15 +00:00
import dev.plex.cache.DataUtils;
import dev.plex.cache.PlayerCache;
import dev.plex.player.PlexPlayer;
import dev.plex.rank.enums.Rank;
import dev.plex.util.PlexUtils;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.World;
2020-11-06 01:29:38 +00:00
import org.bukkit.command.Command;
import org.bukkit.command.CommandMap;
import org.bukkit.command.CommandSender;
import org.bukkit.command.ConsoleCommandSender;
import org.bukkit.command.TabExecutor;
import org.bukkit.entity.Player;
2020-10-31 04:51:22 +00:00
public abstract class PlexCommand extends Command implements TabExecutor, IPlexCommand
2020-10-31 04:51:22 +00:00
{
protected static Plex plugin = Plex.get();
2020-10-31 04:51:22 +00:00
private final CommandParameters params;
private final CommandPermissions perms;
2020-10-31 04:51:22 +00:00
private final Rank level;
private CommandSource sender;
private final RequiredCommandSource commandSource;
2020-10-31 04:51:22 +00:00
public PlexCommand(String name)
2020-10-31 04:51:22 +00:00
{
super(name);
this.params = getClass().getAnnotation(CommandParameters.class);
this.perms = getClass().getAnnotation(CommandPermissions.class);
setName(name);
setLabel(name);
setDescription(params.description());
setUsage(params.usage().replace("<command>", name));
if (params.aliases().split(",").length > 0)
{
setAliases(Arrays.asList(params.aliases().split(",")));
}
this.level = perms.level();
this.commandSource = perms.source();
getMap().register("", this);
2020-10-31 04:51:22 +00:00
}
@Override
public boolean execute(CommandSender sender, String label, String[] args)
2020-10-31 04:51:22 +00:00
{
onCommand(sender, this, label, args);
return true;
2020-10-31 04:51:22 +00:00
}
@Override
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args)
2020-10-31 04:51:22 +00:00
{
2020-11-06 01:29:38 +00:00
if (!matches(label))
{
return false;
}
if (commandSource == RequiredCommandSource.CONSOLE && sender instanceof Player)
{
2020-11-05 21:17:14 +00:00
sender.sendMessage(tl("noPermissionInGame"));
return true;
}
if (commandSource == RequiredCommandSource.IN_GAME)
2020-10-31 04:51:22 +00:00
{
if (sender instanceof ConsoleCommandSender)
{
2020-11-05 21:17:14 +00:00
sender.sendMessage(tl("noPermissionConsole"));
return true;
}
2020-11-06 01:29:38 +00:00
Player player = (Player)sender;
this.sender = new CommandSource(player);
PlexPlayer plexPlayer = PlayerCache.getPlexPlayerMap().get(player.getUniqueId());
if (!plexPlayer.getRankFromString().isAtLeast(getLevel()))
2020-10-31 04:51:22 +00:00
{
2020-11-05 21:17:14 +00:00
sender.sendMessage(tl("noPermissionRank", ChatColor.stripColor(getLevel().getLoginMSG())));
return true;
2020-10-31 04:51:22 +00:00
}
}
try
{
this.sender = new CommandSource(sender);
execute(this.sender, args);
}
catch (CommandArgumentException ex)
{
send(getUsage().replace("<command>", getLabel()));
}
catch (PlayerNotFoundException | CommandFailException ex)
{
send(ex.getMessage());
}
return true;
2020-10-31 04:51:22 +00:00
}
@Override
public List<String> tabComplete(CommandSender sender, String alias, String[] args)
{
2020-11-06 01:29:38 +00:00
if (!matches(alias))
{
return ImmutableList.of();
}
if (sender instanceof Player)
2020-10-31 04:51:22 +00:00
{
2020-11-06 01:29:38 +00:00
Player player = (Player)sender;
this.sender = new CommandSource(player);
PlexPlayer plexPlayer = PlayerCache.getPlexPlayerMap().get(player.getUniqueId());
if (plexPlayer.getRankFromString().isAtLeast(getLevel()))
{
return onTabComplete(this.sender, args);
2020-11-06 01:29:38 +00:00
}
else
{
return ImmutableList.of();
}
2020-11-06 01:29:38 +00:00
}
else
{
this.sender = new CommandSource(sender);
return onTabComplete(this.sender, args);
2020-10-31 04:51:22 +00:00
}
}
2020-10-31 04:51:22 +00:00
@Override
public List<String> onTabComplete(CommandSender sender, Command cmd, String label, String[] args)
{
return tabComplete(sender, label, args);
}
2020-10-31 04:51:22 +00:00
private boolean matches(String label)
{
if (params.aliases().split(",").length > 0)
2020-10-31 04:51:22 +00:00
{
for (String alias : params.aliases().split(","))
{
if (alias.equalsIgnoreCase(label) || getName().equalsIgnoreCase(label))
{
return true;
}
}
2020-11-06 01:29:38 +00:00
}
else if (params.aliases().split(",").length < 1)
2020-10-31 04:51:22 +00:00
{
return getName().equalsIgnoreCase(label);
2020-10-31 04:51:22 +00:00
}
return false;
2020-10-31 04:51:22 +00:00
}
protected void send(String s, CommandSource sender)
{
sender.send(s);
}
protected void send(String s, Player player)
{
player.sendMessage(s);
}
protected boolean isAdmin(PlexPlayer plexPlayer)
{
return Plex.get().getRankManager().isAdmin(plexPlayer);
}
protected boolean isAdmin(String name)
{
PlexPlayer plexPlayer = DataUtils.getPlayer(name);
return Plex.get().getRankManager().isAdmin(plexPlayer);
}
protected boolean isConsole()
{
return !(sender instanceof Player);
}
protected String tl(String s, Object... objects)
{
return PlexUtils.tl(s, objects);
}
2020-11-05 21:17:14 +00:00
protected String usage(String s)
{
return ChatColor.YELLOW + "Correct Usage: " + ChatColor.GRAY + s;
}
protected void send(String s)
{
if (sender == null)
2020-11-06 01:29:38 +00:00
{
return;
2020-11-06 01:29:38 +00:00
}
send(s, sender);
}
protected Player getNonNullPlayer(String name)
{
Player player = Bukkit.getPlayer(name);
if (player == null)
2020-11-06 01:29:38 +00:00
{
throw new PlayerNotFoundException();
2020-11-06 01:29:38 +00:00
}
return player;
}
protected PlexPlayer getOnlinePlexPlayer(String name)
{
Player player = getNonNullPlayer(name);
PlexPlayer plexPlayer = PlayerCache.getPlexPlayer(player.getUniqueId());
if (plexPlayer == null)
2020-11-06 01:29:38 +00:00
{
throw new PlayerNotFoundException();
2020-11-06 01:29:38 +00:00
}
return plexPlayer;
}
protected PlexPlayer getOfflinePlexPlayer(UUID uuid)
{
PlexPlayer plexPlayer = PlayerCache.getPlexPlayer(uuid);
if (plexPlayer == null)
2020-11-06 01:29:38 +00:00
{
throw new PlayerNotFoundException();
2020-11-06 01:29:38 +00:00
}
return plexPlayer;
}
protected World getNonNullWorld(String name)
{
World world = Bukkit.getWorld(name);
if (world == null)
2020-11-06 01:29:38 +00:00
{
throw new CommandFailException(tl("worldNotFound"));
2020-11-06 01:29:38 +00:00
}
return world;
}
public Rank getLevel()
2020-10-31 04:51:22 +00:00
{
return level;
}
public CommandMap getMap()
{
return Plex.get().getServer().getCommandMap();
2020-10-31 04:51:22 +00:00
}
}