Add some missing javadocs to not generate warnings

This commit is contained in:
Aurora Lahtela 2024-01-06 17:59:29 +02:00
parent 6fa2d0ab87
commit bc4aef8b2b
67 changed files with 200 additions and 88 deletions

View File

@ -64,6 +64,9 @@ public interface CapabilityService {
return Capability.getByName(capabilityName).isPresent(); return Capability.getByName(capabilityName).isPresent();
} }
/**
* Singleton holder for listeners.
*/
class ListHolder { class ListHolder {
static final AtomicReference<List<Consumer<Boolean>>> enableListeners = new AtomicReference<>( static final AtomicReference<List<Consumer<Boolean>>> enableListeners = new AtomicReference<>(
new CopyOnWriteArrayList<>() new CopyOnWriteArrayList<>()

View File

@ -89,7 +89,7 @@ public interface ComponentService {
* Converts the given input into a {@link Component}. * Converts the given input into a {@link Component}.
* Input example {@code §ctext}. * Input example {@code §ctext}.
* *
* @param legacy the input legacy * @param legacy the input legacy
* @param character the character to use as the color prefix, usually {@code §}. * @param character the character to use as the color prefix, usually {@code §}.
* @return a {@link Component} * @return a {@link Component}
* @see #fromLegacy(String) * @see #fromLegacy(String)
@ -115,7 +115,7 @@ public interface ComponentService {
* Input example: {@code &#rrggbbtext}. * Input example: {@code &#rrggbbtext}.
* *
* @param adventureLegacy the input adventure legacy * @param adventureLegacy the input adventure legacy
* @param character the character to use as the color prefix, usually {@code &}. * @param character the character to use as the color prefix, usually {@code &}.
* @return a {@link Component} * @return a {@link Component}
* @see #fromAdventureLegacy(String) * @see #fromAdventureLegacy(String)
* @see Component#SECTION * @see Component#SECTION
@ -139,7 +139,7 @@ public interface ComponentService {
* Input example: {@code §x§r§r§g§g§b§btext}. * Input example: {@code §x§r§r§g§g§b§btext}.
* *
* @param bungeeLegacy the input bungee legacy * @param bungeeLegacy the input bungee legacy
* @param character the character to use as the color prefix, usually {@code §}. * @param character the character to use as the color prefix, usually {@code §}.
* @return a {@link Component} * @return a {@link Component}
* @see Component#SECTION * @see Component#SECTION
* @see Component#AMPERSAND * @see Component#AMPERSAND
@ -164,6 +164,9 @@ public interface ComponentService {
*/ */
Component fromJson(String json); Component fromJson(String json);
/**
* Singleton holder for ComponentService.
*/
class Holder { class Holder {
static final AtomicReference<ComponentService> service = new AtomicReference<>(); static final AtomicReference<ComponentService> service = new AtomicReference<>();

View File

@ -1,6 +1,5 @@
/** /**
* PageExtension API for extending the webserver and the website. * PageExtension API for extending the webserver and the website.
*
* <a href="https://github.com/plan-player-analytics/Plan/wiki/APIv5-PageExtension-API">Documentation</a> * <a href="https://github.com/plan-player-analytics/Plan/wiki/APIv5-PageExtension-API">Documentation</a>
*/ */
package com.djrapitops.plan.delivery.web; package com.djrapitops.plan.delivery.web;

View File

@ -46,6 +46,11 @@ public final class CompositeResolver implements Resolver {
this.resolvers = new ArrayList<>(); this.resolvers = new ArrayList<>();
} }
/**
* Create a new builder for a .
*
* @return a builder.
*/
public static CompositeResolver.Builder builder() { public static CompositeResolver.Builder builder() {
return new Builder(); return new Builder();
} }
@ -100,6 +105,9 @@ public final class CompositeResolver implements Resolver {
return getResolver(forThis.getPath()).map(resolver -> resolver.requiresAuth(forThis)).orElse(true); return getResolver(forThis.getPath()).map(resolver -> resolver.requiresAuth(forThis)).orElse(true);
} }
/**
* Builder class for {@link CompositeResolver}.
*/
public static class Builder { public static class Builder {
private final CompositeResolver composite; private final CompositeResolver composite;
@ -132,6 +140,11 @@ public final class CompositeResolver implements Resolver {
return this; return this;
} }
/**
* Build the final result after adding all resolvers.
*
* @return The {@link CompositeResolver}
*/
public CompositeResolver build() { public CompositeResolver build() {
return composite; return composite;
} }

View File

@ -22,11 +22,20 @@ import java.util.Optional;
import java.util.function.Function; import java.util.function.Function;
import java.util.function.Predicate; import java.util.function.Predicate;
/**
* Utility class for constructing a {@link Resolver} with Functional Interfaces.
*/
public class FunctionalResolverWrapper implements Resolver { public class FunctionalResolverWrapper implements Resolver {
private final Function<Request, Optional<Response>> resolver; private final Function<Request, Optional<Response>> resolver;
private final Predicate<Request> accessCheck; private final Predicate<Request> accessCheck;
/**
* Default constructor.
*
* @param resolver Function that solves the {@link Request} into an Optional {@link Response}.
* @param accessCheck Predicate that checks if {@link Request} is allowed or if 403 Forbidden should be given.
*/
public FunctionalResolverWrapper(Function<Request, Optional<Response>> resolver, Predicate<Request> accessCheck) { public FunctionalResolverWrapper(Function<Request, Optional<Response>> resolver, Predicate<Request> accessCheck) {
this.resolver = resolver; this.resolver = resolver;
this.accessCheck = accessCheck; this.accessCheck = accessCheck;

View File

@ -72,10 +72,21 @@ public interface Resolver {
*/ */
Optional<Response> resolve(Request request); Optional<Response> resolve(Request request);
/**
* Creates a new {@link ResponseBuilder} for a {@link Response}.
*
* @return a new builder.
*/
default ResponseBuilder newResponseBuilder() { default ResponseBuilder newResponseBuilder() {
return Response.builder(); return Response.builder();
} }
/**
* Used to check if the resolver requires authentication to be used.
*
* @param request Incoming request that you can use to figure out if authentication is required.
* @return true if you want 401 to be given when user has not logged in.
*/
default boolean requiresAuth(Request request) { default boolean requiresAuth(Request request) {
return true; return true;
} }

View File

@ -33,7 +33,7 @@ public class ResponseBuilder {
/** /**
* Set MIME Type of the Response. * Set MIME Type of the Response.
* *
* @param mimeType MIME type of the Response https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types * @param mimeType MIME type of the Response <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types">Documentation</a>
* @return this builder. * @return this builder.
* @see MimeType for common MIME types. * @see MimeType for common MIME types.
*/ */
@ -46,7 +46,7 @@ public class ResponseBuilder {
* <p> * <p>
* Default status code is 200 (OK) if not set. * Default status code is 200 (OK) if not set.
* *
* @param code 1xx, 2xx, 3xx, 4xx, 5xx, https://developer.mozilla.org/en-US/docs/Web/HTTP/Status * @param code 1xx, 2xx, 3xx, 4xx, 5xx, <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Status">Documentation</a>
* @return this builder. * @return this builder.
*/ */
public ResponseBuilder setStatus(int code) { public ResponseBuilder setStatus(int code) {
@ -57,7 +57,7 @@ public class ResponseBuilder {
/** /**
* Set HTTP Response header. * Set HTTP Response header.
* *
* @param header Key of the header. https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers * @param header Key of the header. <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers">Documentation</a>
* @param value Value for the header. * @param value Value for the header.
* @return this builder. * @return this builder.
*/ */
@ -75,7 +75,7 @@ public class ResponseBuilder {
* Utility method for building redirects. * Utility method for building redirects.
* *
* @param url URL to redirect the client to with 302 Found. * @param url URL to redirect the client to with 302 Found.
* @return https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Location * @return <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Location">Documentation</a>
*/ */
public ResponseBuilder redirectTo(String url) { public ResponseBuilder redirectTo(String url) {
return setStatus(302).setHeader("Location", url).setContent(new byte[0]); return setStatus(302).setHeader("Location", url).setContent(new byte[0]);

View File

@ -26,6 +26,11 @@ package com.djrapitops.plan.delivery.web.resolver.exception;
*/ */
public class BadRequestException extends IllegalArgumentException { public class BadRequestException extends IllegalArgumentException {
/**
* Default constructor.
*
* @param message Error message - avoid including any input incoming in the request to prevent XSS.
*/
public BadRequestException(String message) { public BadRequestException(String message) {
super(message); super(message);
} }

View File

@ -1,6 +1,5 @@
/** /**
* Classes for implementing functionality with {@link com.djrapitops.plan.delivery.web.ResolverService}. * Classes for implementing functionality with {@link com.djrapitops.plan.delivery.web.ResolverService}.
*
* <a href="https://github.com/plan-player-analytics/Plan/wiki/APIv5-PageExtension-API#resolverservice">Documentation</a> * <a href="https://github.com/plan-player-analytics/Plan/wiki/APIv5-PageExtension-API#resolverservice">Documentation</a>
*/ */
package com.djrapitops.plan.delivery.web.resolver; package com.djrapitops.plan.delivery.web.resolver;

View File

@ -43,7 +43,7 @@ public final class Request {
* @param path Requested path /example/target * @param path Requested path /example/target
* @param query Request parameters ?param=value etc * @param query Request parameters ?param=value etc
* @param user Web user doing the request (if authenticated) * @param user Web user doing the request (if authenticated)
* @param headers Request headers https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers * @param headers Request headers <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers">Documentation</a>
* @param requestBody Raw body as bytes, if present * @param requestBody Raw body as bytes, if present
*/ */
public Request(String method, URIPath path, URIQuery query, WebUser user, Map<String, String> headers, byte[] requestBody) { public Request(String method, URIPath path, URIQuery query, WebUser user, Map<String, String> headers, byte[] requestBody) {
@ -57,6 +57,11 @@ public final class Request {
/** /**
* Special constructor that figures out URIPath and URIQuery from "/path/and?query=params" and has no request body. * Special constructor that figures out URIPath and URIQuery from "/path/and?query=params" and has no request body.
*
* @param method HTTP requst method
* @param target The requested path and query, e.g. "/path/and?query=params"
* @param user User that made the request
* @param headers HTTP request headers
*/ */
public Request(String method, String target, WebUser user, Map<String, String> headers) { public Request(String method, String target, WebUser user, Map<String, String> headers) {
this.method = method; this.method = method;
@ -121,7 +126,7 @@ public final class Request {
/** /**
* Get a header in the request. * Get a header in the request.
* *
* @param key https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers * @param key <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers">Documentation</a>
* @return Value if it is present in the request. * @return Value if it is present in the request.
*/ */
public Optional<String> getHeader(String key) { public Optional<String> getHeader(String key) {

View File

@ -1,6 +1,5 @@
/** /**
* Classes for implementing functionality with {@link com.djrapitops.plan.delivery.web.ResourceService}. * Classes for implementing functionality with {@link com.djrapitops.plan.delivery.web.ResourceService}.
*
* <a href="https://github.com/plan-player-analytics/Plan/wiki/APIv5-PageExtension-API#resourceservice">Documentation</a> * <a href="https://github.com/plan-player-analytics/Plan/wiki/APIv5-PageExtension-API#resourceservice">Documentation</a>
*/ */
package com.djrapitops.plan.delivery.web.resource; package com.djrapitops.plan.delivery.web.resource;

View File

@ -113,6 +113,7 @@ public interface DataExtension {
* <p> * <p>
* Requires Capability DATA_EXTENSION_BUILDER_API * Requires Capability DATA_EXTENSION_BUILDER_API
* *
* @param text Text that is displayed next to the value.
* @return new builder. * @return new builder.
*/ */
default ValueBuilder valueBuilder(String text) { default ValueBuilder valueBuilder(String text) {

View File

@ -81,6 +81,9 @@ public interface ExtensionService {
*/ */
void unregister(DataExtension extension); void unregister(DataExtension extension);
/**
* Singleton holder for {@link ExtensionService}.
*/
class Holder { class Holder {
static final AtomicReference<ExtensionService> service = new AtomicReference<>(); static final AtomicReference<ExtensionService> service = new AtomicReference<>();

View File

@ -42,6 +42,12 @@ public enum FormatType {
*/ */
NONE; NONE;
/**
* Get a format type by the enum name without exception.
*
* @param name FormatType#name()
* @return Optional if the format type is found by that name, empty if not found.
*/
public static Optional<FormatType> getByName(String name) { public static Optional<FormatType> getByName(String name) {
if (name == null) { if (name == null) {
return Optional.empty(); return Optional.empty();
@ -51,4 +57,5 @@ public enum FormatType {
} catch (IllegalArgumentException e) { } catch (IllegalArgumentException e) {
return Optional.empty(); return Optional.empty();
} }
}} }
}

View File

@ -30,6 +30,11 @@ package com.djrapitops.plan.extension;
*/ */
public interface Group { public interface Group {
/**
* Get the name of the group.
*
* @return Name of the group given by a {@link com.djrapitops.plan.extension.annotation.GroupProvider}, e.g. "Miner"
*/
String getGroupName(); String getGroupName();
} }

View File

@ -89,7 +89,7 @@ public @interface BooleanProvider {
/** /**
* Name of Font Awesome icon. * Name of Font Awesome icon.
* <p> * <p>
* See https://fontawesome.com/icons (select 'free')) for icons and their {@link Family}. * See <a href="https://fontawesome.com/icons">FontAwesome</a> (select 'free')) for icons and their {@link Family}.
* *
* @return Name of the icon, if name is not valid no icon is shown. * @return Name of the icon, if name is not valid no icon is shown.
*/ */
@ -98,7 +98,7 @@ public @interface BooleanProvider {
/** /**
* Family of Font Awesome icon. * Family of Font Awesome icon.
* <p> * <p>
* See https://fontawesome.com/icons (select 'free')) for icons and their {@link Family}. * See <a href="https://fontawesome.com/icons">FontAwesome</a> (select 'free')) for icons and their {@link Family}.
* *
* @return Family that matches an icon, if there is no icon for this family no icon is shown. * @return Family that matches an icon, if there is no icon for this family no icon is shown.
*/ */

View File

@ -76,7 +76,7 @@ public @interface ComponentProvider {
/** /**
* Name of Font Awesome icon. * Name of Font Awesome icon.
* <p> * <p>
* See https://fontawesome.com/icons (select 'free')) for icons and their {@link Family}. * See <a href="https://fontawesome.com/icons">FontAwesome</a> (select 'free')) for icons and their {@link Family}.
* *
* @return Name of the icon, if name is not valid no icon is shown. * @return Name of the icon, if name is not valid no icon is shown.
*/ */
@ -85,7 +85,7 @@ public @interface ComponentProvider {
/** /**
* Family of Font Awesome icon. * Family of Font Awesome icon.
* <p> * <p>
* See https://fontawesome.com/icons (select 'free')) for icons and their {@link Family}. * See <a href="https://fontawesome.com/icons">FontAwesome</a> (select 'free')) for icons and their {@link Family}.
* *
* @return Family that matches an icon, if there is no icon for this family no icon is shown. * @return Family that matches an icon, if there is no icon for this family no icon is shown.
*/ */

View File

@ -67,7 +67,7 @@ public @interface DoubleProvider {
/** /**
* Name of Font Awesome icon. * Name of Font Awesome icon.
* <p> * <p>
* See https://fontawesome.com/icons (select 'free')) for icons and their {@link Family}. * See <a href="https://fontawesome.com/icons">FontAwesome</a> (select 'free')) for icons and their {@link Family}.
* *
* @return Name of the icon, if name is not valid no icon is shown. * @return Name of the icon, if name is not valid no icon is shown.
*/ */
@ -76,7 +76,7 @@ public @interface DoubleProvider {
/** /**
* Family of Font Awesome icon. * Family of Font Awesome icon.
* <p> * <p>
* See https://fontawesome.com/icons (select 'free')) for icons and their {@link Family}. * See <a href="https://fontawesome.com/icons">FontAwesome</a> (select 'free')) for icons and their {@link Family}.
* *
* @return Family that matches an icon, if there is no icon for this family no icon is shown. * @return Family that matches an icon, if there is no icon for this family no icon is shown.
*/ */

View File

@ -62,7 +62,7 @@ public @interface GroupProvider {
/** /**
* Name of Font Awesome icon. * Name of Font Awesome icon.
* <p> * <p>
* See https://fontawesome.com/icons (select 'free')) for icons and their {@link Family}. * See <a href="https://fontawesome.com/icons">FontAwesome</a> (select 'free')) for icons and their {@link Family}.
* *
* @return Name of the icon, if name is not valid no icon is shown. * @return Name of the icon, if name is not valid no icon is shown.
*/ */
@ -71,7 +71,7 @@ public @interface GroupProvider {
/** /**
* Family of Font Awesome icon. * Family of Font Awesome icon.
* <p> * <p>
* See https://fontawesome.com/icons (select 'free')) for icons and their {@link Family}. * See <a href="https://fontawesome.com/icons">FontAwesome</a> (select 'free')) for icons and their {@link Family}.
* *
* @return Family that matches an icon, if there is no icon for this family no icon is shown. * @return Family that matches an icon, if there is no icon for this family no icon is shown.
*/ */

View File

@ -39,10 +39,18 @@ public @interface InvalidateMethod {
*/ */
String value(); String value();
/**
* Multiple {@link InvalidateMethod} annotations are supported per class.
*/
@Retention(RetentionPolicy.RUNTIME) @Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE) @Target(ElementType.TYPE)
@interface Multiple { @interface Multiple {
/**
* All the annotations.
*
* @return All InvalidateMethod annotations in the class.
*/
InvalidateMethod[] value(); InvalidateMethod[] value();
} }

View File

@ -79,7 +79,7 @@ public @interface NumberProvider {
/** /**
* Name of Font Awesome icon. * Name of Font Awesome icon.
* <p> * <p>
* See https://fontawesome.com/icons (select 'free')) for icons and their {@link Family}. * See <a href="https://fontawesome.com/icons">FontAwesome</a> (select 'free')) for icons and their {@link Family}.
* *
* @return Name of the icon, if name is not valid no icon is shown. * @return Name of the icon, if name is not valid no icon is shown.
*/ */
@ -88,7 +88,7 @@ public @interface NumberProvider {
/** /**
* Family of Font Awesome icon. * Family of Font Awesome icon.
* <p> * <p>
* See https://fontawesome.com/icons (select 'free')) for icons and their {@link Family}. * See <a href="https://fontawesome.com/icons">FontAwesome</a> (select 'free')) for icons and their {@link Family}.
* *
* @return Family that matches an icon, if there is no icon for this family no icon is shown. * @return Family that matches an icon, if there is no icon for this family no icon is shown.
*/ */

View File

@ -70,7 +70,7 @@ public @interface PercentageProvider {
/** /**
* Name of Font Awesome icon. * Name of Font Awesome icon.
* <p> * <p>
* See https://fontawesome.com/icons (select 'free')) for icons and their {@link Family}. * See <a href="https://fontawesome.com/icons">FontAwesome</a> (select 'free')) for icons and their {@link Family}.
* *
* @return Name of the icon, if name is not valid no icon is shown. * @return Name of the icon, if name is not valid no icon is shown.
*/ */
@ -79,7 +79,7 @@ public @interface PercentageProvider {
/** /**
* Family of Font Awesome icon. * Family of Font Awesome icon.
* <p> * <p>
* See https://fontawesome.com/icons (select 'free')) for icons and their {@link Family}. * See <a href="https://fontawesome.com/icons">FontAwesome</a> (select 'free')) for icons and their {@link Family}.
* *
* @return Family that matches an icon, if there is no icon for this family no icon is shown. * @return Family that matches an icon, if there is no icon for this family no icon is shown.
*/ */

View File

@ -44,7 +44,7 @@ public @interface PluginInfo {
/** /**
* Name of Font Awesome icon. * Name of Font Awesome icon.
* <p> * <p>
* See https://fontawesome.com/icons (select 'free')) for icons and their {@link Family}. * See <a href="https://fontawesome.com/icons">FontAwesome</a> (select 'free')) for icons and their {@link Family}.
* *
* @return Name of the icon, if name is not valid no icon is shown. * @return Name of the icon, if name is not valid no icon is shown.
*/ */
@ -53,7 +53,7 @@ public @interface PluginInfo {
/** /**
* Family of Font Awesome icon. * Family of Font Awesome icon.
* <p> * <p>
* See https://fontawesome.com/icons (select 'free')) for icons and their {@link Family}. * See <a href="https://fontawesome.com/icons">FontAwesome</a> (select 'free')) for icons and their {@link Family}.
* *
* @return Family that matches an icon, if there is no icon for this family no icon is shown. * @return Family that matches an icon, if there is no icon for this family no icon is shown.
*/ */

View File

@ -79,7 +79,7 @@ public @interface StringProvider {
/** /**
* Name of Font Awesome icon. * Name of Font Awesome icon.
* <p> * <p>
* See https://fontawesome.com/icons (select 'free')) for icons and their {@link Family}. * See <a href="https://fontawesome.com/icons">FontAwesome</a> (select 'free')) for icons and their {@link Family}.
* *
* @return Name of the icon, if name is not valid no icon is shown. * @return Name of the icon, if name is not valid no icon is shown.
*/ */
@ -88,7 +88,7 @@ public @interface StringProvider {
/** /**
* Family of Font Awesome icon. * Family of Font Awesome icon.
* <p> * <p>
* See https://fontawesome.com/icons (select 'free')) for icons and their {@link Family}. * See <a href="https://fontawesome.com/icons">FontAwesome</a> (select 'free')) for icons and their {@link Family}.
* *
* @return Family that matches an icon, if there is no icon for this family no icon is shown. * @return Family that matches an icon, if there is no icon for this family no icon is shown.
*/ */

View File

@ -41,7 +41,7 @@ public @interface TabInfo {
/** /**
* Name of Font Awesome icon. * Name of Font Awesome icon.
* <p> * <p>
* See https://fontawesome.com/icons (select 'free')) for icons and their {@link Family}. * See <a href="https://fontawesome.com/icons">FontAwesome</a> (select 'free')) for icons and their {@link Family}.
* *
* @return Name of the icon, if name is not valid no icon is shown. * @return Name of the icon, if name is not valid no icon is shown.
*/ */
@ -50,7 +50,7 @@ public @interface TabInfo {
/** /**
* Family of Font Awesome icon. * Family of Font Awesome icon.
* <p> * <p>
* See https://fontawesome.com/icons (select 'free')) for icons and their {@link Family}. * See <a href="https://fontawesome.com/icons">FontAwesome</a> (select 'free')) for icons and their {@link Family}.
* *
* @return Family that matches an icon, if there is no icon for this family no icon is shown. * @return Family that matches an icon, if there is no icon for this family no icon is shown.
*/ */

View File

@ -18,7 +18,10 @@ package com.djrapitops.plan.extension.builder;
import com.djrapitops.plan.component.Component; import com.djrapitops.plan.component.Component;
import com.djrapitops.plan.extension.FormatType; import com.djrapitops.plan.extension.FormatType;
import com.djrapitops.plan.extension.annotation.*; import com.djrapitops.plan.extension.annotation.BooleanProvider;
import com.djrapitops.plan.extension.annotation.Conditional;
import com.djrapitops.plan.extension.annotation.StringProvider;
import com.djrapitops.plan.extension.annotation.Tab;
import com.djrapitops.plan.extension.extractor.ExtensionMethod; import com.djrapitops.plan.extension.extractor.ExtensionMethod;
import com.djrapitops.plan.extension.icon.Color; import com.djrapitops.plan.extension.icon.Color;
import com.djrapitops.plan.extension.icon.Family; import com.djrapitops.plan.extension.icon.Family;
@ -64,7 +67,7 @@ public interface ValueBuilder {
/** /**
* Icon displayed next to the value. * Icon displayed next to the value.
* <p> * <p>
* See https://fontawesome.com/icons (select 'free')) for icons * See <a href="https://fontawesome.com/icons">FontAwesome</a> (select 'free')) for icons
* *
* @param iconName Name of the icon * @param iconName Name of the icon
* @param iconFamily Family of the icon * @param iconFamily Family of the icon
@ -78,7 +81,7 @@ public interface ValueBuilder {
/** /**
* Icon displayed next to the value. * Icon displayed next to the value.
* <p> * <p>
* See https://fontawesome.com/icons (select 'free')) for icons * See <a href="https://fontawesome.com/icons">FontAwesome</a> (select 'free')) for icons
* *
* @param icon Icon built using the methods in {@link Icon}. * @param icon Icon built using the methods in {@link Icon}.
* @return This builder. * @return This builder.

View File

@ -47,6 +47,12 @@ public enum Color {
BLACK, BLACK,
NONE; NONE;
/**
* Get a color by the enum name without exception.
*
* @param name Color#name()
* @return Optional if the color is found by that name, empty if not found.
*/
public static Optional<Color> getByName(String name) { public static Optional<Color> getByName(String name) {
if (name == null) { if (name == null) {
return Optional.empty(); return Optional.empty();
@ -56,4 +62,5 @@ public enum Color {
} catch (IllegalArgumentException e) { } catch (IllegalArgumentException e) {
return Optional.empty(); return Optional.empty();
} }
}} }
}

View File

@ -37,6 +37,12 @@ public enum Family {
*/ */
BRAND; BRAND;
/**
* Get a family by the enum name without exception.
*
* @param name Family#name()
* @return Optional if the family is found by that name, empty if not found.
*/
public static Optional<Family> getByName(String name) { public static Optional<Family> getByName(String name) {
if (name == null) { if (name == null) {
return Optional.empty(); return Optional.empty();

View File

@ -21,7 +21,7 @@ import java.util.Objects;
/** /**
* Object that represents an icon on the website. * Object that represents an icon on the website.
* <p> * <p>
* See https://fontawesome.com/icons (select 'free')) for icons and their {@link Family}. * See <a href="https://fontawesome.com/icons">FontAwesome</a> (select 'free')) for icons and their {@link Family}.
* *
* @author AuroraLS3 * @author AuroraLS3
*/ */
@ -92,6 +92,9 @@ public class Icon {
return "Icon{" + type.name() + ", '" + name + '\'' + ", " + color.name() + '}'; return "Icon{" + type.name() + ", '" + name + '\'' + ", " + color.name() + '}';
} }
/**
* Builder for an {@link Icon}.
*/
public static class Builder { public static class Builder {
private final Icon icon; private final Icon icon;

View File

@ -1,6 +1,5 @@
/** /**
* DataExtension API and related classes. * DataExtension API and related classes.
*
* <a href="https://github.com/plan-player-analytics/Plan/wiki/APIv5---DataExtension-API">Documentation</a> * <a href="https://github.com/plan-player-analytics/Plan/wiki/APIv5---DataExtension-API">Documentation</a>
*/ */
package com.djrapitops.plan.extension; package com.djrapitops.plan.extension;

View File

@ -62,14 +62,44 @@ public interface CommonQueries {
*/ */
long fetchLastSeen(UUID playerUUID, UUID serverUUID); long fetchLastSeen(UUID playerUUID, UUID serverUUID);
/**
* Get the UUIDs of all servers Plan has registered.
*
* @return Set of Server UUIDs
*/
Set<UUID> fetchServerUUIDs(); Set<UUID> fetchServerUUIDs();
/**
* Fetch UUID of a player by name.
*
* @param playerName Name of the player
* @return UUID if it is found by Plan or empty if not found.
*/
Optional<UUID> fetchUUIDOf(String playerName); Optional<UUID> fetchUUIDOf(String playerName);
/**
* Fetch name of a player by UUID.
*
* @param playerUUID UUID of the player
* @return Name if it is known by Plan or empty if not.
*/
Optional<String> fetchNameOf(UUID playerUUID); Optional<String> fetchNameOf(UUID playerUUID);
/**
* Check that schema has table you are using in your queries.
*
* @param table Name of the table, e.g. plan_users.
* @return true if table exists.
*/
boolean doesDBHaveTable(String table); boolean doesDBHaveTable(String table);
/**
* Check that schema table has a column you are using in your queries.
*
* @param table Name of the table, e.g. plan_users.
* @param column Name of the column, e.g. id
* @return true if table and column exist.
*/
boolean doesDBHaveTableColumn(String table, String column); boolean doesDBHaveTableColumn(String table, String column);
/** /**

View File

@ -126,7 +126,7 @@ public interface QueryService {
CommonQueries getCommonQueries(); CommonQueries getCommonQueries();
/** /**
* See https://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html * See <a href="https://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html">Functional Interfaces</a>
*/ */
@FunctionalInterface @FunctionalInterface
interface ThrowingConsumer<T> { interface ThrowingConsumer<T> {
@ -134,7 +134,7 @@ public interface QueryService {
} }
/** /**
* See https://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html * See <a href="https://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html">Functional Interfaces</a>
*/ */
@FunctionalInterface @FunctionalInterface
interface ThrowingFunction<T, R> { interface ThrowingFunction<T, R> {
@ -142,7 +142,7 @@ public interface QueryService {
} }
/** /**
* See https://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html * See <a href="https://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html">Functional Interfaces</a>
*/ */
@FunctionalInterface @FunctionalInterface
interface VoidFunction { interface VoidFunction {

View File

@ -1,6 +1,5 @@
/** /**
* Query API related classes. * Query API related classes.
*
* <a href="https://github.com/plan-player-analytics/Plan/wiki/APIv5-Query-API">Documentation</a> * <a href="https://github.com/plan-player-analytics/Plan/wiki/APIv5-Query-API">Documentation</a>
*/ */
package com.djrapitops.plan.query; package com.djrapitops.plan.query;

View File

@ -51,6 +51,9 @@ public interface ListenerService {
*/ */
void registerListenerForPlan(Object listener); void registerListenerForPlan(Object listener);
/**
* Singleton holder for listeners.
*/
class Holder { class Holder {
static final AtomicReference<ListenerService> service = new AtomicReference<>(); static final AtomicReference<ListenerService> service = new AtomicReference<>();

View File

@ -25,7 +25,7 @@ import java.util.stream.Collectors;
/** /**
* UserImportRefiner attempts to find any crucial information that is missing. * UserImportRefiner attempts to find any crucial information that is missing.
* * <p>
* - Finds UUIDs if only name is present. * - Finds UUIDs if only name is present.
* - Finds Names if only UUID is present. * - Finds Names if only UUID is present.
* - Removes any importers that do not have any identifiers. * - Removes any importers that do not have any identifiers.

View File

@ -53,7 +53,7 @@ import java.util.logging.Logger;
* Task that handles player ping calculation on Bukkit based servers. * Task that handles player ping calculation on Bukkit based servers.
* <p> * <p>
* Modified PingManager from LagMonitor plugin. * Modified PingManager from LagMonitor plugin.
* https://github.com/games647/LagMonitor/blob/master/src/main/java/com/github/games647/lagmonitor/task/PingManager.java * <a href="https://github.com/games647/LagMonitor/blob/master/src/main/java/com/github/games647/lagmonitor/task/PingManager.java">original</a>
* *
* @author games647 * @author games647
*/ */

View File

@ -32,7 +32,7 @@ import java.lang.reflect.Field;
* An utility class that simplifies reflection in Bukkit plugins. * An utility class that simplifies reflection in Bukkit plugins.
* <p> * <p>
* Modified Reflection utility from LagMonitor plugin. * Modified Reflection utility from LagMonitor plugin.
* https://github.com/games647/LagMonitor/blob/master/src/main/java/com/github/games647/lagmonitor/traffic/Reflection.java * <a href="https://github.com/games647/LagMonitor/blob/master/src/main/java/com/github/games647/lagmonitor/traffic/Reflection.java">original code</a>
* *
* @author Kristian * @author Kristian
*/ */

View File

@ -43,7 +43,7 @@ import java.util.stream.Collectors;
* PlanAPI extension for all implementations. * PlanAPI extension for all implementations.
* *
* @author AuroraLS3 * @author AuroraLS3
* @deprecated Plan API v4 has been deprecated, use the APIv5 instead (https://github.com/plan-player-analytics/Plan/wiki/APIv5). * @deprecated Plan API v4 has been deprecated, use the APIv5 instead (<a href="https://github.com/plan-player-analytics/Plan/wiki/APIv5">wiki</a>).
*/ */
@Singleton @Singleton
@Deprecated(forRemoval = true, since = "5.0") @Deprecated(forRemoval = true, since = "5.0")

View File

@ -35,7 +35,7 @@ import java.util.UUID;
* Interface for PlanAPI methods. * Interface for PlanAPI methods.
* *
* @author AuroraLS3 * @author AuroraLS3
* @deprecated Plan API v4 has been deprecated, use the APIv5 instead (https://github.com/plan-player-analytics/Plan/wiki/APIv5). * @deprecated Plan API v4 has been deprecated, use the APIv5 instead (<a href="https://github.com/plan-player-analytics/Plan/wiki/APIv5">wiki</a>).
*/ */
@Deprecated(since = "5.0") @Deprecated(since = "5.0")
public interface PlanAPI { public interface PlanAPI {
@ -65,7 +65,7 @@ public interface PlanAPI {
} }
/** /**
* @deprecated PluginData API has been deprecated - see https://github.com/plan-player-analytics/Plan/wiki/APIv5---DataExtension-API for new API. * @deprecated PluginData API has been deprecated - see <a href="https://github.com/plan-player-analytics/Plan/wiki/APIv5---DataExtension-API">wiki</a> for new API.
*/ */
@Deprecated @Deprecated
void addPluginDataSource(PluginData pluginData); void addPluginDataSource(PluginData pluginData);

View File

@ -29,7 +29,7 @@ import java.util.Optional;
* The Keys might change in the future, but the Optional API should help dealing with those cases. * The Keys might change in the future, but the Optional API should help dealing with those cases.
* *
* @author AuroraLS3 * @author AuroraLS3
* @deprecated Plan API v4 has been deprecated, use the APIv5 instead (https://github.com/plan-player-analytics/Plan/wiki/APIv5). * @deprecated Plan API v4 has been deprecated, use the APIv5 instead (<a href="https://github.com/plan-player-analytics/Plan/wiki/APIv5">wiki</a>).
*/ */
@Deprecated(since = "5.0") @Deprecated(since = "5.0")
public class PlayerContainer { public class PlayerContainer {

View File

@ -28,7 +28,7 @@ import java.util.Optional;
* The Keys might change in the future, but the Optional API should help dealing with those cases. * The Keys might change in the future, but the Optional API should help dealing with those cases.
* *
* @author AuroraLS3 * @author AuroraLS3
* @deprecated Plan API v4 has been deprecated, use the APIv5 instead (https://github.com/plan-player-analytics/Plan/wiki/APIv5). * @deprecated Plan API v4 has been deprecated, use the APIv5 instead (<a href="https://github.com/plan-player-analytics/Plan/wiki/APIv5">wiki</a>).
*/ */
@Deprecated(forRemoval = true, since = "5.0") @Deprecated(forRemoval = true, since = "5.0")
public class ServerContainer { public class ServerContainer {

View File

@ -27,7 +27,7 @@ import java.util.UUID;
* @author AuroraLS3 * @author AuroraLS3
* @see TableContainer * @see TableContainer
* @see InspectContainer * @see InspectContainer
* @deprecated PluginData API has been deprecated - see https://github.com/plan-player-analytics/Plan/wiki/APIv5---DataExtension-API for new API. * @deprecated PluginData API has been deprecated - see <a href="https://github.com/plan-player-analytics/Plan/wiki/APIv5---DataExtension-API">wiki</a> for new API.
*/ */
@Deprecated(since = "5.0") @Deprecated(since = "5.0")
public final class AnalysisContainer extends InspectContainer { public final class AnalysisContainer extends InspectContainer {

View File

@ -27,7 +27,7 @@ import java.util.TreeMap;
* *
* @author AuroraLS3 * @author AuroraLS3
* @see TableContainer * @see TableContainer
* @deprecated PluginData API has been deprecated - see https://github.com/plan-player-analytics/Plan/wiki/APIv5---DataExtension-API for new API. * @deprecated PluginData API has been deprecated - see <a href="https://github.com/plan-player-analytics/Plan/wiki/APIv5---DataExtension-API">wiki</a> for new API.
*/ */
@Deprecated(since = "5.0") @Deprecated(since = "5.0")
public class InspectContainer { public class InspectContainer {

View File

@ -26,7 +26,7 @@ import java.util.List;
* Container used for creating Html tables. * Container used for creating Html tables.
* *
* @author AuroraLS3 * @author AuroraLS3
* @deprecated PluginData API has been deprecated - see https://github.com/plan-player-analytics/Plan/wiki/APIv5---DataExtension-API for new API. * @deprecated PluginData API has been deprecated - see <a href="https://github.com/plan-player-analytics/Plan/wiki/APIv5---DataExtension-API">wiki</a> for new API.
*/ */
@Deprecated(since = "5.0") @Deprecated(since = "5.0")
public class TableContainer { public class TableContainer {

View File

@ -23,7 +23,7 @@ import java.util.UUID;
* Interface for PluginData objects that affect Ban state of players. * Interface for PluginData objects that affect Ban state of players.
* *
* @author AuroraLS3 * @author AuroraLS3
* @deprecated PluginData API has been deprecated - see https://github.com/plan-player-analytics/Plan/wiki/APIv5---DataExtension-API for new API. * @deprecated PluginData API has been deprecated - see <a href="https://github.com/plan-player-analytics/Plan/wiki/APIv5---DataExtension-API">wiki</a> for new API.
*/ */
@Deprecated(since = "5.0") @Deprecated(since = "5.0")
public interface BanData { public interface BanData {

View File

@ -20,7 +20,7 @@ package com.djrapitops.plan.data.plugin;
* Enum class for PluginData to estimate the required width of the contained items. * Enum class for PluginData to estimate the required width of the contained items.
* *
* @author AuroraLS3 * @author AuroraLS3
* @deprecated PluginData API has been deprecated - see https://github.com/plan-player-analytics/Plan/wiki/APIv5---DataExtension-API for new API. * @deprecated PluginData API has been deprecated - see <a href="https://github.com/plan-player-analytics/Plan/wiki/APIv5---DataExtension-API">wiki</a> for new API.
*/ */
@Deprecated @Deprecated
public enum ContainerSize { public enum ContainerSize {

View File

@ -33,7 +33,7 @@ import java.util.UUID;
* to register objects extending this class. * to register objects extending this class.
* *
* @author AuroraLS3 * @author AuroraLS3
* @deprecated PluginData API has been deprecated - see https://github.com/plan-player-analytics/Plan/wiki/APIv5---DataExtension-API for new API. * @deprecated PluginData API has been deprecated - see <a href="https://github.com/plan-player-analytics/Plan/wiki/APIv5---DataExtension-API">wiki</a> for new API.
*/ */
@Deprecated(since = "5.0") @Deprecated(since = "5.0")
public abstract class PluginData { public abstract class PluginData {

View File

@ -139,7 +139,6 @@ public interface DataContainer {
/** /**
* Get formatted Value identified by the Key. * Get formatted Value identified by the Key.
* <p>
* *
* @param key Key that identifies the Value * @param key Key that identifies the Value
* @param formatter Formatter for the Optional returned by {@link DataContainer#getValue(Key)} * @param formatter Formatter for the Optional returned by {@link DataContainer#getValue(Key)}

View File

@ -38,15 +38,16 @@ import java.util.concurrent.TimeUnit;
* <p> * <p>
* Activity for a single week is calculated using {@code A(t) = (1 / (pi/2 * (t/T) + 1))}. * Activity for a single week is calculated using {@code A(t) = (1 / (pi/2 * (t/T) + 1))}.
* A(t) is based on function f(x) = 1 / (x + 1), which has property f(0) = 1, decreasing from there, but not in a straight line. * A(t) is based on function f(x) = 1 / (x + 1), which has property f(0) = 1, decreasing from there, but not in a straight line.
* You can see the function plotted here https://www.wolframalpha.com/input/?i=1+%2F+(x%2B1)+from+-1+to+2 * You can see the function plotted <a href="https://www.wolframalpha.com/input/?i=1+%2F+(x%2B1)+from+-1+to+2">here</a>
* <p> * <p>
* To fine tune the curve pi/2 is used since it felt like a good curve. * To fine tune the curve pi/2 is used since it felt like a good curve.
* <p> * <p>
* Activity index A is calculated by using the formula: * Activity index A is calculated by using the formula:
* {@code A = 5 - 5 * [A(t1) + A(t2) + A(t3)] / 3} * {@code A = 5 - 5 * [A(t1) + A(t2) + A(t3)] / 3}
* <p> * <p>
* <a href="https://www.wolframalpha.com/input/?i=plot+y+%3D+5+-+5+*+(1+%2F+(pi%2F2+*+x%2B1))+and+y+%3D1+and+y+%3D+2+and+y+%3D+3+and+y+%3D+3.75+from+-0.5+to+3">
* Plot for A and limits * Plot for A and limits
* https://www.wolframalpha.com/input/?i=plot+y+%3D+5+-+5+*+(1+%2F+(pi%2F2+*+x%2B1))+and+y+%3D1+and+y+%3D+2+and+y+%3D+3+and+y+%3D+3.75+from+-0.5+to+3 * </a>
* <p> * <p>
* New Limits for A would thus be * New Limits for A would thus be
* {@code < 1: Inactive} * {@code < 1: Inactive}

View File

@ -24,7 +24,7 @@ import java.util.TimeZone;
/** /**
* Formats timestamps to the Last-Modified header time format. * Formats timestamps to the Last-Modified header time format.
* https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Last-Modified * <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Last-Modified">Documentation for the header</a>
* *
* @author AuroraLS3 * @author AuroraLS3
*/ */

View File

@ -42,8 +42,6 @@ import java.util.stream.Collectors;
/** /**
* Utility for creating jQuery Datatables JSON for a Players Table. * Utility for creating jQuery Datatables JSON for a Players Table.
* <p>
* See https://www.datatables.net/manual/data/orthogonal-data#HTML-5 for sort kinds
* *
* @author AuroraLS3 * @author AuroraLS3
*/ */

View File

@ -31,9 +31,6 @@ import java.util.Objects;
/** /**
* Configuration utility for storing settings in a .yml file. * Configuration utility for storing settings in a .yml file.
* <p>
* Based on
* https://github.com/AuroraLS3/Abstract-Plugin-Framework/blob/72e221d3571ef200727713d10d3684c51e9f469d/AbstractPluginFramework/api/src/main/java/com/djrapitops/plugin/config/Config.java
* *
* @author AuroraLS3 * @author AuroraLS3
*/ */

View File

@ -34,9 +34,6 @@ import java.util.stream.Collectors;
/** /**
* Represents a single node in a configuration file * Represents a single node in a configuration file
* <p>
* Based on
* https://github.com/AuroraLS3/Abstract-Plugin-Framework/blob/72e221d3571ef200727713d10d3684c51e9f469d/AbstractPluginFramework/api/src/main/java/com/djrapitops/plugin/config/ConfigNode.java
* *
* @author AuroraLS3 * @author AuroraLS3
*/ */

View File

@ -27,7 +27,7 @@ public enum LangCode {
EN("English", "AuroraLS3"), EN("English", "AuroraLS3"),
ES("Español", "Catalina, itaquito, Elguerrero & 4drian3d"), ES("Español", "Catalina, itaquito, Elguerrero & 4drian3d"),
CN("\u6C49\u8BED", "f0rb1d (\u4f5b\u58c1\u706f), qsefthuopq, shaokeyibb, Fur_xia, 10935336, SkipM4, TheLittle_Yang & jhqwqmc"), // Simplified Chinese CN("\u6C49\u8BED", "f0rb1d (\u4f5b\u58c1\u706f), qsefthuopq, shaokeyibb, Fur_xia, 10935336, SkipM4, TheLittle_Yang & jhqwqmc"), // Simplified Chinese
CS("čeština", "Shadowhackercz, QuakyCZ, MrFriggo & WolverStones"), CS("\u010de\u0161tina", "Shadowhackercz, QuakyCZ, MrFriggo & WolverStones"),
DE("Deutsch", "Eyremba, fuzzlemann, Morsmorse, hallo1142 & DubHacker"), DE("Deutsch", "Eyremba, fuzzlemann, Morsmorse, hallo1142 & DubHacker"),
FI("suomi", "AuroraLS3, KasperiP"), FI("suomi", "AuroraLS3, KasperiP"),
FR("français", "CyanTech, Aurelien & Nogapra"), FR("français", "CyanTech, Aurelien & Nogapra"),
@ -35,9 +35,9 @@ public enum LangCode {
JA("\u65E5\u672C\u8A9E", "yukieji, inductor, lis2a, yu_solt , Jumala9163 & ringoXD"), JA("\u65E5\u672C\u8A9E", "yukieji, inductor, lis2a, yu_solt , Jumala9163 & ringoXD"),
KO("\uD55C\uAD6D\uC5B4", "Guinness_Akihiko"), KO("\uD55C\uAD6D\uC5B4", "Guinness_Akihiko"),
NL("Nederlands", "Sander0542"), NL("Nederlands", "Sander0542"),
RU("русский", "Saph1s, Perhun_Pak, BratishkaErik & stashenko"), RU("ру\u0441\u0441к\u0438\u0439", "Saph1s, Perhun_Pak, BratishkaErik & stashenko"),
TR("Türkçe", "TDJisvan, BruilsiozPro & EyuphanMandiraci"), TR("Türkçe", "TDJisvan, BruilsiozPro & EyuphanMandiraci"),
UK("українська мова", "xlanyleeet"), UK("україн\u0441ька \u043cо\u0432а", "xlanyleeet"),
PT_BR("Português", "jvmuller"), PT_BR("Português", "jvmuller"),
ZH_TW("\u6F22\u8A9E", "\u6d1b\u4f0a & zisunny104"); ZH_TW("\u6F22\u8A9E", "\u6d1b\u4f0a & zisunny104");

View File

@ -50,15 +50,16 @@ import static com.djrapitops.plan.storage.database.sql.building.Sql.*;
* <p> * <p>
* Activity for a single week is calculated using {@code A(t) = (1 / (pi/2 * (t/T) + 1))}. * Activity for a single week is calculated using {@code A(t) = (1 / (pi/2 * (t/T) + 1))}.
* A(t) is based on function f(x) = 1 / (x + 1), which has property f(0) = 1, decreasing from there, but not in a straight line. * A(t) is based on function f(x) = 1 / (x + 1), which has property f(0) = 1, decreasing from there, but not in a straight line.
* You can see the function plotted here https://www.wolframalpha.com/input/?i=1+%2F+(x%2B1)+from+-1+to+2 * You can see the function plotted <a href="https://www.wolframalpha.com/input/?i=1+%2F+(x%2B1)+from+-1+to+2">here</a>
* <p> * <p>
* To fine tune the curve pi/2 is used since it felt like a good curve. * To fine tune the curve pi/2 is used since it felt like a good curve.
* <p> * <p>
* Activity index A is calculated by using the formula: * Activity index A is calculated by using the formula:
* {@code A = 5 - 5 * [A(t1) + A(t2) + A(t3)] / 3} * {@code A = 5 - 5 * [A(t1) + A(t2) + A(t3)] / 3}
* <p> * <p>
* <a href="https://www.wolframalpha.com/input/?i=plot+y+%3D+5+-+5+*+(1+%2F+(pi%2F2+*+x%2B1))+and+y+%3D1+and+y+%3D+2+and+y+%3D+3+and+y+%3D+3.75+from+-0.5+to+3">
* Plot for A and limits * Plot for A and limits
* https://www.wolframalpha.com/input/?i=plot+y+%3D+5+-+5+*+(1+%2F+(pi%2F2+*+x%2B1))+and+y+%3D1+and+y+%3D+2+and+y+%3D+3+and+y+%3D+3.75+from+-0.5+to+3 * </a>
* <p> * <p>
* New Limits for A would thus be * New Limits for A would thus be
* {@code < 1: Inactive} * {@code < 1: Inactive}

View File

@ -46,15 +46,16 @@ import static com.djrapitops.plan.storage.database.sql.building.Sql.*;
* <p> * <p>
* Activity for a single week is calculated using {@code A(t) = (1 / (pi/2 * (t/T) + 1))}. * Activity for a single week is calculated using {@code A(t) = (1 / (pi/2 * (t/T) + 1))}.
* A(t) is based on function f(x) = 1 / (x + 1), which has property f(0) = 1, decreasing from there, but not in a straight line. * A(t) is based on function f(x) = 1 / (x + 1), which has property f(0) = 1, decreasing from there, but not in a straight line.
* You can see the function plotted here https://www.wolframalpha.com/input/?i=1+%2F+(x%2B1)+from+-1+to+2 * You can see the function plotted <a href="https://www.wolframalpha.com/input/?i=1+%2F+(x%2B1)+from+-1+to+2">here</a>
* <p> * <p>
* To fine tune the curve pi/2 is used since it felt like a good curve. * To fine tune the curve pi/2 is used since it felt like a good curve.
* <p> * <p>
* Activity index A is calculated by using the formula: * Activity index A is calculated by using the formula:
* {@code A = 5 - 5 * [A(t1) + A(t2) + A(t3)] / 3} * {@code A = 5 - 5 * [A(t1) + A(t2) + A(t3)] / 3}
* <p> * <p>
* <a href="https://www.wolframalpha.com/input/?i=plot+y+%3D+5+-+5+*+(1+%2F+(pi%2F2+*+x%2B1))+and+y+%3D1+and+y+%3D+2+and+y+%3D+3+and+y+%3D+3.75+from+-0.5+to+3">
* Plot for A and limits * Plot for A and limits
* https://www.wolframalpha.com/input/?i=plot+y+%3D+5+-+5+*+(1+%2F+(pi%2F2+*+x%2B1))+and+y+%3D1+and+y+%3D+2+and+y+%3D+3+and+y+%3D+3.75+from+-0.5+to+3 * </a>
* <p> * <p>
* New Limits for A would thus be * New Limits for A would thus be
* {@code < 1: Inactive} * {@code < 1: Inactive}

View File

@ -33,8 +33,9 @@ import static com.djrapitops.plan.storage.database.sql.building.Sql.*;
/** /**
* Transaction for removing duplicate data in plan_user_info. * Transaction for removing duplicate data in plan_user_info.
* <p> * <p>
* https://github.com/plan-player-analytics/Plan/issues/956 * Related issues:
* https://github.com/plan-player-analytics/Plan/issues/967 * <a href="https://github.com/plan-player-analytics/Plan/issues/956">Issue #956</a>
* <a href="https://github.com/plan-player-analytics/Plan/issues/967">Issue #967</a>
* *
* @author AuroraLS3 * @author AuroraLS3
*/ */

View File

@ -28,7 +28,7 @@ import static com.djrapitops.plan.storage.database.sql.building.Sql.*;
/** /**
* Patch to fix incorrect register dates for nukkit. * Patch to fix incorrect register dates for nukkit.
* https://github.com/plan-player-analytics/Plan/issues/1320 * <a href="https://github.com/plan-player-analytics/Plan/issues/1320">Related issue</a>
* *
* @author AuroraLS3 * @author AuroraLS3
*/ */

View File

@ -19,7 +19,7 @@ package com.djrapitops.plan.storage.database.transactions.patches;
/** /**
* Patch that removes plan_commandusages table. * Patch that removes plan_commandusages table.
* <p> * <p>
* See https://github.com/plan-player-analytics/Plan/issues/1240 for more details * See <a href="https://github.com/plan-player-analytics/Plan/issues/1240">related issue</a> for more details
* *
* @author AuroraLS3 * @author AuroraLS3
*/ */

View File

@ -31,7 +31,7 @@ import java.util.Set;
import static com.djrapitops.plan.storage.database.sql.building.Sql.*; import static com.djrapitops.plan.storage.database.sql.building.Sql.*;
/** /**
* Removes invalid data caused by https://github.com/plan-player-analytics/Plan/issues/1355. * Removes invalid data caused by <a href="https://github.com/plan-player-analytics/Plan/issues/1355">issue #1355</a>.
* *
* @author AuroraLS3 * @author AuroraLS3
*/ */

View File

@ -28,7 +28,7 @@ import static com.djrapitops.plan.storage.database.sql.building.Sql.WHERE;
/** /**
* Adds a is_proxy field to remove technical debt assuming name field "BungeeCord" being the proxy. * Adds a is_proxy field to remove technical debt assuming name field "BungeeCord" being the proxy.
* <p> * <p>
* See https://github.com/plan-player-analytics/Plan/issues/1678 for more details * See <a href="https://github.com/plan-player-analytics/Plan/issues/1678">issue #1678</a> for more details
* *
* @author AuroraLS3 * @author AuroraLS3
*/ */

View File

@ -30,7 +30,7 @@ import java.util.Base64;
/** /**
* Password Encryption utility. * Password Encryption utility.
* <p> * <p>
* https://github.com/defuse/password-hashing/blob/master/PasswordStorage.java * <a href="https://github.com/defuse/password-hashing/blob/master/PasswordStorage.java">Based on this code</a>
* *
* @author Defuse * @author Defuse
*/ */

View File

@ -24,7 +24,7 @@ import java.util.List;
/** /**
* Formats chat messages in different ways. * Formats chat messages in different ways.
* <p> * <p>
* Original code: https://hastebin.com/uziyajirag.avrasm * <a href="https://hastebin.com/uziyajirag.avrasm">Original code</a>
*/ */
public class ChatFormatter { public class ChatFormatter {
private static final int CENTER_PX = 154; private static final int CENTER_PX = 154;

View File

@ -19,7 +19,7 @@ package com.djrapitops.plan.utilities.chat;
/** /**
* Contains width of characters in the chat with default font. * Contains width of characters in the chat with default font.
* <p> * <p>
* Original code form https://www.spigotmc.org/threads/free-code-sending-perfectly-centered-chat-message.95872/page-2 * <a href="https://www.spigotmc.org/threads/free-code-sending-perfectly-centered-chat-message.95872/page-2">Original code</a>
*/ */
public enum DefaultFontInfo { public enum DefaultFontInfo {

View File

@ -81,7 +81,7 @@ public class Lists {
* @param mapper Function to change object of type A to type B * @param mapper Function to change object of type A to type B
* @param <A> Type of the old list objects * @param <A> Type of the old list objects
* @param <B> Type of the new list objects * @param <B> Type of the new list objects
* @return List with elements in original that keep returned true for. * @return Set with elements in original that keep returned true for.
*/ */
public static <A, B> Set<B> mapUnique(Collection<A> original, Function<A, B> mapper) { public static <A, B> Set<B> mapUnique(Collection<A> original, Function<A, B> mapper) {
Set<B> mapped = new HashSet<>(); Set<B> mapped = new HashSet<>();

View File

@ -19,7 +19,7 @@ package com.djrapitops.plan.version;
import java.util.Objects; import java.util.Objects;
/** /**
* Data class for reading version.txt in https://github.com/AuroraLS3/Plan-PlayerAnalytics. * Data class for reading version.txt in <a href="https://github.com/plan-player-analytics/Plan">Github Repository</a>.
* *
* @author AuroraLS3 * @author AuroraLS3
*/ */

View File

@ -49,9 +49,6 @@ import java.util.concurrent.TimeUnit;
/** /**
* Task that handles player ping calculation on Nukkit based servers. * Task that handles player ping calculation on Nukkit based servers.
* <p>
* Modified PingManager from LagMonitor plugin.
* https://github.com/games647/LagMonitor/blob/master/src/main/java/com/github/games647/lagmonitor/task/PingManager.java
* *
* @author games647 * @author games647
*/ */