/* * This file is part of NucleusFramework for Bukkit, licensed under the MIT License (MIT). * * Copyright (c) JCThePants (www.jcwhatever.com) * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ package com.jcwhatever.nucleus.internal.managed.messenger; import com.jcwhatever.nucleus.Nucleus; import com.jcwhatever.nucleus.NucleusPlugin; import com.jcwhatever.nucleus.internal.NucLang; import com.jcwhatever.nucleus.managed.language.Localizable; import com.jcwhatever.nucleus.managed.messaging.IChatPrefixed; import com.jcwhatever.nucleus.managed.messaging.IMessenger; import com.jcwhatever.nucleus.managed.messaging.IMessengerFactory; import com.jcwhatever.nucleus.managed.scheduler.Scheduler; import com.jcwhatever.nucleus.providers.storage.DataStorage; import com.jcwhatever.nucleus.storage.DataPath; import com.jcwhatever.nucleus.storage.IDataNode; import com.jcwhatever.nucleus.utils.PreCon; import com.jcwhatever.nucleus.utils.text.TextUtils; import org.bukkit.entity.Player; import org.bukkit.plugin.Plugin; import javax.annotation.Nullable; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.WeakHashMap; import java.util.logging.Logger; /** * Internal messenger factory */ public final class InternalMessengerFactory implements IMessengerFactory { @Localizable static final String _MESSAGES_HEADER = "{GOLD} ---- Messages -------------------"; @Localizable static final String _MESSAGES_FOOTER = "{GOLD} ---------------------------------"; public static final Logger LOGGER = Logger.getLogger("Minecraft"); private Map<Plugin, IDataNode> _importantNodeCache = new WeakHashMap<>(25); private Map<Plugin, IMessenger> _messengers = new WeakHashMap<>(25); private Map<Plugin, IMessenger> _anonMessengers = new WeakHashMap<>(25); @Override public IMessenger get(Plugin plugin) { PreCon.notNull(plugin); if (plugin instanceof NucleusPlugin) { NucleusPlugin gp = (NucleusPlugin)plugin; if (gp.getMessenger() != null) { return gp.getMessenger(); } } IMessenger messenger = _messengers.get(plugin); if (messenger == null) { messenger = new Messenger(this, plugin, plugin); _messengers.put(plugin, messenger); } return messenger; } @Override public IMessenger getAnon(Plugin plugin) { if (plugin instanceof NucleusPlugin) { NucleusPlugin gp = (NucleusPlugin)plugin; if (gp.getAnonMessenger() != null) { return gp.getAnonMessenger(); } } IMessenger messenger = _anonMessengers.get(plugin); if (messenger == null) { messenger = new AnonMessenger(this, plugin); _anonMessengers.put(plugin, messenger); } return messenger; } @Override public IMessenger create(Plugin plugin) { return create(plugin, plugin); } @Override public IMessenger create(Plugin plugin, @Nullable Object prefixObject) { return new Messenger(this, plugin, prefixObject); } @Override public void tellImportant(final Player player, boolean clearMessages) { PreCon.notNull(player); List<IDataNode> dataNodes = new ArrayList<>(_importantNodeCache.values()); final List<String> messages = new ArrayList<>(10); for (IDataNode data : dataNodes) { IDataNode playerData = data.getNode(player.getUniqueId().toString()); boolean save = false; for (IDataNode contextData : playerData) { String prefix = contextData.getString("prefix", ""); String message = contextData.getString("message", ""); int lineLen = contextData.getInteger("lineLen", 60); assert prefix != null; assert message != null; if (!message.isEmpty()) { String[] lines = TextUtils.PATTERN_NEW_LINE.split(message); for (String line : lines) { messages.addAll(TextUtils.paginateString(line, prefix, lineLen, true)); } } if (clearMessages) { contextData.remove(); save = true; } } if (save) data.save(); } if (!messages.isEmpty()) { Scheduler.runTaskLater(Nucleus.getPlugin(), new Runnable() { @Override public void run() { player.sendRawMessage(NucLang.get(_MESSAGES_HEADER).toString()); for (String msg : messages) { player.sendRawMessage(msg); } player.sendRawMessage(NucLang.get(_MESSAGES_FOOTER).toString()); } }); } } /** * Get a chat prefix from the supplied object. */ public static String getChatPrefix(@Nullable Object source) { if (source instanceof IChatPrefixed && ((IChatPrefixed) source).getChatPrefix() != null) { return ((IChatPrefixed) source).getChatPrefix(); } else if (source instanceof Plugin) { return '[' + ((Plugin)source).getName() + ']'; } else if (source instanceof String) { return ((String)source); } else { return source != null ? source.toString() : ""; } } /** * Get a console prefix from the supplied object. */ public static String getConsolePrefix(@Nullable Object source) { return source instanceof IChatPrefixed && ((IChatPrefixed) source).getConsolePrefix() != null ? ((IChatPrefixed) source).getConsolePrefix() : getChatPrefix(source); } /** * Convert an object into a string. */ public static String getString(Object object) { return object.toString(); } /** * Get the data node where important messages are stored * for the specified plugin. */ public IDataNode getImportantData(Plugin plugin) { IDataNode dataNode = _importantNodeCache.get(plugin); if (dataNode != null) return dataNode; dataNode = DataStorage.get(plugin, new DataPath("nucleus.important-messages")); dataNode.load(); _importantNodeCache.put(plugin, dataNode); return dataNode; } }