Compare commits

...
Author SHA1 Message Date
main() 57b3370381 Fixed unit test 2012-11-05 16:30:19 +01:00
main() 9d213fbc0a Merge branch 'master' of github.com:Multiverse/Multiverse-Core into localization
Conflicts:
	src/main/java/com/onarandombox/MultiverseCore/MultiverseCore.java
	src/main/java/com/onarandombox/MultiverseCore/MultiverseCoreConfiguration.java
	src/main/java/com/onarandombox/MultiverseCore/api/MultiverseCoreConfig.java
2012-11-05 16:26:49 +01:00
main() 0c638035f2 Moving strings, part 2 2012-11-05 16:22:16 +01:00
main() fb6a031860 Localization should now be thread-safe. 2012-10-24 16:58:43 +02:00
main() 703707a39b Improved localization loading on startup. 2012-10-24 16:58:04 +02:00
main() 0b7b91a081 Merge branch 'master' of github.com:Multiverse/Multiverse-Core into localization
Conflicts:
	src/main/java/com/onarandombox/MultiverseCore/MultiverseCore.java
2012-10-24 16:54:02 +02:00
main() 21b997c1a2 Moving strings, part 1 2012-10-17 15:43:41 +02:00
main() 7031e9e58b Now saving the Locale in the new config 2012-10-16 20:38:55 +02:00
main() 322acbc636 Fixed possible stream leak
Thanks, eclipse!
2012-10-16 20:10:37 +02:00
main() 256d4b0abd Now building the color char regex dynamically.
The regex is now built from values in org.bukkit.ChatColor!
2012-10-16 20:04:44 +02:00
main() 88088548f8 Merge branch 'master' of github.com:Multiverse/Multiverse-Core into localization
Conflicts:
	src/main/java/com/onarandombox/MultiverseCore/MultiverseCore.java
	src/test/java/com/onarandombox/MultiverseCore/test/utils/TestInstanceCreator.java
2012-10-16 19:38:04 +02:00
main() affc96f2e2 Merge branch 'master' into localization 2012-05-17 15:26:06 +02:00
main() f3830390f6 Merge branch 'master' into localization
Conflicts:
	src/main/java/com/onarandombox/MultiverseCore/MultiverseCore.java
2012-02-26 16:47:31 +01:00
main() 8b224349e6 Seriously? Where does this come from? 2012-02-04 20:09:11 +01:00
main() b51e26bcf1 Merge branch 'master' of github.com:Multiverse/Multiverse-Core into localization
Conflicts:
	src/main/java/com/onarandombox/MultiverseCore/MultiverseCore.java
	src/main/resources/defaults/config.yml
2012-02-04 20:06:45 +01:00
Eric Stokes 49ffb4dcec Merge changes from master into localization 2012-01-24 20:44:19 -07:00
main() a66a5eaeb3 Merge branch 'master' of github.com:Multiverse/Multiverse-Core into localization
Conflicts:
	src/main/java/com/onarandombox/MultiverseCore/MultiverseCore.java
	src/main/java/com/onarandombox/MultiverseCore/commands/ListCommand.java
	src/main/resources/defaults/config.yml
2012-01-07 16:26:41 +01:00
main() ba6f580fd8 Added test for SimpleMessageProvider.format(String, Object...). 2012-01-06 17:11:30 +01:00
main() e6c36be019 Improved ChatColor-support. 2012-01-06 17:10:37 +01:00
dumptruckman 3e4b042de8 Added args for String.format()
( cherry-picked by @main-- )
2012-01-06 16:53:18 +01:00
main() 451955f858 Reordered strings in the enum 2011-12-11 11:13:28 +01:00
Eric Stokes 8e5d96309f Load locale before erring, add more generic locale messages. 2011-12-10 17:34:29 -07:00
Eric Stokes 970692d228 Apparently these didn't get smashed... 2011-12-10 17:30:44 -07:00
Eric Stokes 91a5d6c1c5 Fixed all merge badness... Sorry. 2011-12-10 17:20:09 -07:00
Eric Stokes 7668d14613 Pull import changes from master 2011-12-10 17:15:53 -07:00
Eric Stokes 38ce30f981 Fix not quoting a string that had a ':' in it. 2011-12-10 17:10:07 -07:00
Eric Stokes abb58b0563 Pull changes from master. 2011-12-10 17:03:36 -07:00
main() 22a7c5ae94 Fixed some nasty bugs 2011-12-02 18:39:05 +01:00
main() 303bbc317b Initialize the messageProvider only once, not on every onEnable() 2011-12-02 14:32:35 +01:00
main() 3531bd6432 Made a first working version of localization. 2011-12-01 20:36:12 +01:00
32 changed files with 935 additions and 89 deletions

No files matched your search

