using Pulsar.Common.Messages;
using Pulsar.Common.Messages.Other;
using Pulsar.Common.Networking;
using Pulsar.Server.Networking;
using System;
using System.Diagnostics;
namespace Pulsar.Server.Messages
{
///
/// Handles ping messages for measuring network latency.
///
public class PingHandler : MessageProcessorBase
{
///
/// The client which is associated with this ping handler.
///
private readonly Client _client;
///
/// Stores the timestamp when the ping request was sent.
///
private long _pingRequestTimestamp;
///
/// Initializes a new instance of the class using the given client.
///
/// The associated client.
public PingHandler(Client client) : base(true)
{
_client = client;
}
///
public override bool CanExecute(IMessage message) => message is PingResponse;
///
public override bool CanExecuteFrom(ISender sender) => _client.Equals(sender);
///
public override void Execute(ISender sender, IMessage message)
{
switch (message)
{
case PingResponse pingResponse:
Execute(sender, pingResponse);
break;
}
}
private void Execute(ISender client, PingResponse message)
{
double pingMs = 0;
if (_pingRequestTimestamp != 0)
{
long freq = Stopwatch.Frequency;
long now = Stopwatch.GetTimestamp();
pingMs = ((now - _pingRequestTimestamp) * 1000.0) / freq;
_pingRequestTimestamp = 0;
}
OnReport((int)Math.Round(pingMs));
}
///
/// Sends a ping request to the client.
///
public void SendPing()
{
_pingRequestTimestamp = Stopwatch.GetTimestamp();
_client.Send(new PingRequest());
}
}
}