Files
2016-03-01 22:25:32 +08:00

96 lines
3.5 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Shadowsocks.Model
{
// Simple processed records for a short period of time
public class StatisticsRecord
{
public DateTime Timestamp { get; set; } = DateTime.Now;
public string ServerIdentifier { get; set; }
// in ping-only records, these fields would be null
public int? AverageLatency;
public int? MinLatency;
public int? MaxLatency;
private bool EmptyLatencyData => (AverageLatency == null) && (MinLatency == null) && (MaxLatency == null);
public int? AverageInboundSpeed;
public int? MinInboundSpeed;
public int? MaxInboundSpeed;
private bool EmptyInboundSpeedData
=> (AverageInboundSpeed == null) && (MinInboundSpeed == null) && (MaxInboundSpeed == null);
public int? AverageOutboundSpeed;
public int? MinOutboundSpeed;
public int? MaxOutboundSpeed;
private bool EmptyOutboundSpeedData
=> (AverageOutboundSpeed == null) && (MinOutboundSpeed == null) && (MaxOutboundSpeed == null);
// if user disabled ping test, response would be null
public int? AverageResponse;
public int? MinResponse;
public int? MaxResponse;
public float? PackageLoss;
private bool EmptyResponseData
=> (AverageResponse == null) && (MinResponse == null) && (MaxResponse == null) && (PackageLoss == null);
public bool IsEmptyData() {
return EmptyInboundSpeedData && EmptyOutboundSpeedData && EmptyResponseData && EmptyLatencyData;
}
public StatisticsRecord()
{
}
public StatisticsRecord(string identifier, ICollection<int> inboundSpeedRecords, ICollection<int> outboundSpeedRecords, ICollection<int> latencyRecords)
{
ServerIdentifier = identifier;
var inbound = inboundSpeedRecords?.Where(s => s > 0).ToList();
if (inbound != null && inbound.Any())
{
AverageInboundSpeed = (int) inbound.Average();
MinInboundSpeed = inbound.Min();
MaxInboundSpeed = inbound.Max();
}
var outbound = outboundSpeedRecords?.Where(s => s > 0).ToList();
if (outbound!= null && outbound.Any())
{
AverageOutboundSpeed = (int) outbound.Average();
MinOutboundSpeed = outbound.Min();
MaxOutboundSpeed = outbound.Max();
}
var latency = latencyRecords?.Where(s => s > 0).ToList();
if (latency!= null && latency.Any())
{
AverageLatency = (int) latency.Average();
MinLatency = latency.Min();
MaxLatency = latency.Max();
}
}
public StatisticsRecord(string identifier, ICollection<int?> responseRecords)
{
ServerIdentifier = identifier;
SetResponse(responseRecords);
}
public void SetResponse(ICollection<int?> responseRecords)
{
if (responseRecords == null) return;
var records = responseRecords.Where(response => response != null).Select(response => response.Value).ToList();
if (!records.Any()) return;
AverageResponse = (int?) records.Average();
MinResponse = records.Min();
MaxResponse = records.Max();
PackageLoss = responseRecords.Count(response => response != null)/(float) responseRecords.Count;
}
}
}