Merge branch 'master' of https://github.com/AuthMe-Team/AuthMeReloaded into 293-translate-help-messages

This commit is contained in:
ljacqu
2016-10-09 15:39:50 +02:00
38 changed files with 493 additions and 289 deletions
@@ -5,7 +5,7 @@ import fr.xephi.authme.ReflectionTestUtils;
import fr.xephi.authme.data.auth.PlayerAuth;
import fr.xephi.authme.data.auth.PlayerCache;
import fr.xephi.authme.datasource.DataSource;
import fr.xephi.authme.hooks.PluginHooks;
import fr.xephi.authme.service.PluginHookService;
import fr.xephi.authme.process.Management;
import fr.xephi.authme.security.PasswordSecurity;
import fr.xephi.authme.service.ValidationService;
@@ -46,7 +46,7 @@ public class NewAPITest {
@Mock
private AuthMe authMe;
@Mock
private PluginHooks pluginHooks;
private PluginHookService pluginHookService;
@Mock
private ValidationService validationService;
@Mock
@@ -86,7 +86,7 @@ public class NewAPITest {
public void shouldReturnIfPlayerIsNpc() {
// given
Player player = mock(Player.class);
given(pluginHooks.isNpc(player)).willReturn(true);
given(pluginHookService.isNpc(player)).willReturn(true);
// when
boolean result = api.isNPC(player);
@@ -5,7 +5,7 @@ import ch.jalu.injector.testing.DelayedInjectionRunner;
import ch.jalu.injector.testing.InjectDelayed;
import fr.xephi.authme.data.auth.PlayerCache;
import fr.xephi.authme.datasource.DataSource;
import fr.xephi.authme.hooks.PluginHooks;
import fr.xephi.authme.service.PluginHookService;
import fr.xephi.authme.settings.Settings;
import fr.xephi.authme.settings.properties.RegistrationSettings;
import fr.xephi.authme.service.ValidationService;
@@ -41,7 +41,7 @@ public class ListenerServiceTest {
private DataSource dataSource;
@Mock
private PluginHooks pluginHooks;
private PluginHookService pluginHookService;
@Mock
private PlayerCache playerCache;
@@ -161,14 +161,14 @@ public class ListenerServiceTest {
Player player = mockPlayerWithName(playerName);
EntityEvent event = mock(EntityEvent.class);
given(event.getEntity()).willReturn(player);
given(pluginHooks.isNpc(player)).willReturn(true);
given(pluginHookService.isNpc(player)).willReturn(true);
// when
boolean result = listenerService.shouldCancelEvent(event);
// then
assertThat(result, equalTo(false));
verify(pluginHooks).isNpc(player);
verify(pluginHookService).isNpc(player);
}
@Test
@@ -215,7 +215,7 @@ public class ListenerServiceTest {
assertThat(result, equalTo(true));
verify(playerCache).isAuthenticated(playerName);
verifyZeroInteractions(dataSource);
verify(pluginHooks).isNpc(player);
verify(pluginHookService).isNpc(player);
}
private static Player mockPlayerWithName(String name) {
@@ -1,7 +1,7 @@
package fr.xephi.authme.listener;
import fr.xephi.authme.TestHelper;
import fr.xephi.authme.hooks.PluginHooks;
import fr.xephi.authme.service.PluginHookService;
import fr.xephi.authme.listener.protocollib.ProtocolLibService;
import fr.xephi.authme.permission.PermissionsManager;
import fr.xephi.authme.settings.SpawnLoader;
@@ -41,7 +41,7 @@ public class ServerListenerTest {
private PermissionsManager permissionsManager;
@Mock
private PluginHooks pluginHooks;
private PluginHookService pluginHookService;
@Mock
private ProtocolLibService protocolLibService;
@@ -59,7 +59,7 @@ public class ServerListenerTest {
checkEnableHandling(ESSENTIALS, new Runnable() {
@Override
public void run() {
verify(pluginHooks).tryHookToEssentials();
verify(pluginHookService).tryHookToEssentials();
}
});
checkEnableHandling(ESSENTIALS_SPAWN, new Runnable() {
@@ -71,13 +71,13 @@ public class ServerListenerTest {
checkEnableHandling(MULTIVERSE, new Runnable() {
@Override
public void run() {
verify(pluginHooks).tryHookToMultiverse();
verify(pluginHookService).tryHookToMultiverse();
}
});
checkEnableHandling(COMBAT_TAG, new Runnable() {
@Override
public void run() {
verify(pluginHooks).tryHookToCombatPlus();
verify(pluginHookService).tryHookToCombatPlus();
}
});
checkEnableHandling(PROTOCOL_LIB, new Runnable() {
@@ -99,7 +99,7 @@ public class ServerListenerTest {
checkDisableHandling(ESSENTIALS, new Runnable() {
@Override
public void run() {
verify(pluginHooks).unhookEssentials();
verify(pluginHookService).unhookEssentials();
}
});
checkDisableHandling(ESSENTIALS_SPAWN, new Runnable() {
@@ -111,13 +111,13 @@ public class ServerListenerTest {
checkDisableHandling(MULTIVERSE, new Runnable() {
@Override
public void run() {
verify(pluginHooks).unhookMultiverse();
verify(pluginHookService).unhookMultiverse();
}
});
checkDisableHandling(COMBAT_TAG, new Runnable() {
@Override
public void run() {
verify(pluginHooks).unhookCombatPlus();
verify(pluginHookService).unhookCombatPlus();
}
});
checkDisableHandling(PROTOCOL_LIB, new Runnable() {
@@ -164,8 +164,8 @@ public class ServerListenerTest {
}
private void verifyNoMoreInteractionsAndReset() {
verifyNoMoreInteractions(permissionsManager, pluginHooks, protocolLibService, spawnLoader);
reset(permissionsManager, pluginHooks, protocolLibService, spawnLoader);
verifyNoMoreInteractions(permissionsManager, pluginHookService, protocolLibService, spawnLoader);
reset(permissionsManager, pluginHookService, protocolLibService, spawnLoader);
}
private static <T extends PluginEvent> T mockEventWithPluginName(Class<T> eventClass, String name) {
@@ -1,7 +1,8 @@
package fr.xephi.authme.geoip;
package fr.xephi.authme.service;
import com.maxmind.geoip.Country;
import com.maxmind.geoip.LookupService;
import fr.xephi.authme.service.GeoIpService;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
@@ -22,12 +23,12 @@ import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
/**
* Test for {@link GeoIpManager}.
* Test for {@link GeoIpService}.
*/
@RunWith(MockitoJUnitRunner.class)
public class GeoIpManagerTest {
public class GeoIpServiceTest {
private GeoIpManager geoIpManager;
private GeoIpService geoIpService;
private File dataFolder;
@Mock
private LookupService lookupService;
@@ -38,7 +39,7 @@ public class GeoIpManagerTest {
@Before
public void initializeGeoLiteApi() throws IOException {
dataFolder = temporaryFolder.newFolder();
geoIpManager = new GeoIpManager(dataFolder, lookupService);
geoIpService = new GeoIpService(dataFolder, lookupService);
}
@Test
@@ -51,7 +52,7 @@ public class GeoIpManagerTest {
given(lookupService.getCountry(ip)).willReturn(country);
// when
String result = geoIpManager.getCountryCode(ip);
String result = geoIpService.getCountryCode(ip);
// then
assertThat(result, equalTo(countryCode));
@@ -64,7 +65,7 @@ public class GeoIpManagerTest {
String ip = "127.0.0.1";
// when
String result = geoIpManager.getCountryCode(ip);
String result = geoIpService.getCountryCode(ip);
// then
assertThat(result, equalTo("--"));
@@ -81,7 +82,7 @@ public class GeoIpManagerTest {
given(lookupService.getCountry(ip)).willReturn(country);
// when
String result = geoIpManager.getCountryName(ip);
String result = geoIpService.getCountryName(ip);
// then
assertThat(result, equalTo(countryName));
@@ -94,7 +95,7 @@ public class GeoIpManagerTest {
String ip = "127.0.0.1";
// when
String result = geoIpManager.getCountryName(ip);
String result = geoIpService.getCountryName(ip);
// then
assertThat(result, equalTo("N/A"));
@@ -1,10 +1,11 @@
package fr.xephi.authme.hooks;
package fr.xephi.authme.service;
import com.earth2me.essentials.Essentials;
import com.earth2me.essentials.User;
import com.onarandombox.MultiverseCore.MultiverseCore;
import com.onarandombox.MultiverseCore.api.MVWorldManager;
import com.onarandombox.MultiverseCore.api.MultiverseWorld;
import fr.xephi.authme.service.PluginHookService;
import fr.xephi.authme.ReflectionTestUtils;
import fr.xephi.authme.TestHelper;
import org.bukkit.Location;
@@ -29,9 +30,9 @@ import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
/**
* Test for {@link PluginHooks}.
* Test for {@link PluginHookService}.
*/
public class PluginHooksTest {
public class PluginHookServiceTest {
/** The plugin name of Essentials. */
private static final String ESSENTIALS = "Essentials";
@@ -47,15 +48,15 @@ public class PluginHooksTest {
public void shouldHookIntoEssentials() {
// given
PluginManager pluginManager = mock(PluginManager.class);
PluginHooks pluginHooks = new PluginHooks(pluginManager);
PluginHookService pluginHookService = new PluginHookService(pluginManager);
setPluginAvailable(pluginManager, ESSENTIALS, Essentials.class);
assertThat(pluginHooks.isEssentialsAvailable(), equalTo(false));
assertThat(pluginHookService.isEssentialsAvailable(), equalTo(false));
// when
pluginHooks.tryHookToEssentials();
pluginHookService.tryHookToEssentials();
// then
assertThat(pluginHooks.isEssentialsAvailable(), equalTo(true));
assertThat(pluginHookService.isEssentialsAvailable(), equalTo(true));
}
// Note ljacqu 20160312: Cannot test with Multiverse or CombatTagPlus because their classes are declared final
@@ -67,10 +68,10 @@ public class PluginHooksTest {
setPluginAvailable(pluginManager, ESSENTIALS, Essentials.class);
// when
PluginHooks pluginHooks = new PluginHooks(pluginManager);
PluginHookService pluginHookService = new PluginHookService(pluginManager);
// then
assertThat(pluginHooks.isEssentialsAvailable(), equalTo(true));
assertThat(pluginHookService.isEssentialsAvailable(), equalTo(true));
}
@Test
@@ -80,10 +81,10 @@ public class PluginHooksTest {
setPluginAvailable(pluginManager, MULTIVERSE, MultiverseCore.class);
// when
PluginHooks pluginHooks = new PluginHooks(pluginManager);
PluginHookService pluginHookService = new PluginHookService(pluginManager);
// then
assertThat(pluginHooks.isMultiverseAvailable(), equalTo(true));
assertThat(pluginHookService.isMultiverseAvailable(), equalTo(true));
}
@Test
@@ -96,10 +97,10 @@ public class PluginHooksTest {
PluginManager pluginManager = mock(PluginManager.class);
setPluginAvailable(pluginManager, ESSENTIALS, ess);
PluginHooks pluginHooks = new PluginHooks(pluginManager);
PluginHookService pluginHookService = new PluginHookService(pluginManager);
// when
File dataFolder = pluginHooks.getEssentialsDataFolder();
File dataFolder = pluginHookService.getEssentialsDataFolder();
// then
assertThat(dataFolder, equalTo(essDataFolder));
@@ -109,10 +110,10 @@ public class PluginHooksTest {
public void shouldReturnNullForUnhookedEssentials() {
// given
PluginManager pluginManager = mock(PluginManager.class);
PluginHooks pluginHooks = new PluginHooks(pluginManager);
PluginHookService pluginHookService = new PluginHookService(pluginManager);
// when
File result = pluginHooks.getEssentialsDataFolder();
File result = pluginHookService.getEssentialsDataFolder();
// then
assertThat(result, nullValue());
@@ -129,10 +130,10 @@ public class PluginHooksTest {
PluginManager pluginManager = mock(PluginManager.class);
setPluginAvailable(pluginManager, ESSENTIALS, ess);
PluginHooks pluginHooks = new PluginHooks(pluginManager);
PluginHookService pluginHookService = new PluginHookService(pluginManager);
// when
pluginHooks.setEssentialsSocialSpyStatus(player, true);
pluginHookService.setEssentialsSocialSpyStatus(player, true);
// then
verify(ess).getUser(player);
@@ -142,10 +143,10 @@ public class PluginHooksTest {
@Test
public void shouldNotDoAnythingForUnhookedEssentials() {
// given
PluginHooks pluginHooks = new PluginHooks(mock(PluginManager.class));
PluginHookService pluginHookService = new PluginHookService(mock(PluginManager.class));
// when/then
pluginHooks.setEssentialsSocialSpyStatus(mock(Player.class), false);
pluginHookService.setEssentialsSocialSpyStatus(mock(Player.class), false);
}
@Test
@@ -154,15 +155,15 @@ public class PluginHooksTest {
PluginManager pluginManager = mock(PluginManager.class);
setPluginAvailable(pluginManager, ESSENTIALS, Essentials.class);
setPluginAvailable(pluginManager, MULTIVERSE, MultiverseCore.class);
PluginHooks pluginHooks = new PluginHooks(pluginManager);
PluginHookService pluginHookService = new PluginHookService(pluginManager);
// when
pluginHooks.unhookEssentials();
pluginHooks.unhookMultiverse();
pluginHookService.unhookEssentials();
pluginHookService.unhookMultiverse();
// then
assertThat(pluginHooks.isEssentialsAvailable(), equalTo(false));
assertThat(pluginHooks.isMultiverseAvailable(), equalTo(false));
assertThat(pluginHookService.isEssentialsAvailable(), equalTo(false));
assertThat(pluginHookService.isMultiverseAvailable(), equalTo(false));
}
@Test
@@ -173,23 +174,23 @@ public class PluginHooksTest {
doThrow(IllegalStateException.class).when(pluginManager).getPlugin(anyString());
// when
PluginHooks pluginHooks = new PluginHooks(pluginManager);
PluginHookService pluginHookService = new PluginHookService(pluginManager);
// then
assertThat(pluginHooks.isEssentialsAvailable(), equalTo(false));
assertThat(pluginHooks.isMultiverseAvailable(), equalTo(false));
assertThat(pluginHooks.isCombatTagPlusAvailable(), equalTo(false));
assertThat(pluginHookService.isEssentialsAvailable(), equalTo(false));
assertThat(pluginHookService.isMultiverseAvailable(), equalTo(false));
assertThat(pluginHookService.isCombatTagPlusAvailable(), equalTo(false));
}
@Test
public void shouldReturnNullForUnavailableMultiverse() {
// given
PluginManager pluginManager = mock(PluginManager.class);
PluginHooks pluginHooks = new PluginHooks(pluginManager);
PluginHookService pluginHookService = new PluginHookService(pluginManager);
World world = mock(World.class);
// when
Location result = pluginHooks.getMultiverseSpawn(world);
Location result = pluginHookService.getMultiverseSpawn(world);
// then
assertThat(result, nullValue());
@@ -211,10 +212,10 @@ public class PluginHooksTest {
PluginManager pluginManager = mock(PluginManager.class);
setPluginAvailable(pluginManager, MULTIVERSE, multiverse);
PluginHooks pluginHooks = new PluginHooks(pluginManager);
PluginHookService pluginHookService = new PluginHookService(pluginManager);
// when
Location spawn = pluginHooks.getMultiverseSpawn(world);
Location spawn = pluginHookService.getMultiverseSpawn(world);
// then
assertThat(spawn, equalTo(location));
@@ -234,10 +235,10 @@ public class PluginHooksTest {
MultiverseCore multiverse = mock(MultiverseCore.class);
setPluginAvailable(pluginManager, MULTIVERSE, multiverse);
given(multiverse.getMVWorldManager()).willReturn(mvWorldManager);
PluginHooks pluginHooks = new PluginHooks(pluginManager);
PluginHookService pluginHookService = new PluginHookService(pluginManager);
// when
Location spawn = pluginHooks.getMultiverseSpawn(world);
Location spawn = pluginHookService.getMultiverseSpawn(world);
// then
assertThat(spawn, nullValue());
@@ -5,7 +5,6 @@ import ch.jalu.injector.testing.DelayedInjectionRunner;
import ch.jalu.injector.testing.InjectDelayed;
import com.google.common.base.Strings;
import fr.xephi.authme.datasource.DataSource;
import fr.xephi.authme.geoip.GeoIpManager;
import fr.xephi.authme.message.MessageKey;
import fr.xephi.authme.permission.PermissionsManager;
import fr.xephi.authme.permission.PlayerStatePermission;
@@ -45,7 +44,7 @@ public class ValidationServiceTest {
@Mock
private PermissionsManager permissionsManager;
@Mock
private GeoIpManager geoIpManager;
private GeoIpService geoIpService;
@BeforeInjecting
public void createService() {
@@ -266,7 +265,7 @@ public class ValidationServiceTest {
// then
assertThat(result, equalTo(true));
verifyZeroInteractions(geoIpManager);
verifyZeroInteractions(geoIpService);
}
@Test
@@ -275,14 +274,14 @@ public class ValidationServiceTest {
given(settings.getProperty(ProtectionSettings.COUNTRIES_WHITELIST)).willReturn(asList("ch", "it"));
given(settings.getProperty(ProtectionSettings.COUNTRIES_BLACKLIST)).willReturn(Collections.<String>emptyList());
String ip = "127.0.0.1";
given(geoIpManager.getCountryCode(ip)).willReturn("CH");
given(geoIpService.getCountryCode(ip)).willReturn("CH");
// when
boolean result = validationService.isCountryAdmitted(ip);
// then
assertThat(result, equalTo(true));
verify(geoIpManager).getCountryCode(ip);
verify(geoIpService).getCountryCode(ip);
}
@Test
@@ -291,14 +290,14 @@ public class ValidationServiceTest {
given(settings.getProperty(ProtectionSettings.COUNTRIES_WHITELIST)).willReturn(asList("ch", "it"));
given(settings.getProperty(ProtectionSettings.COUNTRIES_BLACKLIST)).willReturn(Collections.<String>emptyList());
String ip = "123.45.67.89";
given(geoIpManager.getCountryCode(ip)).willReturn("BR");
given(geoIpService.getCountryCode(ip)).willReturn("BR");
// when
boolean result = validationService.isCountryAdmitted(ip);
// then
assertThat(result, equalTo(false));
verify(geoIpManager).getCountryCode(ip);
verify(geoIpService).getCountryCode(ip);
}
@Test
@@ -307,14 +306,14 @@ public class ValidationServiceTest {
given(settings.getProperty(ProtectionSettings.COUNTRIES_WHITELIST)).willReturn(Collections.<String>emptyList());
given(settings.getProperty(ProtectionSettings.COUNTRIES_BLACKLIST)).willReturn(asList("ch", "it"));
String ip = "127.0.0.1";
given(geoIpManager.getCountryCode(ip)).willReturn("BR");
given(geoIpService.getCountryCode(ip)).willReturn("BR");
// when
boolean result = validationService.isCountryAdmitted(ip);
// then
assertThat(result, equalTo(true));
verify(geoIpManager).getCountryCode(ip);
verify(geoIpService).getCountryCode(ip);
}
@Test
@@ -323,14 +322,14 @@ public class ValidationServiceTest {
given(settings.getProperty(ProtectionSettings.COUNTRIES_WHITELIST)).willReturn(Collections.<String>emptyList());
given(settings.getProperty(ProtectionSettings.COUNTRIES_BLACKLIST)).willReturn(asList("ch", "it"));
String ip = "123.45.67.89";
given(geoIpManager.getCountryCode(ip)).willReturn("IT");
given(geoIpService.getCountryCode(ip)).willReturn("IT");
// when
boolean result = validationService.isCountryAdmitted(ip);
// then
assertThat(result, equalTo(false));
verify(geoIpManager).getCountryCode(ip);
verify(geoIpService).getCountryCode(ip);
}
private static void assertErrorEquals(ValidationResult validationResult, MessageKey messageKey, String... args) {
@@ -6,7 +6,7 @@ import ch.jalu.injector.testing.InjectDelayed;
import com.google.common.io.Files;
import fr.xephi.authme.TestHelper;
import fr.xephi.authme.datasource.DataSource;
import fr.xephi.authme.hooks.PluginHooks;
import fr.xephi.authme.service.PluginHookService;
import fr.xephi.authme.initialization.DataFolder;
import fr.xephi.authme.settings.properties.RestrictionSettings;
import org.bukkit.Location;
@@ -42,7 +42,7 @@ public class SpawnLoaderTest {
private DataSource dataSource;
@Mock
private PluginHooks pluginHooks;
private PluginHookService pluginHookService;
@Rule
public TemporaryFolder temporaryFolder = new TemporaryFolder();
+17 -31
View File
@@ -1,22 +1,25 @@
package tools.docs;
import com.google.common.collect.ImmutableSet;
import tools.commands.CommandPageCreater;
import tools.hashmethods.HashAlgorithmsDescriptionTask;
import tools.permissions.PermissionsListWriter;
import tools.docs.commands.CommandPageCreater;
import tools.docs.hashmethods.HashAlgorithmsDescriptionTask;
import tools.docs.permissions.PermissionsListWriter;
import tools.docs.translations.TranslationPageGenerator;
import tools.utils.AutoToolTask;
import tools.utils.ToolTask;
import java.util.Scanner;
import java.util.Set;
import java.util.function.Consumer;
/**
* Task that runs all tasks which update files in the docs folder.
*/
public class UpdateDocsTask implements AutoToolTask {
private static final Set<Class<? extends ToolTask>> TASKS = ImmutableSet.<Class<? extends ToolTask>>of(
CommandPageCreater.class, HashAlgorithmsDescriptionTask.class, PermissionsListWriter.class);
private static final Set<Class<? extends ToolTask>> TASKS = ImmutableSet
.of(CommandPageCreater.class, HashAlgorithmsDescriptionTask.class,
PermissionsListWriter.class, TranslationPageGenerator.class);
@Override
public String getTaskName() {
@@ -25,22 +28,14 @@ public class UpdateDocsTask implements AutoToolTask {
@Override
public void execute(final Scanner scanner) {
executeTasks(new TaskRunner() {
@Override
public void execute(ToolTask task) {
task.execute(scanner);
}
});
executeTasks(task -> task.execute(scanner));
}
@Override
public void executeDefault() {
executeTasks(new TaskRunner() {
@Override
public void execute(ToolTask task) {
if (task instanceof AutoToolTask) {
((AutoToolTask) task).executeDefault();
}
executeTasks(task -> {
if (task instanceof AutoToolTask) {
((AutoToolTask) task).executeDefault();
}
});
}
@@ -49,24 +44,15 @@ public class UpdateDocsTask implements AutoToolTask {
try {
return clazz.newInstance();
} catch (IllegalAccessException | InstantiationException e) {
throw new UnsupportedOperationException(e);
throw new UnsupportedOperationException("Could not instantiate task class '" + clazz + "'", e);
}
}
private static void executeTasks(TaskRunner runner) {
private static void executeTasks(Consumer<ToolTask> taskRunner) {
for (Class<? extends ToolTask> taskClass : TASKS) {
try {
ToolTask task = instantiateTask(taskClass);
System.out.println("\nRunning " + task.getTaskName() + "\n-------------------");
runner.execute(task);
} catch (UnsupportedOperationException e) {
System.err.println("Error running task of class '" + taskClass + "'");
e.printStackTrace();
}
ToolTask task = instantiateTask(taskClass);
System.out.println("\nRunning " + task.getTaskName() + "\n-------------------");
taskRunner.accept(task);
}
}
private interface TaskRunner {
void execute(ToolTask task);
}
}
@@ -1,4 +1,4 @@
package tools.commands;
package tools.docs.commands;
import fr.xephi.authme.command.CommandArgumentDescription;
import fr.xephi.authme.command.CommandDescription;
@@ -37,7 +37,7 @@ public class CommandPageCreater implements AutoToolTask {
addCommandsInfo(commandTags, baseCommands);
FileUtils.generateFileFromTemplate(
ToolsConstants.TOOLS_SOURCE_ROOT + "commands/commands.tpl.md",
ToolsConstants.TOOLS_SOURCE_ROOT + "docs/commands/commands.tpl.md",
OUTPUT_FILE,
TagValueHolder.create().put("commands", commandTags));
System.out.println("Wrote to '" + OUTPUT_FILE + "' with " + baseCommands.size() + " base commands.");
@@ -1,8 +1,9 @@
package tools.hashmethods;
package tools.docs.hashmethods;
import ch.jalu.injector.Injector;
import ch.jalu.injector.InjectorBuilder;
import com.github.authme.configme.properties.Property;
import com.google.common.collect.ImmutableSet;
import fr.xephi.authme.security.HashAlgorithm;
import fr.xephi.authme.security.crypts.EncryptionMethod;
import fr.xephi.authme.security.crypts.HexSaltedMethod;
@@ -19,7 +20,6 @@ import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;
import static com.google.common.collect.Sets.newHashSet;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@@ -30,9 +30,8 @@ import static org.mockito.Mockito.when;
*/
public class EncryptionMethodInfoGatherer {
@SuppressWarnings("unchecked")
private final static Set<Class<? extends Annotation>> RELEVANT_ANNOTATIONS =
newHashSet(HasSalt.class, Recommendation.class, AsciiRestricted.class);
ImmutableSet.of(HasSalt.class, Recommendation.class, AsciiRestricted.class);
private static Injector injector = createInitializer();
@@ -1,4 +1,4 @@
package tools.hashmethods;
package tools.docs.hashmethods;
import fr.xephi.authme.security.HashAlgorithm;
import tools.utils.AutoToolTask;
@@ -17,7 +17,7 @@ import java.util.Scanner;
*/
public class HashAlgorithmsDescriptionTask implements AutoToolTask {
private static final String CUR_FOLDER = ToolsConstants.TOOLS_SOURCE_ROOT + "hashmethods/";
private static final String CUR_FOLDER = ToolsConstants.TOOLS_SOURCE_ROOT + "docs/hashmethods/";
private static final String OUTPUT_FILE = ToolsConstants.DOCS_FOLDER + "hash_algorithms.md";
@Override
@@ -1,4 +1,4 @@
package tools.hashmethods;
package tools.docs.hashmethods;
import fr.xephi.authme.security.crypts.EncryptionMethod;
import fr.xephi.authme.security.crypts.description.SaltType;
@@ -1,18 +1,14 @@
package tools.permissions;
package tools.docs.permissions;
import fr.xephi.authme.permission.AdminPermission;
import fr.xephi.authme.ClassCollector;
import fr.xephi.authme.permission.PermissionNode;
import fr.xephi.authme.permission.PlayerPermission;
import fr.xephi.authme.permission.PlayerStatePermission;
import tools.utils.FileUtils;
import tools.utils.ToolsConstants;
import java.util.EnumSet;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import java.util.TreeSet;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -31,36 +27,22 @@ public class PermissionNodesGatherer {
+ "(.*?)\\s+\\*/" // Capture everything until we encounter '*/'
+ "\\s+([A-Z_]+)\\("); // Match the enum name (e.g. 'LOGIN'), until before the first '('
/**
* Return a sorted collection of all permission nodes.
*
* @return AuthMe permission nodes sorted alphabetically
*/
public Set<String> gatherNodes() {
Set<String> nodes = new TreeSet<>();
for (PermissionNode perm : PlayerPermission.values()) {
nodes.add(perm.getNode());
}
for (PermissionNode perm : AdminPermission.values()) {
nodes.add(perm.getNode());
}
return nodes;
}
/**
* Return a sorted collection of all permission nodes, including its JavaDoc description.
*
* @return Ordered map whose keys are the permission nodes and the values the associated JavaDoc
*/
public Map<String, String> gatherNodesWithJavaDoc() {
public <T extends Enum<T> & PermissionNode> Map<String, String> gatherNodesWithJavaDoc() {
Map<String, String> result = new TreeMap<>();
result.put("authme.admin.*", "Give access to all admin commands.");
result.put("authme.player.*", "Permission to use all player (non-admin) commands.");
// TODO ljacqu 20160109: Add authme.player.email manual description?
result.put("authme.player.email", "Grants all email permissions.");
addDescriptionsForClass(PlayerPermission.class, result);
addDescriptionsForClass(AdminPermission.class, result);
addDescriptionsForClass(PlayerStatePermission.class, result);
new ClassCollector(ToolsConstants.MAIN_SOURCE_ROOT, "")
.collectClasses(PermissionNode.class)
.stream()
.filter(Class::isEnum)
.forEach(clz -> addDescriptionsForClass((Class<T>) clz, result));
return result;
}
@@ -1,4 +1,4 @@
package tools.permissions;
package tools.docs.permissions;
import tools.utils.AutoToolTask;
import tools.utils.FileUtils;
@@ -8,7 +8,6 @@ import tools.utils.ToolsConstants;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
/**
* Task responsible for formatting a permissions node list and
@@ -16,6 +15,7 @@ import java.util.Set;
*/
public class PermissionsListWriter implements AutoToolTask {
private static final String TEMPLATE_FILE = ToolsConstants.TOOLS_SOURCE_ROOT + "docs/permissions/permission_nodes.tpl.md";
private static final String PERMISSIONS_OUTPUT_FILE = ToolsConstants.DOCS_FOLDER + "permission_nodes.md";
@Override
@@ -25,23 +25,7 @@ public class PermissionsListWriter implements AutoToolTask {
@Override
public void execute(Scanner scanner) {
// Ask if result should be written to file
System.out.println("Include description? [Enter 'n' for no]");
boolean includeDescription = !matches("n", scanner);
boolean writeToFile = false;
if (includeDescription) {
System.out.println("Write to file? [Enter 'n' for no]");
writeToFile = !matches("n", scanner);
}
if (!includeDescription) {
outputSimpleList();
} else if (writeToFile) {
generateAndWriteFile();
} else {
System.out.println(generatePermissionsList());
}
generateAndWriteFile();
}
@Override
@@ -53,8 +37,7 @@ public class PermissionsListWriter implements AutoToolTask {
final NestedTagValue permissionsTagValue = generatePermissionsList();
TagValueHolder tags = TagValueHolder.create().put("nodes", permissionsTagValue);
FileUtils.generateFileFromTemplate(
ToolsConstants.TOOLS_SOURCE_ROOT + "permissions/permission_nodes.tpl.md", PERMISSIONS_OUTPUT_FILE, tags);
FileUtils.generateFileFromTemplate(TEMPLATE_FILE, PERMISSIONS_OUTPUT_FILE, tags);
System.out.println("Wrote to '" + PERMISSIONS_OUTPUT_FILE + "'");
System.out.println("Before committing, please verify the output!");
}
@@ -70,20 +53,4 @@ public class PermissionsListWriter implements AutoToolTask {
}
return permissionTags;
}
private static void outputSimpleList() {
PermissionNodesGatherer gatherer = new PermissionNodesGatherer();
Set<String> nodes = gatherer.gatherNodes();
for (String node : nodes) {
System.out.println(node);
}
System.out.println();
System.out.println("Total: " + nodes.size());
}
private static boolean matches(String answer, Scanner sc) {
String userInput = sc.nextLine();
return answer.equalsIgnoreCase(userInput);
}
}
@@ -0,0 +1,143 @@
package tools.docs.translations;
import com.google.common.collect.ImmutableMap;
import tools.docs.translations.TranslationsGatherer.TranslationInfo;
import tools.utils.AutoToolTask;
import tools.utils.FileUtils;
import tools.utils.TagValue.NestedTagValue;
import tools.utils.TagValueHolder;
import tools.utils.ToolsConstants;
import java.util.Arrays;
import java.util.Map;
import java.util.Scanner;
import java.util.stream.Collectors;
import static com.google.common.base.Objects.firstNonNull;
/**
* Generates the translations page in docs.
*/
public class TranslationPageGenerator implements AutoToolTask {
private static final String DOCS_PAGE = ToolsConstants.DOCS_FOLDER + "translations.md";
private static final String TEMPLATE_FILE = ToolsConstants.TOOLS_SOURCE_ROOT + "docs/translations/translations.tpl.md";
private static final Map<String, String> LANGUAGE_NAMES = buildLanguageNames();
// Color configuration for the bars shown next to translation percentage
/**
* Percentage threshold under which the color will be computed from COLOR_0 to COLOR_1;
* above which COLOR_1 to COLOR_2 is used.
*/
private static final int COLOR_1_PERCENTAGE = 75;
// Colors are in RGB format, displayed as an int array of three values whose entries are in the range [0, 15].
private static final int[] COLOR_0 = { 9, 0, 0};
private static final int[] COLOR_1 = {12, 9, 0};
private static final int[] COLOR_2 = { 6, 15, 6};
private final TranslationsGatherer gatherer = new TranslationsGatherer();
@Override
public String getTaskName() {
return "updateTranslations";
}
@Override
public void execute(Scanner scanner) {
executeDefault();
}
@Override
public void executeDefault() {
NestedTagValue translationValuesHolder = new NestedTagValue();
for (TranslationInfo translation : gatherer.getTranslationInfo()) {
int percentage = (int) Math.round(translation.percentTranslated * 100);
String name = firstNonNull(LANGUAGE_NAMES.get(translation.code), "?");
TagValueHolder valueHolder = TagValueHolder.create()
.put("code", translation.code)
.put("name", name)
.put("percentage", Integer.toString(percentage))
.put("color", computeColor(percentage));
translationValuesHolder.add(valueHolder);
}
TagValueHolder tags = TagValueHolder.create().put("languages", translationValuesHolder);
FileUtils.generateFileFromTemplate(TEMPLATE_FILE, DOCS_PAGE, tags);
}
/**
* Returns the color for the given percentage as a 6-digit hex color code.
*
* @param percentage the percentage to generate a color for
* @return the color
*/
private String computeColor(int percentage) {
int[] color;
if (percentage < COLOR_1_PERCENTAGE) {
color = computeColor(percentage, COLOR_0, COLOR_1, 0, COLOR_1_PERCENTAGE);
} else {
color = computeColor(percentage, COLOR_1, COLOR_2, COLOR_1_PERCENTAGE, 100);
}
return Arrays.stream(color)
.mapToObj(i -> Integer.toString(i, 16))
.map(s -> s + s)
.collect(Collectors.joining());
}
/**
* Computes the color as the transition between two given colors.
*
* @param percentage the percentage to compute the color for
* @param colorA the color at the start of the range
* @param colorB the color at the end of the range
* @param rangeMin range start
* @param rangeMax range end
* @return color for the given percentage
*/
private static int[] computeColor(int percentage, int[] colorA, int[] colorB, int rangeMin, int rangeMax) {
double max = rangeMax - rangeMin;
double n = percentage - rangeMin;
return new int[]{
(int) (colorA[0] + n / max * (colorB[0] - colorA[0])),
(int) (colorA[1] + n / max * (colorB[1] - colorA[1])),
(int) (colorA[2] + n / max * (colorB[2] - colorA[2]))
};
}
/**
* @return map of language code -> language name
*/
private static Map<String, String> buildLanguageNames() {
return ImmutableMap.<String, String>builder()
.put("bg", "Bulgarian")
.put("br", "Brazilian")
.put("cz", "Czech")
.put("de", "German")
.put("en", "English")
.put("es", "Spanish")
.put("eu", "Basque")
.put("fi", "Finnish")
.put("fr", "French")
.put("gl", "Galician")
.put("hu", "Hungarian")
.put("id", "Indonesian")
.put("it", "Italian")
.put("ko", "Korean")
.put("lt", "Latvian")
.put("nl", "Dutch")
.put("pl", "Polish")
.put("pt", "Portuguese")
.put("ru", "Russian")
.put("sk", "Slovakian")
.put("tr", "Turkish")
.put("uk", "Ukrainian")
.put("vn", "Vietnamese")
.put("zhcn", "Chinese (China)")
.put("zhhk", "Chinese (Hong Kong)")
.put("zhtw", "Chinese (Taiwan)")
.build();
}
}
@@ -0,0 +1,86 @@
package tools.docs.translations;
import fr.xephi.authme.message.MessageKey;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import tools.utils.ToolsConstants;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Gathers all available translations of AuthMe.
*/
public class TranslationsGatherer {
private static final Pattern MESSAGES_PATTERN = Pattern.compile("messages_([a-z]{2,4})\\.yml");
private static final String MESSAGES_FOLDER = ToolsConstants.MAIN_RESOURCES_ROOT + "messages/";
private List<TranslationInfo> translationInfo = new ArrayList<>();
public TranslationsGatherer() {
gatherTranslations();
translationInfo.sort((e1, e2) -> getCode(e1).compareTo(getCode(e2)));
}
public List<TranslationInfo> getTranslationInfo() {
return translationInfo;
}
private void gatherTranslations() {
File[] files = new File(MESSAGES_FOLDER).listFiles();
if (files == null) {
throw new IllegalStateException("Cannot read files of '" + MESSAGES_FOLDER + "'");
}
for (File file : files) {
String code = getLanguageCode(file.getName());
if (code != null) {
processMessagesFile(code, file);
}
}
}
private void processMessagesFile(String code, File file) {
FileConfiguration configuration = YamlConfiguration.loadConfiguration(file);
int availableMessages = 0;
for (MessageKey key : MessageKey.values()) {
if (configuration.contains(key.getKey())) {
++availableMessages;
}
}
translationInfo.add(new TranslationInfo(code, (double) availableMessages / MessageKey.values().length));
}
private String getLanguageCode(String messagesFile) {
Matcher matcher = MESSAGES_PATTERN.matcher(messagesFile);
if (matcher.find()) {
return matcher.group(1);
}
return null;
}
public static final class TranslationInfo {
public final String code;
public final double percentTranslated;
TranslationInfo(String code, double percentTranslated) {
this.code = code;
this.percentTranslated = percentTranslated;
}
}
/**
* Returns the language code from the translation info for sorting purposes.
* Returns "a" for "en" language code to sort English on top.
*
* @param info the translation info
* @return the language code for sorting
*/
private static String getCode(TranslationInfo info) {
return "en".equals(info.code) ? "a" : info.code;
}
}
@@ -0,0 +1,14 @@
<!-- {gen_warning} -->
<!-- File auto-generated on {gen_date}. See translations/translations.tpl.md -->
# AuthMe Translations
The following translations are available in AuthMe. Set `messagesLanguage` to the language code
in your config.yml to use the language, or use another language code to start a new translation.
Code | Language | Translated | &nbsp;
---- | -------- | ---------: | ------
[#languages]
[{code}](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_{code}.yml) | {name} | {percentage}% | <img src="https://placeholdit.imgix.net/~text?txtsize=5&bg={color}&w={percentage}&h=5&txtpad=1" alt="bar" />
[/#languages]
{gen_footer}
@@ -1,2 +0,0 @@
# About
Helper script to generate a page with an up-to-date list of permission nodes.
+13 -2
View File
@@ -3,7 +3,12 @@ package tools.utils;
import java.util.ArrayList;
import java.util.List;
/**
* Value of a tag.
*
* @param <T> the tag value type
* @see TagReplacer
*/
public abstract class TagValue<T> {
private final T value;
@@ -18,6 +23,9 @@ public abstract class TagValue<T> {
public abstract boolean isEmpty();
/**
* Text value.
*/
public static final class TextTagValue extends TagValue<String> {
public TextTagValue(String value) {
super(value);
@@ -29,9 +37,12 @@ public abstract class TagValue<T> {
}
}
/**
* List value (iterable).
*/
public static final class NestedTagValue extends TagValue<List<TagValueHolder>> {
public NestedTagValue() {
super(new ArrayList<TagValueHolder>());
super(new ArrayList<>());
}
@Override