ProjectAres/Commons/bukkit/src/main/java/tc/oc/commons/bukkit/chat/LinkComponent.java

94 lines
3.0 KiB
Java

package tc.oc.commons.bukkit.chat;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Optional;
import net.md_5.bungee.api.ChatColor;
import net.md_5.bungee.api.chat.BaseComponent;
import net.md_5.bungee.api.chat.ClickEvent;
import org.bukkit.command.CommandSender;
import tc.oc.commons.core.chat.Component;
import tc.oc.commons.core.chat.ImmutableComponent;
public class LinkComponent extends ImmutableComponent implements RenderableComponent {
private final Renderable<URI> uri;
private final Optional<BaseComponent> content;
private final boolean compact;
public LinkComponent(Renderable<URI> uri, Optional<BaseComponent> content) {
this.uri = uri;
this.content = content;
this.compact = true;
}
public LinkComponent(Renderable<URI> uri, boolean compact) {
this.uri = uri;
this.content = Optional.empty();
this.compact = compact;
}
public LinkComponent(Renderable<URI> uri) {
this(uri, true);
}
public LinkComponent(URI uri, Optional<BaseComponent> content) {
this(Renderable.of(uri), content);
}
public LinkComponent(URI uri, boolean compact) {
this(Renderable.of(uri), compact);
}
public LinkComponent(URI uri) {
this(uri, true);
}
public LinkComponent(String uri, Optional<BaseComponent> content) throws URISyntaxException {
this(new URI(uri), content);
}
public LinkComponent(String uri, boolean compact) throws URISyntaxException {
this(new URI(uri), compact);
}
public LinkComponent(String uri) throws URISyntaxException {
this(new URI(uri));
}
public LinkComponent(String scheme, String host, String path, Optional<BaseComponent> content) throws URISyntaxException {
this(new URI(scheme, host, path, null), content);
}
public LinkComponent(String scheme, String host, String path, boolean compact) throws URISyntaxException {
this(new URI(scheme, host, path, null), compact);
}
public LinkComponent(String scheme, String host, String path) throws URISyntaxException {
this(new URI(scheme, host, path, null));
}
@Override
public BaseComponent render(ComponentRenderContext context, CommandSender viewer) {
final URI uri = this.uri.render(context, viewer);
return new Component(context.render(content.orElseGet(() -> displayLink(uri)), viewer),
ChatColor.BLUE, ChatColor.UNDERLINE)
.clickEvent(ClickEvent.Action.OPEN_URL, uri.toString());
}
private BaseComponent displayLink(URI uri) {
String display = uri.getHost();
// Don't append the path if it's just "/"
// Use the raw path with illegal chars, which tends to look nicer.
if(!"/".equals(uri.getRawPath())) {
display = display + uri.getRawPath();
}
if(!compact) {
display = uri.getScheme() + "://" + display;
}
return new Component(display);
}
}