From e990f2b948e3dc27ef169bbd694af06229dc9e36 Mon Sep 17 00:00:00 2001 From: Tim203 Date: Sat, 13 Aug 2022 22:59:52 +0200 Subject: [PATCH] Switched event library --- api/build.gradle.kts | 1 + build-logic/src/main/kotlin/Versions.kt | 2 +- core/build.gradle.kts | 1 - .../geysermc/floodgate/FloodgatePlatform.java | 6 +-- .../geysermc/floodgate/event/EventBus.java | 53 +++++++++++++++++++ .../floodgate/event/EventSubscriber.java | 46 ++++++++++++++++ .../event/util/ListenerAnnotationMatcher.java | 2 +- .../floodgate/link/CommonPlayerLink.java | 6 +-- .../floodgate/module/CommonModule.java | 10 ++-- .../geysermc/floodgate/news/NewsChecker.java | 6 +-- .../geysermc/floodgate/util/HttpClient.java | 6 +-- .../floodgate/util/PostEnableMessages.java | 6 +-- 12 files changed, 121 insertions(+), 24 deletions(-) create mode 100644 core/src/main/java/org/geysermc/floodgate/event/EventBus.java create mode 100644 core/src/main/java/org/geysermc/floodgate/event/EventSubscriber.java diff --git a/api/build.gradle.kts b/api/build.gradle.kts index 0bd75df1..09fb2163 100644 --- a/api/build.gradle.kts +++ b/api/build.gradle.kts @@ -1,6 +1,7 @@ dependencies { api("org.geysermc", "common", Versions.geyserVersion) api("org.geysermc.cumulus", "cumulus", Versions.cumulusVersion) + api("org.geysermc.event", "events", Versions.eventsVersion) compileOnly("io.netty", "netty-transport", Versions.nettyVersion) } diff --git a/build-logic/src/main/kotlin/Versions.kt b/build-logic/src/main/kotlin/Versions.kt index 9e3f4880..54aaaf74 100644 --- a/build-logic/src/main/kotlin/Versions.kt +++ b/build-logic/src/main/kotlin/Versions.kt @@ -26,6 +26,7 @@ object Versions { const val geyserVersion = "2.0.4-SNAPSHOT" const val cumulusVersion = "1.1" + const val eventsVersion = "1.0-SNAPSHOT" const val configUtilsVersion = "1.0-SNAPSHOT" const val spigotVersion = "1.13-R0.1-SNAPSHOT" const val fastutilVersion = "8.5.3" @@ -34,7 +35,6 @@ object Versions { const val snakeyamlVersion = "1.28" const val cloudVersion = "1.5.0" const val bstatsVersion = "3.0.0" - const val mbassadorVersion = "1.3.2" const val javaWebsocketVersion = "1.5.2" diff --git a/core/build.gradle.kts b/core/build.gradle.kts index 258d98c5..02fec9dd 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -15,7 +15,6 @@ dependencies { api("cloud.commandframework", "cloud-core", Versions.cloudVersion) api("org.yaml", "snakeyaml", Versions.snakeyamlVersion) api("org.bstats", "bstats-base", Versions.bstatsVersion) - api("net.engio", "mbassador", Versions.mbassadorVersion) } // present on all platforms diff --git a/core/src/main/java/org/geysermc/floodgate/FloodgatePlatform.java b/core/src/main/java/org/geysermc/floodgate/FloodgatePlatform.java index 038bfe50..7036223c 100644 --- a/core/src/main/java/org/geysermc/floodgate/FloodgatePlatform.java +++ b/core/src/main/java/org/geysermc/floodgate/FloodgatePlatform.java @@ -29,7 +29,6 @@ import com.google.inject.Inject; import com.google.inject.Injector; import com.google.inject.Module; import java.util.UUID; -import net.engio.mbassy.bus.common.PubSubSupport; import org.geysermc.floodgate.api.FloodgateApi; import org.geysermc.floodgate.api.InstanceHolder; import org.geysermc.floodgate.api.handshake.HandshakeHandlers; @@ -37,6 +36,7 @@ import org.geysermc.floodgate.api.inject.PlatformInjector; import org.geysermc.floodgate.api.link.PlayerLink; import org.geysermc.floodgate.api.packet.PacketHandlers; import org.geysermc.floodgate.config.FloodgateConfig; +import org.geysermc.floodgate.event.EventBus; import org.geysermc.floodgate.event.PostEnableEvent; import org.geysermc.floodgate.event.ShutdownEvent; import org.geysermc.floodgate.link.PlayerLinkLoader; @@ -79,11 +79,11 @@ public class FloodgatePlatform { guice.getInstance(PostEnableMessages.class); guice.getInstance(Metrics.class); - guice.getInstance(PubSubSupport.class).publish(new PostEnableEvent()); + guice.getInstance(EventBus.class).fire(new PostEnableEvent()); } public void disable() { - guice.getInstance(PubSubSupport.class).publish(new ShutdownEvent()); + guice.getInstance(EventBus.class).fire(new ShutdownEvent()); if (injector != null && injector.canRemoveInjection()) { try { diff --git a/core/src/main/java/org/geysermc/floodgate/event/EventBus.java b/core/src/main/java/org/geysermc/floodgate/event/EventBus.java new file mode 100644 index 00000000..be768c51 --- /dev/null +++ b/core/src/main/java/org/geysermc/floodgate/event/EventBus.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2019-2022 GeyserMC. http://geysermc.org + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/Floodgate + */ + +package org.geysermc.floodgate.event; + +import java.util.function.BiConsumer; +import java.util.function.Consumer; +import org.geysermc.event.bus.impl.EventBusImpl; +import org.geysermc.event.subscribe.Subscribe; +import org.geysermc.event.subscribe.Subscriber; + +@SuppressWarnings("unchecked") +public final class EventBus extends EventBusImpl> { + @Override + protected > B makeSubscription( + Class eventClass, + Subscribe subscribe, + H listener, + BiConsumer handler) { + return (B) new EventSubscriber<>( + eventClass, subscribe.postOrder(), subscribe.ignoreCancelled(), listener, handler + ); + } + + @Override + protected > B makeSubscription( + Class eventClass, + Consumer handler) { + return (B) new EventSubscriber<>(eventClass, handler); + } +} diff --git a/core/src/main/java/org/geysermc/floodgate/event/EventSubscriber.java b/core/src/main/java/org/geysermc/floodgate/event/EventSubscriber.java new file mode 100644 index 00000000..1ac57cf7 --- /dev/null +++ b/core/src/main/java/org/geysermc/floodgate/event/EventSubscriber.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2019-2022 GeyserMC. http://geysermc.org + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/Floodgate + */ + +package org.geysermc.floodgate.event; + +import java.util.function.BiConsumer; +import java.util.function.Consumer; +import org.geysermc.event.PostOrder; +import org.geysermc.event.subscribe.impl.SubscriberImpl; + +public final class EventSubscriber extends SubscriberImpl { + EventSubscriber(Class eventClass, Consumer handler) { + super(eventClass, handler); + } + + EventSubscriber( + Class eventClass, + PostOrder postOrder, + boolean ignoreCancelled, + H handlerInstance, + BiConsumer handler) { + super(eventClass, postOrder, ignoreCancelled, handlerInstance, handler); + } +} diff --git a/core/src/main/java/org/geysermc/floodgate/event/util/ListenerAnnotationMatcher.java b/core/src/main/java/org/geysermc/floodgate/event/util/ListenerAnnotationMatcher.java index 614a6a52..e0881e23 100644 --- a/core/src/main/java/org/geysermc/floodgate/event/util/ListenerAnnotationMatcher.java +++ b/core/src/main/java/org/geysermc/floodgate/event/util/ListenerAnnotationMatcher.java @@ -27,7 +27,7 @@ package org.geysermc.floodgate.event.util; import com.google.inject.TypeLiteral; import com.google.inject.matcher.AbstractMatcher; -import net.engio.mbassy.listener.Listener; +import org.geysermc.event.Listener; public class ListenerAnnotationMatcher extends AbstractMatcher> { @Override diff --git a/core/src/main/java/org/geysermc/floodgate/link/CommonPlayerLink.java b/core/src/main/java/org/geysermc/floodgate/link/CommonPlayerLink.java index 29c9a4ea..c683c3e3 100644 --- a/core/src/main/java/org/geysermc/floodgate/link/CommonPlayerLink.java +++ b/core/src/main/java/org/geysermc/floodgate/link/CommonPlayerLink.java @@ -34,8 +34,8 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import lombok.AccessLevel; import lombok.Getter; -import net.engio.mbassy.listener.Handler; -import net.engio.mbassy.listener.Listener; +import org.geysermc.event.Listener; +import org.geysermc.event.subscribe.Subscribe; import org.geysermc.floodgate.api.FloodgateApi; import org.geysermc.floodgate.api.link.LinkRequest; import org.geysermc.floodgate.api.link.PlayerLink; @@ -107,7 +107,7 @@ public abstract class CommonPlayerLink implements PlayerLink { executorService.shutdown(); } - @Handler + @Subscribe public void onShutdown(ShutdownEvent ignored) { stop(); } diff --git a/core/src/main/java/org/geysermc/floodgate/module/CommonModule.java b/core/src/main/java/org/geysermc/floodgate/module/CommonModule.java index 3e15eb1a..27d39540 100644 --- a/core/src/main/java/org/geysermc/floodgate/module/CommonModule.java +++ b/core/src/main/java/org/geysermc/floodgate/module/CommonModule.java @@ -36,9 +36,6 @@ import com.google.inject.spi.TypeListener; import io.netty.util.AttributeKey; import java.nio.file.Path; import lombok.RequiredArgsConstructor; -import net.engio.mbassy.bus.MBassador; -import net.engio.mbassy.bus.common.PubSubSupport; -import net.engio.mbassy.bus.error.IPublicationErrorHandler.ConsoleLogger; import org.geysermc.floodgate.addon.data.HandshakeHandlersImpl; import org.geysermc.floodgate.api.FloodgateApi; import org.geysermc.floodgate.api.SimpleFloodgateApi; @@ -54,6 +51,7 @@ import org.geysermc.floodgate.crypto.AesKeyProducer; import org.geysermc.floodgate.crypto.Base64Topping; import org.geysermc.floodgate.crypto.FloodgateCipher; import org.geysermc.floodgate.crypto.KeyProducer; +import org.geysermc.floodgate.event.EventBus; import org.geysermc.floodgate.event.util.ListenerAnnotationMatcher; import org.geysermc.floodgate.inject.CommonPlatformInjector; import org.geysermc.floodgate.news.NewsChecker; @@ -67,17 +65,17 @@ import org.geysermc.floodgate.util.HttpClient; @RequiredArgsConstructor public class CommonModule extends AbstractModule { - private final PubSubSupport eventBus = new MBassador<>(new ConsoleLogger(true)); + private final EventBus eventBus = new EventBus(); private final Path dataDirectory; @Override protected void configure() { - bind(PubSubSupport.class).toInstance(eventBus); + bind(EventBus.class).toInstance(eventBus); // register every class that has the Listener annotation bindListener(new ListenerAnnotationMatcher(), new TypeListener() { @Override public void hear(TypeLiteral type, TypeEncounter encounter) { - encounter.register((InjectionListener) eventBus::subscribe); + encounter.register((InjectionListener) eventBus::register); } }); diff --git a/core/src/main/java/org/geysermc/floodgate/news/NewsChecker.java b/core/src/main/java/org/geysermc/floodgate/news/NewsChecker.java index 62be4469..88b42da7 100644 --- a/core/src/main/java/org/geysermc/floodgate/news/NewsChecker.java +++ b/core/src/main/java/org/geysermc/floodgate/news/NewsChecker.java @@ -37,8 +37,8 @@ import java.util.Map; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; -import net.engio.mbassy.listener.Handler; -import net.engio.mbassy.listener.Listener; +import org.geysermc.event.Listener; +import org.geysermc.event.subscribe.Subscribe; import org.geysermc.floodgate.api.logger.FloodgateLogger; import org.geysermc.floodgate.command.util.Permission; import org.geysermc.floodgate.event.ShutdownEvent; @@ -206,7 +206,7 @@ public class NewsChecker { executorService.shutdown(); } - @Handler + @Subscribe public void onShutdown(ShutdownEvent ignored) { shutdown(); } diff --git a/core/src/main/java/org/geysermc/floodgate/util/HttpClient.java b/core/src/main/java/org/geysermc/floodgate/util/HttpClient.java index c03fd49e..e665025f 100644 --- a/core/src/main/java/org/geysermc/floodgate/util/HttpClient.java +++ b/core/src/main/java/org/geysermc/floodgate/util/HttpClient.java @@ -37,10 +37,10 @@ import java.util.concurrent.Executors; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Getter; -import net.engio.mbassy.listener.Handler; -import net.engio.mbassy.listener.Listener; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; +import org.geysermc.event.Listener; +import org.geysermc.event.subscribe.Subscribe; import org.geysermc.floodgate.event.ShutdownEvent; // resources are properly closed and ignoring the original stack trace is intended @@ -162,7 +162,7 @@ public class HttpClient { return null; } - @Handler + @Subscribe public void onShutdown(ShutdownEvent ignored) { executorService.shutdown(); } diff --git a/core/src/main/java/org/geysermc/floodgate/util/PostEnableMessages.java b/core/src/main/java/org/geysermc/floodgate/util/PostEnableMessages.java index b324f4bd..94275014 100644 --- a/core/src/main/java/org/geysermc/floodgate/util/PostEnableMessages.java +++ b/core/src/main/java/org/geysermc/floodgate/util/PostEnableMessages.java @@ -28,8 +28,8 @@ package org.geysermc.floodgate.util; import com.google.inject.Inject; import java.util.ArrayList; import java.util.List; -import net.engio.mbassy.listener.Handler; -import net.engio.mbassy.listener.Listener; +import org.geysermc.event.Listener; +import org.geysermc.event.subscribe.Subscribe; import org.geysermc.floodgate.api.logger.FloodgateLogger; import org.geysermc.floodgate.config.FloodgateConfig; import org.geysermc.floodgate.event.PostEnableEvent; @@ -90,7 +90,7 @@ public final class PostEnableMessages { } } - @Handler + @Subscribe public void onPostEnable(PostEnableEvent ignored) { new Thread(() -> { // normally proxies don't have a lot of plugins, so proxies don't need to sleep as long