2021-08-14 01:39:45 +02:00
|
|
|
package net.minestom.server.event;
|
|
|
|
|
|
|
|
import org.jetbrains.annotations.NotNull;
|
|
|
|
|
2021-08-16 07:58:58 +02:00
|
|
|
import java.util.Collection;
|
2021-08-14 01:39:45 +02:00
|
|
|
import java.util.HashMap;
|
|
|
|
import java.util.Map;
|
|
|
|
import java.util.function.BiConsumer;
|
2021-08-16 07:58:58 +02:00
|
|
|
import java.util.function.Predicate;
|
2021-08-14 01:39:45 +02:00
|
|
|
|
2021-08-16 07:58:58 +02:00
|
|
|
public interface EventInterface<E extends Event> {
|
2021-08-14 01:39:45 +02:00
|
|
|
|
2021-08-16 07:58:58 +02:00
|
|
|
static <E extends Event, T> @NotNull FilteredBuilder<E, T> filtered(@NotNull EventFilter<E, T> filter, @NotNull Predicate<T> predicate) {
|
|
|
|
return new FilteredBuilder<>(filter, predicate);
|
2021-08-14 01:39:45 +02:00
|
|
|
}
|
|
|
|
|
2021-08-16 07:58:58 +02:00
|
|
|
@NotNull Collection<Class<? extends Event>> eventTypes();
|
2021-08-14 01:39:45 +02:00
|
|
|
|
2021-08-16 07:58:58 +02:00
|
|
|
void call(@NotNull E event);
|
|
|
|
|
|
|
|
class FilteredBuilder<E extends Event, T> {
|
|
|
|
private final EventFilter<E, T> filter;
|
|
|
|
private final Predicate<T> predicate;
|
|
|
|
private final Map<Class<? extends Event>, BiConsumer<Object, E>> mapped = new HashMap<>();
|
2021-08-14 01:39:45 +02:00
|
|
|
|
2021-08-16 07:58:58 +02:00
|
|
|
FilteredBuilder(EventFilter<E, T> filter, Predicate<T> predicate) {
|
|
|
|
this.filter = filter;
|
|
|
|
this.predicate = predicate;
|
|
|
|
}
|
2021-08-14 01:39:45 +02:00
|
|
|
|
2021-08-16 07:58:58 +02:00
|
|
|
public <M extends E> FilteredBuilder<E, T> map(@NotNull Class<M> eventType,
|
|
|
|
@NotNull BiConsumer<@NotNull T, @NotNull M> consumer) {
|
|
|
|
this.mapped.put(eventType, (BiConsumer<Object, E>) consumer);
|
2021-08-14 01:39:45 +02:00
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
2021-08-16 07:58:58 +02:00
|
|
|
public @NotNull EventInterface<E> build() {
|
|
|
|
final var copy = Map.copyOf(mapped);
|
|
|
|
final var eventTypes = copy.keySet();
|
|
|
|
return new EventInterface<>() {
|
|
|
|
@Override
|
|
|
|
public @NotNull Collection<Class<? extends Event>> eventTypes() {
|
|
|
|
return eventTypes;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void call(@NotNull E event) {
|
|
|
|
final T handler = filter.getHandler(event);
|
|
|
|
if (!predicate.test(handler)) return;
|
|
|
|
final var consumer = copy.get(event.getClass());
|
|
|
|
consumer.accept(handler, event);
|
|
|
|
}
|
|
|
|
};
|
2021-08-14 01:39:45 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|