This commit is contained in:
HueByte
2026-07-16 14:53:28 +00:00
parent 9944e86ee3
commit c7f47c5104
36 changed files with 3728 additions and 276 deletions
@@ -225,6 +225,39 @@ Wires UI events to service calls and connection events to UI updates.</p>
<a id="EchoHub_Client_AppOrchestrator_PendingUpdate_" data-uid="EchoHub.Client.AppOrchestrator.PendingUpdate*"></a>
<h3 id="EchoHub_Client_AppOrchestrator_PendingUpdate" data-uid="EchoHub.Client.AppOrchestrator.PendingUpdate">
PendingUpdate
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Client/AppOrchestrator.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"><p>Set when the user confirms an update. The host must run this after the Terminal.Gui main
loop exits (console restored), so the updater's in-place restart doesn't fight the TUI.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public Func&lt;Task&gt;? PendingUpdate { get; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.func-1">Func</a>&lt;<span class="xref">Task</span>&gt;</dt>
<dd></dd>
</dl>
<h2 class="section" id="methods">Methods
</h2>
@@ -679,6 +679,36 @@ Class CommandHandler <a class="header-action link-secondary" title="View source
<h3 id="EchoHub_Client_Commands_CommandHandler_OnRoomInfo" data-uid="EchoHub.Client.Commands.CommandHandler.OnRoomInfo">
OnRoomInfo
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Client/Commands/CommandHandler.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 event Func&lt;Task&gt;? OnRoomInfo</code></pre>
</div>
<h4 class="section">Event Type</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.func-1">Func</a>&lt;<span class="xref">Task</span>&gt;</dt>
<dd></dd>
</dl>
<h3 id="EchoHub_Client_Commands_CommandHandler_OnSendFile" data-uid="EchoHub.Client.Commands.CommandHandler.OnSendFile">
OnSendFile
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Client/Commands/CommandHandler.cs"><i class="bi bi-code-slash"></i></a>
@@ -247,6 +247,72 @@ user's machine — the server never sees them.</p>
<a id="EchoHub_Client_Config_SavedServer_LastReadMessages_" data-uid="EchoHub.Client.Config.SavedServer.LastReadMessages*"></a>
<h3 id="EchoHub_Client_Config_SavedServer_LastReadMessages" data-uid="EchoHub.Client.Config.SavedServer.LastReadMessages">
LastReadMessages
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Client/Config/ClientConfig.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"><p>Last message the user has read per channel (message id as string), persisted so
unread counts, @mention highlights, and the &quot;new messages&quot; marker survive restarts.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public Dictionary&lt;string, string&gt; LastReadMessages { get; set; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><span class="xref">Dictionary</span>&lt;<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.string">string</a>, <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.string">string</a>&gt;</dt>
<dd></dd>
</dl>
<a id="EchoHub_Client_Config_SavedServer_LeftChannels_" data-uid="EchoHub.Client.Config.SavedServer.LeftChannels*"></a>
<h3 id="EchoHub_Client_Config_SavedServer_LeftChannels" data-uid="EchoHub.Client.Config.SavedServer.LeftChannels">
LeftChannels
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Client/Config/ClientConfig.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"><p>Channels the user explicitly left with /leave. Excluded from the automatic
join-all-channels pass at connect until the user joins them again.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public List&lt;string&gt; LeftChannels { get; set; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><span class="xref">List</span>&lt;<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.string">string</a>&gt;</dt>
<dd></dd>
</dl>
<a id="EchoHub_Client_Config_SavedServer_Name_" data-uid="EchoHub.Client.Config.SavedServer.Name*"></a>
<h3 id="EchoHub_Client_Config_SavedServer_Name" data-uid="EchoHub.Client.Config.SavedServer.Name">
@@ -583,6 +583,44 @@ key-derivation salt). Returns null when the channel doesn't exist.</p>
<a id="EchoHub_Client_Services_ApiClient_GetChannelMetaAsync_" data-uid="EchoHub.Client.Services.ApiClient.GetChannelMetaAsync*"></a>
<h3 id="EchoHub_Client_Services_ApiClient_GetChannelMetaAsync_System_String_" data-uid="EchoHub.Client.Services.ApiClient.GetChannelMetaAsync(System.String)">
GetChannelMetaAsync(string)
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Client/Services/ApiClient.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"><p>Fetches a channel's human-facing metadata (message count, unique posters, estimated
size, created date, room id) for the <code>/meta</code> command. Returns null if it doesn't exist.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public Task&lt;ChannelMetaDto?&gt; GetChannelMetaAsync(string channelName)</code></pre>
</div>
<h4 class="section">Parameters</h4>
<dl class="parameters">
<dt><code>channelName</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.string">string</a></dt>
<dd></dd>
</dl>
<h4 class="section">Returns</h4>
<dl class="parameters">
<dt><span class="xref">Task</span>&lt;<a class="xref" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Core/DTOs/ChatDtos.cs">ChannelMetaDto</a>&gt;</dt>
<dd></dd>
</dl>
<a id="EchoHub_Client_Services_ApiClient_GetChannelsAsync_" data-uid="EchoHub.Client.Services.ApiClient.GetChannelsAsync*"></a>
<h3 id="EchoHub_Client_Services_ApiClient_GetChannelsAsync" data-uid="EchoHub.Client.Services.ApiClient.GetChannelsAsync">
@@ -221,6 +221,40 @@ Class UpdateChecker <a class="header-action link-secondary" title="View source"
<a id="EchoHub_Client_Services_UpdateChecker_PendingUpdate_" data-uid="EchoHub.Client.Services.UpdateChecker.PendingUpdate*"></a>
<h3 id="EchoHub_Client_Services_UpdateChecker_PendingUpdate" data-uid="EchoHub.Client.Services.UpdateChecker.PendingUpdate">
PendingUpdate
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Client/Services/UpdateChecker.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"><p>Set when the user confirms an update. The host runs this <b>after</b> the Terminal.Gui
main loop has exited and the console is restored, so the library's in-place restart doesn't
deadlock against a TUI that still owns the console.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public Func&lt;Task&gt;? PendingUpdate { get; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.func-1">Func</a>&lt;<span class="xref">Task</span>&gt;</dt>
<dd></dd>
</dl>
<h2 class="section" id="methods">Methods
</h2>
@@ -213,6 +213,41 @@ Class Theme <a class="header-action link-secondary" title="View source" href="h
<a id="EchoHub_Client_Themes_Theme_Border_" data-uid="EchoHub.Client.Themes.Theme.Border*"></a>
<h3 id="EchoHub_Client_Themes_Theme_Border" data-uid="EchoHub.Client.Themes.Theme.Border">
Border
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Client/Themes/Theme.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"><p>Colors for the main-window frame borders (and their titles). Null falls back
to <a class="xref" href="EchoHub.Client.Themes.Theme.html#EchoHub_Client_Themes_Theme_Base">Base</a>. Lets themes tone borders down independently of text —
e.g. the transparent themes use a dim gray for a subtler, glassy look.
Supports hex values (&quot;#6E6E6E&quot;) as well as named colors.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public ThemeColors? Border { get; set; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="EchoHub.Client.Themes.ThemeColors.html">ThemeColors</a></dt>
<dd></dd>
</dl>
<a id="EchoHub_Client_Themes_Theme_Dialog_" data-uid="EchoHub.Client.Themes.Theme.Dialog*"></a>
<h3 id="EchoHub_Client_Themes_Theme_Dialog" data-uid="EchoHub.Client.Themes.Theme.Dialog">
@@ -214,6 +214,37 @@ Class ChatColors <a class="header-action link-secondary" title="View source" hr
<h3 id="EchoHub_Client_UI_Chat_ChatColors_DateRuleAttr" data-uid="EchoHub.Client.UI.Chat.ChatColors.DateRuleAttr">
DateRuleAttr
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Client/UI/Chat/ChatColors.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"><p>Horizontal date-separator rules (── Wed, Jul 16 ──…).</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public static readonly Attribute DateRuleAttr</code></pre>
</div>
<h4 class="section">Field Value</h4>
<dl class="parameters">
<dt><span class="xref">Attribute</span></dt>
<dd></dd>
</dl>
<h3 id="EchoHub_Client_UI_Chat_ChatColors_EmbedBorderAttr" data-uid="EchoHub.Client.UI.Chat.ChatColors.EmbedBorderAttr">
EmbedBorderAttr
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Client/UI/Chat/ChatColors.cs"><i class="bi bi-code-slash"></i></a>
@@ -424,6 +455,37 @@ Class ChatColors <a class="header-action link-secondary" title="View source" hr
<h3 id="EchoHub_Client_UI_Chat_ChatColors_RailAttr" data-uid="EchoHub.Client.UI.Chat.ChatColors.RailAttr">
RailAttr
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Client/UI/Chat/ChatColors.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"><p>The dim vertical rail (│) separating the nick column from message text.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public static readonly Attribute RailAttr</code></pre>
</div>
<h4 class="section">Field Value</h4>
<dl class="parameters">
<dt><span class="xref">Attribute</span></dt>
<dd></dd>
</dl>
<h3 id="EchoHub_Client_UI_Chat_ChatColors_SystemAttr" data-uid="EchoHub.Client.UI.Chat.ChatColors.SystemAttr">
SystemAttr
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Client/UI/Chat/ChatColors.cs"><i class="bi bi-code-slash"></i></a>
@@ -483,6 +545,37 @@ Class ChatColors <a class="header-action link-secondary" title="View source" hr
<h3 id="EchoHub_Client_UI_Chat_ChatColors_UnreadMarkerAttr" data-uid="EchoHub.Client.UI.Chat.ChatColors.UnreadMarkerAttr">
UnreadMarkerAttr
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Client/UI/Chat/ChatColors.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"><p>The irssi-style &quot;new messages&quot; unread marker rule.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public static readonly Attribute UnreadMarkerAttr</code></pre>
</div>
<h4 class="section">Field Value</h4>
<dl class="parameters">
<dt><span class="xref">Attribute</span></dt>
<dd></dd>
</dl>
<h2 class="section" id="methods">Methods
</h2>
@@ -341,6 +341,40 @@ Class ChatLine <a class="header-action link-secondary" title="View source" href
<a id="EchoHub_Client_UI_Chat_ChatLine_ContinuationPrefixSegments_" data-uid="EchoHub.Client.UI.Chat.ChatLine.ContinuationPrefixSegments*"></a>
<h3 id="EchoHub_Client_UI_Chat_ChatLine_ContinuationPrefixSegments" data-uid="EchoHub.Client.UI.Chat.ChatLine.ContinuationPrefixSegments">
ContinuationPrefixSegments
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Client/UI/Chat/ChatLine.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"><p>Colored segments to prepend on continuation lines instead of plain spaces
(e.g. the nick-column rail &quot;&quot;). When set, takes
precedence over <a class="xref" href="EchoHub.Client.UI.Chat.ChatLine.html#EchoHub_Client_UI_Chat_ChatLine_ContinuationIndent">ContinuationIndent</a>.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public List&lt;ChatSegment&gt;? ContinuationPrefixSegments { get; set; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><span class="xref">List</span>&lt;<a class="xref" href="EchoHub.Client.UI.Chat.ChatSegment.html">ChatSegment</a>&gt;</dt>
<dd></dd>
</dl>
<a id="EchoHub_Client_UI_Chat_ChatLine_IsMention_" data-uid="EchoHub.Client.UI.Chat.ChatLine.IsMention*"></a>
<h3 id="EchoHub_Client_UI_Chat_ChatLine_IsMention" data-uid="EchoHub.Client.UI.Chat.ChatLine.IsMention">
@@ -372,6 +406,38 @@ Class ChatLine <a class="header-action link-secondary" title="View source" href
<a id="EchoHub_Client_UI_Chat_ChatLine_IsUnreadMarker_" data-uid="EchoHub.Client.UI.Chat.ChatLine.IsUnreadMarker*"></a>
<h3 id="EchoHub_Client_UI_Chat_ChatLine_IsUnreadMarker" data-uid="EchoHub.Client.UI.Chat.ChatLine.IsUnreadMarker">
IsUnreadMarker
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Client/UI/Chat/ChatLine.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"><p>True for the &quot;new messages&quot; unread-marker rule so it can be removed on channel switch.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public bool IsUnreadMarker { 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_Client_UI_Chat_ChatLine_MessageId_" data-uid="EchoHub.Client.UI.Chat.ChatLine.MessageId*"></a>
<h3 id="EchoHub_Client_UI_Chat_ChatLine_MessageId" data-uid="EchoHub.Client.UI.Chat.ChatLine.MessageId">
@@ -403,6 +469,71 @@ Class ChatLine <a class="header-action link-secondary" title="View source" href
<a id="EchoHub_Client_UI_Chat_ChatLine_RuleAttr_" data-uid="EchoHub.Client.UI.Chat.ChatLine.RuleAttr*"></a>
<h3 id="EchoHub_Client_UI_Chat_ChatLine_RuleAttr" data-uid="EchoHub.Client.UI.Chat.ChatLine.RuleAttr">
RuleAttr
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Client/UI/Chat/ChatLine.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"><p>Color for a rule line; null falls back to <a class="xref" href="EchoHub.Client.UI.Chat.ChatColors.html#EchoHub_Client_UI_Chat_ChatColors_DateRuleAttr">DateRuleAttr</a>.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public Attribute? RuleAttr { get; set; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><span class="xref">Attribute</span>?</dt>
<dd></dd>
</dl>
<a id="EchoHub_Client_UI_Chat_ChatLine_RuleLabel_" data-uid="EchoHub.Client.UI.Chat.ChatLine.RuleLabel*"></a>
<h3 id="EchoHub_Client_UI_Chat_ChatLine_RuleLabel" data-uid="EchoHub.Client.UI.Chat.ChatLine.RuleLabel">
RuleLabel
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Client/UI/Chat/ChatLine.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"><p>When set, this line is a horizontal separator rule (date change, unread marker).
The view regenerates it to the current viewport width instead of word-wrapping.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public string? RuleLabel { 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.string">string</a></dt>
<dd></dd>
</dl>
<a id="EchoHub_Client_UI_Chat_ChatLine_Segments_" data-uid="EchoHub.Client.UI.Chat.ChatLine.Segments*"></a>
<h3 id="EchoHub_Client_UI_Chat_ChatLine_Segments" data-uid="EchoHub.Client.UI.Chat.ChatLine.Segments">
@@ -178,6 +178,72 @@ so the UI layer can refresh.</p>
<h2 class="section" id="fields">Fields
</h2>
<h3 id="EchoHub_Client_UI_Chat_ChatMessageManager_ContentIndentCols" data-uid="EchoHub.Client.UI.Chat.ChatMessageManager.ContentIndentCols">
ContentIndentCols
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Client/UI/Chat/ChatMessageManager.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"><p>Columns before message text starts: &quot;HH:mm &quot; + nick column + &quot;&quot;.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public const int ContentIndentCols = 21</code></pre>
</div>
<h4 class="section">Field Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.int32">int</a></dt>
<dd></dd>
</dl>
<h3 id="EchoHub_Client_UI_Chat_ChatMessageManager_NickColWidth" data-uid="EchoHub.Client.UI.Chat.ChatMessageManager.NickColWidth">
NickColWidth
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Client/UI/Chat/ChatMessageManager.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"><p>Columns reserved for the right-aligned nick column (WeeChat-style).</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public const int NickColWidth = 12</code></pre>
</div>
<h4 class="section">Field 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="properties">Properties
</h2>
@@ -245,6 +311,71 @@ so the UI layer can refresh.</p>
<a id="EchoHub_Client_UI_Chat_ChatMessageManager_LastReadIds_" data-uid="EchoHub.Client.UI.Chat.ChatMessageManager.LastReadIds*"></a>
<h3 id="EchoHub_Client_UI_Chat_ChatMessageManager_LastReadIds" data-uid="EchoHub.Client.UI.Chat.ChatMessageManager.LastReadIds">
LastReadIds
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Client/UI/Chat/ChatMessageManager.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"><p>Last message the user has read per channel — persisted by the orchestrator so
unread/mention state can be seeded from history on the next connect.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public IReadOnlyDictionary&lt;string, Guid&gt; LastReadIds { get; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><span class="xref">IReadOnlyDictionary</span>&lt;<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.string">string</a>, <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.guid">Guid</a>&gt;</dt>
<dd></dd>
</dl>
<a id="EchoHub_Client_UI_Chat_ChatMessageManager_MentionChannels_" data-uid="EchoHub.Client.UI.Chat.ChatMessageManager.MentionChannels*"></a>
<h3 id="EchoHub_Client_UI_Chat_ChatMessageManager_MentionChannels" data-uid="EchoHub.Client.UI.Chat.ChatMessageManager.MentionChannels">
MentionChannels
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Client/UI/Chat/ChatMessageManager.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"><p>Channels with an unread @mention of the current user (cleared by <a class="xref" href="EchoHub.Client.UI.Chat.ChatMessageManager.html#EchoHub_Client_UI_Chat_ChatMessageManager_ClearUnread_System_String_">ClearUnread(string)</a>).</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public IReadOnlySet&lt;string&gt; MentionChannels { get; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><span class="xref">IReadOnlySet</span>&lt;<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.string">string</a>&gt;</dt>
<dd></dd>
</dl>
<h2 class="section" id="methods">Methods
</h2>
@@ -515,17 +646,20 @@ so the UI layer can refresh.</p>
<a id="EchoHub_Client_UI_Chat_ChatMessageManager_LoadHistory_" data-uid="EchoHub.Client.UI.Chat.ChatMessageManager.LoadHistory*"></a>
<h3 id="EchoHub_Client_UI_Chat_ChatMessageManager_LoadHistory_System_String_System_Collections_Generic_List_EchoHub_Core_DTOs_MessageDto__" data-uid="EchoHub.Client.UI.Chat.ChatMessageManager.LoadHistory(System.String,System.Collections.Generic.List{EchoHub.Core.DTOs.MessageDto})">
LoadHistory(string, List&lt;MessageDto&gt;)
<h3 id="EchoHub_Client_UI_Chat_ChatMessageManager_LoadHistory_System_String_System_Collections_Generic_List_EchoHub_Core_DTOs_MessageDto__System_Nullable_System_Guid__" data-uid="EchoHub.Client.UI.Chat.ChatMessageManager.LoadHistory(System.String,System.Collections.Generic.List{EchoHub.Core.DTOs.MessageDto},System.Nullable{System.Guid})">
LoadHistory(string, List&lt;MessageDto&gt;, Guid?)
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Client/UI/Chat/ChatMessageManager.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"><p>Load historical messages into a channel, replacing any existing messages.</p>
<div class="markdown level1 summary"><p>Load historical messages into a channel, replacing any existing messages.
When <code class="paramref">lastReadId</code> is given (persisted from a previous session),
messages after it seed the unread count, @mention highlight, and the
&quot;new messages&quot; marker — so activity that happened while offline still lights up.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public void LoadHistory(string channelName, List&lt;MessageDto&gt; messages)</code></pre>
<pre><code class="lang-csharp hljs">public void LoadHistory(string channelName, List&lt;MessageDto&gt; messages, Guid? lastReadId = null)</code></pre>
</div>
<h4 class="section">Parameters</h4>
@@ -534,6 +668,8 @@ so the UI layer can refresh.</p>
<dd></dd>
<dt><code>messages</code> <span class="xref">List</span>&lt;<a class="xref" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Core/DTOs/ChatDtos.cs">MessageDto</a>&gt;</dt>
<dd></dd>
<dt><code>lastReadId</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.guid">Guid</a>?</dt>
<dd></dd>
</dl>
@@ -162,10 +162,6 @@ Shows Edit Profile / Set Status buttons when viewing own profile.</p>
<dt><a class="xref" href="EchoHub.Client.UI.Dialogs.UpdateConfirmDialog.html">UpdateConfirmDialog</a></dt>
<dd></dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="EchoHub.Client.UI.Dialogs.UpdateProgressDialog.html">UpdateProgressDialog</a></dt>
<dd></dd>
</dl>
<h3 id="enums">
Enums
</h3>
@@ -2,11 +2,11 @@
<html>
<head>
<meta charset="utf-8">
<title>Class UpdateProgressDialog | EchoHub Documentation </title>
<title>Class NickColorHelper | EchoHub Documentation </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Class UpdateProgressDialog | EchoHub Documentation ">
<meta name="title" content="Class NickColorHelper | EchoHub Documentation ">
<meta name="description" content="Deterministic per-nick colors for users who haven&#39;t picked a nickname color. The same nick always maps to the same palette entry (classic IRC client behavior), so a busy channel stays scannable without any configuration.">
<link rel="icon" href="../../images/hue_icon.svg">
<link rel="stylesheet" href="../../public/docfx.min.css">
<link rel="stylesheet" href="../../public/main.css">
@@ -16,7 +16,7 @@
<meta name="docfx:rel" content="../../">
<meta name="docfx:docurl" content="https://github.com/HueByte/EchoHub/new/master/apiSpec/new?filename=EchoHub_Client_UI_Dialogs_UpdateProgressDialog.md&amp;value=---%0Auid%3A%20EchoHub.Client.UI.Dialogs.UpdateProgressDialog%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="docfx:docurl" content="https://github.com/HueByte/EchoHub/new/master/apiSpec/new?filename=EchoHub_Client_UI_Helpers_NickColorHelper.md&amp;value=---%0Auid%3A%20EchoHub.Client.UI.Helpers.NickColorHelper%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;">
@@ -84,24 +84,27 @@
<nav id="breadcrumb"></nav>
</div>
<article data-uid="EchoHub.Client.UI.Dialogs.UpdateProgressDialog">
<article data-uid="EchoHub.Client.UI.Helpers.NickColorHelper">
<h1 id="EchoHub_Client_UI_Dialogs_UpdateProgressDialog" data-uid="EchoHub.Client.UI.Dialogs.UpdateProgressDialog" class="text-break">
Class UpdateProgressDialog <a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Client/UI/Dialogs/UpdateProgressDialog.cs"><i class="bi bi-code-slash"></i></a>
<h1 id="EchoHub_Client_UI_Helpers_NickColorHelper" data-uid="EchoHub.Client.UI.Helpers.NickColorHelper" class="text-break">
Class NickColorHelper <a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Client/UI/Helpers/NickColorHelper.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.Client.html">Client</a>.<a class="xref" href="EchoHub.Client.UI.html">UI</a>.<a class="xref" href="EchoHub.Client.UI.Dialogs.html">Dialogs</a></dd></dl>
<dl><dt>Namespace</dt><dd><a class="xref" href="EchoHub.html">EchoHub</a>.<a class="xref" href="EchoHub.Client.html">Client</a>.<a class="xref" href="EchoHub.Client.UI.html">UI</a>.<a class="xref" href="EchoHub.Client.UI.Helpers.html">Helpers</a></dd></dl>
<dl><dt>Assembly</dt><dd>EchoHub.Client.dll</dd></dl>
</div>
<div class="markdown summary"></div>
<div class="markdown summary"><p>Deterministic per-nick colors for users who haven't picked a nickname color.
The same nick always maps to the same palette entry (classic IRC client behavior),
so a busy channel stays scannable without any configuration.</p>
</div>
<div class="markdown conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public sealed class UpdateProgressDialog</code></pre>
<pre><code class="lang-csharp hljs">public static class NickColorHelper</code></pre>
</div>
@@ -111,7 +114,7 @@ Class UpdateProgressDialog <a class="header-action link-secondary" title="View
<dt>Inheritance</dt>
<dd>
<div><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object">object</a></div>
<div><span class="xref">UpdateProgressDialog</span></div>
<div><span class="xref">NickColorHelper</span></div>
</dd>
</dl>
@@ -123,6 +126,9 @@ Class UpdateProgressDialog <a class="header-action link-secondary" title="View
<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>
@@ -145,121 +151,78 @@ Class UpdateProgressDialog <a class="header-action link-secondary" title="View
<h2 class="section" id="constructors">Constructors
</h2>
<a id="EchoHub_Client_UI_Dialogs_UpdateProgressDialog__ctor_" data-uid="EchoHub.Client.UI.Dialogs.UpdateProgressDialog.#ctor*"></a>
<h3 id="EchoHub_Client_UI_Dialogs_UpdateProgressDialog__ctor_Terminal_Gui_App_IApplication_System_String_" data-uid="EchoHub.Client.UI.Dialogs.UpdateProgressDialog.#ctor(Terminal.Gui.App.IApplication,System.String)">
UpdateProgressDialog(IApplication, string)
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Client/UI/Dialogs/UpdateProgressDialog.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 UpdateProgressDialog(IApplication app, string newVersion)</code></pre>
</div>
<h4 class="section">Parameters</h4>
<dl class="parameters">
<dt><code>app</code> <span class="xref">IApplication</span></dt>
<dd></dd>
<dt><code>newVersion</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.string">string</a></dt>
<dd></dd>
</dl>
<h2 class="section" id="methods">Methods
</h2>
<a id="EchoHub_Client_UI_Dialogs_UpdateProgressDialog_Close_" data-uid="EchoHub.Client.UI.Dialogs.UpdateProgressDialog.Close*"></a>
<a id="EchoHub_Client_UI_Helpers_NickColorHelper_GetAttribute_" data-uid="EchoHub.Client.UI.Helpers.NickColorHelper.GetAttribute*"></a>
<h3 id="EchoHub_Client_UI_Dialogs_UpdateProgressDialog_Close" data-uid="EchoHub.Client.UI.Dialogs.UpdateProgressDialog.Close">
Close()
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Client/UI/Dialogs/UpdateProgressDialog.cs"><i class="bi bi-code-slash"></i></a>
<h3 id="EchoHub_Client_UI_Helpers_NickColorHelper_GetAttribute_System_String_" data-uid="EchoHub.Client.UI.Helpers.NickColorHelper.GetAttribute(System.String)">
GetAttribute(string)
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Client/UI/Helpers/NickColorHelper.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"></div>
<div class="markdown level1 summary"><p>The color attribute for a nick. Used as a fallback when the user has no
explicit nickname color set.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public void Close()</code></pre>
</div>
<a id="EchoHub_Client_UI_Dialogs_UpdateProgressDialog_Show_" data-uid="EchoHub.Client.UI.Dialogs.UpdateProgressDialog.Show*"></a>
<h3 id="EchoHub_Client_UI_Dialogs_UpdateProgressDialog_Show" data-uid="EchoHub.Client.UI.Dialogs.UpdateProgressDialog.Show">
Show()
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Client/UI/Dialogs/UpdateProgressDialog.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 Show()</code></pre>
</div>
<a id="EchoHub_Client_UI_Dialogs_UpdateProgressDialog_UpdateProgress_" data-uid="EchoHub.Client.UI.Dialogs.UpdateProgressDialog.UpdateProgress*"></a>
<h3 id="EchoHub_Client_UI_Dialogs_UpdateProgressDialog_UpdateProgress_System_Single_System_String_" data-uid="EchoHub.Client.UI.Dialogs.UpdateProgressDialog.UpdateProgress(System.Single,System.String)">
UpdateProgress(float, string)
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Client/UI/Dialogs/UpdateProgressDialog.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 UpdateProgress(float fraction, string statusText)</code></pre>
<pre><code class="lang-csharp hljs">public static Attribute GetAttribute(string nick)</code></pre>
</div>
<h4 class="section">Parameters</h4>
<dl class="parameters">
<dt><code>fraction</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.single">float</a></dt>
<dd></dd>
<dt><code>statusText</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.string">string</a></dt>
<dt><code>nick</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.string">string</a></dt>
<dd></dd>
</dl>
<h4 class="section">Returns</h4>
<dl class="parameters">
<dt><span class="xref">Attribute</span></dt>
<dd></dd>
</dl>
<a id="EchoHub_Client_UI_Helpers_NickColorHelper_GetPaletteIndex_" data-uid="EchoHub.Client.UI.Helpers.NickColorHelper.GetPaletteIndex*"></a>
<h3 id="EchoHub_Client_UI_Helpers_NickColorHelper_GetPaletteIndex_System_String_System_Int32_" data-uid="EchoHub.Client.UI.Helpers.NickColorHelper.GetPaletteIndex(System.String,System.Int32)">
GetPaletteIndex(string, int)
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Client/UI/Helpers/NickColorHelper.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"><p>Stable palette index for a nick: case-insensitive FNV-1a over the nick,
reduced modulo <code class="paramref">paletteSize</code>. Pure function (no Terminal.Gui
types) so it is unit-testable without a display driver.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public static int GetPaletteIndex(string nick, int paletteSize)</code></pre>
</div>
<h4 class="section">Parameters</h4>
<dl class="parameters">
<dt><code>nick</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.string">string</a></dt>
<dd></dd>
<dt><code>paletteSize</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="https://learn.microsoft.com/dotnet/api/system.int32">int</a></dt>
<dd></dd>
</dl>
@@ -275,7 +238,7 @@ Class UpdateProgressDialog <a class="header-action link-secondary" title="View
</article>
<div class="contribution d-print-none">
<a href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Client/UI/Dialogs/UpdateProgressDialog.cs" class="edit-link">Edit this page</a>
<a href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Client/UI/Helpers/NickColorHelper.cs" class="edit-link">Edit this page</a>
</div>
@@ -111,6 +111,13 @@ so we replace them with fixed-width ASCII shortcodes for display only.</p>
<dl class="jumplist">
<dt><a class="xref" href="EchoHub.Client.UI.Helpers.HexColorHelper.html">HexColorHelper</a></dt>
<dd><p>Helper to parse hex colors to Terminal.Gui Attributes.</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="EchoHub.Client.UI.Helpers.NickColorHelper.html">NickColorHelper</a></dt>
<dd><p>Deterministic per-nick colors for users who haven't picked a nickname color.
The same nick always maps to the same palette entry (classic IRC client behavior),
so a busy channel stays scannable without any configuration.</p>
</dd>
</dl>
@@ -459,8 +459,8 @@ Active channel gets a &gt; indicator, unread channels are bright with a count ba
<a id="EchoHub_Client_UI_ListSources_ChannelListSource_Update_" data-uid="EchoHub.Client.UI.ListSources.ChannelListSource.Update*"></a>
<h3 id="EchoHub_Client_UI_ListSources_ChannelListSource_Update_System_Collections_Generic_List_System_String__System_Collections_Generic_Dictionary_System_String_System_Int32__System_String_System_Collections_Generic_IReadOnlySet_System_String__" data-uid="EchoHub.Client.UI.ListSources.ChannelListSource.Update(System.Collections.Generic.List{System.String},System.Collections.Generic.Dictionary{System.String,System.Int32},System.String,System.Collections.Generic.IReadOnlySet{System.String})">
Update(List&lt;string&gt;, Dictionary&lt;string, int&gt;, string, IReadOnlySet&lt;string&gt;?)
<h3 id="EchoHub_Client_UI_ListSources_ChannelListSource_Update_System_Collections_Generic_List_System_String__System_Collections_Generic_Dictionary_System_String_System_Int32__System_String_System_Collections_Generic_IReadOnlySet_System_String__System_Collections_Generic_IReadOnlySet_System_String__" data-uid="EchoHub.Client.UI.ListSources.ChannelListSource.Update(System.Collections.Generic.List{System.String},System.Collections.Generic.Dictionary{System.String,System.Int32},System.String,System.Collections.Generic.IReadOnlySet{System.String},System.Collections.Generic.IReadOnlySet{System.String})">
Update(List&lt;string&gt;, Dictionary&lt;string, int&gt;, string, IReadOnlySet&lt;string&gt;?, IReadOnlySet&lt;string&gt;?)
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Client/UI/ListSources/ChannelListSource.cs"><i class="bi bi-code-slash"></i></a>
</h3>
@@ -468,7 +468,7 @@ Active channel gets a &gt; indicator, unread channels are bright with a count ba
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public void Update(List&lt;string&gt; channels, Dictionary&lt;string, int&gt; unread, string activeChannel, IReadOnlySet&lt;string&gt;? protectedChannels = null)</code></pre>
<pre><code class="lang-csharp hljs">public void Update(List&lt;string&gt; channels, Dictionary&lt;string, int&gt; unread, string activeChannel, IReadOnlySet&lt;string&gt;? protectedChannels = null, IReadOnlySet&lt;string&gt;? mentionChannels = null)</code></pre>
</div>
<h4 class="section">Parameters</h4>
@@ -481,6 +481,8 @@ Active channel gets a &gt; indicator, unread channels are bright with a count ba
<dd></dd>
<dt><code>protectedChannels</code> <span class="xref">IReadOnlySet</span>&lt;<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.string">string</a>&gt;</dt>
<dd></dd>
<dt><code>mentionChannels</code> <span class="xref">IReadOnlySet</span>&lt;<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.string">string</a>&gt;</dt>
<dd></dd>
</dl>
@@ -385,6 +385,42 @@ Interface IChannelService <a class="header-action link-secondary" title="View s
<a id="EchoHub_Core_Contracts_IChannelService_GetChannelMetaAsync_" data-uid="EchoHub.Core.Contracts.IChannelService.GetChannelMetaAsync*"></a>
<h3 id="EchoHub_Core_Contracts_IChannelService_GetChannelMetaAsync_System_String_" data-uid="EchoHub.Core.Contracts.IChannelService.GetChannelMetaAsync(System.String)">
GetChannelMetaAsync(string)
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Core/Contracts/IChannelService.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">Task&lt;ChannelMetaDto?&gt; GetChannelMetaAsync(string channelName)</code></pre>
</div>
<h4 class="section">Parameters</h4>
<dl class="parameters">
<dt><code>channelName</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.string">string</a></dt>
<dd></dd>
</dl>
<h4 class="section">Returns</h4>
<dl class="parameters">
<dt><span class="xref">Task</span>&lt;<a class="xref" href="EchoHub.Core.DTOs.ChannelMetaDto.html">ChannelMetaDto</a>&gt;</dt>
<dd></dd>
</dl>
<a id="EchoHub_Core_Contracts_IChannelService_GetChannelTopicAsync_" data-uid="EchoHub.Core.Contracts.IChannelService.GetChannelTopicAsync*"></a>
<h3 id="EchoHub_Core_Contracts_IChannelService_GetChannelTopicAsync_System_String_" data-uid="EchoHub.Core.Contracts.IChannelService.GetChannelTopicAsync(System.String)">
@@ -116,6 +116,42 @@ Interface IMessageEncryptionService <a class="header-action link-secondary" tit
<h2 class="section" id="fields">Fields
</h2>
<h3 id="EchoHub_Core_Contracts_IMessageEncryptionService_CiphertextPrefix" data-uid="EchoHub.Core.Contracts.IMessageEncryptionService.CiphertextPrefix">
CiphertextPrefix
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Core/Contracts/IMessageEncryptionService.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"><p>Prefix marking transport/at-rest encrypted content. <a class="xref" href="EchoHub.Core.Contracts.IMessageEncryptionService.html#EchoHub_Core_Contracts_IMessageEncryptionService_Decrypt_System_String_">Decrypt(string)</a> is a
pass-through for values without it.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public const string CiphertextPrefix = &quot;$ENC$v1$&quot;</code></pre>
</div>
<h4 class="section">Field Value</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="properties">Properties
</h2>
@@ -0,0 +1,878 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Class ChannelMetaDto | EchoHub Documentation </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Class ChannelMetaDto | EchoHub Documentation ">
<meta name="description" content="Human-facing summary of a channel (the /meta command). For encrypted channels the server still knows these figures — count, timestamps, and stored blob sizes — even though it cannot read the content itself. is the sum of stored attachment blob sizes plus message text length, so it is an estimate, not an exact on-disk total.">
<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_DTOs_ChannelMetaDto.md&amp;value=---%0Auid%3A%20EchoHub.Core.DTOs.ChannelMetaDto%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.DTOs.ChannelMetaDto">
<h1 id="EchoHub_Core_DTOs_ChannelMetaDto" data-uid="EchoHub.Core.DTOs.ChannelMetaDto" class="text-break">
Class ChannelMetaDto <a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Core/DTOs/ChatDtos.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.DTOs.html">DTOs</a></dd></dl>
<dl><dt>Assembly</dt><dd>EchoHub.Core.dll</dd></dl>
</div>
<div class="markdown summary"><p>Human-facing summary of a channel (the <code>/meta</code> command). For encrypted channels the
server still knows these figures — count, timestamps, and stored blob sizes — even though it
cannot read the content itself. <a class="xref" href="EchoHub.Core.DTOs.ChannelMetaDto.html#EchoHub_Core_DTOs_ChannelMetaDto_EstimatedSizeBytes">EstimatedSizeBytes</a> is the sum of stored
attachment blob sizes plus message text length, so it is an estimate, not an exact on-disk total.</p>
</div>
<div class="markdown conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public record ChannelMetaDto : IEquatable&lt;ChannelMetaDto&gt;</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">ChannelMetaDto</span></div>
</dd>
</dl>
<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.Core.DTOs.ChannelMetaDto.html">ChannelMetaDto</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.memberwiseclone">object.MemberwiseClone()</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_Core_DTOs_ChannelMetaDto__ctor_" data-uid="EchoHub.Core.DTOs.ChannelMetaDto.#ctor*"></a>
<h3 id="EchoHub_Core_DTOs_ChannelMetaDto__ctor_EchoHub_Core_DTOs_ChannelMetaDto_" data-uid="EchoHub.Core.DTOs.ChannelMetaDto.#ctor(EchoHub.Core.DTOs.ChannelMetaDto)">
ChannelMetaDto(ChannelMetaDto)
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Core/DTOs/ChatDtos.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 ChannelMetaDto(ChannelMetaDto original)</code></pre>
</div>
<h4 class="section">Parameters</h4>
<dl class="parameters">
<dt><code>original</code> <a class="xref" href="EchoHub.Core.DTOs.ChannelMetaDto.html">ChannelMetaDto</a></dt>
<dd></dd>
</dl>
<a id="EchoHub_Core_DTOs_ChannelMetaDto__ctor_" data-uid="EchoHub.Core.DTOs.ChannelMetaDto.#ctor*"></a>
<h3 id="EchoHub_Core_DTOs_ChannelMetaDto__ctor_System_Guid_System_String_System_String_System_Boolean_System_Boolean_System_Int32_System_Int32_System_Int64_System_DateTimeOffset_" data-uid="EchoHub.Core.DTOs.ChannelMetaDto.#ctor(System.Guid,System.String,System.String,System.Boolean,System.Boolean,System.Int32,System.Int32,System.Int64,System.DateTimeOffset)">
ChannelMetaDto(Guid, string, string?, bool, bool, int, int, long, DateTimeOffset)
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Core/DTOs/ChatDtos.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"><p>Human-facing summary of a channel (the <code>/meta</code> command). For encrypted channels the
server still knows these figures — count, timestamps, and stored blob sizes — even though it
cannot read the content itself. <a class="xref" href="EchoHub.Core.DTOs.ChannelMetaDto.html#EchoHub_Core_DTOs_ChannelMetaDto_EstimatedSizeBytes">EstimatedSizeBytes</a> is the sum of stored
attachment blob sizes plus message text length, so it is an estimate, not an exact on-disk total.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public ChannelMetaDto(Guid Id, string Name, string? Topic, bool IsEncrypted, bool IsProtected, int MessageCount, int UniqueUserCount, long EstimatedSizeBytes, DateTimeOffset CreatedAt)</code></pre>
</div>
<h4 class="section">Parameters</h4>
<dl class="parameters">
<dt><code>Id</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.guid">Guid</a></dt>
<dd></dd>
<dt><code>Name</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.string">string</a></dt>
<dd></dd>
<dt><code>Topic</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.string">string</a></dt>
<dd></dd>
<dt><code>IsEncrypted</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.boolean">bool</a></dt>
<dd></dd>
<dt><code>IsProtected</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.boolean">bool</a></dt>
<dd></dd>
<dt><code>MessageCount</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.int32">int</a></dt>
<dd></dd>
<dt><code>UniqueUserCount</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.int32">int</a></dt>
<dd></dd>
<dt><code>EstimatedSizeBytes</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.int64">long</a></dt>
<dd></dd>
<dt><code>CreatedAt</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.datetimeoffset">DateTimeOffset</a></dt>
<dd></dd>
</dl>
<h2 class="section" id="properties">Properties
</h2>
<a id="EchoHub_Core_DTOs_ChannelMetaDto_CreatedAt_" data-uid="EchoHub.Core.DTOs.ChannelMetaDto.CreatedAt*"></a>
<h3 id="EchoHub_Core_DTOs_ChannelMetaDto_CreatedAt" data-uid="EchoHub.Core.DTOs.ChannelMetaDto.CreatedAt">
CreatedAt
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Core/DTOs/ChatDtos.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 DateTimeOffset CreatedAt { 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.datetimeoffset">DateTimeOffset</a></dt>
<dd></dd>
</dl>
<a id="EchoHub_Core_DTOs_ChannelMetaDto_EqualityContract_" data-uid="EchoHub.Core.DTOs.ChannelMetaDto.EqualityContract*"></a>
<h3 id="EchoHub_Core_DTOs_ChannelMetaDto_EqualityContract" data-uid="EchoHub.Core.DTOs.ChannelMetaDto.EqualityContract">
EqualityContract
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Core/DTOs/ChatDtos.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 virtual Type EqualityContract { get; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.type">Type</a></dt>
<dd></dd>
</dl>
<a id="EchoHub_Core_DTOs_ChannelMetaDto_EstimatedSizeBytes_" data-uid="EchoHub.Core.DTOs.ChannelMetaDto.EstimatedSizeBytes*"></a>
<h3 id="EchoHub_Core_DTOs_ChannelMetaDto_EstimatedSizeBytes" data-uid="EchoHub.Core.DTOs.ChannelMetaDto.EstimatedSizeBytes">
EstimatedSizeBytes
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Core/DTOs/ChatDtos.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 EstimatedSizeBytes { 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_Core_DTOs_ChannelMetaDto_Id_" data-uid="EchoHub.Core.DTOs.ChannelMetaDto.Id*"></a>
<h3 id="EchoHub_Core_DTOs_ChannelMetaDto_Id" data-uid="EchoHub.Core.DTOs.ChannelMetaDto.Id">
Id
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Core/DTOs/ChatDtos.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; 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.guid">Guid</a></dt>
<dd></dd>
</dl>
<a id="EchoHub_Core_DTOs_ChannelMetaDto_IsEncrypted_" data-uid="EchoHub.Core.DTOs.ChannelMetaDto.IsEncrypted*"></a>
<h3 id="EchoHub_Core_DTOs_ChannelMetaDto_IsEncrypted" data-uid="EchoHub.Core.DTOs.ChannelMetaDto.IsEncrypted">
IsEncrypted
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Core/DTOs/ChatDtos.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 IsEncrypted { 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.boolean">bool</a></dt>
<dd></dd>
</dl>
<a id="EchoHub_Core_DTOs_ChannelMetaDto_IsProtected_" data-uid="EchoHub.Core.DTOs.ChannelMetaDto.IsProtected*"></a>
<h3 id="EchoHub_Core_DTOs_ChannelMetaDto_IsProtected" data-uid="EchoHub.Core.DTOs.ChannelMetaDto.IsProtected">
IsProtected
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Core/DTOs/ChatDtos.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 IsProtected { 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.boolean">bool</a></dt>
<dd></dd>
</dl>
<a id="EchoHub_Core_DTOs_ChannelMetaDto_MessageCount_" data-uid="EchoHub.Core.DTOs.ChannelMetaDto.MessageCount*"></a>
<h3 id="EchoHub_Core_DTOs_ChannelMetaDto_MessageCount" data-uid="EchoHub.Core.DTOs.ChannelMetaDto.MessageCount">
MessageCount
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Core/DTOs/ChatDtos.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 MessageCount { 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>
<a id="EchoHub_Core_DTOs_ChannelMetaDto_Name_" data-uid="EchoHub.Core.DTOs.ChannelMetaDto.Name*"></a>
<h3 id="EchoHub_Core_DTOs_ChannelMetaDto_Name" data-uid="EchoHub.Core.DTOs.ChannelMetaDto.Name">
Name
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Core/DTOs/ChatDtos.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 string Name { 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.string">string</a></dt>
<dd></dd>
</dl>
<a id="EchoHub_Core_DTOs_ChannelMetaDto_Topic_" data-uid="EchoHub.Core.DTOs.ChannelMetaDto.Topic*"></a>
<h3 id="EchoHub_Core_DTOs_ChannelMetaDto_Topic" data-uid="EchoHub.Core.DTOs.ChannelMetaDto.Topic">
Topic
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Core/DTOs/ChatDtos.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 string? Topic { 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.string">string</a></dt>
<dd></dd>
</dl>
<a id="EchoHub_Core_DTOs_ChannelMetaDto_UniqueUserCount_" data-uid="EchoHub.Core.DTOs.ChannelMetaDto.UniqueUserCount*"></a>
<h3 id="EchoHub_Core_DTOs_ChannelMetaDto_UniqueUserCount" data-uid="EchoHub.Core.DTOs.ChannelMetaDto.UniqueUserCount">
UniqueUserCount
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Core/DTOs/ChatDtos.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 UniqueUserCount { 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_Core_DTOs_ChannelMetaDto_Deconstruct_" data-uid="EchoHub.Core.DTOs.ChannelMetaDto.Deconstruct*"></a>
<h3 id="EchoHub_Core_DTOs_ChannelMetaDto_Deconstruct_System_Guid__System_String__System_String__System_Boolean__System_Boolean__System_Int32__System_Int32__System_Int64__System_DateTimeOffset__" data-uid="EchoHub.Core.DTOs.ChannelMetaDto.Deconstruct(System.Guid@,System.String@,System.String@,System.Boolean@,System.Boolean@,System.Int32@,System.Int32@,System.Int64@,System.DateTimeOffset@)">
Deconstruct(out Guid, out string, out string?, out bool, out bool, out int, out int, out long, out DateTimeOffset)
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Core/DTOs/ChatDtos.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 Guid Id, out string Name, out string? Topic, out bool IsEncrypted, out bool IsProtected, out int MessageCount, out int UniqueUserCount, out long EstimatedSizeBytes, out DateTimeOffset CreatedAt)</code></pre>
</div>
<h4 class="section">Parameters</h4>
<dl class="parameters">
<dt><code>Id</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.guid">Guid</a></dt>
<dd></dd>
<dt><code>Name</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.string">string</a></dt>
<dd></dd>
<dt><code>Topic</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.string">string</a></dt>
<dd></dd>
<dt><code>IsEncrypted</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.boolean">bool</a></dt>
<dd></dd>
<dt><code>IsProtected</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.boolean">bool</a></dt>
<dd></dd>
<dt><code>MessageCount</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.int32">int</a></dt>
<dd></dd>
<dt><code>UniqueUserCount</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.int32">int</a></dt>
<dd></dd>
<dt><code>EstimatedSizeBytes</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.int64">long</a></dt>
<dd></dd>
<dt><code>CreatedAt</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.datetimeoffset">DateTimeOffset</a></dt>
<dd></dd>
</dl>
<a id="EchoHub_Core_DTOs_ChannelMetaDto_Equals_" data-uid="EchoHub.Core.DTOs.ChannelMetaDto.Equals*"></a>
<h3 id="EchoHub_Core_DTOs_ChannelMetaDto_Equals_EchoHub_Core_DTOs_ChannelMetaDto_" data-uid="EchoHub.Core.DTOs.ChannelMetaDto.Equals(EchoHub.Core.DTOs.ChannelMetaDto)">
Equals(ChannelMetaDto?)
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Core/DTOs/ChatDtos.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 virtual bool Equals(ChannelMetaDto? other)</code></pre>
</div>
<h4 class="section">Parameters</h4>
<dl class="parameters">
<dt><code>other</code> <a class="xref" href="EchoHub.Core.DTOs.ChannelMetaDto.html">ChannelMetaDto</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_Core_DTOs_ChannelMetaDto_Equals_" data-uid="EchoHub.Core.DTOs.ChannelMetaDto.Equals*"></a>
<h3 id="EchoHub_Core_DTOs_ChannelMetaDto_Equals_System_Object_" data-uid="EchoHub.Core.DTOs.ChannelMetaDto.Equals(System.Object)">
Equals(object?)
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Core/DTOs/ChatDtos.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_Core_DTOs_ChannelMetaDto_GetHashCode_" data-uid="EchoHub.Core.DTOs.ChannelMetaDto.GetHashCode*"></a>
<h3 id="EchoHub_Core_DTOs_ChannelMetaDto_GetHashCode" data-uid="EchoHub.Core.DTOs.ChannelMetaDto.GetHashCode">
GetHashCode()
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Core/DTOs/ChatDtos.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_Core_DTOs_ChannelMetaDto_PrintMembers_" data-uid="EchoHub.Core.DTOs.ChannelMetaDto.PrintMembers*"></a>
<h3 id="EchoHub_Core_DTOs_ChannelMetaDto_PrintMembers_System_Text_StringBuilder_" data-uid="EchoHub.Core.DTOs.ChannelMetaDto.PrintMembers(System.Text.StringBuilder)">
PrintMembers(StringBuilder)
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Core/DTOs/ChatDtos.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 virtual bool PrintMembers(StringBuilder builder)</code></pre>
</div>
<h4 class="section">Parameters</h4>
<dl class="parameters">
<dt><code>builder</code> <span class="xref">StringBuilder</span></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_Core_DTOs_ChannelMetaDto_ToString_" data-uid="EchoHub.Core.DTOs.ChannelMetaDto.ToString*"></a>
<h3 id="EchoHub_Core_DTOs_ChannelMetaDto_ToString" data-uid="EchoHub.Core.DTOs.ChannelMetaDto.ToString">
ToString()
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Core/DTOs/ChatDtos.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_Core_DTOs_ChannelMetaDto_op_Equality_" data-uid="EchoHub.Core.DTOs.ChannelMetaDto.op_Equality*"></a>
<h3 id="EchoHub_Core_DTOs_ChannelMetaDto_op_Equality_EchoHub_Core_DTOs_ChannelMetaDto_EchoHub_Core_DTOs_ChannelMetaDto_" data-uid="EchoHub.Core.DTOs.ChannelMetaDto.op_Equality(EchoHub.Core.DTOs.ChannelMetaDto,EchoHub.Core.DTOs.ChannelMetaDto)">
operator ==(ChannelMetaDto?, ChannelMetaDto?)
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Core/DTOs/ChatDtos.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 ==(ChannelMetaDto? left, ChannelMetaDto? right)</code></pre>
</div>
<h4 class="section">Parameters</h4>
<dl class="parameters">
<dt><code>left</code> <a class="xref" href="EchoHub.Core.DTOs.ChannelMetaDto.html">ChannelMetaDto</a></dt>
<dd></dd>
<dt><code>right</code> <a class="xref" href="EchoHub.Core.DTOs.ChannelMetaDto.html">ChannelMetaDto</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_Core_DTOs_ChannelMetaDto_op_Inequality_" data-uid="EchoHub.Core.DTOs.ChannelMetaDto.op_Inequality*"></a>
<h3 id="EchoHub_Core_DTOs_ChannelMetaDto_op_Inequality_EchoHub_Core_DTOs_ChannelMetaDto_EchoHub_Core_DTOs_ChannelMetaDto_" data-uid="EchoHub.Core.DTOs.ChannelMetaDto.op_Inequality(EchoHub.Core.DTOs.ChannelMetaDto,EchoHub.Core.DTOs.ChannelMetaDto)">
operator !=(ChannelMetaDto?, ChannelMetaDto?)
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Core/DTOs/ChatDtos.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 !=(ChannelMetaDto? left, ChannelMetaDto? right)</code></pre>
</div>
<h4 class="section">Parameters</h4>
<dl class="parameters">
<dt><code>left</code> <a class="xref" href="EchoHub.Core.DTOs.ChannelMetaDto.html">ChannelMetaDto</a></dt>
<dd></dd>
<dt><code>right</code> <a class="xref" href="EchoHub.Core.DTOs.ChannelMetaDto.html">ChannelMetaDto</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.Core/DTOs/ChatDtos.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
@@ -131,6 +131,14 @@ credential from a passphrase. Never includes the wrapped room key.</p>
<dt><a class="xref" href="EchoHub.Core.DTOs.ChannelDto.html">ChannelDto</a></dt>
<dd></dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="EchoHub.Core.DTOs.ChannelMetaDto.html">ChannelMetaDto</a></dt>
<dd><p>Human-facing summary of a channel (the <code>/meta</code> command). For encrypted channels the
server still knows these figures — count, timestamps, and stored blob sizes — even though it
cannot read the content itself. <a class="xref" href="EchoHub.Core.DTOs.ChannelMetaDto.html#EchoHub_Core_DTOs_ChannelMetaDto_EstimatedSizeBytes">EstimatedSizeBytes</a> is the sum of stored
attachment blob sizes plus message text length, so it is an estimate, not an exact on-disk total.</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="EchoHub.Core.DTOs.ChannelOperationResult.html">ChannelOperationResult</a></dt>
<dd></dd>
@@ -0,0 +1,564 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Class UploadLimits | EchoHub Documentation </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Class UploadLimits | EchoHub Documentation ">
<meta name="description" content="Admin-configurable upload limits, bound from the Uploads configuration section. Sizes are expressed in megabytes in configuration; the *Bytes accessors convert them for enforcement. Every default mirrors so an absent or partial Uploads section preserves the historical built-in limits.">
<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_UploadLimits.md&amp;value=---%0Auid%3A%20EchoHub.Server.Config.UploadLimits%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.UploadLimits">
<h1 id="EchoHub_Server_Config_UploadLimits" data-uid="EchoHub.Server.Config.UploadLimits" class="text-break">
Class UploadLimits <a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Config/UploadLimits.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>Admin-configurable upload limits, bound from the <code>Uploads</code> configuration section.
Sizes are expressed in megabytes in configuration; the <code>*Bytes</code> accessors convert them
for enforcement. Every default mirrors <a class="xref" href="../core/EchoHub.Core.Constants.HubConstants.html">HubConstants</a> so an absent or partial
<code>Uploads</code> section preserves the historical built-in limits.</p>
</div>
<div class="markdown conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public sealed class UploadLimits</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">UploadLimits</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_UploadLimits__ctor_" data-uid="EchoHub.Server.Config.UploadLimits.#ctor*"></a>
<h3 id="EchoHub_Server_Config_UploadLimits__ctor" data-uid="EchoHub.Server.Config.UploadLimits.#ctor">
UploadLimits()
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Config/UploadLimits.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 UploadLimits()</code></pre>
</div>
<h2 class="section" id="properties">Properties
</h2>
<a id="EchoHub_Server_Config_UploadLimits_MaxAttachmentsPerMessage_" data-uid="EchoHub.Server.Config.UploadLimits.MaxAttachmentsPerMessage*"></a>
<h3 id="EchoHub_Server_Config_UploadLimits_MaxAttachmentsPerMessage" data-uid="EchoHub.Server.Config.UploadLimits.MaxAttachmentsPerMessage">
MaxAttachmentsPerMessage
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Config/UploadLimits.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 MaxAttachmentsPerMessage { 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>
<a id="EchoHub_Server_Config_UploadLimits_MaxAudioSizeBytes_" data-uid="EchoHub.Server.Config.UploadLimits.MaxAudioSizeBytes*"></a>
<h3 id="EchoHub_Server_Config_UploadLimits_MaxAudioSizeBytes" data-uid="EchoHub.Server.Config.UploadLimits.MaxAudioSizeBytes">
MaxAudioSizeBytes
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Config/UploadLimits.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 MaxAudioSizeBytes { get; }</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_Config_UploadLimits_MaxAudioSizeMB_" data-uid="EchoHub.Server.Config.UploadLimits.MaxAudioSizeMB*"></a>
<h3 id="EchoHub_Server_Config_UploadLimits_MaxAudioSizeMB" data-uid="EchoHub.Server.Config.UploadLimits.MaxAudioSizeMB">
MaxAudioSizeMB
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Config/UploadLimits.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 MaxAudioSizeMB { 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>
<a id="EchoHub_Server_Config_UploadLimits_MaxAvatarSizeBytes_" data-uid="EchoHub.Server.Config.UploadLimits.MaxAvatarSizeBytes*"></a>
<h3 id="EchoHub_Server_Config_UploadLimits_MaxAvatarSizeBytes" data-uid="EchoHub.Server.Config.UploadLimits.MaxAvatarSizeBytes">
MaxAvatarSizeBytes
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Config/UploadLimits.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 MaxAvatarSizeBytes { get; }</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_Config_UploadLimits_MaxAvatarSizeMB_" data-uid="EchoHub.Server.Config.UploadLimits.MaxAvatarSizeMB*"></a>
<h3 id="EchoHub_Server_Config_UploadLimits_MaxAvatarSizeMB" data-uid="EchoHub.Server.Config.UploadLimits.MaxAvatarSizeMB">
MaxAvatarSizeMB
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Config/UploadLimits.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 MaxAvatarSizeMB { 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>
<a id="EchoHub_Server_Config_UploadLimits_MaxFileSizeBytes_" data-uid="EchoHub.Server.Config.UploadLimits.MaxFileSizeBytes*"></a>
<h3 id="EchoHub_Server_Config_UploadLimits_MaxFileSizeBytes" data-uid="EchoHub.Server.Config.UploadLimits.MaxFileSizeBytes">
MaxFileSizeBytes
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Config/UploadLimits.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 MaxFileSizeBytes { get; }</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_Config_UploadLimits_MaxFileSizeMB_" data-uid="EchoHub.Server.Config.UploadLimits.MaxFileSizeMB*"></a>
<h3 id="EchoHub_Server_Config_UploadLimits_MaxFileSizeMB" data-uid="EchoHub.Server.Config.UploadLimits.MaxFileSizeMB">
MaxFileSizeMB
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Config/UploadLimits.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 MaxFileSizeMB { 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>
<a id="EchoHub_Server_Config_UploadLimits_MaxImageSizeBytes_" data-uid="EchoHub.Server.Config.UploadLimits.MaxImageSizeBytes*"></a>
<h3 id="EchoHub_Server_Config_UploadLimits_MaxImageSizeBytes" data-uid="EchoHub.Server.Config.UploadLimits.MaxImageSizeBytes">
MaxImageSizeBytes
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Config/UploadLimits.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 MaxImageSizeBytes { get; }</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_Config_UploadLimits_MaxImageSizeMB_" data-uid="EchoHub.Server.Config.UploadLimits.MaxImageSizeMB*"></a>
<h3 id="EchoHub_Server_Config_UploadLimits_MaxImageSizeMB" data-uid="EchoHub.Server.Config.UploadLimits.MaxImageSizeMB">
MaxImageSizeMB
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Config/UploadLimits.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 MaxImageSizeMB { 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>
<a id="EchoHub_Server_Config_UploadLimits_MaxRequestBodyBytes_" data-uid="EchoHub.Server.Config.UploadLimits.MaxRequestBodyBytes*"></a>
<h3 id="EchoHub_Server_Config_UploadLimits_MaxRequestBodyBytes" data-uid="EchoHub.Server.Config.UploadLimits.MaxRequestBodyBytes">
MaxRequestBodyBytes
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Config/UploadLimits.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"><p>Absolute ceiling for one message request body (largest file × the attachment cap). Used to
size the request-body and multipart limits so a configured increase actually takes effect.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public long MaxRequestBodyBytes { get; }</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>
<h2 class="section" id="methods">Methods
</h2>
<a id="EchoHub_Server_Config_UploadLimits_MaxForKind_" data-uid="EchoHub.Server.Config.UploadLimits.MaxForKind*"></a>
<h3 id="EchoHub_Server_Config_UploadLimits_MaxForKind_EchoHub_Core_Models_AttachmentKind_" data-uid="EchoHub.Server.Config.UploadLimits.MaxForKind(EchoHub.Core.Models.AttachmentKind)">
MaxForKind(AttachmentKind)
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Config/UploadLimits.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"><p>Maximum accepted size for a single attachment of the given kind.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public long MaxForKind(AttachmentKind kind)</code></pre>
</div>
<h4 class="section">Parameters</h4>
<dl class="parameters">
<dt><code>kind</code> <a class="xref" href="../core/EchoHub.Core.Models.AttachmentKind.html">AttachmentKind</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.int64">long</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/UploadLimits.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>
+130
View File
@@ -0,0 +1,130 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Namespace EchoHub.Server.Config | EchoHub Documentation </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Namespace EchoHub.Server.Config | 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.Config">
<h1 id="EchoHub_Server_Config" data-uid="EchoHub.Server.Config" class="text-break">Namespace EchoHub.Server.Config</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.Config.UploadLimits.html">UploadLimits</a></dt>
<dd><p>Admin-configurable upload limits, bound from the <code>Uploads</code> configuration section.
Sizes are expressed in megabytes in configuration; the <code>*Bytes</code> accessors convert them
for enforcement. Every default mirrors <a class="xref" href="../core/EchoHub.Core.Constants.HubConstants.html">HubConstants</a> so an absent or partial
<code>Uploads</code> section preserves the historical built-in limits.</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>
@@ -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_" 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)">
ChannelsController(IChannelService, EchoHubDbContext, FileStorageService, ImageToAsciiService, IHttpClientFactory, IChatService, IMessageEncryptionService)
<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)
<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)</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)</code></pre>
</div>
<h4 class="section">Parameters</h4>
@@ -187,6 +187,8 @@ public class ChannelsController : ControllerBase</code></pre>
<dd></dd>
<dt><code>encryption</code> <a class="xref" href="../core/EchoHub.Core.Contracts.IMessageEncryptionService.html">IMessageEncryptionService</a></dt>
<dd></dd>
<dt><code>uploadLimits</code> <a class="xref" href="EchoHub.Server.Config.UploadLimits.html">UploadLimits</a></dt>
<dd></dd>
</dl>
@@ -318,6 +320,46 @@ public Task&lt;IActionResult&gt; GetChannelCrypto(string channel)</code></pre>
<a id="EchoHub_Server_Controllers_ChannelsController_GetChannelMeta_" data-uid="EchoHub.Server.Controllers.ChannelsController.GetChannelMeta*"></a>
<h3 id="EchoHub_Server_Controllers_ChannelsController_GetChannelMeta_System_String_" data-uid="EchoHub.Server.Controllers.ChannelsController.GetChannelMeta(System.String)">
GetChannelMeta(string)
<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>
<div class="markdown level1 summary"><p>Human-facing summary of a channel (message count, unique posters, estimated size,
created date, room id). Available for encrypted channels too — these are metadata the
server tracks even though it cannot read the messages themselves.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">[HttpGet(&quot;{channel}/meta&quot;)]
public Task&lt;IActionResult&gt; GetChannelMeta(string channel)</code></pre>
</div>
<h4 class="section">Parameters</h4>
<dl class="parameters">
<dt><code>channel</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.string">string</a></dt>
<dd></dd>
</dl>
<h4 class="section">Returns</h4>
<dl class="parameters">
<dt><span class="xref">Task</span>&lt;<span class="xref">IActionResult</span>&gt;</dt>
<dd></dd>
</dl>
<a id="EchoHub_Server_Controllers_ChannelsController_GetChannels_" data-uid="EchoHub.Server.Controllers.ChannelsController.GetChannels*"></a>
<h3 id="EchoHub_Server_Controllers_ChannelsController_GetChannels_System_Int32_System_Int32_" data-uid="EchoHub.Server.Controllers.ChannelsController.GetChannels(System.Int32,System.Int32)">
@@ -417,8 +459,6 @@ room-encrypted preview (<code>preview</code>), aligned by file order — the ser
<div class="codewrapper">
<pre><code class="lang-csharp hljs">[HttpPost(&quot;{channel}/messages&quot;)]
[EnableRateLimiting(&quot;upload&quot;)]
[RequestSizeLimit(1048576000)]
[RequestFormLimits(MultipartBodyLengthLimit = 1048576000)]
public Task&lt;IActionResult&gt; SendMessageWithAttachments(string channel, string? size = null)</code></pre>
</div>
@@ -159,8 +159,8 @@ public class UsersController : ControllerBase</code></pre>
<a id="EchoHub_Server_Controllers_UsersController__ctor_" data-uid="EchoHub.Server.Controllers.UsersController.#ctor*"></a>
<h3 id="EchoHub_Server_Controllers_UsersController__ctor_EchoHub_Core_Contracts_IUserService_EchoHub_Core_Services_ImageToAsciiService_" data-uid="EchoHub.Server.Controllers.UsersController.#ctor(EchoHub.Core.Contracts.IUserService,EchoHub.Core.Services.ImageToAsciiService)">
UsersController(IUserService, ImageToAsciiService)
<h3 id="EchoHub_Server_Controllers_UsersController__ctor_EchoHub_Core_Contracts_IUserService_EchoHub_Core_Services_ImageToAsciiService_EchoHub_Server_Config_UploadLimits_" data-uid="EchoHub.Server.Controllers.UsersController.#ctor(EchoHub.Core.Contracts.IUserService,EchoHub.Core.Services.ImageToAsciiService,EchoHub.Server.Config.UploadLimits)">
UsersController(IUserService, ImageToAsciiService, UploadLimits)
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Controllers/UsersController.cs"><i class="bi bi-code-slash"></i></a>
</h3>
@@ -168,7 +168,7 @@ public class UsersController : ControllerBase</code></pre>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public UsersController(IUserService userService, ImageToAsciiService asciiService)</code></pre>
<pre><code class="lang-csharp hljs">public UsersController(IUserService userService, ImageToAsciiService asciiService, UploadLimits uploadLimits)</code></pre>
</div>
<h4 class="section">Parameters</h4>
@@ -177,6 +177,8 @@ public class UsersController : ControllerBase</code></pre>
<dd></dd>
<dt><code>asciiService</code> <a class="xref" href="../core/EchoHub.Core.Services.ImageToAsciiService.html">ImageToAsciiService</a></dt>
<dd></dd>
<dt><code>uploadLimits</code> <a class="xref" href="EchoHub.Server.Config.UploadLimits.html">UploadLimits</a></dt>
<dd></dd>
</dl>
@@ -462,6 +462,42 @@ Class ChannelService <a class="header-action link-secondary" title="View source
<a id="EchoHub_Server_Services_ChannelService_GetChannelMetaAsync_" data-uid="EchoHub.Server.Services.ChannelService.GetChannelMetaAsync*"></a>
<h3 id="EchoHub_Server_Services_ChannelService_GetChannelMetaAsync_System_String_" data-uid="EchoHub.Server.Services.ChannelService.GetChannelMetaAsync(System.String)">
GetChannelMetaAsync(string)
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Services/ChannelService.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 Task&lt;ChannelMetaDto?&gt; GetChannelMetaAsync(string channelName)</code></pre>
</div>
<h4 class="section">Parameters</h4>
<dl class="parameters">
<dt><code>channelName</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.string">string</a></dt>
<dd></dd>
</dl>
<h4 class="section">Returns</h4>
<dl class="parameters">
<dt><span class="xref">Task</span>&lt;<a class="xref" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Core/DTOs/ChatDtos.cs">ChannelMetaDto</a>&gt;</dt>
<dd></dd>
</dl>
<a id="EchoHub_Server_Services_ChannelService_GetChannelTopicAsync_" data-uid="EchoHub.Server.Services.ChannelService.GetChannelTopicAsync*"></a>
<h3 id="EchoHub_Server_Services_ChannelService_GetChannelTopicAsync_System_String_" data-uid="EchoHub.Server.Services.ChannelService.GetChannelTopicAsync(System.String)">
+16 -3
View File
@@ -229,9 +229,6 @@
<li>
<a href="client/EchoHub.Client.UI.Dialogs.UpdateConfirmDialog.html" name="" title="UpdateConfirmDialog">UpdateConfirmDialog</a>
</li>
<li>
<a href="client/EchoHub.Client.UI.Dialogs.UpdateProgressDialog.html" name="" title="UpdateProgressDialog">UpdateProgressDialog</a>
</li>
</ul>
</li>
<li>
@@ -248,6 +245,9 @@
<li>
<a href="client/EchoHub.Client.UI.Helpers.HexColorHelper.html" name="" title="HexColorHelper">HexColorHelper</a>
</li>
<li>
<a href="client/EchoHub.Client.UI.Helpers.NickColorHelper.html" name="" title="NickColorHelper">NickColorHelper</a>
</li>
</ul>
</li>
<li>
@@ -363,6 +363,9 @@
<li>
<a href="core/EchoHub.Core.DTOs.ChannelError.html" name="" title="ChannelError">ChannelError</a>
</li>
<li>
<a href="core/EchoHub.Core.DTOs.ChannelMetaDto.html" name="" title="ChannelMetaDto">ChannelMetaDto</a>
</li>
<li>
<a href="core/EchoHub.Core.DTOs.ChannelOperationResult.html" name="" title="ChannelOperationResult">ChannelOperationResult</a>
</li>
@@ -540,6 +543,16 @@
</li>
</ul>
</li>
<li>
<span class="expand-stub"></span>
<a href="server/EchoHub.Server.Config.html" name="" title="EchoHub.Server.Config">EchoHub.Server.Config</a>
<ul class="nav level4">
<li>
<a href="server/EchoHub.Server.Config.UploadLimits.html" name="" title="UploadLimits">UploadLimits</a>
</li>
</ul>
</li>
<li>
<span class="expand-stub"></span>
<a href="server/EchoHub.Server.Controllers.html" name="" title="EchoHub.Server.Controllers">EchoHub.Server.Controllers</a>
+1 -1
View File
File diff suppressed because one or more lines are too long
+271
View File
@@ -0,0 +1,271 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Encrypted Rooms (Password-Protected Channels) | EchoHub Documentation </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Encrypted Rooms (Password-Protected Channels) | 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/blob/master/docs/#L1">
<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="">
<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="">
<h1 id="encrypted-rooms-password-protected-channels">Encrypted Rooms (Password-Protected Channels)</h1>
<p>An <strong>encrypted room</strong> is a channel whose entire content — every message and every file — is
end-to-end encrypted with a key derived from a shared passphrase. Only people who know the
passphrase can read the room. <strong>Not even the server owner can read the content</strong>, yet the server
can still gate who joins, and it can count and measure what's stored (message count, file sizes,
timestamps) without ever seeing the plaintext.</p>
<p>This is a stronger guarantee than the <a href="encryption.html">transport and at-rest encryption</a> described
elsewhere, where the server decrypts every message to process it. Here the server is treated as
<em>untrusted</em> for content: it holds only ciphertext and wrapped keys.</p>
<blockquote>
<p><strong>The passphrase is the only key.</strong> There is no recovery. If everyone who knows a room's
passphrase forgets it, that room's history is permanently unreadable — by design.</p>
</blockquote>
<h2 id="what-the-server-can-and-cannot-see">What the server can and cannot see</h2>
<table>
<thead>
<tr>
<th>The server <strong>can</strong> see</th>
<th>The server <strong>cannot</strong> see</th>
</tr>
</thead>
<tbody>
<tr>
<td>That the channel is encrypted</td>
<td>Message text</td>
</tr>
<tr>
<td>Message count and timestamps</td>
<td>File contents</td>
</tr>
<tr>
<td>Who sent each message (sender identity)</td>
<td>Image previews (ASCII art)</td>
</tr>
<tr>
<td>Each attachment's <strong>file name</strong> and byte size</td>
<td>The passphrase, the room key, or the key-encryption key</td>
</tr>
<tr>
<td>The estimated total size (via <code>/meta</code>)</td>
<td>Anything that would let it decrypt the above</td>
</tr>
</tbody>
</table>
<p>File <strong>names are stored in plaintext</strong> so the file list stays usable — treat a file name itself as
non-secret. Everything <em>inside</em> the file is encrypted.</p>
<h2 id="key-hierarchy">Key hierarchy</h2>
<p>Three keys are derived from one passphrase. The passphrase, the key-encryption key, and the room
content key <strong>never leave the client</strong>.</p>
<pre><code class="lang-mermaid">flowchart TD
P[Passphrase] --&gt;|PBKDF2-SHA256, 210k iterations, per-room salt| OKM[64-byte output]
OKM --&gt; AK[&quot;Auth key (first 32 bytes)&quot;]
OKM --&gt; KEK[&quot;Key-encryption key / KEK (last 32 bytes)&quot;]
AK --&gt;|sent as lowercase hex| SRV1[&quot;Server: BCrypt-hash as the join gate&quot;]
RCK[&quot;Room Content Key (random 256-bit)&quot;] --&gt;|encrypts all content| CONTENT[Messages + files + previews]
RCK --&gt;|AES-256-GCM wrap under KEK| WRAP[&quot;Wrapped room key&quot;]
WRAP --&gt;|stored| SRV2[&quot;Server: stores wrapped key + salt only&quot;]
</code></pre>
<ul>
<li><strong>Auth key</strong> — the join credential. Derived from the passphrase, sent to the server as hex, and
stored only as a <strong>BCrypt hash</strong>. Proving knowledge of it is what lets you join; it reveals
nothing about the content key.</li>
<li><strong>Key-encryption key (KEK)</strong> — never sent. Used locally to <em>wrap</em> (encrypt) and <em>unwrap</em> the room
content key.</li>
<li><strong>Room Content Key (RCK)</strong> — a random 256-bit key generated once, at room creation. It encrypts
every message and file. The server stores it only in wrapped form, so it can hand the wrapped key
to a joiner but can never unwrap it itself.</li>
</ul>
<p>All content encryption is <strong>AES-256-GCM</strong> with a random 12-byte nonce and a 16-byte authentication
tag per item, so identical inputs never produce identical ciphertext, and any tampering is detected.</p>
<p>Room-encrypted text carries a self-describing prefix so clients and the server can tell it apart
from plaintext:</p>
<pre><code class="lang-text">$RC1$base64(nonce || tag || ciphertext)
</code></pre>
<h2 id="creating-a-room">Creating a room</h2>
<p>The client does all the cryptography locally, then hands the server only what it needs to gate joins
and store (but not read) the content.</p>
<pre><code class="lang-mermaid">sequenceDiagram
participant Client
participant Server
Client-&gt;&gt;Client: generate salt + random Room Content Key (RCK)
Client-&gt;&gt;Client: DeriveKeys(passphrase, salt) → auth key + KEK
Client-&gt;&gt;Client: wrap RCK under KEK
Client-&gt;&gt;Server: create channel { authKey(hex), salt, wrappedRoomKey }
Server-&gt;&gt;Server: BCrypt-hash auth key, store salt + wrapped key
Note over Server: Server never receives passphrase, KEK, or RCK
</code></pre>
<h2 id="joining-a-room">Joining a room</h2>
<pre><code class="lang-mermaid">sequenceDiagram
participant Client
participant Server
Client-&gt;&gt;Server: GET /crypto → { isEncrypted, salt }
Client-&gt;&gt;Client: DeriveKeys(passphrase, salt) → auth key + KEK
Client-&gt;&gt;Server: join { authKey(hex) }
Server-&gt;&gt;Server: BCrypt-verify against stored hash
alt correct passphrase
Server-&gt;&gt;Client: history (ciphertext) + wrapped room key
Client-&gt;&gt;Client: unwrap RCK with KEK, then decrypt everything locally
else wrong passphrase
Server-&gt;&gt;Client: rejected (join gate fails)
end
</code></pre>
<p>A wrong passphrase fails the BCrypt gate, so the server never even hands out the wrapped key. Even if
it did, an attacker without the KEK cannot unwrap it.</p>
<h2 id="what-gets-encrypted">What gets encrypted</h2>
<p>When you send a message or attach files to an encrypted room, the client encrypts each part with the
room content key <strong>before</strong> uploading:</p>
<ul>
<li><strong>Message text</strong><code>$RC1$…</code> ciphertext.</li>
<li><strong>Files</strong> (any kind) → the whole blob is AES-256-GCM encrypted client-side; the server stores an
opaque ciphertext blob.</li>
<li><strong>Image ASCII previews</strong> → rendered on the client, then room-encrypted. The server never sees the
rendered art.</li>
</ul>
<p>The server records each attachment's <strong>kind</strong>, <strong>file name</strong>, and <strong>byte size</strong> (of the ciphertext
blob) as metadata, and broadcasts the ciphertext to other members, who decrypt locally.</p>
<h2 id="changing-the-passphrase">Changing the passphrase</h2>
<p><code>/passwd &lt;old&gt; &lt;new&gt;</code> rotates the passphrase. Because only the <em>wrapping</em> of the room content key
changes — not the RCK itself — <strong>all existing history stays readable</strong>:</p>
<ol>
<li>The client proves knowledge of the old passphrase (old auth key).</li>
<li>It unwraps the RCK with the old KEK, then re-wraps it under the new KEK (new salt).</li>
<li>It uploads the new auth key + salt + re-wrapped key. The content is never re-encrypted.</li>
</ol>
<h2 id="inspecting-a-room">Inspecting a room</h2>
<p>Use <code>/meta</code> in any channel to see what the server knows about it, including encrypted rooms:</p>
<pre><code class="lang-text">Room info for #private-room:
Room ID 3f2a…-…-…
Created 7/16/2026 2:31 PM
Messages 128
Unique users 4
Est. size 42.5 MB
Protection end-to-end encrypted
</code></pre>
<p><code>Est. size</code> is the sum of stored attachment blob sizes plus message text length — an estimate of the
room's footprint, computed entirely from metadata the server holds without reading any content.</p>
<h2 id="limitations--security-notes">Limitations &amp; security notes</h2>
<ul>
<li><strong>No recovery.</strong> A lost passphrase means unrecoverable history. Keep it safe; there is no reset.</li>
<li><strong>File names are plaintext.</strong> They stay readable so the file list works — don't put secrets in a
file name.</li>
<li><strong>IRC is disabled for encrypted rooms.</strong> The IRC gateway forwards plaintext and cannot participate
in the room's key scheme, so encrypted channels are not bridged to IRC.</li>
<li><strong>Metadata is visible.</strong> Message counts, timestamps, sender identities, file names, and sizes are
intentionally readable so the server can moderate at the metadata level and report <code>/meta</code>.</li>
<li><strong>Endpoint trust.</strong> End-to-end encryption protects content from the server and the network, not
from a compromised client device that already holds the passphrase.</li>
</ul>
<h2 id="related">Related</h2>
<ul>
<li><a href="encryption.html">Message Encryption</a> — transport (<code>$ENC$v1$</code>) and optional at-rest database
encryption, where the server <em>does</em> decrypt content for processing. Encrypted rooms are a separate,
stronger layer that sits on top.</li>
</ul>
</article>
<div class="contribution d-print-none">
<a href="https://github.com/HueByte/EchoHub/blob/master/docs/#L1" class="edit-link">Edit this page</a>
</div>
<div class="next-article d-print-none border-top" id="nextArticle"></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>
+1 -1
View File
@@ -197,7 +197,7 @@
<h3 id="limitations">Limitations</h3>
<ul>
<li><strong>TLS-inspecting proxies</strong> — if a corporate proxy terminates TLS with a trusted root CA, it can intercept the key exchange (<code>GET /api/server/encryption-key</code>) and read all traffic. A future upgrade to ECDH key exchange would address this.</li>
<li><strong>Server has full access</strong> — the server decrypts all messages for processing. This is not end-to-end encryption between users; it's transport encryption between client and server.</li>
<li><strong>Server has full access</strong> — the server decrypts all messages for processing. This is not end-to-end encryption between users; it's transport encryption between client and server. For true end-to-end encryption where the server cannot read content, use <a href="encrypted-rooms.html">encrypted rooms</a>.</li>
<li><strong>IRC clients receive plaintext</strong> — IRC is an open protocol and third-party clients cannot participate in the encryption scheme.</li>
</ul>
<h2 id="troubleshooting">Troubleshooting</h2>
+3
View File
@@ -32,6 +32,9 @@
<li>
<a href="encryption.html" name="" title="Encryption">Encryption</a>
</li>
<li>
<a href="encrypted-rooms.html" name="" title="Encrypted Rooms">Encrypted Rooms</a>
</li>
<li>
<a href="notification-sounds.html" name="" title="Notification Sounds">Notification Sounds</a>
</li>
+1 -1
View File
@@ -1,2 +1,2 @@
{"items":[{"name":"Guides","items":[{"name":"Getting Started","href":"getting-started.html","topicHref":"getting-started.html"},{"name":"Docker","href":"docker.html","topicHref":"docker.html"},{"name":"Architecture","href":"architecture.html","topicHref":"architecture.html"},{"name":"Configuration","href":"configuration.html","topicHref":"configuration.html"},{"name":"Encryption","href":"encryption.html","topicHref":"encryption.html"},{"name":"Notification Sounds","href":"notification-sounds.html","topicHref":"notification-sounds.html"}]},{"name":"Flows","includedFrom":"~/flows/toc.yml","items":[{"name":"Authentication","href":"../flows/authentication.html","topicHref":"../flows/authentication.html"},{"name":"Connection","href":"../flows/connection.html","topicHref":"../flows/connection.html"},{"name":"Messaging","href":"../flows/messaging.html","topicHref":"../flows/messaging.html"},{"name":"Channels","href":"../flows/channels.html","topicHref":"../flows/channels.html"},{"name":"Moderation","href":"../flows/moderation.html","topicHref":"../flows/moderation.html"},{"name":"Media & Services","href":"../flows/media.html","topicHref":"../flows/media.html"}]}]}
{"items":[{"name":"Guides","items":[{"name":"Getting Started","href":"getting-started.html","topicHref":"getting-started.html"},{"name":"Docker","href":"docker.html","topicHref":"docker.html"},{"name":"Architecture","href":"architecture.html","topicHref":"architecture.html"},{"name":"Configuration","href":"configuration.html","topicHref":"configuration.html"},{"name":"Encryption","href":"encryption.html","topicHref":"encryption.html"},{"name":"Encrypted Rooms","href":"encrypted-rooms.html","topicHref":"encrypted-rooms.html"},{"name":"Notification Sounds","href":"notification-sounds.html","topicHref":"notification-sounds.html"}]},{"name":"Flows","includedFrom":"~/flows/toc.yml","items":[{"name":"Authentication","href":"../flows/authentication.html","topicHref":"../flows/authentication.html"},{"name":"Connection","href":"../flows/connection.html","topicHref":"../flows/connection.html"},{"name":"Messaging","href":"../flows/messaging.html","topicHref":"../flows/messaging.html"},{"name":"Channels","href":"../flows/channels.html","topicHref":"../flows/channels.html"},{"name":"Moderation","href":"../flows/moderation.html","topicHref":"../flows/moderation.html"},{"name":"Media & Services","href":"../flows/media.html","topicHref":"../flows/media.html"}]}]}
+1
View File
@@ -90,6 +90,7 @@
<p>Release history for EchoHub.</p>
<h2 id="releases">Releases</h2>
<ul>
<li><a href="v0.2.13.html">v0.2.13</a> - Chat Visual Overhaul, Auto-Join All Channels &amp; Persistent Read Positions</li>
<li><a href="v0.2.12.html">v0.2.12</a> - End-to-End Encrypted Channels, IRC Channel Keys, Image Save &amp; Ctrl+W Crash Fix</li>
<li><a href="v0.2.11.html">v0.2.11</a> - EchoHubSpace Auth, Live Directory Updates &amp; Server Browser Metadata</li>
<li><a href="v0.2.10.html">v0.2.10</a> - Command Palette, Infinite History Scroll &amp; Auto-Updater Fixes</li>
+3
View File
@@ -15,6 +15,9 @@
<li>
<a href="index.html" name="" title="Overview">Overview</a>
</li>
<li>
<a href="v0.2.13.html" name="" title="v0.2.13">v0.2.13</a>
</li>
<li>
<a href="v0.2.12.html" name="" title="v0.2.12">v0.2.12</a>
</li>
+1 -1
View File
@@ -1,2 +1,2 @@
{"items":[{"name":"Overview","href":"index.html","topicHref":"index.html"},{"name":"v0.2.12","href":"v0.2.12.html","topicHref":"v0.2.12.html"},{"name":"v0.2.11","href":"v0.2.11.html","topicHref":"v0.2.11.html"},{"name":"v0.2.10","href":"v0.2.10.html","topicHref":"v0.2.10.html"},{"name":"v0.2.9","href":"v0.2.9.html","topicHref":"v0.2.9.html"},{"name":"v0.2.8","href":"v0.2.8.html","topicHref":"v0.2.8.html"},{"name":"v0.2.7","href":"v0.2.7.html","topicHref":"v0.2.7.html"},{"name":"v0.2.6","href":"v0.2.6.html","topicHref":"v0.2.6.html"},{"name":"v0.2.5","href":"v0.2.5.html","topicHref":"v0.2.5.html"},{"name":"v0.2.4","href":"v0.2.4.html","topicHref":"v0.2.4.html"},{"name":"v0.2.3","href":"v0.2.3.html","topicHref":"v0.2.3.html"},{"name":"v0.2.2","href":"v0.2.2.html","topicHref":"v0.2.2.html"},{"name":"v0.2.1","href":"v0.2.1.html","topicHref":"v0.2.1.html"},{"name":"v0.2.0","href":"v0.2.0.html","topicHref":"v0.2.0.html"},{"name":"v0.1.1","href":"v0.1.1.html","topicHref":"v0.1.1.html"},{"name":"v0.1.0","href":"v0.1.0.html","topicHref":"v0.1.0.html"}]}
{"items":[{"name":"Overview","href":"index.html","topicHref":"index.html"},{"name":"v0.2.13","href":"v0.2.13.html","topicHref":"v0.2.13.html"},{"name":"v0.2.12","href":"v0.2.12.html","topicHref":"v0.2.12.html"},{"name":"v0.2.11","href":"v0.2.11.html","topicHref":"v0.2.11.html"},{"name":"v0.2.10","href":"v0.2.10.html","topicHref":"v0.2.10.html"},{"name":"v0.2.9","href":"v0.2.9.html","topicHref":"v0.2.9.html"},{"name":"v0.2.8","href":"v0.2.8.html","topicHref":"v0.2.8.html"},{"name":"v0.2.7","href":"v0.2.7.html","topicHref":"v0.2.7.html"},{"name":"v0.2.6","href":"v0.2.6.html","topicHref":"v0.2.6.html"},{"name":"v0.2.5","href":"v0.2.5.html","topicHref":"v0.2.5.html"},{"name":"v0.2.4","href":"v0.2.4.html","topicHref":"v0.2.4.html"},{"name":"v0.2.3","href":"v0.2.3.html","topicHref":"v0.2.3.html"},{"name":"v0.2.2","href":"v0.2.2.html","topicHref":"v0.2.2.html"},{"name":"v0.2.1","href":"v0.2.1.html","topicHref":"v0.2.1.html"},{"name":"v0.2.0","href":"v0.2.0.html","topicHref":"v0.2.0.html"},{"name":"v0.1.1","href":"v0.1.1.html","topicHref":"v0.1.1.html"},{"name":"v0.1.0","href":"v0.1.0.html","topicHref":"v0.1.0.html"}]}
+8 -1
View File
@@ -120,7 +120,10 @@
<li>Attach a file by drag &amp; drop or by pasting — drop a file onto the terminal, or <strong>copy a file in your file manager and press Ctrl+V</strong>, to stage it as an attachment (the next Enter sends it with your caption). Multiple files at once are supported. Ctrl+V still pastes text when the clipboard holds text; Ctrl+Y is a paste alias. On Windows the copied-file paste reads the clipboard's file list directly (Windows Terminal never pastes copied files as text), with <code>xclip</code>/<code>wl-paste</code> used on Linux</li>
<li>Pick ASCII-art size for attached images — <code>/size</code> opens a Small/Medium/Large picker (40×40 / 80×80 / 120×120) with descriptions, <code>/size &lt;s|m|l&gt;</code> sets it directly, and <code>/send &lt;file&gt; -l</code> sets it for that message. The choice is a saved preference and applies to copy-paste/drag-drop images (which have no per-file flag); the current size is shown in the staging tray</li>
<li>New <code>TransparentLight</code> theme — dark characters on a transparent background, for light terminal color schemes (<code>/theme transparentlight</code>)</li>
<li>Timestamps in messages are now aware of the current culture and display the short time pattern for today's messages and the short date+time pattern for older messages.</li>
<li><strong><code>/meta</code> command</strong> — shows a summary of the current room: room id, created date, message count, unique participant count, estimated storage size, and protection level (open / password-protected / end-to-end encrypted). Works for encrypted rooms too, since these are all metadata the server tracks without reading content. (<code>/info</code> is an alias.)</li>
<li><strong>Configurable upload limits</strong> — a new <code>Uploads</code> section in the server settings sets the maximum size per file, image, audio clip, and avatar, plus the maximum attachments per message. Absent values fall back to the previous built-in limits, so existing servers are unaffected until they opt in.</li>
<li><strong>Updater progress bar</strong> — the self-updater now draws a real progress bar on the console (<code>Downloading [████████░░] 62%</code>) for each step, replacing the plain status lines, so a large download shows visible progress.</li>
<li>Timestamps in messages are culture-aware and now <strong>always include the date</strong>: today's messages show a compact date + short time, and older messages show the general short date/time.</li>
</ul>
<h2 id="bug-fixes">Bug Fixes</h2>
<ul>
@@ -128,12 +131,16 @@
<li>Attachments whose files have been pruned (retention cleanup deletes blobs older than <code>Storage:RetentionDays</code> but left the message rows) no longer render a dead download/preview. When channel history loads, the server checks which attachment blobs still exist: missing ones are dropped from the message, and an attachment-only message whose files are all gone is removed from the database.</li>
<li>Fixed intermittent crash on Ctrl+W — Terminal.Gui binds Ctrl+W to clipboard-cut, and Windows clipboard contention (another app holding the clipboard) threw an unhandled <code>Win32Exception</code> that took the app down. Ctrl+W now deletes the previous word (readline behavior, no clipboard), and all clipboard shortcuts (Ctrl+X/C/V/Y) are guarded so transient clipboard failures log a warning instead of crashing</li>
<li>Fixed emoji shortcode replacement permanently disabling itself if a cursor update threw mid-replacement</li>
<li>Fixed new messages showing no date — today's messages rendered time-only, and the &quot;is it today?&quot; check compared the server's UTC date against the local date, so the classification could also be wrong near midnight. Timestamps are now converted to local time first and always include the date.</li>
<li>Fixed the self-updater hanging at &quot;extracting&quot; — the update ran while the Terminal.Gui main loop still owned the console, so the old and new processes deadlocked over it. The update now runs after the TUI shuts down, on a clean console</li>
<li>IRC <code>LIST</code> no longer leaks private channels; protected channels are marked <code>[+k]</code></li>
</ul>
<h2 id="api-changes">API Changes</h2>
<ul>
<li><code>ChannelDto</code> gains <code>isProtected</code> and <code>isEncrypted</code>; <code>CreateChannelRequest</code> gains optional <code>password</code>, <code>encryptionSalt</code>, and <code>wrappedRoomKey</code>; SignalR <code>JoinChannel</code> takes an optional second <code>password</code> argument and <code>JoinChannelResult</code> gains <code>passwordRequired</code>, <code>encryptionSalt</code>, and <code>wrappedRoomKey</code> (older clients must update to join over SignalR)</li>
<li>New endpoints: <code>GET /api/channels/{channel}/crypto</code> (public crypto metadata — salt only, never the wrapped key) and <code>POST /api/channels/{channel}/rekey</code> (creator-only passphrase change)</li>
<li>New endpoint <code>GET /api/channels/{channel}/meta</code> returns a <code>ChannelMetaDto</code> (room id, name, topic, encrypted/protected flags, message count, unique user count, estimated size, created date) backing the <code>/meta</code> command</li>
<li>New server <code>Uploads</code> configuration section (<code>MaxFileSizeMB</code>, <code>MaxImageSizeMB</code>, <code>MaxAudioSizeMB</code>, <code>MaxAvatarSizeMB</code>, <code>MaxAttachmentsPerMessage</code>); the message-upload endpoint's request-body ceiling is now derived from these values at runtime rather than from compile-time constants</li>
<li>The upload endpoint accepts <code>type</code> and <code>content</code> form fields for encrypted channels, where the client supplies the declared message type and room-encrypted content</li>
<li><code>ImageToAsciiService</code> and <code>FileValidationHelper</code> moved from <code>EchoHub.Server</code> to <code>EchoHub.Core</code> so the client can render ASCII art and detect file types for encrypted uploads</li>
<li><strong>Message shape change</strong>: <code>MessageDto</code> drops <code>Type</code>/<code>AttachmentUrl</code>/<code>AttachmentFileName</code>/<code>AttachmentFileSize</code> and gains <code>Attachments</code> (a list of <code>AttachmentDto { Kind, Url, FileName, FileSize, AsciiPreview }</code>, null/empty for plain text). New <code>Attachment</code> entity + table with a cascade FK to <code>Message</code></li>
+140
View File
@@ -0,0 +1,140 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>v0.2.13 | EchoHub Documentation </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="v0.2.13 | 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/blob/master/docs/#L1">
<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="">
<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="">
<h1 id="v0213">v0.2.13</h1>
<p>A visual overhaul of the chat client — WeeChat-style column layout, per-user nick colors, date rules, unread markers, an activity status segment, and an ASCII welcome banner — plus reliable cross-channel notifications: the client now joins all your channels at connect so unread counts and @mentions light up everywhere, and read positions persist across restarts so activity that happened while you were offline still shows. Modern polish, old IRC soul.</p>
<h2 id="new-features">New Features</h2>
<ul>
<li><strong>Aligned message layout (WeeChat-style)</strong> — every message renders as <code>HH:mm nickname │ text</code>: a dim timestamp, the nick right-aligned in a fixed 12-column gutter, and a dim <code></code> rail separating names from content. Word-wrapped continuation lines, multi-line messages, attachments, ASCII-art image previews, and link embeds all align under the text column and extend the rail, so conversations read as a clean two-column grid. Over-long nicks are truncated with <code></code> in the gutter only — profiles, mentions, and the users panel always use the full name. System and status lines (<code>joined</code>, <code>is now Away</code>, …) show <code>--</code> in the nick column, replacing the old <code>**</code> prefix.</li>
<li><strong>Deterministic nickname colors</strong> — users who haven't picked a <code>/color</code> now get an automatic, stable color derived from their nick (12-entry palette chosen to stay readable on dark and light backgrounds). The same user is the same color in message headers and the online-users panel, on every client, every session. An explicitly chosen nickname color still takes priority.</li>
<li><strong>Date separator rules</strong> — a full-width <code>── Wed, Jul 16 2026 ─────</code> rule is inserted whenever the calendar day changes (live, in loaded history, and when scrolling back through older messages). Timestamps are now a compact <code>HH:mm</code> — the date lives in the rules instead of being repeated on every line.</li>
<li><strong>&quot;New messages&quot; marker</strong> — the first message that arrives in a channel you're not viewing gets an orange <code>── new messages ──</code> rule above it (irssi-style). Switch to the channel and the marker shows exactly where you left off; it survives the history reload on channel switch and is consumed when you move away again.</li>
<li><strong>Status bar activity segment</strong> — channels with unread messages appear in the status bar as <code>│ Act: #dev,#random</code> (up to 4, <code>+n</code> overflow). Channels where you were @mentioned show in orange, others in cyan.</li>
<li><strong>Connecting spinner</strong> — transitional connection states (Connecting, Reconnecting, Authenticating…) now animate a braille spinner in the status bar instead of sitting on static text.</li>
<li><strong>Mention-aware channel list</strong> — a channel where you were @mentioned turns orange in the channel list (name and unread badge), escalating above the cyan plain-unread highlight. The highlight clears when you view the channel.</li>
<li><strong>Welcome banner</strong> — with no channel selected (fresh start, or after disconnecting) the chat pane shows a gold-gradient ASCII &quot;ECHOHUB&quot; logo with the version and key hints, instead of an empty box. Narrow panes get a compact variant.</li>
<li><strong>Rounded frame borders</strong> — the channels, chat, input, and users panels draw with rounded corners.</li>
<li><strong>Auto-join all channels at connect</strong> — the client now joins every channel it lists for you (public channels and prior memberships) as part of connecting, so message events flow for all of them: unread badges, @mention highlights, and the status-bar activity segment work without having to open each channel first. Protected channels you've never entered are skipped silently (joining them stays a prompted, manual action), and channels you <code>/leave</code> are remembered and excluded until you join them again.</li>
<li><strong>Read positions survive restarts</strong> — the client persists the last message you read per channel (locally, per server). On the next connect it compares that against fetched history, so messages that arrived while you were offline still produce unread counts, mention highlights, and a correctly placed &quot;new messages&quot; marker.</li>
<li><strong>Theme-tinted frame borders</strong> — themes can now color the window frame borders independently of text via a new optional <code>border</code> section (hex values supported). The Transparent and TransparentLight themes use it to draw dim gray borders instead of stark white ones, for a subtler, glassier look. Custom theme JSON files without a <code>border</code> section keep their base colors.</li>
</ul>
<h2 id="bug-fixes">Bug Fixes</h2>
<ul>
<li>The @mention highlight no longer drops off the second and later lines of a long mention message — wrapped continuation lines now inherit the highlight.</li>
<li>The unread-position marker is re-anchored after a channel switch reloads history, instead of being wiped by the reload before you could see it.</li>
<li>Cached room keys for end-to-end encrypted channels no longer disappear from the config on reconnect. Saving the server entry after a successful connect replaced it wholesale, wiping the cached keys (and forcing a passphrase re-entry on the next launch); the entry is now updated in place.</li>
<li>A failed channel rejoin after a reconnect (e.g. a channel deleted while you were away) no longer aborts rejoining the remaining channels.</li>
<li>Client config file access is now serialized across threads (token refresh, room-key cache, and read-position checkpoints all write it), preventing rare config corruption.</li>
</ul>
</article>
<div class="contribution d-print-none">
<a href="https://github.com/HueByte/EchoHub/blob/master/docs/#L1" class="edit-link">Edit this page</a>
</div>
<div class="next-article d-print-none border-top" id="nextArticle"></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>
+51 -26
View File
File diff suppressed because one or more lines are too long
+76 -14
View File
@@ -780,20 +780,6 @@
"Title": "EchoHub.Client.UI.Dialogs.UpdateConfirmDialog",
"Summary": null
},
{
"type": "ManagedReference",
"source_relative_path": "_api_meta/client/EchoHub.Client.UI.Dialogs.UpdateProgressDialog.yml",
"output": {
".html": {
"relative_path": "api/client/EchoHub.Client.UI.Dialogs.UpdateProgressDialog.html"
}
},
"version": "",
"Uid": null,
"IsMRef": true,
"Title": "EchoHub.Client.UI.Dialogs.UpdateProgressDialog",
"Summary": null
},
{
"type": "ManagedReference",
"source_relative_path": "_api_meta/client/EchoHub.Client.UI.Dialogs.yml",
@@ -850,6 +836,20 @@
"Title": "EchoHub.Client.UI.Helpers.HexColorHelper",
"Summary": "<p sourcefile=\"_api_meta/client/EchoHub.Client.UI.Helpers.HexColorHelper.yml\" sourcestartlinenumber=\"1\">Helper to parse hex colors to Terminal.Gui Attributes.</p>\n"
},
{
"type": "ManagedReference",
"source_relative_path": "_api_meta/client/EchoHub.Client.UI.Helpers.NickColorHelper.yml",
"output": {
".html": {
"relative_path": "api/client/EchoHub.Client.UI.Helpers.NickColorHelper.html"
}
},
"version": "",
"Uid": null,
"IsMRef": true,
"Title": "EchoHub.Client.UI.Helpers.NickColorHelper",
"Summary": "<p sourcefile=\"_api_meta/client/EchoHub.Client.UI.Helpers.NickColorHelper.yml\" sourcestartlinenumber=\"1\">Deterministic per-nick colors for users who haven't picked a nickname color.\nThe same nick always maps to the same palette entry (classic IRC client behavior),\nso a busy channel stays scannable without any configuration.</p>\n"
},
{
"type": "ManagedReference",
"source_relative_path": "_api_meta/client/EchoHub.Client.UI.Helpers.yml",
@@ -1242,6 +1242,20 @@
"Title": "EchoHub.Core.DTOs.ChannelError",
"Summary": null
},
{
"type": "ManagedReference",
"source_relative_path": "_api_meta/core/EchoHub.Core.DTOs.ChannelMetaDto.yml",
"output": {
".html": {
"relative_path": "api/core/EchoHub.Core.DTOs.ChannelMetaDto.html"
}
},
"version": "",
"Uid": null,
"IsMRef": true,
"Title": "EchoHub.Core.DTOs.ChannelMetaDto",
"Summary": "<p sourcefile=\"_api_meta/core/EchoHub.Core.DTOs.ChannelMetaDto.yml\" sourcestartlinenumber=\"1\">Human-facing summary of a channel (the <code>/meta</code> command). For encrypted channels the\nserver still knows these figures — count, timestamps, and stored blob sizes — even though it\ncannot read the content itself. <xref href=\"EchoHub.Core.DTOs.ChannelMetaDto.EstimatedSizeBytes\" data-throw-if-not-resolved=\"false\"></xref> is the sum of stored\nattachment blob sizes plus message text length, so it is an estimate, not an exact on-disk total.</p>\n"
},
{
"type": "ManagedReference",
"source_relative_path": "_api_meta/core/EchoHub.Core.DTOs.ChannelOperationResult.yml",
@@ -2026,6 +2040,34 @@
"Title": "EchoHub.Server.Auth",
"Summary": null
},
{
"type": "ManagedReference",
"source_relative_path": "_api_meta/server/EchoHub.Server.Config.UploadLimits.yml",
"output": {
".html": {
"relative_path": "api/server/EchoHub.Server.Config.UploadLimits.html"
}
},
"version": "",
"Uid": null,
"IsMRef": true,
"Title": "EchoHub.Server.Config.UploadLimits",
"Summary": "<p sourcefile=\"_api_meta/server/EchoHub.Server.Config.UploadLimits.yml\" sourcestartlinenumber=\"1\">Admin-configurable upload limits, bound from the <code>Uploads</code> configuration section.\nSizes are expressed in megabytes in configuration; the <code>*Bytes</code> accessors convert them\nfor enforcement. Every default mirrors <xref href=\"EchoHub.Core.Constants.HubConstants\" data-throw-if-not-resolved=\"false\"></xref> so an absent or partial\n<code>Uploads</code> section preserves the historical built-in limits.</p>\n"
},
{
"type": "ManagedReference",
"source_relative_path": "_api_meta/server/EchoHub.Server.Config.yml",
"output": {
".html": {
"relative_path": "api/server/EchoHub.Server.Config.html"
}
},
"version": "",
"Uid": null,
"IsMRef": true,
"Title": "EchoHub.Server.Config",
"Summary": null
},
{
"type": "ManagedReference",
"source_relative_path": "_api_meta/server/EchoHub.Server.Controllers.AuthController.yml",
@@ -2708,6 +2750,16 @@
},
"version": ""
},
{
"type": "Conceptual",
"source_relative_path": "articles/encrypted-rooms.md",
"output": {
".html": {
"relative_path": "articles/encrypted-rooms.html"
}
},
"version": ""
},
{
"type": "Conceptual",
"source_relative_path": "articles/encryption.md",
@@ -2844,6 +2896,16 @@
},
"version": ""
},
{
"type": "Conceptual",
"source_relative_path": "changelog/v0.2.13.md",
"output": {
".html": {
"relative_path": "changelog/v0.2.13.html"
}
},
"version": ""
},
{
"type": "Conceptual",
"source_relative_path": "changelog/v0.2.2.md",
+732 -99
View File
@@ -55,6 +55,18 @@ references:
commentId: Overload:EchoHub.Client.AppOrchestrator.MainWindow
fullName: EchoHub.Client.AppOrchestrator.MainWindow
nameWithType: AppOrchestrator.MainWindow
- uid: EchoHub.Client.AppOrchestrator.PendingUpdate
name: PendingUpdate
href: api/client/EchoHub.Client.AppOrchestrator.html#EchoHub_Client_AppOrchestrator_PendingUpdate
commentId: P:EchoHub.Client.AppOrchestrator.PendingUpdate
fullName: EchoHub.Client.AppOrchestrator.PendingUpdate
nameWithType: AppOrchestrator.PendingUpdate
- uid: EchoHub.Client.AppOrchestrator.PendingUpdate*
name: PendingUpdate
href: api/client/EchoHub.Client.AppOrchestrator.html#EchoHub_Client_AppOrchestrator_PendingUpdate_
commentId: Overload:EchoHub.Client.AppOrchestrator.PendingUpdate
fullName: EchoHub.Client.AppOrchestrator.PendingUpdate
nameWithType: AppOrchestrator.PendingUpdate
- uid: EchoHub.Client.Commands
name: EchoHub.Client.Commands
href: api/client/EchoHub.Client.Commands.html
@@ -199,6 +211,12 @@ references:
commentId: E:EchoHub.Client.Commands.CommandHandler.OnQuit
fullName: EchoHub.Client.Commands.CommandHandler.OnQuit
nameWithType: CommandHandler.OnQuit
- uid: EchoHub.Client.Commands.CommandHandler.OnRoomInfo
name: OnRoomInfo
href: api/client/EchoHub.Client.Commands.CommandHandler.html#EchoHub_Client_Commands_CommandHandler_OnRoomInfo
commentId: E:EchoHub.Client.Commands.CommandHandler.OnRoomInfo
fullName: EchoHub.Client.Commands.CommandHandler.OnRoomInfo
nameWithType: CommandHandler.OnRoomInfo
- uid: EchoHub.Client.Commands.CommandHandler.OnSendFile
name: OnSendFile
href: api/client/EchoHub.Client.Commands.CommandHandler.html#EchoHub_Client_Commands_CommandHandler_OnSendFile
@@ -790,6 +808,30 @@ references:
commentId: Overload:EchoHub.Client.Config.SavedServer.LastConnected
fullName: EchoHub.Client.Config.SavedServer.LastConnected
nameWithType: SavedServer.LastConnected
- uid: EchoHub.Client.Config.SavedServer.LastReadMessages
name: LastReadMessages
href: api/client/EchoHub.Client.Config.SavedServer.html#EchoHub_Client_Config_SavedServer_LastReadMessages
commentId: P:EchoHub.Client.Config.SavedServer.LastReadMessages
fullName: EchoHub.Client.Config.SavedServer.LastReadMessages
nameWithType: SavedServer.LastReadMessages
- uid: EchoHub.Client.Config.SavedServer.LastReadMessages*
name: LastReadMessages
href: api/client/EchoHub.Client.Config.SavedServer.html#EchoHub_Client_Config_SavedServer_LastReadMessages_
commentId: Overload:EchoHub.Client.Config.SavedServer.LastReadMessages
fullName: EchoHub.Client.Config.SavedServer.LastReadMessages
nameWithType: SavedServer.LastReadMessages
- uid: EchoHub.Client.Config.SavedServer.LeftChannels
name: LeftChannels
href: api/client/EchoHub.Client.Config.SavedServer.html#EchoHub_Client_Config_SavedServer_LeftChannels
commentId: P:EchoHub.Client.Config.SavedServer.LeftChannels
fullName: EchoHub.Client.Config.SavedServer.LeftChannels
nameWithType: SavedServer.LeftChannels
- uid: EchoHub.Client.Config.SavedServer.LeftChannels*
name: LeftChannels
href: api/client/EchoHub.Client.Config.SavedServer.html#EchoHub_Client_Config_SavedServer_LeftChannels_
commentId: Overload:EchoHub.Client.Config.SavedServer.LeftChannels
fullName: EchoHub.Client.Config.SavedServer.LeftChannels
nameWithType: SavedServer.LeftChannels
- uid: EchoHub.Client.Config.SavedServer.Name
name: Name
href: api/client/EchoHub.Client.Config.SavedServer.html#EchoHub_Client_Config_SavedServer_Name
@@ -1006,6 +1048,21 @@ references:
commentId: Overload:EchoHub.Client.Services.ApiClient.GetChannelCryptoAsync
fullName: EchoHub.Client.Services.ApiClient.GetChannelCryptoAsync
nameWithType: ApiClient.GetChannelCryptoAsync
- uid: EchoHub.Client.Services.ApiClient.GetChannelMetaAsync(System.String)
name: GetChannelMetaAsync(string)
href: api/client/EchoHub.Client.Services.ApiClient.html#EchoHub_Client_Services_ApiClient_GetChannelMetaAsync_System_String_
commentId: M:EchoHub.Client.Services.ApiClient.GetChannelMetaAsync(System.String)
name.vb: GetChannelMetaAsync(String)
fullName: EchoHub.Client.Services.ApiClient.GetChannelMetaAsync(string)
fullName.vb: EchoHub.Client.Services.ApiClient.GetChannelMetaAsync(String)
nameWithType: ApiClient.GetChannelMetaAsync(string)
nameWithType.vb: ApiClient.GetChannelMetaAsync(String)
- uid: EchoHub.Client.Services.ApiClient.GetChannelMetaAsync*
name: GetChannelMetaAsync
href: api/client/EchoHub.Client.Services.ApiClient.html#EchoHub_Client_Services_ApiClient_GetChannelMetaAsync_
commentId: Overload:EchoHub.Client.Services.ApiClient.GetChannelMetaAsync
fullName: EchoHub.Client.Services.ApiClient.GetChannelMetaAsync
nameWithType: ApiClient.GetChannelMetaAsync
- uid: EchoHub.Client.Services.ApiClient.GetChannelsAsync
name: GetChannelsAsync()
href: api/client/EchoHub.Client.Services.ApiClient.html#EchoHub_Client_Services_ApiClient_GetChannelsAsync
@@ -2956,6 +3013,18 @@ references:
commentId: Overload:EchoHub.Client.Services.UpdateChecker.Dispose
fullName: EchoHub.Client.Services.UpdateChecker.Dispose
nameWithType: UpdateChecker.Dispose
- uid: EchoHub.Client.Services.UpdateChecker.PendingUpdate
name: PendingUpdate
href: api/client/EchoHub.Client.Services.UpdateChecker.html#EchoHub_Client_Services_UpdateChecker_PendingUpdate
commentId: P:EchoHub.Client.Services.UpdateChecker.PendingUpdate
fullName: EchoHub.Client.Services.UpdateChecker.PendingUpdate
nameWithType: UpdateChecker.PendingUpdate
- uid: EchoHub.Client.Services.UpdateChecker.PendingUpdate*
name: PendingUpdate
href: api/client/EchoHub.Client.Services.UpdateChecker.html#EchoHub_Client_Services_UpdateChecker_PendingUpdate_
commentId: Overload:EchoHub.Client.Services.UpdateChecker.PendingUpdate
fullName: EchoHub.Client.Services.UpdateChecker.PendingUpdate
nameWithType: UpdateChecker.PendingUpdate
- uid: EchoHub.Client.Services.UpdateChecker.Start
name: Start()
href: api/client/EchoHub.Client.Services.UpdateChecker.html#EchoHub_Client_Services_UpdateChecker_Start
@@ -3010,6 +3079,18 @@ references:
commentId: Overload:EchoHub.Client.Themes.Theme.Base
fullName: EchoHub.Client.Themes.Theme.Base
nameWithType: Theme.Base
- uid: EchoHub.Client.Themes.Theme.Border
name: Border
href: api/client/EchoHub.Client.Themes.Theme.html#EchoHub_Client_Themes_Theme_Border
commentId: P:EchoHub.Client.Themes.Theme.Border
fullName: EchoHub.Client.Themes.Theme.Border
nameWithType: Theme.Border
- uid: EchoHub.Client.Themes.Theme.Border*
name: Border
href: api/client/EchoHub.Client.Themes.Theme.html#EchoHub_Client_Themes_Theme_Border_
commentId: Overload:EchoHub.Client.Themes.Theme.Border
fullName: EchoHub.Client.Themes.Theme.Border
nameWithType: Theme.Border
- uid: EchoHub.Client.Themes.Theme.Dialog
name: Dialog
href: api/client/EchoHub.Client.Themes.Theme.html#EchoHub_Client_Themes_Theme_Dialog
@@ -3217,6 +3298,12 @@ references:
commentId: F:EchoHub.Client.UI.Chat.ChatColors.ChannelRefAttr
fullName: EchoHub.Client.UI.Chat.ChatColors.ChannelRefAttr
nameWithType: ChatColors.ChannelRefAttr
- uid: EchoHub.Client.UI.Chat.ChatColors.DateRuleAttr
name: DateRuleAttr
href: api/client/EchoHub.Client.UI.Chat.ChatColors.html#EchoHub_Client_UI_Chat_ChatColors_DateRuleAttr
commentId: F:EchoHub.Client.UI.Chat.ChatColors.DateRuleAttr
fullName: EchoHub.Client.UI.Chat.ChatColors.DateRuleAttr
nameWithType: ChatColors.DateRuleAttr
- uid: EchoHub.Client.UI.Chat.ChatColors.EmbedBorderAttr
name: EmbedBorderAttr
href: api/client/EchoHub.Client.UI.Chat.ChatColors.html#EchoHub_Client_UI_Chat_ChatColors_EmbedBorderAttr
@@ -3259,6 +3346,12 @@ references:
commentId: F:EchoHub.Client.UI.Chat.ChatColors.MentionTextAttr
fullName: EchoHub.Client.UI.Chat.ChatColors.MentionTextAttr
nameWithType: ChatColors.MentionTextAttr
- uid: EchoHub.Client.UI.Chat.ChatColors.RailAttr
name: RailAttr
href: api/client/EchoHub.Client.UI.Chat.ChatColors.html#EchoHub_Client_UI_Chat_ChatColors_RailAttr
commentId: F:EchoHub.Client.UI.Chat.ChatColors.RailAttr
fullName: EchoHub.Client.UI.Chat.ChatColors.RailAttr
nameWithType: ChatColors.RailAttr
- uid: EchoHub.Client.UI.Chat.ChatColors.SplitMentions(System.String,System.Nullable{Terminal.Gui.Drawing.Attribute})
name: SplitMentions(string, Attribute?)
href: api/client/EchoHub.Client.UI.Chat.ChatColors.html#EchoHub_Client_UI_Chat_ChatColors_SplitMentions_System_String_System_Nullable_Terminal_Gui_Drawing_Attribute__
@@ -3286,6 +3379,12 @@ references:
commentId: F:EchoHub.Client.UI.Chat.ChatColors.TimestampAttr
fullName: EchoHub.Client.UI.Chat.ChatColors.TimestampAttr
nameWithType: ChatColors.TimestampAttr
- uid: EchoHub.Client.UI.Chat.ChatColors.UnreadMarkerAttr
name: UnreadMarkerAttr
href: api/client/EchoHub.Client.UI.Chat.ChatColors.html#EchoHub_Client_UI_Chat_ChatColors_UnreadMarkerAttr
commentId: F:EchoHub.Client.UI.Chat.ChatColors.UnreadMarkerAttr
fullName: EchoHub.Client.UI.Chat.ChatColors.UnreadMarkerAttr
nameWithType: ChatColors.UnreadMarkerAttr
- uid: EchoHub.Client.UI.Chat.ChatLine
name: ChatLine
href: api/client/EchoHub.Client.UI.Chat.ChatLine.html
@@ -3367,6 +3466,18 @@ references:
commentId: Overload:EchoHub.Client.UI.Chat.ChatLine.ContinuationIndent
fullName: EchoHub.Client.UI.Chat.ChatLine.ContinuationIndent
nameWithType: ChatLine.ContinuationIndent
- uid: EchoHub.Client.UI.Chat.ChatLine.ContinuationPrefixSegments
name: ContinuationPrefixSegments
href: api/client/EchoHub.Client.UI.Chat.ChatLine.html#EchoHub_Client_UI_Chat_ChatLine_ContinuationPrefixSegments
commentId: P:EchoHub.Client.UI.Chat.ChatLine.ContinuationPrefixSegments
fullName: EchoHub.Client.UI.Chat.ChatLine.ContinuationPrefixSegments
nameWithType: ChatLine.ContinuationPrefixSegments
- uid: EchoHub.Client.UI.Chat.ChatLine.ContinuationPrefixSegments*
name: ContinuationPrefixSegments
href: api/client/EchoHub.Client.UI.Chat.ChatLine.html#EchoHub_Client_UI_Chat_ChatLine_ContinuationPrefixSegments_
commentId: Overload:EchoHub.Client.UI.Chat.ChatLine.ContinuationPrefixSegments
fullName: EchoHub.Client.UI.Chat.ChatLine.ContinuationPrefixSegments
nameWithType: ChatLine.ContinuationPrefixSegments
- uid: EchoHub.Client.UI.Chat.ChatLine.FromColoredText(System.String,System.Nullable{Terminal.Gui.Drawing.Attribute})
name: FromColoredText(string, Attribute?)
href: api/client/EchoHub.Client.UI.Chat.ChatLine.html#EchoHub_Client_UI_Chat_ChatLine_FromColoredText_System_String_System_Nullable_Terminal_Gui_Drawing_Attribute__
@@ -3409,6 +3520,18 @@ references:
commentId: Overload:EchoHub.Client.UI.Chat.ChatLine.IsMention
fullName: EchoHub.Client.UI.Chat.ChatLine.IsMention
nameWithType: ChatLine.IsMention
- uid: EchoHub.Client.UI.Chat.ChatLine.IsUnreadMarker
name: IsUnreadMarker
href: api/client/EchoHub.Client.UI.Chat.ChatLine.html#EchoHub_Client_UI_Chat_ChatLine_IsUnreadMarker
commentId: P:EchoHub.Client.UI.Chat.ChatLine.IsUnreadMarker
fullName: EchoHub.Client.UI.Chat.ChatLine.IsUnreadMarker
nameWithType: ChatLine.IsUnreadMarker
- uid: EchoHub.Client.UI.Chat.ChatLine.IsUnreadMarker*
name: IsUnreadMarker
href: api/client/EchoHub.Client.UI.Chat.ChatLine.html#EchoHub_Client_UI_Chat_ChatLine_IsUnreadMarker_
commentId: Overload:EchoHub.Client.UI.Chat.ChatLine.IsUnreadMarker
fullName: EchoHub.Client.UI.Chat.ChatLine.IsUnreadMarker
nameWithType: ChatLine.IsUnreadMarker
- uid: EchoHub.Client.UI.Chat.ChatLine.MessageId
name: MessageId
href: api/client/EchoHub.Client.UI.Chat.ChatLine.html#EchoHub_Client_UI_Chat_ChatLine_MessageId
@@ -3421,6 +3544,30 @@ references:
commentId: Overload:EchoHub.Client.UI.Chat.ChatLine.MessageId
fullName: EchoHub.Client.UI.Chat.ChatLine.MessageId
nameWithType: ChatLine.MessageId
- uid: EchoHub.Client.UI.Chat.ChatLine.RuleAttr
name: RuleAttr
href: api/client/EchoHub.Client.UI.Chat.ChatLine.html#EchoHub_Client_UI_Chat_ChatLine_RuleAttr
commentId: P:EchoHub.Client.UI.Chat.ChatLine.RuleAttr
fullName: EchoHub.Client.UI.Chat.ChatLine.RuleAttr
nameWithType: ChatLine.RuleAttr
- uid: EchoHub.Client.UI.Chat.ChatLine.RuleAttr*
name: RuleAttr
href: api/client/EchoHub.Client.UI.Chat.ChatLine.html#EchoHub_Client_UI_Chat_ChatLine_RuleAttr_
commentId: Overload:EchoHub.Client.UI.Chat.ChatLine.RuleAttr
fullName: EchoHub.Client.UI.Chat.ChatLine.RuleAttr
nameWithType: ChatLine.RuleAttr
- uid: EchoHub.Client.UI.Chat.ChatLine.RuleLabel
name: RuleLabel
href: api/client/EchoHub.Client.UI.Chat.ChatLine.html#EchoHub_Client_UI_Chat_ChatLine_RuleLabel
commentId: P:EchoHub.Client.UI.Chat.ChatLine.RuleLabel
fullName: EchoHub.Client.UI.Chat.ChatLine.RuleLabel
nameWithType: ChatLine.RuleLabel
- uid: EchoHub.Client.UI.Chat.ChatLine.RuleLabel*
name: RuleLabel
href: api/client/EchoHub.Client.UI.Chat.ChatLine.html#EchoHub_Client_UI_Chat_ChatLine_RuleLabel_
commentId: Overload:EchoHub.Client.UI.Chat.ChatLine.RuleLabel
fullName: EchoHub.Client.UI.Chat.ChatLine.RuleLabel
nameWithType: ChatLine.RuleLabel
- uid: EchoHub.Client.UI.Chat.ChatLine.Segments
name: Segments
href: api/client/EchoHub.Client.UI.Chat.ChatLine.html#EchoHub_Client_UI_Chat_ChatLine_Segments
@@ -3811,6 +3958,12 @@ references:
commentId: Overload:EchoHub.Client.UI.Chat.ChatMessageManager.ClearUnread
fullName: EchoHub.Client.UI.Chat.ChatMessageManager.ClearUnread
nameWithType: ChatMessageManager.ClearUnread
- uid: EchoHub.Client.UI.Chat.ChatMessageManager.ContentIndentCols
name: ContentIndentCols
href: api/client/EchoHub.Client.UI.Chat.ChatMessageManager.html#EchoHub_Client_UI_Chat_ChatMessageManager_ContentIndentCols
commentId: F:EchoHub.Client.UI.Chat.ChatMessageManager.ContentIndentCols
fullName: EchoHub.Client.UI.Chat.ChatMessageManager.ContentIndentCols
nameWithType: ChatMessageManager.ContentIndentCols
- uid: EchoHub.Client.UI.Chat.ChatMessageManager.CurrentChannel
name: CurrentChannel
href: api/client/EchoHub.Client.UI.Chat.ChatMessageManager.html#EchoHub_Client_UI_Chat_ChatMessageManager_CurrentChannel
@@ -3871,27 +4024,57 @@ references:
commentId: E:EchoHub.Client.UI.Chat.ChatMessageManager.HistoryPrepended
fullName: EchoHub.Client.UI.Chat.ChatMessageManager.HistoryPrepended
nameWithType: ChatMessageManager.HistoryPrepended
- uid: EchoHub.Client.UI.Chat.ChatMessageManager.LoadHistory(System.String,System.Collections.Generic.List{EchoHub.Core.DTOs.MessageDto})
name: LoadHistory(string, List<MessageDto>)
href: api/client/EchoHub.Client.UI.Chat.ChatMessageManager.html#EchoHub_Client_UI_Chat_ChatMessageManager_LoadHistory_System_String_System_Collections_Generic_List_EchoHub_Core_DTOs_MessageDto__
commentId: M:EchoHub.Client.UI.Chat.ChatMessageManager.LoadHistory(System.String,System.Collections.Generic.List{EchoHub.Core.DTOs.MessageDto})
name.vb: LoadHistory(String, List(Of MessageDto))
fullName: EchoHub.Client.UI.Chat.ChatMessageManager.LoadHistory(string, System.Collections.Generic.List<EchoHub.Core.DTOs.MessageDto>)
fullName.vb: EchoHub.Client.UI.Chat.ChatMessageManager.LoadHistory(String, System.Collections.Generic.List(Of EchoHub.Core.DTOs.MessageDto))
nameWithType: ChatMessageManager.LoadHistory(string, List<MessageDto>)
nameWithType.vb: ChatMessageManager.LoadHistory(String, List(Of MessageDto))
- uid: EchoHub.Client.UI.Chat.ChatMessageManager.LastReadIds
name: LastReadIds
href: api/client/EchoHub.Client.UI.Chat.ChatMessageManager.html#EchoHub_Client_UI_Chat_ChatMessageManager_LastReadIds
commentId: P:EchoHub.Client.UI.Chat.ChatMessageManager.LastReadIds
fullName: EchoHub.Client.UI.Chat.ChatMessageManager.LastReadIds
nameWithType: ChatMessageManager.LastReadIds
- uid: EchoHub.Client.UI.Chat.ChatMessageManager.LastReadIds*
name: LastReadIds
href: api/client/EchoHub.Client.UI.Chat.ChatMessageManager.html#EchoHub_Client_UI_Chat_ChatMessageManager_LastReadIds_
commentId: Overload:EchoHub.Client.UI.Chat.ChatMessageManager.LastReadIds
fullName: EchoHub.Client.UI.Chat.ChatMessageManager.LastReadIds
nameWithType: ChatMessageManager.LastReadIds
- uid: EchoHub.Client.UI.Chat.ChatMessageManager.LoadHistory(System.String,System.Collections.Generic.List{EchoHub.Core.DTOs.MessageDto},System.Nullable{System.Guid})
name: LoadHistory(string, List<MessageDto>, Guid?)
href: api/client/EchoHub.Client.UI.Chat.ChatMessageManager.html#EchoHub_Client_UI_Chat_ChatMessageManager_LoadHistory_System_String_System_Collections_Generic_List_EchoHub_Core_DTOs_MessageDto__System_Nullable_System_Guid__
commentId: M:EchoHub.Client.UI.Chat.ChatMessageManager.LoadHistory(System.String,System.Collections.Generic.List{EchoHub.Core.DTOs.MessageDto},System.Nullable{System.Guid})
name.vb: LoadHistory(String, List(Of MessageDto), Guid?)
fullName: EchoHub.Client.UI.Chat.ChatMessageManager.LoadHistory(string, System.Collections.Generic.List<EchoHub.Core.DTOs.MessageDto>, System.Guid?)
fullName.vb: EchoHub.Client.UI.Chat.ChatMessageManager.LoadHistory(String, System.Collections.Generic.List(Of EchoHub.Core.DTOs.MessageDto), System.Guid?)
nameWithType: ChatMessageManager.LoadHistory(string, List<MessageDto>, Guid?)
nameWithType.vb: ChatMessageManager.LoadHistory(String, List(Of MessageDto), Guid?)
- uid: EchoHub.Client.UI.Chat.ChatMessageManager.LoadHistory*
name: LoadHistory
href: api/client/EchoHub.Client.UI.Chat.ChatMessageManager.html#EchoHub_Client_UI_Chat_ChatMessageManager_LoadHistory_
commentId: Overload:EchoHub.Client.UI.Chat.ChatMessageManager.LoadHistory
fullName: EchoHub.Client.UI.Chat.ChatMessageManager.LoadHistory
nameWithType: ChatMessageManager.LoadHistory
- uid: EchoHub.Client.UI.Chat.ChatMessageManager.MentionChannels
name: MentionChannels
href: api/client/EchoHub.Client.UI.Chat.ChatMessageManager.html#EchoHub_Client_UI_Chat_ChatMessageManager_MentionChannels
commentId: P:EchoHub.Client.UI.Chat.ChatMessageManager.MentionChannels
fullName: EchoHub.Client.UI.Chat.ChatMessageManager.MentionChannels
nameWithType: ChatMessageManager.MentionChannels
- uid: EchoHub.Client.UI.Chat.ChatMessageManager.MentionChannels*
name: MentionChannels
href: api/client/EchoHub.Client.UI.Chat.ChatMessageManager.html#EchoHub_Client_UI_Chat_ChatMessageManager_MentionChannels_
commentId: Overload:EchoHub.Client.UI.Chat.ChatMessageManager.MentionChannels
fullName: EchoHub.Client.UI.Chat.ChatMessageManager.MentionChannels
nameWithType: ChatMessageManager.MentionChannels
- uid: EchoHub.Client.UI.Chat.ChatMessageManager.MessagesChanged
name: MessagesChanged
href: api/client/EchoHub.Client.UI.Chat.ChatMessageManager.html#EchoHub_Client_UI_Chat_ChatMessageManager_MessagesChanged
commentId: E:EchoHub.Client.UI.Chat.ChatMessageManager.MessagesChanged
fullName: EchoHub.Client.UI.Chat.ChatMessageManager.MessagesChanged
nameWithType: ChatMessageManager.MessagesChanged
- uid: EchoHub.Client.UI.Chat.ChatMessageManager.NickColWidth
name: NickColWidth
href: api/client/EchoHub.Client.UI.Chat.ChatMessageManager.html#EchoHub_Client_UI_Chat_ChatMessageManager_NickColWidth
commentId: F:EchoHub.Client.UI.Chat.ChatMessageManager.NickColWidth
fullName: EchoHub.Client.UI.Chat.ChatMessageManager.NickColWidth
nameWithType: ChatMessageManager.NickColWidth
- uid: EchoHub.Client.UI.Chat.ChatMessageManager.PrependHistory(System.String,System.Collections.Generic.List{EchoHub.Core.DTOs.MessageDto})
name: PrependHistory(string, List<MessageDto>)
href: api/client/EchoHub.Client.UI.Chat.ChatMessageManager.html#EchoHub_Client_UI_Chat_ChatMessageManager_PrependHistory_System_String_System_Collections_Generic_List_EchoHub_Core_DTOs_MessageDto__
@@ -5557,69 +5740,6 @@ references:
commentId: Overload:EchoHub.Client.UI.Dialogs.UpdateConfirmDialog.Show
fullName: EchoHub.Client.UI.Dialogs.UpdateConfirmDialog.Show
nameWithType: UpdateConfirmDialog.Show
- uid: EchoHub.Client.UI.Dialogs.UpdateProgressDialog
name: UpdateProgressDialog
href: api/client/EchoHub.Client.UI.Dialogs.UpdateProgressDialog.html
commentId: T:EchoHub.Client.UI.Dialogs.UpdateProgressDialog
fullName: EchoHub.Client.UI.Dialogs.UpdateProgressDialog
nameWithType: UpdateProgressDialog
- uid: EchoHub.Client.UI.Dialogs.UpdateProgressDialog.#ctor(Terminal.Gui.App.IApplication,System.String)
name: UpdateProgressDialog(IApplication, string)
href: api/client/EchoHub.Client.UI.Dialogs.UpdateProgressDialog.html#EchoHub_Client_UI_Dialogs_UpdateProgressDialog__ctor_Terminal_Gui_App_IApplication_System_String_
commentId: M:EchoHub.Client.UI.Dialogs.UpdateProgressDialog.#ctor(Terminal.Gui.App.IApplication,System.String)
name.vb: New(IApplication, String)
fullName: EchoHub.Client.UI.Dialogs.UpdateProgressDialog.UpdateProgressDialog(Terminal.Gui.App.IApplication, string)
fullName.vb: EchoHub.Client.UI.Dialogs.UpdateProgressDialog.New(Terminal.Gui.App.IApplication, String)
nameWithType: UpdateProgressDialog.UpdateProgressDialog(IApplication, string)
nameWithType.vb: UpdateProgressDialog.New(IApplication, String)
- uid: EchoHub.Client.UI.Dialogs.UpdateProgressDialog.#ctor*
name: UpdateProgressDialog
href: api/client/EchoHub.Client.UI.Dialogs.UpdateProgressDialog.html#EchoHub_Client_UI_Dialogs_UpdateProgressDialog__ctor_
commentId: Overload:EchoHub.Client.UI.Dialogs.UpdateProgressDialog.#ctor
name.vb: New
fullName: EchoHub.Client.UI.Dialogs.UpdateProgressDialog.UpdateProgressDialog
fullName.vb: EchoHub.Client.UI.Dialogs.UpdateProgressDialog.New
nameWithType: UpdateProgressDialog.UpdateProgressDialog
nameWithType.vb: UpdateProgressDialog.New
- uid: EchoHub.Client.UI.Dialogs.UpdateProgressDialog.Close
name: Close()
href: api/client/EchoHub.Client.UI.Dialogs.UpdateProgressDialog.html#EchoHub_Client_UI_Dialogs_UpdateProgressDialog_Close
commentId: M:EchoHub.Client.UI.Dialogs.UpdateProgressDialog.Close
fullName: EchoHub.Client.UI.Dialogs.UpdateProgressDialog.Close()
nameWithType: UpdateProgressDialog.Close()
- uid: EchoHub.Client.UI.Dialogs.UpdateProgressDialog.Close*
name: Close
href: api/client/EchoHub.Client.UI.Dialogs.UpdateProgressDialog.html#EchoHub_Client_UI_Dialogs_UpdateProgressDialog_Close_
commentId: Overload:EchoHub.Client.UI.Dialogs.UpdateProgressDialog.Close
fullName: EchoHub.Client.UI.Dialogs.UpdateProgressDialog.Close
nameWithType: UpdateProgressDialog.Close
- uid: EchoHub.Client.UI.Dialogs.UpdateProgressDialog.Show
name: Show()
href: api/client/EchoHub.Client.UI.Dialogs.UpdateProgressDialog.html#EchoHub_Client_UI_Dialogs_UpdateProgressDialog_Show
commentId: M:EchoHub.Client.UI.Dialogs.UpdateProgressDialog.Show
fullName: EchoHub.Client.UI.Dialogs.UpdateProgressDialog.Show()
nameWithType: UpdateProgressDialog.Show()
- uid: EchoHub.Client.UI.Dialogs.UpdateProgressDialog.Show*
name: Show
href: api/client/EchoHub.Client.UI.Dialogs.UpdateProgressDialog.html#EchoHub_Client_UI_Dialogs_UpdateProgressDialog_Show_
commentId: Overload:EchoHub.Client.UI.Dialogs.UpdateProgressDialog.Show
fullName: EchoHub.Client.UI.Dialogs.UpdateProgressDialog.Show
nameWithType: UpdateProgressDialog.Show
- uid: EchoHub.Client.UI.Dialogs.UpdateProgressDialog.UpdateProgress(System.Single,System.String)
name: UpdateProgress(float, string)
href: api/client/EchoHub.Client.UI.Dialogs.UpdateProgressDialog.html#EchoHub_Client_UI_Dialogs_UpdateProgressDialog_UpdateProgress_System_Single_System_String_
commentId: M:EchoHub.Client.UI.Dialogs.UpdateProgressDialog.UpdateProgress(System.Single,System.String)
name.vb: UpdateProgress(Single, String)
fullName: EchoHub.Client.UI.Dialogs.UpdateProgressDialog.UpdateProgress(float, string)
fullName.vb: EchoHub.Client.UI.Dialogs.UpdateProgressDialog.UpdateProgress(Single, String)
nameWithType: UpdateProgressDialog.UpdateProgress(float, string)
nameWithType.vb: UpdateProgressDialog.UpdateProgress(Single, String)
- uid: EchoHub.Client.UI.Dialogs.UpdateProgressDialog.UpdateProgress*
name: UpdateProgress
href: api/client/EchoHub.Client.UI.Dialogs.UpdateProgressDialog.html#EchoHub_Client_UI_Dialogs_UpdateProgressDialog_UpdateProgress_
commentId: Overload:EchoHub.Client.UI.Dialogs.UpdateProgressDialog.UpdateProgress
fullName: EchoHub.Client.UI.Dialogs.UpdateProgressDialog.UpdateProgress
nameWithType: UpdateProgressDialog.UpdateProgress
- uid: EchoHub.Client.UI.Helpers
name: EchoHub.Client.UI.Helpers
href: api/client/EchoHub.Client.UI.Helpers.html
@@ -5719,6 +5839,42 @@ references:
commentId: Overload:EchoHub.Client.UI.Helpers.HexColorHelper.ParseHexToColor
fullName: EchoHub.Client.UI.Helpers.HexColorHelper.ParseHexToColor
nameWithType: HexColorHelper.ParseHexToColor
- uid: EchoHub.Client.UI.Helpers.NickColorHelper
name: NickColorHelper
href: api/client/EchoHub.Client.UI.Helpers.NickColorHelper.html
commentId: T:EchoHub.Client.UI.Helpers.NickColorHelper
fullName: EchoHub.Client.UI.Helpers.NickColorHelper
nameWithType: NickColorHelper
- uid: EchoHub.Client.UI.Helpers.NickColorHelper.GetAttribute(System.String)
name: GetAttribute(string)
href: api/client/EchoHub.Client.UI.Helpers.NickColorHelper.html#EchoHub_Client_UI_Helpers_NickColorHelper_GetAttribute_System_String_
commentId: M:EchoHub.Client.UI.Helpers.NickColorHelper.GetAttribute(System.String)
name.vb: GetAttribute(String)
fullName: EchoHub.Client.UI.Helpers.NickColorHelper.GetAttribute(string)
fullName.vb: EchoHub.Client.UI.Helpers.NickColorHelper.GetAttribute(String)
nameWithType: NickColorHelper.GetAttribute(string)
nameWithType.vb: NickColorHelper.GetAttribute(String)
- uid: EchoHub.Client.UI.Helpers.NickColorHelper.GetAttribute*
name: GetAttribute
href: api/client/EchoHub.Client.UI.Helpers.NickColorHelper.html#EchoHub_Client_UI_Helpers_NickColorHelper_GetAttribute_
commentId: Overload:EchoHub.Client.UI.Helpers.NickColorHelper.GetAttribute
fullName: EchoHub.Client.UI.Helpers.NickColorHelper.GetAttribute
nameWithType: NickColorHelper.GetAttribute
- uid: EchoHub.Client.UI.Helpers.NickColorHelper.GetPaletteIndex(System.String,System.Int32)
name: GetPaletteIndex(string, int)
href: api/client/EchoHub.Client.UI.Helpers.NickColorHelper.html#EchoHub_Client_UI_Helpers_NickColorHelper_GetPaletteIndex_System_String_System_Int32_
commentId: M:EchoHub.Client.UI.Helpers.NickColorHelper.GetPaletteIndex(System.String,System.Int32)
name.vb: GetPaletteIndex(String, Integer)
fullName: EchoHub.Client.UI.Helpers.NickColorHelper.GetPaletteIndex(string, int)
fullName.vb: EchoHub.Client.UI.Helpers.NickColorHelper.GetPaletteIndex(String, Integer)
nameWithType: NickColorHelper.GetPaletteIndex(string, int)
nameWithType.vb: NickColorHelper.GetPaletteIndex(String, Integer)
- uid: EchoHub.Client.UI.Helpers.NickColorHelper.GetPaletteIndex*
name: GetPaletteIndex
href: api/client/EchoHub.Client.UI.Helpers.NickColorHelper.html#EchoHub_Client_UI_Helpers_NickColorHelper_GetPaletteIndex_
commentId: Overload:EchoHub.Client.UI.Helpers.NickColorHelper.GetPaletteIndex
fullName: EchoHub.Client.UI.Helpers.NickColorHelper.GetPaletteIndex
nameWithType: NickColorHelper.GetPaletteIndex
- uid: EchoHub.Client.UI.ListSources
name: EchoHub.Client.UI.ListSources
href: api/client/EchoHub.Client.UI.ListSources.html
@@ -5860,15 +6016,15 @@ references:
commentId: Overload:EchoHub.Client.UI.ListSources.ChannelListSource.ToList
fullName: EchoHub.Client.UI.ListSources.ChannelListSource.ToList
nameWithType: ChannelListSource.ToList
- uid: EchoHub.Client.UI.ListSources.ChannelListSource.Update(System.Collections.Generic.List{System.String},System.Collections.Generic.Dictionary{System.String,System.Int32},System.String,System.Collections.Generic.IReadOnlySet{System.String})
name: Update(List<string>, Dictionary<string, int>, string, IReadOnlySet<string>?)
href: api/client/EchoHub.Client.UI.ListSources.ChannelListSource.html#EchoHub_Client_UI_ListSources_ChannelListSource_Update_System_Collections_Generic_List_System_String__System_Collections_Generic_Dictionary_System_String_System_Int32__System_String_System_Collections_Generic_IReadOnlySet_System_String__
commentId: M:EchoHub.Client.UI.ListSources.ChannelListSource.Update(System.Collections.Generic.List{System.String},System.Collections.Generic.Dictionary{System.String,System.Int32},System.String,System.Collections.Generic.IReadOnlySet{System.String})
name.vb: Update(List(Of String), Dictionary(Of String, Integer), String, IReadOnlySet(Of String))
fullName: EchoHub.Client.UI.ListSources.ChannelListSource.Update(System.Collections.Generic.List<string>, System.Collections.Generic.Dictionary<string, int>, string, System.Collections.Generic.IReadOnlySet<string>?)
fullName.vb: EchoHub.Client.UI.ListSources.ChannelListSource.Update(System.Collections.Generic.List(Of String), System.Collections.Generic.Dictionary(Of String, Integer), String, System.Collections.Generic.IReadOnlySet(Of String))
nameWithType: ChannelListSource.Update(List<string>, Dictionary<string, int>, string, IReadOnlySet<string>?)
nameWithType.vb: ChannelListSource.Update(List(Of String), Dictionary(Of String, Integer), String, IReadOnlySet(Of String))
- uid: EchoHub.Client.UI.ListSources.ChannelListSource.Update(System.Collections.Generic.List{System.String},System.Collections.Generic.Dictionary{System.String,System.Int32},System.String,System.Collections.Generic.IReadOnlySet{System.String},System.Collections.Generic.IReadOnlySet{System.String})
name: Update(List<string>, Dictionary<string, int>, string, IReadOnlySet<string>?, IReadOnlySet<string>?)
href: api/client/EchoHub.Client.UI.ListSources.ChannelListSource.html#EchoHub_Client_UI_ListSources_ChannelListSource_Update_System_Collections_Generic_List_System_String__System_Collections_Generic_Dictionary_System_String_System_Int32__System_String_System_Collections_Generic_IReadOnlySet_System_String__System_Collections_Generic_IReadOnlySet_System_String__
commentId: M:EchoHub.Client.UI.ListSources.ChannelListSource.Update(System.Collections.Generic.List{System.String},System.Collections.Generic.Dictionary{System.String,System.Int32},System.String,System.Collections.Generic.IReadOnlySet{System.String},System.Collections.Generic.IReadOnlySet{System.String})
name.vb: Update(List(Of String), Dictionary(Of String, Integer), String, IReadOnlySet(Of String), IReadOnlySet(Of String))
fullName: EchoHub.Client.UI.ListSources.ChannelListSource.Update(System.Collections.Generic.List<string>, System.Collections.Generic.Dictionary<string, int>, string, System.Collections.Generic.IReadOnlySet<string>?, System.Collections.Generic.IReadOnlySet<string>?)
fullName.vb: EchoHub.Client.UI.ListSources.ChannelListSource.Update(System.Collections.Generic.List(Of String), System.Collections.Generic.Dictionary(Of String, Integer), String, System.Collections.Generic.IReadOnlySet(Of String), System.Collections.Generic.IReadOnlySet(Of String))
nameWithType: ChannelListSource.Update(List<string>, Dictionary<string, int>, string, IReadOnlySet<string>?, IReadOnlySet<string>?)
nameWithType.vb: ChannelListSource.Update(List(Of String), Dictionary(Of String, Integer), String, IReadOnlySet(Of String), IReadOnlySet(Of String))
- uid: EchoHub.Client.UI.ListSources.ChannelListSource.Update*
name: Update
href: api/client/EchoHub.Client.UI.ListSources.ChannelListSource.html#EchoHub_Client_UI_ListSources_ChannelListSource_Update_
@@ -7141,6 +7297,21 @@ references:
commentId: Overload:EchoHub.Core.Contracts.IChannelService.GetChannelListAsync
fullName: EchoHub.Core.Contracts.IChannelService.GetChannelListAsync
nameWithType: IChannelService.GetChannelListAsync
- uid: EchoHub.Core.Contracts.IChannelService.GetChannelMetaAsync(System.String)
name: GetChannelMetaAsync(string)
href: api/core/EchoHub.Core.Contracts.IChannelService.html#EchoHub_Core_Contracts_IChannelService_GetChannelMetaAsync_System_String_
commentId: M:EchoHub.Core.Contracts.IChannelService.GetChannelMetaAsync(System.String)
name.vb: GetChannelMetaAsync(String)
fullName: EchoHub.Core.Contracts.IChannelService.GetChannelMetaAsync(string)
fullName.vb: EchoHub.Core.Contracts.IChannelService.GetChannelMetaAsync(String)
nameWithType: IChannelService.GetChannelMetaAsync(string)
nameWithType.vb: IChannelService.GetChannelMetaAsync(String)
- uid: EchoHub.Core.Contracts.IChannelService.GetChannelMetaAsync*
name: GetChannelMetaAsync
href: api/core/EchoHub.Core.Contracts.IChannelService.html#EchoHub_Core_Contracts_IChannelService_GetChannelMetaAsync_
commentId: Overload:EchoHub.Core.Contracts.IChannelService.GetChannelMetaAsync
fullName: EchoHub.Core.Contracts.IChannelService.GetChannelMetaAsync
nameWithType: IChannelService.GetChannelMetaAsync
- uid: EchoHub.Core.Contracts.IChannelService.GetChannelTopicAsync(System.String)
name: GetChannelTopicAsync(string)
href: api/core/EchoHub.Core.Contracts.IChannelService.html#EchoHub_Core_Contracts_IChannelService_GetChannelTopicAsync_System_String_
@@ -7726,6 +7897,12 @@ references:
commentId: T:EchoHub.Core.Contracts.IMessageEncryptionService
fullName: EchoHub.Core.Contracts.IMessageEncryptionService
nameWithType: IMessageEncryptionService
- uid: EchoHub.Core.Contracts.IMessageEncryptionService.CiphertextPrefix
name: CiphertextPrefix
href: api/core/EchoHub.Core.Contracts.IMessageEncryptionService.html#EchoHub_Core_Contracts_IMessageEncryptionService_CiphertextPrefix
commentId: F:EchoHub.Core.Contracts.IMessageEncryptionService.CiphertextPrefix
fullName: EchoHub.Core.Contracts.IMessageEncryptionService.CiphertextPrefix
nameWithType: IMessageEncryptionService.CiphertextPrefix
- uid: EchoHub.Core.Contracts.IMessageEncryptionService.Decrypt(System.String)
name: Decrypt(string)
href: api/core/EchoHub.Core.Contracts.IMessageEncryptionService.html#EchoHub_Core_Contracts_IMessageEncryptionService_Decrypt_System_String_
@@ -9532,6 +9709,270 @@ references:
commentId: F:EchoHub.Core.DTOs.ChannelError.ValidationFailed
fullName: EchoHub.Core.DTOs.ChannelError.ValidationFailed
nameWithType: ChannelError.ValidationFailed
- uid: EchoHub.Core.DTOs.ChannelMetaDto
name: ChannelMetaDto
href: api/core/EchoHub.Core.DTOs.ChannelMetaDto.html
commentId: T:EchoHub.Core.DTOs.ChannelMetaDto
fullName: EchoHub.Core.DTOs.ChannelMetaDto
nameWithType: ChannelMetaDto
- uid: EchoHub.Core.DTOs.ChannelMetaDto.#ctor(EchoHub.Core.DTOs.ChannelMetaDto)
name: ChannelMetaDto(ChannelMetaDto)
href: api/core/EchoHub.Core.DTOs.ChannelMetaDto.html#EchoHub_Core_DTOs_ChannelMetaDto__ctor_EchoHub_Core_DTOs_ChannelMetaDto_
commentId: M:EchoHub.Core.DTOs.ChannelMetaDto.#ctor(EchoHub.Core.DTOs.ChannelMetaDto)
name.vb: New(ChannelMetaDto)
fullName: EchoHub.Core.DTOs.ChannelMetaDto.ChannelMetaDto(EchoHub.Core.DTOs.ChannelMetaDto)
fullName.vb: EchoHub.Core.DTOs.ChannelMetaDto.New(EchoHub.Core.DTOs.ChannelMetaDto)
nameWithType: ChannelMetaDto.ChannelMetaDto(ChannelMetaDto)
nameWithType.vb: ChannelMetaDto.New(ChannelMetaDto)
- uid: EchoHub.Core.DTOs.ChannelMetaDto.#ctor(System.Guid,System.String,System.String,System.Boolean,System.Boolean,System.Int32,System.Int32,System.Int64,System.DateTimeOffset)
name: ChannelMetaDto(Guid, string, string?, bool, bool, int, int, long, DateTimeOffset)
href: api/core/EchoHub.Core.DTOs.ChannelMetaDto.html#EchoHub_Core_DTOs_ChannelMetaDto__ctor_System_Guid_System_String_System_String_System_Boolean_System_Boolean_System_Int32_System_Int32_System_Int64_System_DateTimeOffset_
commentId: M:EchoHub.Core.DTOs.ChannelMetaDto.#ctor(System.Guid,System.String,System.String,System.Boolean,System.Boolean,System.Int32,System.Int32,System.Int64,System.DateTimeOffset)
name.vb: New(Guid, String, String, Boolean, Boolean, Integer, Integer, Long, DateTimeOffset)
fullName: EchoHub.Core.DTOs.ChannelMetaDto.ChannelMetaDto(System.Guid, string, string?, bool, bool, int, int, long, System.DateTimeOffset)
fullName.vb: EchoHub.Core.DTOs.ChannelMetaDto.New(System.Guid, String, String, Boolean, Boolean, Integer, Integer, Long, System.DateTimeOffset)
nameWithType: ChannelMetaDto.ChannelMetaDto(Guid, string, string?, bool, bool, int, int, long, DateTimeOffset)
nameWithType.vb: ChannelMetaDto.New(Guid, String, String, Boolean, Boolean, Integer, Integer, Long, DateTimeOffset)
- uid: EchoHub.Core.DTOs.ChannelMetaDto.#ctor*
name: ChannelMetaDto
href: api/core/EchoHub.Core.DTOs.ChannelMetaDto.html#EchoHub_Core_DTOs_ChannelMetaDto__ctor_
commentId: Overload:EchoHub.Core.DTOs.ChannelMetaDto.#ctor
name.vb: New
fullName: EchoHub.Core.DTOs.ChannelMetaDto.ChannelMetaDto
fullName.vb: EchoHub.Core.DTOs.ChannelMetaDto.New
nameWithType: ChannelMetaDto.ChannelMetaDto
nameWithType.vb: ChannelMetaDto.New
- uid: EchoHub.Core.DTOs.ChannelMetaDto.CreatedAt
name: CreatedAt
href: api/core/EchoHub.Core.DTOs.ChannelMetaDto.html#EchoHub_Core_DTOs_ChannelMetaDto_CreatedAt
commentId: P:EchoHub.Core.DTOs.ChannelMetaDto.CreatedAt
fullName: EchoHub.Core.DTOs.ChannelMetaDto.CreatedAt
nameWithType: ChannelMetaDto.CreatedAt
- uid: EchoHub.Core.DTOs.ChannelMetaDto.CreatedAt*
name: CreatedAt
href: api/core/EchoHub.Core.DTOs.ChannelMetaDto.html#EchoHub_Core_DTOs_ChannelMetaDto_CreatedAt_
commentId: Overload:EchoHub.Core.DTOs.ChannelMetaDto.CreatedAt
fullName: EchoHub.Core.DTOs.ChannelMetaDto.CreatedAt
nameWithType: ChannelMetaDto.CreatedAt
- uid: EchoHub.Core.DTOs.ChannelMetaDto.Deconstruct(System.Guid@,System.String@,System.String@,System.Boolean@,System.Boolean@,System.Int32@,System.Int32@,System.Int64@,System.DateTimeOffset@)
name: Deconstruct(out Guid, out string, out string?, out bool, out bool, out int, out int, out long, out DateTimeOffset)
href: api/core/EchoHub.Core.DTOs.ChannelMetaDto.html#EchoHub_Core_DTOs_ChannelMetaDto_Deconstruct_System_Guid__System_String__System_String__System_Boolean__System_Boolean__System_Int32__System_Int32__System_Int64__System_DateTimeOffset__
commentId: M:EchoHub.Core.DTOs.ChannelMetaDto.Deconstruct(System.Guid@,System.String@,System.String@,System.Boolean@,System.Boolean@,System.Int32@,System.Int32@,System.Int64@,System.DateTimeOffset@)
name.vb: Deconstruct(Guid, String, String, Boolean, Boolean, Integer, Integer, Long, DateTimeOffset)
fullName: EchoHub.Core.DTOs.ChannelMetaDto.Deconstruct(out System.Guid, out string, out string?, out bool, out bool, out int, out int, out long, out System.DateTimeOffset)
fullName.vb: EchoHub.Core.DTOs.ChannelMetaDto.Deconstruct(System.Guid, String, String, Boolean, Boolean, Integer, Integer, Long, System.DateTimeOffset)
nameWithType: ChannelMetaDto.Deconstruct(out Guid, out string, out string?, out bool, out bool, out int, out int, out long, out DateTimeOffset)
nameWithType.vb: ChannelMetaDto.Deconstruct(Guid, String, String, Boolean, Boolean, Integer, Integer, Long, DateTimeOffset)
- uid: EchoHub.Core.DTOs.ChannelMetaDto.Deconstruct*
name: Deconstruct
href: api/core/EchoHub.Core.DTOs.ChannelMetaDto.html#EchoHub_Core_DTOs_ChannelMetaDto_Deconstruct_
commentId: Overload:EchoHub.Core.DTOs.ChannelMetaDto.Deconstruct
fullName: EchoHub.Core.DTOs.ChannelMetaDto.Deconstruct
nameWithType: ChannelMetaDto.Deconstruct
- uid: EchoHub.Core.DTOs.ChannelMetaDto.EqualityContract
name: EqualityContract
href: api/core/EchoHub.Core.DTOs.ChannelMetaDto.html#EchoHub_Core_DTOs_ChannelMetaDto_EqualityContract
commentId: P:EchoHub.Core.DTOs.ChannelMetaDto.EqualityContract
fullName: EchoHub.Core.DTOs.ChannelMetaDto.EqualityContract
nameWithType: ChannelMetaDto.EqualityContract
- uid: EchoHub.Core.DTOs.ChannelMetaDto.EqualityContract*
name: EqualityContract
href: api/core/EchoHub.Core.DTOs.ChannelMetaDto.html#EchoHub_Core_DTOs_ChannelMetaDto_EqualityContract_
commentId: Overload:EchoHub.Core.DTOs.ChannelMetaDto.EqualityContract
fullName: EchoHub.Core.DTOs.ChannelMetaDto.EqualityContract
nameWithType: ChannelMetaDto.EqualityContract
- uid: EchoHub.Core.DTOs.ChannelMetaDto.Equals(EchoHub.Core.DTOs.ChannelMetaDto)
name: Equals(ChannelMetaDto?)
href: api/core/EchoHub.Core.DTOs.ChannelMetaDto.html#EchoHub_Core_DTOs_ChannelMetaDto_Equals_EchoHub_Core_DTOs_ChannelMetaDto_
commentId: M:EchoHub.Core.DTOs.ChannelMetaDto.Equals(EchoHub.Core.DTOs.ChannelMetaDto)
name.vb: Equals(ChannelMetaDto)
fullName: EchoHub.Core.DTOs.ChannelMetaDto.Equals(EchoHub.Core.DTOs.ChannelMetaDto?)
fullName.vb: EchoHub.Core.DTOs.ChannelMetaDto.Equals(EchoHub.Core.DTOs.ChannelMetaDto)
nameWithType: ChannelMetaDto.Equals(ChannelMetaDto?)
nameWithType.vb: ChannelMetaDto.Equals(ChannelMetaDto)
- uid: EchoHub.Core.DTOs.ChannelMetaDto.Equals(System.Object)
name: Equals(object?)
href: api/core/EchoHub.Core.DTOs.ChannelMetaDto.html#EchoHub_Core_DTOs_ChannelMetaDto_Equals_System_Object_
commentId: M:EchoHub.Core.DTOs.ChannelMetaDto.Equals(System.Object)
name.vb: Equals(Object)
fullName: EchoHub.Core.DTOs.ChannelMetaDto.Equals(object?)
fullName.vb: EchoHub.Core.DTOs.ChannelMetaDto.Equals(Object)
nameWithType: ChannelMetaDto.Equals(object?)
nameWithType.vb: ChannelMetaDto.Equals(Object)
- uid: EchoHub.Core.DTOs.ChannelMetaDto.Equals*
name: Equals
href: api/core/EchoHub.Core.DTOs.ChannelMetaDto.html#EchoHub_Core_DTOs_ChannelMetaDto_Equals_
commentId: Overload:EchoHub.Core.DTOs.ChannelMetaDto.Equals
fullName: EchoHub.Core.DTOs.ChannelMetaDto.Equals
nameWithType: ChannelMetaDto.Equals
- uid: EchoHub.Core.DTOs.ChannelMetaDto.EstimatedSizeBytes
name: EstimatedSizeBytes
href: api/core/EchoHub.Core.DTOs.ChannelMetaDto.html#EchoHub_Core_DTOs_ChannelMetaDto_EstimatedSizeBytes
commentId: P:EchoHub.Core.DTOs.ChannelMetaDto.EstimatedSizeBytes
fullName: EchoHub.Core.DTOs.ChannelMetaDto.EstimatedSizeBytes
nameWithType: ChannelMetaDto.EstimatedSizeBytes
- uid: EchoHub.Core.DTOs.ChannelMetaDto.EstimatedSizeBytes*
name: EstimatedSizeBytes
href: api/core/EchoHub.Core.DTOs.ChannelMetaDto.html#EchoHub_Core_DTOs_ChannelMetaDto_EstimatedSizeBytes_
commentId: Overload:EchoHub.Core.DTOs.ChannelMetaDto.EstimatedSizeBytes
fullName: EchoHub.Core.DTOs.ChannelMetaDto.EstimatedSizeBytes
nameWithType: ChannelMetaDto.EstimatedSizeBytes
- uid: EchoHub.Core.DTOs.ChannelMetaDto.GetHashCode
name: GetHashCode()
href: api/core/EchoHub.Core.DTOs.ChannelMetaDto.html#EchoHub_Core_DTOs_ChannelMetaDto_GetHashCode
commentId: M:EchoHub.Core.DTOs.ChannelMetaDto.GetHashCode
fullName: EchoHub.Core.DTOs.ChannelMetaDto.GetHashCode()
nameWithType: ChannelMetaDto.GetHashCode()
- uid: EchoHub.Core.DTOs.ChannelMetaDto.GetHashCode*
name: GetHashCode
href: api/core/EchoHub.Core.DTOs.ChannelMetaDto.html#EchoHub_Core_DTOs_ChannelMetaDto_GetHashCode_
commentId: Overload:EchoHub.Core.DTOs.ChannelMetaDto.GetHashCode
fullName: EchoHub.Core.DTOs.ChannelMetaDto.GetHashCode
nameWithType: ChannelMetaDto.GetHashCode
- uid: EchoHub.Core.DTOs.ChannelMetaDto.Id
name: Id
href: api/core/EchoHub.Core.DTOs.ChannelMetaDto.html#EchoHub_Core_DTOs_ChannelMetaDto_Id
commentId: P:EchoHub.Core.DTOs.ChannelMetaDto.Id
fullName: EchoHub.Core.DTOs.ChannelMetaDto.Id
nameWithType: ChannelMetaDto.Id
- uid: EchoHub.Core.DTOs.ChannelMetaDto.Id*
name: Id
href: api/core/EchoHub.Core.DTOs.ChannelMetaDto.html#EchoHub_Core_DTOs_ChannelMetaDto_Id_
commentId: Overload:EchoHub.Core.DTOs.ChannelMetaDto.Id
fullName: EchoHub.Core.DTOs.ChannelMetaDto.Id
nameWithType: ChannelMetaDto.Id
- uid: EchoHub.Core.DTOs.ChannelMetaDto.IsEncrypted
name: IsEncrypted
href: api/core/EchoHub.Core.DTOs.ChannelMetaDto.html#EchoHub_Core_DTOs_ChannelMetaDto_IsEncrypted
commentId: P:EchoHub.Core.DTOs.ChannelMetaDto.IsEncrypted
fullName: EchoHub.Core.DTOs.ChannelMetaDto.IsEncrypted
nameWithType: ChannelMetaDto.IsEncrypted
- uid: EchoHub.Core.DTOs.ChannelMetaDto.IsEncrypted*
name: IsEncrypted
href: api/core/EchoHub.Core.DTOs.ChannelMetaDto.html#EchoHub_Core_DTOs_ChannelMetaDto_IsEncrypted_
commentId: Overload:EchoHub.Core.DTOs.ChannelMetaDto.IsEncrypted
fullName: EchoHub.Core.DTOs.ChannelMetaDto.IsEncrypted
nameWithType: ChannelMetaDto.IsEncrypted
- uid: EchoHub.Core.DTOs.ChannelMetaDto.IsProtected
name: IsProtected
href: api/core/EchoHub.Core.DTOs.ChannelMetaDto.html#EchoHub_Core_DTOs_ChannelMetaDto_IsProtected
commentId: P:EchoHub.Core.DTOs.ChannelMetaDto.IsProtected
fullName: EchoHub.Core.DTOs.ChannelMetaDto.IsProtected
nameWithType: ChannelMetaDto.IsProtected
- uid: EchoHub.Core.DTOs.ChannelMetaDto.IsProtected*
name: IsProtected
href: api/core/EchoHub.Core.DTOs.ChannelMetaDto.html#EchoHub_Core_DTOs_ChannelMetaDto_IsProtected_
commentId: Overload:EchoHub.Core.DTOs.ChannelMetaDto.IsProtected
fullName: EchoHub.Core.DTOs.ChannelMetaDto.IsProtected
nameWithType: ChannelMetaDto.IsProtected
- uid: EchoHub.Core.DTOs.ChannelMetaDto.MessageCount
name: MessageCount
href: api/core/EchoHub.Core.DTOs.ChannelMetaDto.html#EchoHub_Core_DTOs_ChannelMetaDto_MessageCount
commentId: P:EchoHub.Core.DTOs.ChannelMetaDto.MessageCount
fullName: EchoHub.Core.DTOs.ChannelMetaDto.MessageCount
nameWithType: ChannelMetaDto.MessageCount
- uid: EchoHub.Core.DTOs.ChannelMetaDto.MessageCount*
name: MessageCount
href: api/core/EchoHub.Core.DTOs.ChannelMetaDto.html#EchoHub_Core_DTOs_ChannelMetaDto_MessageCount_
commentId: Overload:EchoHub.Core.DTOs.ChannelMetaDto.MessageCount
fullName: EchoHub.Core.DTOs.ChannelMetaDto.MessageCount
nameWithType: ChannelMetaDto.MessageCount
- uid: EchoHub.Core.DTOs.ChannelMetaDto.Name
name: Name
href: api/core/EchoHub.Core.DTOs.ChannelMetaDto.html#EchoHub_Core_DTOs_ChannelMetaDto_Name
commentId: P:EchoHub.Core.DTOs.ChannelMetaDto.Name
fullName: EchoHub.Core.DTOs.ChannelMetaDto.Name
nameWithType: ChannelMetaDto.Name
- uid: EchoHub.Core.DTOs.ChannelMetaDto.Name*
name: Name
href: api/core/EchoHub.Core.DTOs.ChannelMetaDto.html#EchoHub_Core_DTOs_ChannelMetaDto_Name_
commentId: Overload:EchoHub.Core.DTOs.ChannelMetaDto.Name
fullName: EchoHub.Core.DTOs.ChannelMetaDto.Name
nameWithType: ChannelMetaDto.Name
- uid: EchoHub.Core.DTOs.ChannelMetaDto.PrintMembers(System.Text.StringBuilder)
name: PrintMembers(StringBuilder)
href: api/core/EchoHub.Core.DTOs.ChannelMetaDto.html#EchoHub_Core_DTOs_ChannelMetaDto_PrintMembers_System_Text_StringBuilder_
commentId: M:EchoHub.Core.DTOs.ChannelMetaDto.PrintMembers(System.Text.StringBuilder)
fullName: EchoHub.Core.DTOs.ChannelMetaDto.PrintMembers(System.Text.StringBuilder)
nameWithType: ChannelMetaDto.PrintMembers(StringBuilder)
- uid: EchoHub.Core.DTOs.ChannelMetaDto.PrintMembers*
name: PrintMembers
href: api/core/EchoHub.Core.DTOs.ChannelMetaDto.html#EchoHub_Core_DTOs_ChannelMetaDto_PrintMembers_
commentId: Overload:EchoHub.Core.DTOs.ChannelMetaDto.PrintMembers
fullName: EchoHub.Core.DTOs.ChannelMetaDto.PrintMembers
nameWithType: ChannelMetaDto.PrintMembers
- uid: EchoHub.Core.DTOs.ChannelMetaDto.ToString
name: ToString()
href: api/core/EchoHub.Core.DTOs.ChannelMetaDto.html#EchoHub_Core_DTOs_ChannelMetaDto_ToString
commentId: M:EchoHub.Core.DTOs.ChannelMetaDto.ToString
fullName: EchoHub.Core.DTOs.ChannelMetaDto.ToString()
nameWithType: ChannelMetaDto.ToString()
- uid: EchoHub.Core.DTOs.ChannelMetaDto.ToString*
name: ToString
href: api/core/EchoHub.Core.DTOs.ChannelMetaDto.html#EchoHub_Core_DTOs_ChannelMetaDto_ToString_
commentId: Overload:EchoHub.Core.DTOs.ChannelMetaDto.ToString
fullName: EchoHub.Core.DTOs.ChannelMetaDto.ToString
nameWithType: ChannelMetaDto.ToString
- uid: EchoHub.Core.DTOs.ChannelMetaDto.Topic
name: Topic
href: api/core/EchoHub.Core.DTOs.ChannelMetaDto.html#EchoHub_Core_DTOs_ChannelMetaDto_Topic
commentId: P:EchoHub.Core.DTOs.ChannelMetaDto.Topic
fullName: EchoHub.Core.DTOs.ChannelMetaDto.Topic
nameWithType: ChannelMetaDto.Topic
- uid: EchoHub.Core.DTOs.ChannelMetaDto.Topic*
name: Topic
href: api/core/EchoHub.Core.DTOs.ChannelMetaDto.html#EchoHub_Core_DTOs_ChannelMetaDto_Topic_
commentId: Overload:EchoHub.Core.DTOs.ChannelMetaDto.Topic
fullName: EchoHub.Core.DTOs.ChannelMetaDto.Topic
nameWithType: ChannelMetaDto.Topic
- uid: EchoHub.Core.DTOs.ChannelMetaDto.UniqueUserCount
name: UniqueUserCount
href: api/core/EchoHub.Core.DTOs.ChannelMetaDto.html#EchoHub_Core_DTOs_ChannelMetaDto_UniqueUserCount
commentId: P:EchoHub.Core.DTOs.ChannelMetaDto.UniqueUserCount
fullName: EchoHub.Core.DTOs.ChannelMetaDto.UniqueUserCount
nameWithType: ChannelMetaDto.UniqueUserCount
- uid: EchoHub.Core.DTOs.ChannelMetaDto.UniqueUserCount*
name: UniqueUserCount
href: api/core/EchoHub.Core.DTOs.ChannelMetaDto.html#EchoHub_Core_DTOs_ChannelMetaDto_UniqueUserCount_
commentId: Overload:EchoHub.Core.DTOs.ChannelMetaDto.UniqueUserCount
fullName: EchoHub.Core.DTOs.ChannelMetaDto.UniqueUserCount
nameWithType: ChannelMetaDto.UniqueUserCount
- uid: EchoHub.Core.DTOs.ChannelMetaDto.op_Equality(EchoHub.Core.DTOs.ChannelMetaDto,EchoHub.Core.DTOs.ChannelMetaDto)
name: operator ==(ChannelMetaDto?, ChannelMetaDto?)
href: api/core/EchoHub.Core.DTOs.ChannelMetaDto.html#EchoHub_Core_DTOs_ChannelMetaDto_op_Equality_EchoHub_Core_DTOs_ChannelMetaDto_EchoHub_Core_DTOs_ChannelMetaDto_
commentId: M:EchoHub.Core.DTOs.ChannelMetaDto.op_Equality(EchoHub.Core.DTOs.ChannelMetaDto,EchoHub.Core.DTOs.ChannelMetaDto)
name.vb: =(ChannelMetaDto, ChannelMetaDto)
fullName: EchoHub.Core.DTOs.ChannelMetaDto.operator ==(EchoHub.Core.DTOs.ChannelMetaDto?, EchoHub.Core.DTOs.ChannelMetaDto?)
fullName.vb: EchoHub.Core.DTOs.ChannelMetaDto.=(EchoHub.Core.DTOs.ChannelMetaDto, EchoHub.Core.DTOs.ChannelMetaDto)
nameWithType: ChannelMetaDto.operator ==(ChannelMetaDto?, ChannelMetaDto?)
nameWithType.vb: ChannelMetaDto.=(ChannelMetaDto, ChannelMetaDto)
- uid: EchoHub.Core.DTOs.ChannelMetaDto.op_Equality*
name: operator ==
href: api/core/EchoHub.Core.DTOs.ChannelMetaDto.html#EchoHub_Core_DTOs_ChannelMetaDto_op_Equality_
commentId: Overload:EchoHub.Core.DTOs.ChannelMetaDto.op_Equality
name.vb: =
fullName: EchoHub.Core.DTOs.ChannelMetaDto.operator ==
fullName.vb: EchoHub.Core.DTOs.ChannelMetaDto.=
nameWithType: ChannelMetaDto.operator ==
nameWithType.vb: ChannelMetaDto.=
- uid: EchoHub.Core.DTOs.ChannelMetaDto.op_Inequality(EchoHub.Core.DTOs.ChannelMetaDto,EchoHub.Core.DTOs.ChannelMetaDto)
name: operator !=(ChannelMetaDto?, ChannelMetaDto?)
href: api/core/EchoHub.Core.DTOs.ChannelMetaDto.html#EchoHub_Core_DTOs_ChannelMetaDto_op_Inequality_EchoHub_Core_DTOs_ChannelMetaDto_EchoHub_Core_DTOs_ChannelMetaDto_
commentId: M:EchoHub.Core.DTOs.ChannelMetaDto.op_Inequality(EchoHub.Core.DTOs.ChannelMetaDto,EchoHub.Core.DTOs.ChannelMetaDto)
name.vb: <>(ChannelMetaDto, ChannelMetaDto)
fullName: EchoHub.Core.DTOs.ChannelMetaDto.operator !=(EchoHub.Core.DTOs.ChannelMetaDto?, EchoHub.Core.DTOs.ChannelMetaDto?)
fullName.vb: EchoHub.Core.DTOs.ChannelMetaDto.<>(EchoHub.Core.DTOs.ChannelMetaDto, EchoHub.Core.DTOs.ChannelMetaDto)
nameWithType: ChannelMetaDto.operator !=(ChannelMetaDto?, ChannelMetaDto?)
nameWithType.vb: ChannelMetaDto.<>(ChannelMetaDto, ChannelMetaDto)
- uid: EchoHub.Core.DTOs.ChannelMetaDto.op_Inequality*
name: operator !=
href: api/core/EchoHub.Core.DTOs.ChannelMetaDto.html#EchoHub_Core_DTOs_ChannelMetaDto_op_Inequality_
commentId: Overload:EchoHub.Core.DTOs.ChannelMetaDto.op_Inequality
name.vb: <>
fullName: EchoHub.Core.DTOs.ChannelMetaDto.operator !=
fullName.vb: EchoHub.Core.DTOs.ChannelMetaDto.<>
nameWithType: ChannelMetaDto.operator !=
nameWithType.vb: ChannelMetaDto.<>
- uid: EchoHub.Core.DTOs.ChannelOperationResult
name: ChannelOperationResult
href: api/core/EchoHub.Core.DTOs.ChannelOperationResult.html
@@ -16168,6 +16609,168 @@ references:
commentId: F:EchoHub.Server.Auth.JwtTokenService.RefreshTokenLifetime
fullName: EchoHub.Server.Auth.JwtTokenService.RefreshTokenLifetime
nameWithType: JwtTokenService.RefreshTokenLifetime
- uid: EchoHub.Server.Config
name: EchoHub.Server.Config
href: api/server/EchoHub.Server.Config.html
commentId: N:EchoHub.Server.Config
fullName: EchoHub.Server.Config
nameWithType: EchoHub.Server.Config
- uid: EchoHub.Server.Config.UploadLimits
name: UploadLimits
href: api/server/EchoHub.Server.Config.UploadLimits.html
commentId: T:EchoHub.Server.Config.UploadLimits
fullName: EchoHub.Server.Config.UploadLimits
nameWithType: UploadLimits
- uid: EchoHub.Server.Config.UploadLimits.#ctor
name: UploadLimits()
href: api/server/EchoHub.Server.Config.UploadLimits.html#EchoHub_Server_Config_UploadLimits__ctor
commentId: M:EchoHub.Server.Config.UploadLimits.#ctor
name.vb: New()
fullName: EchoHub.Server.Config.UploadLimits.UploadLimits()
fullName.vb: EchoHub.Server.Config.UploadLimits.New()
nameWithType: UploadLimits.UploadLimits()
nameWithType.vb: UploadLimits.New()
- uid: EchoHub.Server.Config.UploadLimits.#ctor*
name: UploadLimits
href: api/server/EchoHub.Server.Config.UploadLimits.html#EchoHub_Server_Config_UploadLimits__ctor_
commentId: Overload:EchoHub.Server.Config.UploadLimits.#ctor
name.vb: New
fullName: EchoHub.Server.Config.UploadLimits.UploadLimits
fullName.vb: EchoHub.Server.Config.UploadLimits.New
nameWithType: UploadLimits.UploadLimits
nameWithType.vb: UploadLimits.New
- uid: EchoHub.Server.Config.UploadLimits.MaxAttachmentsPerMessage
name: MaxAttachmentsPerMessage
href: api/server/EchoHub.Server.Config.UploadLimits.html#EchoHub_Server_Config_UploadLimits_MaxAttachmentsPerMessage
commentId: P:EchoHub.Server.Config.UploadLimits.MaxAttachmentsPerMessage
fullName: EchoHub.Server.Config.UploadLimits.MaxAttachmentsPerMessage
nameWithType: UploadLimits.MaxAttachmentsPerMessage
- uid: EchoHub.Server.Config.UploadLimits.MaxAttachmentsPerMessage*
name: MaxAttachmentsPerMessage
href: api/server/EchoHub.Server.Config.UploadLimits.html#EchoHub_Server_Config_UploadLimits_MaxAttachmentsPerMessage_
commentId: Overload:EchoHub.Server.Config.UploadLimits.MaxAttachmentsPerMessage
fullName: EchoHub.Server.Config.UploadLimits.MaxAttachmentsPerMessage
nameWithType: UploadLimits.MaxAttachmentsPerMessage
- uid: EchoHub.Server.Config.UploadLimits.MaxAudioSizeBytes
name: MaxAudioSizeBytes
href: api/server/EchoHub.Server.Config.UploadLimits.html#EchoHub_Server_Config_UploadLimits_MaxAudioSizeBytes
commentId: P:EchoHub.Server.Config.UploadLimits.MaxAudioSizeBytes
fullName: EchoHub.Server.Config.UploadLimits.MaxAudioSizeBytes
nameWithType: UploadLimits.MaxAudioSizeBytes
- uid: EchoHub.Server.Config.UploadLimits.MaxAudioSizeBytes*
name: MaxAudioSizeBytes
href: api/server/EchoHub.Server.Config.UploadLimits.html#EchoHub_Server_Config_UploadLimits_MaxAudioSizeBytes_
commentId: Overload:EchoHub.Server.Config.UploadLimits.MaxAudioSizeBytes
fullName: EchoHub.Server.Config.UploadLimits.MaxAudioSizeBytes
nameWithType: UploadLimits.MaxAudioSizeBytes
- uid: EchoHub.Server.Config.UploadLimits.MaxAudioSizeMB
name: MaxAudioSizeMB
href: api/server/EchoHub.Server.Config.UploadLimits.html#EchoHub_Server_Config_UploadLimits_MaxAudioSizeMB
commentId: P:EchoHub.Server.Config.UploadLimits.MaxAudioSizeMB
fullName: EchoHub.Server.Config.UploadLimits.MaxAudioSizeMB
nameWithType: UploadLimits.MaxAudioSizeMB
- uid: EchoHub.Server.Config.UploadLimits.MaxAudioSizeMB*
name: MaxAudioSizeMB
href: api/server/EchoHub.Server.Config.UploadLimits.html#EchoHub_Server_Config_UploadLimits_MaxAudioSizeMB_
commentId: Overload:EchoHub.Server.Config.UploadLimits.MaxAudioSizeMB
fullName: EchoHub.Server.Config.UploadLimits.MaxAudioSizeMB
nameWithType: UploadLimits.MaxAudioSizeMB
- uid: EchoHub.Server.Config.UploadLimits.MaxAvatarSizeBytes
name: MaxAvatarSizeBytes
href: api/server/EchoHub.Server.Config.UploadLimits.html#EchoHub_Server_Config_UploadLimits_MaxAvatarSizeBytes
commentId: P:EchoHub.Server.Config.UploadLimits.MaxAvatarSizeBytes
fullName: EchoHub.Server.Config.UploadLimits.MaxAvatarSizeBytes
nameWithType: UploadLimits.MaxAvatarSizeBytes
- uid: EchoHub.Server.Config.UploadLimits.MaxAvatarSizeBytes*
name: MaxAvatarSizeBytes
href: api/server/EchoHub.Server.Config.UploadLimits.html#EchoHub_Server_Config_UploadLimits_MaxAvatarSizeBytes_
commentId: Overload:EchoHub.Server.Config.UploadLimits.MaxAvatarSizeBytes
fullName: EchoHub.Server.Config.UploadLimits.MaxAvatarSizeBytes
nameWithType: UploadLimits.MaxAvatarSizeBytes
- uid: EchoHub.Server.Config.UploadLimits.MaxAvatarSizeMB
name: MaxAvatarSizeMB
href: api/server/EchoHub.Server.Config.UploadLimits.html#EchoHub_Server_Config_UploadLimits_MaxAvatarSizeMB
commentId: P:EchoHub.Server.Config.UploadLimits.MaxAvatarSizeMB
fullName: EchoHub.Server.Config.UploadLimits.MaxAvatarSizeMB
nameWithType: UploadLimits.MaxAvatarSizeMB
- uid: EchoHub.Server.Config.UploadLimits.MaxAvatarSizeMB*
name: MaxAvatarSizeMB
href: api/server/EchoHub.Server.Config.UploadLimits.html#EchoHub_Server_Config_UploadLimits_MaxAvatarSizeMB_
commentId: Overload:EchoHub.Server.Config.UploadLimits.MaxAvatarSizeMB
fullName: EchoHub.Server.Config.UploadLimits.MaxAvatarSizeMB
nameWithType: UploadLimits.MaxAvatarSizeMB
- uid: EchoHub.Server.Config.UploadLimits.MaxFileSizeBytes
name: MaxFileSizeBytes
href: api/server/EchoHub.Server.Config.UploadLimits.html#EchoHub_Server_Config_UploadLimits_MaxFileSizeBytes
commentId: P:EchoHub.Server.Config.UploadLimits.MaxFileSizeBytes
fullName: EchoHub.Server.Config.UploadLimits.MaxFileSizeBytes
nameWithType: UploadLimits.MaxFileSizeBytes
- uid: EchoHub.Server.Config.UploadLimits.MaxFileSizeBytes*
name: MaxFileSizeBytes
href: api/server/EchoHub.Server.Config.UploadLimits.html#EchoHub_Server_Config_UploadLimits_MaxFileSizeBytes_
commentId: Overload:EchoHub.Server.Config.UploadLimits.MaxFileSizeBytes
fullName: EchoHub.Server.Config.UploadLimits.MaxFileSizeBytes
nameWithType: UploadLimits.MaxFileSizeBytes
- uid: EchoHub.Server.Config.UploadLimits.MaxFileSizeMB
name: MaxFileSizeMB
href: api/server/EchoHub.Server.Config.UploadLimits.html#EchoHub_Server_Config_UploadLimits_MaxFileSizeMB
commentId: P:EchoHub.Server.Config.UploadLimits.MaxFileSizeMB
fullName: EchoHub.Server.Config.UploadLimits.MaxFileSizeMB
nameWithType: UploadLimits.MaxFileSizeMB
- uid: EchoHub.Server.Config.UploadLimits.MaxFileSizeMB*
name: MaxFileSizeMB
href: api/server/EchoHub.Server.Config.UploadLimits.html#EchoHub_Server_Config_UploadLimits_MaxFileSizeMB_
commentId: Overload:EchoHub.Server.Config.UploadLimits.MaxFileSizeMB
fullName: EchoHub.Server.Config.UploadLimits.MaxFileSizeMB
nameWithType: UploadLimits.MaxFileSizeMB
- uid: EchoHub.Server.Config.UploadLimits.MaxForKind(EchoHub.Core.Models.AttachmentKind)
name: MaxForKind(AttachmentKind)
href: api/server/EchoHub.Server.Config.UploadLimits.html#EchoHub_Server_Config_UploadLimits_MaxForKind_EchoHub_Core_Models_AttachmentKind_
commentId: M:EchoHub.Server.Config.UploadLimits.MaxForKind(EchoHub.Core.Models.AttachmentKind)
fullName: EchoHub.Server.Config.UploadLimits.MaxForKind(EchoHub.Core.Models.AttachmentKind)
nameWithType: UploadLimits.MaxForKind(AttachmentKind)
- uid: EchoHub.Server.Config.UploadLimits.MaxForKind*
name: MaxForKind
href: api/server/EchoHub.Server.Config.UploadLimits.html#EchoHub_Server_Config_UploadLimits_MaxForKind_
commentId: Overload:EchoHub.Server.Config.UploadLimits.MaxForKind
fullName: EchoHub.Server.Config.UploadLimits.MaxForKind
nameWithType: UploadLimits.MaxForKind
- uid: EchoHub.Server.Config.UploadLimits.MaxImageSizeBytes
name: MaxImageSizeBytes
href: api/server/EchoHub.Server.Config.UploadLimits.html#EchoHub_Server_Config_UploadLimits_MaxImageSizeBytes
commentId: P:EchoHub.Server.Config.UploadLimits.MaxImageSizeBytes
fullName: EchoHub.Server.Config.UploadLimits.MaxImageSizeBytes
nameWithType: UploadLimits.MaxImageSizeBytes
- uid: EchoHub.Server.Config.UploadLimits.MaxImageSizeBytes*
name: MaxImageSizeBytes
href: api/server/EchoHub.Server.Config.UploadLimits.html#EchoHub_Server_Config_UploadLimits_MaxImageSizeBytes_
commentId: Overload:EchoHub.Server.Config.UploadLimits.MaxImageSizeBytes
fullName: EchoHub.Server.Config.UploadLimits.MaxImageSizeBytes
nameWithType: UploadLimits.MaxImageSizeBytes
- uid: EchoHub.Server.Config.UploadLimits.MaxImageSizeMB
name: MaxImageSizeMB
href: api/server/EchoHub.Server.Config.UploadLimits.html#EchoHub_Server_Config_UploadLimits_MaxImageSizeMB
commentId: P:EchoHub.Server.Config.UploadLimits.MaxImageSizeMB
fullName: EchoHub.Server.Config.UploadLimits.MaxImageSizeMB
nameWithType: UploadLimits.MaxImageSizeMB
- uid: EchoHub.Server.Config.UploadLimits.MaxImageSizeMB*
name: MaxImageSizeMB
href: api/server/EchoHub.Server.Config.UploadLimits.html#EchoHub_Server_Config_UploadLimits_MaxImageSizeMB_
commentId: Overload:EchoHub.Server.Config.UploadLimits.MaxImageSizeMB
fullName: EchoHub.Server.Config.UploadLimits.MaxImageSizeMB
nameWithType: UploadLimits.MaxImageSizeMB
- uid: EchoHub.Server.Config.UploadLimits.MaxRequestBodyBytes
name: MaxRequestBodyBytes
href: api/server/EchoHub.Server.Config.UploadLimits.html#EchoHub_Server_Config_UploadLimits_MaxRequestBodyBytes
commentId: P:EchoHub.Server.Config.UploadLimits.MaxRequestBodyBytes
fullName: EchoHub.Server.Config.UploadLimits.MaxRequestBodyBytes
nameWithType: UploadLimits.MaxRequestBodyBytes
- uid: EchoHub.Server.Config.UploadLimits.MaxRequestBodyBytes*
name: MaxRequestBodyBytes
href: api/server/EchoHub.Server.Config.UploadLimits.html#EchoHub_Server_Config_UploadLimits_MaxRequestBodyBytes_
commentId: Overload:EchoHub.Server.Config.UploadLimits.MaxRequestBodyBytes
fullName: EchoHub.Server.Config.UploadLimits.MaxRequestBodyBytes
nameWithType: UploadLimits.MaxRequestBodyBytes
- uid: EchoHub.Server.Controllers
name: EchoHub.Server.Controllers
href: api/server/EchoHub.Server.Controllers.html
@@ -16252,15 +16855,15 @@ references:
commentId: T:EchoHub.Server.Controllers.ChannelsController
fullName: EchoHub.Server.Controllers.ChannelsController
nameWithType: ChannelsController
- 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)
name: ChannelsController(IChannelService, EchoHubDbContext, FileStorageService, ImageToAsciiService, IHttpClientFactory, IChatService, IMessageEncryptionService)
href: api/server/EchoHub.Server.Controllers.ChannelsController.html#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_
commentId: M: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)
name.vb: New(IChannelService, EchoHubDbContext, FileStorageService, ImageToAsciiService, IHttpClientFactory, IChatService, IMessageEncryptionService)
fullName: EchoHub.Server.Controllers.ChannelsController.ChannelsController(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)
fullName.vb: EchoHub.Server.Controllers.ChannelsController.New(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)
nameWithType: ChannelsController.ChannelsController(IChannelService, EchoHubDbContext, FileStorageService, ImageToAsciiService, IHttpClientFactory, IChatService, IMessageEncryptionService)
nameWithType.vb: ChannelsController.New(IChannelService, EchoHubDbContext, FileStorageService, ImageToAsciiService, IHttpClientFactory, IChatService, IMessageEncryptionService)
- 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)
name: ChannelsController(IChannelService, EchoHubDbContext, FileStorageService, ImageToAsciiService, IHttpClientFactory, IChatService, IMessageEncryptionService, UploadLimits)
href: api/server/EchoHub.Server.Controllers.ChannelsController.html#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_
commentId: M: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)
name.vb: New(IChannelService, EchoHubDbContext, FileStorageService, ImageToAsciiService, IHttpClientFactory, IChatService, IMessageEncryptionService, UploadLimits)
fullName: EchoHub.Server.Controllers.ChannelsController.ChannelsController(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)
fullName.vb: EchoHub.Server.Controllers.ChannelsController.New(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)
nameWithType: ChannelsController.ChannelsController(IChannelService, EchoHubDbContext, FileStorageService, ImageToAsciiService, IHttpClientFactory, IChatService, IMessageEncryptionService, UploadLimits)
nameWithType.vb: ChannelsController.New(IChannelService, EchoHubDbContext, FileStorageService, ImageToAsciiService, IHttpClientFactory, IChatService, IMessageEncryptionService, UploadLimits)
- uid: EchoHub.Server.Controllers.ChannelsController.#ctor*
name: ChannelsController
href: api/server/EchoHub.Server.Controllers.ChannelsController.html#EchoHub_Server_Controllers_ChannelsController__ctor_
@@ -16312,6 +16915,21 @@ references:
commentId: Overload:EchoHub.Server.Controllers.ChannelsController.GetChannelCrypto
fullName: EchoHub.Server.Controllers.ChannelsController.GetChannelCrypto
nameWithType: ChannelsController.GetChannelCrypto
- uid: EchoHub.Server.Controllers.ChannelsController.GetChannelMeta(System.String)
name: GetChannelMeta(string)
href: api/server/EchoHub.Server.Controllers.ChannelsController.html#EchoHub_Server_Controllers_ChannelsController_GetChannelMeta_System_String_
commentId: M:EchoHub.Server.Controllers.ChannelsController.GetChannelMeta(System.String)
name.vb: GetChannelMeta(String)
fullName: EchoHub.Server.Controllers.ChannelsController.GetChannelMeta(string)
fullName.vb: EchoHub.Server.Controllers.ChannelsController.GetChannelMeta(String)
nameWithType: ChannelsController.GetChannelMeta(string)
nameWithType.vb: ChannelsController.GetChannelMeta(String)
- uid: EchoHub.Server.Controllers.ChannelsController.GetChannelMeta*
name: GetChannelMeta
href: api/server/EchoHub.Server.Controllers.ChannelsController.html#EchoHub_Server_Controllers_ChannelsController_GetChannelMeta_
commentId: Overload:EchoHub.Server.Controllers.ChannelsController.GetChannelMeta
fullName: EchoHub.Server.Controllers.ChannelsController.GetChannelMeta
nameWithType: ChannelsController.GetChannelMeta
- uid: EchoHub.Server.Controllers.ChannelsController.GetChannels(System.Int32,System.Int32)
name: GetChannels(int, int)
href: api/server/EchoHub.Server.Controllers.ChannelsController.html#EchoHub_Server_Controllers_ChannelsController_GetChannels_System_Int32_System_Int32_
@@ -16630,15 +17248,15 @@ references:
commentId: T:EchoHub.Server.Controllers.UsersController
fullName: EchoHub.Server.Controllers.UsersController
nameWithType: UsersController
- uid: EchoHub.Server.Controllers.UsersController.#ctor(EchoHub.Core.Contracts.IUserService,EchoHub.Core.Services.ImageToAsciiService)
name: UsersController(IUserService, ImageToAsciiService)
href: api/server/EchoHub.Server.Controllers.UsersController.html#EchoHub_Server_Controllers_UsersController__ctor_EchoHub_Core_Contracts_IUserService_EchoHub_Core_Services_ImageToAsciiService_
commentId: M:EchoHub.Server.Controllers.UsersController.#ctor(EchoHub.Core.Contracts.IUserService,EchoHub.Core.Services.ImageToAsciiService)
name.vb: New(IUserService, ImageToAsciiService)
fullName: EchoHub.Server.Controllers.UsersController.UsersController(EchoHub.Core.Contracts.IUserService, EchoHub.Core.Services.ImageToAsciiService)
fullName.vb: EchoHub.Server.Controllers.UsersController.New(EchoHub.Core.Contracts.IUserService, EchoHub.Core.Services.ImageToAsciiService)
nameWithType: UsersController.UsersController(IUserService, ImageToAsciiService)
nameWithType.vb: UsersController.New(IUserService, ImageToAsciiService)
- uid: EchoHub.Server.Controllers.UsersController.#ctor(EchoHub.Core.Contracts.IUserService,EchoHub.Core.Services.ImageToAsciiService,EchoHub.Server.Config.UploadLimits)
name: UsersController(IUserService, ImageToAsciiService, UploadLimits)
href: api/server/EchoHub.Server.Controllers.UsersController.html#EchoHub_Server_Controllers_UsersController__ctor_EchoHub_Core_Contracts_IUserService_EchoHub_Core_Services_ImageToAsciiService_EchoHub_Server_Config_UploadLimits_
commentId: M:EchoHub.Server.Controllers.UsersController.#ctor(EchoHub.Core.Contracts.IUserService,EchoHub.Core.Services.ImageToAsciiService,EchoHub.Server.Config.UploadLimits)
name.vb: New(IUserService, ImageToAsciiService, UploadLimits)
fullName: EchoHub.Server.Controllers.UsersController.UsersController(EchoHub.Core.Contracts.IUserService, EchoHub.Core.Services.ImageToAsciiService, EchoHub.Server.Config.UploadLimits)
fullName.vb: EchoHub.Server.Controllers.UsersController.New(EchoHub.Core.Contracts.IUserService, EchoHub.Core.Services.ImageToAsciiService, EchoHub.Server.Config.UploadLimits)
nameWithType: UsersController.UsersController(IUserService, ImageToAsciiService, UploadLimits)
nameWithType.vb: UsersController.New(IUserService, ImageToAsciiService, UploadLimits)
- uid: EchoHub.Server.Controllers.UsersController.#ctor*
name: UsersController
href: api/server/EchoHub.Server.Controllers.UsersController.html#EchoHub_Server_Controllers_UsersController__ctor_
@@ -18883,6 +19501,21 @@ references:
commentId: Overload:EchoHub.Server.Services.ChannelService.GetChannelListAsync
fullName: EchoHub.Server.Services.ChannelService.GetChannelListAsync
nameWithType: ChannelService.GetChannelListAsync
- uid: EchoHub.Server.Services.ChannelService.GetChannelMetaAsync(System.String)
name: GetChannelMetaAsync(string)
href: api/server/EchoHub.Server.Services.ChannelService.html#EchoHub_Server_Services_ChannelService_GetChannelMetaAsync_System_String_
commentId: M:EchoHub.Server.Services.ChannelService.GetChannelMetaAsync(System.String)
name.vb: GetChannelMetaAsync(String)
fullName: EchoHub.Server.Services.ChannelService.GetChannelMetaAsync(string)
fullName.vb: EchoHub.Server.Services.ChannelService.GetChannelMetaAsync(String)
nameWithType: ChannelService.GetChannelMetaAsync(string)
nameWithType.vb: ChannelService.GetChannelMetaAsync(String)
- uid: EchoHub.Server.Services.ChannelService.GetChannelMetaAsync*
name: GetChannelMetaAsync
href: api/server/EchoHub.Server.Services.ChannelService.html#EchoHub_Server_Services_ChannelService_GetChannelMetaAsync_
commentId: Overload:EchoHub.Server.Services.ChannelService.GetChannelMetaAsync
fullName: EchoHub.Server.Services.ChannelService.GetChannelMetaAsync
nameWithType: ChannelService.GetChannelMetaAsync
- uid: EchoHub.Server.Services.ChannelService.GetChannelTopicAsync(System.String)
name: GetChannelTopicAsync(string)
href: api/server/EchoHub.Server.Services.ChannelService.html#EchoHub_Server_Services_ChannelService_GetChannelTopicAsync_System_String_