[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,
PluginBridgeModule.Sponge.class
})
interface PlanSpongeComponent {
public interface PlanSpongeComponent {
PlanCommand planCommand();

View File

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

View File

@ -7,7 +7,11 @@ package com.djrapitops.plan.system.tasks;
import com.djrapitops.plan.Plan;
import com.djrapitops.plan.system.settings.Settings;
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.TimeAmount;
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.system.settings.Settings;
import com.djrapitops.plan.system.settings.config.PlanConfig;
import com.djrapitops.plan.system.tasks.bungee.BungeeTPSCountTimer;
import com.djrapitops.plan.system.tasks.server.NetworkPageRefreshTask;
import com.djrapitops.plan.system.tasks.server.PingCountTimerBungee;
import com.djrapitops.plan.system.tasks.proxy.NetworkPageRefreshTask;
import com.djrapitops.plan.system.tasks.proxy.bungee.BungeeTPSCountTimer;
import com.djrapitops.plan.system.tasks.proxy.bungee.PingCountTimerBungee;
import com.djrapitops.plugin.api.TimeAmount;
import com.djrapitops.plugin.task.AbsRunnable;
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.tasks.server.BootAnalysisTask;
import com.djrapitops.plan.system.tasks.server.PeriodicAnalysisTask;
import com.djrapitops.plan.system.tasks.server.PingCountTimerSponge;
import com.djrapitops.plan.system.tasks.server.SpongeTPSCountTimer;
import com.djrapitops.plan.system.tasks.server.sponge.PingCountTimerSponge;
import com.djrapitops.plan.system.tasks.server.sponge.SpongeTPSCountTimer;
import com.djrapitops.plugin.api.TimeAmount;
import com.djrapitops.plugin.task.RunnableFactory;
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.system.settings.Settings;
import com.djrapitops.plan.system.settings.config.PlanConfig;
import com.djrapitops.plan.system.tasks.server.NetworkPageRefreshTask;
import com.djrapitops.plan.system.tasks.server.PingCountTimerBungee;
import com.djrapitops.plan.system.tasks.server.PingCountTimerVelocity;
import com.djrapitops.plan.system.tasks.velocity.VelocityTPSCountTimer;
import com.djrapitops.plan.system.tasks.proxy.NetworkPageRefreshTask;
import com.djrapitops.plan.system.tasks.proxy.bungee.PingCountTimerBungee;
import com.djrapitops.plan.system.tasks.proxy.velocity.PingCountTimerVelocity;
import com.djrapitops.plan.system.tasks.proxy.velocity.VelocityTPSCountTimer;
import com.djrapitops.plugin.api.TimeAmount;
import com.djrapitops.plugin.task.AbsRunnable;
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.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.builders.TPSBuilder;

View File

@ -21,7 +21,7 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* 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.system.processing.Processing;
@ -78,15 +78,19 @@ public class PingCountTimerBungee extends AbsRunnable implements Listener {
@Override
public void run() {
List<UUID> loggedOut = new ArrayList<>();
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);
if (player != null) {
int ping = getPing(player);
if (ping < -1 || ping > TimeUnit.SECONDS.toMillis(8L)) {
// Don't accept bad values
return;
continue;
}
history.add(new DateObj<>(time, ping));
if (history.size() >= 30) {
@ -94,10 +98,9 @@ public class PingCountTimerBungee extends AbsRunnable implements Listener {
history.clear();
}
} else {
loggedOut.add(uuid);
iterator.remove();
}
});
loggedOut.forEach(playerHistory::remove);
}
}
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
* 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.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
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 PlanConfig config;
@ -82,15 +82,19 @@ public class PingCountTimerVelocity extends AbsRunnable {
@Override
public void run() {
List<UUID> loggedOut = new ArrayList<>();
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);
if (player != null) {
int ping = getPing(player);
if (ping < -1 || ping > TimeUnit.SECONDS.toMillis(8L)) {
// Don't accept bad values
return;
continue;
}
history.add(new DateObj<>(time, ping));
if (history.size() >= 30) {
@ -98,13 +102,12 @@ public class PingCountTimerVelocity extends AbsRunnable {
history.clear();
}
} 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<>());
}

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.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.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.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
* 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.system.processing.Processing;
@ -131,15 +131,19 @@ public class PingCountTimerBukkit extends AbsRunnable implements Listener {
@Override
public void run() {
List<UUID> loggedOut = new ArrayList<>();
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);
if (player != null) {
int ping = getPing(player);
if (ping < -1 || ping > TimeUnit.SECONDS.toMillis(8L)) {
// Don't accept bad values
return;
continue;
}
history.add(new DateObj<>(time, ping));
if (history.size() >= 30) {
@ -147,10 +151,9 @@ public class PingCountTimerBukkit extends AbsRunnable implements Listener {
history.clear();
}
} else {
loggedOut.add(uuid);
iterator.remove();
}
});
loggedOut.forEach(playerHistory::remove);
}
}
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
* 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.system.processing.Processing;
@ -74,15 +74,19 @@ public class PingCountTimerSponge extends AbsRunnable {
@Override
public void run() {
List<UUID> loggedOut = new ArrayList<>();
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);
if (player.isPresent()) {
int ping = getPing(player.get());
if (ping < -1 || ping > TimeUnit.SECONDS.toMillis(8L)) {
// Don't accept bad values
return;
continue;
}
history.add(new DateObj<>(time, ping));
if (history.size() >= 30) {
@ -90,10 +94,9 @@ public class PingCountTimerSponge extends AbsRunnable {
history.clear();
}
} else {
loggedOut.add(uuid);
iterator.remove();
}
});
loggedOut.forEach(playerHistory::remove);
}
}
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.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());
}
}