@@ -68,8 +68,15 @@ import com.onarandombox.MultiverseCore.listeners.MVEntityListener;
import com.onarandombox.MultiverseCore.listeners.MVPlayerChatListener;
import com.onarandombox.MultiverseCore.listeners.MVPlayerListener;
import com.onarandombox.MultiverseCore.listeners.MVPluginListener;
import com.onarandombox.MultiverseCore.localization.LazyLocaleMessageProvider;
import com.onarandombox.MultiverseCore.localization.LocalizationLoadingException;
import com.onarandombox.MultiverseCore.localization.MessageProvider;
import com.onarandombox.MultiverseCore.localization.MessageProviding;
import com.onarandombox.MultiverseCore.localization.NoSuchLocalizationException;
import com.onarandombox.MultiverseCore.listeners.MVPortalListener;
import com.onarandombox.MultiverseCore.listeners.MVWeatherListener;
import com.onarandombox.MultiverseCore.localization.MultiverseMessage;
import com.onarandombox.MultiverseCore.localization.SimpleMessageProvider;
import com.onarandombox.MultiverseCore.utils.AnchorManager;
import com.onarandombox.MultiverseCore.utils.MVMessaging;
import com.onarandombox.MultiverseCore.utils.MVPermissions;
@@ -104,6 +111,7 @@ import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import java.util.logging.Level;
@@ -111,13 +119,14 @@ import java.util.logging.Level;
/**
* The implementation of the Multiverse-{@link Core}.
*/
public class MultiverseCore extends JavaPlugin implements MVPlugin, Core {
public class MultiverseCore extends JavaPlugin implements MVPlugin, Core, MessageProviding {
private static final int PROTOCOL = 18;
// TODO: Investigate if this one is really needed to be static.
// Doubt it. -- FernFerret
private static Map<String, String> teleportQueue = new HashMap<String, String>();
private AnchorManager anchorManager = new AnchorManager(this);
private MessageProvider messageProvider = new SimpleMessageProvider(this);
// TODO please let's make this non-static
private volatile MultiverseCoreConfiguration config;
@@ -264,7 +273,7 @@ public class MultiverseCore extends JavaPlugin implements MVPlugin, Core {
*/
@Override
public void onEnable() {
this.messaging = new MVMessaging();
this.messaging = new MVMessaging(this);
this.banker = new AllPay(this, LOG_TAG + " ");
this.vaultHandler = new VaultHandler(this);
// Load the defaultWorldGenerators
@@ -294,6 +303,25 @@ public class MultiverseCore extends JavaPlugin implements MVPlugin, Core {
// this function will be called every time a plugin registers a new envtype with MV
// Setup & Load our Configuration files.
loadConfigs();
try {
Locale l = (this.config.getLocale() == null) ? Locale.getDefault() : this.config.getLocale();
if (this.messageProvider instanceof LazyLocaleMessageProvider)
((LazyLocaleMessageProvider)this.messageProvider).loadLocale(l);
this.messageProvider.setLocale(l);
} catch (NoSuchLocalizationException e) {
if (this.config.getLocale() != null)
this.log(Level.SEVERE, String.format(
"Multiverse couldn't find any translations for the selected locale '%s'. '%s' will be used instead.",
this.config.getLocale(), this.messageProvider.getLocale()));
} catch (LocalizationLoadingException e) {
this.log(Level.SEVERE, String.format("Failed to load the selected locale '%s'. '%s' will be used instead.",
this.config.getLocale(), this.messageProvider.getLocale()));
e.printStackTrace();
} catch (IllegalArgumentException e) {
this.log(Level.SEVERE, e.getMessage());
this.getServer().getPluginManager().disablePlugin(this);
return;
}
if (this.multiverseConfig != null) {
Logging.setDebugLevel(getMVConfig().getGlobalDebug());
Logging.setShowingConfig(!getMVConfig().getSilentStart());
@@ -858,7 +886,7 @@ public class MultiverseCore extends JavaPlugin implements MVPlugin, Core {
@Override
public boolean onCommand(CommandSender sender, Command command, String commandLabel, String[] args) {
if (!this.isEnabled()) {
sender.sendMessage("This plugin is Disabled!");
this.messaging.sendMessage(sender, MultiverseMessage.CH_PLUGIN_DISABLED);
return true;
}
ArrayList<String> allArgs = new ArrayList<String>(Arrays.asList(args));
@@ -867,11 +895,8 @@ public class MultiverseCore extends JavaPlugin implements MVPlugin, Core {
return this.commandHandler.locateAndRunCommand(sender, allArgs, getMVConfig().getDisplayPermErrors());
} catch (Exception e) {
e.printStackTrace();
sender.sendMessage(ChatColor.RED + "An internal error occurred when attempting to perform this command.");
if (sender.isOp())
sender.sendMessage(ChatColor.RED + "Details were printed to the server console and logs, please add that to your bug report.");
else
sender.sendMessage(ChatColor.RED + "Try again and contact the server owner or an admin if this problem persists.");
this.messaging.sendMessage(sender, MultiverseMessage.CH_INTERNAL_ERROR);
this.messaging.sendMessage(sender, sender.isOp() ? MultiverseMessage.CH_ADMIN_DEBUG : MultiverseMessage.CH_USER_DEBUG);
return true;
}
}
@@ -903,7 +928,7 @@ public class MultiverseCore extends JavaPlugin implements MVPlugin, Core {
* standard Server Console.
*
* @param level The Log-{@link Level}
* @param msg The message
* @param msg The message
*
* @deprecated Replaced by {@link Logging}. Please refrain from using this from a third party plugin as the
* messages will appear to originate from Multiverse-Core.
@@ -963,8 +988,8 @@ public class MultiverseCore extends JavaPlugin implements MVPlugin, Core {
* @param worldName The name of the invalid world
*/
public void showNotMVWorldMessage(CommandSender sender, String worldName) {
sender.sendMessage("Multiverse doesn't know about " + ChatColor.DARK_AQUA + worldName + ChatColor.WHITE + " yet.");
sender.sendMessage("Type " + ChatColor.DARK_AQUA + "/mv import ?" + ChatColor.WHITE + " for help!");
// TODO remove this method because we can now send this message in one line
this.messaging.sendMessage(sender, MultiverseMessage.GENERIC_NOT_MV_WORLD, worldName);
}
/**
@@ -1201,6 +1226,25 @@ public class MultiverseCore extends JavaPlugin implements MVPlugin, Core {
return this.anchorManager;
}
/**
* {@inheritDoc}
*/
@Override
public MessageProvider getMessageProvider() {
return messageProvider;
}
/**
* {@inheritDoc}
*/
@Override
public void setMessageProvider(MessageProvider provider) {
if (provider == null)
throw new IllegalArgumentException("The new provider can't be null!");
messageProvider = provider;
}
/**
* {@inheritDoc}
*/
@@ -2,10 +2,12 @@ package com.onarandombox.MultiverseCore;
import com.dumptruckman.minecraft.util.Logging;
import com.onarandombox.MultiverseCore.api.MultiverseCoreConfig;
import com.onarandombox.MultiverseCore.configuration.LocaleSerializor;
import me.main__.util.SerializationConfig.NoSuchPropertyException;
import me.main__.util.SerializationConfig.Property;
import me.main__.util.SerializationConfig.SerializationConfig;
import java.util.Locale;
import java.util.Map;
/**
@@ -63,6 +65,8 @@ public class MultiverseCoreConfiguration extends SerializationConfig implements
private volatile String firstspawnworld;
@Property
private volatile int teleportcooldown;
@Property(serializor = LocaleSerializor.class)
private volatile Locale locale;
public MultiverseCoreConfiguration() {
super();
@@ -279,6 +283,16 @@ public class MultiverseCoreConfiguration extends SerializationConfig implements
return this.useasyncchat;
}
@Override
public Locale getLocale() {
return locale;
}
@Override
public void setLocale(Locale locale) {
this.locale = locale;
}
@Override
public void setSilentStart(boolean silentStart) {
Logging.setShowingConfig(!silentStart);
@@ -1,5 +1,7 @@
package com.onarandombox.MultiverseCore.api;
import java.util.Locale;
import org.bukkit.configuration.serialization.ConfigurationSerializable;
/**
@@ -146,6 +148,18 @@ public interface MultiverseCoreConfig extends ConfigurationSerializable {
*/
boolean getUseAsyncChat();
/**
* Sets the locale.
* @param locale The new value.
*/
void setLocale(Locale locale);
/**
* Gets the locale.
* @return locale
*/
Locale getLocale();
/**
* Sets whether to suppress startup messages.
*
@@ -4,6 +4,8 @@ import java.util.Collection;
import org.bukkit.command.CommandSender;
import com.onarandombox.MultiverseCore.localization.MultiverseMessage;
/**
* Multiverse-messaging.
*/
@@ -14,6 +16,27 @@ public interface MultiverseMessaging {
*/
void setCooldown(int milliseconds);
/**
* Sends a message to the specified sender if the cooldown has passed.
*
* @param sender The person/console to send the message to.
* @param message The message to send.
* @param formatArgs Format arguments for the message.
* @return true if the message was sent, false if not.
*/
boolean sendMessage(CommandSender sender, MultiverseMessage message, Object...formatArgs);
/**
* Sends a message to the specified sender if the cooldown has passed.
*
* @param sender The person/console to send the message to.
* @param message The message to send.
* @param ignoreCooldown If true this message will always be sent. Useful for things like menus
* @param formatArgs Format arguments for the message.
* @return true if the message was sent, false if not.
*/
boolean sendMessage(CommandSender sender, MultiverseMessage message, boolean ignoreCooldown, Object... formatArgs);
/**
* Sends a message to the specified sender if the cooldown has passed.
*
@@ -12,6 +12,7 @@ import org.bukkit.command.CommandSender;
import org.bukkit.plugin.java.JavaPlugin;
import com.onarandombox.MultiverseCore.MultiverseCore;
import com.onarandombox.MultiverseCore.localization.MultiverseMessage;
import com.onarandombox.MultiverseCore.utils.DebugLog;
import com.pneumaticraft.commandhandler.CommandHandler;
@@ -105,7 +106,7 @@ public abstract class MultiversePlugin extends JavaPlugin implements MVPlugin {
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if (!this.isEnabled()) {
sender.sendMessage("This plugin is Disabled!");
this.core.getMessaging().sendMessage(sender, MultiverseMessage.CH_PLUGIN_DISABLED);
return true;
}
@@ -8,6 +8,8 @@
package com.onarandombox.MultiverseCore.commands;
import com.onarandombox.MultiverseCore.MultiverseCore;
import com.onarandombox.MultiverseCore.localization.MultiverseMessage;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
@@ -55,11 +57,11 @@ public class AnchorCommand extends PaginatedCoreCommand<String> {
private void showList(CommandSender sender, List<String> args) {
if (!this.plugin.getMVPerms().hasPermission(sender, "multiverse.core.anchor.list", true)) {
sender.sendMessage(ChatColor.RED + "You don't have the permission to list anchors!");
this.plugin.getMessaging().sendMessage(sender, MultiverseMessage.CMD_ANCHOR_NOLISTPERM);
return;
}
sender.sendMessage(ChatColor.LIGHT_PURPLE + "====[ Multiverse Anchor List ]====");
this.plugin.getMessaging().sendMessage(sender, MultiverseMessage.CMD_ANCHOR_LISTHEADER);
Player p = null;
if (sender instanceof Player) {
p = (Player) sender;
@@ -72,13 +74,12 @@ public class AnchorCommand extends PaginatedCoreCommand<String> {
if (filterObject.getFilter().length() > 0) {
availableAnchors = this.getFilteredItems(availableAnchors, filterObject.getFilter());
if (availableAnchors.size() == 0) {
sender.sendMessage(ChatColor.RED + "Sorry... " + ChatColor.WHITE
+ "No anchors matched your filter: " + ChatColor.AQUA + filterObject.getFilter());
this.plugin.getMessaging().sendMessage(sender, MultiverseMessage.CMD_ANCHOR_NOMATCH, filterObject.getFilter());
return;
}
} else {
if (availableAnchors.size() == 0) {
sender.sendMessage(ChatColor.RED + "Sorry... " + ChatColor.WHITE + "No anchors were defined.");
this.plugin.getMessaging().sendMessage(sender, MultiverseMessage.CMD_ANCHOR_NODEF);
return;
}
}
@@ -99,7 +100,7 @@ public class AnchorCommand extends PaginatedCoreCommand<String> {
filterObject.setPage(1);
}
sender.sendMessage(ChatColor.AQUA + " Page " + filterObject.getPage() + " of " + totalPages);
this.plugin.getMessaging().sendMessage(sender, MultiverseMessage.CMD_ANCHOR_PAGEHEADER, filterObject.getPage(), totalPages);
this.showPage(filterObject.getPage(), sender, availableAnchors);
}
@@ -115,33 +116,24 @@ public class AnchorCommand extends PaginatedCoreCommand<String> {
return;
}
if (args.size() == 2 && args.get(1).equalsIgnoreCase("-d")) {
if (!this.plugin.getMVPerms().hasPermission(sender, "multiverse.core.anchor.delete", true)) {
sender.sendMessage(ChatColor.RED + "You don't have the permission to delete anchors!");
} else {
if (this.plugin.getAnchorManager().deleteAnchor(args.get(0))) {
sender.sendMessage("Anchor '" + args.get(0) + "' was successfully " + ChatColor.RED + "deleted!");
} else {
sender.sendMessage("Anchor '" + args.get(0) + "' was " + ChatColor.RED + " NOT " + ChatColor.WHITE + "deleted!");
}
}
if (!this.plugin.getMVPerms().hasPermission(sender, "multiverse.core.anchor.delete", true))
this.plugin.getMessaging().sendMessage(sender, MultiverseMessage.CMD_ANCHOR_NODELPERM);
else
this.plugin.getMessaging().sendMessage(sender, this.plugin.getAnchorManager().deleteAnchor(args.get(0))
? MultiverseMessage.CMD_ANCHOR_DELSUCCESS : MultiverseMessage.CMD_ANCHOR_DELFAIL, args.get(0));
return;
}
if (!(sender instanceof Player)) {
sender.sendMessage("You must be a player to create Anchors.");
this.plugin.getMessaging().sendMessage(sender, MultiverseMessage.CMD_ANCHOR_CONSOLECREATE);
return;
}
if (!this.plugin.getMVPerms().hasPermission(sender, "multiverse.core.anchor.create", true)) {
sender.sendMessage(ChatColor.RED + "You don't have the permission to create anchors!");
} else {
Player player = (Player) sender;
if (this.plugin.getAnchorManager().saveAnchorLocation(args.get(0), player.getLocation())) {
sender.sendMessage("Anchor '" + args.get(0) + "' was successfully " + ChatColor.GREEN + "created!");
} else {
sender.sendMessage("Anchor '" + args.get(0) + "' was " + ChatColor.RED + " NOT " + ChatColor.WHITE + "created!");
}
}
if (!this.plugin.getMVPerms().hasPermission(sender, "multiverse.core.anchor.create", true))
this.plugin.getMessaging().sendMessage(sender, MultiverseMessage.CMD_ANCHOR_NOCREATEPERM);
else
this.plugin.getMessaging().sendMessage(sender, this.plugin.getAnchorManager().saveAnchorLocation(args.get(0), ((Player) sender).getLocation())
? MultiverseMessage.CMD_ANCHOR_CREATESUCCESS : MultiverseMessage.CMD_ANCHOR_CREATEFAIL, args.get(0));
}
@Override
@@ -10,6 +10,7 @@ package com.onarandombox.MultiverseCore.commands;
import com.onarandombox.MultiverseCore.MultiverseCore;
import com.onarandombox.MultiverseCore.api.MVDestination;
import com.onarandombox.MultiverseCore.destination.InvalidDestination;
import com.onarandombox.MultiverseCore.localization.MultiverseMessage;
import com.onarandombox.MultiverseCore.utils.MVPermissions;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
@@ -39,15 +40,12 @@ public class CheckCommand extends MultiverseCommand {
public void runCommand(CommandSender sender, List<String> args) {
Player p = this.plugin.getServer().getPlayer(args.get(0));
if (p == null) {
sender.sendMessage("Could not find player " + ChatColor.GREEN + args.get(0));
sender.sendMessage("Are they online?");
this.messaging.sendMessage(sender, MultiverseMessage.CMD_CHECK_NOSUCHPLAYER, args.get(0));
return;
}
MVDestination dest = this.plugin.getDestFactory().getDestination(args.get(1));
if (dest instanceof InvalidDestination) {
sender.sendMessage(String.format("You asked if '%s' could go to %s%s%s,",
args.get(0), ChatColor.GREEN, args.get(0), ChatColor.WHITE));
sender.sendMessage("but I couldn't find a Destination of that name? Did you type it correctly?");
this.messaging.sendMessage(sender, MultiverseMessage.CMD_CHECK_NOSUCHDEST);
return;
}
@@ -9,6 +9,7 @@ package com.onarandombox.MultiverseCore.commands;
import com.onarandombox.MultiverseCore.MultiverseCore;
import com.onarandombox.MultiverseCore.api.MVWorldManager;
import com.onarandombox.MultiverseCore.localization.MultiverseMessage;
import com.pneumaticraft.commandhandler.CommandHandler;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
@@ -50,8 +51,7 @@ public class CloneCommand extends MultiverseCommand {
objectArgs.add(CommandHandler.getFlag("-g", args));
if (!this.worldManager.isMVWorld(args.get(0))) {
// If no world was found, we can't clone.
sender.sendMessage("Sorry, Multiverse doesn't know about world " + args.get(0) + ", so we can't clone it!");
sender.sendMessage("Check the " + ChatColor.GREEN + "/mv list" + ChatColor.WHITE + " command to verify it is listed.");
this.messaging.sendMessage(sender, MultiverseMessage.CMD_CLONE_NOSUCHWORLD, args.get(0));
return;
}
this.plugin.getCommandHandler().queueCommand(sender, "mvclone", "cloneWorld", objectArgs,
@@ -8,6 +8,8 @@
package com.onarandombox.MultiverseCore.commands;
import com.onarandombox.MultiverseCore.MultiverseCore;
import com.onarandombox.MultiverseCore.localization.MultiverseMessage;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.permissions.PermissionDefault;
@@ -52,7 +54,7 @@ public class ConfigCommand extends MultiverseCommand {
return;
}
if (!this.plugin.getMVConfig().setConfigProperty(args.get(0).toLowerCase(), args.get(1))) {
sender.sendMessage(String.format("%sSetting '%s' to '%s' failed!", ChatColor.RED, args.get(0).toLowerCase(), args.get(1)));
this.messaging.sendMessage(sender, MultiverseMessage.CMD_CONFIG_SETFAIL, args.get(0), args.get(1));
return;
}
@@ -63,10 +65,10 @@ public class ConfigCommand extends MultiverseCommand {
}
if (this.plugin.saveMVConfigs()) {
sender.sendMessage(ChatColor.GREEN + "SUCCESS!" + ChatColor.WHITE + " Values were updated successfully!");
this.messaging.sendMessage(sender, MultiverseMessage.CMD_CLONE_SUCCESS);
this.plugin.loadConfigs();
} else {
sender.sendMessage(ChatColor.RED + "FAIL!" + ChatColor.WHITE + " Check your console for details!");
this.messaging.sendMessage(sender, MultiverseMessage.CMD_CONFIG_FAIL);
}
}
}
@@ -9,6 +9,7 @@ package com.onarandombox.MultiverseCore.commands;
import com.onarandombox.MultiverseCore.MultiverseCore;
import com.onarandombox.MultiverseCore.api.MVWorldManager;
import com.onarandombox.MultiverseCore.localization.MultiverseMessage;
import com.pneumaticraft.commandhandler.CommandHandler;
import org.bukkit.ChatColor;
import org.bukkit.World.Environment;
@@ -68,20 +69,18 @@ public class CreateCommand extends MultiverseCommand {
}
if (this.worldManager.isMVWorld(worldName)) {
sender.sendMessage(ChatColor.RED + "Multiverse cannot create " + ChatColor.GOLD + ChatColor.UNDERLINE
+ "another" + ChatColor.RESET + ChatColor.RED + " world named " + worldName);
this.messaging.sendMessage(sender, MultiverseMessage.CMD_CREATE_WORLDEXISTS, worldName);
return;
}
if (worldFile.exists()) {
sender.sendMessage(ChatColor.RED + "A Folder/World already exists with this name!");
sender.sendMessage(ChatColor.RED + "If you are confident it is a world you can import with /mvimport");
this.messaging.sendMessage(sender, MultiverseMessage.CMD_CREATE_FILEEXISTS);
return;
}
Environment environment = EnvironmentCommand.getEnvFromString(env);
if (environment == null) {
sender.sendMessage(ChatColor.RED + "That is not a valid environment.");
this.messaging.sendMessage(sender, MultiverseMessage.CMD_CREATE_INVALIDENV);
EnvironmentCommand.showEnvironments(sender);
return;
}
@@ -92,7 +91,7 @@ public class CreateCommand extends MultiverseCommand {
}
WorldType type = EnvironmentCommand.getWorldTypeFromString(typeString);
if (type == null) {
sender.sendMessage(ChatColor.RED + "That is not a valid World Type.");
this.messaging.sendMessage(sender, MultiverseMessage.CMD_CREATE_INVALIDTYPE);
EnvironmentCommand.showWorldTypes(sender);
return;
}
@@ -105,16 +104,16 @@ public class CreateCommand extends MultiverseCommand {
}
if (this.worldManager.getChunkGenerator(genarray.get(0), genarray.get(1), "test") == null) {
// We have an invalid generator.
sender.sendMessage("Invalid generator! '" + generator + "'. " + ChatColor.RED + "Aborting world creation.");
this.messaging.sendMessage(sender, MultiverseMessage.CMD_CREATE_INVALIDGEN, generator);
return;
}
}
Command.broadcastCommandMessage(sender, "Starting creation of world '" + worldName + "'...");
Command.broadcastCommandMessage(sender, this.plugin.getMessageProvider().getMessage(MultiverseMessage.CMD_CREATE_START, worldName));
if (this.worldManager.addWorld(worldName, environment, seed, type, allowStructures, generator, useSpawnAdjust)) {
Command.broadcastCommandMessage(sender, "Complete!");
Command.broadcastCommandMessage(sender, this.plugin.getMessageProvider().getMessage(MultiverseMessage.CMD_CREATE_COMPLETE));
} else {
Command.broadcastCommandMessage(sender, "FAILED.");
Command.broadcastCommandMessage(sender, this.plugin.getMessageProvider().getMessage(MultiverseMessage.CMD_CREATE_FAILED));
}
}
}
@@ -9,6 +9,8 @@ package com.onarandombox.MultiverseCore.commands;
import com.dumptruckman.minecraft.util.Logging;
import com.onarandombox.MultiverseCore.MultiverseCore;
import com.onarandombox.MultiverseCore.localization.MultiverseMessage;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.permissions.PermissionDefault;
@@ -24,7 +26,7 @@ public class GeneratorCommand extends MultiverseCommand {
public GeneratorCommand(MultiverseCore plugin) {
super(plugin);
this.setName("World Information");
this.setName("Generator Information");
this.setCommandUsage("/mv generators");
this.setArgRange(0, 0);
this.addKey("mv generators");
@@ -45,16 +47,16 @@ public class GeneratorCommand extends MultiverseCommand {
generators.add(p.getDescription().getName());
}
}
sender.sendMessage(ChatColor.AQUA + "--- Loaded Generator Plugins ---");
this.messaging.sendMessage(sender, MultiverseMessage.CMD_GENERATOR_LISTHEADER);
String loadedGens = "";
boolean altColor = false;
for (String s : generators) {
loadedGens += (altColor ? ChatColor.YELLOW : ChatColor.WHITE) + s + " ";
altColor = !altColor;
}
if (loadedGens.length() == 0) {
loadedGens = ChatColor.RED + "No Generator Plugins found.";
}
sender.sendMessage(loadedGens);
if (loadedGens.length() == 0)
this.messaging.sendMessage(sender, MultiverseMessage.CMD_GENERATOR_NOGENSFOUND);
else
this.messaging.sendMessage(sender, loadedGens, false);
}
}
@@ -9,6 +9,8 @@ package com.onarandombox.MultiverseCore.commands;
import com.onarandombox.MultiverseCore.MultiverseCore;
import com.onarandombox.MultiverseCore.api.MultiverseWorld;
import com.onarandombox.MultiverseCore.localization.MessageProvider;
import com.onarandombox.MultiverseCore.localization.MultiverseMessage;
import org.bukkit.ChatColor;
import org.bukkit.World.Environment;
import org.bukkit.command.CommandSender;
@@ -22,16 +24,18 @@ import java.util.List;
* Displays a listing of all worlds that a player can enter.
*/
public class ListCommand extends PaginatedCoreCommand<String> {
private MessageProvider provider;
public ListCommand(MultiverseCore plugin) {
super(plugin);
this.setName("World Listing");
provider = plugin.getMessageProvider();
this.setName(provider.getMessage(MultiverseMessage.CMD_LIST_NAME));
this.setCommandUsage("/mv list");
this.setArgRange(0, 2);
this.addKey("mvlist");
this.addKey("mvl");
this.addKey("mv list");
this.setPermission("multiverse.core.list.worlds", "Displays a listing of all worlds that you can enter.", PermissionDefault.OP);
this.setPermission("multiverse.core.list.worlds", provider.getMessage(MultiverseMessage.CMD_LIST_DESC), PermissionDefault.OP);
this.setItemsPerPage(8); // SUPPRESS CHECKSTYLE: MagicNumberCheck
}
@@ -66,7 +70,7 @@ public class ListCommand extends PaginatedCoreCommand<String> {
}
for (String name : this.plugin.getMVWorldManager().getUnloadedWorlds()) {
if (p == null || this.plugin.getMVPerms().hasPermission(p, "multiverse.access." + name, true)) {
worldList.add(ChatColor.GRAY + name + " - UNLOADED");
worldList.add(ChatColor.GRAY + name + " - " + "UNLOADED");
}
}
return worldList;
@@ -91,7 +95,7 @@ public class ListCommand extends PaginatedCoreCommand<String> {
@Override
public void runCommand(CommandSender sender, List<String> args) {
sender.sendMessage(ChatColor.LIGHT_PURPLE + "====[ Multiverse World List ]====");
sender.sendMessage(ChatColor.LIGHT_PURPLE + "====[ " + this.provider.getMessage(MultiverseMessage.CMD_LIST_TITLE) + " ]====");
Player p = null;
if (sender instanceof Player) {
p = (Player) sender;
@@ -104,8 +108,7 @@ public class ListCommand extends PaginatedCoreCommand<String> {
if (filterObject.getFilter().length() > 0) {
availableWorlds = this.getFilteredItems(availableWorlds, filterObject.getFilter());
if (availableWorlds.size() == 0) {
sender.sendMessage(ChatColor.RED + "Sorry... " + ChatColor.WHITE
+ "No worlds matched your filter: " + ChatColor.AQUA + filterObject.getFilter());
sender.sendMessage(ChatColor.RED + "Sorry... " + ChatColor.WHITE + provider.getMessage(MultiverseMessage.CMD_LIST_NO_MATCH) + " " + ChatColor.AQUA + filterObject.getFilter());
return;
}
}
@@ -0,0 +1,24 @@
package com.onarandombox.MultiverseCore.configuration;
import java.util.Locale;
import me.main__.util.SerializationConfig.IllegalPropertyValueException;
import me.main__.util.SerializationConfig.Serializor;
public class LocaleSerializor implements Serializor<Locale, String> {
/**
* {@inheritDoc}
*/
@Override
public Locale deserialize(String arg0, Class<Locale> arg1) throws IllegalPropertyValueException {
return new Locale(arg0);
}
/**
* {@inheritDoc}
*/
@Override
public String serialize(Locale arg0) {
return arg0.getLanguage();
}
}
@@ -12,6 +12,7 @@ import com.onarandombox.MultiverseCore.MultiverseCore;
import com.onarandombox.MultiverseCore.api.MVWorldManager;
import com.onarandombox.MultiverseCore.api.MultiverseWorld;
import com.onarandombox.MultiverseCore.event.MVRespawnEvent;
import com.onarandombox.MultiverseCore.localization.MultiverseMessage;
import com.onarandombox.MultiverseCore.utils.PermissionTools;
import org.bukkit.Location;
import org.bukkit.Material;
@@ -120,7 +121,7 @@ public class MVPlayerListener implements Listener {
this.plugin.log(Level.FINER, "Player joined AGAIN!");
if (this.plugin.getMVConfig().getEnforceAccess() // check this only if we're enforcing access!
&& !this.plugin.getMVPerms().hasPermission(p, "multiverse.access." + p.getWorld().getName(), false)) {
p.sendMessage("[MV] - Sorry you can't be in this world anymore!");
this.plugin.getMessaging().sendMessage(p, MultiverseMessage.LISTENER_PLAYER_LOSTACCESSPERM);
this.sendPlayerToDefaultWorld(p);
}
}
@@ -0,0 +1,38 @@
package com.onarandombox.MultiverseCore.localization;
import java.util.Locale;
import java.util.Set;
/**
* Multiverse 2 LazyMessageProvider
* <p>
* This interface describes a Multiverse-MessageProvider that only loads locales when they're needed.
*/
public interface LazyLocaleMessageProvider extends MessageProvider {
/**
* Loads a localization for a specified {@link Locale}.
* <p>
* If that localization is already loaded, this method will reload it.
*
* @param locale The desired {@link Locale}.
* @throws LocalizationLoadingException When an error occurs while trying to load the specified localization.
*/
void loadLocale(Locale locale) throws LocalizationLoadingException;
/**
* Retrieves all loaded localizations.
*
* @return A {@link Set} of {@link Locale}s whose localizations are currently loaded.
*/
Set<Locale> getLoadedLocales();
/**
* Detects if a localization is loaded for the specified {@link Locale}.
*
* @param locale The {@link Locale}.
* @return Whether a localization is loaded for the specified {@link Locale}.
*/
boolean isLocaleLoaded(Locale locale);
}
@@ -0,0 +1,42 @@
package com.onarandombox.MultiverseCore.localization;
import java.io.IOException;
import java.util.Locale;
/**
* Thrown when an error occurs while a localization is loaded.
*/
public class LocalizationLoadingException extends IOException {
private final Locale locale;
public LocalizationLoadingException(Locale locale) {
this.locale = locale;
}
public LocalizationLoadingException(String message, Locale locale) {
super(message);
this.locale = locale;
}
public LocalizationLoadingException(Throwable cause, Locale locale) {
super(cause);
this.locale = locale;
}
public LocalizationLoadingException(String message, Throwable cause, Locale locale) {
super(message, cause);
this.locale = locale;
}
/**
* @return The locale we were trying to load.
*/
public Locale getLocale() {
return locale;
}
@Override
public String getMessage() {
return super.getMessage() + " (While trying to load localization for locale " + getLocale() + ")";
}
}
@@ -0,0 +1,46 @@
package com.onarandombox.MultiverseCore.localization;
import java.util.Locale;
/**
* Multiverse 2 MessageProvider
* <p>
* This interface describes a Multiverse-MessageProvider.
*/
public interface MessageProvider {
/**
* The default locale.
*/
Locale DEFAULT_LOCALE = Locale.ENGLISH;
/**
* Returns a message (as {@link String}) for the specified key (as {@link MultiverseMessage}).
*
* @param key The key
* @param args Args for String.format()
* @return The message
*/
String getMessage(MultiverseMessage key, Object... args);
/**
* Returns a message (as {@link String}) in a specified {@link Locale} for the specified key (as {@link MultiverseMessage}).
*
* @param key The Key
* @param locale The {@link Locale}
* @param args Args for String.format()
* @return The message
*/
String getMessage(MultiverseMessage key, Locale locale, Object... args);
/**
* @return the Locale this MessageProvider is currently using.
*/
Locale getLocale();
/**
* Sets the locale for this MessageProvider.
*
* @param locale The new {@link Locale}.
*/
void setLocale(Locale locale);
}
@@ -0,0 +1,20 @@
package com.onarandombox.MultiverseCore.localization;
/**
* Multiverse 2 MessageProviding
* <p>
* This interface is implemented by classes that use a {@link MessageProvider}.
*/
public interface MessageProviding {
/**
* @return The {@link MessageProvider} used by the Core.
*/
MessageProvider getMessageProvider();
/**
* Sets the {@link MessageProvider} used by the core.
*
* @param provider The new {@link MessageProvider}. Must not be null!
*/
void setMessageProvider(MessageProvider provider);
}
@@ -0,0 +1,90 @@
package com.onarandombox.MultiverseCore.localization;
/**
* An enum containing all messages/strings used by Multiverse.
*/
public enum MultiverseMessage {
// BEGIN CHECKSTYLE-SUPPRESSION: JavadocVariable
TEST_STRING("a test-string from the enum"),
//// Command handling error messages
CH_PLUGIN_DISABLED("This plugin is disabled!"),
CH_INTERNAL_ERROR("&cAn internal error occurred when attempting to perform this command."),
CH_ADMIN_DEBUG("&cDetails were printed to the server console and logs, please add that to your bug report."),
CH_USER_DEBUG("&cTry again and contact the server owner or an admin if this problem persists."),
//// Not MV world message
GENERIC_NOT_MV_WORLD("Multiverse doesn't know about &3%s&f yet.\nType &3/mv import ?&f for help!"),
//// Commands
// Anchor Command
CMD_ANCHOR_NOLISTPERM("&cYou don't have the permission to list anchors!"),
CMD_ANCHOR_LISTHEADER("&d====[ Multiverse Anchor List ]===="),
CMD_ANCHOR_NOMATCH("&cSorry... &fNo anchors matched your filter: &b%s"),
CMD_ANCHOR_NODEF("&cSorry... &fNo anchors were defined."),
CMD_ANCHOR_PAGEHEADER("&b Page %d of %d"),
CMD_ANCHOR_NODELPERM("&cYou don't have the permission to delete anchors!"),
CMD_ANCHOR_NOCREATEPERM("&cYou don't have the permission to create anchors!"),
CMD_ANCHOR_DELSUCCESS("Anchor '%s' was successfully &cdeleted!"),
CMD_ANCHOR_DELFAIL("Anchor '%s' was &cNOT&f deleted!"),
CMD_ANCHOR_CREATESUCCESS("Anchor '%s' was &asuccessfully&f created!"),
CMD_ANCHOR_CREATEFAIL("Anchor '%s' was &cNOT&f created!"),
CMD_ANCHOR_CONSOLECREATE("You must be a player to create Anchors!"),
// Check Command
CMD_CHECK_NOSUCHPLAYER("Could not find player &d%s&f\nAre they online?"),
CMD_CHECK_NOSUCHDEST("You asked if '%s' could go to '&d%s&f', but I couldn't find a Destination of that name? Did you type it correctly?"),
// Clone Command
CMD_CLONE_NOSUCHWORLD("Sorry, Multiverse doesn't know about world '%s', so we can't clone it!\nCheck the &a/mv list&f command to verify it is listed."),
CMD_CLONE_SUCCESS("&aWorld Cloned!"),
CMD_CLONE_FAIL("&cWorld could NOT be cloned!"),
// Config Command
CMD_CONFIG_SETFAIL("&cSetting '%s' to '%s' failed!"),
CMD_CONFIG_SUCCESS("&aSUCCESS!&f Values were updated successfully!"),
CMD_CONFIG_FAIL("&cFAIL!&f Check your console for details!"),
// Create Command
CMD_CREATE_WORLDEXISTS("&cMultiverse cannot create &n&6another&r&c world named '%s'."),
CMD_CREATE_FILEEXISTS("&cA Folder/World already exists with this name!\n&cIf you are confident it is a world you can import it with &a/mv import"),
CMD_CREATE_INVALIDENV("&cThat is not a valid environment."),
CMD_CREATE_INVALIDTYPE("&cThat is not a valid World Type."),
CMD_CREATE_INVALIDGEN("Invalid generator '%s'! &cAborting world creation."),
CMD_CREATE_START("Starting creation of world '%s'..."),
CMD_CREATE_COMPLETE("Complete!"),
CMD_CREATE_FAILED("FAILED."),
// Generator Command
CMD_GENERATOR_LISTHEADER("&b--- Loaded Generator Plugins ---"),
CMD_GENERATOR_NOGENSFOUND("&cNo Generator Plugins found."),
// List Command
CMD_LIST_NAME("World Listing"),
CMD_LIST_DESC("Displays a listing of all worlds that you can enter."),
CMD_LIST_TITLE("Multiverse World List"),
CMD_LIST_NO_MATCH("No worlds matched your filter:"),
//// Listeners
// PlayerListener
LISTENER_PLAYER_LOSTACCESSPERM("[MV] - Sorry you can't be in this world anymore!"),
//// Permissions
PERMS_NOACCESS_SELF("You don't have access to go here..."),
PERMS_NOACCESS_OTHER("You can't send %s here..."),
PERMS_NOACCESS_BLACKLIST_SELF("You don't have access to go to %s from %s"),
PERMS_NOACCESS_BLACKLIST_OTHER("You don't have access to send %s from %s to %s"),
//// World purger
PURGER_ENTITIESKILLED("%d entities purged from the world '%s'"),
// END CHECKSTYLE-SUPPRESSION: JavadocVariable
; // SUPPRESS CHECKSTYLE: Whitespace
private final String def;
MultiverseMessage(String def) {
this.def = def;
}
/**
* @return This {@link MultiverseMessage}'s default-message
*/
public String getDefault() {
return def;
}
}
@@ -0,0 +1,25 @@
package com.onarandombox.MultiverseCore.localization;
import java.util.Locale;
/**
* Thrown when the requested localization is not found.
*/
public class NoSuchLocalizationException extends LocalizationLoadingException {
public NoSuchLocalizationException(Locale locale) {
super(locale);
}
public NoSuchLocalizationException(String message, Locale locale) {
super(message, locale);
}
public NoSuchLocalizationException(String message, Throwable cause, Locale locale) {
super(message, cause, locale);
}
public NoSuchLocalizationException(Throwable cause, Locale locale) {
super(cause, locale);
}
}
@@ -0,0 +1,212 @@
package com.onarandombox.MultiverseCore.localization;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Collections;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import org.bukkit.ChatColor;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import com.onarandombox.MultiverseCore.MultiverseCore;
/**
* The normal {@link MessageProvider}-implementation.
*/
public class SimpleMessageProvider implements LazyLocaleMessageProvider {
private static final String LOCALIZATION_FOLDER_NAME = "localization";
// Regex 1: replace all single & with the section char
private static final String FORMAT_PATTERN_1;
private static final String FORMAT_REPL_1;
static {
StringBuilder formatBuilder = new StringBuilder("([^&])&([");
for (ChatColor c : ChatColor.values())
formatBuilder.append(c.getChar());
FORMAT_PATTERN_1 = formatBuilder.append("])").toString();
FORMAT_REPL_1 = new StringBuilder().append("$1").append(ChatColor.COLOR_CHAR).append("$2").toString();
}
// Regex 2: replace all double & with single &
private static final String FORMAT_PATTERN_2 = "&&";
private static final String FORMAT_REPL_2 = "&";
private final Map<Locale, Map<MultiverseMessage, String>> messages;
private final MultiverseCore core;
private Locale locale = DEFAULT_LOCALE;
public SimpleMessageProvider(MultiverseCore core) {
this.core = core;
messages = new ConcurrentHashMap<Locale, Map<MultiverseMessage, String>>();
try {
loadLocale(locale);
} catch (NoSuchLocalizationException e) {
// let's take the defaults from the enum!
}
}
/**
* Loads a given {@link Locale} if and only if it wasn't already loaded.
* @param locale The locale
* @throws LocalizationLoadingException If the locale wasn't loaded successfully.
*/
public void maybeLoadLocale(Locale locale) throws LocalizationLoadingException {
if (!isLocaleLoaded(locale)) {
try {
loadLocale(locale);
} catch (NoSuchLocalizationException e) {
throw e;
}
}
if (!isLocaleLoaded(locale))
throw new LocalizationLoadingException("Couldn't load the localization: "
+ locale.toString(), locale);
}
/**
* Formats the specified string.
* <p>
* You can use {@code &} to get colors. To get an {@code &} in the output, you have to write {@code &&}.
*
* @param string The {@link String}.
* @param args Args for {@link String#format(String, Object...)}.
* @return The formatted string.
*/
public static String format(String string, Object... args) {
// Replaces & with the Section character
string = string.replaceAll(FORMAT_PATTERN_1, FORMAT_REPL_1).replaceAll(FORMAT_PATTERN_2, FORMAT_REPL_2);
return String.format(string, args);
}
/**
* {@inheritDoc}
*/
@Override
public void loadLocale(Locale l) throws NoSuchLocalizationException {
messages.remove(l);
InputStream resstream = null;
InputStream filestream = null;
try {
try {
filestream = new FileInputStream(new File(core.getDataFolder(), l.getLanguage() + ".yml"));
} catch (FileNotFoundException e) {
}
try {
resstream = core.getResource(new StringBuilder(LOCALIZATION_FOLDER_NAME)
.append("/").append(l.getLanguage()).append(".yml").toString());
} catch (Exception e) {
}
if ((resstream == null) && (filestream == null))
throw new NoSuchLocalizationException(l);
Map<MultiverseMessage, String> stringsMap = new HashMap<MultiverseMessage, String>();
FileConfiguration resconfig = (resstream == null) ? null : YamlConfiguration.loadConfiguration(resstream);
FileConfiguration fileconfig = (filestream == null) ? null : YamlConfiguration.loadConfiguration(filestream);
for (MultiverseMessage m : MultiverseMessage.values()) {
String value = m.getDefault();
if (resconfig != null)
value = resconfig.getString(m.toString(), value);
if (fileconfig != null)
value = fileconfig.getString(m.toString(), value);
stringsMap.put(m, value);
}
messages.put(l, Collections.unmodifiableMap(stringsMap));
} finally {
if (filestream != null)
try {
filestream.close();
} catch (IOException e) {
// silently discard
}
if (resstream != null)
try {
resstream.close();
} catch (IOException e) {
// silently discard
}
}
}
/**
* {@inheritDoc}
*/
@Override
public Set<Locale> getLoadedLocales() {
return messages.keySet();
}
/**
* {@inheritDoc}
*/
@Override
public boolean isLocaleLoaded(Locale l) {
return messages.containsKey(l);
}
/**
* {@inheritDoc}
*/
@Override
public String getMessage(MultiverseMessage key, Object... args) {
if (!isLocaleLoaded(locale))
return format(key.getDefault(), args);
else
return format(messages.get(locale).get(key), args);
}
/**
* {@inheritDoc}
*/
@Override
public String getMessage(MultiverseMessage key, Locale locale, Object... args) {
try {
maybeLoadLocale(locale);
} catch (LocalizationLoadingException e) {
e.printStackTrace();
return getMessage(key);
}
return format(messages.get(locale).get(key), args);
}
/**
* {@inheritDoc}
*/
@Override
public Locale getLocale() {
return locale;
}
/**
* {@inheritDoc}
*/
@Override
public void setLocale(Locale locale) {
if (locale == null)
throw new IllegalArgumentException("Can't set locale to null!");
try {
maybeLoadLocale(locale);
} catch (LocalizationLoadingException e) {
if (!locale.equals(DEFAULT_LOCALE))
throw new IllegalArgumentException("Error while trying to load localization for the given Locale!", e);
}
this.locale = locale;
}
}
@@ -0,0 +1,4 @@
/**
* Contains localization.
*/
package com.onarandombox.MultiverseCore.localization;
@@ -11,6 +11,8 @@ import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import com.onarandombox.MultiverseCore.api.MultiverseMessaging;
import com.onarandombox.MultiverseCore.localization.MessageProviding;
import com.onarandombox.MultiverseCore.localization.MultiverseMessage;
import java.util.Collection;
import java.util.HashMap;
@@ -20,10 +22,12 @@ import java.util.Map;
* The default-implementation of {@link MultiverseMessaging}.
*/
public class MVMessaging implements MultiverseMessaging {
private final MessageProviding msgProviding;
private Map<String, Long> sentList;
private int cooldown;
public MVMessaging() {
public MVMessaging(MessageProviding msgProviding) {
this.msgProviding = msgProviding;
this.sentList = new HashMap<String, Long>();
this.cooldown = 5000; // SUPPRESS CHECKSTYLE: MagicNumberCheck
}
@@ -50,7 +54,6 @@ public class MVMessaging implements MultiverseMessaging {
@Override
public boolean sendMessages(CommandSender sender, String[] messages, boolean ignoreCooldown) {
if (!(sender instanceof Player) || ignoreCooldown) {
sendMessages(sender, messages);
return true;
}
@@ -90,4 +93,20 @@ public class MVMessaging implements MultiverseMessaging {
public int getCooldown() {
return cooldown;
}
/**
* {@inheritDoc}
*/
@Override
public boolean sendMessage(CommandSender sender, MultiverseMessage message, Object... args) {
return this.sendMessage(sender, message, true, args); // TODO what is a good default value?
}
/**
* {@inheritDoc}
*/
@Override
public boolean sendMessage(CommandSender sender, MultiverseMessage message, boolean ignoreCooldown, Object...args) {
return this.sendMessage(sender, this.msgProviding.getMessageProvider().getMessage(message, args), ignoreCooldown);
}
}
@@ -10,6 +10,8 @@ package com.onarandombox.MultiverseCore.utils;
import com.fernferret.allpay.GenericBank;
import com.onarandombox.MultiverseCore.MultiverseCore;
import com.onarandombox.MultiverseCore.api.MultiverseWorld;
import com.onarandombox.MultiverseCore.localization.MultiverseMessage;
import org.bukkit.command.CommandSender;
import org.bukkit.command.ConsoleCommandSender;
import org.bukkit.entity.Player;
@@ -231,11 +233,10 @@ public class PermissionTools {
// Actual checks
if (toWorld != null) {
if (!this.plugin.getMVPerms().canEnterWorld(teleporterPlayer, toWorld)) {
if (teleportee.equals(teleporter)) {
teleporter.sendMessage("You don't have access to go here...");
} else {
teleporter.sendMessage("You can't send " + teleportee.getName() + " here...");
}
if (teleportee.equals(teleporter))
this.plugin.getMessaging().sendMessage(teleporter, MultiverseMessage.PERMS_NOACCESS_SELF);
else
this.plugin.getMessaging().sendMessage(teleporter, MultiverseMessage.PERMS_NOACCESS_OTHER, teleportee.getName());
return false;
}
@@ -246,12 +247,10 @@ public class PermissionTools {
}
if (fromWorld != null) {
if (fromWorld.getWorldBlacklist().contains(toWorld.getName())) {
if (teleportee.equals(teleporter)) {
teleporter.sendMessage("You don't have access to go to " + toWorld.getColoredWorldString() + " from " + fromWorld.getColoredWorldString());
} else {
teleporter.sendMessage("You don't have access to send " + teleportee.getName() + " from "
+ fromWorld.getColoredWorldString() + " to " + toWorld.getColoredWorldString());
}
if (teleportee.equals(teleporter))
this.plugin.getMessaging().sendMessage(teleporter, MultiverseMessage.PERMS_NOACCESS_BLACKLIST_SELF, toWorld.getColoredWorldString(), fromWorld.getColoredWorldString());
else
this.plugin.getMessaging().sendMessage(teleporter, MultiverseMessage.PERMS_NOACCESS_BLACKLIST_OTHER, teleportee.getName(), fromWorld.getColoredWorldString(), toWorld.getColoredWorldString());
return false;
}
}
@@ -10,6 +10,7 @@ package com.onarandombox.MultiverseCore.utils;
import com.onarandombox.MultiverseCore.MultiverseCore;
import com.onarandombox.MultiverseCore.api.MultiverseWorld;
import com.onarandombox.MultiverseCore.api.WorldPurger;
import com.onarandombox.MultiverseCore.localization.MultiverseMessage;
import org.bukkit.World;
import org.bukkit.command.CommandSender;
@@ -96,9 +97,8 @@ public class SimpleWorldPurger implements WorldPurger {
entitiesKilled++;
}
}
if (sender != null) {
sender.sendMessage(entitiesKilled + " entities purged from the world '" + world.getName() + "'");
}
if (sender != null)
this.plugin.getMessaging().sendMessage(sender, MultiverseMessage.PURGER_ENTITIESKILLED, entitiesKilled, world.getName());
}
private boolean killDecision(Entity e, List<String> thingsToKill, boolean negateAnimals,
+20
View File
@@ -0,0 +1,20 @@
TEST_STRING: 'a test-string from the resource'
# Generic Strings
GENERIC_SORRY: 'Sorry...'
GENERIC_PAGE: 'Page'
GENERIC_OF: 'of'
GENERIC_UNLOADED: 'UNLOADED'
GENERIC_PLUGIN_DISABLED: 'This plugin is Disabled!'
# Errors
ERROR_LOAD: 'Your configs were not loaded. Very little will function in Multiverse.'
## Commands
# List Command
LIST_NAME: 'World Listing'
LIST_DESC: 'Displays a listing of all worlds that you can enter.'
LIST_TITLE: 'Multiverse World List'
LIST_NO_MATCH: 'No worlds matched your filter:'
@@ -0,0 +1,204 @@
/******************************************************************************
* Multiverse 2 Copyright (c) the Multiverse Team 2011. *
* Multiverse 2 is licensed under the BSD License. *
* For more information please check the README.md file included *
* with this project. *
******************************************************************************/
package com.onarandombox.MultiverseCore.test;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.InputStream;
import java.util.Locale;
import org.bukkit.Server;
import org.bukkit.command.CommandSender;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.PluginDescriptionFile;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import com.onarandombox.MultiverseCore.MultiverseCore;
import com.onarandombox.MultiverseCore.localization.LazyLocaleMessageProvider;
import com.onarandombox.MultiverseCore.localization.MultiverseMessage;
import com.onarandombox.MultiverseCore.localization.SimpleMessageProvider;
import com.onarandombox.MultiverseCore.test.utils.TestInstanceCreator;
@RunWith(PowerMockRunner.class)
@PrepareForTest({ MultiverseCore.class, PluginDescriptionFile.class })
public class TestLocalization {
TestInstanceCreator creator;
Server mockServer;
CommandSender mockCommandSender;
@Before
public void setUp() throws Exception {
creator = new TestInstanceCreator();
assertTrue(creator.setUp());
mockServer = creator.getServer();
mockCommandSender = creator.getCommandSender();
}
@After
public void tearDown() throws Exception {
creator.tearDown();
}
@Test
public void testEnumDefaults() throws Exception {
// Pull a core instance from the server.
Plugin plugin = mockServer.getPluginManager().getPlugin("Multiverse-Core");
// Make sure Core is not null
assertNotNull(plugin);
// Make sure Core is enabled
assertTrue(plugin.isEnabled());
// Make sure Core is a MultiverseCore
assertTrue(plugin instanceof MultiverseCore);
MultiverseCore core = (MultiverseCore) plugin;
// This should be the same core as creator.getCore()
assertEquals(core, creator.getCore());
// Make sure there is neither the file nor the resource
assertNull(core.getResource("localization/en.yml"));
assertFalse(new File(TestInstanceCreator.pluginDirectory, "en.yml").exists());
// And now test it
String actual = core.getMessageProvider().getMessage(MultiverseMessage.TEST_STRING);
String expected = "a test-string from the enum";
assertEquals(expected, actual);
}
@Test
public void testResourceDefaults() throws Exception {
// Pull a core instance from the server.
Plugin plugin = mockServer.getPluginManager().getPlugin("Multiverse-Core");
// Make sure Core is not null
assertNotNull(plugin);
// Make sure Core is enabled
assertTrue(plugin.isEnabled());
// Make sure Core is a MultiverseCore
assertTrue(plugin instanceof MultiverseCore);
MultiverseCore core = (MultiverseCore) plugin;
// This should be the same core as creator.getCore()
assertEquals(core, creator.getCore());
// Make sure there is no file, only the resource
assertFalse(new File(TestInstanceCreator.pluginDirectory, "en.yml").exists());
assertTrue(new File("src/main/resources/localization/en.yml").exists());
doAnswer(new Answer<InputStream>() {
@Override
public InputStream answer(InvocationOnMock invocation) throws Throwable {
try {
return new FileInputStream("src/main/resources/" + (String) invocation.getArguments()[0]);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}).when(core).getResource(anyString());
assertNotNull(core.getResource("localization/en.yml"));
// this only works for a LazyLocaleMessageProvider
assertTrue(core.getMessageProvider() instanceof LazyLocaleMessageProvider);
LazyLocaleMessageProvider messageProvider = (LazyLocaleMessageProvider) core.getMessageProvider();
// We have to reload it
messageProvider.loadLocale(Locale.ENGLISH);
// And now test it
String actual = core.getMessageProvider().getMessage(MultiverseMessage.TEST_STRING);
String expected = "a test-string from the resource";
assertEquals(expected, actual);
}
@Test
public void testUserFile() throws Exception {
// Pull a core instance from the server.
Plugin plugin = mockServer.getPluginManager().getPlugin("Multiverse-Core");
// Make sure Core is not null
assertNotNull(plugin);
// Make sure Core is enabled
assertTrue(plugin.isEnabled());
// Make sure Core is a MultiverseCore
assertTrue(plugin instanceof MultiverseCore);
MultiverseCore core = (MultiverseCore) plugin;
// This should be the same core as creator.getCore()
assertEquals(core, creator.getCore());
// Create the file
File file = new File(TestInstanceCreator.pluginDirectory, "en.yml");
BufferedWriter bwriter = new BufferedWriter(new FileWriter(file));
String expected = "a test-string from the user-file";
bwriter.write("TEST_STRING: " + expected);
bwriter.close();
// Make sure there is the file and the resource
assertTrue(file.exists());
assertTrue(new File("src/main/resources/localization/en.yml").exists());
doAnswer(new Answer<InputStream>() {
@Override
public InputStream answer(InvocationOnMock invocation) throws Throwable {
try {
return new FileInputStream("src/main/resources/" + (String) invocation.getArguments()[0]);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}).when(core).getResource(anyString());
assertNotNull(core.getResource("localization/en.yml"));
// this only works for a LazyLocaleMessageProvider
assertTrue(core.getMessageProvider() instanceof LazyLocaleMessageProvider);
LazyLocaleMessageProvider messageProvider = (LazyLocaleMessageProvider) core.getMessageProvider();
// We have to reload it
messageProvider.loadLocale(Locale.ENGLISH);
// And now test it
String actual = core.getMessageProvider().getMessage(MultiverseMessage.TEST_STRING);
assertEquals(expected, actual);
// Clean up afterwards:
assertTrue(file.delete());
}
@Test
public void testFormat() {
String testString = "%sthisisasimpletest&moretesting&&thatsit.";
String result = SimpleMessageProvider.format(testString, "arg");
assertEquals("argthisisasimpletest\u00A7moretesting&thatsit.", result);
}
}
@@ -168,6 +168,7 @@ public class TestWorldProperties {
// call player chat event
core.getMVConfig().setPrefixChat(true);
com.onarandombox.MultiverseCore.listeners.MVChatListener mvcl = core.getChatListener();
((MVAsyncPlayerChatListener) core.getChatListener()).playerChat(playerChatEvent);
verify(playerChatEvent).setFormat("[" + mvWorld.getColoredWorldString() + "]" + "format");
core.getMVConfig().setPrefixChat(false);
@@ -194,7 +194,7 @@ public class TestWorldStuff {
assertEquals(0, creator.getCore().getMVWorldManager().getMVWorlds().size());
// Verify
verify(mockCommandSender).sendMessage("Invalid generator! 'BogusGen'. " + ChatColor.RED + "Aborting world creation.");
verify(mockCommandSender).sendMessage("Invalid generator 'BogusGen'! " + ChatColor.RED + "Aborting world creation.");
}
@Test
@@ -21,6 +21,7 @@ import java.util.logging.LogRecord;
public class MVTestLogFormatter extends Formatter {
private static final DateFormat df = new SimpleDateFormat("HH:mm:ss");
@Override
public String format(LogRecord record) {
StringBuilder ret = new StringBuilder();
@@ -36,6 +36,8 @@ import org.powermock.core.MockGateway;
import java.io.File;
import java.lang.reflect.Field;
import com.onarandombox.MultiverseCore.localization.MessageProvider;
import com.onarandombox.MultiverseCore.localization.SimpleMessageProvider;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
@@ -77,6 +79,7 @@ public class TestInstanceCreator {
when(pdf.getAuthors()).thenReturn(new ArrayList<String>());
doReturn(pdf).when(core).getDescription();
doReturn(true).when(core).isEnabled();
doReturn(null).when(core).getResource(anyString());
core.setServerFolder(serverDirectory);
// Add Core to the list of loaded plugins
@@ -200,6 +203,10 @@ public class TestInstanceCreator {
worldmanagerfield.setAccessible(true);
worldmanagerfield.set(core, wm);
// Set messageProvider
MessageProvider messageProvider = PowerMockito.spy(new SimpleMessageProvider(core));
core.setMessageProvider(messageProvider);
// Set playerListener
MVPlayerListener pl = PowerMockito.spy(new MVPlayerListener(core));
Field playerlistenerfield = MultiverseCore.class.getDeclaredField("playerListener");
@@ -28,6 +28,7 @@ public class WorldCreatorMatcher extends ArgumentMatcher<WorldCreator> {
this.careAboutGenerators = doICare;
}
@Override
public boolean matches(Object creator) {
Util.log("Checking world creators.");
if (creator == null) {