94 lines
3.0 KiB
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);
|
|
}
|
|
}
|