New commands and limits
/mixtape list [<player>] (Fixes #5) /mixtape delete <alias> (Fixes #6) Global limit for aliases Per-user permission node limit for aliasesmain
parent
44fa5eb4c2
commit
f23062b3f5
|
@ -5,6 +5,12 @@
|
||||||
Commands
|
Commands
|
||||||
========
|
========
|
||||||
|
|
||||||
``/alias <alias> <message>`` - Create a chat alias
|
``/alias <alias> <message>`` - Create a chat alias.
|
||||||
|
|
||||||
``//alias <alias> <command>`` - Create a command alias
|
``//alias <alias> <command>`` - Create a command alias.
|
||||||
|
|
||||||
|
``/mixtape list [<player>]`` - List aliases. If a player has the ``mixtape.list.other`` permission, they can view other player's aliases as well.
|
||||||
|
|
||||||
|
``/mixtape delete <alias>`` - Delete an alias
|
||||||
|
|
||||||
|
``/mixtape reload`` - Reload Mixtape
|
||||||
|
|
|
@ -5,7 +5,15 @@
|
||||||
Permissions
|
Permissions
|
||||||
===========
|
===========
|
||||||
|
|
||||||
``mixtape.admin`` - Allows use of Mixtape admin commands, namely ``/mixtape reload``
|
``mixtape.admin`` - Allows use of Mixtape admin commands, namely ``/mixtape reload``.
|
||||||
|
|
||||||
|
``mixtape.list`` - Allows a player to list their aliases.
|
||||||
|
|
||||||
|
``mixtape.list.other`` - Allows a player to list other player's aliases.
|
||||||
|
|
||||||
|
``mixtape.list.*`` - Wildcard permission for the two above nodes.
|
||||||
|
|
||||||
|
``mixtape.limit.x`` - Give a player a specific limit for creating aliases. Overrides the global limit.
|
||||||
|
|
||||||
``mixtape.alias.chat`` - Allows players to create chat aliases.
|
``mixtape.alias.chat`` - Allows players to create chat aliases.
|
||||||
|
|
||||||
|
@ -13,3 +21,5 @@ Permissions
|
||||||
|
|
||||||
``mixtape.alias.*`` - Wildcard permission for the two above nodes.
|
``mixtape.alias.*`` - Wildcard permission for the two above nodes.
|
||||||
|
|
||||||
|
``mixtape.*`` - Wildcard permission for all nodes.
|
||||||
|
|
||||||
|
|
2
pom.xml
2
pom.xml
|
@ -6,7 +6,7 @@
|
||||||
|
|
||||||
<groupId>xyz.etztech</groupId>
|
<groupId>xyz.etztech</groupId>
|
||||||
<artifactId>Mixtape</artifactId>
|
<artifactId>Mixtape</artifactId>
|
||||||
<version>2.0</version>
|
<version>2.1</version>
|
||||||
<packaging>jar</packaging>
|
<packaging>jar</packaging>
|
||||||
|
|
||||||
<name>Mixtape</name>
|
<name>Mixtape</name>
|
||||||
|
|
|
@ -18,10 +18,11 @@ public final class Mixtape extends JavaPlugin {
|
||||||
private Logger log = Logger.getLogger( "Minecraft" );
|
private Logger log = Logger.getLogger( "Minecraft" );
|
||||||
|
|
||||||
private static Mixtape instance;
|
private static Mixtape instance;
|
||||||
public static FileConfiguration config;
|
private static FileConfiguration config;
|
||||||
private static Database database;
|
private static Database database;
|
||||||
|
|
||||||
private static int loops;
|
private static int loops;
|
||||||
|
private static int limit;
|
||||||
|
|
||||||
private static boolean global;
|
private static boolean global;
|
||||||
|
|
||||||
|
@ -49,7 +50,8 @@ public final class Mixtape extends JavaPlugin {
|
||||||
public void reloadConfig() {
|
public void reloadConfig() {
|
||||||
super.reloadConfig();
|
super.reloadConfig();
|
||||||
config = Bukkit.getPluginManager().getPlugin("Mixtape").getConfig();
|
config = Bukkit.getPluginManager().getPlugin("Mixtape").getConfig();
|
||||||
loops = config.getInt("loop");
|
loops = config.getInt("loop", 5);
|
||||||
|
limit = config.getInt("limit", -1);
|
||||||
validate();
|
validate();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -79,6 +81,10 @@ public final class Mixtape extends JavaPlugin {
|
||||||
return loops;
|
return loops;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static int getLimit() {
|
||||||
|
return limit;
|
||||||
|
}
|
||||||
|
|
||||||
private void validate() {
|
private void validate() {
|
||||||
List<String> errors = new ArrayList<>();
|
List<String> errors = new ArrayList<>();
|
||||||
try {
|
try {
|
||||||
|
|
|
@ -1,5 +1,11 @@
|
||||||
package xyz.etztech.mixtape;
|
package xyz.etztech.mixtape;
|
||||||
|
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.permissions.PermissionAttachmentInfo;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
public class MixtapeUtil {
|
public class MixtapeUtil {
|
||||||
|
|
||||||
public static String stripSlash(String base) {
|
public static String stripSlash(String base) {
|
||||||
|
@ -9,4 +15,24 @@ public class MixtapeUtil {
|
||||||
return base;
|
return base;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static int getLimit(Set<PermissionAttachmentInfo> permissions) {
|
||||||
|
int global = Mixtape.getLimit();
|
||||||
|
int limit = 0;
|
||||||
|
for (PermissionAttachmentInfo permission : permissions) {
|
||||||
|
if (permission.getPermission().startsWith("mixtape.limit.") && permission.getValue()) {
|
||||||
|
try {
|
||||||
|
int p = Integer.parseInt(permission.getPermission().replaceFirst("mixtape.limit.", ""));
|
||||||
|
limit = limit > p ? limit : p;
|
||||||
|
} catch (Exception ignored) {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return limit != 0 ? limit : global;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isLimited(Player player) {
|
||||||
|
int current = Mixtape.getDatabase().getAliases(player.getUniqueId().toString()).size();
|
||||||
|
int limit = getLimit(player.getEffectivePermissions());
|
||||||
|
return (current >= limit && limit != -1);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,6 +37,11 @@ public class CommandAlias implements CommandExecutor {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (MixtapeUtil.isLimited(player)) {
|
||||||
|
player.sendMessage(ChatColor.RED + "You have hit your limit of allowed aliases. Delete one and try again.");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
String alias = MixtapeUtil.stripSlash(args[0]);
|
String alias = MixtapeUtil.stripSlash(args[0]);
|
||||||
|
|
||||||
String command = StringUtils.join(Arrays.copyOfRange(args, 1, args.length), " ");
|
String command = StringUtils.join(Arrays.copyOfRange(args, 1, args.length), " ");
|
||||||
|
|
|
@ -1,19 +1,16 @@
|
||||||
package xyz.etztech.mixtape.commands;
|
package xyz.etztech.mixtape.commands;
|
||||||
|
|
||||||
|
import net.md_5.bungee.api.ChatColor;
|
||||||
|
import net.md_5.bungee.api.chat.TextComponent;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.ChatColor;
|
|
||||||
import org.bukkit.OfflinePlayer;
|
import org.bukkit.OfflinePlayer;
|
||||||
import org.bukkit.command.Command;
|
import org.bukkit.command.Command;
|
||||||
import org.bukkit.command.CommandExecutor;
|
import org.bukkit.command.CommandExecutor;
|
||||||
import org.bukkit.command.CommandSender;
|
import org.bukkit.command.CommandSender;
|
||||||
import org.bukkit.configuration.file.FileConfiguration;
|
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
import xyz.etztech.mixtape.Alias;
|
||||||
import xyz.etztech.mixtape.Mixtape;
|
import xyz.etztech.mixtape.Mixtape;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.LinkedHashMap;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
public class CommandMixtape implements CommandExecutor {
|
public class CommandMixtape implements CommandExecutor {
|
||||||
|
|
||||||
Mixtape plugin;
|
Mixtape plugin;
|
||||||
|
@ -24,32 +21,101 @@ public class CommandMixtape implements CommandExecutor {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onCommand(CommandSender sender, Command command, String base, String[] args) {
|
public boolean onCommand(CommandSender sender, Command command, String base, String[] args) {
|
||||||
|
boolean hasAdmin = sender.hasPermission("alias.admin");
|
||||||
if (args.length == 0) {
|
if (args.length == 0) {
|
||||||
sender.sendMessage(ChatColor.GOLD + "===== Mixtape =====");
|
sender.sendMessage(ChatColor.GOLD + "===== Mixtape =====");
|
||||||
sender.sendMessage(ChatColor.YELLOW + "/mixtape reload");
|
sender.sendMessage(ChatColor.YELLOW + "/mixtape reload");
|
||||||
} else if (sender.hasPermission("alias.admin")) {
|
sender.sendMessage(ChatColor.YELLOW + "/mixtape list" + (hasAdmin ? " [<player>]" : ""));
|
||||||
if ("reload".equalsIgnoreCase(args[0])) {
|
sender.sendMessage(ChatColor.YELLOW + "/mixtape delete <alias>");
|
||||||
plugin.reloadConfig();
|
if (hasAdmin) {
|
||||||
sender.sendMessage(ChatColor.GREEN + "Mixtape Reloaded.");
|
sender.sendMessage(ChatColor.YELLOW + "/mixtape purge [<player>]");
|
||||||
} else if ("purge".equalsIgnoreCase(args[0])) {
|
}
|
||||||
if (args.length > 1) {
|
} else {
|
||||||
Player player = Bukkit.getPlayerExact(args[1]);
|
if ("list".equalsIgnoreCase(args[0])) {
|
||||||
if (player != null) {
|
if (sender instanceof Player) {
|
||||||
Mixtape.getDatabase().purge(player.getUniqueId().toString());
|
list(sender, args.length == 2 ? args[1] : null);
|
||||||
sender.sendMessage(ChatColor.GREEN + "Purged all of " + player.getName() + "'s aliases.");
|
} else {
|
||||||
} else {
|
sender.sendMessage(ChatColor.RED + "Console can only use global aliases defined in the config.");
|
||||||
sender.sendMessage(ChatColor.RED + "No player found.");
|
}
|
||||||
|
} else if ("delete".equalsIgnoreCase(args[0])) {
|
||||||
|
if (sender instanceof Player) {
|
||||||
|
if (args.length > 1) {
|
||||||
|
delete(sender, args[1]);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
for (OfflinePlayer offline : Bukkit.getBannedPlayers()) {
|
sender.sendMessage(ChatColor.RED + "Console can only use global aliases defined in the config.");
|
||||||
Mixtape.getDatabase().purge(offline.getUniqueId().toString());
|
}
|
||||||
|
}
|
||||||
|
if (hasAdmin) {
|
||||||
|
if ("reload".equalsIgnoreCase(args[0])) {
|
||||||
|
plugin.reloadConfig();
|
||||||
|
sender.sendMessage(ChatColor.GREEN + "Mixtape Reloaded.");
|
||||||
|
} else if ("purge".equalsIgnoreCase(args[0])) {
|
||||||
|
if (args.length > 1) {
|
||||||
|
Player player = Bukkit.getPlayerExact(args[1]);
|
||||||
|
if (player != null) {
|
||||||
|
Mixtape.getDatabase().purge(player.getUniqueId().toString());
|
||||||
|
sender.sendMessage(ChatColor.GREEN + "Purged all of " + player.getName() + "'s aliases.");
|
||||||
|
} else {
|
||||||
|
sender.sendMessage(ChatColor.RED + "No player found.");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (OfflinePlayer offline : Bukkit.getBannedPlayers()) {
|
||||||
|
Mixtape.getDatabase().purge(offline.getUniqueId().toString());
|
||||||
|
}
|
||||||
|
sender.sendMessage(ChatColor.GREEN + "Purged all banned players' aliases.");
|
||||||
}
|
}
|
||||||
sender.sendMessage(ChatColor.GREEN + "Purged all banned players' aliases.");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void list(CommandSender sender, String username) {
|
||||||
|
if (username == null || !sender.hasPermission("mixtape.list.other")) {
|
||||||
|
username = sender.getName();
|
||||||
|
}
|
||||||
|
|
||||||
|
Player player = Bukkit.getPlayer(username);
|
||||||
|
if (player != null) {
|
||||||
|
StringBuilder message = new StringBuilder();
|
||||||
|
message.append(ChatColor.GOLD).append("|").append(ChatColor.YELLOW);
|
||||||
|
message.append(" Aliases for ").append(username).append(" ");
|
||||||
|
message.append(ChatColor.GOLD).append("|").append(ChatColor.YELLOW);
|
||||||
|
message.append("\n");
|
||||||
|
message.append(ChatColor.GOLD).append("|").append(ChatColor.YELLOW);
|
||||||
|
message.append(" Type ");
|
||||||
|
message.append(ChatColor.GOLD).append("|").append(ChatColor.YELLOW);
|
||||||
|
message.append(" Alias ");
|
||||||
|
message.append(ChatColor.GOLD).append("|").append(ChatColor.YELLOW);
|
||||||
|
message.append(" Command ");
|
||||||
|
message.append(ChatColor.GOLD).append("|").append(ChatColor.YELLOW);
|
||||||
|
for (Alias alias : Mixtape.getDatabase().getAliases(player.getUniqueId().toString())) {
|
||||||
|
message.append("\n");
|
||||||
|
message.append(ChatColor.GOLD).append("| ").append(ChatColor.YELLOW);
|
||||||
|
message.append(alias.getType().name());
|
||||||
|
message.append(ChatColor.GOLD).append(" | ").append(ChatColor.YELLOW);
|
||||||
|
message.append(alias.getFrom());
|
||||||
|
message.append(ChatColor.GOLD).append(" | ").append(ChatColor.YELLOW);
|
||||||
|
message.append(alias.getTo());
|
||||||
|
message.append(ChatColor.GOLD).append(" |").append(ChatColor.YELLOW);
|
||||||
|
}
|
||||||
|
sender.sendMessage(message.toString());
|
||||||
|
} else {
|
||||||
|
sender.sendMessage(ChatColor.RED + "No aliases found for " + username + ". Are they online?");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void delete(CommandSender sender, String from) {
|
||||||
|
Player player = (Player) sender;
|
||||||
|
int id = Mixtape.getDatabase().exists(player.getUniqueId().toString(), from);
|
||||||
|
if (id > 0) {
|
||||||
|
Mixtape.getDatabase().delete(id);
|
||||||
|
player.sendMessage(ChatColor.RED + "Deleted alias for '" + from + "'");
|
||||||
|
} else {
|
||||||
|
player.sendMessage(ChatColor.RED + "No alias found for '" + from + "'");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,6 +37,11 @@ public class CommandSlashAlias implements CommandExecutor {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (MixtapeUtil.isLimited(player)) {
|
||||||
|
player.sendMessage(ChatColor.RED + "You have hit your limit of allowed aliases. Delete one and try again.");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
String alias = MixtapeUtil.stripSlash(args[0]);
|
String alias = MixtapeUtil.stripSlash(args[0]);
|
||||||
|
|
||||||
String command = StringUtils.join(Arrays.copyOfRange(args, 1, args.length), " ");
|
String command = StringUtils.join(Arrays.copyOfRange(args, 1, args.length), " ");
|
||||||
|
|
|
@ -8,3 +8,10 @@ aliases:
|
||||||
|
|
||||||
# How many times can an alias call another alias before aborting?
|
# How many times can an alias call another alias before aborting?
|
||||||
loop: 5
|
loop: 5
|
||||||
|
|
||||||
|
# Global limit for aliases. Set to -1 (default) for unlimited
|
||||||
|
# This only affects players without a limit permission node
|
||||||
|
# For per-permission settings, use the permission nodes
|
||||||
|
# mixtape.limit.x
|
||||||
|
# Where 'x' is the limit
|
||||||
|
limit: -1
|
|
@ -15,6 +15,18 @@ permissions:
|
||||||
mixtape.admin:
|
mixtape.admin:
|
||||||
description: Ability to use Mixtape command to reload
|
description: Ability to use Mixtape command to reload
|
||||||
default: op
|
default: op
|
||||||
|
mixtape.list:
|
||||||
|
description: Ability to use Mixtape command to list aliases
|
||||||
|
default: op
|
||||||
|
mixtape.list.other:
|
||||||
|
description: Ability to use Mixtape command to list aliases of other players
|
||||||
|
default: op
|
||||||
|
mixtape.list.*:
|
||||||
|
description: Wildcard permission for listing aliases
|
||||||
|
default: op
|
||||||
|
children:
|
||||||
|
mixtape.list: true
|
||||||
|
mixtape.list.other: true
|
||||||
mixtape.alias.command:
|
mixtape.alias.command:
|
||||||
description: Ability to create personal alias commands
|
description: Ability to create personal alias commands
|
||||||
default: op
|
default: op
|
||||||
|
@ -33,3 +45,4 @@ permissions:
|
||||||
children:
|
children:
|
||||||
mixtape.admin: true
|
mixtape.admin: true
|
||||||
mixtape.alias.*: true
|
mixtape.alias.*: true
|
||||||
|
mixtape.list.*: true
|
Loading…
Reference in New Issue