#1449 Fix copying of Commands, add tests with command delay

This commit is contained in:
ljacqu 2018-09-11 22:03:46 +02:00
parent 035c2f352a
commit 22c08c9fc3
7 changed files with 53 additions and 44 deletions

View File

@ -19,26 +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, executor, 0);
public Command copyWithCommand(String command) {
Command copy = new Command();
setValuesToCopyWithNewCommand(copy, command);
return copy;
}
/**
* Constructor.
*
* @param command the command
* @param executor the executor of the command
* @param delay the delay (in ticks) before executing command
*/
public Command(String command, Executor executor, long delay) {
this.command = command;
this.executor = executor;
this.delay = delay;
protected void setValuesToCopyWithNewCommand(Command copy, String newCommand) {
copy.command = newCommand;
copy.executor = this.executor;
copy.delay = this.delay;
}
public String getCommand() {

View File

@ -174,15 +174,12 @@ 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() {

View File

@ -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()));

View File

@ -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() {

View File

@ -3,6 +3,7 @@ package fr.xephi.authme.settings.commandconfig;
import com.google.common.io.Files;
import fr.xephi.authme.TestHelper;
import fr.xephi.authme.service.BukkitService;
import fr.xephi.authme.service.BukkitServiceTestHelper;
import fr.xephi.authme.service.GeoIpService;
import fr.xephi.authme.settings.SettingsMigrationService;
import org.bukkit.entity.Player;
@ -25,6 +26,7 @@ import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.only;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.verifyZeroInteractions;
@ -59,6 +61,7 @@ public class CommandManagerTest {
public void setup() throws IOException {
testFolder = temporaryFolder.newFolder();
player = mockPlayer();
BukkitServiceTestHelper.setBukkitServiceToScheduleSyncDelayedTaskWithDelay(bukkitService);
}
@Test
@ -74,6 +77,8 @@ public class CommandManagerTest {
verify(bukkitService).dispatchConsoleCommand("msg Bobby Welcome back");
verify(bukkitService).dispatchCommand(any(Player.class), eq("motd"));
verify(bukkitService).dispatchCommand(any(Player.class), eq("list"));
verify(bukkitService).scheduleSyncDelayedTask(any(Runnable.class), eq(60L));
verify(bukkitService).scheduleSyncDelayedTask(any(Runnable.class), eq(120L));
verifyNoMoreInteractions(bukkitService);
verifyZeroInteractions(geoIpService);
}
@ -92,6 +97,9 @@ public class CommandManagerTest {
verify(bukkitService).dispatchCommand(player, "motd");
verify(bukkitService).dispatchCommand(player, "list");
verify(bukkitService).dispatchConsoleCommand("helpop Player Bobby has more than 1 account");
verify(bukkitService).scheduleSyncDelayedTask(any(Runnable.class), eq(60L));
verify(bukkitService).scheduleSyncDelayedTask(any(Runnable.class), eq(120L));
verify(bukkitService).scheduleSyncDelayedTask(any(Runnable.class), eq(180L));
verifyNoMoreInteractions(bukkitService);
verifyZeroInteractions(geoIpService);
}
@ -111,6 +119,10 @@ public class CommandManagerTest {
verify(bukkitService).dispatchCommand(player, "list");
verify(bukkitService).dispatchConsoleCommand("helpop Player Bobby has more than 1 account");
verify(bukkitService).dispatchConsoleCommand("log Bobby 127.0.0.3 many accounts");
verify(bukkitService).scheduleSyncDelayedTask(any(Runnable.class), eq(60L));
verify(bukkitService).scheduleSyncDelayedTask(any(Runnable.class), eq(120L));
verify(bukkitService).scheduleSyncDelayedTask(any(Runnable.class), eq(180L));
verify(bukkitService).scheduleSyncDelayedTask(any(Runnable.class), eq(240L));
verifyNoMoreInteractions(bukkitService);
verifyZeroInteractions(geoIpService);
}
@ -129,6 +141,9 @@ public class CommandManagerTest {
verify(bukkitService).dispatchCommand(player, "motd");
verify(bukkitService).dispatchCommand(player, "list");
verify(bukkitService).dispatchConsoleCommand("helpop Player Bobby has more than 1 account");
verify(bukkitService).scheduleSyncDelayedTask(any(Runnable.class), eq(60L));
verify(bukkitService).scheduleSyncDelayedTask(any(Runnable.class), eq(120L));
verify(bukkitService).scheduleSyncDelayedTask(any(Runnable.class), eq(180L));
verifyNoMoreInteractions(bukkitService);
verifyZeroInteractions(geoIpService);
}
@ -138,6 +153,7 @@ public class CommandManagerTest {
// given
copyJarFileAsCommandsYml(TEST_FILES_FOLDER + "commands.incomplete.yml");
initManager();
BukkitServiceTestHelper.setBukkitServiceToScheduleSyncDelayedTaskWithDelay(bukkitService);
// when
manager.runCommandsOnLogin(player, Collections.emptyList());
@ -145,6 +161,7 @@ public class CommandManagerTest {
// then
verify(bukkitService).dispatchConsoleCommand("msg Bobby Welcome back, bob");
verify(bukkitService).dispatchCommand(any(Player.class), eq("list"));
verify(bukkitService).scheduleSyncDelayedTask(any(Runnable.class), eq(100L));
verifyNoMoreInteractions(bukkitService);
verifyZeroInteractions(geoIpService);
}
@ -232,6 +249,7 @@ public class CommandManagerTest {
// then
verify(bukkitService).dispatchCommand(any(Player.class), eq("me I just registered"));
verify(bukkitService).dispatchConsoleCommand("log Bobby (127.0.0.3, Syldavia) registered");
verify(bukkitService, times(2)).scheduleSyncDelayedTask(any(Runnable.class), eq(100L));
verifyNoMoreInteractions(bukkitService);
}

View File

@ -8,9 +8,11 @@ onRegister:
announce:
command: 'me I just registered'
executor: PLAYER
delay: 100
notify:
command: 'log %p (%ip, %country) registered'
executor: CONSOLE
delay: 100
onLogin:
welcome:
command: 'msg %p Welcome back'
@ -18,18 +20,22 @@ onLogin:
show_motd:
command: 'motd'
executor: PLAYER
delay: 60
display_list:
command: 'list'
executor: PLAYER
delay: 120
warn_for_alts:
command: 'helpop Player %p has more than 1 account'
executor: CONSOLE
ifNumberOfAccountsAtLeast: 2
delay: 180
log_suspicious_user:
command: 'log %p %ip many accounts'
executor: CONSOLE
ifNumberOfAccountsAtLeast: 5
ifNumberOfAccountsLessThan: 20
delay: 240
onSessionLogin:
welcome:
command: 'msg %p Session login!'

View File

@ -8,12 +8,14 @@ onLogin:
welcome:
command: 'msg %p Welcome back, %nick'
executor: CONSOLE
delay: 0
show_motd:
# command: 'motd' <-- mandatory property, so entry should be ignored
executor: PLAYER
display_list:
command: 'list'
executor: WRONG_EXECUTOR
delay: 100
doesNotExist:
wrongEntry:
command: 'should be ignored'