/**
* PermissionsEx
* Copyright (C) zml and PermissionsEx contributors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package ninja.leaping.permissionsex.bukkit;
import net.md_5.bungee.api.ChatColor;
import net.md_5.bungee.api.chat.BaseComponent;
import net.md_5.bungee.api.chat.ClickEvent;
import net.md_5.bungee.api.chat.HoverEvent;
import net.md_5.bungee.api.chat.TextComponent;
import net.md_5.bungee.api.chat.TranslatableComponent;
import ninja.leaping.permissionsex.PermissionsEx;
import ninja.leaping.permissionsex.rank.RankLadder;
import ninja.leaping.permissionsex.util.Translatable;
import ninja.leaping.permissionsex.util.command.ButtonType;
import ninja.leaping.permissionsex.util.command.MessageFormatter;
import org.apache.commons.lang.LocaleUtils;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import javax.annotation.Nullable;
import java.util.Locale;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import static ninja.leaping.permissionsex.bukkit.BukkitTranslations.t;
/**
* Factory to create formatted elements of messages
*/
public class BukkitMessageFormatter implements MessageFormatter<BaseComponent> {
private static final BaseComponent EQUALS_SIGN = new TextComponent("=");
static {
EQUALS_SIGN.setColor(ChatColor.GRAY);
}
private final PermissionsExPlugin pex;
private final CommandSender sender;
BukkitMessageFormatter(PermissionsExPlugin pex, CommandSender sender) {
this.pex = pex;
this.sender = sender;
}
@Override
public BaseComponent subject(Map.Entry<String, String> subject) {
String name;
try {
name = pex.getManager().getSubjects(subject.getKey()).persistentData().getData(subject.getValue(), null).get().getOptions(PermissionsEx.GLOBAL_CONTEXT).get("name");
} catch (ExecutionException | InterruptedException e) {
throw new RuntimeException(e);
}
BaseComponent nameText;
if (name != null) {
nameText = new TextComponent("");
final BaseComponent child = new TextComponent(subject.getValue());
child.setColor(ChatColor.GRAY);
nameText.addExtra(child);
nameText.addExtra("/");
nameText.addExtra(name);
} else {
nameText = new TextComponent(subject.getValue());
}
// <bold>{type}>/bold>:{identifier}/{name} (on click: /pex {type} {identifier}
BaseComponent ret = new TextComponent("");
BaseComponent typeComponent = new TextComponent(subject.getKey());
typeComponent.setBold(true);
ret.addExtra(typeComponent);
ret.addExtra(" ");
ret.addExtra(nameText);
ret.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new BaseComponent[]{tr(t("Click to view more info"))}));
ret.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/pex " + subject.getKey() + " " + subject.getValue() + " info"));
return ret;
}
@Override
public BaseComponent ladder(RankLadder ladder) {
BaseComponent ret = new TextComponent(ladder.getName());
ret.setBold(true);
ret.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new BaseComponent[]{tr(t("click here to view more info"))}));
ret.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/pex rank " + ladder.getName()));
return ret;
}
@Override
public BaseComponent booleanVal(boolean val) {
BaseComponent ret = (val ? tr(t("true")) : tr(t("false")));
ret.setColor(val ? ChatColor.GREEN : ChatColor.RED);
return ret;
}
@Override
public BaseComponent button(ButtonType type, Translatable label, @Nullable Translatable tooltip, String command, boolean execute) {
BaseComponent builder = tr(label);
ChatColor textColor;
switch (type) {
case POSITIVE:
textColor = ChatColor.GREEN;
break;
case NEGATIVE:
textColor = ChatColor.RED;
break;
case NEUTRAL:
textColor = ChatColor.AQUA;
break;
default:
throw new IllegalArgumentException("Provided with unknown ButtonType " + type);
}
builder.setColor(textColor);
if (tooltip != null) {
builder.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new BaseComponent[]{tr(tooltip)}));
}
builder.setClickEvent(new ClickEvent(execute ? ClickEvent.Action.RUN_COMMAND : ClickEvent.Action.SUGGEST_COMMAND, command));
return builder;
}
@Override
public BaseComponent permission(String permission, int value) {
ChatColor valueColor;
if (value > 0) {
valueColor = ChatColor.GREEN;
} else if (value < 0) {
valueColor = ChatColor.RED;
} else {
valueColor = ChatColor.GRAY;
}
BaseComponent ret = new TextComponent("");
BaseComponent perm = new TextComponent(permission);
perm.setColor(valueColor);
ret.addExtra(perm);
ret.addExtra(EQUALS_SIGN);
ret.addExtra(String.valueOf(value));
return ret;
}
@Override
public BaseComponent option(String permission, String value) {
BaseComponent ret = new TextComponent(permission);
ret.addExtra(EQUALS_SIGN);
ret.addExtra(value);
return ret;
}
@Override
public BaseComponent header(BaseComponent text) {
text.setBold(true);
return text;
}
@Override
public BaseComponent hl(BaseComponent text) {
text.setColor(ChatColor.AQUA);
return text;
}
@Override
public BaseComponent combined(Object... elements) {
if (elements.length == 0) {
return new TextComponent("");
} else {
BaseComponent base = componentFrom(elements[0]);
for (int i = 1; i < elements.length; ++i) {
base.addExtra(componentFrom(elements[i]));
}
return base;
}
}
private BaseComponent componentFrom(Object obj) {
if (obj instanceof Translatable) {
return tr(((Translatable) obj));
} else if (obj instanceof BaseComponent) {
return ((BaseComponent) obj);
} else {
return new TextComponent(String.valueOf(obj));
}
}
@Override
public BaseComponent tr(Translatable tr) {
Object[] oldArgs = tr.getArgs();
Object[] args = new Object[oldArgs.length];
for (int i = 0; i < oldArgs.length; ++i) {
args[i] = componentFrom(oldArgs[i]);
}
return new TranslatableComponent(tr.translate(sender instanceof Player ? LocaleUtils.toLocale(((Player) sender).spigot().getLocale()) : Locale.getDefault()), args);
}
}