This commit is contained in:
HueByte
2026-07-17 20:24:25 +00:00
parent a6bf50c567
commit ffac9f208a
23 changed files with 3937 additions and 46 deletions
@@ -0,0 +1,757 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Class ServerStatsReport | EchoHub Documentation </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Class ServerStatsReport | EchoHub Documentation ">
<meta name="description" content="A snapshot of server activity over one reporting window, produced periodically by the stats-report background job. Each report is logged as pretty-printed JSON and persisted for historical trend analysis. The window is &amp;quot;since the previous report&amp;quot; (or since startup for the first report of a run).">
<link rel="icon" href="../../images/hue_icon.svg">
<link rel="stylesheet" href="../../public/docfx.min.css">
<link rel="stylesheet" href="../../public/main.css">
<meta name="docfx:navrel" content="../../toc.html">
<meta name="docfx:tocrel" content="../toc.html">
<meta name="docfx:rel" content="../../">
<meta name="docfx:docurl" content="https://github.com/HueByte/EchoHub/new/master/apiSpec/new?filename=EchoHub_Core_Models_ServerStatsReport.md&amp;value=---%0Auid%3A%20EchoHub.Core.Models.ServerStatsReport%0Asummary%3A%20&#39;*You%20can%20override%20summary%20for%20the%20API%20here%20using%20*MARKDOWN*%20syntax&#39;%0A---%0A%0A*Please%20type%20below%20more%20information%20about%20this%20API%3A*%0A%0A">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &quot;{query}&quot;">
<meta name="loc:searchNoResults" content="No results for &quot;{query}&quot;">
<meta name="loc:tocFilter" content="Filter by title">
<meta name="loc:nextArticle" content="Next">
<meta name="loc:prevArticle" content="Previous">
<meta name="loc:themeLight" content="Light">
<meta name="loc:themeDark" content="Dark">
<meta name="loc:themeAuto" content="Auto">
<meta name="loc:changeTheme" content="Change theme">
<meta name="loc:copy" content="Copy">
<meta name="loc:downloadPdf" content="Download PDF">
<script type="module" src="./../../public/docfx.min.js"></script>
<script>
const theme = localStorage.getItem('theme') || 'auto'
document.documentElement.setAttribute('data-bs-theme', theme === 'auto' ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light') : theme)
</script>
</head>
<body class="tex2jax_ignore" data-layout="" data-yaml-mime="ManagedReference">
<header class="bg-body border-bottom">
<nav id="autocollapse" class="navbar navbar-expand-md" role="navigation">
<div class="container-xxl flex-nowrap">
<a class="navbar-brand" href="../../index.html">
<img id="logo" class="svg" src="../../images/hue_icon.svg" alt="EchoHub">
EchoHub
</a>
<button class="btn btn-lg d-md-none border-0" type="button" data-bs-toggle="collapse" data-bs-target="#navpanel" aria-controls="navpanel" aria-expanded="false" aria-label="Toggle navigation">
<i class="bi bi-three-dots"></i>
</button>
<div class="collapse navbar-collapse" id="navpanel">
<div id="navbar">
<form class="search" role="search" id="search">
<i class="bi bi-search"></i>
<input class="form-control" id="search-query" type="search" disabled placeholder="Search" autocomplete="off" aria-label="Search">
</form>
</div>
</div>
</div>
</nav>
</header>
<main class="container-xxl">
<div class="toc-offcanvas">
<div class="offcanvas-md offcanvas-start" tabindex="-1" id="tocOffcanvas" aria-labelledby="tocOffcanvasLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="tocOffcanvasLabel">Table of Contents</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" data-bs-target="#tocOffcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<nav class="toc" id="toc"></nav>
</div>
</div>
</div>
<div class="content">
<div class="actionbar">
<button class="btn btn-lg border-0 d-md-none" type="button" data-bs-toggle="offcanvas" data-bs-target="#tocOffcanvas" aria-controls="tocOffcanvas" aria-expanded="false" aria-label="Show table of contents">
<i class="bi bi-list"></i>
</button>
<nav id="breadcrumb"></nav>
</div>
<article data-uid="EchoHub.Core.Models.ServerStatsReport">
<h1 id="EchoHub_Core_Models_ServerStatsReport" data-uid="EchoHub.Core.Models.ServerStatsReport" class="text-break">
Class ServerStatsReport <a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Core/Models/ServerStatsReport.cs"><i class="bi bi-code-slash"></i></a>
</h1>
<div class="facts text-secondary">
<dl><dt>Namespace</dt><dd><a class="xref" href="EchoHub.html">EchoHub</a>.<a class="xref" href="EchoHub.Core.html">Core</a>.<a class="xref" href="EchoHub.Core.Models.html">Models</a></dd></dl>
<dl><dt>Assembly</dt><dd>EchoHub.Core.dll</dd></dl>
</div>
<div class="markdown summary"><p>A snapshot of server activity over one reporting window, produced periodically by the
stats-report background job. Each report is logged as pretty-printed JSON and persisted
for historical trend analysis. The window is &quot;since the previous report&quot; (or since startup
for the first report of a run).</p>
</div>
<div class="markdown conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public class ServerStatsReport</code></pre>
</div>
<dl class="typelist inheritance">
<dt>Inheritance</dt>
<dd>
<div><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object">object</a></div>
<div><span class="xref">ServerStatsReport</span></div>
</dd>
</dl>
<dl class="typelist inheritedMembers">
<dt>Inherited Members</dt>
<dd>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.gettype">object.GetType()</a>
</div>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.memberwiseclone">object.MemberwiseClone()</a>
</div>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.tostring">object.ToString()</a>
</div>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals(system-object)">object.Equals(object)</a>
</div>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals(system-object-system-object)">object.Equals(object, object)</a>
</div>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.referenceequals">object.ReferenceEquals(object, object)</a>
</div>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.gethashcode">object.GetHashCode()</a>
</div>
</dd></dl>
<h2 class="section" id="constructors">Constructors
</h2>
<a id="EchoHub_Core_Models_ServerStatsReport__ctor_" data-uid="EchoHub.Core.Models.ServerStatsReport.#ctor*"></a>
<h3 id="EchoHub_Core_Models_ServerStatsReport__ctor" data-uid="EchoHub.Core.Models.ServerStatsReport.#ctor">
ServerStatsReport()
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Core/Models/ServerStatsReport.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"></div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public ServerStatsReport()</code></pre>
</div>
<h2 class="section" id="properties">Properties
</h2>
<a id="EchoHub_Core_Models_ServerStatsReport_ActiveMembers_" data-uid="EchoHub.Core.Models.ServerStatsReport.ActiveMembers*"></a>
<h3 id="EchoHub_Core_Models_ServerStatsReport_ActiveMembers" data-uid="EchoHub.Core.Models.ServerStatsReport.ActiveMembers">
ActiveMembers
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Core/Models/ServerStatsReport.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"><p>Distinct users who sent at least one message during the window.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public int ActiveMembers { get; set; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.int32">int</a></dt>
<dd></dd>
</dl>
<a id="EchoHub_Core_Models_ServerStatsReport_Bans_" data-uid="EchoHub.Core.Models.ServerStatsReport.Bans*"></a>
<h3 id="EchoHub_Core_Models_ServerStatsReport_Bans" data-uid="EchoHub.Core.Models.ServerStatsReport.Bans">
Bans
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Core/Models/ServerStatsReport.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"><p>Users banned during the window.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public int Bans { get; set; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.int32">int</a></dt>
<dd></dd>
</dl>
<a id="EchoHub_Core_Models_ServerStatsReport_BytesUploaded_" data-uid="EchoHub.Core.Models.ServerStatsReport.BytesUploaded*"></a>
<h3 id="EchoHub_Core_Models_ServerStatsReport_BytesUploaded" data-uid="EchoHub.Core.Models.ServerStatsReport.BytesUploaded">
BytesUploaded
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Core/Models/ServerStatsReport.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"><p>Total bytes across all attachments uploaded during the window.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public long BytesUploaded { get; set; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.int64">long</a></dt>
<dd></dd>
</dl>
<a id="EchoHub_Core_Models_ServerStatsReport_Connections_" data-uid="EchoHub.Core.Models.ServerStatsReport.Connections*"></a>
<h3 id="EchoHub_Core_Models_ServerStatsReport_Connections" data-uid="EchoHub.Core.Models.ServerStatsReport.Connections">
Connections
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Core/Models/ServerStatsReport.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"><p>Session connects during the window (per-connection, across SignalR + IRC).</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public int Connections { get; set; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.int32">int</a></dt>
<dd></dd>
</dl>
<a id="EchoHub_Core_Models_ServerStatsReport_Disconnections_" data-uid="EchoHub.Core.Models.ServerStatsReport.Disconnections*"></a>
<h3 id="EchoHub_Core_Models_ServerStatsReport_Disconnections" data-uid="EchoHub.Core.Models.ServerStatsReport.Disconnections">
Disconnections
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Core/Models/ServerStatsReport.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"><p>Session disconnects during the window (&quot;members left&quot; sessions).</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public int Disconnections { get; set; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.int32">int</a></dt>
<dd></dd>
</dl>
<a id="EchoHub_Core_Models_ServerStatsReport_FilesUploaded_" data-uid="EchoHub.Core.Models.ServerStatsReport.FilesUploaded*"></a>
<h3 id="EchoHub_Core_Models_ServerStatsReport_FilesUploaded" data-uid="EchoHub.Core.Models.ServerStatsReport.FilesUploaded">
FilesUploaded
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Core/Models/ServerStatsReport.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"><p>Attachments (files/images/audio) uploaded during the window.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public int FilesUploaded { get; set; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.int32">int</a></dt>
<dd></dd>
</dl>
<a id="EchoHub_Core_Models_ServerStatsReport_GeneratedAt_" data-uid="EchoHub.Core.Models.ServerStatsReport.GeneratedAt*"></a>
<h3 id="EchoHub_Core_Models_ServerStatsReport_GeneratedAt" data-uid="EchoHub.Core.Models.ServerStatsReport.GeneratedAt">
GeneratedAt
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Core/Models/ServerStatsReport.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"><p>When this report was generated (equals <a class="xref" href="EchoHub.Core.Models.ServerStatsReport.html#EchoHub_Core_Models_ServerStatsReport_PeriodEnd">PeriodEnd</a>).</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public DateTimeOffset GeneratedAt { get; set; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.datetimeoffset">DateTimeOffset</a></dt>
<dd></dd>
</dl>
<a id="EchoHub_Core_Models_ServerStatsReport_Id_" data-uid="EchoHub.Core.Models.ServerStatsReport.Id*"></a>
<h3 id="EchoHub_Core_Models_ServerStatsReport_Id" data-uid="EchoHub.Core.Models.ServerStatsReport.Id">
Id
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Core/Models/ServerStatsReport.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"></div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public Guid Id { get; set; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.guid">Guid</a></dt>
<dd></dd>
</dl>
<a id="EchoHub_Core_Models_ServerStatsReport_Kicks_" data-uid="EchoHub.Core.Models.ServerStatsReport.Kicks*"></a>
<h3 id="EchoHub_Core_Models_ServerStatsReport_Kicks" data-uid="EchoHub.Core.Models.ServerStatsReport.Kicks">
Kicks
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Core/Models/ServerStatsReport.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"><p>Users kicked during the window.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public int Kicks { get; set; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.int32">int</a></dt>
<dd></dd>
</dl>
<a id="EchoHub_Core_Models_ServerStatsReport_MessagesSent_" data-uid="EchoHub.Core.Models.ServerStatsReport.MessagesSent*"></a>
<h3 id="EchoHub_Core_Models_ServerStatsReport_MessagesSent" data-uid="EchoHub.Core.Models.ServerStatsReport.MessagesSent">
MessagesSent
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Core/Models/ServerStatsReport.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"><p>Messages sent during the window.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public int MessagesSent { get; set; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.int32">int</a></dt>
<dd></dd>
</dl>
<a id="EchoHub_Core_Models_ServerStatsReport_NewMembers_" data-uid="EchoHub.Core.Models.ServerStatsReport.NewMembers*"></a>
<h3 id="EchoHub_Core_Models_ServerStatsReport_NewMembers" data-uid="EchoHub.Core.Models.ServerStatsReport.NewMembers">
NewMembers
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Core/Models/ServerStatsReport.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"><p>Accounts registered during the window (&quot;new members joined&quot;).</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public int NewMembers { get; set; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.int32">int</a></dt>
<dd></dd>
</dl>
<a id="EchoHub_Core_Models_ServerStatsReport_OnlineNow_" data-uid="EchoHub.Core.Models.ServerStatsReport.OnlineNow*"></a>
<h3 id="EchoHub_Core_Models_ServerStatsReport_OnlineNow" data-uid="EchoHub.Core.Models.ServerStatsReport.OnlineNow">
OnlineNow
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Core/Models/ServerStatsReport.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"><p>Distinct users online at window end.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public int OnlineNow { get; set; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.int32">int</a></dt>
<dd></dd>
</dl>
<a id="EchoHub_Core_Models_ServerStatsReport_PeakOnline_" data-uid="EchoHub.Core.Models.ServerStatsReport.PeakOnline*"></a>
<h3 id="EchoHub_Core_Models_ServerStatsReport_PeakOnline" data-uid="EchoHub.Core.Models.ServerStatsReport.PeakOnline">
PeakOnline
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Core/Models/ServerStatsReport.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"><p>Peak distinct users online observed during the window.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public int PeakOnline { get; set; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.int32">int</a></dt>
<dd></dd>
</dl>
<a id="EchoHub_Core_Models_ServerStatsReport_PeriodEnd_" data-uid="EchoHub.Core.Models.ServerStatsReport.PeriodEnd*"></a>
<h3 id="EchoHub_Core_Models_ServerStatsReport_PeriodEnd" data-uid="EchoHub.Core.Models.ServerStatsReport.PeriodEnd">
PeriodEnd
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Core/Models/ServerStatsReport.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"><p>End of the reporting window.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public DateTimeOffset PeriodEnd { get; set; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.datetimeoffset">DateTimeOffset</a></dt>
<dd></dd>
</dl>
<a id="EchoHub_Core_Models_ServerStatsReport_PeriodStart_" data-uid="EchoHub.Core.Models.ServerStatsReport.PeriodStart*"></a>
<h3 id="EchoHub_Core_Models_ServerStatsReport_PeriodStart" data-uid="EchoHub.Core.Models.ServerStatsReport.PeriodStart">
PeriodStart
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Core/Models/ServerStatsReport.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"><p>Start of the reporting window.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public DateTimeOffset PeriodStart { get; set; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.datetimeoffset">DateTimeOffset</a></dt>
<dd></dd>
</dl>
<a id="EchoHub_Core_Models_ServerStatsReport_TotalMembers_" data-uid="EchoHub.Core.Models.ServerStatsReport.TotalMembers*"></a>
<h3 id="EchoHub_Core_Models_ServerStatsReport_TotalMembers" data-uid="EchoHub.Core.Models.ServerStatsReport.TotalMembers">
TotalMembers
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Core/Models/ServerStatsReport.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"><p>Total registered (unique) members at window end.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public int TotalMembers { get; set; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.int32">int</a></dt>
<dd></dd>
</dl>
<a id="EchoHub_Core_Models_ServerStatsReport_WindowHours_" data-uid="EchoHub.Core.Models.ServerStatsReport.WindowHours*"></a>
<h3 id="EchoHub_Core_Models_ServerStatsReport_WindowHours" data-uid="EchoHub.Core.Models.ServerStatsReport.WindowHours">
WindowHours
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Core/Models/ServerStatsReport.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"><p>Length of the reporting window in hours.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public double WindowHours { get; set; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.double">double</a></dt>
<dd></dd>
</dl>
</article>
<div class="contribution d-print-none">
<a href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Core/Models/ServerStatsReport.cs" class="edit-link">Edit this page</a>
</div>
</div>
<div class="affix">
<nav id="affix"></nav>
</div>
</main>
<div class="container-xxl search-results" id="search-results"></div>
<footer class="border-top text-secondary">
<div class="container-xxl">
<div class="flex-fill">
<div class='footer-custom'><div class='footer-inner'><span class='footer-brand'>EchoHub</span><span class='footer-sep'>&middot;</span><a href='https://github.com/HueByte/EchoHub'>GitHub</a><span class='footer-sep'>&middot;</span><a href='https://echohub.voidcube.cloud'>Website</a></div></div>
</div>
</div>
</footer>
</body>
</html>
+8
View File
@@ -122,6 +122,14 @@ new accounts (REST and IRC alike) require a valid, unexpired, not-fully-used cod
<dt><a class="xref" href="EchoHub.Core.Models.RefreshToken.html">RefreshToken</a></dt>
<dd></dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="EchoHub.Core.Models.ServerStatsReport.html">ServerStatsReport</a></dt>
<dd><p>A snapshot of server activity over one reporting window, produced periodically by the
stats-report background job. Each report is logged as pretty-printed JSON and persisted
for historical trend analysis. The window is &quot;since the previous report&quot; (or since startup
for the first report of a run).</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="EchoHub.Core.Models.User.html">User</a></dt>
<dd></dd>
@@ -0,0 +1,307 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Class StatsOptions | EchoHub Documentation </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Class StatsOptions | EchoHub Documentation ">
<meta name="description" content="Periodic server-stats report settings, bound from the &amp;quot;Stats&amp;quot; config section (env override: Stats__Enabled etc.). When enabled, a background job periodically snapshots server activity, logs it as pretty-printed JSON, and persists it to the database.">
<link rel="icon" href="../../images/hue_icon.svg">
<link rel="stylesheet" href="../../public/docfx.min.css">
<link rel="stylesheet" href="../../public/main.css">
<meta name="docfx:navrel" content="../../toc.html">
<meta name="docfx:tocrel" content="../toc.html">
<meta name="docfx:rel" content="../../">
<meta name="docfx:docurl" content="https://github.com/HueByte/EchoHub/new/master/apiSpec/new?filename=EchoHub_Server_Config_StatsOptions.md&amp;value=---%0Auid%3A%20EchoHub.Server.Config.StatsOptions%0Asummary%3A%20&#39;*You%20can%20override%20summary%20for%20the%20API%20here%20using%20*MARKDOWN*%20syntax&#39;%0A---%0A%0A*Please%20type%20below%20more%20information%20about%20this%20API%3A*%0A%0A">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &quot;{query}&quot;">
<meta name="loc:searchNoResults" content="No results for &quot;{query}&quot;">
<meta name="loc:tocFilter" content="Filter by title">
<meta name="loc:nextArticle" content="Next">
<meta name="loc:prevArticle" content="Previous">
<meta name="loc:themeLight" content="Light">
<meta name="loc:themeDark" content="Dark">
<meta name="loc:themeAuto" content="Auto">
<meta name="loc:changeTheme" content="Change theme">
<meta name="loc:copy" content="Copy">
<meta name="loc:downloadPdf" content="Download PDF">
<script type="module" src="./../../public/docfx.min.js"></script>
<script>
const theme = localStorage.getItem('theme') || 'auto'
document.documentElement.setAttribute('data-bs-theme', theme === 'auto' ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light') : theme)
</script>
</head>
<body class="tex2jax_ignore" data-layout="" data-yaml-mime="ManagedReference">
<header class="bg-body border-bottom">
<nav id="autocollapse" class="navbar navbar-expand-md" role="navigation">
<div class="container-xxl flex-nowrap">
<a class="navbar-brand" href="../../index.html">
<img id="logo" class="svg" src="../../images/hue_icon.svg" alt="EchoHub">
EchoHub
</a>
<button class="btn btn-lg d-md-none border-0" type="button" data-bs-toggle="collapse" data-bs-target="#navpanel" aria-controls="navpanel" aria-expanded="false" aria-label="Toggle navigation">
<i class="bi bi-three-dots"></i>
</button>
<div class="collapse navbar-collapse" id="navpanel">
<div id="navbar">
<form class="search" role="search" id="search">
<i class="bi bi-search"></i>
<input class="form-control" id="search-query" type="search" disabled placeholder="Search" autocomplete="off" aria-label="Search">
</form>
</div>
</div>
</div>
</nav>
</header>
<main class="container-xxl">
<div class="toc-offcanvas">
<div class="offcanvas-md offcanvas-start" tabindex="-1" id="tocOffcanvas" aria-labelledby="tocOffcanvasLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="tocOffcanvasLabel">Table of Contents</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" data-bs-target="#tocOffcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<nav class="toc" id="toc"></nav>
</div>
</div>
</div>
<div class="content">
<div class="actionbar">
<button class="btn btn-lg border-0 d-md-none" type="button" data-bs-toggle="offcanvas" data-bs-target="#tocOffcanvas" aria-controls="tocOffcanvas" aria-expanded="false" aria-label="Show table of contents">
<i class="bi bi-list"></i>
</button>
<nav id="breadcrumb"></nav>
</div>
<article data-uid="EchoHub.Server.Config.StatsOptions">
<h1 id="EchoHub_Server_Config_StatsOptions" data-uid="EchoHub.Server.Config.StatsOptions" class="text-break">
Class StatsOptions <a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Config/StatsOptions.cs"><i class="bi bi-code-slash"></i></a>
</h1>
<div class="facts text-secondary">
<dl><dt>Namespace</dt><dd><a class="xref" href="EchoHub.html">EchoHub</a>.<a class="xref" href="EchoHub.Server.html">Server</a>.<a class="xref" href="EchoHub.Server.Config.html">Config</a></dd></dl>
<dl><dt>Assembly</dt><dd>EchoHub.Server.dll</dd></dl>
</div>
<div class="markdown summary"><p>Periodic server-stats report settings, bound from the &quot;Stats&quot; config section (env override:
<code>Stats__Enabled</code> etc.). When enabled, a background job periodically snapshots server
activity, logs it as pretty-printed JSON, and persists it to the database.</p>
</div>
<div class="markdown conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public sealed class StatsOptions</code></pre>
</div>
<dl class="typelist inheritance">
<dt>Inheritance</dt>
<dd>
<div><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object">object</a></div>
<div><span class="xref">StatsOptions</span></div>
</dd>
</dl>
<dl class="typelist inheritedMembers">
<dt>Inherited Members</dt>
<dd>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.gettype">object.GetType()</a>
</div>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.tostring">object.ToString()</a>
</div>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals(system-object)">object.Equals(object)</a>
</div>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals(system-object-system-object)">object.Equals(object, object)</a>
</div>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.referenceequals">object.ReferenceEquals(object, object)</a>
</div>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.gethashcode">object.GetHashCode()</a>
</div>
</dd></dl>
<h2 class="section" id="constructors">Constructors
</h2>
<a id="EchoHub_Server_Config_StatsOptions__ctor_" data-uid="EchoHub.Server.Config.StatsOptions.#ctor*"></a>
<h3 id="EchoHub_Server_Config_StatsOptions__ctor" data-uid="EchoHub.Server.Config.StatsOptions.#ctor">
StatsOptions()
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Config/StatsOptions.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"></div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public StatsOptions()</code></pre>
</div>
<h2 class="section" id="properties">Properties
</h2>
<a id="EchoHub_Server_Config_StatsOptions_Enabled_" data-uid="EchoHub.Server.Config.StatsOptions.Enabled*"></a>
<h3 id="EchoHub_Server_Config_StatsOptions_Enabled" data-uid="EchoHub.Server.Config.StatsOptions.Enabled">
Enabled
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Config/StatsOptions.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"><p>Master switch for the periodic stats report job.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public bool Enabled { get; set; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.boolean">bool</a></dt>
<dd></dd>
</dl>
<a id="EchoHub_Server_Config_StatsOptions_IntervalHours_" data-uid="EchoHub.Server.Config.StatsOptions.IntervalHours*"></a>
<h3 id="EchoHub_Server_Config_StatsOptions_IntervalHours" data-uid="EchoHub.Server.Config.StatsOptions.IntervalHours">
IntervalHours
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Config/StatsOptions.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"><p>How often a report is generated, in hours. Default: every 6 hours.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public double IntervalHours { get; set; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.double">double</a></dt>
<dd></dd>
</dl>
<a id="EchoHub_Server_Config_StatsOptions_RetentionDays_" data-uid="EchoHub.Server.Config.StatsOptions.RetentionDays*"></a>
<h3 id="EchoHub_Server_Config_StatsOptions_RetentionDays" data-uid="EchoHub.Server.Config.StatsOptions.RetentionDays">
RetentionDays
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Config/StatsOptions.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"><p>How long persisted reports are kept before being pruned, in days. Set to 0 to keep
reports indefinitely. Default: 90 days.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public int RetentionDays { get; set; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.int32">int</a></dt>
<dd></dd>
</dl>
</article>
<div class="contribution d-print-none">
<a href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Config/StatsOptions.cs" class="edit-link">Edit this page</a>
</div>
</div>
<div class="affix">
<nav id="affix"></nav>
</div>
</main>
<div class="container-xxl search-results" id="search-results"></div>
<footer class="border-top text-secondary">
<div class="container-xxl">
<div class="flex-fill">
<div class='footer-custom'><div class='footer-inner'><span class='footer-brand'>EchoHub</span><span class='footer-sep'>&middot;</span><a href='https://github.com/HueByte/EchoHub'>GitHub</a><span class='footer-sep'>&middot;</span><a href='https://echohub.voidcube.cloud'>Website</a></div></div>
</div>
</div>
</footer>
</body>
</html>
+7
View File
@@ -106,6 +106,13 @@ database; the rolling Serilog log files remain the only persistence.</p>
<dt><a class="xref" href="EchoHub.Server.Config.SpamOptions.html">SpamOptions</a></dt>
<dd><p>Anti-spam thresholds, bound from the &quot;Spam&quot; config section. Defaults are lenient enough
that a fast typist never trips them; Mods and above are always exempt.</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="EchoHub.Server.Config.StatsOptions.html">StatsOptions</a></dt>
<dd><p>Periodic server-stats report settings, bound from the &quot;Stats&quot; config section (env override:
<code>Stats__Enabled</code> etc.). When enabled, a background job periodically snapshots server
activity, logs it as pretty-printed JSON, and persists it to the database.</p>
</dd>
</dl>
<dl class="jumplist">
@@ -159,8 +159,8 @@ public class ChannelsController : ControllerBase</code></pre>
<a id="EchoHub_Server_Controllers_ChannelsController__ctor_" data-uid="EchoHub.Server.Controllers.ChannelsController.#ctor*"></a>
<h3 id="EchoHub_Server_Controllers_ChannelsController__ctor_EchoHub_Core_Contracts_IChannelService_EchoHub_Server_Data_EchoHubDbContext_EchoHub_Server_Services_FileStorageService_EchoHub_Core_Services_ImageToAsciiService_System_Net_Http_IHttpClientFactory_EchoHub_Core_Contracts_IChatService_EchoHub_Core_Contracts_IMessageEncryptionService_EchoHub_Server_Config_UploadLimits_" data-uid="EchoHub.Server.Controllers.ChannelsController.#ctor(EchoHub.Core.Contracts.IChannelService,EchoHub.Server.Data.EchoHubDbContext,EchoHub.Server.Services.FileStorageService,EchoHub.Core.Services.ImageToAsciiService,System.Net.Http.IHttpClientFactory,EchoHub.Core.Contracts.IChatService,EchoHub.Core.Contracts.IMessageEncryptionService,EchoHub.Server.Config.UploadLimits)">
ChannelsController(IChannelService, EchoHubDbContext, FileStorageService, ImageToAsciiService, IHttpClientFactory, IChatService, IMessageEncryptionService, UploadLimits)
<h3 id="EchoHub_Server_Controllers_ChannelsController__ctor_EchoHub_Core_Contracts_IChannelService_EchoHub_Server_Data_EchoHubDbContext_EchoHub_Server_Services_FileStorageService_EchoHub_Core_Services_ImageToAsciiService_System_Net_Http_IHttpClientFactory_EchoHub_Core_Contracts_IChatService_EchoHub_Core_Contracts_IMessageEncryptionService_EchoHub_Server_Config_UploadLimits_Microsoft_Extensions_Logging_ILogger_EchoHub_Server_Controllers_ChannelsController__" data-uid="EchoHub.Server.Controllers.ChannelsController.#ctor(EchoHub.Core.Contracts.IChannelService,EchoHub.Server.Data.EchoHubDbContext,EchoHub.Server.Services.FileStorageService,EchoHub.Core.Services.ImageToAsciiService,System.Net.Http.IHttpClientFactory,EchoHub.Core.Contracts.IChatService,EchoHub.Core.Contracts.IMessageEncryptionService,EchoHub.Server.Config.UploadLimits,Microsoft.Extensions.Logging.ILogger{EchoHub.Server.Controllers.ChannelsController})">
ChannelsController(IChannelService, EchoHubDbContext, FileStorageService, ImageToAsciiService, IHttpClientFactory, IChatService, IMessageEncryptionService, UploadLimits, ILogger&lt;ChannelsController&gt;)
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Controllers/ChannelsController.cs"><i class="bi bi-code-slash"></i></a>
</h3>
@@ -168,7 +168,7 @@ public class ChannelsController : ControllerBase</code></pre>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public ChannelsController(IChannelService channelService, EchoHubDbContext db, FileStorageService fileStorage, ImageToAsciiService asciiService, IHttpClientFactory httpClientFactory, IChatService chatService, IMessageEncryptionService encryption, UploadLimits uploadLimits)</code></pre>
<pre><code class="lang-csharp hljs">public ChannelsController(IChannelService channelService, EchoHubDbContext db, FileStorageService fileStorage, ImageToAsciiService asciiService, IHttpClientFactory httpClientFactory, IChatService chatService, IMessageEncryptionService encryption, UploadLimits uploadLimits, ILogger&lt;ChannelsController&gt; logger)</code></pre>
</div>
<h4 class="section">Parameters</h4>
@@ -189,6 +189,8 @@ public class ChannelsController : ControllerBase</code></pre>
<dd></dd>
<dt><code>uploadLimits</code> <a class="xref" href="EchoHub.Server.Config.UploadLimits.html">UploadLimits</a></dt>
<dd></dd>
<dt><code>logger</code> <span class="xref">ILogger</span>&lt;<a class="xref" href="EchoHub.Server.Controllers.ChannelsController.html">ChannelsController</a>&gt;</dt>
<dd></dd>
</dl>
@@ -159,8 +159,8 @@ public class ModerationController : ControllerBase</code></pre>
<a id="EchoHub_Server_Controllers_ModerationController__ctor_" data-uid="EchoHub.Server.Controllers.ModerationController.#ctor*"></a>
<h3 id="EchoHub_Server_Controllers_ModerationController__ctor_EchoHub_Server_Data_EchoHubDbContext_EchoHub_Core_Contracts_IChatService_EchoHub_Server_Services_PresenceTracker_EchoHub_Server_Services_FileStorageService_System_Collections_Generic_IEnumerable_EchoHub_Core_Contracts_IChatBroadcaster__" data-uid="EchoHub.Server.Controllers.ModerationController.#ctor(EchoHub.Server.Data.EchoHubDbContext,EchoHub.Core.Contracts.IChatService,EchoHub.Server.Services.PresenceTracker,EchoHub.Server.Services.FileStorageService,System.Collections.Generic.IEnumerable{EchoHub.Core.Contracts.IChatBroadcaster})">
ModerationController(EchoHubDbContext, IChatService, PresenceTracker, FileStorageService, IEnumerable&lt;IChatBroadcaster&gt;)
<h3 id="EchoHub_Server_Controllers_ModerationController__ctor_EchoHub_Server_Data_EchoHubDbContext_EchoHub_Core_Contracts_IChatService_EchoHub_Server_Services_PresenceTracker_EchoHub_Server_Services_FileStorageService_System_Collections_Generic_IEnumerable_EchoHub_Core_Contracts_IChatBroadcaster__EchoHub_Server_Services_Stats_ServerStatsCollector_Microsoft_Extensions_Logging_ILogger_EchoHub_Server_Controllers_ModerationController__" data-uid="EchoHub.Server.Controllers.ModerationController.#ctor(EchoHub.Server.Data.EchoHubDbContext,EchoHub.Core.Contracts.IChatService,EchoHub.Server.Services.PresenceTracker,EchoHub.Server.Services.FileStorageService,System.Collections.Generic.IEnumerable{EchoHub.Core.Contracts.IChatBroadcaster},EchoHub.Server.Services.Stats.ServerStatsCollector,Microsoft.Extensions.Logging.ILogger{EchoHub.Server.Controllers.ModerationController})">
ModerationController(EchoHubDbContext, IChatService, PresenceTracker, FileStorageService, IEnumerable&lt;IChatBroadcaster&gt;, ServerStatsCollector, ILogger&lt;ModerationController&gt;)
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Controllers/ModerationController.cs"><i class="bi bi-code-slash"></i></a>
</h3>
@@ -168,7 +168,7 @@ public class ModerationController : ControllerBase</code></pre>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public ModerationController(EchoHubDbContext db, IChatService chatService, PresenceTracker presenceTracker, FileStorageService fileStorage, IEnumerable&lt;IChatBroadcaster&gt; broadcasters)</code></pre>
<pre><code class="lang-csharp hljs">public ModerationController(EchoHubDbContext db, IChatService chatService, PresenceTracker presenceTracker, FileStorageService fileStorage, IEnumerable&lt;IChatBroadcaster&gt; broadcasters, ServerStatsCollector statsCollector, ILogger&lt;ModerationController&gt; logger)</code></pre>
</div>
<h4 class="section">Parameters</h4>
@@ -183,6 +183,10 @@ public class ModerationController : ControllerBase</code></pre>
<dd></dd>
<dt><code>broadcasters</code> <span class="xref">IEnumerable</span>&lt;<a class="xref" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Core/Contracts/IChatBroadcaster.cs">IChatBroadcaster</a>&gt;</dt>
<dd></dd>
<dt><code>statsCollector</code> <a class="xref" href="EchoHub.Server.Services.Stats.ServerStatsCollector.html">ServerStatsCollector</a></dt>
<dd></dd>
<dt><code>logger</code> <span class="xref">ILogger</span>&lt;<a class="xref" href="EchoHub.Server.Controllers.ModerationController.html">ModerationController</a>&gt;</dt>
<dd></dd>
</dl>
@@ -381,6 +381,37 @@ Class EchoHubDbContext <a class="header-action link-secondary" title="View sour
<a id="EchoHub_Server_Data_EchoHubDbContext_ServerStatsReports_" data-uid="EchoHub.Server.Data.EchoHubDbContext.ServerStatsReports*"></a>
<h3 id="EchoHub_Server_Data_EchoHubDbContext_ServerStatsReports" data-uid="EchoHub.Server.Data.EchoHubDbContext.ServerStatsReports">
ServerStatsReports
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Data/EchoHubDbContext.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"></div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public DbSet&lt;ServerStatsReport&gt; ServerStatsReports { get; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><span class="xref">DbSet</span>&lt;<a class="xref" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Core/Models/ServerStatsReport.cs">ServerStatsReport</a>&gt;</dt>
<dd></dd>
</dl>
<a id="EchoHub_Server_Data_EchoHubDbContext_Users_" data-uid="EchoHub.Server.Data.EchoHubDbContext.Users*"></a>
<h3 id="EchoHub_Server_Data_EchoHubDbContext_Users" data-uid="EchoHub.Server.Data.EchoHubDbContext.Users">
@@ -0,0 +1,306 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Class AddServerStatsReports | EchoHub Documentation </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Class AddServerStatsReports | EchoHub Documentation ">
<link rel="icon" href="../../images/hue_icon.svg">
<link rel="stylesheet" href="../../public/docfx.min.css">
<link rel="stylesheet" href="../../public/main.css">
<meta name="docfx:navrel" content="../../toc.html">
<meta name="docfx:tocrel" content="../toc.html">
<meta name="docfx:rel" content="../../">
<meta name="docfx:docurl" content="https://github.com/HueByte/EchoHub/new/master/apiSpec/new?filename=EchoHub_Server_Data_Migrations_AddServerStatsReports.md&amp;value=---%0Auid%3A%20EchoHub.Server.Data.Migrations.AddServerStatsReports%0Asummary%3A%20&#39;*You%20can%20override%20summary%20for%20the%20API%20here%20using%20*MARKDOWN*%20syntax&#39;%0A---%0A%0A*Please%20type%20below%20more%20information%20about%20this%20API%3A*%0A%0A">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &quot;{query}&quot;">
<meta name="loc:searchNoResults" content="No results for &quot;{query}&quot;">
<meta name="loc:tocFilter" content="Filter by title">
<meta name="loc:nextArticle" content="Next">
<meta name="loc:prevArticle" content="Previous">
<meta name="loc:themeLight" content="Light">
<meta name="loc:themeDark" content="Dark">
<meta name="loc:themeAuto" content="Auto">
<meta name="loc:changeTheme" content="Change theme">
<meta name="loc:copy" content="Copy">
<meta name="loc:downloadPdf" content="Download PDF">
<script type="module" src="./../../public/docfx.min.js"></script>
<script>
const theme = localStorage.getItem('theme') || 'auto'
document.documentElement.setAttribute('data-bs-theme', theme === 'auto' ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light') : theme)
</script>
</head>
<body class="tex2jax_ignore" data-layout="" data-yaml-mime="ManagedReference">
<header class="bg-body border-bottom">
<nav id="autocollapse" class="navbar navbar-expand-md" role="navigation">
<div class="container-xxl flex-nowrap">
<a class="navbar-brand" href="../../index.html">
<img id="logo" class="svg" src="../../images/hue_icon.svg" alt="EchoHub">
EchoHub
</a>
<button class="btn btn-lg d-md-none border-0" type="button" data-bs-toggle="collapse" data-bs-target="#navpanel" aria-controls="navpanel" aria-expanded="false" aria-label="Toggle navigation">
<i class="bi bi-three-dots"></i>
</button>
<div class="collapse navbar-collapse" id="navpanel">
<div id="navbar">
<form class="search" role="search" id="search">
<i class="bi bi-search"></i>
<input class="form-control" id="search-query" type="search" disabled placeholder="Search" autocomplete="off" aria-label="Search">
</form>
</div>
</div>
</div>
</nav>
</header>
<main class="container-xxl">
<div class="toc-offcanvas">
<div class="offcanvas-md offcanvas-start" tabindex="-1" id="tocOffcanvas" aria-labelledby="tocOffcanvasLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="tocOffcanvasLabel">Table of Contents</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" data-bs-target="#tocOffcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<nav class="toc" id="toc"></nav>
</div>
</div>
</div>
<div class="content">
<div class="actionbar">
<button class="btn btn-lg border-0 d-md-none" type="button" data-bs-toggle="offcanvas" data-bs-target="#tocOffcanvas" aria-controls="tocOffcanvas" aria-expanded="false" aria-label="Show table of contents">
<i class="bi bi-list"></i>
</button>
<nav id="breadcrumb"></nav>
</div>
<article data-uid="EchoHub.Server.Data.Migrations.AddServerStatsReports">
<h1 id="EchoHub_Server_Data_Migrations_AddServerStatsReports" data-uid="EchoHub.Server.Data.Migrations.AddServerStatsReports" class="text-break">
Class AddServerStatsReports <a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Data/Migrations/20260717200332_AddServerStatsReports.Designer.cs"><i class="bi bi-code-slash"></i></a>
</h1>
<div class="facts text-secondary">
<dl><dt>Namespace</dt><dd><a class="xref" href="EchoHub.html">EchoHub</a>.<a class="xref" href="EchoHub.Server.html">Server</a>.<a class="xref" href="EchoHub.Server.Data.html">Data</a>.<a class="xref" href="EchoHub.Server.Data.Migrations.html">Migrations</a></dd></dl>
<dl><dt>Assembly</dt><dd>EchoHub.Server.dll</dd></dl>
</div>
<div class="markdown summary"></div>
<div class="markdown conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">[DbContext(typeof(EchoHubDbContext))]
[Migration(&quot;20260717200332_AddServerStatsReports&quot;)]
public class AddServerStatsReports : Migration</code></pre>
</div>
<dl class="typelist inheritance">
<dt>Inheritance</dt>
<dd>
<div><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object">object</a></div>
<div><span class="xref">Migration</span></div>
<div><span class="xref">AddServerStatsReports</span></div>
</dd>
</dl>
<dl class="typelist inheritedMembers">
<dt>Inherited Members</dt>
<dd>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.gettype">object.GetType()</a>
</div>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.memberwiseclone">object.MemberwiseClone()</a>
</div>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.tostring">object.ToString()</a>
</div>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals(system-object)">object.Equals(object)</a>
</div>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals(system-object-system-object)">object.Equals(object, object)</a>
</div>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.referenceequals">object.ReferenceEquals(object, object)</a>
</div>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.gethashcode">object.GetHashCode()</a>
</div>
</dd></dl>
<h2 class="section" id="constructors">Constructors
</h2>
<a id="EchoHub_Server_Data_Migrations_AddServerStatsReports__ctor_" data-uid="EchoHub.Server.Data.Migrations.AddServerStatsReports.#ctor*"></a>
<h3 id="EchoHub_Server_Data_Migrations_AddServerStatsReports__ctor" data-uid="EchoHub.Server.Data.Migrations.AddServerStatsReports.#ctor">
AddServerStatsReports()
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Data/Migrations/20260717200332_AddServerStatsReports.Designer.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"></div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public AddServerStatsReports()</code></pre>
</div>
<h2 class="section" id="methods">Methods
</h2>
<a id="EchoHub_Server_Data_Migrations_AddServerStatsReports_BuildTargetModel_" data-uid="EchoHub.Server.Data.Migrations.AddServerStatsReports.BuildTargetModel*"></a>
<h3 id="EchoHub_Server_Data_Migrations_AddServerStatsReports_BuildTargetModel_Microsoft_EntityFrameworkCore_ModelBuilder_" data-uid="EchoHub.Server.Data.Migrations.AddServerStatsReports.BuildTargetModel(Microsoft.EntityFrameworkCore.ModelBuilder)">
BuildTargetModel(ModelBuilder)
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Data/Migrations/20260717200332_AddServerStatsReports.Designer.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"></div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">protected override void BuildTargetModel(ModelBuilder modelBuilder)</code></pre>
</div>
<h4 class="section">Parameters</h4>
<dl class="parameters">
<dt><code>modelBuilder</code> <span class="xref">ModelBuilder</span></dt>
<dd></dd>
</dl>
<a id="EchoHub_Server_Data_Migrations_AddServerStatsReports_Down_" data-uid="EchoHub.Server.Data.Migrations.AddServerStatsReports.Down*"></a>
<h3 id="EchoHub_Server_Data_Migrations_AddServerStatsReports_Down_Microsoft_EntityFrameworkCore_Migrations_MigrationBuilder_" data-uid="EchoHub.Server.Data.Migrations.AddServerStatsReports.Down(Microsoft.EntityFrameworkCore.Migrations.MigrationBuilder)">
Down(MigrationBuilder)
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Data/Migrations/20260717200332_AddServerStatsReports.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"></div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">protected override void Down(MigrationBuilder migrationBuilder)</code></pre>
</div>
<h4 class="section">Parameters</h4>
<dl class="parameters">
<dt><code>migrationBuilder</code> <span class="xref">MigrationBuilder</span></dt>
<dd></dd>
</dl>
<a id="EchoHub_Server_Data_Migrations_AddServerStatsReports_Up_" data-uid="EchoHub.Server.Data.Migrations.AddServerStatsReports.Up*"></a>
<h3 id="EchoHub_Server_Data_Migrations_AddServerStatsReports_Up_Microsoft_EntityFrameworkCore_Migrations_MigrationBuilder_" data-uid="EchoHub.Server.Data.Migrations.AddServerStatsReports.Up(Microsoft.EntityFrameworkCore.Migrations.MigrationBuilder)">
Up(MigrationBuilder)
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Data/Migrations/20260717200332_AddServerStatsReports.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"></div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">protected override void Up(MigrationBuilder migrationBuilder)</code></pre>
</div>
<h4 class="section">Parameters</h4>
<dl class="parameters">
<dt><code>migrationBuilder</code> <span class="xref">MigrationBuilder</span></dt>
<dd></dd>
</dl>
</article>
<div class="contribution d-print-none">
<a href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Data/Migrations/20260717200332_AddServerStatsReports.Designer.cs" class="edit-link">Edit this page</a>
</div>
</div>
<div class="affix">
<nav id="affix"></nav>
</div>
</main>
<div class="container-xxl search-results" id="search-results"></div>
<footer class="border-top text-secondary">
<div class="container-xxl">
<div class="flex-fill">
<div class='footer-custom'><div class='footer-inner'><span class='footer-brand'>EchoHub</span><span class='footer-sep'>&middot;</span><a href='https://github.com/HueByte/EchoHub'>GitHub</a><span class='footer-sep'>&middot;</span><a href='https://echohub.voidcube.cloud'>Website</a></div></div>
</div>
</div>
</footer>
</body>
</html>
@@ -138,6 +138,10 @@ Classes
<dt><a class="xref" href="EchoHub.Server.Data.Migrations.AddModerationRoles.html">AddModerationRoles</a></dt>
<dd></dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="EchoHub.Server.Data.Migrations.AddServerStatsReports.html">AddServerStatsReports</a></dt>
<dd></dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="EchoHub.Server.Data.Migrations.InitialCreate.html">InitialCreate</a></dt>
<dd></dd>
@@ -160,8 +160,8 @@ Class ChatService <a class="header-action link-secondary" title="View source" h
<a id="EchoHub_Server_Services_ChatService__ctor_" data-uid="EchoHub.Server.Services.ChatService.#ctor*"></a>
<h3 id="EchoHub_Server_Services_ChatService__ctor_Microsoft_Extensions_DependencyInjection_IServiceScopeFactory_EchoHub_Server_Services_PresenceTracker_System_Collections_Generic_IEnumerable_EchoHub_Core_Contracts_IChatBroadcaster__EchoHub_Server_Services_LinkEmbedService_EchoHub_Core_Contracts_IMessageEncryptionService_EchoHub_Core_Contracts_IChannelService_EchoHub_Server_Services_FileStorageService_EchoHub_Server_Services_SpamGuard_EchoHub_Server_Services_ServerLogs_ServerLogsService_Microsoft_Extensions_Logging_ILogger_EchoHub_Server_Services_ChatService__" data-uid="EchoHub.Server.Services.ChatService.#ctor(Microsoft.Extensions.DependencyInjection.IServiceScopeFactory,EchoHub.Server.Services.PresenceTracker,System.Collections.Generic.IEnumerable{EchoHub.Core.Contracts.IChatBroadcaster},EchoHub.Server.Services.LinkEmbedService,EchoHub.Core.Contracts.IMessageEncryptionService,EchoHub.Core.Contracts.IChannelService,EchoHub.Server.Services.FileStorageService,EchoHub.Server.Services.SpamGuard,EchoHub.Server.Services.ServerLogs.ServerLogsService,Microsoft.Extensions.Logging.ILogger{EchoHub.Server.Services.ChatService})">
ChatService(IServiceScopeFactory, PresenceTracker, IEnumerable&lt;IChatBroadcaster&gt;, LinkEmbedService, IMessageEncryptionService, IChannelService, FileStorageService, SpamGuard, ServerLogsService, ILogger&lt;ChatService&gt;)
<h3 id="EchoHub_Server_Services_ChatService__ctor_Microsoft_Extensions_DependencyInjection_IServiceScopeFactory_EchoHub_Server_Services_PresenceTracker_System_Collections_Generic_IEnumerable_EchoHub_Core_Contracts_IChatBroadcaster__EchoHub_Server_Services_LinkEmbedService_EchoHub_Core_Contracts_IMessageEncryptionService_EchoHub_Core_Contracts_IChannelService_EchoHub_Server_Services_FileStorageService_EchoHub_Server_Services_SpamGuard_EchoHub_Server_Services_ServerLogs_ServerLogsService_EchoHub_Server_Services_Stats_ServerStatsCollector_Microsoft_Extensions_Logging_ILogger_EchoHub_Server_Services_ChatService__" data-uid="EchoHub.Server.Services.ChatService.#ctor(Microsoft.Extensions.DependencyInjection.IServiceScopeFactory,EchoHub.Server.Services.PresenceTracker,System.Collections.Generic.IEnumerable{EchoHub.Core.Contracts.IChatBroadcaster},EchoHub.Server.Services.LinkEmbedService,EchoHub.Core.Contracts.IMessageEncryptionService,EchoHub.Core.Contracts.IChannelService,EchoHub.Server.Services.FileStorageService,EchoHub.Server.Services.SpamGuard,EchoHub.Server.Services.ServerLogs.ServerLogsService,EchoHub.Server.Services.Stats.ServerStatsCollector,Microsoft.Extensions.Logging.ILogger{EchoHub.Server.Services.ChatService})">
ChatService(IServiceScopeFactory, PresenceTracker, IEnumerable&lt;IChatBroadcaster&gt;, LinkEmbedService, IMessageEncryptionService, IChannelService, FileStorageService, SpamGuard, ServerLogsService, ServerStatsCollector, ILogger&lt;ChatService&gt;)
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Services/ChatService.cs"><i class="bi bi-code-slash"></i></a>
</h3>
@@ -169,7 +169,7 @@ Class ChatService <a class="header-action link-secondary" title="View source" h
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public ChatService(IServiceScopeFactory scopeFactory, PresenceTracker presenceTracker, IEnumerable&lt;IChatBroadcaster&gt; broadcasters, LinkEmbedService embedService, IMessageEncryptionService encryption, IChannelService channelService, FileStorageService fileStorage, SpamGuard spamGuard, ServerLogsService serverLogs, ILogger&lt;ChatService&gt; logger)</code></pre>
<pre><code class="lang-csharp hljs">public ChatService(IServiceScopeFactory scopeFactory, PresenceTracker presenceTracker, IEnumerable&lt;IChatBroadcaster&gt; broadcasters, LinkEmbedService embedService, IMessageEncryptionService encryption, IChannelService channelService, FileStorageService fileStorage, SpamGuard spamGuard, ServerLogsService serverLogs, ServerStatsCollector statsCollector, ILogger&lt;ChatService&gt; logger)</code></pre>
</div>
<h4 class="section">Parameters</h4>
@@ -192,6 +192,8 @@ Class ChatService <a class="header-action link-secondary" title="View source" h
<dd></dd>
<dt><code>serverLogs</code> <a class="xref" href="EchoHub.Server.Services.ServerLogs.ServerLogsService.html">ServerLogsService</a></dt>
<dd></dd>
<dt><code>statsCollector</code> <a class="xref" href="EchoHub.Server.Services.Stats.ServerStatsCollector.html">ServerStatsCollector</a></dt>
<dd></dd>
<dt><code>logger</code> <span class="xref">ILogger</span>&lt;<a class="xref" href="EchoHub.Server.Services.ChatService.html">ChatService</a>&gt;</dt>
<dd></dd>
</dl>
@@ -0,0 +1,401 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Class ServerStatsCollector | EchoHub Documentation </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Class ServerStatsCollector | EchoHub Documentation ">
<meta name="description" content="Thread-safe, in-memory accumulator for server-activity counters that have no natural database timestamp to query after the fact — session connects/disconnects, moderation actions, and peak concurrency. The periodic stats-report job snapshots and resets these once per reporting window. Registered as a singleton; every increment is lock-free so it is safe to call from hot paths (connect/disconnect).">
<link rel="icon" href="../../images/hue_icon.svg">
<link rel="stylesheet" href="../../public/docfx.min.css">
<link rel="stylesheet" href="../../public/main.css">
<meta name="docfx:navrel" content="../../toc.html">
<meta name="docfx:tocrel" content="../toc.html">
<meta name="docfx:rel" content="../../">
<meta name="docfx:docurl" content="https://github.com/HueByte/EchoHub/new/master/apiSpec/new?filename=EchoHub_Server_Services_Stats_ServerStatsCollector.md&amp;value=---%0Auid%3A%20EchoHub.Server.Services.Stats.ServerStatsCollector%0Asummary%3A%20&#39;*You%20can%20override%20summary%20for%20the%20API%20here%20using%20*MARKDOWN*%20syntax&#39;%0A---%0A%0A*Please%20type%20below%20more%20information%20about%20this%20API%3A*%0A%0A">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &quot;{query}&quot;">
<meta name="loc:searchNoResults" content="No results for &quot;{query}&quot;">
<meta name="loc:tocFilter" content="Filter by title">
<meta name="loc:nextArticle" content="Next">
<meta name="loc:prevArticle" content="Previous">
<meta name="loc:themeLight" content="Light">
<meta name="loc:themeDark" content="Dark">
<meta name="loc:themeAuto" content="Auto">
<meta name="loc:changeTheme" content="Change theme">
<meta name="loc:copy" content="Copy">
<meta name="loc:downloadPdf" content="Download PDF">
<script type="module" src="./../../public/docfx.min.js"></script>
<script>
const theme = localStorage.getItem('theme') || 'auto'
document.documentElement.setAttribute('data-bs-theme', theme === 'auto' ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light') : theme)
</script>
</head>
<body class="tex2jax_ignore" data-layout="" data-yaml-mime="ManagedReference">
<header class="bg-body border-bottom">
<nav id="autocollapse" class="navbar navbar-expand-md" role="navigation">
<div class="container-xxl flex-nowrap">
<a class="navbar-brand" href="../../index.html">
<img id="logo" class="svg" src="../../images/hue_icon.svg" alt="EchoHub">
EchoHub
</a>
<button class="btn btn-lg d-md-none border-0" type="button" data-bs-toggle="collapse" data-bs-target="#navpanel" aria-controls="navpanel" aria-expanded="false" aria-label="Toggle navigation">
<i class="bi bi-three-dots"></i>
</button>
<div class="collapse navbar-collapse" id="navpanel">
<div id="navbar">
<form class="search" role="search" id="search">
<i class="bi bi-search"></i>
<input class="form-control" id="search-query" type="search" disabled placeholder="Search" autocomplete="off" aria-label="Search">
</form>
</div>
</div>
</div>
</nav>
</header>
<main class="container-xxl">
<div class="toc-offcanvas">
<div class="offcanvas-md offcanvas-start" tabindex="-1" id="tocOffcanvas" aria-labelledby="tocOffcanvasLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="tocOffcanvasLabel">Table of Contents</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" data-bs-target="#tocOffcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<nav class="toc" id="toc"></nav>
</div>
</div>
</div>
<div class="content">
<div class="actionbar">
<button class="btn btn-lg border-0 d-md-none" type="button" data-bs-toggle="offcanvas" data-bs-target="#tocOffcanvas" aria-controls="tocOffcanvas" aria-expanded="false" aria-label="Show table of contents">
<i class="bi bi-list"></i>
</button>
<nav id="breadcrumb"></nav>
</div>
<article data-uid="EchoHub.Server.Services.Stats.ServerStatsCollector">
<h1 id="EchoHub_Server_Services_Stats_ServerStatsCollector" data-uid="EchoHub.Server.Services.Stats.ServerStatsCollector" class="text-break">
Class ServerStatsCollector <a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Services/Stats/ServerStatsCollector.cs"><i class="bi bi-code-slash"></i></a>
</h1>
<div class="facts text-secondary">
<dl><dt>Namespace</dt><dd><a class="xref" href="EchoHub.html">EchoHub</a>.<a class="xref" href="EchoHub.Server.html">Server</a>.<a class="xref" href="EchoHub.Server.Services.html">Services</a>.<a class="xref" href="EchoHub.Server.Services.Stats.html">Stats</a></dd></dl>
<dl><dt>Assembly</dt><dd>EchoHub.Server.dll</dd></dl>
</div>
<div class="markdown summary"><p>Thread-safe, in-memory accumulator for server-activity counters that have no natural
database timestamp to query after the fact — session connects/disconnects, moderation
actions, and peak concurrency. The periodic stats-report job snapshots and resets these
once per reporting window. Registered as a singleton; every increment is lock-free so it
is safe to call from hot paths (connect/disconnect).</p>
</div>
<div class="markdown conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public sealed class ServerStatsCollector</code></pre>
</div>
<dl class="typelist inheritance">
<dt>Inheritance</dt>
<dd>
<div><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object">object</a></div>
<div><span class="xref">ServerStatsCollector</span></div>
</dd>
</dl>
<dl class="typelist inheritedMembers">
<dt>Inherited Members</dt>
<dd>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.gettype">object.GetType()</a>
</div>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.tostring">object.ToString()</a>
</div>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals(system-object)">object.Equals(object)</a>
</div>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals(system-object-system-object)">object.Equals(object, object)</a>
</div>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.referenceequals">object.ReferenceEquals(object, object)</a>
</div>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.gethashcode">object.GetHashCode()</a>
</div>
</dd></dl>
<h2 class="section" id="constructors">Constructors
</h2>
<a id="EchoHub_Server_Services_Stats_ServerStatsCollector__ctor_" data-uid="EchoHub.Server.Services.Stats.ServerStatsCollector.#ctor*"></a>
<h3 id="EchoHub_Server_Services_Stats_ServerStatsCollector__ctor" data-uid="EchoHub.Server.Services.Stats.ServerStatsCollector.#ctor">
ServerStatsCollector()
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Services/Stats/ServerStatsCollector.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"></div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public ServerStatsCollector()</code></pre>
</div>
<h2 class="section" id="methods">Methods
</h2>
<a id="EchoHub_Server_Services_Stats_ServerStatsCollector_RecordBan_" data-uid="EchoHub.Server.Services.Stats.ServerStatsCollector.RecordBan*"></a>
<h3 id="EchoHub_Server_Services_Stats_ServerStatsCollector_RecordBan" data-uid="EchoHub.Server.Services.Stats.ServerStatsCollector.RecordBan">
RecordBan()
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Services/Stats/ServerStatsCollector.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"><p>Record a ban action.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public void RecordBan()</code></pre>
</div>
<a id="EchoHub_Server_Services_Stats_ServerStatsCollector_RecordConnection_" data-uid="EchoHub.Server.Services.Stats.ServerStatsCollector.RecordConnection*"></a>
<h3 id="EchoHub_Server_Services_Stats_ServerStatsCollector_RecordConnection_System_Int32_" data-uid="EchoHub.Server.Services.Stats.ServerStatsCollector.RecordConnection(System.Int32)">
RecordConnection(int)
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Services/Stats/ServerStatsCollector.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"><p>Record a session coming online, updating the running peak.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public void RecordConnection(int onlineNow)</code></pre>
</div>
<h4 class="section">Parameters</h4>
<dl class="parameters">
<dt><code>onlineNow</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.int32">int</a></dt>
<dd></dd>
</dl>
<a id="EchoHub_Server_Services_Stats_ServerStatsCollector_RecordDisconnection_" data-uid="EchoHub.Server.Services.Stats.ServerStatsCollector.RecordDisconnection*"></a>
<h3 id="EchoHub_Server_Services_Stats_ServerStatsCollector_RecordDisconnection_System_Int32_" data-uid="EchoHub.Server.Services.Stats.ServerStatsCollector.RecordDisconnection(System.Int32)">
RecordDisconnection(int)
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Services/Stats/ServerStatsCollector.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"><p>Record a session going offline, updating the running peak.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public void RecordDisconnection(int onlineNow)</code></pre>
</div>
<h4 class="section">Parameters</h4>
<dl class="parameters">
<dt><code>onlineNow</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.int32">int</a></dt>
<dd></dd>
</dl>
<a id="EchoHub_Server_Services_Stats_ServerStatsCollector_RecordKick_" data-uid="EchoHub.Server.Services.Stats.ServerStatsCollector.RecordKick*"></a>
<h3 id="EchoHub_Server_Services_Stats_ServerStatsCollector_RecordKick" data-uid="EchoHub.Server.Services.Stats.ServerStatsCollector.RecordKick">
RecordKick()
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Services/Stats/ServerStatsCollector.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"><p>Record a kick action.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public void RecordKick()</code></pre>
</div>
<a id="EchoHub_Server_Services_Stats_ServerStatsCollector_RecordOnline_" data-uid="EchoHub.Server.Services.Stats.ServerStatsCollector.RecordOnline*"></a>
<h3 id="EchoHub_Server_Services_Stats_ServerStatsCollector_RecordOnline_System_Int32_" data-uid="EchoHub.Server.Services.Stats.ServerStatsCollector.RecordOnline(System.Int32)">
RecordOnline(int)
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Services/Stats/ServerStatsCollector.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"><p>Update the running maximum of concurrent online users (lock-free).</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public void RecordOnline(int onlineNow)</code></pre>
</div>
<h4 class="section">Parameters</h4>
<dl class="parameters">
<dt><code>onlineNow</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.int32">int</a></dt>
<dd></dd>
</dl>
<a id="EchoHub_Server_Services_Stats_ServerStatsCollector_SnapshotAndReset_" data-uid="EchoHub.Server.Services.Stats.ServerStatsCollector.SnapshotAndReset*"></a>
<h3 id="EchoHub_Server_Services_Stats_ServerStatsCollector_SnapshotAndReset_System_Int32_" data-uid="EchoHub.Server.Services.Stats.ServerStatsCollector.SnapshotAndReset(System.Int32)">
SnapshotAndReset(int)
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Services/Stats/ServerStatsCollector.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"><p>Atomically read all counters and reset them for the next reporting window. The peak is
reset to <code class="paramref">onlineNow</code> so the next window's peak starts from the current
concurrency rather than zero.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public StatsCounters SnapshotAndReset(int onlineNow)</code></pre>
</div>
<h4 class="section">Parameters</h4>
<dl class="parameters">
<dt><code>onlineNow</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.int32">int</a></dt>
<dd></dd>
</dl>
<h4 class="section">Returns</h4>
<dl class="parameters">
<dt><a class="xref" href="EchoHub.Server.Services.Stats.StatsCounters.html">StatsCounters</a></dt>
<dd></dd>
</dl>
</article>
<div class="contribution d-print-none">
<a href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Services/Stats/ServerStatsCollector.cs" class="edit-link">Edit this page</a>
</div>
</div>
<div class="affix">
<nav id="affix"></nav>
</div>
</main>
<div class="container-xxl search-results" id="search-results"></div>
<footer class="border-top text-secondary">
<div class="container-xxl">
<div class="flex-fill">
<div class='footer-custom'><div class='footer-inner'><span class='footer-brand'>EchoHub</span><span class='footer-sep'>&middot;</span><a href='https://github.com/HueByte/EchoHub'>GitHub</a><span class='footer-sep'>&middot;</span><a href='https://echohub.voidcube.cloud'>Website</a></div></div>
</div>
</div>
</footer>
</body>
</html>
@@ -0,0 +1,267 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Class ServerStatsReportService | EchoHub Documentation </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Class ServerStatsReportService | EchoHub Documentation ">
<meta name="description" content="Background job that periodically snapshots server activity over a window, logs it as pretty-printed JSON (which also surfaces in the live server-logs room), and persists it to the database for historical trends. Interval and retention are configurable via the &amp;quot;Stats&amp;quot; section; the default cadence is every 6 hours.">
<link rel="icon" href="../../images/hue_icon.svg">
<link rel="stylesheet" href="../../public/docfx.min.css">
<link rel="stylesheet" href="../../public/main.css">
<meta name="docfx:navrel" content="../../toc.html">
<meta name="docfx:tocrel" content="../toc.html">
<meta name="docfx:rel" content="../../">
<meta name="docfx:docurl" content="https://github.com/HueByte/EchoHub/new/master/apiSpec/new?filename=EchoHub_Server_Services_Stats_ServerStatsReportService.md&amp;value=---%0Auid%3A%20EchoHub.Server.Services.Stats.ServerStatsReportService%0Asummary%3A%20&#39;*You%20can%20override%20summary%20for%20the%20API%20here%20using%20*MARKDOWN*%20syntax&#39;%0A---%0A%0A*Please%20type%20below%20more%20information%20about%20this%20API%3A*%0A%0A">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &quot;{query}&quot;">
<meta name="loc:searchNoResults" content="No results for &quot;{query}&quot;">
<meta name="loc:tocFilter" content="Filter by title">
<meta name="loc:nextArticle" content="Next">
<meta name="loc:prevArticle" content="Previous">
<meta name="loc:themeLight" content="Light">
<meta name="loc:themeDark" content="Dark">
<meta name="loc:themeAuto" content="Auto">
<meta name="loc:changeTheme" content="Change theme">
<meta name="loc:copy" content="Copy">
<meta name="loc:downloadPdf" content="Download PDF">
<script type="module" src="./../../public/docfx.min.js"></script>
<script>
const theme = localStorage.getItem('theme') || 'auto'
document.documentElement.setAttribute('data-bs-theme', theme === 'auto' ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light') : theme)
</script>
</head>
<body class="tex2jax_ignore" data-layout="" data-yaml-mime="ManagedReference">
<header class="bg-body border-bottom">
<nav id="autocollapse" class="navbar navbar-expand-md" role="navigation">
<div class="container-xxl flex-nowrap">
<a class="navbar-brand" href="../../index.html">
<img id="logo" class="svg" src="../../images/hue_icon.svg" alt="EchoHub">
EchoHub
</a>
<button class="btn btn-lg d-md-none border-0" type="button" data-bs-toggle="collapse" data-bs-target="#navpanel" aria-controls="navpanel" aria-expanded="false" aria-label="Toggle navigation">
<i class="bi bi-three-dots"></i>
</button>
<div class="collapse navbar-collapse" id="navpanel">
<div id="navbar">
<form class="search" role="search" id="search">
<i class="bi bi-search"></i>
<input class="form-control" id="search-query" type="search" disabled placeholder="Search" autocomplete="off" aria-label="Search">
</form>
</div>
</div>
</div>
</nav>
</header>
<main class="container-xxl">
<div class="toc-offcanvas">
<div class="offcanvas-md offcanvas-start" tabindex="-1" id="tocOffcanvas" aria-labelledby="tocOffcanvasLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="tocOffcanvasLabel">Table of Contents</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" data-bs-target="#tocOffcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<nav class="toc" id="toc"></nav>
</div>
</div>
</div>
<div class="content">
<div class="actionbar">
<button class="btn btn-lg border-0 d-md-none" type="button" data-bs-toggle="offcanvas" data-bs-target="#tocOffcanvas" aria-controls="tocOffcanvas" aria-expanded="false" aria-label="Show table of contents">
<i class="bi bi-list"></i>
</button>
<nav id="breadcrumb"></nav>
</div>
<article data-uid="EchoHub.Server.Services.Stats.ServerStatsReportService">
<h1 id="EchoHub_Server_Services_Stats_ServerStatsReportService" data-uid="EchoHub.Server.Services.Stats.ServerStatsReportService" class="text-break">
Class ServerStatsReportService <a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Services/Stats/ServerStatsReportService.cs"><i class="bi bi-code-slash"></i></a>
</h1>
<div class="facts text-secondary">
<dl><dt>Namespace</dt><dd><a class="xref" href="EchoHub.html">EchoHub</a>.<a class="xref" href="EchoHub.Server.html">Server</a>.<a class="xref" href="EchoHub.Server.Services.html">Services</a>.<a class="xref" href="EchoHub.Server.Services.Stats.html">Stats</a></dd></dl>
<dl><dt>Assembly</dt><dd>EchoHub.Server.dll</dd></dl>
</div>
<div class="markdown summary"><p>Background job that periodically snapshots server activity over a window, logs it as
pretty-printed JSON (which also surfaces in the live server-logs room), and persists it to
the database for historical trends. Interval and retention are configurable via the &quot;Stats&quot;
section; the default cadence is every 6 hours.</p>
</div>
<div class="markdown conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public sealed class ServerStatsReportService : BackgroundService, IDisposable</code></pre>
</div>
<dl class="typelist inheritance">
<dt>Inheritance</dt>
<dd>
<div><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object">object</a></div>
<div><span class="xref">BackgroundService</span></div>
<div><span class="xref">ServerStatsReportService</span></div>
</dd>
</dl>
<dl class="typelist implements">
<dt>Implements</dt>
<dd>
<div><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.idisposable">IDisposable</a></div>
</dd>
</dl>
<dl class="typelist inheritedMembers">
<dt>Inherited Members</dt>
<dd>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.gettype">object.GetType()</a>
</div>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.tostring">object.ToString()</a>
</div>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals(system-object)">object.Equals(object)</a>
</div>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals(system-object-system-object)">object.Equals(object, object)</a>
</div>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.referenceequals">object.ReferenceEquals(object, object)</a>
</div>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.gethashcode">object.GetHashCode()</a>
</div>
</dd></dl>
<h2 class="section" id="constructors">Constructors
</h2>
<a id="EchoHub_Server_Services_Stats_ServerStatsReportService__ctor_" data-uid="EchoHub.Server.Services.Stats.ServerStatsReportService.#ctor*"></a>
<h3 id="EchoHub_Server_Services_Stats_ServerStatsReportService__ctor_Microsoft_Extensions_DependencyInjection_IServiceScopeFactory_EchoHub_Server_Services_PresenceTracker_EchoHub_Server_Services_Stats_ServerStatsCollector_EchoHub_Server_Config_StatsOptions_Microsoft_Extensions_Logging_ILogger_EchoHub_Server_Services_Stats_ServerStatsReportService__" data-uid="EchoHub.Server.Services.Stats.ServerStatsReportService.#ctor(Microsoft.Extensions.DependencyInjection.IServiceScopeFactory,EchoHub.Server.Services.PresenceTracker,EchoHub.Server.Services.Stats.ServerStatsCollector,EchoHub.Server.Config.StatsOptions,Microsoft.Extensions.Logging.ILogger{EchoHub.Server.Services.Stats.ServerStatsReportService})">
ServerStatsReportService(IServiceScopeFactory, PresenceTracker, ServerStatsCollector, StatsOptions, ILogger&lt;ServerStatsReportService&gt;)
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Services/Stats/ServerStatsReportService.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"></div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public ServerStatsReportService(IServiceScopeFactory scopeFactory, PresenceTracker presence, ServerStatsCollector collector, StatsOptions options, ILogger&lt;ServerStatsReportService&gt; logger)</code></pre>
</div>
<h4 class="section">Parameters</h4>
<dl class="parameters">
<dt><code>scopeFactory</code> <span class="xref">IServiceScopeFactory</span></dt>
<dd></dd>
<dt><code>presence</code> <a class="xref" href="EchoHub.Server.Services.PresenceTracker.html">PresenceTracker</a></dt>
<dd></dd>
<dt><code>collector</code> <a class="xref" href="EchoHub.Server.Services.Stats.ServerStatsCollector.html">ServerStatsCollector</a></dt>
<dd></dd>
<dt><code>options</code> <a class="xref" href="EchoHub.Server.Config.StatsOptions.html">StatsOptions</a></dt>
<dd></dd>
<dt><code>logger</code> <span class="xref">ILogger</span>&lt;<a class="xref" href="EchoHub.Server.Services.Stats.ServerStatsReportService.html">ServerStatsReportService</a>&gt;</dt>
<dd></dd>
</dl>
<h2 class="section" id="methods">Methods
</h2>
<a id="EchoHub_Server_Services_Stats_ServerStatsReportService_ExecuteAsync_" data-uid="EchoHub.Server.Services.Stats.ServerStatsReportService.ExecuteAsync*"></a>
<h3 id="EchoHub_Server_Services_Stats_ServerStatsReportService_ExecuteAsync_System_Threading_CancellationToken_" data-uid="EchoHub.Server.Services.Stats.ServerStatsReportService.ExecuteAsync(System.Threading.CancellationToken)">
ExecuteAsync(CancellationToken)
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Services/Stats/ServerStatsReportService.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"></div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">protected override Task ExecuteAsync(CancellationToken stoppingToken)</code></pre>
</div>
<h4 class="section">Parameters</h4>
<dl class="parameters">
<dt><code>stoppingToken</code> <span class="xref">CancellationToken</span></dt>
<dd></dd>
</dl>
<h4 class="section">Returns</h4>
<dl class="parameters">
<dt><span class="xref">Task</span></dt>
<dd></dd>
</dl>
</article>
<div class="contribution d-print-none">
<a href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Services/Stats/ServerStatsReportService.cs" class="edit-link">Edit this page</a>
</div>
</div>
<div class="affix">
<nav id="affix"></nav>
</div>
</main>
<div class="container-xxl search-results" id="search-results"></div>
<footer class="border-top text-secondary">
<div class="container-xxl">
<div class="flex-fill">
<div class='footer-custom'><div class='footer-inner'><span class='footer-brand'>EchoHub</span><span class='footer-sep'>&middot;</span><a href='https://github.com/HueByte/EchoHub'>GitHub</a><span class='footer-sep'>&middot;</span><a href='https://echohub.voidcube.cloud'>Website</a></div></div>
</div>
</div>
</footer>
</body>
</html>
@@ -0,0 +1,624 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Struct StatsCounters | EchoHub Documentation </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Struct StatsCounters | EchoHub Documentation ">
<meta name="description" content="Immutable snapshot of the counters held by .">
<link rel="icon" href="../../images/hue_icon.svg">
<link rel="stylesheet" href="../../public/docfx.min.css">
<link rel="stylesheet" href="../../public/main.css">
<meta name="docfx:navrel" content="../../toc.html">
<meta name="docfx:tocrel" content="../toc.html">
<meta name="docfx:rel" content="../../">
<meta name="docfx:docurl" content="https://github.com/HueByte/EchoHub/new/master/apiSpec/new?filename=EchoHub_Server_Services_Stats_StatsCounters.md&amp;value=---%0Auid%3A%20EchoHub.Server.Services.Stats.StatsCounters%0Asummary%3A%20&#39;*You%20can%20override%20summary%20for%20the%20API%20here%20using%20*MARKDOWN*%20syntax&#39;%0A---%0A%0A*Please%20type%20below%20more%20information%20about%20this%20API%3A*%0A%0A">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &quot;{query}&quot;">
<meta name="loc:searchNoResults" content="No results for &quot;{query}&quot;">
<meta name="loc:tocFilter" content="Filter by title">
<meta name="loc:nextArticle" content="Next">
<meta name="loc:prevArticle" content="Previous">
<meta name="loc:themeLight" content="Light">
<meta name="loc:themeDark" content="Dark">
<meta name="loc:themeAuto" content="Auto">
<meta name="loc:changeTheme" content="Change theme">
<meta name="loc:copy" content="Copy">
<meta name="loc:downloadPdf" content="Download PDF">
<script type="module" src="./../../public/docfx.min.js"></script>
<script>
const theme = localStorage.getItem('theme') || 'auto'
document.documentElement.setAttribute('data-bs-theme', theme === 'auto' ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light') : theme)
</script>
</head>
<body class="tex2jax_ignore" data-layout="" data-yaml-mime="ManagedReference">
<header class="bg-body border-bottom">
<nav id="autocollapse" class="navbar navbar-expand-md" role="navigation">
<div class="container-xxl flex-nowrap">
<a class="navbar-brand" href="../../index.html">
<img id="logo" class="svg" src="../../images/hue_icon.svg" alt="EchoHub">
EchoHub
</a>
<button class="btn btn-lg d-md-none border-0" type="button" data-bs-toggle="collapse" data-bs-target="#navpanel" aria-controls="navpanel" aria-expanded="false" aria-label="Toggle navigation">
<i class="bi bi-three-dots"></i>
</button>
<div class="collapse navbar-collapse" id="navpanel">
<div id="navbar">
<form class="search" role="search" id="search">
<i class="bi bi-search"></i>
<input class="form-control" id="search-query" type="search" disabled placeholder="Search" autocomplete="off" aria-label="Search">
</form>
</div>
</div>
</div>
</nav>
</header>
<main class="container-xxl">
<div class="toc-offcanvas">
<div class="offcanvas-md offcanvas-start" tabindex="-1" id="tocOffcanvas" aria-labelledby="tocOffcanvasLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="tocOffcanvasLabel">Table of Contents</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" data-bs-target="#tocOffcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<nav class="toc" id="toc"></nav>
</div>
</div>
</div>
<div class="content">
<div class="actionbar">
<button class="btn btn-lg border-0 d-md-none" type="button" data-bs-toggle="offcanvas" data-bs-target="#tocOffcanvas" aria-controls="tocOffcanvas" aria-expanded="false" aria-label="Show table of contents">
<i class="bi bi-list"></i>
</button>
<nav id="breadcrumb"></nav>
</div>
<article data-uid="EchoHub.Server.Services.Stats.StatsCounters">
<h1 id="EchoHub_Server_Services_Stats_StatsCounters" data-uid="EchoHub.Server.Services.Stats.StatsCounters" class="text-break">
Struct StatsCounters <a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Services/Stats/ServerStatsCollector.cs"><i class="bi bi-code-slash"></i></a>
</h1>
<div class="facts text-secondary">
<dl><dt>Namespace</dt><dd><a class="xref" href="EchoHub.html">EchoHub</a>.<a class="xref" href="EchoHub.Server.html">Server</a>.<a class="xref" href="EchoHub.Server.Services.html">Services</a>.<a class="xref" href="EchoHub.Server.Services.Stats.html">Stats</a></dd></dl>
<dl><dt>Assembly</dt><dd>EchoHub.Server.dll</dd></dl>
</div>
<div class="markdown summary"><p>Immutable snapshot of the counters held by <a class="xref" href="EchoHub.Server.Services.Stats.ServerStatsCollector.html">ServerStatsCollector</a>.</p>
</div>
<div class="markdown conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public readonly struct StatsCounters : IEquatable&lt;StatsCounters&gt;</code></pre>
</div>
<dl class="typelist implements">
<dt>Implements</dt>
<dd>
<div><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.iequatable-1">IEquatable</a>&lt;<a class="xref" href="EchoHub.Server.Services.Stats.StatsCounters.html">StatsCounters</a>&gt;</div>
</dd>
</dl>
<dl class="typelist inheritedMembers">
<dt>Inherited Members</dt>
<dd>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.gettype">object.GetType()</a>
</div>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals(system-object-system-object)">object.Equals(object, object)</a>
</div>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.referenceequals">object.ReferenceEquals(object, object)</a>
</div>
</dd></dl>
<h2 class="section" id="constructors">Constructors
</h2>
<a id="EchoHub_Server_Services_Stats_StatsCounters__ctor_" data-uid="EchoHub.Server.Services.Stats.StatsCounters.#ctor*"></a>
<h3 id="EchoHub_Server_Services_Stats_StatsCounters__ctor_System_Int64_System_Int64_System_Int64_System_Int64_System_Int32_" data-uid="EchoHub.Server.Services.Stats.StatsCounters.#ctor(System.Int64,System.Int64,System.Int64,System.Int64,System.Int32)">
StatsCounters(long, long, long, long, int)
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Services/Stats/ServerStatsCollector.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"><p>Immutable snapshot of the counters held by <a class="xref" href="EchoHub.Server.Services.Stats.ServerStatsCollector.html">ServerStatsCollector</a>.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public StatsCounters(long Connections, long Disconnections, long Kicks, long Bans, int PeakOnline)</code></pre>
</div>
<h4 class="section">Parameters</h4>
<dl class="parameters">
<dt><code>Connections</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.int64">long</a></dt>
<dd></dd>
<dt><code>Disconnections</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.int64">long</a></dt>
<dd></dd>
<dt><code>Kicks</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.int64">long</a></dt>
<dd></dd>
<dt><code>Bans</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.int64">long</a></dt>
<dd></dd>
<dt><code>PeakOnline</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.int32">int</a></dt>
<dd></dd>
</dl>
<h2 class="section" id="properties">Properties
</h2>
<a id="EchoHub_Server_Services_Stats_StatsCounters_Bans_" data-uid="EchoHub.Server.Services.Stats.StatsCounters.Bans*"></a>
<h3 id="EchoHub_Server_Services_Stats_StatsCounters_Bans" data-uid="EchoHub.Server.Services.Stats.StatsCounters.Bans">
Bans
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Services/Stats/ServerStatsCollector.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"></div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public long Bans { get; init; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.int64">long</a></dt>
<dd></dd>
</dl>
<a id="EchoHub_Server_Services_Stats_StatsCounters_Connections_" data-uid="EchoHub.Server.Services.Stats.StatsCounters.Connections*"></a>
<h3 id="EchoHub_Server_Services_Stats_StatsCounters_Connections" data-uid="EchoHub.Server.Services.Stats.StatsCounters.Connections">
Connections
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Services/Stats/ServerStatsCollector.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"></div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public long Connections { get; init; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.int64">long</a></dt>
<dd></dd>
</dl>
<a id="EchoHub_Server_Services_Stats_StatsCounters_Disconnections_" data-uid="EchoHub.Server.Services.Stats.StatsCounters.Disconnections*"></a>
<h3 id="EchoHub_Server_Services_Stats_StatsCounters_Disconnections" data-uid="EchoHub.Server.Services.Stats.StatsCounters.Disconnections">
Disconnections
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Services/Stats/ServerStatsCollector.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"></div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public long Disconnections { get; init; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.int64">long</a></dt>
<dd></dd>
</dl>
<a id="EchoHub_Server_Services_Stats_StatsCounters_Kicks_" data-uid="EchoHub.Server.Services.Stats.StatsCounters.Kicks*"></a>
<h3 id="EchoHub_Server_Services_Stats_StatsCounters_Kicks" data-uid="EchoHub.Server.Services.Stats.StatsCounters.Kicks">
Kicks
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Services/Stats/ServerStatsCollector.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"></div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public long Kicks { get; init; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.int64">long</a></dt>
<dd></dd>
</dl>
<a id="EchoHub_Server_Services_Stats_StatsCounters_PeakOnline_" data-uid="EchoHub.Server.Services.Stats.StatsCounters.PeakOnline*"></a>
<h3 id="EchoHub_Server_Services_Stats_StatsCounters_PeakOnline" data-uid="EchoHub.Server.Services.Stats.StatsCounters.PeakOnline">
PeakOnline
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Services/Stats/ServerStatsCollector.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"></div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public int PeakOnline { get; init; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.int32">int</a></dt>
<dd></dd>
</dl>
<h2 class="section" id="methods">Methods
</h2>
<a id="EchoHub_Server_Services_Stats_StatsCounters_Deconstruct_" data-uid="EchoHub.Server.Services.Stats.StatsCounters.Deconstruct*"></a>
<h3 id="EchoHub_Server_Services_Stats_StatsCounters_Deconstruct_System_Int64__System_Int64__System_Int64__System_Int64__System_Int32__" data-uid="EchoHub.Server.Services.Stats.StatsCounters.Deconstruct(System.Int64@,System.Int64@,System.Int64@,System.Int64@,System.Int32@)">
Deconstruct(out long, out long, out long, out long, out int)
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Services/Stats/ServerStatsCollector.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"></div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public void Deconstruct(out long Connections, out long Disconnections, out long Kicks, out long Bans, out int PeakOnline)</code></pre>
</div>
<h4 class="section">Parameters</h4>
<dl class="parameters">
<dt><code>Connections</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.int64">long</a></dt>
<dd></dd>
<dt><code>Disconnections</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.int64">long</a></dt>
<dd></dd>
<dt><code>Kicks</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.int64">long</a></dt>
<dd></dd>
<dt><code>Bans</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.int64">long</a></dt>
<dd></dd>
<dt><code>PeakOnline</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.int32">int</a></dt>
<dd></dd>
</dl>
<a id="EchoHub_Server_Services_Stats_StatsCounters_Equals_" data-uid="EchoHub.Server.Services.Stats.StatsCounters.Equals*"></a>
<h3 id="EchoHub_Server_Services_Stats_StatsCounters_Equals_EchoHub_Server_Services_Stats_StatsCounters_" data-uid="EchoHub.Server.Services.Stats.StatsCounters.Equals(EchoHub.Server.Services.Stats.StatsCounters)">
Equals(StatsCounters)
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Services/Stats/ServerStatsCollector.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"></div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public bool Equals(StatsCounters other)</code></pre>
</div>
<h4 class="section">Parameters</h4>
<dl class="parameters">
<dt><code>other</code> <a class="xref" href="EchoHub.Server.Services.Stats.StatsCounters.html">StatsCounters</a></dt>
<dd></dd>
</dl>
<h4 class="section">Returns</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.boolean">bool</a></dt>
<dd></dd>
</dl>
<a id="EchoHub_Server_Services_Stats_StatsCounters_Equals_" data-uid="EchoHub.Server.Services.Stats.StatsCounters.Equals*"></a>
<h3 id="EchoHub_Server_Services_Stats_StatsCounters_Equals_System_Object_" data-uid="EchoHub.Server.Services.Stats.StatsCounters.Equals(System.Object)">
Equals(object)
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Services/Stats/ServerStatsCollector.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"></div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public override bool Equals(object obj)</code></pre>
</div>
<h4 class="section">Parameters</h4>
<dl class="parameters">
<dt><code>obj</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object">object</a></dt>
<dd></dd>
</dl>
<h4 class="section">Returns</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.boolean">bool</a></dt>
<dd></dd>
</dl>
<a id="EchoHub_Server_Services_Stats_StatsCounters_GetHashCode_" data-uid="EchoHub.Server.Services.Stats.StatsCounters.GetHashCode*"></a>
<h3 id="EchoHub_Server_Services_Stats_StatsCounters_GetHashCode" data-uid="EchoHub.Server.Services.Stats.StatsCounters.GetHashCode">
GetHashCode()
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Services/Stats/ServerStatsCollector.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"></div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public override int GetHashCode()</code></pre>
</div>
<h4 class="section">Returns</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.int32">int</a></dt>
<dd></dd>
</dl>
<a id="EchoHub_Server_Services_Stats_StatsCounters_ToString_" data-uid="EchoHub.Server.Services.Stats.StatsCounters.ToString*"></a>
<h3 id="EchoHub_Server_Services_Stats_StatsCounters_ToString" data-uid="EchoHub.Server.Services.Stats.StatsCounters.ToString">
ToString()
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Services/Stats/ServerStatsCollector.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"></div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public override string ToString()</code></pre>
</div>
<h4 class="section">Returns</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.string">string</a></dt>
<dd></dd>
</dl>
<h2 class="section" id="operators">Operators
</h2>
<a id="EchoHub_Server_Services_Stats_StatsCounters_op_Equality_" data-uid="EchoHub.Server.Services.Stats.StatsCounters.op_Equality*"></a>
<h3 id="EchoHub_Server_Services_Stats_StatsCounters_op_Equality_EchoHub_Server_Services_Stats_StatsCounters_EchoHub_Server_Services_Stats_StatsCounters_" data-uid="EchoHub.Server.Services.Stats.StatsCounters.op_Equality(EchoHub.Server.Services.Stats.StatsCounters,EchoHub.Server.Services.Stats.StatsCounters)">
operator ==(StatsCounters, StatsCounters)
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Services/Stats/ServerStatsCollector.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"></div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public static bool operator ==(StatsCounters left, StatsCounters right)</code></pre>
</div>
<h4 class="section">Parameters</h4>
<dl class="parameters">
<dt><code>left</code> <a class="xref" href="EchoHub.Server.Services.Stats.StatsCounters.html">StatsCounters</a></dt>
<dd></dd>
<dt><code>right</code> <a class="xref" href="EchoHub.Server.Services.Stats.StatsCounters.html">StatsCounters</a></dt>
<dd></dd>
</dl>
<h4 class="section">Returns</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.boolean">bool</a></dt>
<dd></dd>
</dl>
<a id="EchoHub_Server_Services_Stats_StatsCounters_op_Inequality_" data-uid="EchoHub.Server.Services.Stats.StatsCounters.op_Inequality*"></a>
<h3 id="EchoHub_Server_Services_Stats_StatsCounters_op_Inequality_EchoHub_Server_Services_Stats_StatsCounters_EchoHub_Server_Services_Stats_StatsCounters_" data-uid="EchoHub.Server.Services.Stats.StatsCounters.op_Inequality(EchoHub.Server.Services.Stats.StatsCounters,EchoHub.Server.Services.Stats.StatsCounters)">
operator !=(StatsCounters, StatsCounters)
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Services/Stats/ServerStatsCollector.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"></div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public static bool operator !=(StatsCounters left, StatsCounters right)</code></pre>
</div>
<h4 class="section">Parameters</h4>
<dl class="parameters">
<dt><code>left</code> <a class="xref" href="EchoHub.Server.Services.Stats.StatsCounters.html">StatsCounters</a></dt>
<dd></dd>
<dt><code>right</code> <a class="xref" href="EchoHub.Server.Services.Stats.StatsCounters.html">StatsCounters</a></dt>
<dd></dd>
</dl>
<h4 class="section">Returns</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.boolean">bool</a></dt>
<dd></dd>
</dl>
</article>
<div class="contribution d-print-none">
<a href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Services/Stats/ServerStatsCollector.cs" class="edit-link">Edit this page</a>
</div>
</div>
<div class="affix">
<nav id="affix"></nav>
</div>
</main>
<div class="container-xxl search-results" id="search-results"></div>
<footer class="border-top text-secondary">
<div class="container-xxl">
<div class="flex-fill">
<div class='footer-custom'><div class='footer-inner'><span class='footer-brand'>EchoHub</span><span class='footer-sep'>&middot;</span><a href='https://github.com/HueByte/EchoHub'>GitHub</a><span class='footer-sep'>&middot;</span><a href='https://echohub.voidcube.cloud'>Website</a></div></div>
</div>
</div>
</footer>
</body>
</html>
@@ -0,0 +1,147 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Namespace EchoHub.Server.Services.Stats | EchoHub Documentation </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Namespace EchoHub.Server.Services.Stats | EchoHub Documentation ">
<link rel="icon" href="../../images/hue_icon.svg">
<link rel="stylesheet" href="../../public/docfx.min.css">
<link rel="stylesheet" href="../../public/main.css">
<meta name="docfx:navrel" content="../../toc.html">
<meta name="docfx:tocrel" content="../toc.html">
<meta name="docfx:rel" content="../../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &quot;{query}&quot;">
<meta name="loc:searchNoResults" content="No results for &quot;{query}&quot;">
<meta name="loc:tocFilter" content="Filter by title">
<meta name="loc:nextArticle" content="Next">
<meta name="loc:prevArticle" content="Previous">
<meta name="loc:themeLight" content="Light">
<meta name="loc:themeDark" content="Dark">
<meta name="loc:themeAuto" content="Auto">
<meta name="loc:changeTheme" content="Change theme">
<meta name="loc:copy" content="Copy">
<meta name="loc:downloadPdf" content="Download PDF">
<script type="module" src="./../../public/docfx.min.js"></script>
<script>
const theme = localStorage.getItem('theme') || 'auto'
document.documentElement.setAttribute('data-bs-theme', theme === 'auto' ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light') : theme)
</script>
</head>
<body class="tex2jax_ignore" data-layout="" data-yaml-mime="ManagedReference">
<header class="bg-body border-bottom">
<nav id="autocollapse" class="navbar navbar-expand-md" role="navigation">
<div class="container-xxl flex-nowrap">
<a class="navbar-brand" href="../../index.html">
<img id="logo" class="svg" src="../../images/hue_icon.svg" alt="EchoHub">
EchoHub
</a>
<button class="btn btn-lg d-md-none border-0" type="button" data-bs-toggle="collapse" data-bs-target="#navpanel" aria-controls="navpanel" aria-expanded="false" aria-label="Toggle navigation">
<i class="bi bi-three-dots"></i>
</button>
<div class="collapse navbar-collapse" id="navpanel">
<div id="navbar">
<form class="search" role="search" id="search">
<i class="bi bi-search"></i>
<input class="form-control" id="search-query" type="search" disabled placeholder="Search" autocomplete="off" aria-label="Search">
</form>
</div>
</div>
</div>
</nav>
</header>
<main class="container-xxl">
<div class="toc-offcanvas">
<div class="offcanvas-md offcanvas-start" tabindex="-1" id="tocOffcanvas" aria-labelledby="tocOffcanvasLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="tocOffcanvasLabel">Table of Contents</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" data-bs-target="#tocOffcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<nav class="toc" id="toc"></nav>
</div>
</div>
</div>
<div class="content">
<div class="actionbar">
<button class="btn btn-lg border-0 d-md-none" type="button" data-bs-toggle="offcanvas" data-bs-target="#tocOffcanvas" aria-controls="tocOffcanvas" aria-expanded="false" aria-label="Show table of contents">
<i class="bi bi-list"></i>
</button>
<nav id="breadcrumb"></nav>
</div>
<article data-uid="EchoHub.Server.Services.Stats">
<h1 id="EchoHub_Server_Services_Stats" data-uid="EchoHub.Server.Services.Stats" class="text-break">Namespace EchoHub.Server.Services.Stats</h1>
<div class="markdown level0 summary"></div>
<div class="markdown level0 conceptual"></div>
<div class="markdown level0 remarks"></div>
<h3 id="classes">
Classes
</h3>
<dl class="jumplist">
<dt><a class="xref" href="EchoHub.Server.Services.Stats.ServerStatsCollector.html">ServerStatsCollector</a></dt>
<dd><p>Thread-safe, in-memory accumulator for server-activity counters that have no natural
database timestamp to query after the fact — session connects/disconnects, moderation
actions, and peak concurrency. The periodic stats-report job snapshots and resets these
once per reporting window. Registered as a singleton; every increment is lock-free so it
is safe to call from hot paths (connect/disconnect).</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="EchoHub.Server.Services.Stats.ServerStatsReportService.html">ServerStatsReportService</a></dt>
<dd><p>Background job that periodically snapshots server activity over a window, logs it as
pretty-printed JSON (which also surfaces in the live server-logs room), and persists it to
the database for historical trends. Interval and retention are configurable via the &quot;Stats&quot;
section; the default cadence is every 6 hours.</p>
</dd>
</dl>
<h3 id="structs">
Structs
</h3>
<dl class="jumplist">
<dt><a class="xref" href="EchoHub.Server.Services.Stats.StatsCounters.html">StatsCounters</a></dt>
<dd><p>Immutable snapshot of the counters held by <a class="xref" href="EchoHub.Server.Services.Stats.ServerStatsCollector.html">ServerStatsCollector</a>.</p>
</dd>
</dl>
</article>
<div class="contribution d-print-none">
</div>
</div>
<div class="affix">
<nav id="affix"></nav>
</div>
</main>
<div class="container-xxl search-results" id="search-results"></div>
<footer class="border-top text-secondary">
<div class="container-xxl">
<div class="flex-fill">
<div class='footer-custom'><div class='footer-inner'><span class='footer-brand'>EchoHub</span><span class='footer-sep'>&middot;</span><a href='https://github.com/HueByte/EchoHub'>GitHub</a><span class='footer-sep'>&middot;</span><a href='https://echohub.voidcube.cloud'>Website</a></div></div>
</div>
</div>
</footer>
</body>
</html>
+25
View File
@@ -517,6 +517,9 @@
<li>
<a href="core/EchoHub.Core.Models.ServerRole.html" name="" title="ServerRole">ServerRole</a>
</li>
<li>
<a href="core/EchoHub.Core.Models.ServerStatsReport.html" name="" title="ServerStatsReport">ServerStatsReport</a>
</li>
<li>
<a href="core/EchoHub.Core.Models.User.html" name="" title="User">User</a>
</li>
@@ -599,6 +602,9 @@
<li>
<a href="server/EchoHub.Server.Config.SpamOptions.html" name="" title="SpamOptions">SpamOptions</a>
</li>
<li>
<a href="server/EchoHub.Server.Config.StatsOptions.html" name="" title="StatsOptions">StatsOptions</a>
</li>
<li>
<a href="server/EchoHub.Server.Config.UploadLimits.html" name="" title="UploadLimits">UploadLimits</a>
</li>
@@ -680,6 +686,9 @@
<li>
<a href="server/EchoHub.Server.Data.Migrations.AddModerationRoles.html" name="" title="AddModerationRoles">AddModerationRoles</a>
</li>
<li>
<a href="server/EchoHub.Server.Data.Migrations.AddServerStatsReports.html" name="" title="AddServerStatsReports">AddServerStatsReports</a>
</li>
<li>
<a href="server/EchoHub.Server.Data.Migrations.InitialCreate.html" name="" title="InitialCreate">InitialCreate</a>
</li>
@@ -769,6 +778,22 @@
</li>
</ul>
</li>
<li>
<span class="expand-stub"></span>
<a href="server/EchoHub.Server.Services.Stats.html" name="" title="EchoHub.Server.Services.Stats">EchoHub.Server.Services.Stats</a>
<ul class="nav level4">
<li>
<a href="server/EchoHub.Server.Services.Stats.ServerStatsCollector.html" name="" title="ServerStatsCollector">ServerStatsCollector</a>
</li>
<li>
<a href="server/EchoHub.Server.Services.Stats.ServerStatsReportService.html" name="" title="ServerStatsReportService">ServerStatsReportService</a>
</li>
<li>
<a href="server/EchoHub.Server.Services.Stats.StatsCounters.html" name="" title="StatsCounters">StatsCounters</a>
</li>
</ul>
</li>
<li>
<span class="expand-stub"></span>
<a href="server/EchoHub.Server.Setup.html" name="" title="EchoHub.Server.Setup">EchoHub.Server.Setup</a>
+1 -1
View File
File diff suppressed because one or more lines are too long