[Fix] Fixed issues with Ping gathering

Affected issues: #749
This commit is contained in:
Rsl1122 2018-10-14 22:04:00 +03:00
parent 6a8f93be89
commit b5c29a1c0d
18 changed files with 118 additions and 48 deletions

View File

@ -33,7 +33,7 @@ import javax.inject.Singleton;
SpongeServerPropertiesModule.class, SpongeServerPropertiesModule.class,
PluginBridgeModule.Sponge.class PluginBridgeModule.Sponge.class
}) })
interface PlanSpongeComponent { public interface PlanSpongeComponent {
PlanCommand planCommand(); PlanCommand planCommand();

View File

@ -33,7 +33,7 @@ import javax.inject.Singleton;
VelocityServerPropertiesModule.class, VelocityServerPropertiesModule.class,
PluginBridgeModule.Velocity.class PluginBridgeModule.Velocity.class
}) })
interface PlanVelocityComponent { public interface PlanVelocityComponent {
PlanVelocityCommand planCommand(); PlanVelocityCommand planCommand();

View File

@ -7,7 +7,11 @@ package com.djrapitops.plan.system.tasks;
import com.djrapitops.plan.Plan; import com.djrapitops.plan.Plan;
import com.djrapitops.plan.system.settings.Settings; import com.djrapitops.plan.system.settings.Settings;
import com.djrapitops.plan.system.settings.config.PlanConfig; import com.djrapitops.plan.system.settings.config.PlanConfig;
import com.djrapitops.plan.system.tasks.server.*; import com.djrapitops.plan.system.tasks.server.BootAnalysisTask;
import com.djrapitops.plan.system.tasks.server.PeriodicAnalysisTask;
import com.djrapitops.plan.system.tasks.server.bukkit.BukkitTPSCountTimer;
import com.djrapitops.plan.system.tasks.server.bukkit.PaperTPSCountTimer;
import com.djrapitops.plan.system.tasks.server.bukkit.PingCountTimerBukkit;
import com.djrapitops.plugin.api.Check; import com.djrapitops.plugin.api.Check;
import com.djrapitops.plugin.api.TimeAmount; import com.djrapitops.plugin.api.TimeAmount;
import com.djrapitops.plugin.task.RunnableFactory; import com.djrapitops.plugin.task.RunnableFactory;

View File

@ -7,9 +7,9 @@ package com.djrapitops.plan.system.tasks;
import com.djrapitops.plan.PlanBungee; import com.djrapitops.plan.PlanBungee;
import com.djrapitops.plan.system.settings.Settings; import com.djrapitops.plan.system.settings.Settings;
import com.djrapitops.plan.system.settings.config.PlanConfig; import com.djrapitops.plan.system.settings.config.PlanConfig;
import com.djrapitops.plan.system.tasks.bungee.BungeeTPSCountTimer; import com.djrapitops.plan.system.tasks.proxy.NetworkPageRefreshTask;
import com.djrapitops.plan.system.tasks.server.NetworkPageRefreshTask; import com.djrapitops.plan.system.tasks.proxy.bungee.BungeeTPSCountTimer;
import com.djrapitops.plan.system.tasks.server.PingCountTimerBungee; import com.djrapitops.plan.system.tasks.proxy.bungee.PingCountTimerBungee;
import com.djrapitops.plugin.api.TimeAmount; import com.djrapitops.plugin.api.TimeAmount;
import com.djrapitops.plugin.task.AbsRunnable; import com.djrapitops.plugin.task.AbsRunnable;
import com.djrapitops.plugin.task.RunnableFactory; import com.djrapitops.plugin.task.RunnableFactory;

View File

@ -5,8 +5,8 @@ import com.djrapitops.plan.system.settings.Settings;
import com.djrapitops.plan.system.settings.config.PlanConfig; import com.djrapitops.plan.system.settings.config.PlanConfig;
import com.djrapitops.plan.system.tasks.server.BootAnalysisTask; import com.djrapitops.plan.system.tasks.server.BootAnalysisTask;
import com.djrapitops.plan.system.tasks.server.PeriodicAnalysisTask; import com.djrapitops.plan.system.tasks.server.PeriodicAnalysisTask;
import com.djrapitops.plan.system.tasks.server.PingCountTimerSponge; import com.djrapitops.plan.system.tasks.server.sponge.PingCountTimerSponge;
import com.djrapitops.plan.system.tasks.server.SpongeTPSCountTimer; import com.djrapitops.plan.system.tasks.server.sponge.SpongeTPSCountTimer;
import com.djrapitops.plugin.api.TimeAmount; import com.djrapitops.plugin.api.TimeAmount;
import com.djrapitops.plugin.task.RunnableFactory; import com.djrapitops.plugin.task.RunnableFactory;
import org.spongepowered.api.Sponge; import org.spongepowered.api.Sponge;

View File

@ -7,10 +7,10 @@ package com.djrapitops.plan.system.tasks;
import com.djrapitops.plan.PlanVelocity; import com.djrapitops.plan.PlanVelocity;
import com.djrapitops.plan.system.settings.Settings; import com.djrapitops.plan.system.settings.Settings;
import com.djrapitops.plan.system.settings.config.PlanConfig; import com.djrapitops.plan.system.settings.config.PlanConfig;
import com.djrapitops.plan.system.tasks.server.NetworkPageRefreshTask; import com.djrapitops.plan.system.tasks.proxy.NetworkPageRefreshTask;
import com.djrapitops.plan.system.tasks.server.PingCountTimerBungee; import com.djrapitops.plan.system.tasks.proxy.bungee.PingCountTimerBungee;
import com.djrapitops.plan.system.tasks.server.PingCountTimerVelocity; import com.djrapitops.plan.system.tasks.proxy.velocity.PingCountTimerVelocity;
import com.djrapitops.plan.system.tasks.velocity.VelocityTPSCountTimer; import com.djrapitops.plan.system.tasks.proxy.velocity.VelocityTPSCountTimer;
import com.djrapitops.plugin.api.TimeAmount; import com.djrapitops.plugin.api.TimeAmount;
import com.djrapitops.plugin.task.AbsRunnable; import com.djrapitops.plugin.task.AbsRunnable;
import com.djrapitops.plugin.task.RunnableFactory; import com.djrapitops.plugin.task.RunnableFactory;

View File

@ -1,4 +1,4 @@
package com.djrapitops.plan.system.tasks.server; package com.djrapitops.plan.system.tasks.proxy;
import com.djrapitops.plan.system.info.server.ServerInfo; import com.djrapitops.plan.system.info.server.ServerInfo;
import com.djrapitops.plan.system.webserver.cache.PageId; import com.djrapitops.plan.system.webserver.cache.PageId;

View File

@ -1,4 +1,4 @@
package com.djrapitops.plan.system.tasks.bungee; package com.djrapitops.plan.system.tasks.proxy.bungee;
import com.djrapitops.plan.data.container.TPS; import com.djrapitops.plan.data.container.TPS;
import com.djrapitops.plan.data.container.builders.TPSBuilder; import com.djrapitops.plan.data.container.builders.TPSBuilder;

View File

@ -21,7 +21,7 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE. * SOFTWARE.
*/ */
package com.djrapitops.plan.system.tasks.server; package com.djrapitops.plan.system.tasks.proxy.bungee;
import com.djrapitops.plan.data.store.objects.DateObj; import com.djrapitops.plan.data.store.objects.DateObj;
import com.djrapitops.plan.system.processing.Processing; import com.djrapitops.plan.system.processing.Processing;
@ -78,15 +78,19 @@ public class PingCountTimerBungee extends AbsRunnable implements Listener {
@Override @Override
public void run() { public void run() {
List<UUID> loggedOut = new ArrayList<>();
long time = System.currentTimeMillis(); long time = System.currentTimeMillis();
playerHistory.forEach((uuid, history) -> { Iterator<Map.Entry<UUID, List<DateObj<Integer>>>> iterator = playerHistory.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<UUID, List<DateObj<Integer>>> entry = iterator.next();
UUID uuid = entry.getKey();
List<DateObj<Integer>> history = entry.getValue();
ProxiedPlayer player = ProxyServer.getInstance().getPlayer(uuid); ProxiedPlayer player = ProxyServer.getInstance().getPlayer(uuid);
if (player != null) { if (player != null) {
int ping = getPing(player); int ping = getPing(player);
if (ping < -1 || ping > TimeUnit.SECONDS.toMillis(8L)) { if (ping < -1 || ping > TimeUnit.SECONDS.toMillis(8L)) {
// Don't accept bad values // Don't accept bad values
return; continue;
} }
history.add(new DateObj<>(time, ping)); history.add(new DateObj<>(time, ping));
if (history.size() >= 30) { if (history.size() >= 30) {
@ -94,10 +98,9 @@ public class PingCountTimerBungee extends AbsRunnable implements Listener {
history.clear(); history.clear();
} }
} else { } else {
loggedOut.add(uuid); iterator.remove();
}
} }
});
loggedOut.forEach(playerHistory::remove);
} }
public void addPlayer(ProxiedPlayer player) { public void addPlayer(ProxiedPlayer player) {

View File

@ -21,7 +21,7 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE. * SOFTWARE.
*/ */
package com.djrapitops.plan.system.tasks.server; package com.djrapitops.plan.system.tasks.proxy.velocity;
import com.djrapitops.plan.PlanVelocity; import com.djrapitops.plan.PlanVelocity;
import com.djrapitops.plan.data.store.objects.DateObj; import com.djrapitops.plan.data.store.objects.DateObj;
@ -56,7 +56,7 @@ public class PingCountTimerVelocity extends AbsRunnable {
//https://github.com/bergerkiller/CraftSource/blob/master/net.minecraft.server/PlayerConnection.java#L178 //https://github.com/bergerkiller/CraftSource/blob/master/net.minecraft.server/PlayerConnection.java#L178
public static final int PING_INTERVAL = 2 * 20; public static final int PING_INTERVAL = 2 * 20;
private final Map<UUID, List<DateObj<Integer>>> playerHistory; final Map<UUID, List<DateObj<Integer>>> playerHistory;
private final PlanVelocity plugin; private final PlanVelocity plugin;
private final PlanConfig config; private final PlanConfig config;
@ -82,15 +82,19 @@ public class PingCountTimerVelocity extends AbsRunnable {
@Override @Override
public void run() { public void run() {
List<UUID> loggedOut = new ArrayList<>();
long time = System.currentTimeMillis(); long time = System.currentTimeMillis();
playerHistory.forEach((uuid, history) -> { Iterator<Map.Entry<UUID, List<DateObj<Integer>>>> iterator = playerHistory.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<UUID, List<DateObj<Integer>>> entry = iterator.next();
UUID uuid = entry.getKey();
List<DateObj<Integer>> history = entry.getValue();
Player player = plugin.getProxy().getPlayer(uuid).orElse(null); Player player = plugin.getProxy().getPlayer(uuid).orElse(null);
if (player != null) { if (player != null) {
int ping = getPing(player); int ping = getPing(player);
if (ping < -1 || ping > TimeUnit.SECONDS.toMillis(8L)) { if (ping < -1 || ping > TimeUnit.SECONDS.toMillis(8L)) {
// Don't accept bad values // Don't accept bad values
return; continue;
} }
history.add(new DateObj<>(time, ping)); history.add(new DateObj<>(time, ping));
if (history.size() >= 30) { if (history.size() >= 30) {
@ -98,13 +102,12 @@ public class PingCountTimerVelocity extends AbsRunnable {
history.clear(); history.clear();
} }
} else { } else {
loggedOut.add(uuid); iterator.remove();
}
} }
});
loggedOut.forEach(playerHistory::remove);
} }
public void addPlayer(Player player) { void addPlayer(Player player) {
playerHistory.put(player.getUniqueId(), new ArrayList<>()); playerHistory.put(player.getUniqueId(), new ArrayList<>());
} }

View File

@ -1,4 +1,4 @@
package com.djrapitops.plan.system.tasks.velocity; package com.djrapitops.plan.system.tasks.proxy.velocity;
import com.djrapitops.plan.data.container.TPS; import com.djrapitops.plan.data.container.TPS;
import com.djrapitops.plan.data.container.builders.TPSBuilder; import com.djrapitops.plan.data.container.builders.TPSBuilder;

View File

@ -1,4 +1,4 @@
package com.djrapitops.plan.system.tasks.server; package com.djrapitops.plan.system.tasks.server.bukkit;
import com.djrapitops.plan.Plan; import com.djrapitops.plan.Plan;
import com.djrapitops.plan.data.container.TPS; import com.djrapitops.plan.data.container.TPS;

View File

@ -1,4 +1,4 @@
package com.djrapitops.plan.system.tasks.server; package com.djrapitops.plan.system.tasks.server.bukkit;
import com.djrapitops.plan.Plan; import com.djrapitops.plan.Plan;
import com.djrapitops.plan.data.container.TPS; import com.djrapitops.plan.data.container.TPS;

View File

@ -21,7 +21,7 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE. * SOFTWARE.
*/ */
package com.djrapitops.plan.system.tasks.server; package com.djrapitops.plan.system.tasks.server.bukkit;
import com.djrapitops.plan.data.store.objects.DateObj; import com.djrapitops.plan.data.store.objects.DateObj;
import com.djrapitops.plan.system.processing.Processing; import com.djrapitops.plan.system.processing.Processing;
@ -131,15 +131,19 @@ public class PingCountTimerBukkit extends AbsRunnable implements Listener {
@Override @Override
public void run() { public void run() {
List<UUID> loggedOut = new ArrayList<>();
long time = System.currentTimeMillis(); long time = System.currentTimeMillis();
playerHistory.forEach((uuid, history) -> { Iterator<Map.Entry<UUID, List<DateObj<Integer>>>> iterator = playerHistory.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<UUID, List<DateObj<Integer>>> entry = iterator.next();
UUID uuid = entry.getKey();
List<DateObj<Integer>> history = entry.getValue();
Player player = Bukkit.getPlayer(uuid); Player player = Bukkit.getPlayer(uuid);
if (player != null) { if (player != null) {
int ping = getPing(player); int ping = getPing(player);
if (ping < -1 || ping > TimeUnit.SECONDS.toMillis(8L)) { if (ping < -1 || ping > TimeUnit.SECONDS.toMillis(8L)) {
// Don't accept bad values // Don't accept bad values
return; continue;
} }
history.add(new DateObj<>(time, ping)); history.add(new DateObj<>(time, ping));
if (history.size() >= 30) { if (history.size() >= 30) {
@ -147,10 +151,9 @@ public class PingCountTimerBukkit extends AbsRunnable implements Listener {
history.clear(); history.clear();
} }
} else { } else {
loggedOut.add(uuid); iterator.remove();
}
} }
});
loggedOut.forEach(playerHistory::remove);
} }
public void addPlayer(Player player) { public void addPlayer(Player player) {

View File

@ -21,7 +21,7 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE. * SOFTWARE.
*/ */
package com.djrapitops.plan.system.tasks.server; package com.djrapitops.plan.system.tasks.server.sponge;
import com.djrapitops.plan.data.store.objects.DateObj; import com.djrapitops.plan.data.store.objects.DateObj;
import com.djrapitops.plan.system.processing.Processing; import com.djrapitops.plan.system.processing.Processing;
@ -74,15 +74,19 @@ public class PingCountTimerSponge extends AbsRunnable {
@Override @Override
public void run() { public void run() {
List<UUID> loggedOut = new ArrayList<>();
long time = System.currentTimeMillis(); long time = System.currentTimeMillis();
playerHistory.forEach((uuid, history) -> { Iterator<Map.Entry<UUID, List<DateObj<Integer>>>> iterator = playerHistory.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<UUID, List<DateObj<Integer>>> entry = iterator.next();
UUID uuid = entry.getKey();
List<DateObj<Integer>> history = entry.getValue();
Optional<Player> player = Sponge.getServer().getPlayer(uuid); Optional<Player> player = Sponge.getServer().getPlayer(uuid);
if (player.isPresent()) { if (player.isPresent()) {
int ping = getPing(player.get()); int ping = getPing(player.get());
if (ping < -1 || ping > TimeUnit.SECONDS.toMillis(8L)) { if (ping < -1 || ping > TimeUnit.SECONDS.toMillis(8L)) {
// Don't accept bad values // Don't accept bad values
return; continue;
} }
history.add(new DateObj<>(time, ping)); history.add(new DateObj<>(time, ping));
if (history.size() >= 30) { if (history.size() >= 30) {
@ -90,10 +94,9 @@ public class PingCountTimerSponge extends AbsRunnable {
history.clear(); history.clear();
} }
} else { } else {
loggedOut.add(uuid); iterator.remove();
}
} }
});
loggedOut.forEach(playerHistory::remove);
} }
public void addPlayer(Player player) { public void addPlayer(Player player) {

View File

@ -1,4 +1,4 @@
package com.djrapitops.plan.system.tasks.server; package com.djrapitops.plan.system.tasks.server.sponge;
import com.djrapitops.plan.PlanSponge; import com.djrapitops.plan.PlanSponge;
import com.djrapitops.plan.data.container.TPS; import com.djrapitops.plan.data.container.TPS;

View File

@ -0,0 +1,54 @@
package com.djrapitops.plan.system.tasks.proxy.velocity;
import com.djrapitops.plan.PlanVelocity;
import com.velocitypowered.api.proxy.Player;
import com.velocitypowered.api.proxy.ProxyServer;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;
import utilities.TestConstants;
import utilities.mocks.PlanVelocityMocker;
import java.util.Optional;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.when;
/**
* Tests for {@link PingCountTimerVelocity}.
*
* @author Rsl1122
*/
public class PingCountTimerVelocityTest {
private PlanVelocity plugin;
private Player player;
@Before
public void setUp() {
PlanVelocityMocker mocker = PlanVelocityMocker.setUp()
.withProxy();
plugin = mocker.getPlanMock();
player = Mockito.mock(Player.class);
when(player.getPing()).thenReturn(5L);
when(player.getUniqueId()).thenReturn(TestConstants.PLAYER_ONE_UUID);
ProxyServer proxy = plugin.getProxy();
when(proxy.getPlayer(TestConstants.PLAYER_ONE_UUID)).thenReturn(Optional.empty());
}
@Test
public void offlinePlayerIsRemovedFromPlayerHistory() {
PingCountTimerVelocity counter = new PingCountTimerVelocity(plugin, null, null, null, null);
assertTrue(counter.playerHistory.isEmpty());
counter.addPlayer(player);
assertFalse(counter.playerHistory.isEmpty());
counter.run();
assertTrue(counter.playerHistory.isEmpty());
}
}