/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
package pluginbase.bukkit.messaging;
import ninja.leaping.configurate.loader.ConfigurationLoader;
import pluginbase.messages.BundledMessage;
import pluginbase.messages.LocalizablePlugin;
import pluginbase.messages.Message;
import pluginbase.messages.MessageProvider;
import pluginbase.messages.Messages;
import pluginbase.messages.messaging.MessageReceiver;
import pluginbase.messages.messaging.Messager;
import org.bukkit.command.CommandSender;
import org.bukkit.command.ConsoleCommandSender;
import org.bukkit.util.ChatPaginator;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.io.File;
import java.util.List;
import java.util.Locale;
/**
* A Bukkit specific implementation of {@link pluginbase.messages.messaging.Messager}.
* <p/>
* Provides word wrapping on messages too long to fit on one line.
* <p/>
* Please refer to {@link pluginbase.messages.messaging.Messager} for javadoc for the methods in this class. This class merely adds
* convenience methods for Bukkit CommandSenders.
*/
public class BukkitMessager extends Messager {
/**
* Creates a new messager backed by the given message provider.
*
* @param provider the backing message provider.
*/
protected BukkitMessager(@NotNull final MessageProvider provider) {
super(provider);
}
/**
* Loads the given language file into a new BukkitMessager set to use the given locale.
* <p/>
* Any messages registered with {@link Messages#registerMessages(pluginbase.messages.LocalizablePlugin, Class)} for the same Localizable object
* should be present in this file. If they are not previously present, they will be inserted with the default
* message. If any message is located in the file that is not registered as previously mentioned it will be
* removed from the file.
*
* @param localizablePlugin the object that registered localizable messages.
* @param loader the configuration loader to load localized messages with.
* @param locale the locale to use when formatting the messages.
* @return a new messager loaded with the messages from the given language file and locale.
*/
public static BukkitMessager loadMessagerWithMessages(@NotNull final LocalizablePlugin localizablePlugin,
@NotNull final ConfigurationLoader loader,
@NotNull final Locale locale) {
return new BukkitMessager(Messages.loadMessages(localizablePlugin, loader, locale));
}
/** {@inheritDoc} */
@Override
public void message(@NotNull final MessageReceiver sender, @NotNull final String message) {
sendMessages(sender, ChatPaginator.wordWrap(message, ChatPaginator.GUARANTEED_NO_WRAP_CHAT_PAGE_WIDTH));
}
protected void send(@NotNull final CommandSender sender,
@Nullable final String prefix,
@NotNull final Message message,
@NotNull final Object... args) {
String string = getLocalizedMessage(message, args);
if (prefix != null && !prefix.isEmpty()) {
string = prefix + " " + string;
}
message(sender, string);
}
public void message(@NotNull final CommandSender sender, @NotNull final String message) {
sendMessages(sender, ChatPaginator.wordWrap(message, ChatPaginator.GUARANTEED_NO_WRAP_CHAT_PAGE_WIDTH));
}
public void message(@NotNull final CommandSender sender, @NotNull final Message message, @NotNull final Object... args) {
send(sender, "", message, args);
}
public void message(@NotNull final CommandSender sender, @NotNull final BundledMessage message) {
message(sender, message.getMessage(), message.getArgs());
}
public void message(@NotNull final CommandSender player, @NotNull final List<String> messages) {
for (String s : messages) {
player.sendMessage(s);
}
}
public void messageSuccess(@NotNull final CommandSender sender, @NotNull final Message message, @NotNull final Object... args) {
send(sender, getLocalizedMessage(Messages.SUCCESS), message, args);
}
public void messageSuccess(@NotNull final CommandSender sender, @NotNull final BundledMessage message) {
send(sender, getLocalizedMessage(Messages.SUCCESS), message.getMessage(), message.getArgs());
}
public void messageSuccess(@NotNull final CommandSender sender, @NotNull final String message) {
message(sender, getLocalizedMessage(Messages.SUCCESS) + " " + message);
}
public void messageError(@NotNull final CommandSender sender, @NotNull final Message message, @NotNull final Object... args) {
send(sender, getLocalizedMessage(Messages.ERROR), message, args);
}
public void messageError(@NotNull final CommandSender sender, @NotNull final BundledMessage message) {
send(sender, getLocalizedMessage(Messages.ERROR), message.getMessage(), message.getArgs());
}
public void messageError(@NotNull final CommandSender sender, @NotNull final String message) {
message(sender, getLocalizedMessage(Messages.ERROR) + " " + message);
}
protected void sendMessages(@NotNull final CommandSender player, @NotNull final String[] messages) {
player.sendMessage(messages);
}
public void messageAndLog(@NotNull final CommandSender sender, @NotNull final Message message, @NotNull final Object... args) {
if (!(sender instanceof ConsoleCommandSender)) {
message(sender, message, args);
}
getLog().info(getLocalizedMessage(message, args));
}
}