package tc.oc.commons.bukkit.punishment;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
import com.google.common.collect.ImmutableList;
import net.md_5.bungee.api.ChatColor;
import net.md_5.bungee.api.chat.BaseComponent;
import net.md_5.bungee.api.chat.TranslatableComponent;
import org.bukkit.command.CommandSender;
import tc.oc.api.docs.Punishment;
import tc.oc.api.servers.ServerStore;
import tc.oc.commons.bukkit.chat.ComponentRenderContext;
import tc.oc.commons.bukkit.chat.Links;
import tc.oc.commons.bukkit.chat.PlayerComponent;
import tc.oc.commons.bukkit.format.ServerFormatter;
import tc.oc.commons.bukkit.nick.IdentityProvider;
import tc.oc.commons.core.chat.Component;
import tc.oc.commons.core.chat.Components;
import tc.oc.commons.core.formatting.PeriodFormats;
import tc.oc.commons.core.util.Pair;
public class PunishmentFormatter {
private final static Component ARROW = new Component(" \u00BB ", ChatColor.GOLD);
private final static Component MAGIC = new Component(" \u26a0 ", ChatColor.YELLOW);
private final IdentityProvider identityProvider;
private final ComponentRenderContext renderContext;
private final ServerStore servers;
@Inject PunishmentFormatter(IdentityProvider identityProvider, ComponentRenderContext renderContext, ServerStore servers) {
this.identityProvider = identityProvider;
this.renderContext = renderContext;
this.servers = servers;
}
public List<? extends BaseComponent> format(Punishment punishment, boolean alert, boolean server) {
List<BaseComponent> parts = new ArrayList<>();
if(alert) {
parts.add(new Component("[").extra(new TranslatableComponent("punishment.prefix"), ChatColor.GOLD).extra("]"));
if(server) {
servers.tryId(punishment.server_id()).ifPresent(
s -> parts.add(ServerFormatter.light.nameWithDatacenter(s))
);
}
} else {
parts.add(new Component(PeriodFormats.relativePastApproximate(punishment.date())).extra(":"));
}
parts.add(new PlayerComponent(identityProvider.currentOrConsoleIdentity(punishment.punisher())));
parts.add(new Component(new TranslatableComponent("punishment.action." + punishment.type())));
parts.add(new Component(new PlayerComponent(identityProvider.currentOrConsoleIdentity(punishment.punished()))));
if(punishment.expire() != null) {
parts.add(PeriodFormats.relativeFutureApproximate(punishment.date(), punishment.expire()));
}
parts.get(parts.size() - 1).addExtra(":");
return ImmutableList.of(
Components.join(Components.space(), parts),
new Component(" > ").extra(new Component(punishment.reason(), ChatColor.YELLOW))
);
}
public Pair<BaseComponent, BaseComponent> warning(Punishment punishment) {
return Pair.create(
new Component(MAGIC, new Component(new TranslatableComponent("punishment.warning"), ChatColor.RED), MAGIC),
new Component(punishment.reason(), ChatColor.AQUA)
);
}
public String screen(Punishment punishment, CommandSender sender) {
return renderContext.renderLegacy(screen(punishment), sender);
}
public BaseComponent screen(Punishment punishment) {
List<BaseComponent> parts = new ArrayList<>();
parts.add(
new Component(
new TranslatableComponent(
"punishment.screen." + punishment.type(),
punishment.expire() != null ? PeriodFormats.relativeFutureApproximate(punishment.date(), punishment.expire())
: Components.blank()
)
)
);
parts.add(Components.blank());
parts.add(new Component(punishment.reason(), ChatColor.YELLOW));
parts.addAll(Components.repeat(Components::blank, 3));
parts.add(new Component(new TranslatableComponent("punishment.screen.rules", Links.rulesLink())));
parts.add(new Component(new TranslatableComponent("punishment.screen.appeal", Links.appealLink())));
return Components.join(Components.newline(), parts);
}
}