Merge branch '1449-commands-with-delay'

This commit is contained in:
ljacqu
2018-09-11 22:11:49 +02:00
9 changed files with 96 additions and 43 deletions
@@ -9,6 +9,8 @@ public class Command {
private String command;
/** The executor of the command. */
private Executor executor = Executor.PLAYER;
/** Delay before executing the command (in ticks) */
private long delay = 0;
/**
* Default constructor (for bean mapping).
@@ -17,14 +19,21 @@ public class Command {
}
/**
* Constructor.
* Creates a copy of this Command object, setting the given command text on the copy.
*
* @param command the command
* @param executor the executor of the command
* @param command the command text to use in the copy
* @return copy of the source with the new command
*/
public Command(String command, Executor executor) {
this.command = command;
this.executor = executor;
public Command copyWithCommand(String command) {
Command copy = new Command();
setValuesToCopyWithNewCommand(copy, command);
return copy;
}
protected void setValuesToCopyWithNewCommand(Command copy, String newCommand) {
copy.command = newCommand;
copy.executor = this.executor;
copy.delay = this.delay;
}
public String getCommand() {
@@ -43,6 +52,14 @@ public class Command {
this.executor = executor;
}
public long getDelay() {
return delay;
}
public void setDelay(long delay) {
this.delay = delay;
}
@Override
public String toString() {
return command + " (" + executor + ")";
@@ -125,18 +125,26 @@ public class CommandManager implements Reloadable {
}
private <T extends Command> void executeCommands(Player player, List<T> commands, Predicate<T> predicate) {
for (T command : commands) {
if (predicate.test(command)) {
final String execution = command.getCommand();
if (Executor.CONSOLE.equals(command.getExecutor())) {
bukkitService.dispatchConsoleCommand(execution);
for (T cmd : commands) {
if (predicate.test(cmd)) {
long delay = cmd.getDelay();
if (delay > 0) {
bukkitService.scheduleSyncDelayedTask(() -> dispatchCommand(player, cmd), delay);
} else {
bukkitService.dispatchCommand(player, execution);
dispatchCommand(player, cmd);
}
}
}
}
private void dispatchCommand(Player player, Command command) {
if (Executor.CONSOLE.equals(command.getExecutor())) {
bukkitService.dispatchConsoleCommand(command.getCommand());
} else {
bukkitService.dispatchCommand(player, command.getCommand());
}
}
private static boolean shouldCommandBeRun(OnLoginCommand command, int numberOfOtherAccounts) {
return (!command.getIfNumberOfAccountsAtLeast().isPresent()
|| command.getIfNumberOfAccountsAtLeast().get() <= numberOfOtherAccounts)
@@ -166,22 +174,19 @@ public class CommandManager implements Reloadable {
private WrappedTagReplacer<Command, Player> newReplacer(Map<String, Command> commands) {
return new WrappedTagReplacer<>(availableTags, commands.values(), Command::getCommand,
(cmd, text) -> new Command(text, cmd.getExecutor()));
Command::copyWithCommand);
}
private WrappedTagReplacer<OnLoginCommand, Player> newOnLoginCmdReplacer(
Map<String, OnLoginCommand> commands) {
private WrappedTagReplacer<OnLoginCommand, Player> newOnLoginCmdReplacer(Map<String, OnLoginCommand> commands) {
return new WrappedTagReplacer<>(availableTags, commands.values(), Command::getCommand,
(cmd, text) -> new OnLoginCommand(text, cmd.getExecutor(), cmd.getIfNumberOfAccountsAtLeast(),
cmd.getIfNumberOfAccountsLessThan()));
OnLoginCommand::copyWithCommand);
}
private List<Tag<Player>> buildAvailableTags() {
return Arrays.asList(
createTag("%p", pl -> pl.getName()),
createTag("%nick", pl -> pl.getDisplayName()),
createTag("%ip", pl -> PlayerUtils.getPlayerIp(pl)),
createTag("%p", Player::getName),
createTag("%nick", Player::getDisplayName),
createTag("%ip", PlayerUtils::getPlayerIp),
createTag("%country", pl -> geoIpService.getCountryName(PlayerUtils.getPlayerIp(pl))));
}
}
@@ -41,8 +41,9 @@ class CommandMigrationService implements MigrationService {
private boolean moveOtherAccountsConfig(CommandConfig commandConfig) {
if (settingsMigrationService.hasOldOtherAccountsCommand()) {
OnLoginCommand command = new OnLoginCommand(
replaceOldPlaceholdersWithNew(settingsMigrationService.getOldOtherAccountsCommand()), Executor.CONSOLE);
OnLoginCommand command = new OnLoginCommand();
command.setCommand(replaceOldPlaceholdersWithNew(settingsMigrationService.getOldOtherAccountsCommand()));
command.setExecutor(Executor.CONSOLE);
command.setIfNumberOfAccountsAtLeast(
Optional.of(settingsMigrationService.getOldOtherAccountsCommandThreshold()));
@@ -44,6 +44,13 @@ public final class CommandSettingsHolder implements SettingsHolder {
" command: 'broadcast %p has joined, welcome back!'",
" executor: CONSOLE",
"",
"You can also add delay to command. It will run after the specified ticks. Example:",
"onLogin:",
" rules:",
" command: 'rules'",
" executor: PLAYER",
" delay: 200",
"",
"Supported command events: onLogin, onSessionLogin, onFirstLogin, onJoin, onLogout, onRegister, "
+ "onUnregister",
"",
@@ -17,28 +17,18 @@ public class OnLoginCommand extends Command {
}
/**
* Constructor.
* Creates a copy of this object, using the given command as new {@link Command#command command}.
*
* @param command the command to execute
* @param executor the executor of the command
* @param command the command text to use in the copy
* @return copy of the source with the new command
*/
public OnLoginCommand(String command, Executor executor) {
super(command, executor);
}
/**
* Constructor.
*
* @param command the command to execute
* @param executor the executor of the command
* @param ifNumberOfAccountsAtLeast required number of accounts for the command to run
* @param ifNumberOfAccountsLessThan max threshold of accounts, from which the command will not be run
*/
public OnLoginCommand(String command, Executor executor, Optional<Integer> ifNumberOfAccountsAtLeast,
Optional<Integer> ifNumberOfAccountsLessThan) {
super(command, executor);
this.ifNumberOfAccountsAtLeast = ifNumberOfAccountsAtLeast;
this.ifNumberOfAccountsLessThan = ifNumberOfAccountsLessThan;
@Override
public OnLoginCommand copyWithCommand(String command) {
OnLoginCommand copy = new OnLoginCommand();
setValuesToCopyWithNewCommand(copy, command);
copy.ifNumberOfAccountsAtLeast = this.ifNumberOfAccountsAtLeast;
copy.ifNumberOfAccountsLessThan = this.ifNumberOfAccountsLessThan;
return copy;
}
public Optional<Integer> getIfNumberOfAccountsAtLeast() {
+7
View File
@@ -24,6 +24,13 @@
# command: 'broadcast %p has joined, welcome back!'
# executor: CONSOLE
#
# You can also add delay to command. It will run after the specified ticks. Example:
# onLogin:
# rules:
# command: 'rules'
# executor: PLAYER
# delay: 200
#
# Supported command events: onLogin, onSessionLogin, onFirstLogin, onJoin, onLogout, onRegister, onUnregister
#
# For onLogin and onFirstLogin, you can use 'ifNumberOfAccountsLessThan' and 'ifNumberOfAccountsAtLeast'