Skip to content

Commit

Permalink
fix: Fixed reconnection loop if not servers are available
Browse files Browse the repository at this point in the history
fixed #5
  • Loading branch information
4drian3d committed Jul 1, 2022
1 parent 77e10a8 commit f343b14
Show file tree
Hide file tree
Showing 9 changed files with 170 additions and 11 deletions.
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
group = me.dreamerzero.kickredirect
version = 2.0.3
version = 2.0.4-SNAPSHOT
description = Set the redirect result of your servers shutdown
url = https://github.com/4drian3d/KickRedirect
id = kickredirect
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ public enum SendMode {
public RegisteredServer server(KickRedirect plugin) {
for (final String st : plugin.config().get().getServersToRedirect()) {
final Optional<RegisteredServer> sv = plugin.getProxy().getServer(st);
if(sv.isPresent()) return sv.get();
if (sv.isPresent()) return sv.get();
}
return null;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
package me.dreamerzero.kickredirect.listener;

import java.time.Duration;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.UUID;

import com.velocitypowered.api.event.Continuation;
import com.velocitypowered.api.event.PostOrder;
Expand All @@ -19,21 +24,28 @@

public final class KickListener {
private final KickRedirect plugin;
private Map<UUID, String> sended = new HashMap<>();

public KickListener(final KickRedirect plugin){
this.plugin = plugin;
}

@Subscribe(order = PostOrder.EARLY)
public void onKickFromServer(final KickedFromServerEvent event, final Continuation continuation){

final Player player = event.getPlayer();
if (shouldKick(player, event.getServer())) {
continuation.resume();
cache(event, event.getServer().getServerInfo().getName(), KickStep.REPEATED_ATTEMPT);
// This should keep the "original" DisconnectPlayer result
return;
}
if (reasonCheck(event)) {
final RegisteredServer server = plugin.config().get().getSendMode().server(plugin);
if (server == null) {
plugin.getProxy().getConsoleCommandSource().sendMessage(
plugin.formatter().format(
plugin.messages().get().noServersFoundToRedirect(),
event.getPlayer(),
player,
Placeholder.unparsed(
"sendmode",
plugin.config().get().getSendMode().toString()
Expand All @@ -44,9 +56,10 @@ public void onKickFromServer(final KickedFromServerEvent event, final Continuati
continuation.resume();
cache(event, null, KickStep.NULL_SERVER);
} else {
event.setResult(redirectResult(server, event.getPlayer()));
event.setResult(redirectResult(server, player));
continuation.resume();
cache(event, server.getServerInfo().getName(), KickStep.AVAILABLE_SERVER);
addToSended(player, server);
}
} else {
continuation.resume();
Expand All @@ -68,7 +81,7 @@ boolean reasonCheck(KickedFromServerEvent event) {
final Optional<String> optional = event.getServerKickReason()
.map(PlainTextComponentSerializer.plainText()::serialize);

if(optional.isPresent()) {
if (optional.isPresent()) {
final String message = optional.get();
for (final String msg : plugin.config().get().getMessagesToCheck()) {
if (message.contains(msg)) {
Expand All @@ -83,7 +96,7 @@ boolean reasonCheck(KickedFromServerEvent event) {

ServerKickResult redirectResult(RegisteredServer server, Player player) {
final String redirectMessage = plugin.messages().get().redirectMessage();
if(redirectMessage.isBlank()) {
if (redirectMessage.isBlank()) {
return KickedFromServerEvent.RedirectPlayer.create(server);
} else {
final Component message = plugin.formatter().format(redirectMessage, player);
Expand All @@ -102,7 +115,20 @@ void applyKickResult(KickedFromServerEvent event) {
}
}

void addToSended(Player player, RegisteredServer server) {
sended.put(player.getUniqueId(), server.getServerInfo().getName());
plugin.getProxy().getScheduler()
.buildTask(plugin, () -> sended.remove(player.getUniqueId()))
.delay(Duration.ofMillis(10))
.schedule();
}

boolean shouldKick(Player player, RegisteredServer server) {
return Objects.equals(sended.get(player.getUniqueId()), server.getServerInfo().getName());
}

public enum KickStep {
REPEATED_ATTEMPT,
NULL_SERVER,
AVAILABLE_SERVER,
DISALLOWED_REASON;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,10 @@ public String result() {
return this.finalResult;
}

public KickStep step() {
return this.step;
}

public TagResolver commonResolver() {
return TagResolver.builder()
.resolvers(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ void emptiestServer() {
.contains(server);
}

// https://github.com/4drian3d/KickRedirect/issues/4
@Test
void issue4() {
RegisteredServer server = new TestRegisteredServer(5);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package me.dreamerzero.kickredirect.builder;

import java.util.concurrent.CompletableFuture;

import com.velocitypowered.api.proxy.ConnectionRequestBuilder;
import com.velocitypowered.api.proxy.ConnectionRequestBuilder.Result;
import com.velocitypowered.api.proxy.server.RegisteredServer;

import net.kyori.adventure.builder.AbstractBuilder;

public class RequestBuilder implements AbstractBuilder<ConnectionRequestBuilder> {
private RegisteredServer server;
private Result result;
private boolean indicationResult;

public static RequestBuilder builder() {
return new RequestBuilder();
}

public RequestBuilder server(RegisteredServer server) {
this.server = server;
return this;
}

public RequestBuilder result(Result result) {
this.result = result;
return this;
}

public RequestBuilder result(boolean result) {
this.indicationResult = result;
return this;
}

@Override
public ConnectionRequestBuilder build() {
return new ConnectionRequestBuilder() {

@Override
public RegisteredServer getServer() {
return server;
}

@Override
public CompletableFuture<Result> connect() {
return CompletableFuture.completedFuture(result);
}

@Override
public CompletableFuture<Boolean> connectWithIndication() {
return CompletableFuture.completedFuture(indicationResult);
}

@Override
public void fireAndForget() {
}

};
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,14 @@
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

import com.velocitypowered.api.event.Continuation;
import com.velocitypowered.api.event.player.KickedFromServerEvent;
import com.velocitypowered.api.proxy.server.RegisteredServer;

import me.dreamerzero.kickredirect.EventBuilder;
import me.dreamerzero.kickredirect.EventBundle;
import me.dreamerzero.kickredirect.KickResultType;
import me.dreamerzero.kickredirect.listener.objects.TestContinuation;
import me.dreamerzero.kickredirect.listener.objects.TestPlayer;
import me.dreamerzero.kickredirect.listener.objects.TestRegisteredServer;
import net.kyori.adventure.text.Component;
Expand Down Expand Up @@ -95,7 +98,7 @@ void testexactServer() {
.player(new TestPlayer("4drian3d", true))
.event(EventBuilder.builder()
.result(KickResultType.DISCONNECT.result(Component.text("")))
.server(new TestRegisteredServer())
.server(new TestRegisteredServer().name("nose"))
)
.build();

Expand All @@ -116,12 +119,40 @@ void testContinuation() {
.player(new TestPlayer("4drian3d", true))
.event(EventBuilder.builder()
.result(KickResultType.DISCONNECT.result(Component.text("")))
.server(new TestRegisteredServer())
.server(new TestRegisteredServer().name("si"))
)
.build();

bundle.applyListener();

assertTrue(bundle.getContinuation().resumed());
}

// https://github.com/4drian3d/KickRedirect/issues/5
@Test
void issue5() {
RegisteredServer server = new TestRegisteredServer().name("lobby1");
EventBundle bundle = EventBundle.builder()
.player(new TestPlayer("4drian3d", true))
.event(EventBuilder.builder()
.result(KickResultType.DISCONNECT.result(Component.empty()))
.server(server)
)
.debug(true)
.build();

KickListener listener = new KickListener(bundle.getPlugin());
Continuation continuation = new TestContinuation();

listener.onKickFromServer(bundle.getEvent(), continuation);
listener.onKickFromServer(bundle.getEvent(), continuation);

assertThat(bundle.getPlugin().debugCache().asMap())
.isNotNull()
.containsKey(bundle.getPlayer().getUniqueId())
.extracting(a -> a.get(bundle.getPlayer().getUniqueId()))
.isNotNull()
.extracting(a -> a.step())
.isEqualTo(KickListener.KickStep.REPEATED_ATTEMPT);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,9 @@
import com.velocitypowered.api.proxy.server.RegisteredServer;
import com.velocitypowered.api.util.GameProfile;
import com.velocitypowered.api.util.GameProfile.Property;

import me.dreamerzero.kickredirect.builder.RequestBuilder;

import com.velocitypowered.api.util.ModInfo;

import org.checkerframework.checker.nullness.qual.Nullable;
Expand Down Expand Up @@ -72,7 +75,10 @@ public void clearHeaderAndFooter() {}

@Override
public ConnectionRequestBuilder createConnectionRequest(RegisteredServer arg0) {
return null;
return RequestBuilder.builder()
.result(true)
.server(new TestRegisteredServer())
.build();
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,12 @@
import java.util.Optional;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
import java.util.function.Consumer;

import org.checkerframework.common.value.qual.IntRange;
import org.jetbrains.annotations.NotNull;

import com.velocitypowered.api.command.CommandManager;
import com.velocitypowered.api.event.EventManager;
import com.velocitypowered.api.permission.Tristate;
Expand Down Expand Up @@ -121,7 +125,34 @@ public Scheduler getScheduler() {
return new Scheduler(){
@Override
public TaskBuilder buildTask(Object plugin, Runnable consumer) {
return null;
return new TaskBuilder() {

@Override
public TaskBuilder delay(@IntRange(from = 0) long time, @NotNull TimeUnit unit) {
return this;
}

@Override
public TaskBuilder repeat(@IntRange(from = 0) long time, @NotNull TimeUnit unit) {
return this;
}

@Override
public TaskBuilder clearDelay() {
return this;
}

@Override
public TaskBuilder clearRepeat() {
return this;
}

@Override
public ScheduledTask schedule() {
return null;
}

};
}

@Override
Expand Down

0 comments on commit f343b14

Please sign in to comment.