Files
i2p 773d05f8f1
Pulsar .NET 9.0 Windows Release / build (push) Waiting to run
Mirror to Codeberg and Gitea / mirror (push) Waiting to run
initial commit
2026-08-27 10:57:58 -06:00

105 lines
3.0 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
namespace Pulsar.Server.Statistics
{
public sealed class ClientStatisticsSnapshot
{
public ClientStatisticsSnapshot(
int totalClients,
int onlineClients,
int offlineClients,
int newClientsLast7Days,
IReadOnlyList<DailyCount> newClientsByDay,
IReadOnlyList<CategoryCount> clientsByCountry,
IReadOnlyList<CategoryCount> clientsByOperatingSystem,
IReadOnlyList<CategoryCount> topTags,
DateTime generatedAtUtc,
string? errorMessage = null)
{
TotalClients = totalClients;
OnlineClients = onlineClients;
OfflineClients = offlineClients;
NewClientsLast7Days = newClientsLast7Days;
NewClientsByDay = newClientsByDay ?? Array.Empty<DailyCount>();
ClientsByCountry = clientsByCountry ?? Array.Empty<CategoryCount>();
ClientsByOperatingSystem = clientsByOperatingSystem ?? Array.Empty<CategoryCount>();
TopTags = topTags ?? Array.Empty<CategoryCount>();
GeneratedAtUtc = generatedAtUtc;
ErrorMessage = string.IsNullOrWhiteSpace(errorMessage) ? null : errorMessage;
}
public int TotalClients { get; }
public int OnlineClients { get; }
public int OfflineClients { get; }
public int NewClientsLast7Days { get; }
public IReadOnlyList<DailyCount> NewClientsByDay { get; }
public IReadOnlyList<CategoryCount> ClientsByCountry { get; }
public IReadOnlyList<CategoryCount> ClientsByOperatingSystem { get; }
public IReadOnlyList<CategoryCount> TopTags { get; }
public DateTime GeneratedAtUtc { get; }
public string? ErrorMessage { get; }
public bool HasError => !string.IsNullOrWhiteSpace(ErrorMessage);
public static ClientStatisticsSnapshot CreateError(string message)
{
return new ClientStatisticsSnapshot(
0,
0,
0,
0,
Array.Empty<DailyCount>(),
Array.Empty<CategoryCount>(),
Array.Empty<CategoryCount>(),
Array.Empty<CategoryCount>(),
DateTime.UtcNow,
message);
}
}
public sealed class DailyCount
{
public DailyCount(DateTime date, int count)
{
Date = date;
Count = count;
}
public DateTime Date { get; }
public int Count { get; }
}
public sealed class CategoryCount
{
public CategoryCount(string label, int count, double share)
{
Label = string.IsNullOrWhiteSpace(label) ? "Unknown" : label;
Count = count;
Share = share;
}
public string Label { get; }
public int Count { get; }
public double Share { get; }
public override string ToString()
{
return $"{Label} ({Count})";
}
}
}