Now /ping also includes lowest ping

This commit is contained in:
UnknownShadow200 2017-06-23 20:48:21 +10:00
parent cea92a00b0
commit 58830d3d13

View File

@ -23,7 +23,12 @@ namespace MCGalaxy.Network {
public struct PingEntry { public struct PingEntry {
public DateTime TimeSent, TimeReceived; public DateTime TimeSent, TimeReceived;
public ushort Data; public ushort Data;
public double Latency { get {
// Half, because received->reply time is actually twice time it takes to send data
return (TimeReceived - TimeSent).TotalMilliseconds * 0.5;
} }
} }
public PingEntry[] Entries = new PingEntry[10]; public PingEntry[] Entries = new PingEntry[10];
@ -45,9 +50,9 @@ namespace MCGalaxy.Network {
} }
ushort SetTwoWayPing(int i, ushort prev) { ushort SetTwoWayPing(int i, ushort prev) {
Entries[i].Data = (ushort)(prev + 1); Entries[i].Data = (ushort)(prev + 1);
Entries[i].TimeSent = DateTime.UtcNow; Entries[i].TimeSent = DateTime.UtcNow;
return (ushort)(prev + 1); return (ushort)(prev + 1);
} }
public void Update(ushort data) { public void Update(ushort data) {
@ -59,39 +64,42 @@ namespace MCGalaxy.Network {
} }
/// <summary> Gets best ping in milliseconds, or 0 if no ping measures. </summary>
public double BestPingMilliseconds() {
double totalMs = 100000000;
foreach (PingEntry ping in Entries) {
if (ping.TimeSent.Ticks == 0 || ping.TimeReceived.Ticks == 0) continue;
totalMs = Math.Min(totalMs, ping.Latency);
}
return totalMs;
}
/// <summary> Gets average ping in milliseconds, or 0 if no ping measures. </summary> /// <summary> Gets average ping in milliseconds, or 0 if no ping measures. </summary>
public double AveragePingMilliseconds() { public double AveragePingMilliseconds() {
double totalMs = 0; double totalMs = 0;
int measures = 0; int measures = 0;
foreach (PingEntry ping in Entries) { foreach (PingEntry ping in Entries) {
if (ping.TimeSent.Ticks == 0 || ping.TimeReceived.Ticks == 0) continue; if (ping.TimeSent.Ticks == 0 || ping.TimeReceived.Ticks == 0) continue;
totalMs += ping.Latency; measures++;
// Half, because received->reply time is actually twice time it takes to send data
totalMs += (ping.TimeReceived - ping.TimeSent).TotalMilliseconds * 0.5;
measures++;
} }
return measures == 0 ? 0 : (totalMs / measures); return measures == 0 ? 0 : (totalMs / measures);
} }
/// <summary> Gets worst ping in milliseconds, or 0 if no ping measures. </summary> /// <summary> Gets worst ping in milliseconds, or 0 if no ping measures. </summary>
public double WorstPingMilliseconds() { public double WorstPingMilliseconds() {
double totalMs = 0; double totalMs = 0;
foreach (PingEntry ping in Entries) { foreach (PingEntry ping in Entries) {
if (ping.TimeSent.Ticks == 0 || ping.TimeReceived.Ticks == 0) continue; if (ping.TimeSent.Ticks == 0 || ping.TimeReceived.Ticks == 0) continue;
totalMs = Math.Max(totalMs, ping.Latency);
double ms = (ping.TimeReceived - ping.TimeSent).TotalMilliseconds * 0.5;
totalMs = Math.Max(totalMs, ms);
} }
return totalMs; return totalMs;
} }
public string Format() { public string Format() {
return String.Format("Worst ping {0}ms, average {1}ms", return String.Format("Lowest ping {0}ms, average {1} ms, highest {2}ms",
WorstPingMilliseconds().ToString("N0"), (int)BestPingMilliseconds(),
AveragePingMilliseconds().ToString("N0")); (int)AveragePingMilliseconds(),
(int)WorstPingMilliseconds());
} }
} }
} }