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()); } } }