From 54935aa8b5efbb073275db838368682417d5a9cf Mon Sep 17 00:00:00 2001 From: HueByte Date: Mon, 20 Apr 2026 15:46:39 +0000 Subject: [PATCH] deploy: a4fe432992c246ed8190ffa349597bc985c740bd --- ...Hub.Client.Services.EchoHubConnection.html | 8 +- ...Hub.Client.UI.Chat.ChatMessageManager.html | 66 ++ ...choHub.Client.UI.Dialogs.SearchDialog.html | 219 ++++++ ...choHub.Client.UI.Dialogs.SearchResult.html | 660 ++++++++++++++++++ ...ub.Client.UI.Dialogs.SearchResultType.html | 153 ++++ api/client/EchoHub.Client.UI.Dialogs.html | 13 + ...lient.UI.ListSources.SearchListSource.html | 591 ++++++++++++++++ api/client/EchoHub.Client.UI.ListSources.html | 5 + api/client/EchoHub.Client.UI.MainWindow.html | 62 ++ ...ub.Core.Constants.ValidationConstants.html | 2 +- .../EchoHub.Core.Contracts.IChatService.html | 8 +- api/server/EchoHub.Server.Hubs.ChatHub.html | 8 +- .../EchoHub.Server.Services.ChatService.html | 8 +- api/toc.html | 12 + api/toc.json | 2 +- articles/getting-started.html | 2 +- changelog/index.html | 3 +- changelog/toc.html | 3 + changelog/toc.json | 2 +- changelog/v0.2.10.html | 136 ++++ changelog/v0.2.9.html | 18 + index.json | 51 +- manifest.json | 66 ++ todo.html | 2 +- xrefmap.yml | 501 ++++++++++++- 25 files changed, 2534 insertions(+), 67 deletions(-) create mode 100644 api/client/EchoHub.Client.UI.Dialogs.SearchDialog.html create mode 100644 api/client/EchoHub.Client.UI.Dialogs.SearchResult.html create mode 100644 api/client/EchoHub.Client.UI.Dialogs.SearchResultType.html create mode 100644 api/client/EchoHub.Client.UI.ListSources.SearchListSource.html create mode 100644 changelog/v0.2.10.html diff --git a/api/client/EchoHub.Client.Services.EchoHubConnection.html b/api/client/EchoHub.Client.Services.EchoHubConnection.html index 0e8f88c..3e1c01c 100644 --- a/api/client/EchoHub.Client.Services.EchoHubConnection.html +++ b/api/client/EchoHub.Client.Services.EchoHubConnection.html @@ -324,8 +324,8 @@ Class EchoHubConnection -

- GetHistoryAsync(string, int) +

+ GetHistoryAsync(string, int, int)

@@ -333,7 +333,7 @@ Class EchoHubConnection
-
public Task<List<MessageDto>> GetHistoryAsync(string channelName, int count = 100)
+
public Task<List<MessageDto>> GetHistoryAsync(string channelName, int count = 100, int offset = 0)

Parameters

@@ -342,6 +342,8 @@ Class EchoHubConnection
int
+
offset int
+

Returns

diff --git a/api/client/EchoHub.Client.UI.Chat.ChatMessageManager.html b/api/client/EchoHub.Client.UI.Chat.ChatMessageManager.html index bd60cc3..a266eb2 100644 --- a/api/client/EchoHub.Client.UI.Chat.ChatMessageManager.html +++ b/api/client/EchoHub.Client.UI.Chat.ChatMessageManager.html @@ -547,6 +547,41 @@ so the UI layer can refresh.

+ + +

+ PrependHistory(string, List<MessageDto>) + +

+ +

Prepend older messages at the front of a channel's buffer, skipping any that are already present. +Fires HistoryPrepended when new lines are actually inserted.

+
+
+ +
+
public void PrependHistory(string channelName, List<MessageDto> olderMessages)
+
+ +

Parameters

+
+
channelName string
+
+
olderMessages List<MessageDto>
+
+
+ + + + + + + + + + + +

@@ -648,6 +683,37 @@ so the UI layer can refresh.

+

+ HistoryPrepended + +

+ +

Fired after older messages are prepended to a channel's buffer. Parameter is the channel name.

+
+
+ +
+
public event Action<string>? HistoryPrepended
+
+ + + + + + +

Event Type

+
+
Action<string>
+
+
+ + + + + + + +

MessagesChanged diff --git a/api/client/EchoHub.Client.UI.Dialogs.SearchDialog.html b/api/client/EchoHub.Client.UI.Dialogs.SearchDialog.html new file mode 100644 index 0000000..6782710 --- /dev/null +++ b/api/client/EchoHub.Client.UI.Dialogs.SearchDialog.html @@ -0,0 +1,219 @@ + + + + + Class SearchDialog | EchoHub Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+
Table of Contents
+ +
+
+ +
+
+
+ +
+
+ + + +
+ +
+ + + +

+Class SearchDialog +

+ +
+
Namespace
EchoHub.Client.UI.Dialogs
+
Assembly
EchoHub.Client.dll
+
+ +

Command-palette style search dialog (Ctrl+K) for navigating channels and triggering app actions.

+
+
+ +
+
public static class SearchDialog
+
+ + + + +
+
Inheritance
+
+ +
SearchDialog
+
+
+ + + +
+
Inherited Members
+
+ + + + + + + +
+ + + + + + +

Methods +

+ + + + +

+ Show(IApplication, IReadOnlyList<string>) + +

+ +
+
+ +
+
public static SearchResult? Show(IApplication app, IReadOnlyList<string> channels)
+
+ +

Parameters

+
+
app IApplication
+
+
channels IReadOnlyList<string>
+
+
+ +

Returns

+
+
SearchResult
+
+
+ + + + + + + + + + + + +
+ + + + +
+ +
+ +
+
+ +
+ + + + diff --git a/api/client/EchoHub.Client.UI.Dialogs.SearchResult.html b/api/client/EchoHub.Client.UI.Dialogs.SearchResult.html new file mode 100644 index 0000000..ee8c956 --- /dev/null +++ b/api/client/EchoHub.Client.UI.Dialogs.SearchResult.html @@ -0,0 +1,660 @@ + + + + + Class SearchResult | EchoHub Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+
Table of Contents
+ +
+
+ +
+
+
+ +
+
+ + + +
+ +
+ + + +

+Class SearchResult +

+ +
+
Namespace
EchoHub.Client.UI.Dialogs
+
Assembly
EchoHub.Client.dll
+
+ +
+
+ +
+
public record SearchResult : IEquatable<SearchResult>
+
+ + + + +
+
Inheritance
+
+ +
SearchResult
+
+
+ +
+
Implements
+
+ +
+
+ + +
+
Inherited Members
+
+ + + + +
+ + + + + + +

Constructors +

+ + + + +

+ SearchResult(SearchResult) + +

+ +
+
+ +
+
protected SearchResult(SearchResult original)
+
+ +

Parameters

+
+
original SearchResult
+
+
+ + + + + + + + + + + + + + +

+ SearchResult(SearchResultType, string, string) + +

+ +
+
+ +
+
public SearchResult(SearchResultType Type, string Key, string Label)
+
+ +

Parameters

+
+
Type SearchResultType
+
+
Key string
+
+
Label string
+
+
+ + + + + + + + + + + + +

Properties +

+ + + + +

+ EqualityContract + +

+ +
+
+ +
+
protected virtual Type EqualityContract { get; }
+
+ + + + + +

Property Value

+
+
Type
+
+
+ + + + + + + + + + +

+ Key + +

+ +
+
+ +
+
public string Key { get; init; }
+
+ + + + + +

Property Value

+
+
string
+
+
+ + + + + + + + + + +

+ Label + +

+ +
+
+ +
+
public string Label { get; init; }
+
+ + + + + +

Property Value

+
+
string
+
+
+ + + + + + + + + + +

+ Type + +

+ +
+
+ +
+
public SearchResultType Type { get; init; }
+
+ + + + + +

Property Value

+
+
SearchResultType
+
+
+ + + + + + + + +

Methods +

+ + + + +

+ Deconstruct(out SearchResultType, out string, out string) + +

+ +
+
+ +
+
public void Deconstruct(out SearchResultType Type, out string Key, out string Label)
+
+ +

Parameters

+
+
Type SearchResultType
+
+
Key string
+
+
Label string
+
+
+ + + + + + + + + + + + + + +

+ Equals(SearchResult?) + +

+ +
+
+ +
+
public virtual bool Equals(SearchResult? other)
+
+ +

Parameters

+
+
other SearchResult
+
+
+ +

Returns

+
+
bool
+
+
+ + + + + + + + + + + + + +

+ Equals(object?) + +

+ +
+
+ +
+
public override bool Equals(object? obj)
+
+ +

Parameters

+
+
obj object
+
+
+ +

Returns

+
+
bool
+
+
+ + + + + + + + + + + + + +

+ GetHashCode() + +

+ +
+
+ +
+
public override int GetHashCode()
+
+ + +

Returns

+
+
int
+
+
+ + + + + + + + + + + + + +

+ PrintMembers(StringBuilder) + +

+ +
+
+ +
+
protected virtual bool PrintMembers(StringBuilder builder)
+
+ +

Parameters

+
+
builder StringBuilder
+
+
+ +

Returns

+
+
bool
+
+
+ + + + + + + + + + + + + +

+ ToString() + +

+ +
+
+ +
+
public override string ToString()
+
+ + +

Returns

+
+
string
+
+
+ + + + + + + + + + + +

Operators +

+ + + + +

+ operator ==(SearchResult?, SearchResult?) + +

+ +
+
+ +
+
public static bool operator ==(SearchResult? left, SearchResult? right)
+
+ +

Parameters

+
+
left SearchResult
+
+
right SearchResult
+
+
+ +

Returns

+
+
bool
+
+
+ + + + + + + + + + + + + +

+ operator !=(SearchResult?, SearchResult?) + +

+ +
+
+ +
+
public static bool operator !=(SearchResult? left, SearchResult? right)
+
+ +

Parameters

+
+
left SearchResult
+
+
right SearchResult
+
+
+ +

Returns

+
+
bool
+
+
+ + + + + + + + + + + + +
+ + + + +
+ +
+ +
+
+ +
+ + + + diff --git a/api/client/EchoHub.Client.UI.Dialogs.SearchResultType.html b/api/client/EchoHub.Client.UI.Dialogs.SearchResultType.html new file mode 100644 index 0000000..1f0806d --- /dev/null +++ b/api/client/EchoHub.Client.UI.Dialogs.SearchResultType.html @@ -0,0 +1,153 @@ + + + + + Enum SearchResultType | EchoHub Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+
Table of Contents
+ +
+
+ +
+
+
+ +
+
+ + + +
+ +
+ + + + +

+Enum SearchResultType +

+ +
+
Namespace
EchoHub.Client.UI.Dialogs
+
Assembly
EchoHub.Client.dll
+
+ +
+
+ +
+
public enum SearchResultType
+
+ + + + + + + + + +

Fields +

+
+
Action = 1
+ +
+
Channel = 0
+ +
+
+ + + +
+ + + + +
+ +
+ +
+
+ +
+ + + + diff --git a/api/client/EchoHub.Client.UI.Dialogs.html b/api/client/EchoHub.Client.UI.Dialogs.html index 0d890ba..f6cdf6f 100644 --- a/api/client/EchoHub.Client.UI.Dialogs.html +++ b/api/client/EchoHub.Client.UI.Dialogs.html @@ -133,6 +133,15 @@ Includes a saved servers selector when saved servers are available.

Shows Edit Profile / Set Status buttons when viewing own profile.

+
+
SearchDialog
+

Command-palette style search dialog (Ctrl+K) for navigating channels and triggering app actions.

+
+
+
+
SearchResult
+
+
StatusDialog

A Terminal.Gui dialog for setting the user's status and status message.

@@ -159,6 +168,10 @@ Enums

Action selected by the user in their own profile dialog.

+
+
SearchResultType
+
+
diff --git a/api/client/EchoHub.Client.UI.ListSources.SearchListSource.html b/api/client/EchoHub.Client.UI.ListSources.SearchListSource.html new file mode 100644 index 0000000..342f31e --- /dev/null +++ b/api/client/EchoHub.Client.UI.ListSources.SearchListSource.html @@ -0,0 +1,591 @@ + + + + + Class SearchListSource | EchoHub Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+
Table of Contents
+ +
+
+ +
+
+
+ +
+
+ + + +
+ +
+ + + +

+Class SearchListSource +

+ +
+
Namespace
EchoHub.Client.UI.ListSources
+
Assembly
EchoHub.Client.dll
+
+ +

List data source for the search dialog with filtering and colored rendering.

+
+
+ +
+
public class SearchListSource : IListDataSource, IDisposable
+
+ + + + +
+
Inheritance
+
+ +
SearchListSource
+
+
+ +
+
Implements
+
+
IListDataSource
+ +
+
+ + +
+
Inherited Members
+
+ + + + + + + +
+ + + + + + +

Constructors +

+ + + + +

+ SearchListSource(List<SearchResult>) + +

+ +

List data source for the search dialog with filtering and colored rendering.

+
+
+ +
+
public SearchListSource(List<SearchResult> items)
+
+ +

Parameters

+
+
items List<SearchResult>
+
+
+ + + + + + + + + + + + +

Properties +

+ + + + +

+ Count + +

+ +
+
+ +
+
public int Count { get; }
+
+ + + + + +

Property Value

+
+
int
+
+
+ + + + + + + + + + +

+ MaxItemLength + +

+ +
+
+ +
+
public int MaxItemLength { get; }
+
+ + + + + +

Property Value

+
+
int
+
+
+ + + + + + + + + + +

+ SuspendCollectionChangedEvent + +

+ +
+
+ +
+
public bool SuspendCollectionChangedEvent { get; set; }
+
+ + + + + +

Property Value

+
+
bool
+
+
+ + + + + + + + +

Methods +

+ + + + +

+ Dispose() + +

+ +
+
+ +
+
public void Dispose()
+
+ + + + + + + + + + + + + + + +

+ Filter(string) + +

+ +
+
+ +
+
public void Filter(string query)
+
+ +

Parameters

+
+
query string
+
+
+ + + + + + + + + + + + + + +

+ GetItem(int) + +

+ +
+
+ +
+
public SearchResult? GetItem(int index)
+
+ +

Parameters

+
+
index int
+
+
+ +

Returns

+
+
SearchResult
+
+
+ + + + + + + + + + + + + +

+ IsMarked(int) + +

+ +
+
+ +
+
public bool IsMarked(int item)
+
+ +

Parameters

+
+
item int
+
+
+ +

Returns

+
+
bool
+
+
+ + + + + + + + + + + + + +

+ Render(ListView, bool, int, int, int, int, int) + +

+ +
+
+ +
+
public void Render(ListView listView, bool selected, int item, int col, int row, int width, int viewportX = 0)
+
+ +

Parameters

+
+
listView ListView
+
+
selected bool
+
+
item int
+
+
col int
+
+
row int
+
+
width int
+
+
viewportX int
+
+
+ + + + + + + + + + + + + + +

+ SetMark(int, bool) + +

+ +
+
+ +
+
public void SetMark(int item, bool value)
+
+ +

Parameters

+
+
item int
+
+
value bool
+
+
+ + + + + + + + + + + + + + +

+ ToList() + +

+ +
+
+ +
+
public IList ToList()
+
+ + +

Returns

+
+
IList
+
+
+ + + + + + + + + + + +

Events +

+ + + +

+ CollectionChanged + +

+ +
+
+ +
+
public event NotifyCollectionChangedEventHandler? CollectionChanged
+
+ + + + + + +

Event Type

+
+
NotifyCollectionChangedEventHandler
+
+
+ + + + + + + + +
+ + + + +
+ +
+ +
+
+ +
+ + + + diff --git a/api/client/EchoHub.Client.UI.ListSources.html b/api/client/EchoHub.Client.UI.ListSources.html index 909dcc0..a007172 100644 --- a/api/client/EchoHub.Client.UI.ListSources.html +++ b/api/client/EchoHub.Client.UI.ListSources.html @@ -98,6 +98,11 @@ Classes
ChannelListSource

Custom list data source for colored channel list rendering. Active channel gets a > indicator, unread channels are bright with a count badge.

+
+ +
+
SearchListSource
+

List data source for the search dialog with filtering and colored rendering.

diff --git a/api/client/EchoHub.Client.UI.MainWindow.html b/api/client/EchoHub.Client.UI.MainWindow.html index 97c2bf6..461d0bb 100644 --- a/api/client/EchoHub.Client.UI.MainWindow.html +++ b/api/client/EchoHub.Client.UI.MainWindow.html @@ -1630,6 +1630,37 @@ Call after theme changes to refresh colors.

+

+ OnLoadMoreRequested + +

+ +

Fired when the user scrolls to the top of the message list and older messages should be loaded.

+
+
+ +
+
public event Action? OnLoadMoreRequested
+
+ + + + + + +

Event Type

+
+
Action
+
+
+ + + + + + + +

OnLogoutRequested @@ -1785,6 +1816,37 @@ Call after theme changes to refresh colors.

+

+ OnSearchRequested + +

+ +

Fired when the user requests to open the search dialog (via menu or Ctrl+K).

+
+
+ +
+
public event Action? OnSearchRequested
+
+ + + + + + +

Event Type

+
+
Action
+
+
+ + + + + + + +

OnStatusRequested diff --git a/api/core/EchoHub.Core.Constants.ValidationConstants.html b/api/core/EchoHub.Core.Constants.ValidationConstants.html index 1aa468e..2963158 100644 --- a/api/core/EchoHub.Core.Constants.ValidationConstants.html +++ b/api/core/EchoHub.Core.Constants.ValidationConstants.html @@ -312,7 +312,7 @@ Class ValidationConstants
-
public const int MaxHistoryCount = 100
+
public const int MaxHistoryCount = 200
diff --git a/api/core/EchoHub.Core.Contracts.IChatService.html b/api/core/EchoHub.Core.Contracts.IChatService.html index 34ec523..0803da2 100644 --- a/api/core/EchoHub.Core.Contracts.IChatService.html +++ b/api/core/EchoHub.Core.Contracts.IChatService.html @@ -198,8 +198,8 @@ Interface IChatService
-

- GetChannelHistoryAsync(string, int) +

+ GetChannelHistoryAsync(string, int, int)

@@ -207,7 +207,7 @@ Interface IChatService
-
Task<List<MessageDto>> GetChannelHistoryAsync(string channelName, int count)
+
Task<List<MessageDto>> GetChannelHistoryAsync(string channelName, int count, int offset = 0)

Parameters

@@ -216,6 +216,8 @@ Interface IChatService
int
+
offset int
+

Returns

diff --git a/api/server/EchoHub.Server.Hubs.ChatHub.html b/api/server/EchoHub.Server.Hubs.ChatHub.html index b38deb3..b40e047 100644 --- a/api/server/EchoHub.Server.Hubs.ChatHub.html +++ b/api/server/EchoHub.Server.Hubs.ChatHub.html @@ -200,8 +200,8 @@ public class ChatHub : Hub<IEchoHubClient>, IDisposable -

- GetChannelHistory(string, int) +

+ GetChannelHistory(string, int, int)

@@ -209,7 +209,7 @@ public class ChatHub : Hub<IEchoHubClient>, IDisposable
-
public Task<List<MessageDto>> GetChannelHistory(string channelName, int count = 100)
+
public Task<List<MessageDto>> GetChannelHistory(string channelName, int count = 100, int offset = 0)

Parameters

@@ -218,6 +218,8 @@ public class ChatHub : Hub<IEchoHubClient>, IDisposable
count int
+
offset int
+

Returns

diff --git a/api/server/EchoHub.Server.Services.ChatService.html b/api/server/EchoHub.Server.Services.ChatService.html index 15e154a..a0ed2b0 100644 --- a/api/server/EchoHub.Server.Services.ChatService.html +++ b/api/server/EchoHub.Server.Services.ChatService.html @@ -283,8 +283,8 @@ Class ChatService -

- GetChannelHistoryAsync(string, int) +

+ GetChannelHistoryAsync(string, int, int)

@@ -292,7 +292,7 @@ Class ChatService
-
public Task<List<MessageDto>> GetChannelHistoryAsync(string channelName, int count)
+
public Task<List<MessageDto>> GetChannelHistoryAsync(string channelName, int count, int offset = 0)

Parameters

@@ -301,6 +301,8 @@ Class ChatService
count int
+
offset int
+

Returns

diff --git a/api/toc.html b/api/toc.html index a6b6e07..27d84c6 100644 --- a/api/toc.html +++ b/api/toc.html @@ -184,6 +184,15 @@
  • ProfileViewDialog
  • +
  • + SearchDialog +
  • +
  • + SearchResult +
  • +
  • + SearchResultType +
  • StatusDialog
  • @@ -219,6 +228,9 @@
  • ChannelListSource
  • +
  • + SearchListSource +
  • UserListSource
  • diff --git a/api/toc.json b/api/toc.json index 0ed170a..7c9619c 100644 --- a/api/toc.json +++ b/api/toc.json @@ -1,2 +1,2 @@ -{"items":[{"name":"Client","items":[{"name":"API Reference","includedFrom":"~/_api_meta/client/toc.yml","items":[{"name":"EchoHub.Client","href":"client/EchoHub.Client.html","topicHref":"client/EchoHub.Client.html","topicUid":"EchoHub.Client","type":"Namespace","items":[{"name":"AppOrchestrator","href":"client/EchoHub.Client.AppOrchestrator.html","topicHref":"client/EchoHub.Client.AppOrchestrator.html","topicUid":"EchoHub.Client.AppOrchestrator","type":"Class"}]},{"name":"EchoHub.Client.Commands","href":"client/EchoHub.Client.Commands.html","topicHref":"client/EchoHub.Client.Commands.html","topicUid":"EchoHub.Client.Commands","type":"Namespace","items":[{"name":"CommandHandler","href":"client/EchoHub.Client.Commands.CommandHandler.html","topicHref":"client/EchoHub.Client.Commands.CommandHandler.html","topicUid":"EchoHub.Client.Commands.CommandHandler","type":"Class"},{"name":"CommandResult","href":"client/EchoHub.Client.Commands.CommandResult.html","topicHref":"client/EchoHub.Client.Commands.CommandResult.html","topicUid":"EchoHub.Client.Commands.CommandResult","type":"Class"}]},{"name":"EchoHub.Client.Config","href":"client/EchoHub.Client.Config.html","topicHref":"client/EchoHub.Client.Config.html","topicUid":"EchoHub.Client.Config","type":"Namespace","items":[{"name":"AccountPreset","href":"client/EchoHub.Client.Config.AccountPreset.html","topicHref":"client/EchoHub.Client.Config.AccountPreset.html","topicUid":"EchoHub.Client.Config.AccountPreset","type":"Class"},{"name":"ClientConfig","href":"client/EchoHub.Client.Config.ClientConfig.html","topicHref":"client/EchoHub.Client.Config.ClientConfig.html","topicUid":"EchoHub.Client.Config.ClientConfig","type":"Class"},{"name":"ConfigManager","href":"client/EchoHub.Client.Config.ConfigManager.html","topicHref":"client/EchoHub.Client.Config.ConfigManager.html","topicUid":"EchoHub.Client.Config.ConfigManager","type":"Class"},{"name":"NotificationConfig","href":"client/EchoHub.Client.Config.NotificationConfig.html","topicHref":"client/EchoHub.Client.Config.NotificationConfig.html","topicUid":"EchoHub.Client.Config.NotificationConfig","type":"Class"},{"name":"SavedServer","href":"client/EchoHub.Client.Config.SavedServer.html","topicHref":"client/EchoHub.Client.Config.SavedServer.html","topicUid":"EchoHub.Client.Config.SavedServer","type":"Class"}]},{"name":"EchoHub.Client.Services","href":"client/EchoHub.Client.Services.html","topicHref":"client/EchoHub.Client.Services.html","topicUid":"EchoHub.Client.Services","type":"Namespace","items":[{"name":"ApiClient","href":"client/EchoHub.Client.Services.ApiClient.html","topicHref":"client/EchoHub.Client.Services.ApiClient.html","topicUid":"EchoHub.Client.Services.ApiClient","type":"Class"},{"name":"AsyncRunner","href":"client/EchoHub.Client.Services.AsyncRunner.html","topicHref":"client/EchoHub.Client.Services.AsyncRunner.html","topicUid":"EchoHub.Client.Services.AsyncRunner","type":"Class"},{"name":"AudioPlaybackService","href":"client/EchoHub.Client.Services.AudioPlaybackService.html","topicHref":"client/EchoHub.Client.Services.AudioPlaybackService.html","topicUid":"EchoHub.Client.Services.AudioPlaybackService","type":"Class"},{"name":"BackupInfo","href":"client/EchoHub.Client.Services.BackupInfo.html","topicHref":"client/EchoHub.Client.Services.BackupInfo.html","topicUid":"EchoHub.Client.Services.BackupInfo","type":"Class"},{"name":"ClientEncryptionService","href":"client/EchoHub.Client.Services.ClientEncryptionService.html","topicHref":"client/EchoHub.Client.Services.ClientEncryptionService.html","topicUid":"EchoHub.Client.Services.ClientEncryptionService","type":"Class"},{"name":"EchoHubConnection","href":"client/EchoHub.Client.Services.EchoHubConnection.html","topicHref":"client/EchoHub.Client.Services.EchoHubConnection.html","topicUid":"EchoHub.Client.Services.EchoHubConnection","type":"Class"},{"name":"NotificationSoundService","href":"client/EchoHub.Client.Services.NotificationSoundService.html","topicHref":"client/EchoHub.Client.Services.NotificationSoundService.html","topicUid":"EchoHub.Client.Services.NotificationSoundService","type":"Class"},{"name":"PathSetup","href":"client/EchoHub.Client.Services.PathSetup.html","topicHref":"client/EchoHub.Client.Services.PathSetup.html","topicUid":"EchoHub.Client.Services.PathSetup","type":"Class"},{"name":"UpdateBackupService","href":"client/EchoHub.Client.Services.UpdateBackupService.html","topicHref":"client/EchoHub.Client.Services.UpdateBackupService.html","topicUid":"EchoHub.Client.Services.UpdateBackupService","type":"Class"},{"name":"UpdateChecker","href":"client/EchoHub.Client.Services.UpdateChecker.html","topicHref":"client/EchoHub.Client.Services.UpdateChecker.html","topicUid":"EchoHub.Client.Services.UpdateChecker","type":"Class"}]},{"name":"EchoHub.Client.Themes","href":"client/EchoHub.Client.Themes.html","topicHref":"client/EchoHub.Client.Themes.html","topicUid":"EchoHub.Client.Themes","type":"Namespace","items":[{"name":"Theme","href":"client/EchoHub.Client.Themes.Theme.html","topicHref":"client/EchoHub.Client.Themes.Theme.html","topicUid":"EchoHub.Client.Themes.Theme","type":"Class"},{"name":"ThemeColors","href":"client/EchoHub.Client.Themes.ThemeColors.html","topicHref":"client/EchoHub.Client.Themes.ThemeColors.html","topicUid":"EchoHub.Client.Themes.ThemeColors","type":"Class"},{"name":"ThemeManager","href":"client/EchoHub.Client.Themes.ThemeManager.html","topicHref":"client/EchoHub.Client.Themes.ThemeManager.html","topicUid":"EchoHub.Client.Themes.ThemeManager","type":"Class"}]},{"name":"EchoHub.Client.UI","href":"client/EchoHub.Client.UI.html","topicHref":"client/EchoHub.Client.UI.html","topicUid":"EchoHub.Client.UI","type":"Namespace","items":[{"name":"MainWindow","href":"client/EchoHub.Client.UI.MainWindow.html","topicHref":"client/EchoHub.Client.UI.MainWindow.html","topicUid":"EchoHub.Client.UI.MainWindow","type":"Class"}]},{"name":"EchoHub.Client.UI.Chat","href":"client/EchoHub.Client.UI.Chat.html","topicHref":"client/EchoHub.Client.UI.Chat.html","topicUid":"EchoHub.Client.UI.Chat","type":"Namespace","items":[{"name":"ChatColors","href":"client/EchoHub.Client.UI.Chat.ChatColors.html","topicHref":"client/EchoHub.Client.UI.Chat.ChatColors.html","topicUid":"EchoHub.Client.UI.Chat.ChatColors","type":"Class"},{"name":"ChatLine","href":"client/EchoHub.Client.UI.Chat.ChatLine.html","topicHref":"client/EchoHub.Client.UI.Chat.ChatLine.html","topicUid":"EchoHub.Client.UI.Chat.ChatLine","type":"Class"},{"name":"ChatListSource","href":"client/EchoHub.Client.UI.Chat.ChatListSource.html","topicHref":"client/EchoHub.Client.UI.Chat.ChatListSource.html","topicUid":"EchoHub.Client.UI.Chat.ChatListSource","type":"Class"},{"name":"ChatMessageManager","href":"client/EchoHub.Client.UI.Chat.ChatMessageManager.html","topicHref":"client/EchoHub.Client.UI.Chat.ChatMessageManager.html","topicUid":"EchoHub.Client.UI.Chat.ChatMessageManager","type":"Class"},{"name":"ChatSegment","href":"client/EchoHub.Client.UI.Chat.ChatSegment.html","topicHref":"client/EchoHub.Client.UI.Chat.ChatSegment.html","topicUid":"EchoHub.Client.UI.Chat.ChatSegment","type":"Class"}]},{"name":"EchoHub.Client.UI.Dialogs","href":"client/EchoHub.Client.UI.Dialogs.html","topicHref":"client/EchoHub.Client.UI.Dialogs.html","topicUid":"EchoHub.Client.UI.Dialogs","type":"Namespace","items":[{"name":"AudioPlayerDialog","href":"client/EchoHub.Client.UI.Dialogs.AudioPlayerDialog.html","topicHref":"client/EchoHub.Client.UI.Dialogs.AudioPlayerDialog.html","topicUid":"EchoHub.Client.UI.Dialogs.AudioPlayerDialog","type":"Class"},{"name":"ConnectDialog","href":"client/EchoHub.Client.UI.Dialogs.ConnectDialog.html","topicHref":"client/EchoHub.Client.UI.Dialogs.ConnectDialog.html","topicUid":"EchoHub.Client.UI.Dialogs.ConnectDialog","type":"Class"},{"name":"ConnectDialogResult","href":"client/EchoHub.Client.UI.Dialogs.ConnectDialogResult.html","topicHref":"client/EchoHub.Client.UI.Dialogs.ConnectDialogResult.html","topicUid":"EchoHub.Client.UI.Dialogs.ConnectDialogResult","type":"Class"},{"name":"CreateChannelDialog","href":"client/EchoHub.Client.UI.Dialogs.CreateChannelDialog.html","topicHref":"client/EchoHub.Client.UI.Dialogs.CreateChannelDialog.html","topicUid":"EchoHub.Client.UI.Dialogs.CreateChannelDialog","type":"Class"},{"name":"CreateChannelResult","href":"client/EchoHub.Client.UI.Dialogs.CreateChannelResult.html","topicHref":"client/EchoHub.Client.UI.Dialogs.CreateChannelResult.html","topicUid":"EchoHub.Client.UI.Dialogs.CreateChannelResult","type":"Class"},{"name":"ProfileAction","href":"client/EchoHub.Client.UI.Dialogs.ProfileAction.html","topicHref":"client/EchoHub.Client.UI.Dialogs.ProfileAction.html","topicUid":"EchoHub.Client.UI.Dialogs.ProfileAction","type":"Enum"},{"name":"ProfileEditDialog","href":"client/EchoHub.Client.UI.Dialogs.ProfileEditDialog.html","topicHref":"client/EchoHub.Client.UI.Dialogs.ProfileEditDialog.html","topicUid":"EchoHub.Client.UI.Dialogs.ProfileEditDialog","type":"Class"},{"name":"ProfileEditResult","href":"client/EchoHub.Client.UI.Dialogs.ProfileEditResult.html","topicHref":"client/EchoHub.Client.UI.Dialogs.ProfileEditResult.html","topicUid":"EchoHub.Client.UI.Dialogs.ProfileEditResult","type":"Class"},{"name":"ProfileViewDialog","href":"client/EchoHub.Client.UI.Dialogs.ProfileViewDialog.html","topicHref":"client/EchoHub.Client.UI.Dialogs.ProfileViewDialog.html","topicUid":"EchoHub.Client.UI.Dialogs.ProfileViewDialog","type":"Class"},{"name":"StatusDialog","href":"client/EchoHub.Client.UI.Dialogs.StatusDialog.html","topicHref":"client/EchoHub.Client.UI.Dialogs.StatusDialog.html","topicUid":"EchoHub.Client.UI.Dialogs.StatusDialog","type":"Class"},{"name":"StatusDialogResult","href":"client/EchoHub.Client.UI.Dialogs.StatusDialogResult.html","topicHref":"client/EchoHub.Client.UI.Dialogs.StatusDialogResult.html","topicUid":"EchoHub.Client.UI.Dialogs.StatusDialogResult","type":"Class"},{"name":"UpdateConfirmDialog","href":"client/EchoHub.Client.UI.Dialogs.UpdateConfirmDialog.html","topicHref":"client/EchoHub.Client.UI.Dialogs.UpdateConfirmDialog.html","topicUid":"EchoHub.Client.UI.Dialogs.UpdateConfirmDialog","type":"Class"},{"name":"UpdateProgressDialog","href":"client/EchoHub.Client.UI.Dialogs.UpdateProgressDialog.html","topicHref":"client/EchoHub.Client.UI.Dialogs.UpdateProgressDialog.html","topicUid":"EchoHub.Client.UI.Dialogs.UpdateProgressDialog","type":"Class"}]},{"name":"EchoHub.Client.UI.Helpers","href":"client/EchoHub.Client.UI.Helpers.html","topicHref":"client/EchoHub.Client.UI.Helpers.html","topicUid":"EchoHub.Client.UI.Helpers","type":"Namespace","items":[{"name":"EmojiHelper","href":"client/EchoHub.Client.UI.Helpers.EmojiHelper.html","topicHref":"client/EchoHub.Client.UI.Helpers.EmojiHelper.html","topicUid":"EchoHub.Client.UI.Helpers.EmojiHelper","type":"Class"},{"name":"HexColorHelper","href":"client/EchoHub.Client.UI.Helpers.HexColorHelper.html","topicHref":"client/EchoHub.Client.UI.Helpers.HexColorHelper.html","topicUid":"EchoHub.Client.UI.Helpers.HexColorHelper","type":"Class"}]},{"name":"EchoHub.Client.UI.ListSources","href":"client/EchoHub.Client.UI.ListSources.html","topicHref":"client/EchoHub.Client.UI.ListSources.html","topicUid":"EchoHub.Client.UI.ListSources","type":"Namespace","items":[{"name":"ChannelListSource","href":"client/EchoHub.Client.UI.ListSources.ChannelListSource.html","topicHref":"client/EchoHub.Client.UI.ListSources.ChannelListSource.html","topicUid":"EchoHub.Client.UI.ListSources.ChannelListSource","type":"Class"},{"name":"UserListSource","href":"client/EchoHub.Client.UI.ListSources.UserListSource.html","topicHref":"client/EchoHub.Client.UI.ListSources.UserListSource.html","topicUid":"EchoHub.Client.UI.ListSources.UserListSource","type":"Class"}]}]},{"name":"Articles","includedFrom":"~/api/client-articles/toc.yml","items":[{"name":"Overview","href":"client-articles/index.html","topicHref":"client-articles/index.html"}]}]},{"name":"Core","items":[{"name":"API Reference","includedFrom":"~/_api_meta/core/toc.yml","items":[{"name":"EchoHub.Core.Constants","href":"core/EchoHub.Core.Constants.html","topicHref":"core/EchoHub.Core.Constants.html","topicUid":"EchoHub.Core.Constants","type":"Namespace","items":[{"name":"HubConstants","href":"core/EchoHub.Core.Constants.HubConstants.html","topicHref":"core/EchoHub.Core.Constants.HubConstants.html","topicUid":"EchoHub.Core.Constants.HubConstants","type":"Class"},{"name":"ValidationConstants","href":"core/EchoHub.Core.Constants.ValidationConstants.html","topicHref":"core/EchoHub.Core.Constants.ValidationConstants.html","topicUid":"EchoHub.Core.Constants.ValidationConstants","type":"Class"}]},{"name":"EchoHub.Core.Contracts","href":"core/EchoHub.Core.Contracts.html","topicHref":"core/EchoHub.Core.Contracts.html","topicUid":"EchoHub.Core.Contracts","type":"Namespace","items":[{"name":"ChannelListItem","href":"core/EchoHub.Core.Contracts.ChannelListItem.html","topicHref":"core/EchoHub.Core.Contracts.ChannelListItem.html","topicUid":"EchoHub.Core.Contracts.ChannelListItem","type":"Class"},{"name":"IChannelService","href":"core/EchoHub.Core.Contracts.IChannelService.html","topicHref":"core/EchoHub.Core.Contracts.IChannelService.html","topicUid":"EchoHub.Core.Contracts.IChannelService","type":"Interface"},{"name":"IChatBroadcaster","href":"core/EchoHub.Core.Contracts.IChatBroadcaster.html","topicHref":"core/EchoHub.Core.Contracts.IChatBroadcaster.html","topicUid":"EchoHub.Core.Contracts.IChatBroadcaster","type":"Interface"},{"name":"IChatService","href":"core/EchoHub.Core.Contracts.IChatService.html","topicHref":"core/EchoHub.Core.Contracts.IChatService.html","topicUid":"EchoHub.Core.Contracts.IChatService","type":"Interface"},{"name":"IEchoHubClient","href":"core/EchoHub.Core.Contracts.IEchoHubClient.html","topicHref":"core/EchoHub.Core.Contracts.IEchoHubClient.html","topicUid":"EchoHub.Core.Contracts.IEchoHubClient","type":"Interface"},{"name":"IMessageEncryptionService","href":"core/EchoHub.Core.Contracts.IMessageEncryptionService.html","topicHref":"core/EchoHub.Core.Contracts.IMessageEncryptionService.html","topicUid":"EchoHub.Core.Contracts.IMessageEncryptionService","type":"Interface"},{"name":"IUserService","href":"core/EchoHub.Core.Contracts.IUserService.html","topicHref":"core/EchoHub.Core.Contracts.IUserService.html","topicUid":"EchoHub.Core.Contracts.IUserService","type":"Interface"}]},{"name":"EchoHub.Core.DTOs","href":"core/EchoHub.Core.DTOs.html","topicHref":"core/EchoHub.Core.DTOs.html","topicUid":"EchoHub.Core.DTOs","type":"Namespace","items":[{"name":"ApiResponse","href":"core/EchoHub.Core.DTOs.ApiResponse.html","topicHref":"core/EchoHub.Core.DTOs.ApiResponse.html","topicUid":"EchoHub.Core.DTOs.ApiResponse","type":"Class"},{"name":"ApiResponse","href":"core/EchoHub.Core.DTOs.ApiResponse-1.html","topicHref":"core/EchoHub.Core.DTOs.ApiResponse-1.html","topicUid":"EchoHub.Core.DTOs.ApiResponse`1","type":"Class"},{"name":"AssignRoleRequest","href":"core/EchoHub.Core.DTOs.AssignRoleRequest.html","topicHref":"core/EchoHub.Core.DTOs.AssignRoleRequest.html","topicUid":"EchoHub.Core.DTOs.AssignRoleRequest","type":"Class"},{"name":"AvatarUploadResponse","href":"core/EchoHub.Core.DTOs.AvatarUploadResponse.html","topicHref":"core/EchoHub.Core.DTOs.AvatarUploadResponse.html","topicUid":"EchoHub.Core.DTOs.AvatarUploadResponse","type":"Class"},{"name":"BanRequest","href":"core/EchoHub.Core.DTOs.BanRequest.html","topicHref":"core/EchoHub.Core.DTOs.BanRequest.html","topicUid":"EchoHub.Core.DTOs.BanRequest","type":"Class"},{"name":"ChannelDto","href":"core/EchoHub.Core.DTOs.ChannelDto.html","topicHref":"core/EchoHub.Core.DTOs.ChannelDto.html","topicUid":"EchoHub.Core.DTOs.ChannelDto","type":"Class"},{"name":"ChannelError","href":"core/EchoHub.Core.DTOs.ChannelError.html","topicHref":"core/EchoHub.Core.DTOs.ChannelError.html","topicUid":"EchoHub.Core.DTOs.ChannelError","type":"Enum"},{"name":"ChannelOperationResult","href":"core/EchoHub.Core.DTOs.ChannelOperationResult.html","topicHref":"core/EchoHub.Core.DTOs.ChannelOperationResult.html","topicUid":"EchoHub.Core.DTOs.ChannelOperationResult","type":"Class"},{"name":"CreateChannelRequest","href":"core/EchoHub.Core.DTOs.CreateChannelRequest.html","topicHref":"core/EchoHub.Core.DTOs.CreateChannelRequest.html","topicUid":"EchoHub.Core.DTOs.CreateChannelRequest","type":"Class"},{"name":"EmbedDto","href":"core/EchoHub.Core.DTOs.EmbedDto.html","topicHref":"core/EchoHub.Core.DTOs.EmbedDto.html","topicUid":"EchoHub.Core.DTOs.EmbedDto","type":"Class"},{"name":"EncryptionKeyResponse","href":"core/EchoHub.Core.DTOs.EncryptionKeyResponse.html","topicHref":"core/EchoHub.Core.DTOs.EncryptionKeyResponse.html","topicUid":"EchoHub.Core.DTOs.EncryptionKeyResponse","type":"Class"},{"name":"ErrorResponse","href":"core/EchoHub.Core.DTOs.ErrorResponse.html","topicHref":"core/EchoHub.Core.DTOs.ErrorResponse.html","topicUid":"EchoHub.Core.DTOs.ErrorResponse","type":"Class"},{"name":"JoinChannelResult","href":"core/EchoHub.Core.DTOs.JoinChannelResult.html","topicHref":"core/EchoHub.Core.DTOs.JoinChannelResult.html","topicUid":"EchoHub.Core.DTOs.JoinChannelResult","type":"Class"},{"name":"KickRequest","href":"core/EchoHub.Core.DTOs.KickRequest.html","topicHref":"core/EchoHub.Core.DTOs.KickRequest.html","topicUid":"EchoHub.Core.DTOs.KickRequest","type":"Class"},{"name":"LoginRequest","href":"core/EchoHub.Core.DTOs.LoginRequest.html","topicHref":"core/EchoHub.Core.DTOs.LoginRequest.html","topicUid":"EchoHub.Core.DTOs.LoginRequest","type":"Class"},{"name":"LoginResponse","href":"core/EchoHub.Core.DTOs.LoginResponse.html","topicHref":"core/EchoHub.Core.DTOs.LoginResponse.html","topicUid":"EchoHub.Core.DTOs.LoginResponse","type":"Class"},{"name":"MessageDto","href":"core/EchoHub.Core.DTOs.MessageDto.html","topicHref":"core/EchoHub.Core.DTOs.MessageDto.html","topicUid":"EchoHub.Core.DTOs.MessageDto","type":"Class"},{"name":"MuteRequest","href":"core/EchoHub.Core.DTOs.MuteRequest.html","topicHref":"core/EchoHub.Core.DTOs.MuteRequest.html","topicUid":"EchoHub.Core.DTOs.MuteRequest","type":"Class"},{"name":"PaginatedResponse","href":"core/EchoHub.Core.DTOs.PaginatedResponse-1.html","topicHref":"core/EchoHub.Core.DTOs.PaginatedResponse-1.html","topicUid":"EchoHub.Core.DTOs.PaginatedResponse`1","type":"Class"},{"name":"RefreshRequest","href":"core/EchoHub.Core.DTOs.RefreshRequest.html","topicHref":"core/EchoHub.Core.DTOs.RefreshRequest.html","topicUid":"EchoHub.Core.DTOs.RefreshRequest","type":"Class"},{"name":"RegisterRequest","href":"core/EchoHub.Core.DTOs.RegisterRequest.html","topicHref":"core/EchoHub.Core.DTOs.RegisterRequest.html","topicUid":"EchoHub.Core.DTOs.RegisterRequest","type":"Class"},{"name":"SendMessageRequest","href":"core/EchoHub.Core.DTOs.SendMessageRequest.html","topicHref":"core/EchoHub.Core.DTOs.SendMessageRequest.html","topicUid":"EchoHub.Core.DTOs.SendMessageRequest","type":"Class"},{"name":"SendUrlRequest","href":"core/EchoHub.Core.DTOs.SendUrlRequest.html","topicHref":"core/EchoHub.Core.DTOs.SendUrlRequest.html","topicUid":"EchoHub.Core.DTOs.SendUrlRequest","type":"Class"},{"name":"ServerStatusDto","href":"core/EchoHub.Core.DTOs.ServerStatusDto.html","topicHref":"core/EchoHub.Core.DTOs.ServerStatusDto.html","topicUid":"EchoHub.Core.DTOs.ServerStatusDto","type":"Class"},{"name":"UpdateProfileRequest","href":"core/EchoHub.Core.DTOs.UpdateProfileRequest.html","topicHref":"core/EchoHub.Core.DTOs.UpdateProfileRequest.html","topicUid":"EchoHub.Core.DTOs.UpdateProfileRequest","type":"Class"},{"name":"UpdateStatusRequest","href":"core/EchoHub.Core.DTOs.UpdateStatusRequest.html","topicHref":"core/EchoHub.Core.DTOs.UpdateStatusRequest.html","topicUid":"EchoHub.Core.DTOs.UpdateStatusRequest","type":"Class"},{"name":"UpdateTopicRequest","href":"core/EchoHub.Core.DTOs.UpdateTopicRequest.html","topicHref":"core/EchoHub.Core.DTOs.UpdateTopicRequest.html","topicUid":"EchoHub.Core.DTOs.UpdateTopicRequest","type":"Class"},{"name":"UserDto","href":"core/EchoHub.Core.DTOs.UserDto.html","topicHref":"core/EchoHub.Core.DTOs.UserDto.html","topicUid":"EchoHub.Core.DTOs.UserDto","type":"Class"},{"name":"UserError","href":"core/EchoHub.Core.DTOs.UserError.html","topicHref":"core/EchoHub.Core.DTOs.UserError.html","topicUid":"EchoHub.Core.DTOs.UserError","type":"Enum"},{"name":"UserOperationResult","href":"core/EchoHub.Core.DTOs.UserOperationResult.html","topicHref":"core/EchoHub.Core.DTOs.UserOperationResult.html","topicUid":"EchoHub.Core.DTOs.UserOperationResult","type":"Class"},{"name":"UserPresenceDto","href":"core/EchoHub.Core.DTOs.UserPresenceDto.html","topicHref":"core/EchoHub.Core.DTOs.UserPresenceDto.html","topicUid":"EchoHub.Core.DTOs.UserPresenceDto","type":"Class"},{"name":"UserProfileDto","href":"core/EchoHub.Core.DTOs.UserProfileDto.html","topicHref":"core/EchoHub.Core.DTOs.UserProfileDto.html","topicUid":"EchoHub.Core.DTOs.UserProfileDto","type":"Class"}]},{"name":"EchoHub.Core.Models","href":"core/EchoHub.Core.Models.html","topicHref":"core/EchoHub.Core.Models.html","topicUid":"EchoHub.Core.Models","type":"Namespace","items":[{"name":"Channel","href":"core/EchoHub.Core.Models.Channel.html","topicHref":"core/EchoHub.Core.Models.Channel.html","topicUid":"EchoHub.Core.Models.Channel","type":"Class"},{"name":"ChannelMembership","href":"core/EchoHub.Core.Models.ChannelMembership.html","topicHref":"core/EchoHub.Core.Models.ChannelMembership.html","topicUid":"EchoHub.Core.Models.ChannelMembership","type":"Class"},{"name":"Message","href":"core/EchoHub.Core.Models.Message.html","topicHref":"core/EchoHub.Core.Models.Message.html","topicUid":"EchoHub.Core.Models.Message","type":"Class"},{"name":"MessageType","href":"core/EchoHub.Core.Models.MessageType.html","topicHref":"core/EchoHub.Core.Models.MessageType.html","topicUid":"EchoHub.Core.Models.MessageType","type":"Enum"},{"name":"RefreshToken","href":"core/EchoHub.Core.Models.RefreshToken.html","topicHref":"core/EchoHub.Core.Models.RefreshToken.html","topicUid":"EchoHub.Core.Models.RefreshToken","type":"Class"},{"name":"ServerRole","href":"core/EchoHub.Core.Models.ServerRole.html","topicHref":"core/EchoHub.Core.Models.ServerRole.html","topicUid":"EchoHub.Core.Models.ServerRole","type":"Enum"},{"name":"User","href":"core/EchoHub.Core.Models.User.html","topicHref":"core/EchoHub.Core.Models.User.html","topicUid":"EchoHub.Core.Models.User","type":"Class"},{"name":"UserStatus","href":"core/EchoHub.Core.Models.UserStatus.html","topicHref":"core/EchoHub.Core.Models.UserStatus.html","topicUid":"EchoHub.Core.Models.UserStatus","type":"Enum"}]}]},{"name":"Articles","includedFrom":"~/api/core-articles/toc.yml","items":[{"name":"Overview","href":"core-articles/index.html","topicHref":"core-articles/index.html"}]}]},{"name":"Server","items":[{"name":"API Reference","includedFrom":"~/_api_meta/server/toc.yml","items":[{"name":"EchoHub.Server.Auth","href":"server/EchoHub.Server.Auth.html","topicHref":"server/EchoHub.Server.Auth.html","topicUid":"EchoHub.Server.Auth","type":"Namespace","items":[{"name":"JwtTokenService","href":"server/EchoHub.Server.Auth.JwtTokenService.html","topicHref":"server/EchoHub.Server.Auth.JwtTokenService.html","topicUid":"EchoHub.Server.Auth.JwtTokenService","type":"Class"}]},{"name":"EchoHub.Server.Controllers","href":"server/EchoHub.Server.Controllers.html","topicHref":"server/EchoHub.Server.Controllers.html","topicUid":"EchoHub.Server.Controllers","type":"Namespace","items":[{"name":"AuthController","href":"server/EchoHub.Server.Controllers.AuthController.html","topicHref":"server/EchoHub.Server.Controllers.AuthController.html","topicUid":"EchoHub.Server.Controllers.AuthController","type":"Class"},{"name":"ChannelsController","href":"server/EchoHub.Server.Controllers.ChannelsController.html","topicHref":"server/EchoHub.Server.Controllers.ChannelsController.html","topicUid":"EchoHub.Server.Controllers.ChannelsController","type":"Class"},{"name":"FilesController","href":"server/EchoHub.Server.Controllers.FilesController.html","topicHref":"server/EchoHub.Server.Controllers.FilesController.html","topicUid":"EchoHub.Server.Controllers.FilesController","type":"Class"},{"name":"ModerationController","href":"server/EchoHub.Server.Controllers.ModerationController.html","topicHref":"server/EchoHub.Server.Controllers.ModerationController.html","topicUid":"EchoHub.Server.Controllers.ModerationController","type":"Class"},{"name":"ServerController","href":"server/EchoHub.Server.Controllers.ServerController.html","topicHref":"server/EchoHub.Server.Controllers.ServerController.html","topicUid":"EchoHub.Server.Controllers.ServerController","type":"Class"},{"name":"UsersController","href":"server/EchoHub.Server.Controllers.UsersController.html","topicHref":"server/EchoHub.Server.Controllers.UsersController.html","topicUid":"EchoHub.Server.Controllers.UsersController","type":"Class"}]},{"name":"EchoHub.Server.Data","href":"server/EchoHub.Server.Data.html","topicHref":"server/EchoHub.Server.Data.html","topicUid":"EchoHub.Server.Data","type":"Namespace","items":[{"name":"EchoHubDbContext","href":"server/EchoHub.Server.Data.EchoHubDbContext.html","topicHref":"server/EchoHub.Server.Data.EchoHubDbContext.html","topicUid":"EchoHub.Server.Data.EchoHubDbContext","type":"Class"}]},{"name":"EchoHub.Server.Data.Migrations","href":"server/EchoHub.Server.Data.Migrations.html","topicHref":"server/EchoHub.Server.Data.Migrations.html","topicUid":"EchoHub.Server.Data.Migrations","type":"Namespace","items":[{"name":"AddAttachmentFileSize","href":"server/EchoHub.Server.Data.Migrations.AddAttachmentFileSize.html","topicHref":"server/EchoHub.Server.Data.Migrations.AddAttachmentFileSize.html","topicUid":"EchoHub.Server.Data.Migrations.AddAttachmentFileSize","type":"Class"},{"name":"AddChannelIsPublic","href":"server/EchoHub.Server.Data.Migrations.AddChannelIsPublic.html","topicHref":"server/EchoHub.Server.Data.Migrations.AddChannelIsPublic.html","topicUid":"EchoHub.Server.Data.Migrations.AddChannelIsPublic","type":"Class"},{"name":"AddChannelMembership","href":"server/EchoHub.Server.Data.Migrations.AddChannelMembership.html","topicHref":"server/EchoHub.Server.Data.Migrations.AddChannelMembership.html","topicUid":"EchoHub.Server.Data.Migrations.AddChannelMembership","type":"Class"},{"name":"AddEncryptionSupport","href":"server/EchoHub.Server.Data.Migrations.AddEncryptionSupport.html","topicHref":"server/EchoHub.Server.Data.Migrations.AddEncryptionSupport.html","topicUid":"EchoHub.Server.Data.Migrations.AddEncryptionSupport","type":"Class"},{"name":"AddMessageEmbed","href":"server/EchoHub.Server.Data.Migrations.AddMessageEmbed.html","topicHref":"server/EchoHub.Server.Data.Migrations.AddMessageEmbed.html","topicUid":"EchoHub.Server.Data.Migrations.AddMessageEmbed","type":"Class"},{"name":"AddModerationRoles","href":"server/EchoHub.Server.Data.Migrations.AddModerationRoles.html","topicHref":"server/EchoHub.Server.Data.Migrations.AddModerationRoles.html","topicUid":"EchoHub.Server.Data.Migrations.AddModerationRoles","type":"Class"},{"name":"InitialCreate","href":"server/EchoHub.Server.Data.Migrations.InitialCreate.html","topicHref":"server/EchoHub.Server.Data.Migrations.InitialCreate.html","topicUid":"EchoHub.Server.Data.Migrations.InitialCreate","type":"Class"}]},{"name":"EchoHub.Server.Hubs","href":"server/EchoHub.Server.Hubs.html","topicHref":"server/EchoHub.Server.Hubs.html","topicUid":"EchoHub.Server.Hubs","type":"Namespace","items":[{"name":"ChatHub","href":"server/EchoHub.Server.Hubs.ChatHub.html","topicHref":"server/EchoHub.Server.Hubs.ChatHub.html","topicUid":"EchoHub.Server.Hubs.ChatHub","type":"Class"}]},{"name":"EchoHub.Server.Services","href":"server/EchoHub.Server.Services.html","topicHref":"server/EchoHub.Server.Services.html","topicUid":"EchoHub.Server.Services","type":"Namespace","items":[{"name":"ChannelService","href":"server/EchoHub.Server.Services.ChannelService.html","topicHref":"server/EchoHub.Server.Services.ChannelService.html","topicUid":"EchoHub.Server.Services.ChannelService","type":"Class"},{"name":"ChatService","href":"server/EchoHub.Server.Services.ChatService.html","topicHref":"server/EchoHub.Server.Services.ChatService.html","topicUid":"EchoHub.Server.Services.ChatService","type":"Class"},{"name":"FileCleanupService","href":"server/EchoHub.Server.Services.FileCleanupService.html","topicHref":"server/EchoHub.Server.Services.FileCleanupService.html","topicUid":"EchoHub.Server.Services.FileCleanupService","type":"Class"},{"name":"FileStorageService","href":"server/EchoHub.Server.Services.FileStorageService.html","topicHref":"server/EchoHub.Server.Services.FileStorageService.html","topicUid":"EchoHub.Server.Services.FileStorageService","type":"Class"},{"name":"FileValidationHelper","href":"server/EchoHub.Server.Services.FileValidationHelper.html","topicHref":"server/EchoHub.Server.Services.FileValidationHelper.html","topicUid":"EchoHub.Server.Services.FileValidationHelper","type":"Class"},{"name":"ImageToAsciiService","href":"server/EchoHub.Server.Services.ImageToAsciiService.html","topicHref":"server/EchoHub.Server.Services.ImageToAsciiService.html","topicUid":"EchoHub.Server.Services.ImageToAsciiService","type":"Class"},{"name":"LinkEmbedService","href":"server/EchoHub.Server.Services.LinkEmbedService.html","topicHref":"server/EchoHub.Server.Services.LinkEmbedService.html","topicUid":"EchoHub.Server.Services.LinkEmbedService","type":"Class"},{"name":"MessageEncryptionService","href":"server/EchoHub.Server.Services.MessageEncryptionService.html","topicHref":"server/EchoHub.Server.Services.MessageEncryptionService.html","topicUid":"EchoHub.Server.Services.MessageEncryptionService","type":"Class"},{"name":"MuteExpirationService","href":"server/EchoHub.Server.Services.MuteExpirationService.html","topicHref":"server/EchoHub.Server.Services.MuteExpirationService.html","topicUid":"EchoHub.Server.Services.MuteExpirationService","type":"Class"},{"name":"PresenceTracker","href":"server/EchoHub.Server.Services.PresenceTracker.html","topicHref":"server/EchoHub.Server.Services.PresenceTracker.html","topicUid":"EchoHub.Server.Services.PresenceTracker","type":"Class"},{"name":"ServerDirectoryService","href":"server/EchoHub.Server.Services.ServerDirectoryService.html","topicHref":"server/EchoHub.Server.Services.ServerDirectoryService.html","topicUid":"EchoHub.Server.Services.ServerDirectoryService","type":"Class"},{"name":"SignalRBroadcaster","href":"server/EchoHub.Server.Services.SignalRBroadcaster.html","topicHref":"server/EchoHub.Server.Services.SignalRBroadcaster.html","topicUid":"EchoHub.Server.Services.SignalRBroadcaster","type":"Class"},{"name":"UserService","href":"server/EchoHub.Server.Services.UserService.html","topicHref":"server/EchoHub.Server.Services.UserService.html","topicUid":"EchoHub.Server.Services.UserService","type":"Class"}]},{"name":"EchoHub.Server.Setup","href":"server/EchoHub.Server.Setup.html","topicHref":"server/EchoHub.Server.Setup.html","topicUid":"EchoHub.Server.Setup","type":"Namespace","items":[{"name":"DataMigrationService","href":"server/EchoHub.Server.Setup.DataMigrationService.html","topicHref":"server/EchoHub.Server.Setup.DataMigrationService.html","topicUid":"EchoHub.Server.Setup.DataMigrationService","type":"Class"},{"name":"DatabaseSetup","href":"server/EchoHub.Server.Setup.DatabaseSetup.html","topicHref":"server/EchoHub.Server.Setup.DatabaseSetup.html","topicUid":"EchoHub.Server.Setup.DatabaseSetup","type":"Class"},{"name":"FirstRunSetup","href":"server/EchoHub.Server.Setup.FirstRunSetup.html","topicHref":"server/EchoHub.Server.Setup.FirstRunSetup.html","topicUid":"EchoHub.Server.Setup.FirstRunSetup","type":"Class"}]}]},{"name":"Articles","includedFrom":"~/api/server-articles/toc.yml","items":[{"name":"Overview","href":"server-articles/index.html","topicHref":"server-articles/index.html"}]}]},{"name":"Server.Irc","items":[{"name":"API Reference","includedFrom":"~/_api_meta/server-irc/toc.yml","items":[{"name":"EchoHub.Server.Irc","href":"server-irc/EchoHub.Server.Irc.html","topicHref":"server-irc/EchoHub.Server.Irc.html","topicUid":"EchoHub.Server.Irc","type":"Namespace","items":[{"name":"IrcBroadcaster","href":"server-irc/EchoHub.Server.Irc.IrcBroadcaster.html","topicHref":"server-irc/EchoHub.Server.Irc.IrcBroadcaster.html","topicUid":"EchoHub.Server.Irc.IrcBroadcaster","type":"Class"},{"name":"IrcClientConnection","href":"server-irc/EchoHub.Server.Irc.IrcClientConnection.html","topicHref":"server-irc/EchoHub.Server.Irc.IrcClientConnection.html","topicUid":"EchoHub.Server.Irc.IrcClientConnection","type":"Class"},{"name":"IrcCommandHandler","href":"server-irc/EchoHub.Server.Irc.IrcCommandHandler.html","topicHref":"server-irc/EchoHub.Server.Irc.IrcCommandHandler.html","topicUid":"EchoHub.Server.Irc.IrcCommandHandler","type":"Class"},{"name":"IrcGatewayService","href":"server-irc/EchoHub.Server.Irc.IrcGatewayService.html","topicHref":"server-irc/EchoHub.Server.Irc.IrcGatewayService.html","topicUid":"EchoHub.Server.Irc.IrcGatewayService","type":"Class"},{"name":"IrcMessage","href":"server-irc/EchoHub.Server.Irc.IrcMessage.html","topicHref":"server-irc/EchoHub.Server.Irc.IrcMessage.html","topicUid":"EchoHub.Server.Irc.IrcMessage","type":"Class"},{"name":"IrcMessageFormatter","href":"server-irc/EchoHub.Server.Irc.IrcMessageFormatter.html","topicHref":"server-irc/EchoHub.Server.Irc.IrcMessageFormatter.html","topicUid":"EchoHub.Server.Irc.IrcMessageFormatter","type":"Class"},{"name":"IrcNumericReply","href":"server-irc/EchoHub.Server.Irc.IrcNumericReply.html","topicHref":"server-irc/EchoHub.Server.Irc.IrcNumericReply.html","topicUid":"EchoHub.Server.Irc.IrcNumericReply","type":"Class"},{"name":"IrcOptions","href":"server-irc/EchoHub.Server.Irc.IrcOptions.html","topicHref":"server-irc/EchoHub.Server.Irc.IrcOptions.html","topicUid":"EchoHub.Server.Irc.IrcOptions","type":"Class"},{"name":"IrcServiceExtensions","href":"server-irc/EchoHub.Server.Irc.IrcServiceExtensions.html","topicHref":"server-irc/EchoHub.Server.Irc.IrcServiceExtensions.html","topicUid":"EchoHub.Server.Irc.IrcServiceExtensions","type":"Class"}]}]}]}]} +{"items":[{"name":"Client","items":[{"name":"API Reference","includedFrom":"~/_api_meta/client/toc.yml","items":[{"name":"EchoHub.Client","href":"client/EchoHub.Client.html","topicHref":"client/EchoHub.Client.html","topicUid":"EchoHub.Client","type":"Namespace","items":[{"name":"AppOrchestrator","href":"client/EchoHub.Client.AppOrchestrator.html","topicHref":"client/EchoHub.Client.AppOrchestrator.html","topicUid":"EchoHub.Client.AppOrchestrator","type":"Class"}]},{"name":"EchoHub.Client.Commands","href":"client/EchoHub.Client.Commands.html","topicHref":"client/EchoHub.Client.Commands.html","topicUid":"EchoHub.Client.Commands","type":"Namespace","items":[{"name":"CommandHandler","href":"client/EchoHub.Client.Commands.CommandHandler.html","topicHref":"client/EchoHub.Client.Commands.CommandHandler.html","topicUid":"EchoHub.Client.Commands.CommandHandler","type":"Class"},{"name":"CommandResult","href":"client/EchoHub.Client.Commands.CommandResult.html","topicHref":"client/EchoHub.Client.Commands.CommandResult.html","topicUid":"EchoHub.Client.Commands.CommandResult","type":"Class"}]},{"name":"EchoHub.Client.Config","href":"client/EchoHub.Client.Config.html","topicHref":"client/EchoHub.Client.Config.html","topicUid":"EchoHub.Client.Config","type":"Namespace","items":[{"name":"AccountPreset","href":"client/EchoHub.Client.Config.AccountPreset.html","topicHref":"client/EchoHub.Client.Config.AccountPreset.html","topicUid":"EchoHub.Client.Config.AccountPreset","type":"Class"},{"name":"ClientConfig","href":"client/EchoHub.Client.Config.ClientConfig.html","topicHref":"client/EchoHub.Client.Config.ClientConfig.html","topicUid":"EchoHub.Client.Config.ClientConfig","type":"Class"},{"name":"ConfigManager","href":"client/EchoHub.Client.Config.ConfigManager.html","topicHref":"client/EchoHub.Client.Config.ConfigManager.html","topicUid":"EchoHub.Client.Config.ConfigManager","type":"Class"},{"name":"NotificationConfig","href":"client/EchoHub.Client.Config.NotificationConfig.html","topicHref":"client/EchoHub.Client.Config.NotificationConfig.html","topicUid":"EchoHub.Client.Config.NotificationConfig","type":"Class"},{"name":"SavedServer","href":"client/EchoHub.Client.Config.SavedServer.html","topicHref":"client/EchoHub.Client.Config.SavedServer.html","topicUid":"EchoHub.Client.Config.SavedServer","type":"Class"}]},{"name":"EchoHub.Client.Services","href":"client/EchoHub.Client.Services.html","topicHref":"client/EchoHub.Client.Services.html","topicUid":"EchoHub.Client.Services","type":"Namespace","items":[{"name":"ApiClient","href":"client/EchoHub.Client.Services.ApiClient.html","topicHref":"client/EchoHub.Client.Services.ApiClient.html","topicUid":"EchoHub.Client.Services.ApiClient","type":"Class"},{"name":"AsyncRunner","href":"client/EchoHub.Client.Services.AsyncRunner.html","topicHref":"client/EchoHub.Client.Services.AsyncRunner.html","topicUid":"EchoHub.Client.Services.AsyncRunner","type":"Class"},{"name":"AudioPlaybackService","href":"client/EchoHub.Client.Services.AudioPlaybackService.html","topicHref":"client/EchoHub.Client.Services.AudioPlaybackService.html","topicUid":"EchoHub.Client.Services.AudioPlaybackService","type":"Class"},{"name":"BackupInfo","href":"client/EchoHub.Client.Services.BackupInfo.html","topicHref":"client/EchoHub.Client.Services.BackupInfo.html","topicUid":"EchoHub.Client.Services.BackupInfo","type":"Class"},{"name":"ClientEncryptionService","href":"client/EchoHub.Client.Services.ClientEncryptionService.html","topicHref":"client/EchoHub.Client.Services.ClientEncryptionService.html","topicUid":"EchoHub.Client.Services.ClientEncryptionService","type":"Class"},{"name":"EchoHubConnection","href":"client/EchoHub.Client.Services.EchoHubConnection.html","topicHref":"client/EchoHub.Client.Services.EchoHubConnection.html","topicUid":"EchoHub.Client.Services.EchoHubConnection","type":"Class"},{"name":"NotificationSoundService","href":"client/EchoHub.Client.Services.NotificationSoundService.html","topicHref":"client/EchoHub.Client.Services.NotificationSoundService.html","topicUid":"EchoHub.Client.Services.NotificationSoundService","type":"Class"},{"name":"PathSetup","href":"client/EchoHub.Client.Services.PathSetup.html","topicHref":"client/EchoHub.Client.Services.PathSetup.html","topicUid":"EchoHub.Client.Services.PathSetup","type":"Class"},{"name":"UpdateBackupService","href":"client/EchoHub.Client.Services.UpdateBackupService.html","topicHref":"client/EchoHub.Client.Services.UpdateBackupService.html","topicUid":"EchoHub.Client.Services.UpdateBackupService","type":"Class"},{"name":"UpdateChecker","href":"client/EchoHub.Client.Services.UpdateChecker.html","topicHref":"client/EchoHub.Client.Services.UpdateChecker.html","topicUid":"EchoHub.Client.Services.UpdateChecker","type":"Class"}]},{"name":"EchoHub.Client.Themes","href":"client/EchoHub.Client.Themes.html","topicHref":"client/EchoHub.Client.Themes.html","topicUid":"EchoHub.Client.Themes","type":"Namespace","items":[{"name":"Theme","href":"client/EchoHub.Client.Themes.Theme.html","topicHref":"client/EchoHub.Client.Themes.Theme.html","topicUid":"EchoHub.Client.Themes.Theme","type":"Class"},{"name":"ThemeColors","href":"client/EchoHub.Client.Themes.ThemeColors.html","topicHref":"client/EchoHub.Client.Themes.ThemeColors.html","topicUid":"EchoHub.Client.Themes.ThemeColors","type":"Class"},{"name":"ThemeManager","href":"client/EchoHub.Client.Themes.ThemeManager.html","topicHref":"client/EchoHub.Client.Themes.ThemeManager.html","topicUid":"EchoHub.Client.Themes.ThemeManager","type":"Class"}]},{"name":"EchoHub.Client.UI","href":"client/EchoHub.Client.UI.html","topicHref":"client/EchoHub.Client.UI.html","topicUid":"EchoHub.Client.UI","type":"Namespace","items":[{"name":"MainWindow","href":"client/EchoHub.Client.UI.MainWindow.html","topicHref":"client/EchoHub.Client.UI.MainWindow.html","topicUid":"EchoHub.Client.UI.MainWindow","type":"Class"}]},{"name":"EchoHub.Client.UI.Chat","href":"client/EchoHub.Client.UI.Chat.html","topicHref":"client/EchoHub.Client.UI.Chat.html","topicUid":"EchoHub.Client.UI.Chat","type":"Namespace","items":[{"name":"ChatColors","href":"client/EchoHub.Client.UI.Chat.ChatColors.html","topicHref":"client/EchoHub.Client.UI.Chat.ChatColors.html","topicUid":"EchoHub.Client.UI.Chat.ChatColors","type":"Class"},{"name":"ChatLine","href":"client/EchoHub.Client.UI.Chat.ChatLine.html","topicHref":"client/EchoHub.Client.UI.Chat.ChatLine.html","topicUid":"EchoHub.Client.UI.Chat.ChatLine","type":"Class"},{"name":"ChatListSource","href":"client/EchoHub.Client.UI.Chat.ChatListSource.html","topicHref":"client/EchoHub.Client.UI.Chat.ChatListSource.html","topicUid":"EchoHub.Client.UI.Chat.ChatListSource","type":"Class"},{"name":"ChatMessageManager","href":"client/EchoHub.Client.UI.Chat.ChatMessageManager.html","topicHref":"client/EchoHub.Client.UI.Chat.ChatMessageManager.html","topicUid":"EchoHub.Client.UI.Chat.ChatMessageManager","type":"Class"},{"name":"ChatSegment","href":"client/EchoHub.Client.UI.Chat.ChatSegment.html","topicHref":"client/EchoHub.Client.UI.Chat.ChatSegment.html","topicUid":"EchoHub.Client.UI.Chat.ChatSegment","type":"Class"}]},{"name":"EchoHub.Client.UI.Dialogs","href":"client/EchoHub.Client.UI.Dialogs.html","topicHref":"client/EchoHub.Client.UI.Dialogs.html","topicUid":"EchoHub.Client.UI.Dialogs","type":"Namespace","items":[{"name":"AudioPlayerDialog","href":"client/EchoHub.Client.UI.Dialogs.AudioPlayerDialog.html","topicHref":"client/EchoHub.Client.UI.Dialogs.AudioPlayerDialog.html","topicUid":"EchoHub.Client.UI.Dialogs.AudioPlayerDialog","type":"Class"},{"name":"ConnectDialog","href":"client/EchoHub.Client.UI.Dialogs.ConnectDialog.html","topicHref":"client/EchoHub.Client.UI.Dialogs.ConnectDialog.html","topicUid":"EchoHub.Client.UI.Dialogs.ConnectDialog","type":"Class"},{"name":"ConnectDialogResult","href":"client/EchoHub.Client.UI.Dialogs.ConnectDialogResult.html","topicHref":"client/EchoHub.Client.UI.Dialogs.ConnectDialogResult.html","topicUid":"EchoHub.Client.UI.Dialogs.ConnectDialogResult","type":"Class"},{"name":"CreateChannelDialog","href":"client/EchoHub.Client.UI.Dialogs.CreateChannelDialog.html","topicHref":"client/EchoHub.Client.UI.Dialogs.CreateChannelDialog.html","topicUid":"EchoHub.Client.UI.Dialogs.CreateChannelDialog","type":"Class"},{"name":"CreateChannelResult","href":"client/EchoHub.Client.UI.Dialogs.CreateChannelResult.html","topicHref":"client/EchoHub.Client.UI.Dialogs.CreateChannelResult.html","topicUid":"EchoHub.Client.UI.Dialogs.CreateChannelResult","type":"Class"},{"name":"ProfileAction","href":"client/EchoHub.Client.UI.Dialogs.ProfileAction.html","topicHref":"client/EchoHub.Client.UI.Dialogs.ProfileAction.html","topicUid":"EchoHub.Client.UI.Dialogs.ProfileAction","type":"Enum"},{"name":"ProfileEditDialog","href":"client/EchoHub.Client.UI.Dialogs.ProfileEditDialog.html","topicHref":"client/EchoHub.Client.UI.Dialogs.ProfileEditDialog.html","topicUid":"EchoHub.Client.UI.Dialogs.ProfileEditDialog","type":"Class"},{"name":"ProfileEditResult","href":"client/EchoHub.Client.UI.Dialogs.ProfileEditResult.html","topicHref":"client/EchoHub.Client.UI.Dialogs.ProfileEditResult.html","topicUid":"EchoHub.Client.UI.Dialogs.ProfileEditResult","type":"Class"},{"name":"ProfileViewDialog","href":"client/EchoHub.Client.UI.Dialogs.ProfileViewDialog.html","topicHref":"client/EchoHub.Client.UI.Dialogs.ProfileViewDialog.html","topicUid":"EchoHub.Client.UI.Dialogs.ProfileViewDialog","type":"Class"},{"name":"SearchDialog","href":"client/EchoHub.Client.UI.Dialogs.SearchDialog.html","topicHref":"client/EchoHub.Client.UI.Dialogs.SearchDialog.html","topicUid":"EchoHub.Client.UI.Dialogs.SearchDialog","type":"Class"},{"name":"SearchResult","href":"client/EchoHub.Client.UI.Dialogs.SearchResult.html","topicHref":"client/EchoHub.Client.UI.Dialogs.SearchResult.html","topicUid":"EchoHub.Client.UI.Dialogs.SearchResult","type":"Class"},{"name":"SearchResultType","href":"client/EchoHub.Client.UI.Dialogs.SearchResultType.html","topicHref":"client/EchoHub.Client.UI.Dialogs.SearchResultType.html","topicUid":"EchoHub.Client.UI.Dialogs.SearchResultType","type":"Enum"},{"name":"StatusDialog","href":"client/EchoHub.Client.UI.Dialogs.StatusDialog.html","topicHref":"client/EchoHub.Client.UI.Dialogs.StatusDialog.html","topicUid":"EchoHub.Client.UI.Dialogs.StatusDialog","type":"Class"},{"name":"StatusDialogResult","href":"client/EchoHub.Client.UI.Dialogs.StatusDialogResult.html","topicHref":"client/EchoHub.Client.UI.Dialogs.StatusDialogResult.html","topicUid":"EchoHub.Client.UI.Dialogs.StatusDialogResult","type":"Class"},{"name":"UpdateConfirmDialog","href":"client/EchoHub.Client.UI.Dialogs.UpdateConfirmDialog.html","topicHref":"client/EchoHub.Client.UI.Dialogs.UpdateConfirmDialog.html","topicUid":"EchoHub.Client.UI.Dialogs.UpdateConfirmDialog","type":"Class"},{"name":"UpdateProgressDialog","href":"client/EchoHub.Client.UI.Dialogs.UpdateProgressDialog.html","topicHref":"client/EchoHub.Client.UI.Dialogs.UpdateProgressDialog.html","topicUid":"EchoHub.Client.UI.Dialogs.UpdateProgressDialog","type":"Class"}]},{"name":"EchoHub.Client.UI.Helpers","href":"client/EchoHub.Client.UI.Helpers.html","topicHref":"client/EchoHub.Client.UI.Helpers.html","topicUid":"EchoHub.Client.UI.Helpers","type":"Namespace","items":[{"name":"EmojiHelper","href":"client/EchoHub.Client.UI.Helpers.EmojiHelper.html","topicHref":"client/EchoHub.Client.UI.Helpers.EmojiHelper.html","topicUid":"EchoHub.Client.UI.Helpers.EmojiHelper","type":"Class"},{"name":"HexColorHelper","href":"client/EchoHub.Client.UI.Helpers.HexColorHelper.html","topicHref":"client/EchoHub.Client.UI.Helpers.HexColorHelper.html","topicUid":"EchoHub.Client.UI.Helpers.HexColorHelper","type":"Class"}]},{"name":"EchoHub.Client.UI.ListSources","href":"client/EchoHub.Client.UI.ListSources.html","topicHref":"client/EchoHub.Client.UI.ListSources.html","topicUid":"EchoHub.Client.UI.ListSources","type":"Namespace","items":[{"name":"ChannelListSource","href":"client/EchoHub.Client.UI.ListSources.ChannelListSource.html","topicHref":"client/EchoHub.Client.UI.ListSources.ChannelListSource.html","topicUid":"EchoHub.Client.UI.ListSources.ChannelListSource","type":"Class"},{"name":"SearchListSource","href":"client/EchoHub.Client.UI.ListSources.SearchListSource.html","topicHref":"client/EchoHub.Client.UI.ListSources.SearchListSource.html","topicUid":"EchoHub.Client.UI.ListSources.SearchListSource","type":"Class"},{"name":"UserListSource","href":"client/EchoHub.Client.UI.ListSources.UserListSource.html","topicHref":"client/EchoHub.Client.UI.ListSources.UserListSource.html","topicUid":"EchoHub.Client.UI.ListSources.UserListSource","type":"Class"}]}]},{"name":"Articles","includedFrom":"~/api/client-articles/toc.yml","items":[{"name":"Overview","href":"client-articles/index.html","topicHref":"client-articles/index.html"}]}]},{"name":"Core","items":[{"name":"API Reference","includedFrom":"~/_api_meta/core/toc.yml","items":[{"name":"EchoHub.Core.Constants","href":"core/EchoHub.Core.Constants.html","topicHref":"core/EchoHub.Core.Constants.html","topicUid":"EchoHub.Core.Constants","type":"Namespace","items":[{"name":"HubConstants","href":"core/EchoHub.Core.Constants.HubConstants.html","topicHref":"core/EchoHub.Core.Constants.HubConstants.html","topicUid":"EchoHub.Core.Constants.HubConstants","type":"Class"},{"name":"ValidationConstants","href":"core/EchoHub.Core.Constants.ValidationConstants.html","topicHref":"core/EchoHub.Core.Constants.ValidationConstants.html","topicUid":"EchoHub.Core.Constants.ValidationConstants","type":"Class"}]},{"name":"EchoHub.Core.Contracts","href":"core/EchoHub.Core.Contracts.html","topicHref":"core/EchoHub.Core.Contracts.html","topicUid":"EchoHub.Core.Contracts","type":"Namespace","items":[{"name":"ChannelListItem","href":"core/EchoHub.Core.Contracts.ChannelListItem.html","topicHref":"core/EchoHub.Core.Contracts.ChannelListItem.html","topicUid":"EchoHub.Core.Contracts.ChannelListItem","type":"Class"},{"name":"IChannelService","href":"core/EchoHub.Core.Contracts.IChannelService.html","topicHref":"core/EchoHub.Core.Contracts.IChannelService.html","topicUid":"EchoHub.Core.Contracts.IChannelService","type":"Interface"},{"name":"IChatBroadcaster","href":"core/EchoHub.Core.Contracts.IChatBroadcaster.html","topicHref":"core/EchoHub.Core.Contracts.IChatBroadcaster.html","topicUid":"EchoHub.Core.Contracts.IChatBroadcaster","type":"Interface"},{"name":"IChatService","href":"core/EchoHub.Core.Contracts.IChatService.html","topicHref":"core/EchoHub.Core.Contracts.IChatService.html","topicUid":"EchoHub.Core.Contracts.IChatService","type":"Interface"},{"name":"IEchoHubClient","href":"core/EchoHub.Core.Contracts.IEchoHubClient.html","topicHref":"core/EchoHub.Core.Contracts.IEchoHubClient.html","topicUid":"EchoHub.Core.Contracts.IEchoHubClient","type":"Interface"},{"name":"IMessageEncryptionService","href":"core/EchoHub.Core.Contracts.IMessageEncryptionService.html","topicHref":"core/EchoHub.Core.Contracts.IMessageEncryptionService.html","topicUid":"EchoHub.Core.Contracts.IMessageEncryptionService","type":"Interface"},{"name":"IUserService","href":"core/EchoHub.Core.Contracts.IUserService.html","topicHref":"core/EchoHub.Core.Contracts.IUserService.html","topicUid":"EchoHub.Core.Contracts.IUserService","type":"Interface"}]},{"name":"EchoHub.Core.DTOs","href":"core/EchoHub.Core.DTOs.html","topicHref":"core/EchoHub.Core.DTOs.html","topicUid":"EchoHub.Core.DTOs","type":"Namespace","items":[{"name":"ApiResponse","href":"core/EchoHub.Core.DTOs.ApiResponse.html","topicHref":"core/EchoHub.Core.DTOs.ApiResponse.html","topicUid":"EchoHub.Core.DTOs.ApiResponse","type":"Class"},{"name":"ApiResponse","href":"core/EchoHub.Core.DTOs.ApiResponse-1.html","topicHref":"core/EchoHub.Core.DTOs.ApiResponse-1.html","topicUid":"EchoHub.Core.DTOs.ApiResponse`1","type":"Class"},{"name":"AssignRoleRequest","href":"core/EchoHub.Core.DTOs.AssignRoleRequest.html","topicHref":"core/EchoHub.Core.DTOs.AssignRoleRequest.html","topicUid":"EchoHub.Core.DTOs.AssignRoleRequest","type":"Class"},{"name":"AvatarUploadResponse","href":"core/EchoHub.Core.DTOs.AvatarUploadResponse.html","topicHref":"core/EchoHub.Core.DTOs.AvatarUploadResponse.html","topicUid":"EchoHub.Core.DTOs.AvatarUploadResponse","type":"Class"},{"name":"BanRequest","href":"core/EchoHub.Core.DTOs.BanRequest.html","topicHref":"core/EchoHub.Core.DTOs.BanRequest.html","topicUid":"EchoHub.Core.DTOs.BanRequest","type":"Class"},{"name":"ChannelDto","href":"core/EchoHub.Core.DTOs.ChannelDto.html","topicHref":"core/EchoHub.Core.DTOs.ChannelDto.html","topicUid":"EchoHub.Core.DTOs.ChannelDto","type":"Class"},{"name":"ChannelError","href":"core/EchoHub.Core.DTOs.ChannelError.html","topicHref":"core/EchoHub.Core.DTOs.ChannelError.html","topicUid":"EchoHub.Core.DTOs.ChannelError","type":"Enum"},{"name":"ChannelOperationResult","href":"core/EchoHub.Core.DTOs.ChannelOperationResult.html","topicHref":"core/EchoHub.Core.DTOs.ChannelOperationResult.html","topicUid":"EchoHub.Core.DTOs.ChannelOperationResult","type":"Class"},{"name":"CreateChannelRequest","href":"core/EchoHub.Core.DTOs.CreateChannelRequest.html","topicHref":"core/EchoHub.Core.DTOs.CreateChannelRequest.html","topicUid":"EchoHub.Core.DTOs.CreateChannelRequest","type":"Class"},{"name":"EmbedDto","href":"core/EchoHub.Core.DTOs.EmbedDto.html","topicHref":"core/EchoHub.Core.DTOs.EmbedDto.html","topicUid":"EchoHub.Core.DTOs.EmbedDto","type":"Class"},{"name":"EncryptionKeyResponse","href":"core/EchoHub.Core.DTOs.EncryptionKeyResponse.html","topicHref":"core/EchoHub.Core.DTOs.EncryptionKeyResponse.html","topicUid":"EchoHub.Core.DTOs.EncryptionKeyResponse","type":"Class"},{"name":"ErrorResponse","href":"core/EchoHub.Core.DTOs.ErrorResponse.html","topicHref":"core/EchoHub.Core.DTOs.ErrorResponse.html","topicUid":"EchoHub.Core.DTOs.ErrorResponse","type":"Class"},{"name":"JoinChannelResult","href":"core/EchoHub.Core.DTOs.JoinChannelResult.html","topicHref":"core/EchoHub.Core.DTOs.JoinChannelResult.html","topicUid":"EchoHub.Core.DTOs.JoinChannelResult","type":"Class"},{"name":"KickRequest","href":"core/EchoHub.Core.DTOs.KickRequest.html","topicHref":"core/EchoHub.Core.DTOs.KickRequest.html","topicUid":"EchoHub.Core.DTOs.KickRequest","type":"Class"},{"name":"LoginRequest","href":"core/EchoHub.Core.DTOs.LoginRequest.html","topicHref":"core/EchoHub.Core.DTOs.LoginRequest.html","topicUid":"EchoHub.Core.DTOs.LoginRequest","type":"Class"},{"name":"LoginResponse","href":"core/EchoHub.Core.DTOs.LoginResponse.html","topicHref":"core/EchoHub.Core.DTOs.LoginResponse.html","topicUid":"EchoHub.Core.DTOs.LoginResponse","type":"Class"},{"name":"MessageDto","href":"core/EchoHub.Core.DTOs.MessageDto.html","topicHref":"core/EchoHub.Core.DTOs.MessageDto.html","topicUid":"EchoHub.Core.DTOs.MessageDto","type":"Class"},{"name":"MuteRequest","href":"core/EchoHub.Core.DTOs.MuteRequest.html","topicHref":"core/EchoHub.Core.DTOs.MuteRequest.html","topicUid":"EchoHub.Core.DTOs.MuteRequest","type":"Class"},{"name":"PaginatedResponse","href":"core/EchoHub.Core.DTOs.PaginatedResponse-1.html","topicHref":"core/EchoHub.Core.DTOs.PaginatedResponse-1.html","topicUid":"EchoHub.Core.DTOs.PaginatedResponse`1","type":"Class"},{"name":"RefreshRequest","href":"core/EchoHub.Core.DTOs.RefreshRequest.html","topicHref":"core/EchoHub.Core.DTOs.RefreshRequest.html","topicUid":"EchoHub.Core.DTOs.RefreshRequest","type":"Class"},{"name":"RegisterRequest","href":"core/EchoHub.Core.DTOs.RegisterRequest.html","topicHref":"core/EchoHub.Core.DTOs.RegisterRequest.html","topicUid":"EchoHub.Core.DTOs.RegisterRequest","type":"Class"},{"name":"SendMessageRequest","href":"core/EchoHub.Core.DTOs.SendMessageRequest.html","topicHref":"core/EchoHub.Core.DTOs.SendMessageRequest.html","topicUid":"EchoHub.Core.DTOs.SendMessageRequest","type":"Class"},{"name":"SendUrlRequest","href":"core/EchoHub.Core.DTOs.SendUrlRequest.html","topicHref":"core/EchoHub.Core.DTOs.SendUrlRequest.html","topicUid":"EchoHub.Core.DTOs.SendUrlRequest","type":"Class"},{"name":"ServerStatusDto","href":"core/EchoHub.Core.DTOs.ServerStatusDto.html","topicHref":"core/EchoHub.Core.DTOs.ServerStatusDto.html","topicUid":"EchoHub.Core.DTOs.ServerStatusDto","type":"Class"},{"name":"UpdateProfileRequest","href":"core/EchoHub.Core.DTOs.UpdateProfileRequest.html","topicHref":"core/EchoHub.Core.DTOs.UpdateProfileRequest.html","topicUid":"EchoHub.Core.DTOs.UpdateProfileRequest","type":"Class"},{"name":"UpdateStatusRequest","href":"core/EchoHub.Core.DTOs.UpdateStatusRequest.html","topicHref":"core/EchoHub.Core.DTOs.UpdateStatusRequest.html","topicUid":"EchoHub.Core.DTOs.UpdateStatusRequest","type":"Class"},{"name":"UpdateTopicRequest","href":"core/EchoHub.Core.DTOs.UpdateTopicRequest.html","topicHref":"core/EchoHub.Core.DTOs.UpdateTopicRequest.html","topicUid":"EchoHub.Core.DTOs.UpdateTopicRequest","type":"Class"},{"name":"UserDto","href":"core/EchoHub.Core.DTOs.UserDto.html","topicHref":"core/EchoHub.Core.DTOs.UserDto.html","topicUid":"EchoHub.Core.DTOs.UserDto","type":"Class"},{"name":"UserError","href":"core/EchoHub.Core.DTOs.UserError.html","topicHref":"core/EchoHub.Core.DTOs.UserError.html","topicUid":"EchoHub.Core.DTOs.UserError","type":"Enum"},{"name":"UserOperationResult","href":"core/EchoHub.Core.DTOs.UserOperationResult.html","topicHref":"core/EchoHub.Core.DTOs.UserOperationResult.html","topicUid":"EchoHub.Core.DTOs.UserOperationResult","type":"Class"},{"name":"UserPresenceDto","href":"core/EchoHub.Core.DTOs.UserPresenceDto.html","topicHref":"core/EchoHub.Core.DTOs.UserPresenceDto.html","topicUid":"EchoHub.Core.DTOs.UserPresenceDto","type":"Class"},{"name":"UserProfileDto","href":"core/EchoHub.Core.DTOs.UserProfileDto.html","topicHref":"core/EchoHub.Core.DTOs.UserProfileDto.html","topicUid":"EchoHub.Core.DTOs.UserProfileDto","type":"Class"}]},{"name":"EchoHub.Core.Models","href":"core/EchoHub.Core.Models.html","topicHref":"core/EchoHub.Core.Models.html","topicUid":"EchoHub.Core.Models","type":"Namespace","items":[{"name":"Channel","href":"core/EchoHub.Core.Models.Channel.html","topicHref":"core/EchoHub.Core.Models.Channel.html","topicUid":"EchoHub.Core.Models.Channel","type":"Class"},{"name":"ChannelMembership","href":"core/EchoHub.Core.Models.ChannelMembership.html","topicHref":"core/EchoHub.Core.Models.ChannelMembership.html","topicUid":"EchoHub.Core.Models.ChannelMembership","type":"Class"},{"name":"Message","href":"core/EchoHub.Core.Models.Message.html","topicHref":"core/EchoHub.Core.Models.Message.html","topicUid":"EchoHub.Core.Models.Message","type":"Class"},{"name":"MessageType","href":"core/EchoHub.Core.Models.MessageType.html","topicHref":"core/EchoHub.Core.Models.MessageType.html","topicUid":"EchoHub.Core.Models.MessageType","type":"Enum"},{"name":"RefreshToken","href":"core/EchoHub.Core.Models.RefreshToken.html","topicHref":"core/EchoHub.Core.Models.RefreshToken.html","topicUid":"EchoHub.Core.Models.RefreshToken","type":"Class"},{"name":"ServerRole","href":"core/EchoHub.Core.Models.ServerRole.html","topicHref":"core/EchoHub.Core.Models.ServerRole.html","topicUid":"EchoHub.Core.Models.ServerRole","type":"Enum"},{"name":"User","href":"core/EchoHub.Core.Models.User.html","topicHref":"core/EchoHub.Core.Models.User.html","topicUid":"EchoHub.Core.Models.User","type":"Class"},{"name":"UserStatus","href":"core/EchoHub.Core.Models.UserStatus.html","topicHref":"core/EchoHub.Core.Models.UserStatus.html","topicUid":"EchoHub.Core.Models.UserStatus","type":"Enum"}]}]},{"name":"Articles","includedFrom":"~/api/core-articles/toc.yml","items":[{"name":"Overview","href":"core-articles/index.html","topicHref":"core-articles/index.html"}]}]},{"name":"Server","items":[{"name":"API Reference","includedFrom":"~/_api_meta/server/toc.yml","items":[{"name":"EchoHub.Server.Auth","href":"server/EchoHub.Server.Auth.html","topicHref":"server/EchoHub.Server.Auth.html","topicUid":"EchoHub.Server.Auth","type":"Namespace","items":[{"name":"JwtTokenService","href":"server/EchoHub.Server.Auth.JwtTokenService.html","topicHref":"server/EchoHub.Server.Auth.JwtTokenService.html","topicUid":"EchoHub.Server.Auth.JwtTokenService","type":"Class"}]},{"name":"EchoHub.Server.Controllers","href":"server/EchoHub.Server.Controllers.html","topicHref":"server/EchoHub.Server.Controllers.html","topicUid":"EchoHub.Server.Controllers","type":"Namespace","items":[{"name":"AuthController","href":"server/EchoHub.Server.Controllers.AuthController.html","topicHref":"server/EchoHub.Server.Controllers.AuthController.html","topicUid":"EchoHub.Server.Controllers.AuthController","type":"Class"},{"name":"ChannelsController","href":"server/EchoHub.Server.Controllers.ChannelsController.html","topicHref":"server/EchoHub.Server.Controllers.ChannelsController.html","topicUid":"EchoHub.Server.Controllers.ChannelsController","type":"Class"},{"name":"FilesController","href":"server/EchoHub.Server.Controllers.FilesController.html","topicHref":"server/EchoHub.Server.Controllers.FilesController.html","topicUid":"EchoHub.Server.Controllers.FilesController","type":"Class"},{"name":"ModerationController","href":"server/EchoHub.Server.Controllers.ModerationController.html","topicHref":"server/EchoHub.Server.Controllers.ModerationController.html","topicUid":"EchoHub.Server.Controllers.ModerationController","type":"Class"},{"name":"ServerController","href":"server/EchoHub.Server.Controllers.ServerController.html","topicHref":"server/EchoHub.Server.Controllers.ServerController.html","topicUid":"EchoHub.Server.Controllers.ServerController","type":"Class"},{"name":"UsersController","href":"server/EchoHub.Server.Controllers.UsersController.html","topicHref":"server/EchoHub.Server.Controllers.UsersController.html","topicUid":"EchoHub.Server.Controllers.UsersController","type":"Class"}]},{"name":"EchoHub.Server.Data","href":"server/EchoHub.Server.Data.html","topicHref":"server/EchoHub.Server.Data.html","topicUid":"EchoHub.Server.Data","type":"Namespace","items":[{"name":"EchoHubDbContext","href":"server/EchoHub.Server.Data.EchoHubDbContext.html","topicHref":"server/EchoHub.Server.Data.EchoHubDbContext.html","topicUid":"EchoHub.Server.Data.EchoHubDbContext","type":"Class"}]},{"name":"EchoHub.Server.Data.Migrations","href":"server/EchoHub.Server.Data.Migrations.html","topicHref":"server/EchoHub.Server.Data.Migrations.html","topicUid":"EchoHub.Server.Data.Migrations","type":"Namespace","items":[{"name":"AddAttachmentFileSize","href":"server/EchoHub.Server.Data.Migrations.AddAttachmentFileSize.html","topicHref":"server/EchoHub.Server.Data.Migrations.AddAttachmentFileSize.html","topicUid":"EchoHub.Server.Data.Migrations.AddAttachmentFileSize","type":"Class"},{"name":"AddChannelIsPublic","href":"server/EchoHub.Server.Data.Migrations.AddChannelIsPublic.html","topicHref":"server/EchoHub.Server.Data.Migrations.AddChannelIsPublic.html","topicUid":"EchoHub.Server.Data.Migrations.AddChannelIsPublic","type":"Class"},{"name":"AddChannelMembership","href":"server/EchoHub.Server.Data.Migrations.AddChannelMembership.html","topicHref":"server/EchoHub.Server.Data.Migrations.AddChannelMembership.html","topicUid":"EchoHub.Server.Data.Migrations.AddChannelMembership","type":"Class"},{"name":"AddEncryptionSupport","href":"server/EchoHub.Server.Data.Migrations.AddEncryptionSupport.html","topicHref":"server/EchoHub.Server.Data.Migrations.AddEncryptionSupport.html","topicUid":"EchoHub.Server.Data.Migrations.AddEncryptionSupport","type":"Class"},{"name":"AddMessageEmbed","href":"server/EchoHub.Server.Data.Migrations.AddMessageEmbed.html","topicHref":"server/EchoHub.Server.Data.Migrations.AddMessageEmbed.html","topicUid":"EchoHub.Server.Data.Migrations.AddMessageEmbed","type":"Class"},{"name":"AddModerationRoles","href":"server/EchoHub.Server.Data.Migrations.AddModerationRoles.html","topicHref":"server/EchoHub.Server.Data.Migrations.AddModerationRoles.html","topicUid":"EchoHub.Server.Data.Migrations.AddModerationRoles","type":"Class"},{"name":"InitialCreate","href":"server/EchoHub.Server.Data.Migrations.InitialCreate.html","topicHref":"server/EchoHub.Server.Data.Migrations.InitialCreate.html","topicUid":"EchoHub.Server.Data.Migrations.InitialCreate","type":"Class"}]},{"name":"EchoHub.Server.Hubs","href":"server/EchoHub.Server.Hubs.html","topicHref":"server/EchoHub.Server.Hubs.html","topicUid":"EchoHub.Server.Hubs","type":"Namespace","items":[{"name":"ChatHub","href":"server/EchoHub.Server.Hubs.ChatHub.html","topicHref":"server/EchoHub.Server.Hubs.ChatHub.html","topicUid":"EchoHub.Server.Hubs.ChatHub","type":"Class"}]},{"name":"EchoHub.Server.Services","href":"server/EchoHub.Server.Services.html","topicHref":"server/EchoHub.Server.Services.html","topicUid":"EchoHub.Server.Services","type":"Namespace","items":[{"name":"ChannelService","href":"server/EchoHub.Server.Services.ChannelService.html","topicHref":"server/EchoHub.Server.Services.ChannelService.html","topicUid":"EchoHub.Server.Services.ChannelService","type":"Class"},{"name":"ChatService","href":"server/EchoHub.Server.Services.ChatService.html","topicHref":"server/EchoHub.Server.Services.ChatService.html","topicUid":"EchoHub.Server.Services.ChatService","type":"Class"},{"name":"FileCleanupService","href":"server/EchoHub.Server.Services.FileCleanupService.html","topicHref":"server/EchoHub.Server.Services.FileCleanupService.html","topicUid":"EchoHub.Server.Services.FileCleanupService","type":"Class"},{"name":"FileStorageService","href":"server/EchoHub.Server.Services.FileStorageService.html","topicHref":"server/EchoHub.Server.Services.FileStorageService.html","topicUid":"EchoHub.Server.Services.FileStorageService","type":"Class"},{"name":"FileValidationHelper","href":"server/EchoHub.Server.Services.FileValidationHelper.html","topicHref":"server/EchoHub.Server.Services.FileValidationHelper.html","topicUid":"EchoHub.Server.Services.FileValidationHelper","type":"Class"},{"name":"ImageToAsciiService","href":"server/EchoHub.Server.Services.ImageToAsciiService.html","topicHref":"server/EchoHub.Server.Services.ImageToAsciiService.html","topicUid":"EchoHub.Server.Services.ImageToAsciiService","type":"Class"},{"name":"LinkEmbedService","href":"server/EchoHub.Server.Services.LinkEmbedService.html","topicHref":"server/EchoHub.Server.Services.LinkEmbedService.html","topicUid":"EchoHub.Server.Services.LinkEmbedService","type":"Class"},{"name":"MessageEncryptionService","href":"server/EchoHub.Server.Services.MessageEncryptionService.html","topicHref":"server/EchoHub.Server.Services.MessageEncryptionService.html","topicUid":"EchoHub.Server.Services.MessageEncryptionService","type":"Class"},{"name":"MuteExpirationService","href":"server/EchoHub.Server.Services.MuteExpirationService.html","topicHref":"server/EchoHub.Server.Services.MuteExpirationService.html","topicUid":"EchoHub.Server.Services.MuteExpirationService","type":"Class"},{"name":"PresenceTracker","href":"server/EchoHub.Server.Services.PresenceTracker.html","topicHref":"server/EchoHub.Server.Services.PresenceTracker.html","topicUid":"EchoHub.Server.Services.PresenceTracker","type":"Class"},{"name":"ServerDirectoryService","href":"server/EchoHub.Server.Services.ServerDirectoryService.html","topicHref":"server/EchoHub.Server.Services.ServerDirectoryService.html","topicUid":"EchoHub.Server.Services.ServerDirectoryService","type":"Class"},{"name":"SignalRBroadcaster","href":"server/EchoHub.Server.Services.SignalRBroadcaster.html","topicHref":"server/EchoHub.Server.Services.SignalRBroadcaster.html","topicUid":"EchoHub.Server.Services.SignalRBroadcaster","type":"Class"},{"name":"UserService","href":"server/EchoHub.Server.Services.UserService.html","topicHref":"server/EchoHub.Server.Services.UserService.html","topicUid":"EchoHub.Server.Services.UserService","type":"Class"}]},{"name":"EchoHub.Server.Setup","href":"server/EchoHub.Server.Setup.html","topicHref":"server/EchoHub.Server.Setup.html","topicUid":"EchoHub.Server.Setup","type":"Namespace","items":[{"name":"DataMigrationService","href":"server/EchoHub.Server.Setup.DataMigrationService.html","topicHref":"server/EchoHub.Server.Setup.DataMigrationService.html","topicUid":"EchoHub.Server.Setup.DataMigrationService","type":"Class"},{"name":"DatabaseSetup","href":"server/EchoHub.Server.Setup.DatabaseSetup.html","topicHref":"server/EchoHub.Server.Setup.DatabaseSetup.html","topicUid":"EchoHub.Server.Setup.DatabaseSetup","type":"Class"},{"name":"FirstRunSetup","href":"server/EchoHub.Server.Setup.FirstRunSetup.html","topicHref":"server/EchoHub.Server.Setup.FirstRunSetup.html","topicUid":"EchoHub.Server.Setup.FirstRunSetup","type":"Class"}]}]},{"name":"Articles","includedFrom":"~/api/server-articles/toc.yml","items":[{"name":"Overview","href":"server-articles/index.html","topicHref":"server-articles/index.html"}]}]},{"name":"Server.Irc","items":[{"name":"API Reference","includedFrom":"~/_api_meta/server-irc/toc.yml","items":[{"name":"EchoHub.Server.Irc","href":"server-irc/EchoHub.Server.Irc.html","topicHref":"server-irc/EchoHub.Server.Irc.html","topicUid":"EchoHub.Server.Irc","type":"Namespace","items":[{"name":"IrcBroadcaster","href":"server-irc/EchoHub.Server.Irc.IrcBroadcaster.html","topicHref":"server-irc/EchoHub.Server.Irc.IrcBroadcaster.html","topicUid":"EchoHub.Server.Irc.IrcBroadcaster","type":"Class"},{"name":"IrcClientConnection","href":"server-irc/EchoHub.Server.Irc.IrcClientConnection.html","topicHref":"server-irc/EchoHub.Server.Irc.IrcClientConnection.html","topicUid":"EchoHub.Server.Irc.IrcClientConnection","type":"Class"},{"name":"IrcCommandHandler","href":"server-irc/EchoHub.Server.Irc.IrcCommandHandler.html","topicHref":"server-irc/EchoHub.Server.Irc.IrcCommandHandler.html","topicUid":"EchoHub.Server.Irc.IrcCommandHandler","type":"Class"},{"name":"IrcGatewayService","href":"server-irc/EchoHub.Server.Irc.IrcGatewayService.html","topicHref":"server-irc/EchoHub.Server.Irc.IrcGatewayService.html","topicUid":"EchoHub.Server.Irc.IrcGatewayService","type":"Class"},{"name":"IrcMessage","href":"server-irc/EchoHub.Server.Irc.IrcMessage.html","topicHref":"server-irc/EchoHub.Server.Irc.IrcMessage.html","topicUid":"EchoHub.Server.Irc.IrcMessage","type":"Class"},{"name":"IrcMessageFormatter","href":"server-irc/EchoHub.Server.Irc.IrcMessageFormatter.html","topicHref":"server-irc/EchoHub.Server.Irc.IrcMessageFormatter.html","topicUid":"EchoHub.Server.Irc.IrcMessageFormatter","type":"Class"},{"name":"IrcNumericReply","href":"server-irc/EchoHub.Server.Irc.IrcNumericReply.html","topicHref":"server-irc/EchoHub.Server.Irc.IrcNumericReply.html","topicUid":"EchoHub.Server.Irc.IrcNumericReply","type":"Class"},{"name":"IrcOptions","href":"server-irc/EchoHub.Server.Irc.IrcOptions.html","topicHref":"server-irc/EchoHub.Server.Irc.IrcOptions.html","topicUid":"EchoHub.Server.Irc.IrcOptions","type":"Class"},{"name":"IrcServiceExtensions","href":"server-irc/EchoHub.Server.Irc.IrcServiceExtensions.html","topicHref":"server-irc/EchoHub.Server.Irc.IrcServiceExtensions.html","topicUid":"EchoHub.Server.Irc.IrcServiceExtensions","type":"Class"}]}]}]}]} diff --git a/articles/getting-started.html b/articles/getting-started.html index 42a5bad..f2d437c 100644 --- a/articles/getting-started.html +++ b/articles/getting-started.html @@ -95,7 +95,7 @@
    curl -sSfL https://raw.githubusercontent.com/HueByte/EchoHub/master/scripts/install.sh | sh
     

    To install a specific version or to a custom directory:

    -
    curl -sSfL .../install.sh | sh -s -- --version 0.2.8
    +
    curl -sSfL .../install.sh | sh -s -- --version 0.2.10
     curl -sSfL .../install.sh | sh -s -- --install-dir /opt/echohub
     

    Manual Download

    diff --git a/changelog/index.html b/changelog/index.html index 17fcfb1..07a8271 100644 --- a/changelog/index.html +++ b/changelog/index.html @@ -90,7 +90,8 @@

    Release history for EchoHub.

    Releases

      -
    • v0.2.9 - Linux/macOS Single-File Publish Fix
    • +
    • v0.2.10 - Command Palette, Infinite History Scroll & Auto-Updater Fixes
    • +
    • v0.2.9 - Install Script & Chocolatey Fixes
    • v0.2.8 - Docker Support, IRC Account Creation & BOM Fix
    • v0.2.7 - User List Fix & Terminal.Gui NuGet Migration
    • v0.2.6 - Major Refactoring & Code Organization
    • diff --git a/changelog/toc.html b/changelog/toc.html index 2ff76ec..35d553d 100644 --- a/changelog/toc.html +++ b/changelog/toc.html @@ -15,6 +15,9 @@
    • Overview
    • +
    • + v0.2.10 +
    • v0.2.9
    • diff --git a/changelog/toc.json b/changelog/toc.json index 33d1de4..809b6fe 100644 --- a/changelog/toc.json +++ b/changelog/toc.json @@ -1,2 +1,2 @@ -{"items":[{"name":"Overview","href":"index.html","topicHref":"index.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.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"}]} diff --git a/changelog/v0.2.10.html b/changelog/v0.2.10.html new file mode 100644 index 0000000..03e6676 --- /dev/null +++ b/changelog/v0.2.10.html @@ -0,0 +1,136 @@ + + + + + v0.2.10 | EchoHub Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + +
      + +
      +
      +
      +
      +
      Table of Contents
      + +
      +
      + +
      +
      +
      + +
      +
      + + + +
      + +
      +

      v0.2.10

      + +

      Follow-up patch release for v0.2.9 addressing auto-updater regressions, adding a command palette, infinite-scroll message history, and input polish.

      +

      New Features

      +
        +
      • Command palette — press Ctrl+K from the message input (or anywhere in the main window) to open a searchable dialog for navigating channels and triggering app actions (connect, disconnect, logout, profile, status, create/delete channel, saved servers, toggle users panel, check for updates, quit). Fuzzy matches against both the label and the underlying key so typing ch surfaces channel actions alongside #channel entries
      • +
      • Scroll-to-load message history — scrolling to the top of a channel now fetches the next batch of older messages in the background (previously only the most recent 100 messages were available). Duplicate messages are filtered by ID, a per-channel guard prevents concurrent fetches, and the scroll position is preserved after the prepend so your reading position doesn't jump
      • +
      +

      Bug Fixes

      +
        +
      • Fix update progress dialog freezing / not repainting — progress callbacks now run on the UI thread so the download and extraction percentage actually updates while an update is in progress
      • +
      • Fix pre-update backup failing when a Serilog-held log file is locked — UpdateBackupService now enumerates files manually, skips the logs/ directory and .log files, and logs-and-continues on IOException/UnauthorizedAccessException instead of aborting the whole backup
      • +
      • Simplify update progress dispatch — remove redundant Application.Invoke wrappers around progress updates that are already called from the UI thread (introduced while fixing the freeze above)
      • +
      • Fix cursor position being reset to the start of the line when auto-completing commands in the CLI app — insertion point is now moved to the end of the completed text
      • +
      • Fix notification sounds crashing or being silently dropped when several arrive in quick succession — playback is now serialized through a semaphore that's held for the duration of each sound (using PlaybackFinished with a 10s safety timeout) and always released in finally, so back-to-back notifications queue up and play in order instead of racing the underlying audio player (fixes #20)
      • +
      +

      Refactoring

      +
        +
      • Move search-dialog dispatch out of MainWindow into AppOrchestratorMainWindow now just raises OnSearchRequested, keeping the view dumb and letting the orchestrator own navigation/action routing
      • +
      • ChatHub.GetChannelHistory and IChatService.GetChannelHistoryAsync gain an additional offset parameter for paginated history loading (defaults to 0 — existing callers are unaffected)
      • +
      • ValidationConstants.MaxHistoryCount raised from 100 to 200 so power users and paginated fetches can request larger batches; DefaultHistoryCount stays at 100
      • +
      + +
      + + + + + +
      + +
      + +
      +
      + +
      + + + + diff --git a/changelog/v0.2.9.html b/changelog/v0.2.9.html index 5f425d0..b8da79f 100644 --- a/changelog/v0.2.9.html +++ b/changelog/v0.2.9.html @@ -90,6 +90,24 @@

      Bug Fixes

      • Fix Linux/macOS client install — enable single-file publish so the install script copies one self-contained binary instead of just the native host (which failed with "does not exist: EchoHub.Client.dll")
      • +
      • Fix Chocolatey install path on Windows — chocolateyInstall.ps1 was joining the install directory and executable name into a single segment, producing an invalid target path
      • +
      • Fix Chocolatey package metadata — corrected GitHub repository URLs and documentation URLs in echohub.nuspec that pointed at the wrong location
      • +
      • Fix double-click on "Public" checkbox in the Create Channel dialog accidentally submitting the dialog — checkbox toggle commands no longer bubble up to the dialog's default button
      • +
      +

      Documentation

      +
        +
      • Add a dedicated configuration guide (docs/articles/configuration.md) covering server settings, client settings, and environment overrides
      • +
      • Refresh README badges and reorganize the articles table of contents for better discoverability
      • +
      • Polish Docker, getting-started, and flow docs to match the current configuration surface
      • +
      +

      Dependencies

      +
        +
      • Bump Terminal.Gui to 2.0.0-develop.5043 (from 5039)
      • +
      +

      CI

      +
        +
      • Release workflow now publishes a single-file self-contained client binary for Linux and macOS so the install script works out-of-the-box
      • +
      • Chocolatey publishing step now triggers only when the package source actually changes and performs a proper version check against the feed before pushing
      diff --git a/index.json b/index.json index 8e78826..d449157 100644 --- a/index.json +++ b/index.json @@ -82,7 +82,7 @@ "api/client/EchoHub.Client.Services.EchoHubConnection.html": { "href": "api/client/EchoHub.Client.Services.EchoHubConnection.html", "title": "Class EchoHubConnection | EchoHub Documentation", - "summary": "Class EchoHubConnection Namespace EchoHub.Client.Services Assembly EchoHub.Client.dll public sealed class EchoHubConnection : IAsyncDisposable Inheritance object EchoHubConnection Implements IAsyncDisposable Inherited Members object.GetType() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors EchoHubConnection(string, ApiClient, ClientEncryptionService) public EchoHubConnection(string serverUrl, ApiClient apiClient, ClientEncryptionService encryption) Parameters serverUrl string apiClient ApiClient encryption ClientEncryptionService Properties IsConnected public bool IsConnected { get; } Property Value bool Methods ConnectAsync() public Task ConnectAsync() Returns Task DisconnectAsync() public Task DisconnectAsync() Returns Task DisposeAsync() public ValueTask DisposeAsync() Returns ValueTask GetHistoryAsync(string, int) public Task> GetHistoryAsync(string channelName, int count = 100) Parameters channelName string count int Returns Task> GetOnlineUsersAsync(string) public Task> GetOnlineUsersAsync(string channelName) Parameters channelName string Returns Task> JoinChannelAsync(string) public Task> JoinChannelAsync(string channelName) Parameters channelName string Returns Task> LeaveChannelAsync(string) public Task LeaveChannelAsync(string channelName) Parameters channelName string Returns Task SendMessageAsync(string, string) public Task SendMessageAsync(string channelName, string content) Parameters channelName string content string Returns Task UpdateStatusAsync(UserStatus, string?) public Task UpdateStatusAsync(UserStatus status, string? statusMessage = null) Parameters status UserStatus statusMessage string Returns Task Events OnChannelNuked public event Action? OnChannelNuked Event Type Action OnChannelUpdated public event Action? OnChannelUpdated Event Type Action OnConnectionStateChanged public event Action? OnConnectionStateChanged Event Type Action OnError public event Action? OnError Event Type Action OnForceDisconnect public event Action? OnForceDisconnect Event Type Action OnMessageDeleted public event Action? OnMessageDeleted Event Type Action OnMessageReceived public event Action? OnMessageReceived Event Type Action OnReconnected public event Action? OnReconnected Event Type Action OnUserBanned public event Action? OnUserBanned Event Type Action OnUserJoined public event Action? OnUserJoined Event Type Action OnUserKicked public event Action? OnUserKicked Event Type Action OnUserLeft public event Action? OnUserLeft Event Type Action OnUserStatusChanged public event Action? OnUserStatusChanged Event Type Action" + "summary": "Class EchoHubConnection Namespace EchoHub.Client.Services Assembly EchoHub.Client.dll public sealed class EchoHubConnection : IAsyncDisposable Inheritance object EchoHubConnection Implements IAsyncDisposable Inherited Members object.GetType() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors EchoHubConnection(string, ApiClient, ClientEncryptionService) public EchoHubConnection(string serverUrl, ApiClient apiClient, ClientEncryptionService encryption) Parameters serverUrl string apiClient ApiClient encryption ClientEncryptionService Properties IsConnected public bool IsConnected { get; } Property Value bool Methods ConnectAsync() public Task ConnectAsync() Returns Task DisconnectAsync() public Task DisconnectAsync() Returns Task DisposeAsync() public ValueTask DisposeAsync() Returns ValueTask GetHistoryAsync(string, int, int) public Task> GetHistoryAsync(string channelName, int count = 100, int offset = 0) Parameters channelName string count int offset int Returns Task> GetOnlineUsersAsync(string) public Task> GetOnlineUsersAsync(string channelName) Parameters channelName string Returns Task> JoinChannelAsync(string) public Task> JoinChannelAsync(string channelName) Parameters channelName string Returns Task> LeaveChannelAsync(string) public Task LeaveChannelAsync(string channelName) Parameters channelName string Returns Task SendMessageAsync(string, string) public Task SendMessageAsync(string channelName, string content) Parameters channelName string content string Returns Task UpdateStatusAsync(UserStatus, string?) public Task UpdateStatusAsync(UserStatus status, string? statusMessage = null) Parameters status UserStatus statusMessage string Returns Task Events OnChannelNuked public event Action? OnChannelNuked Event Type Action OnChannelUpdated public event Action? OnChannelUpdated Event Type Action OnConnectionStateChanged public event Action? OnConnectionStateChanged Event Type Action OnError public event Action? OnError Event Type Action OnForceDisconnect public event Action? OnForceDisconnect Event Type Action OnMessageDeleted public event Action? OnMessageDeleted Event Type Action OnMessageReceived public event Action? OnMessageReceived Event Type Action OnReconnected public event Action? OnReconnected Event Type Action OnUserBanned public event Action? OnUserBanned Event Type Action OnUserJoined public event Action? OnUserJoined Event Type Action OnUserKicked public event Action? OnUserKicked Event Type Action OnUserLeft public event Action? OnUserLeft Event Type Action OnUserStatusChanged public event Action? OnUserStatusChanged Event Type Action" }, "api/client/EchoHub.Client.Services.NotificationSoundService.html": { "href": "api/client/EchoHub.Client.Services.NotificationSoundService.html", @@ -147,7 +147,7 @@ "api/client/EchoHub.Client.UI.Chat.ChatMessageManager.html": { "href": "api/client/EchoHub.Client.UI.Chat.ChatMessageManager.html", "title": "Class ChatMessageManager | EchoHub Documentation", - "summary": "Class ChatMessageManager Namespace EchoHub.Client.UI.Chat Assembly EchoHub.Client.dll Owns chat message storage, formatting, and mutation. Fires MessagesChanged when a channel's message list is modified so the UI layer can refresh. public sealed class ChatMessageManager Inheritance object ChatMessageManager Inherited Members object.GetType() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors ChatMessageManager() public ChatMessageManager() Properties CurrentChannel The currently active channel (used for unread tracking and @mention detection). public string CurrentChannel { get; set; } Property Value string CurrentUser public string CurrentUser { get; } Property Value string Methods AddMessage(MessageDto) Format and store a received message. Increments unread count if not the active channel. public void AddMessage(MessageDto message) Parameters message MessageDto AddStatusMessage(string, string, string) Add a status change message to a channel with colored styling. public void AddStatusMessage(string channelName, string username, string status) Parameters channelName string username string status string AddSystemMessage(string, string) Add a system/informational message to a channel with colored styling. public void AddSystemMessage(string channelName, string text) Parameters channelName string text string ClearAll() Reset all message state (used on disconnect). public void ClearAll() ClearChannelMessages(string) Clear all messages from a specific channel. public void ClearChannelMessages(string channelName) Parameters channelName string ClearUnread(string) public void ClearUnread(string channelName) Parameters channelName string GetMessages(string) public List? GetMessages(string channelName) Parameters channelName string Returns List GetUnreadCount(string) public int GetUnreadCount(string channelName) Parameters channelName string Returns int LoadHistory(string, List) Load historical messages into a channel, replacing any existing messages. public void LoadHistory(string channelName, List messages) Parameters channelName string messages List RemoveMessage(string, Guid) Remove all lines associated with a specific message ID. public void RemoveMessage(string channelName, Guid messageId) Parameters channelName string messageId Guid SetChatWidth(int) public void SetChatWidth(int width) Parameters width int SetCurrentUser(string) public void SetCurrentUser(string username) Parameters username string Events MessagesChanged Fired after any mutation to a channel's messages. Parameter is the channel name. public event Action? MessagesChanged Event Type Action" + "summary": "Class ChatMessageManager Namespace EchoHub.Client.UI.Chat Assembly EchoHub.Client.dll Owns chat message storage, formatting, and mutation. Fires MessagesChanged when a channel's message list is modified so the UI layer can refresh. public sealed class ChatMessageManager Inheritance object ChatMessageManager Inherited Members object.GetType() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors ChatMessageManager() public ChatMessageManager() Properties CurrentChannel The currently active channel (used for unread tracking and @mention detection). public string CurrentChannel { get; set; } Property Value string CurrentUser public string CurrentUser { get; } Property Value string Methods AddMessage(MessageDto) Format and store a received message. Increments unread count if not the active channel. public void AddMessage(MessageDto message) Parameters message MessageDto AddStatusMessage(string, string, string) Add a status change message to a channel with colored styling. public void AddStatusMessage(string channelName, string username, string status) Parameters channelName string username string status string AddSystemMessage(string, string) Add a system/informational message to a channel with colored styling. public void AddSystemMessage(string channelName, string text) Parameters channelName string text string ClearAll() Reset all message state (used on disconnect). public void ClearAll() ClearChannelMessages(string) Clear all messages from a specific channel. public void ClearChannelMessages(string channelName) Parameters channelName string ClearUnread(string) public void ClearUnread(string channelName) Parameters channelName string GetMessages(string) public List? GetMessages(string channelName) Parameters channelName string Returns List GetUnreadCount(string) public int GetUnreadCount(string channelName) Parameters channelName string Returns int LoadHistory(string, List) Load historical messages into a channel, replacing any existing messages. public void LoadHistory(string channelName, List messages) Parameters channelName string messages List PrependHistory(string, List) Prepend older messages at the front of a channel's buffer, skipping any that are already present. Fires HistoryPrepended when new lines are actually inserted. public void PrependHistory(string channelName, List olderMessages) Parameters channelName string olderMessages List RemoveMessage(string, Guid) Remove all lines associated with a specific message ID. public void RemoveMessage(string channelName, Guid messageId) Parameters channelName string messageId Guid SetChatWidth(int) public void SetChatWidth(int width) Parameters width int SetCurrentUser(string) public void SetCurrentUser(string username) Parameters username string Events HistoryPrepended Fired after older messages are prepended to a channel's buffer. Parameter is the channel name. public event Action? HistoryPrepended Event Type Action MessagesChanged Fired after any mutation to a channel's messages. Parameter is the channel name. public event Action? MessagesChanged Event Type Action" }, "api/client/EchoHub.Client.UI.Chat.ChatSegment.html": { "href": "api/client/EchoHub.Client.UI.Chat.ChatSegment.html", @@ -204,6 +204,21 @@ "title": "Class ProfileViewDialog | EchoHub Documentation", "summary": "Class ProfileViewDialog Namespace EchoHub.Client.UI.Dialogs Assembly EchoHub.Client.dll Dialog for viewing a user's server profile. Shows Edit Profile / Set Status buttons when viewing own profile. public sealed class ProfileViewDialog Inheritance object ProfileViewDialog Inherited Members object.GetType() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors ProfileViewDialog() public ProfileViewDialog() Methods Show(IApplication, UserProfileDto?) Show a read-only profile view for another user. public static void Show(IApplication app, UserProfileDto? profile) Parameters app IApplication profile UserProfileDto ShowOwn(IApplication, UserProfileDto?, UserStatus, string?) Show the profile view for the current user with action buttons. Returns the action the user selected. public static ProfileAction ShowOwn(IApplication app, UserProfileDto? profile, UserStatus currentStatus, string? currentStatusMessage) Parameters app IApplication profile UserProfileDto currentStatus UserStatus currentStatusMessage string Returns ProfileAction" }, + "api/client/EchoHub.Client.UI.Dialogs.SearchDialog.html": { + "href": "api/client/EchoHub.Client.UI.Dialogs.SearchDialog.html", + "title": "Class SearchDialog | EchoHub Documentation", + "summary": "Class SearchDialog Namespace EchoHub.Client.UI.Dialogs Assembly EchoHub.Client.dll Command-palette style search dialog (Ctrl+K) for navigating channels and triggering app actions. public static class SearchDialog Inheritance object SearchDialog Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Methods Show(IApplication, IReadOnlyList) public static SearchResult? Show(IApplication app, IReadOnlyList channels) Parameters app IApplication channels IReadOnlyList Returns SearchResult" + }, + "api/client/EchoHub.Client.UI.Dialogs.SearchResult.html": { + "href": "api/client/EchoHub.Client.UI.Dialogs.SearchResult.html", + "title": "Class SearchResult | EchoHub Documentation", + "summary": "Class SearchResult Namespace EchoHub.Client.UI.Dialogs Assembly EchoHub.Client.dll public record SearchResult : IEquatable Inheritance object SearchResult Implements IEquatable Inherited Members object.GetType() object.MemberwiseClone() object.Equals(object, object) object.ReferenceEquals(object, object) Constructors SearchResult(SearchResult) protected SearchResult(SearchResult original) Parameters original SearchResult SearchResult(SearchResultType, string, string) public SearchResult(SearchResultType Type, string Key, string Label) Parameters Type SearchResultType Key string Label string Properties EqualityContract protected virtual Type EqualityContract { get; } Property Value Type Key public string Key { get; init; } Property Value string Label public string Label { get; init; } Property Value string Type public SearchResultType Type { get; init; } Property Value SearchResultType Methods Deconstruct(out SearchResultType, out string, out string) public void Deconstruct(out SearchResultType Type, out string Key, out string Label) Parameters Type SearchResultType Key string Label string Equals(SearchResult?) public virtual bool Equals(SearchResult? other) Parameters other SearchResult Returns bool Equals(object?) public override bool Equals(object? obj) Parameters obj object Returns bool GetHashCode() public override int GetHashCode() Returns int PrintMembers(StringBuilder) protected virtual bool PrintMembers(StringBuilder builder) Parameters builder StringBuilder Returns bool ToString() public override string ToString() Returns string Operators operator ==(SearchResult?, SearchResult?) public static bool operator ==(SearchResult? left, SearchResult? right) Parameters left SearchResult right SearchResult Returns bool operator !=(SearchResult?, SearchResult?) public static bool operator !=(SearchResult? left, SearchResult? right) Parameters left SearchResult right SearchResult Returns bool" + }, + "api/client/EchoHub.Client.UI.Dialogs.SearchResultType.html": { + "href": "api/client/EchoHub.Client.UI.Dialogs.SearchResultType.html", + "title": "Enum SearchResultType | EchoHub Documentation", + "summary": "Enum SearchResultType Namespace EchoHub.Client.UI.Dialogs Assembly EchoHub.Client.dll public enum SearchResultType Fields Action = 1 Channel = 0" + }, "api/client/EchoHub.Client.UI.Dialogs.StatusDialog.html": { "href": "api/client/EchoHub.Client.UI.Dialogs.StatusDialog.html", "title": "Class StatusDialog | EchoHub Documentation", @@ -227,7 +242,7 @@ "api/client/EchoHub.Client.UI.Dialogs.html": { "href": "api/client/EchoHub.Client.UI.Dialogs.html", "title": "Namespace EchoHub.Client.UI.Dialogs | EchoHub Documentation", - "summary": "Namespace EchoHub.Client.UI.Dialogs Classes AudioPlayerDialog ConnectDialog A Terminal.Gui dialog for entering server connection and authentication details. Includes a saved servers selector when saved servers are available. ConnectDialogResult Result returned from the connect dialog. CreateChannelDialog CreateChannelResult ProfileEditDialog A Terminal.Gui dialog for editing the user's profile (display name, bio, nickname color). ProfileEditResult Result returned from the profile edit dialog. ProfileViewDialog Dialog for viewing a user's server profile. Shows Edit Profile / Set Status buttons when viewing own profile. StatusDialog A Terminal.Gui dialog for setting the user's status and status message. StatusDialogResult Result returned from the status dialog. UpdateConfirmDialog UpdateProgressDialog Enums ProfileAction Action selected by the user in their own profile dialog." + "summary": "Namespace EchoHub.Client.UI.Dialogs Classes AudioPlayerDialog ConnectDialog A Terminal.Gui dialog for entering server connection and authentication details. Includes a saved servers selector when saved servers are available. ConnectDialogResult Result returned from the connect dialog. CreateChannelDialog CreateChannelResult ProfileEditDialog A Terminal.Gui dialog for editing the user's profile (display name, bio, nickname color). ProfileEditResult Result returned from the profile edit dialog. ProfileViewDialog Dialog for viewing a user's server profile. Shows Edit Profile / Set Status buttons when viewing own profile. SearchDialog Command-palette style search dialog (Ctrl+K) for navigating channels and triggering app actions. SearchResult StatusDialog A Terminal.Gui dialog for setting the user's status and status message. StatusDialogResult Result returned from the status dialog. UpdateConfirmDialog UpdateProgressDialog Enums ProfileAction Action selected by the user in their own profile dialog. SearchResultType" }, "api/client/EchoHub.Client.UI.Helpers.EmojiHelper.html": { "href": "api/client/EchoHub.Client.UI.Helpers.EmojiHelper.html", @@ -249,6 +264,11 @@ "title": "Class ChannelListSource | EchoHub Documentation", "summary": "Class ChannelListSource Namespace EchoHub.Client.UI.ListSources Assembly EchoHub.Client.dll Custom list data source for colored channel list rendering. Active channel gets a > indicator, unread channels are bright with a count badge. public class ChannelListSource : IListDataSource, IDisposable Inheritance object ChannelListSource Implements IListDataSource IDisposable Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors ChannelListSource() public ChannelListSource() Properties Count public int Count { get; } Property Value int MaxItemLength public int MaxItemLength { get; } Property Value int SuspendCollectionChangedEvent public bool SuspendCollectionChangedEvent { get; set; } Property Value bool Methods Dispose() public void Dispose() IsMarked(int) public bool IsMarked(int item) Parameters item int Returns bool Render(ListView, bool, int, int, int, int, int) public void Render(ListView listView, bool selected, int item, int col, int row, int width, int viewportX = 0) Parameters listView ListView selected bool item int col int row int width int viewportX int SetMark(int, bool) public void SetMark(int item, bool value) Parameters item int value bool ToList() public IList ToList() Returns IList Update(List, Dictionary, string) public void Update(List channels, Dictionary unread, string activeChannel) Parameters channels List unread Dictionary activeChannel string Events CollectionChanged public event NotifyCollectionChangedEventHandler? CollectionChanged Event Type NotifyCollectionChangedEventHandler" }, + "api/client/EchoHub.Client.UI.ListSources.SearchListSource.html": { + "href": "api/client/EchoHub.Client.UI.ListSources.SearchListSource.html", + "title": "Class SearchListSource | EchoHub Documentation", + "summary": "Class SearchListSource Namespace EchoHub.Client.UI.ListSources Assembly EchoHub.Client.dll List data source for the search dialog with filtering and colored rendering. public class SearchListSource : IListDataSource, IDisposable Inheritance object SearchListSource Implements IListDataSource IDisposable Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors SearchListSource(List) List data source for the search dialog with filtering and colored rendering. public SearchListSource(List items) Parameters items List Properties Count public int Count { get; } Property Value int MaxItemLength public int MaxItemLength { get; } Property Value int SuspendCollectionChangedEvent public bool SuspendCollectionChangedEvent { get; set; } Property Value bool Methods Dispose() public void Dispose() Filter(string) public void Filter(string query) Parameters query string GetItem(int) public SearchResult? GetItem(int index) Parameters index int Returns SearchResult IsMarked(int) public bool IsMarked(int item) Parameters item int Returns bool Render(ListView, bool, int, int, int, int, int) public void Render(ListView listView, bool selected, int item, int col, int row, int width, int viewportX = 0) Parameters listView ListView selected bool item int col int row int width int viewportX int SetMark(int, bool) public void SetMark(int item, bool value) Parameters item int value bool ToList() public IList ToList() Returns IList Events CollectionChanged public event NotifyCollectionChangedEventHandler? CollectionChanged Event Type NotifyCollectionChangedEventHandler" + }, "api/client/EchoHub.Client.UI.ListSources.UserListSource.html": { "href": "api/client/EchoHub.Client.UI.ListSources.UserListSource.html", "title": "Class UserListSource | EchoHub Documentation", @@ -257,12 +277,12 @@ "api/client/EchoHub.Client.UI.ListSources.html": { "href": "api/client/EchoHub.Client.UI.ListSources.html", "title": "Namespace EchoHub.Client.UI.ListSources | EchoHub Documentation", - "summary": "Namespace EchoHub.Client.UI.ListSources Classes ChannelListSource Custom list data source for colored channel list rendering. Active channel gets a > indicator, unread channels are bright with a count badge. UserListSource Custom list data source for the online users panel with per-user nickname colors." + "summary": "Namespace EchoHub.Client.UI.ListSources Classes ChannelListSource Custom list data source for colored channel list rendering. Active channel gets a > indicator, unread channels are bright with a count badge. SearchListSource List data source for the search dialog with filtering and colored rendering. UserListSource Custom list data source for the online users panel with per-user nickname colors." }, "api/client/EchoHub.Client.UI.MainWindow.html": { "href": "api/client/EchoHub.Client.UI.MainWindow.html", "title": "Class MainWindow | EchoHub Documentation", - "summary": "Class MainWindow Namespace EchoHub.Client.UI Assembly EchoHub.Client.dll Main Terminal.Gui window for the EchoHub chat client. public sealed class MainWindow : Runnable, IDisposable, IRunnable Inheritance object View Runnable MainWindow Implements IDisposable IRunnable Inherited Members Runnable.SetApp(IApplication) Runnable.SetIsRunning(bool) Runnable.RequestStop() Runnable.RaiseIsRunningChanging(bool, bool) Runnable.RaiseIsRunningChangedEvent(bool) Runnable.SetIsModal(bool) Runnable.RaiseIsModalChangedEvent(bool) Runnable.Result Runnable.IsRunning Runnable.IsModal Runnable.StopRequested Runnable.IsRunningChanging Runnable.IsRunningChanged Runnable.IsModalChanged View.NewMouseEvent(Mouse) View.RaiseMouseEvent(Mouse) View.GetAdornmentsThickness() View.GetSupportedCommands() View.InvokeCommands(Command[], ICommandBinding) View.InvokeCommand(Command, ICommandBinding) View.InvokeCommand(Command, ICommandContext) View.InvokeCommand(Command) View.SetContentSize(Size?) View.GetContentSize() View.GetWidthRequiredForSubViews() View.GetHeightRequiredForSubViews() View.ContentToScreen(in Point) View.ScreenToContent(in Point) View.ViewportToScreen(in Rectangle) View.ViewportToScreen(in Point) View.ViewportToScreen() View.ScreenToViewport(in Point) View.GetViewportOffsetFromFrame() View.ScrollVertical(int) View.ScrollHorizontal(int) View.Dispose() View.ToString() View.ToDebugString() View.BeginInit() View.EndInit() View.OnEnabledChanged() View.SetCursorNeedsUpdate() View.GetCurrentAttribute() View.GetAttributeForRole(VisualRole) View.SetAttribute(Attribute) View.SetAttributeForRole(VisualRole) View.GetClip() View.SetClip(Region) View.SetClipToScreen() View.ExcludeFromClip(Rectangle) View.ExcludeFromClip(Region) View.AddViewportToClip() View.Draw(DrawContext) View.DrawAdornments() View.ClearViewport(DrawContext) View.DrawText(DrawContext) View.DrawSubViews(DrawContext) View.RenderLineCanvas(DrawContext) View.Move(int, int) View.AddRune(Rune) View.AddRune(char) View.AddRune(int, int, Rune) View.AddStr(string) View.AddStr(int, int, string) View.DrawHotString(string, Attribute, Attribute) View.DrawHotString(string, bool) View.FillRect(Rectangle, Color?) View.FillRect(Rectangle, Rune) View.GetScheme() View.SetScheme(Scheme) View.GetSubViews(bool, bool, bool) View.Add(View) View.Add(params View[]) View.Remove(View) View.RemoveAll() View.RemoveAll() View.GetTopSuperView(View, View) View.IsInHierarchy(View, View, bool) View.MoveSubViewTowardsEnd(View) View.MoveSubViewToEnd(View) View.MoveSubViewTowardsStart(View) View.MoveSubViewToStart(View) View.AddKeyBindingsForHotKey(Key, Key, object) View.AssignHotKeysToSubViews() View.NewKeyDownEvent(Key) View.Contains(in Point) View.FrameToScreen() View.ScreenToFrame(in Point) View.Layout(Size) View.Layout() View.SetRelativeLayout(Size) View.SetNeedsLayout() View.GetContainerSize() View.GetViewsUnderLocation(in Point, ViewportSettingsFlags) View.AdvanceFocus(NavigationDirection, TabBehavior?) View.FocusDeepest(NavigationDirection, TabBehavior?) View.OnCanFocusChanged() View.ClearFocus() View.SetFocus() View.SetNeedsDraw() View.SetNeedsDraw(Rectangle) View.OnTextChanged() View.MouseBindings View.MouseHoldRepeat View.MousePositionTracking View.MouseState View.MouseHighlightStates View.Margin View.ShadowStyle View.Border View.BorderStyle View.Padding View.Arrangement View.DefaultAcceptView View.CommandsToBubbleUp View.ContentSizeTracksViewport View.ViewportSettings View.Viewport View.Data View.Id View.App View.IsInitialized View.Enabled View.Visible View.Title View.Cursor View.Diagnostics View.LineCanvas View.SuperViewRendersLineCanvas View.SchemeName View.HasScheme View.SubViews View.SuperView View.HotKey View.HotKeySpecifier View.AssignHotKeys View.UsedHotKeys View.KeyBindings View.HotKeyBindings View.Frame View.X View.Y View.Height View.Width View.NeedsLayout View.ValidatePosDim View.CanFocus View.Focused View.IsCurrentTop View.MostFocused View.HasFocus View.TabStop View.NeedsDraw View.HorizontalScrollBar View.VerticalScrollBar View.PreserveTrailingSpaces View.Text View.TextAlignment View.TextDirection View.TextFormatter View.VerticalTextAlignment View.MouseEnter View.MouseLeave View.MouseHoldRepeatChanging View.MouseHoldRepeatChanged View.MouseEvent View.MouseStateChanged View.BorderStyleChanged View.CommandNotBound View.Accepting View.Accepted View.Activating View.Activated View.HandlingHotKey View.HotKeyCommand View.ContentSizeChanging View.ContentSizeChanged View.ViewportChanged View.Disposing View.Initialized View.EnabledChanged View.VisibleChanging View.VisibleChanged View.TitleChanging View.TitleChanged View.GettingAttributeForRole View.ClearingViewport View.ClearedViewport View.DrawingText View.DrewText View.DrawingContent View.DrawingSubViews View.DrawComplete View.SchemeNameChanging View.SchemeNameChanged View.GettingScheme View.SchemeChanging View.SchemeChanged View.SuperViewChanging View.SuperViewChanged View.SubViewAdded View.SubViewRemoved View.Removed View.HotKeyChanged View.KeyDown View.KeyDownNotHandled View.FrameChanged View.HeightChanging View.HeightChanged View.WidthChanging View.WidthChanged View.SubViewLayout View.SubViewsLaidOut View.AdvancingFocus View.CanFocusChanged View.FocusedChanged View.HasFocusChanging View.HasFocusChanged View.TextChanged object.GetType() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors MainWindow(IApplication, ChatMessageManager) public MainWindow(IApplication app, ChatMessageManager messageManager) Parameters app IApplication messageManager ChatMessageManager Properties CurrentChannel Get the current channel name. public string CurrentChannel { get; } Property Value string Methods ApplyColorSchemes() Applies the currently registered color schemes to all views. Call after theme changes to refresh colors. public void ApplyColorSchemes() ClearAll() Clear all messages and channels (used on disconnect). public void ClearAll() EnsureChannelInList(string, bool?) Ensure a channel exists in the left panel list (used for private channels joined via /join). public void EnsureChannelInList(string channelName, bool? isPublic = null) Parameters channelName string isPublic bool? FocusInput() Focus the input field for typing. public void FocusInput() GetChannelNames() Get all channel names that have message buffers (for broadcasting status changes). public IReadOnlyList GetChannelNames() Returns IReadOnlyList RefreshMenuBar() Rebuilds and replaces the menu bar (e.g., after theme list changes). public void RefreshMenuBar() RemoveChannel(string) Remove a channel from the left panel list. public void RemoveChannel(string channelName) Parameters channelName string SetChannelTopic(string, string?) Update the topic for a specific channel. public void SetChannelTopic(string channelName, string? topic) Parameters channelName string topic string SetChannels(List) Set the list of available channels, storing topics, and refresh the channel list view. public void SetChannels(List channels) Parameters channels List SetCurrentUser(string) Set the current user name (delegates to message manager for @mention detection). public void SetCurrentUser(string username) Parameters username string ShowError(string) Show an error message to the user. public void ShowError(string message) Parameters message string SwitchToChannel(string) Switch the chat view to the given channel, resetting its unread count and updating the topic bar. public void SwitchToChannel(string channelName) Parameters channelName string ToggleUsersPanel() Toggle the online users panel visibility (F2). public void ToggleUsersPanel() UpdateOnlineUsers(List) Update the online users list display. public void UpdateOnlineUsers(List users) Parameters users List UpdateStatusBar(string) Update the connection status displayed in the status bar. public void UpdateStatusBar(string status) Parameters status string Events OnAudioPlayRequested Fired when the user activates (Enter/click) an audio message. Parameters: attachmentUrl, fileName. public event Action? OnAudioPlayRequested Event Type Action OnChannelJoinRequested Fired when the user activates a #channel reference in a message. Parameter is the channel name. public event Action? OnChannelJoinRequested Event Type Action OnChannelSelected Fired when the user selects a channel. Parameter is the channel name. public event Action? OnChannelSelected Event Type Action OnCheckForUpdatesRequested Fired when the user requests to check for updates. public event Action? OnCheckForUpdatesRequested Event Type Action OnConnectRequested Fired when the user requests to connect via the menu. public event Action? OnConnectRequested Event Type Action OnCreateChannelRequested Fired when the user requests to create a new channel. public event Action? OnCreateChannelRequested Event Type Action OnDeleteChannelRequested Fired when the user requests to delete the current channel. public event Action? OnDeleteChannelRequested Event Type Action OnDisconnectRequested Fired when the user requests to disconnect via the menu. public event Action? OnDisconnectRequested Event Type Action OnFileDownloadRequested Fired when the user activates (Enter/click) a file message. Parameters: attachmentUrl, fileName. public event Action? OnFileDownloadRequested Event Type Action OnLogoutRequested Fired when the user requests to logout (disconnect + revoke session). public event Action? OnLogoutRequested Event Type Action OnMessageSubmitted Fired when the user presses Enter in the input field. Parameters: channel name, message content. public event Action? OnMessageSubmitted Event Type Action OnProfileRequested Fired when the user requests to open their profile panel. public event Action? OnProfileRequested Event Type Action OnRollbackRequested Fired when the user requests to rollback to the previous version. public event Action? OnRollbackRequested Event Type Action OnSavedServersRequested Fired when the user requests to view saved servers. public event Action? OnSavedServersRequested Event Type Action OnStatusRequested Fired when the user requests to set their status. public event Action? OnStatusRequested Event Type Action OnThemeSelected Fired when the user selects a theme from the menu. Parameter is the theme name. public event Action? OnThemeSelected Event Type Action OnUserProfileRequested Fired when the user activates a username (in userlist or message). Parameter is the username. public event Action? OnUserProfileRequested Event Type Action" + "summary": "Class MainWindow Namespace EchoHub.Client.UI Assembly EchoHub.Client.dll Main Terminal.Gui window for the EchoHub chat client. public sealed class MainWindow : Runnable, IDisposable, IRunnable Inheritance object View Runnable MainWindow Implements IDisposable IRunnable Inherited Members Runnable.SetApp(IApplication) Runnable.SetIsRunning(bool) Runnable.RequestStop() Runnable.RaiseIsRunningChanging(bool, bool) Runnable.RaiseIsRunningChangedEvent(bool) Runnable.SetIsModal(bool) Runnable.RaiseIsModalChangedEvent(bool) Runnable.Result Runnable.IsRunning Runnable.IsModal Runnable.StopRequested Runnable.IsRunningChanging Runnable.IsRunningChanged Runnable.IsModalChanged View.NewMouseEvent(Mouse) View.RaiseMouseEvent(Mouse) View.GetAdornmentsThickness() View.GetSupportedCommands() View.InvokeCommands(Command[], ICommandBinding) View.InvokeCommand(Command, ICommandBinding) View.InvokeCommand(Command, ICommandContext) View.InvokeCommand(Command) View.SetContentSize(Size?) View.GetContentSize() View.GetWidthRequiredForSubViews() View.GetHeightRequiredForSubViews() View.ContentToScreen(in Point) View.ScreenToContent(in Point) View.ViewportToScreen(in Rectangle) View.ViewportToScreen(in Point) View.ViewportToScreen() View.ScreenToViewport(in Point) View.GetViewportOffsetFromFrame() View.ScrollVertical(int) View.ScrollHorizontal(int) View.Dispose() View.ToString() View.ToDebugString() View.BeginInit() View.EndInit() View.OnEnabledChanged() View.SetCursorNeedsUpdate() View.GetCurrentAttribute() View.GetAttributeForRole(VisualRole) View.SetAttribute(Attribute) View.SetAttributeForRole(VisualRole) View.GetClip() View.SetClip(Region) View.SetClipToScreen() View.ExcludeFromClip(Rectangle) View.ExcludeFromClip(Region) View.AddViewportToClip() View.Draw(DrawContext) View.DrawAdornments() View.ClearViewport(DrawContext) View.DrawText(DrawContext) View.DrawSubViews(DrawContext) View.RenderLineCanvas(DrawContext) View.Move(int, int) View.AddRune(Rune) View.AddRune(char) View.AddRune(int, int, Rune) View.AddStr(string) View.AddStr(int, int, string) View.DrawHotString(string, Attribute, Attribute) View.DrawHotString(string, bool) View.FillRect(Rectangle, Color?) View.FillRect(Rectangle, Rune) View.GetScheme() View.SetScheme(Scheme) View.GetSubViews(bool, bool, bool) View.Add(View) View.Add(params View[]) View.Remove(View) View.RemoveAll() View.RemoveAll() View.GetTopSuperView(View, View) View.IsInHierarchy(View, View, bool) View.MoveSubViewTowardsEnd(View) View.MoveSubViewToEnd(View) View.MoveSubViewTowardsStart(View) View.MoveSubViewToStart(View) View.AddKeyBindingsForHotKey(Key, Key, object) View.AssignHotKeysToSubViews() View.NewKeyDownEvent(Key) View.Contains(in Point) View.FrameToScreen() View.ScreenToFrame(in Point) View.Layout(Size) View.Layout() View.SetRelativeLayout(Size) View.SetNeedsLayout() View.GetContainerSize() View.GetViewsUnderLocation(in Point, ViewportSettingsFlags) View.AdvanceFocus(NavigationDirection, TabBehavior?) View.FocusDeepest(NavigationDirection, TabBehavior?) View.OnCanFocusChanged() View.ClearFocus() View.SetFocus() View.SetNeedsDraw() View.SetNeedsDraw(Rectangle) View.OnTextChanged() View.MouseBindings View.MouseHoldRepeat View.MousePositionTracking View.MouseState View.MouseHighlightStates View.Margin View.ShadowStyle View.Border View.BorderStyle View.Padding View.Arrangement View.DefaultAcceptView View.CommandsToBubbleUp View.ContentSizeTracksViewport View.ViewportSettings View.Viewport View.Data View.Id View.App View.IsInitialized View.Enabled View.Visible View.Title View.Cursor View.Diagnostics View.LineCanvas View.SuperViewRendersLineCanvas View.SchemeName View.HasScheme View.SubViews View.SuperView View.HotKey View.HotKeySpecifier View.AssignHotKeys View.UsedHotKeys View.KeyBindings View.HotKeyBindings View.Frame View.X View.Y View.Height View.Width View.NeedsLayout View.ValidatePosDim View.CanFocus View.Focused View.IsCurrentTop View.MostFocused View.HasFocus View.TabStop View.NeedsDraw View.HorizontalScrollBar View.VerticalScrollBar View.PreserveTrailingSpaces View.Text View.TextAlignment View.TextDirection View.TextFormatter View.VerticalTextAlignment View.MouseEnter View.MouseLeave View.MouseHoldRepeatChanging View.MouseHoldRepeatChanged View.MouseEvent View.MouseStateChanged View.BorderStyleChanged View.CommandNotBound View.Accepting View.Accepted View.Activating View.Activated View.HandlingHotKey View.HotKeyCommand View.ContentSizeChanging View.ContentSizeChanged View.ViewportChanged View.Disposing View.Initialized View.EnabledChanged View.VisibleChanging View.VisibleChanged View.TitleChanging View.TitleChanged View.GettingAttributeForRole View.ClearingViewport View.ClearedViewport View.DrawingText View.DrewText View.DrawingContent View.DrawingSubViews View.DrawComplete View.SchemeNameChanging View.SchemeNameChanged View.GettingScheme View.SchemeChanging View.SchemeChanged View.SuperViewChanging View.SuperViewChanged View.SubViewAdded View.SubViewRemoved View.Removed View.HotKeyChanged View.KeyDown View.KeyDownNotHandled View.FrameChanged View.HeightChanging View.HeightChanged View.WidthChanging View.WidthChanged View.SubViewLayout View.SubViewsLaidOut View.AdvancingFocus View.CanFocusChanged View.FocusedChanged View.HasFocusChanging View.HasFocusChanged View.TextChanged object.GetType() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors MainWindow(IApplication, ChatMessageManager) public MainWindow(IApplication app, ChatMessageManager messageManager) Parameters app IApplication messageManager ChatMessageManager Properties CurrentChannel Get the current channel name. public string CurrentChannel { get; } Property Value string Methods ApplyColorSchemes() Applies the currently registered color schemes to all views. Call after theme changes to refresh colors. public void ApplyColorSchemes() ClearAll() Clear all messages and channels (used on disconnect). public void ClearAll() EnsureChannelInList(string, bool?) Ensure a channel exists in the left panel list (used for private channels joined via /join). public void EnsureChannelInList(string channelName, bool? isPublic = null) Parameters channelName string isPublic bool? FocusInput() Focus the input field for typing. public void FocusInput() GetChannelNames() Get all channel names that have message buffers (for broadcasting status changes). public IReadOnlyList GetChannelNames() Returns IReadOnlyList RefreshMenuBar() Rebuilds and replaces the menu bar (e.g., after theme list changes). public void RefreshMenuBar() RemoveChannel(string) Remove a channel from the left panel list. public void RemoveChannel(string channelName) Parameters channelName string SetChannelTopic(string, string?) Update the topic for a specific channel. public void SetChannelTopic(string channelName, string? topic) Parameters channelName string topic string SetChannels(List) Set the list of available channels, storing topics, and refresh the channel list view. public void SetChannels(List channels) Parameters channels List SetCurrentUser(string) Set the current user name (delegates to message manager for @mention detection). public void SetCurrentUser(string username) Parameters username string ShowError(string) Show an error message to the user. public void ShowError(string message) Parameters message string SwitchToChannel(string) Switch the chat view to the given channel, resetting its unread count and updating the topic bar. public void SwitchToChannel(string channelName) Parameters channelName string ToggleUsersPanel() Toggle the online users panel visibility (F2). public void ToggleUsersPanel() UpdateOnlineUsers(List) Update the online users list display. public void UpdateOnlineUsers(List users) Parameters users List UpdateStatusBar(string) Update the connection status displayed in the status bar. public void UpdateStatusBar(string status) Parameters status string Events OnAudioPlayRequested Fired when the user activates (Enter/click) an audio message. Parameters: attachmentUrl, fileName. public event Action? OnAudioPlayRequested Event Type Action OnChannelJoinRequested Fired when the user activates a #channel reference in a message. Parameter is the channel name. public event Action? OnChannelJoinRequested Event Type Action OnChannelSelected Fired when the user selects a channel. Parameter is the channel name. public event Action? OnChannelSelected Event Type Action OnCheckForUpdatesRequested Fired when the user requests to check for updates. public event Action? OnCheckForUpdatesRequested Event Type Action OnConnectRequested Fired when the user requests to connect via the menu. public event Action? OnConnectRequested Event Type Action OnCreateChannelRequested Fired when the user requests to create a new channel. public event Action? OnCreateChannelRequested Event Type Action OnDeleteChannelRequested Fired when the user requests to delete the current channel. public event Action? OnDeleteChannelRequested Event Type Action OnDisconnectRequested Fired when the user requests to disconnect via the menu. public event Action? OnDisconnectRequested Event Type Action OnFileDownloadRequested Fired when the user activates (Enter/click) a file message. Parameters: attachmentUrl, fileName. public event Action? OnFileDownloadRequested Event Type Action OnLoadMoreRequested Fired when the user scrolls to the top of the message list and older messages should be loaded. public event Action? OnLoadMoreRequested Event Type Action OnLogoutRequested Fired when the user requests to logout (disconnect + revoke session). public event Action? OnLogoutRequested Event Type Action OnMessageSubmitted Fired when the user presses Enter in the input field. Parameters: channel name, message content. public event Action? OnMessageSubmitted Event Type Action OnProfileRequested Fired when the user requests to open their profile panel. public event Action? OnProfileRequested Event Type Action OnRollbackRequested Fired when the user requests to rollback to the previous version. public event Action? OnRollbackRequested Event Type Action OnSavedServersRequested Fired when the user requests to view saved servers. public event Action? OnSavedServersRequested Event Type Action OnSearchRequested Fired when the user requests to open the search dialog (via menu or Ctrl+K). public event Action? OnSearchRequested Event Type Action OnStatusRequested Fired when the user requests to set their status. public event Action? OnStatusRequested Event Type Action OnThemeSelected Fired when the user selects a theme from the menu. Parameter is the theme name. public event Action? OnThemeSelected Event Type Action OnUserProfileRequested Fired when the user activates a username (in userlist or message). Parameter is the username. public event Action? OnUserProfileRequested Event Type Action" }, "api/client/EchoHub.Client.UI.html": { "href": "api/client/EchoHub.Client.UI.html", @@ -287,7 +307,7 @@ "api/core/EchoHub.Core.Constants.ValidationConstants.html": { "href": "api/core/EchoHub.Core.Constants.ValidationConstants.html", "title": "Class ValidationConstants | EchoHub Documentation", - "summary": "Class ValidationConstants Namespace EchoHub.Core.Constants Assembly EchoHub.Core.dll public static class ValidationConstants Inheritance object ValidationConstants Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Fields ChannelNamePattern public const string ChannelNamePattern = \"^[a-zA-Z0-9_-]{2,100}$\" Field Value string HexColorPattern public const string HexColorPattern = \"^#[0-9a-fA-F]{6}$\" Field Value string MaxBioLength public const int MaxBioLength = 500 Field Value int MaxChannelTopicLength public const int MaxChannelTopicLength = 500 Field Value int MaxDisplayNameLength public const int MaxDisplayNameLength = 100 Field Value int MaxHistoryCount public const int MaxHistoryCount = 100 Field Value int MaxPasswordLength public const int MaxPasswordLength = 128 Field Value int MaxStatusMessageLength public const int MaxStatusMessageLength = 100 Field Value int UsernamePattern public const string UsernamePattern = \"^[a-zA-Z0-9_-]{3,50}$\" Field Value string Methods ChannelNameRegex() [GeneratedRegex(\"^[a-zA-Z0-9_-]{2,100}$\")] public static Regex ChannelNameRegex() Returns Regex Remarks Pattern: ^[a-zA-Z0-9_-]{2,100}$ Explanation: ○ Match if at the beginning of the string. ○ Match a character in the set [\\-0-9A-Z_a-z] atomically at least 2 and at most 100 times. ○ Match if at the end of the string or if before an ending newline. HexColorRegex() [GeneratedRegex(\"^#[0-9a-fA-F]{6}$\")] public static Regex HexColorRegex() Returns Regex Remarks Pattern: ^#[0-9a-fA-F]{6}$ Explanation: ○ Match if at the beginning of the string. ○ Match '#'. ○ Match a hexadecimal digit exactly 6 times. ○ Match if at the end of the string or if before an ending newline. UsernameRegex() [GeneratedRegex(\"^[a-zA-Z0-9_-]{3,50}$\")] public static Regex UsernameRegex() Returns Regex Remarks Pattern: ^[a-zA-Z0-9_-]{3,50}$ Explanation: ○ Match if at the beginning of the string. ○ Match a character in the set [\\-0-9A-Z_a-z] atomically at least 3 and at most 50 times. ○ Match if at the end of the string or if before an ending newline." + "summary": "Class ValidationConstants Namespace EchoHub.Core.Constants Assembly EchoHub.Core.dll public static class ValidationConstants Inheritance object ValidationConstants Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Fields ChannelNamePattern public const string ChannelNamePattern = \"^[a-zA-Z0-9_-]{2,100}$\" Field Value string HexColorPattern public const string HexColorPattern = \"^#[0-9a-fA-F]{6}$\" Field Value string MaxBioLength public const int MaxBioLength = 500 Field Value int MaxChannelTopicLength public const int MaxChannelTopicLength = 500 Field Value int MaxDisplayNameLength public const int MaxDisplayNameLength = 100 Field Value int MaxHistoryCount public const int MaxHistoryCount = 200 Field Value int MaxPasswordLength public const int MaxPasswordLength = 128 Field Value int MaxStatusMessageLength public const int MaxStatusMessageLength = 100 Field Value int UsernamePattern public const string UsernamePattern = \"^[a-zA-Z0-9_-]{3,50}$\" Field Value string Methods ChannelNameRegex() [GeneratedRegex(\"^[a-zA-Z0-9_-]{2,100}$\")] public static Regex ChannelNameRegex() Returns Regex Remarks Pattern: ^[a-zA-Z0-9_-]{2,100}$ Explanation: ○ Match if at the beginning of the string. ○ Match a character in the set [\\-0-9A-Z_a-z] atomically at least 2 and at most 100 times. ○ Match if at the end of the string or if before an ending newline. HexColorRegex() [GeneratedRegex(\"^#[0-9a-fA-F]{6}$\")] public static Regex HexColorRegex() Returns Regex Remarks Pattern: ^#[0-9a-fA-F]{6}$ Explanation: ○ Match if at the beginning of the string. ○ Match '#'. ○ Match a hexadecimal digit exactly 6 times. ○ Match if at the end of the string or if before an ending newline. UsernameRegex() [GeneratedRegex(\"^[a-zA-Z0-9_-]{3,50}$\")] public static Regex UsernameRegex() Returns Regex Remarks Pattern: ^[a-zA-Z0-9_-]{3,50}$ Explanation: ○ Match if at the beginning of the string. ○ Match a character in the set [\\-0-9A-Z_a-z] atomically at least 3 and at most 50 times. ○ Match if at the end of the string or if before an ending newline." }, "api/core/EchoHub.Core.Constants.html": { "href": "api/core/EchoHub.Core.Constants.html", @@ -312,7 +332,7 @@ "api/core/EchoHub.Core.Contracts.IChatService.html": { "href": "api/core/EchoHub.Core.Contracts.IChatService.html", "title": "Interface IChatService | EchoHub Documentation", - "summary": "Interface IChatService Namespace EchoHub.Core.Contracts Assembly EchoHub.Core.dll public interface IChatService Methods BroadcastChannelUpdatedAsync(ChannelDto, string?) Task BroadcastChannelUpdatedAsync(ChannelDto channel, string? channelName = null) Parameters channel ChannelDto channelName string Returns Task BroadcastMessageAsync(string, MessageDto) Task BroadcastMessageAsync(string channelName, MessageDto message) Parameters channelName string message MessageDto Returns Task GetChannelHistoryAsync(string, int) Task> GetChannelHistoryAsync(string channelName, int count) Parameters channelName string count int Returns Task> GetChannelsForUserAsync(string) Task> GetChannelsForUserAsync(string username) Parameters username string Returns Task> GetOnlineUsersAsync(string) Task> GetOnlineUsersAsync(string channelName) Parameters channelName string Returns Task> JoinChannelAsync(string, Guid, string, string) Task<(List History, string? Error)> JoinChannelAsync(string connectionId, Guid userId, string username, string channelName) Parameters connectionId string userId Guid username string channelName string Returns Task<(List History, string Error)> LeaveChannelAsync(string, string, string) Task LeaveChannelAsync(string connectionId, string username, string channelName) Parameters connectionId string username string channelName string Returns Task SendMessageAsync(Guid, string, string, string) Task SendMessageAsync(Guid userId, string username, string channelName, string content) Parameters userId Guid username string channelName string content string Returns Task UpdateStatusAsync(Guid, string, UserStatus, string?) Task UpdateStatusAsync(Guid userId, string username, UserStatus status, string? statusMessage) Parameters userId Guid username string status UserStatus statusMessage string Returns Task UserConnectedAsync(string, Guid, string) Task UserConnectedAsync(string connectionId, Guid userId, string username) Parameters connectionId string userId Guid username string Returns Task UserDisconnectedAsync(string) Task UserDisconnectedAsync(string connectionId) Parameters connectionId string Returns Task" + "summary": "Interface IChatService Namespace EchoHub.Core.Contracts Assembly EchoHub.Core.dll public interface IChatService Methods BroadcastChannelUpdatedAsync(ChannelDto, string?) Task BroadcastChannelUpdatedAsync(ChannelDto channel, string? channelName = null) Parameters channel ChannelDto channelName string Returns Task BroadcastMessageAsync(string, MessageDto) Task BroadcastMessageAsync(string channelName, MessageDto message) Parameters channelName string message MessageDto Returns Task GetChannelHistoryAsync(string, int, int) Task> GetChannelHistoryAsync(string channelName, int count, int offset = 0) Parameters channelName string count int offset int Returns Task> GetChannelsForUserAsync(string) Task> GetChannelsForUserAsync(string username) Parameters username string Returns Task> GetOnlineUsersAsync(string) Task> GetOnlineUsersAsync(string channelName) Parameters channelName string Returns Task> JoinChannelAsync(string, Guid, string, string) Task<(List History, string? Error)> JoinChannelAsync(string connectionId, Guid userId, string username, string channelName) Parameters connectionId string userId Guid username string channelName string Returns Task<(List History, string Error)> LeaveChannelAsync(string, string, string) Task LeaveChannelAsync(string connectionId, string username, string channelName) Parameters connectionId string username string channelName string Returns Task SendMessageAsync(Guid, string, string, string) Task SendMessageAsync(Guid userId, string username, string channelName, string content) Parameters userId Guid username string channelName string content string Returns Task UpdateStatusAsync(Guid, string, UserStatus, string?) Task UpdateStatusAsync(Guid userId, string username, UserStatus status, string? statusMessage) Parameters userId Guid username string status UserStatus statusMessage string Returns Task UserConnectedAsync(string, Guid, string) Task UserConnectedAsync(string connectionId, Guid userId, string username) Parameters connectionId string userId Guid username string Returns Task UserDisconnectedAsync(string) Task UserDisconnectedAsync(string connectionId) Parameters connectionId string Returns Task" }, "api/core/EchoHub.Core.Contracts.IEchoHubClient.html": { "href": "api/core/EchoHub.Core.Contracts.IEchoHubClient.html", @@ -702,7 +722,7 @@ "api/server/EchoHub.Server.Hubs.ChatHub.html": { "href": "api/server/EchoHub.Server.Hubs.ChatHub.html", "title": "Class ChatHub | EchoHub Documentation", - "summary": "Class ChatHub Namespace EchoHub.Server.Hubs Assembly EchoHub.Server.dll [Authorize] public class ChatHub : Hub, IDisposable Inheritance object Hub Hub ChatHub Implements IDisposable Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors ChatHub(IChatService, ILogger) public ChatHub(IChatService chatService, ILogger logger) Parameters chatService IChatService logger ILogger Methods GetChannelHistory(string, int) public Task> GetChannelHistory(string channelName, int count = 100) Parameters channelName string count int Returns Task> GetOnlineUsers(string) public Task> GetOnlineUsers(string channelName) Parameters channelName string Returns Task> JoinChannel(string) public Task JoinChannel(string channelName) Parameters channelName string Returns Task LeaveChannel(string) public Task LeaveChannel(string channelName) Parameters channelName string Returns Task OnConnectedAsync() public override Task OnConnectedAsync() Returns Task OnDisconnectedAsync(Exception?) public override Task OnDisconnectedAsync(Exception? exception) Parameters exception Exception Returns Task SendMessage(string, string) public Task SendMessage(string channelName, string content) Parameters channelName string content string Returns Task UpdateStatus(UserStatus, string?) public Task UpdateStatus(UserStatus status, string? statusMessage) Parameters status UserStatus statusMessage string Returns Task" + "summary": "Class ChatHub Namespace EchoHub.Server.Hubs Assembly EchoHub.Server.dll [Authorize] public class ChatHub : Hub, IDisposable Inheritance object Hub Hub ChatHub Implements IDisposable Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors ChatHub(IChatService, ILogger) public ChatHub(IChatService chatService, ILogger logger) Parameters chatService IChatService logger ILogger Methods GetChannelHistory(string, int, int) public Task> GetChannelHistory(string channelName, int count = 100, int offset = 0) Parameters channelName string count int offset int Returns Task> GetOnlineUsers(string) public Task> GetOnlineUsers(string channelName) Parameters channelName string Returns Task> JoinChannel(string) public Task JoinChannel(string channelName) Parameters channelName string Returns Task LeaveChannel(string) public Task LeaveChannel(string channelName) Parameters channelName string Returns Task OnConnectedAsync() public override Task OnConnectedAsync() Returns Task OnDisconnectedAsync(Exception?) public override Task OnDisconnectedAsync(Exception? exception) Parameters exception Exception Returns Task SendMessage(string, string) public Task SendMessage(string channelName, string content) Parameters channelName string content string Returns Task UpdateStatus(UserStatus, string?) public Task UpdateStatus(UserStatus status, string? statusMessage) Parameters status UserStatus statusMessage string Returns Task" }, "api/server/EchoHub.Server.Hubs.html": { "href": "api/server/EchoHub.Server.Hubs.html", @@ -717,7 +737,7 @@ "api/server/EchoHub.Server.Services.ChatService.html": { "href": "api/server/EchoHub.Server.Services.ChatService.html", "title": "Class ChatService | EchoHub Documentation", - "summary": "Class ChatService Namespace EchoHub.Server.Services Assembly EchoHub.Server.dll public class ChatService : IChatService Inheritance object ChatService Implements IChatService Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors ChatService(IServiceScopeFactory, PresenceTracker, IEnumerable, LinkEmbedService, IMessageEncryptionService, IChannelService, ILogger) public ChatService(IServiceScopeFactory scopeFactory, PresenceTracker presenceTracker, IEnumerable broadcasters, LinkEmbedService embedService, IMessageEncryptionService encryption, IChannelService channelService, ILogger logger) Parameters scopeFactory IServiceScopeFactory presenceTracker PresenceTracker broadcasters IEnumerable embedService LinkEmbedService encryption IMessageEncryptionService channelService IChannelService logger ILogger Methods BroadcastChannelUpdatedAsync(ChannelDto, string?) public Task BroadcastChannelUpdatedAsync(ChannelDto channel, string? channelName = null) Parameters channel ChannelDto channelName string Returns Task BroadcastMessageAsync(string, MessageDto) public Task BroadcastMessageAsync(string channelName, MessageDto message) Parameters channelName string message MessageDto Returns Task GetChannelHistoryAsync(string, int) public Task> GetChannelHistoryAsync(string channelName, int count) Parameters channelName string count int Returns Task> GetChannelsForUserAsync(string) public Task> GetChannelsForUserAsync(string username) Parameters username string Returns Task> GetOnlineUsersAsync(string) public Task> GetOnlineUsersAsync(string channelName) Parameters channelName string Returns Task> JoinChannelAsync(string, Guid, string, string) public Task<(List History, string? Error)> JoinChannelAsync(string connectionId, Guid userId, string username, string channelName) Parameters connectionId string userId Guid username string channelName string Returns Task<(List History, string Error)> LeaveChannelAsync(string, string, string) public Task LeaveChannelAsync(string connectionId, string username, string channelName) Parameters connectionId string username string channelName string Returns Task SendMessageAsync(Guid, string, string, string) public Task SendMessageAsync(Guid userId, string username, string channelName, string content) Parameters userId Guid username string channelName string content string Returns Task UpdateStatusAsync(Guid, string, UserStatus, string?) public Task UpdateStatusAsync(Guid userId, string username, UserStatus status, string? statusMessage) Parameters userId Guid username string status UserStatus statusMessage string Returns Task UserConnectedAsync(string, Guid, string) public Task UserConnectedAsync(string connectionId, Guid userId, string username) Parameters connectionId string userId Guid username string Returns Task UserDisconnectedAsync(string) public Task UserDisconnectedAsync(string connectionId) Parameters connectionId string Returns Task" + "summary": "Class ChatService Namespace EchoHub.Server.Services Assembly EchoHub.Server.dll public class ChatService : IChatService Inheritance object ChatService Implements IChatService Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors ChatService(IServiceScopeFactory, PresenceTracker, IEnumerable, LinkEmbedService, IMessageEncryptionService, IChannelService, ILogger) public ChatService(IServiceScopeFactory scopeFactory, PresenceTracker presenceTracker, IEnumerable broadcasters, LinkEmbedService embedService, IMessageEncryptionService encryption, IChannelService channelService, ILogger logger) Parameters scopeFactory IServiceScopeFactory presenceTracker PresenceTracker broadcasters IEnumerable embedService LinkEmbedService encryption IMessageEncryptionService channelService IChannelService logger ILogger Methods BroadcastChannelUpdatedAsync(ChannelDto, string?) public Task BroadcastChannelUpdatedAsync(ChannelDto channel, string? channelName = null) Parameters channel ChannelDto channelName string Returns Task BroadcastMessageAsync(string, MessageDto) public Task BroadcastMessageAsync(string channelName, MessageDto message) Parameters channelName string message MessageDto Returns Task GetChannelHistoryAsync(string, int, int) public Task> GetChannelHistoryAsync(string channelName, int count, int offset = 0) Parameters channelName string count int offset int Returns Task> GetChannelsForUserAsync(string) public Task> GetChannelsForUserAsync(string username) Parameters username string Returns Task> GetOnlineUsersAsync(string) public Task> GetOnlineUsersAsync(string channelName) Parameters channelName string Returns Task> JoinChannelAsync(string, Guid, string, string) public Task<(List History, string? Error)> JoinChannelAsync(string connectionId, Guid userId, string username, string channelName) Parameters connectionId string userId Guid username string channelName string Returns Task<(List History, string Error)> LeaveChannelAsync(string, string, string) public Task LeaveChannelAsync(string connectionId, string username, string channelName) Parameters connectionId string username string channelName string Returns Task SendMessageAsync(Guid, string, string, string) public Task SendMessageAsync(Guid userId, string username, string channelName, string content) Parameters userId Guid username string channelName string content string Returns Task UpdateStatusAsync(Guid, string, UserStatus, string?) public Task UpdateStatusAsync(Guid userId, string username, UserStatus status, string? statusMessage) Parameters userId Guid username string status UserStatus statusMessage string Returns Task UserConnectedAsync(string, Guid, string) public Task UserConnectedAsync(string connectionId, Guid userId, string username) Parameters connectionId string userId Guid username string Returns Task UserDisconnectedAsync(string) public Task UserDisconnectedAsync(string connectionId) Parameters connectionId string Returns Task" }, "api/server/EchoHub.Server.Services.FileCleanupService.html": { "href": "api/server/EchoHub.Server.Services.FileCleanupService.html", @@ -822,7 +842,7 @@ "articles/getting-started.html": { "href": "articles/getting-started.html", "title": "Getting Started | EchoHub Documentation", - "summary": "Getting Started Install the Client Windows (Chocolatey) choco install echohub Linux / macOS curl -sSfL https://raw.githubusercontent.com/HueByte/EchoHub/master/scripts/install.sh | sh To install a specific version or to a custom directory: curl -sSfL .../install.sh | sh -s -- --version 0.2.8 curl -sSfL .../install.sh | sh -s -- --install-dir /opt/echohub Manual Download Grab a self-contained binary from Releases -- no runtime needed. Host a Server Docker The quickest way to host a server: cp .env.example .env docker compose up -d See the Docker guide for configuration, pre-built images, and more. From Source dotnet run --project src/EchoHub.Server Requires .NET 10 SDK. On first run, the server automatically: Creates appsettings.json from the example config Generates a secure JWT secret Creates the SQLite database with a #general channel Usage After installing the client, run echohub (or dotnet run --project src/EchoHub.Client from source). Connect to a server, register an account, and start chatting. Connect via IRC Enable the IRC gateway in the server's appsettings.json: { \"Irc\": { \"Enabled\": true, \"Port\": 6667 } } Then connect with any standard IRC client: irssi -c localhost -p 6667 -w -n IRC users must have an existing EchoHub account. Authentication works via PASS/NICK/USER or SASL PLAIN. Messages flow bidirectionally between IRC and TUI clients. For TLS, set TlsEnabled: true, TlsPort: 6697, and provide a PKCS#12 certificate path. See the Architecture page for details on how the IRC gateway integrates with the chat service. Configuration Server configuration is in appsettings.json (auto-generated on first run). You can also use environment variables or command-line arguments to override settings. See the Configuration guide for the full reference and how it all works. Build from Source dotnet build src/EchoHub.slnx" + "summary": "Getting Started Install the Client Windows (Chocolatey) choco install echohub Linux / macOS curl -sSfL https://raw.githubusercontent.com/HueByte/EchoHub/master/scripts/install.sh | sh To install a specific version or to a custom directory: curl -sSfL .../install.sh | sh -s -- --version 0.2.10 curl -sSfL .../install.sh | sh -s -- --install-dir /opt/echohub Manual Download Grab a self-contained binary from Releases -- no runtime needed. Host a Server Docker The quickest way to host a server: cp .env.example .env docker compose up -d See the Docker guide for configuration, pre-built images, and more. From Source dotnet run --project src/EchoHub.Server Requires .NET 10 SDK. On first run, the server automatically: Creates appsettings.json from the example config Generates a secure JWT secret Creates the SQLite database with a #general channel Usage After installing the client, run echohub (or dotnet run --project src/EchoHub.Client from source). Connect to a server, register an account, and start chatting. Connect via IRC Enable the IRC gateway in the server's appsettings.json: { \"Irc\": { \"Enabled\": true, \"Port\": 6667 } } Then connect with any standard IRC client: irssi -c localhost -p 6667 -w -n IRC users must have an existing EchoHub account. Authentication works via PASS/NICK/USER or SASL PLAIN. Messages flow bidirectionally between IRC and TUI clients. For TLS, set TlsEnabled: true, TlsPort: 6697, and provide a PKCS#12 certificate path. See the Architecture page for details on how the IRC gateway integrates with the chat service. Configuration Server configuration is in appsettings.json (auto-generated on first run). You can also use environment variables or command-line arguments to override settings. See the Configuration guide for the full reference and how it all works. Build from Source dotnet build src/EchoHub.slnx" }, "articles/notification-sounds.html": { "href": "articles/notification-sounds.html", @@ -832,7 +852,7 @@ "changelog/index.html": { "href": "changelog/index.html", "title": "Changelog | EchoHub Documentation", - "summary": "Changelog Release history for EchoHub. Releases v0.2.9 - Linux/macOS Single-File Publish Fix v0.2.8 - Docker Support, IRC Account Creation & BOM Fix v0.2.7 - User List Fix & Terminal.Gui NuGet Migration v0.2.6 - Major Refactoring & Code Organization v0.2.5 - Session Persistence, Auto-Updates, Audio & Transparent Theme v0.2.4 - E2E Message Encryption v0.2.3 - Moderation, Embeds & UI Overhaul v0.2.2 - Startup & Shutdown Fixes v0.2.1 - Shutdown & CI Fixes v0.2.0 - IRC Gateway v0.1.1 - Directory Connection Self-Healing v0.1.0 - Initial Release" + "summary": "Changelog Release history for EchoHub. Releases v0.2.10 - Command Palette, Infinite History Scroll & Auto-Updater Fixes v0.2.9 - Install Script & Chocolatey Fixes v0.2.8 - Docker Support, IRC Account Creation & BOM Fix v0.2.7 - User List Fix & Terminal.Gui NuGet Migration v0.2.6 - Major Refactoring & Code Organization v0.2.5 - Session Persistence, Auto-Updates, Audio & Transparent Theme v0.2.4 - E2E Message Encryption v0.2.3 - Moderation, Embeds & UI Overhaul v0.2.2 - Startup & Shutdown Fixes v0.2.1 - Shutdown & CI Fixes v0.2.0 - IRC Gateway v0.1.1 - Directory Connection Self-Healing v0.1.0 - Initial Release" }, "changelog/v0.1.0.html": { "href": "changelog/v0.1.0.html", @@ -854,6 +874,11 @@ "title": "v0.2.1 - Shutdown & CI Fixes | EchoHub Documentation", "summary": "v0.2.1 - Shutdown & CI Fixes Fixes Fixed server hanging on Ctrl+C when the directory server is unreachable — StopAsync now cancels background services before disposing connections Fixed IRC gateway shutdown blocking indefinitely on unresponsive clients — send operations are now bounded to 2 seconds Fixed CI release workflow not having full git history for building release notes (fetch-depth: 0) Fixed workflow_dispatch trigger breaking change detection when github.event.before is empty Improvements GitHub releases now include a commit list and version diff link instead of generic auto-generated notes GitHub releases link to the full changelog on the docs site" }, + "changelog/v0.2.10.html": { + "href": "changelog/v0.2.10.html", + "title": "v0.2.10 | EchoHub Documentation", + "summary": "v0.2.10 Follow-up patch release for v0.2.9 addressing auto-updater regressions, adding a command palette, infinite-scroll message history, and input polish. New Features Command palette — press Ctrl+K from the message input (or anywhere in the main window) to open a searchable dialog for navigating channels and triggering app actions (connect, disconnect, logout, profile, status, create/delete channel, saved servers, toggle users panel, check for updates, quit). Fuzzy matches against both the label and the underlying key so typing ch surfaces channel actions alongside #channel entries Scroll-to-load message history — scrolling to the top of a channel now fetches the next batch of older messages in the background (previously only the most recent 100 messages were available). Duplicate messages are filtered by ID, a per-channel guard prevents concurrent fetches, and the scroll position is preserved after the prepend so your reading position doesn't jump Bug Fixes Fix update progress dialog freezing / not repainting — progress callbacks now run on the UI thread so the download and extraction percentage actually updates while an update is in progress Fix pre-update backup failing when a Serilog-held log file is locked — UpdateBackupService now enumerates files manually, skips the logs/ directory and .log files, and logs-and-continues on IOException/UnauthorizedAccessException instead of aborting the whole backup Simplify update progress dispatch — remove redundant Application.Invoke wrappers around progress updates that are already called from the UI thread (introduced while fixing the freeze above) Fix cursor position being reset to the start of the line when auto-completing commands in the CLI app — insertion point is now moved to the end of the completed text Fix notification sounds crashing or being silently dropped when several arrive in quick succession — playback is now serialized through a semaphore that's held for the duration of each sound (using PlaybackFinished with a 10s safety timeout) and always released in finally, so back-to-back notifications queue up and play in order instead of racing the underlying audio player (fixes #20) Refactoring Move search-dialog dispatch out of MainWindow into AppOrchestrator — MainWindow now just raises OnSearchRequested, keeping the view dumb and letting the orchestrator own navigation/action routing ChatHub.GetChannelHistory and IChatService.GetChannelHistoryAsync gain an additional offset parameter for paginated history loading (defaults to 0 — existing callers are unaffected) ValidationConstants.MaxHistoryCount raised from 100 to 200 so power users and paginated fetches can request larger batches; DefaultHistoryCount stays at 100" + }, "changelog/v0.2.2.html": { "href": "changelog/v0.2.2.html", "title": "v0.2.2 - Startup & Shutdown Fixes | EchoHub Documentation", @@ -892,7 +917,7 @@ "changelog/v0.2.9.html": { "href": "changelog/v0.2.9.html", "title": "v0.2.9 | EchoHub Documentation", - "summary": "v0.2.9 Bug Fixes Fix Linux/macOS client install — enable single-file publish so the install script copies one self-contained binary instead of just the native host (which failed with \"does not exist: EchoHub.Client.dll\")" + "summary": "v0.2.9 Bug Fixes Fix Linux/macOS client install — enable single-file publish so the install script copies one self-contained binary instead of just the native host (which failed with \"does not exist: EchoHub.Client.dll\") Fix Chocolatey install path on Windows — chocolateyInstall.ps1 was joining the install directory and executable name into a single segment, producing an invalid target path Fix Chocolatey package metadata — corrected GitHub repository URLs and documentation URLs in echohub.nuspec that pointed at the wrong location Fix double-click on \"Public\" checkbox in the Create Channel dialog accidentally submitting the dialog — checkbox toggle commands no longer bubble up to the dialog's default button Documentation Add a dedicated configuration guide (docs/articles/configuration.md) covering server settings, client settings, and environment overrides Refresh README badges and reorganize the articles table of contents for better discoverability Polish Docker, getting-started, and flow docs to match the current configuration surface Dependencies Bump Terminal.Gui to 2.0.0-develop.5043 (from 5039) CI Release workflow now publishes a single-file self-contained client binary for Linux and macOS so the install script works out-of-the-box Chocolatey publishing step now triggers only when the package source actually changes and performs a proper version check against the feed before pushing" }, "flows/authentication.html": { "href": "flows/authentication.html", @@ -937,6 +962,6 @@ "todo.html": { "href": "todo.html", "title": "TODO | EchoHub Documentation", - "summary": "TODO [ ] fix the chat trailing; when user scrolls up, and somebody sends a message – the chat instantly \"teleports\" to the very bottom [x] disable the autorun of files (maybe keep for mp4? gotta do some sec research on it) [x] when user creates a new channel, he gets moved to that channel; but the userlist does not refresh the state on that – it refreshes when user re-enters the channel again [ ] password protected rooms [ ] better audio lib, current one (NetCoreAudio) does not support seek or other audio actions [ ] Use options pattern for both client & server ref: https://learn.microsoft.com/en-us/aspnet/core/fundamentals/configuration/options?view=aspnetcore-10.0 [x] The vertical line of embeds should be the same colour as theme-color meta tag of the source [x] change text wrapping to honor the offset of the user. (Preferably wrap whole words if they fit in on line. Basically how the CSS \"text-wrap-mode: wrap;\" works) [x] make usernames in messages, mentions and in the user list clickable to open the user profile [ ] Add tags support for public servers & add filters on echohubspace for those tags in the server \"browser\" [ ] when trying to /join a channel that doesn't exist a client side-ghost channel gets created that does not work [x] unmute timer does not seem to work [ ] add IRC network like support that means basically multiple servers linked, so users can chat cross-server in this network [x] when users clicks public -> private -> public checkbox in the channel creation, it ends up creating the channel on 3rd check switch [ ] add keyboard only controls | at least for most important parts and the rest might be accessible with: (down) [ ] add search bar / search modal – that will allow users to instantly navigate to room / focus on app element & etc [ ] Actually smart data management – cache messages, lazy load messages on scroll (currently hardcoded 100msgs fetched + new ones) [x] Another thing would be stateful userlist – basically fetch once and listen for userlist updates [x] Send to EchohubSpace only state changes, currently we send user count periodically, instead of updating it on update [x] space between mod|admin \"icon\" and username [ ] Embeds still incorrectly display colors" + "summary": "TODO [ ] fix the chat trailing; when user scrolls up, and somebody sends a message – the chat instantly \"teleports\" to the very bottom [x] disable the autorun of files (maybe keep for mp4? gotta do some sec research on it) [x] when user creates a new channel, he gets moved to that channel; but the userlist does not refresh the state on that – it refreshes when user re-enters the channel again [ ] password protected rooms [ ] better audio lib, current one (NetCoreAudio) does not support seek or other audio actions [ ] Use options pattern for both client & server ref: https://learn.microsoft.com/en-us/aspnet/core/fundamentals/configuration/options?view=aspnetcore-10.0 [x] The vertical line of embeds should be the same colour as theme-color meta tag of the source [x] change text wrapping to honor the offset of the user. (Preferably wrap whole words if they fit in on line. Basically how the CSS \"text-wrap-mode: wrap;\" works) [x] make usernames in messages, mentions and in the user list clickable to open the user profile [ ] Add tags support for public servers & add filters on echohubspace for those tags in the server \"browser\" [ ] when trying to /join a channel that doesn't exist a client side-ghost channel gets created that does not work [x] unmute timer does not seem to work [ ] add IRC network like support that means basically multiple servers linked, so users can chat cross-server in this network [x] when users clicks public -> private -> public checkbox in the channel creation, it ends up creating the channel on 3rd check switch [ ] add keyboard only controls | at least for most important parts and the rest might be accessible with: (down) [x] add search bar / search modal – that will allow users to instantly navigate to room / focus on app element & etc [ ] Actually smart data management – cache messages, lazy load messages on scroll (currently hardcoded 100msgs fetched + new ones) [x] Another thing would be stateful userlist – basically fetch once and listen for userlist updates [x] Send to EchohubSpace only state changes, currently we send user count periodically, instead of updating it on update [x] space between mod|admin \"icon\" and username [ ] Embeds still incorrectly display colors" } } \ No newline at end of file diff --git a/manifest.json b/manifest.json index e8f913c..5d9f7bc 100644 --- a/manifest.json +++ b/manifest.json @@ -570,6 +570,48 @@ "Title": "EchoHub.Client.UI.Dialogs.ProfileViewDialog", "Summary": "

      Dialog for viewing a user's server profile.\nShows Edit Profile / Set Status buttons when viewing own profile.

      \n" }, + { + "type": "ManagedReference", + "source_relative_path": "_api_meta/client/EchoHub.Client.UI.Dialogs.SearchDialog.yml", + "output": { + ".html": { + "relative_path": "api/client/EchoHub.Client.UI.Dialogs.SearchDialog.html" + } + }, + "version": "", + "Uid": null, + "IsMRef": true, + "Title": "EchoHub.Client.UI.Dialogs.SearchDialog", + "Summary": "

      Command-palette style search dialog (Ctrl+K) for navigating channels and triggering app actions.

      \n" + }, + { + "type": "ManagedReference", + "source_relative_path": "_api_meta/client/EchoHub.Client.UI.Dialogs.SearchResult.yml", + "output": { + ".html": { + "relative_path": "api/client/EchoHub.Client.UI.Dialogs.SearchResult.html" + } + }, + "version": "", + "Uid": null, + "IsMRef": true, + "Title": "EchoHub.Client.UI.Dialogs.SearchResult", + "Summary": null + }, + { + "type": "ManagedReference", + "source_relative_path": "_api_meta/client/EchoHub.Client.UI.Dialogs.SearchResultType.yml", + "output": { + ".html": { + "relative_path": "api/client/EchoHub.Client.UI.Dialogs.SearchResultType.html" + } + }, + "version": "", + "Uid": null, + "IsMRef": true, + "Title": "EchoHub.Client.UI.Dialogs.SearchResultType", + "Summary": null + }, { "type": "ManagedReference", "source_relative_path": "_api_meta/client/EchoHub.Client.UI.Dialogs.StatusDialog.yml", @@ -696,6 +738,20 @@ "Title": "EchoHub.Client.UI.ListSources.ChannelListSource", "Summary": "

      Custom list data source for colored channel list rendering.\nActive channel gets a > indicator, unread channels are bright with a count badge.

      \n" }, + { + "type": "ManagedReference", + "source_relative_path": "_api_meta/client/EchoHub.Client.UI.ListSources.SearchListSource.yml", + "output": { + ".html": { + "relative_path": "api/client/EchoHub.Client.UI.ListSources.SearchListSource.html" + } + }, + "version": "", + "Uid": null, + "IsMRef": true, + "Title": "EchoHub.Client.UI.ListSources.SearchListSource", + "Summary": "

      List data source for the search dialog with filtering and colored rendering.

      \n" + }, { "type": "ManagedReference", "source_relative_path": "_api_meta/client/EchoHub.Client.UI.ListSources.UserListSource.yml", @@ -2422,6 +2478,16 @@ }, "version": "" }, + { + "type": "Conceptual", + "source_relative_path": "changelog/v0.2.10.md", + "output": { + ".html": { + "relative_path": "changelog/v0.2.10.html" + } + }, + "version": "" + }, { "type": "Conceptual", "source_relative_path": "changelog/v0.2.2.md", diff --git a/todo.html b/todo.html index e2f1256..5d50244 100644 --- a/todo.html +++ b/todo.html @@ -97,7 +97,7 @@
    • [x] when users clicks public -> private -> public checkbox in the channel creation, it ends up creating the channel on 3rd check switch
    • [ ] add keyboard only controls | at least for most important parts and the rest might be accessible with: (down)
    • -
    • [ ] add search bar / search modal – that will allow users to instantly navigate to room / focus on app element & etc
    • +
    • [x] add search bar / search modal – that will allow users to instantly navigate to room / focus on app element & etc
    • [ ] Actually smart data management – cache messages, lazy load messages on scroll (currently hardcoded 100msgs fetched + new ones)
    • [x] Another thing would be stateful userlist – basically fetch once and listen for userlist updates
    • [x] Send to EchohubSpace only state changes, currently we send user count periodically, instead of updating it on update
    • diff --git a/xrefmap.yml b/xrefmap.yml index e67484d..30dc13c 100644 --- a/xrefmap.yml +++ b/xrefmap.yml @@ -1756,15 +1756,15 @@ references: commentId: Overload:EchoHub.Client.Services.EchoHubConnection.DisposeAsync fullName: EchoHub.Client.Services.EchoHubConnection.DisposeAsync nameWithType: EchoHubConnection.DisposeAsync -- uid: EchoHub.Client.Services.EchoHubConnection.GetHistoryAsync(System.String,System.Int32) - name: GetHistoryAsync(string, int) - href: api/client/EchoHub.Client.Services.EchoHubConnection.html#EchoHub_Client_Services_EchoHubConnection_GetHistoryAsync_System_String_System_Int32_ - commentId: M:EchoHub.Client.Services.EchoHubConnection.GetHistoryAsync(System.String,System.Int32) - name.vb: GetHistoryAsync(String, Integer) - fullName: EchoHub.Client.Services.EchoHubConnection.GetHistoryAsync(string, int) - fullName.vb: EchoHub.Client.Services.EchoHubConnection.GetHistoryAsync(String, Integer) - nameWithType: EchoHubConnection.GetHistoryAsync(string, int) - nameWithType.vb: EchoHubConnection.GetHistoryAsync(String, Integer) +- uid: EchoHub.Client.Services.EchoHubConnection.GetHistoryAsync(System.String,System.Int32,System.Int32) + name: GetHistoryAsync(string, int, int) + href: api/client/EchoHub.Client.Services.EchoHubConnection.html#EchoHub_Client_Services_EchoHubConnection_GetHistoryAsync_System_String_System_Int32_System_Int32_ + commentId: M:EchoHub.Client.Services.EchoHubConnection.GetHistoryAsync(System.String,System.Int32,System.Int32) + name.vb: GetHistoryAsync(String, Integer, Integer) + fullName: EchoHub.Client.Services.EchoHubConnection.GetHistoryAsync(string, int, int) + fullName.vb: EchoHub.Client.Services.EchoHubConnection.GetHistoryAsync(String, Integer, Integer) + nameWithType: EchoHubConnection.GetHistoryAsync(string, int, int) + nameWithType.vb: EchoHubConnection.GetHistoryAsync(String, Integer, Integer) - uid: EchoHub.Client.Services.EchoHubConnection.GetHistoryAsync* name: GetHistoryAsync href: api/client/EchoHub.Client.Services.EchoHubConnection.html#EchoHub_Client_Services_EchoHubConnection_GetHistoryAsync_ @@ -3079,6 +3079,12 @@ references: commentId: Overload:EchoHub.Client.UI.Chat.ChatMessageManager.GetUnreadCount fullName: EchoHub.Client.UI.Chat.ChatMessageManager.GetUnreadCount nameWithType: ChatMessageManager.GetUnreadCount +- uid: EchoHub.Client.UI.Chat.ChatMessageManager.HistoryPrepended + name: HistoryPrepended + href: api/client/EchoHub.Client.UI.Chat.ChatMessageManager.html#EchoHub_Client_UI_Chat_ChatMessageManager_HistoryPrepended + 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) 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__ @@ -3100,6 +3106,21 @@ references: commentId: E:EchoHub.Client.UI.Chat.ChatMessageManager.MessagesChanged fullName: EchoHub.Client.UI.Chat.ChatMessageManager.MessagesChanged nameWithType: ChatMessageManager.MessagesChanged +- uid: EchoHub.Client.UI.Chat.ChatMessageManager.PrependHistory(System.String,System.Collections.Generic.List{EchoHub.Core.DTOs.MessageDto}) + name: PrependHistory(string, List) + 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__ + commentId: M:EchoHub.Client.UI.Chat.ChatMessageManager.PrependHistory(System.String,System.Collections.Generic.List{EchoHub.Core.DTOs.MessageDto}) + name.vb: PrependHistory(String, List(Of MessageDto)) + fullName: EchoHub.Client.UI.Chat.ChatMessageManager.PrependHistory(string, System.Collections.Generic.List) + fullName.vb: EchoHub.Client.UI.Chat.ChatMessageManager.PrependHistory(String, System.Collections.Generic.List(Of EchoHub.Core.DTOs.MessageDto)) + nameWithType: ChatMessageManager.PrependHistory(string, List) + nameWithType.vb: ChatMessageManager.PrependHistory(String, List(Of MessageDto)) +- uid: EchoHub.Client.UI.Chat.ChatMessageManager.PrependHistory* + name: PrependHistory + href: api/client/EchoHub.Client.UI.Chat.ChatMessageManager.html#EchoHub_Client_UI_Chat_ChatMessageManager_PrependHistory_ + commentId: Overload:EchoHub.Client.UI.Chat.ChatMessageManager.PrependHistory + fullName: EchoHub.Client.UI.Chat.ChatMessageManager.PrependHistory + nameWithType: ChatMessageManager.PrependHistory - uid: EchoHub.Client.UI.Chat.ChatMessageManager.RemoveMessage(System.String,System.Guid) name: RemoveMessage(string, Guid) href: api/client/EchoHub.Client.UI.Chat.ChatMessageManager.html#EchoHub_Client_UI_Chat_ChatMessageManager_RemoveMessage_System_String_System_Guid_ @@ -4210,6 +4231,237 @@ references: commentId: Overload:EchoHub.Client.UI.Dialogs.ProfileViewDialog.ShowOwn fullName: EchoHub.Client.UI.Dialogs.ProfileViewDialog.ShowOwn nameWithType: ProfileViewDialog.ShowOwn +- uid: EchoHub.Client.UI.Dialogs.SearchDialog + name: SearchDialog + href: api/client/EchoHub.Client.UI.Dialogs.SearchDialog.html + commentId: T:EchoHub.Client.UI.Dialogs.SearchDialog + fullName: EchoHub.Client.UI.Dialogs.SearchDialog + nameWithType: SearchDialog +- uid: EchoHub.Client.UI.Dialogs.SearchDialog.Show(Terminal.Gui.App.IApplication,System.Collections.Generic.IReadOnlyList{System.String}) + name: Show(IApplication, IReadOnlyList) + href: api/client/EchoHub.Client.UI.Dialogs.SearchDialog.html#EchoHub_Client_UI_Dialogs_SearchDialog_Show_Terminal_Gui_App_IApplication_System_Collections_Generic_IReadOnlyList_System_String__ + commentId: M:EchoHub.Client.UI.Dialogs.SearchDialog.Show(Terminal.Gui.App.IApplication,System.Collections.Generic.IReadOnlyList{System.String}) + name.vb: Show(IApplication, IReadOnlyList(Of String)) + fullName: EchoHub.Client.UI.Dialogs.SearchDialog.Show(Terminal.Gui.App.IApplication, System.Collections.Generic.IReadOnlyList) + fullName.vb: EchoHub.Client.UI.Dialogs.SearchDialog.Show(Terminal.Gui.App.IApplication, System.Collections.Generic.IReadOnlyList(Of String)) + nameWithType: SearchDialog.Show(IApplication, IReadOnlyList) + nameWithType.vb: SearchDialog.Show(IApplication, IReadOnlyList(Of String)) +- uid: EchoHub.Client.UI.Dialogs.SearchDialog.Show* + name: Show + href: api/client/EchoHub.Client.UI.Dialogs.SearchDialog.html#EchoHub_Client_UI_Dialogs_SearchDialog_Show_ + commentId: Overload:EchoHub.Client.UI.Dialogs.SearchDialog.Show + fullName: EchoHub.Client.UI.Dialogs.SearchDialog.Show + nameWithType: SearchDialog.Show +- uid: EchoHub.Client.UI.Dialogs.SearchResult + name: SearchResult + href: api/client/EchoHub.Client.UI.Dialogs.SearchResult.html + commentId: T:EchoHub.Client.UI.Dialogs.SearchResult + fullName: EchoHub.Client.UI.Dialogs.SearchResult + nameWithType: SearchResult +- uid: EchoHub.Client.UI.Dialogs.SearchResult.#ctor(EchoHub.Client.UI.Dialogs.SearchResult) + name: SearchResult(SearchResult) + href: api/client/EchoHub.Client.UI.Dialogs.SearchResult.html#EchoHub_Client_UI_Dialogs_SearchResult__ctor_EchoHub_Client_UI_Dialogs_SearchResult_ + commentId: M:EchoHub.Client.UI.Dialogs.SearchResult.#ctor(EchoHub.Client.UI.Dialogs.SearchResult) + name.vb: New(SearchResult) + fullName: EchoHub.Client.UI.Dialogs.SearchResult.SearchResult(EchoHub.Client.UI.Dialogs.SearchResult) + fullName.vb: EchoHub.Client.UI.Dialogs.SearchResult.New(EchoHub.Client.UI.Dialogs.SearchResult) + nameWithType: SearchResult.SearchResult(SearchResult) + nameWithType.vb: SearchResult.New(SearchResult) +- uid: EchoHub.Client.UI.Dialogs.SearchResult.#ctor(EchoHub.Client.UI.Dialogs.SearchResultType,System.String,System.String) + name: SearchResult(SearchResultType, string, string) + href: api/client/EchoHub.Client.UI.Dialogs.SearchResult.html#EchoHub_Client_UI_Dialogs_SearchResult__ctor_EchoHub_Client_UI_Dialogs_SearchResultType_System_String_System_String_ + commentId: M:EchoHub.Client.UI.Dialogs.SearchResult.#ctor(EchoHub.Client.UI.Dialogs.SearchResultType,System.String,System.String) + name.vb: New(SearchResultType, String, String) + fullName: EchoHub.Client.UI.Dialogs.SearchResult.SearchResult(EchoHub.Client.UI.Dialogs.SearchResultType, string, string) + fullName.vb: EchoHub.Client.UI.Dialogs.SearchResult.New(EchoHub.Client.UI.Dialogs.SearchResultType, String, String) + nameWithType: SearchResult.SearchResult(SearchResultType, string, string) + nameWithType.vb: SearchResult.New(SearchResultType, String, String) +- uid: EchoHub.Client.UI.Dialogs.SearchResult.#ctor* + name: SearchResult + href: api/client/EchoHub.Client.UI.Dialogs.SearchResult.html#EchoHub_Client_UI_Dialogs_SearchResult__ctor_ + commentId: Overload:EchoHub.Client.UI.Dialogs.SearchResult.#ctor + name.vb: New + fullName: EchoHub.Client.UI.Dialogs.SearchResult.SearchResult + fullName.vb: EchoHub.Client.UI.Dialogs.SearchResult.New + nameWithType: SearchResult.SearchResult + nameWithType.vb: SearchResult.New +- uid: EchoHub.Client.UI.Dialogs.SearchResult.Deconstruct(EchoHub.Client.UI.Dialogs.SearchResultType@,System.String@,System.String@) + name: Deconstruct(out SearchResultType, out string, out string) + href: api/client/EchoHub.Client.UI.Dialogs.SearchResult.html#EchoHub_Client_UI_Dialogs_SearchResult_Deconstruct_EchoHub_Client_UI_Dialogs_SearchResultType__System_String__System_String__ + commentId: M:EchoHub.Client.UI.Dialogs.SearchResult.Deconstruct(EchoHub.Client.UI.Dialogs.SearchResultType@,System.String@,System.String@) + name.vb: Deconstruct(SearchResultType, String, String) + fullName: EchoHub.Client.UI.Dialogs.SearchResult.Deconstruct(out EchoHub.Client.UI.Dialogs.SearchResultType, out string, out string) + fullName.vb: EchoHub.Client.UI.Dialogs.SearchResult.Deconstruct(EchoHub.Client.UI.Dialogs.SearchResultType, String, String) + nameWithType: SearchResult.Deconstruct(out SearchResultType, out string, out string) + nameWithType.vb: SearchResult.Deconstruct(SearchResultType, String, String) +- uid: EchoHub.Client.UI.Dialogs.SearchResult.Deconstruct* + name: Deconstruct + href: api/client/EchoHub.Client.UI.Dialogs.SearchResult.html#EchoHub_Client_UI_Dialogs_SearchResult_Deconstruct_ + commentId: Overload:EchoHub.Client.UI.Dialogs.SearchResult.Deconstruct + fullName: EchoHub.Client.UI.Dialogs.SearchResult.Deconstruct + nameWithType: SearchResult.Deconstruct +- uid: EchoHub.Client.UI.Dialogs.SearchResult.EqualityContract + name: EqualityContract + href: api/client/EchoHub.Client.UI.Dialogs.SearchResult.html#EchoHub_Client_UI_Dialogs_SearchResult_EqualityContract + commentId: P:EchoHub.Client.UI.Dialogs.SearchResult.EqualityContract + fullName: EchoHub.Client.UI.Dialogs.SearchResult.EqualityContract + nameWithType: SearchResult.EqualityContract +- uid: EchoHub.Client.UI.Dialogs.SearchResult.EqualityContract* + name: EqualityContract + href: api/client/EchoHub.Client.UI.Dialogs.SearchResult.html#EchoHub_Client_UI_Dialogs_SearchResult_EqualityContract_ + commentId: Overload:EchoHub.Client.UI.Dialogs.SearchResult.EqualityContract + fullName: EchoHub.Client.UI.Dialogs.SearchResult.EqualityContract + nameWithType: SearchResult.EqualityContract +- uid: EchoHub.Client.UI.Dialogs.SearchResult.Equals(EchoHub.Client.UI.Dialogs.SearchResult) + name: Equals(SearchResult?) + href: api/client/EchoHub.Client.UI.Dialogs.SearchResult.html#EchoHub_Client_UI_Dialogs_SearchResult_Equals_EchoHub_Client_UI_Dialogs_SearchResult_ + commentId: M:EchoHub.Client.UI.Dialogs.SearchResult.Equals(EchoHub.Client.UI.Dialogs.SearchResult) + name.vb: Equals(SearchResult) + fullName: EchoHub.Client.UI.Dialogs.SearchResult.Equals(EchoHub.Client.UI.Dialogs.SearchResult?) + fullName.vb: EchoHub.Client.UI.Dialogs.SearchResult.Equals(EchoHub.Client.UI.Dialogs.SearchResult) + nameWithType: SearchResult.Equals(SearchResult?) + nameWithType.vb: SearchResult.Equals(SearchResult) +- uid: EchoHub.Client.UI.Dialogs.SearchResult.Equals(System.Object) + name: Equals(object?) + href: api/client/EchoHub.Client.UI.Dialogs.SearchResult.html#EchoHub_Client_UI_Dialogs_SearchResult_Equals_System_Object_ + commentId: M:EchoHub.Client.UI.Dialogs.SearchResult.Equals(System.Object) + name.vb: Equals(Object) + fullName: EchoHub.Client.UI.Dialogs.SearchResult.Equals(object?) + fullName.vb: EchoHub.Client.UI.Dialogs.SearchResult.Equals(Object) + nameWithType: SearchResult.Equals(object?) + nameWithType.vb: SearchResult.Equals(Object) +- uid: EchoHub.Client.UI.Dialogs.SearchResult.Equals* + name: Equals + href: api/client/EchoHub.Client.UI.Dialogs.SearchResult.html#EchoHub_Client_UI_Dialogs_SearchResult_Equals_ + commentId: Overload:EchoHub.Client.UI.Dialogs.SearchResult.Equals + fullName: EchoHub.Client.UI.Dialogs.SearchResult.Equals + nameWithType: SearchResult.Equals +- uid: EchoHub.Client.UI.Dialogs.SearchResult.GetHashCode + name: GetHashCode() + href: api/client/EchoHub.Client.UI.Dialogs.SearchResult.html#EchoHub_Client_UI_Dialogs_SearchResult_GetHashCode + commentId: M:EchoHub.Client.UI.Dialogs.SearchResult.GetHashCode + fullName: EchoHub.Client.UI.Dialogs.SearchResult.GetHashCode() + nameWithType: SearchResult.GetHashCode() +- uid: EchoHub.Client.UI.Dialogs.SearchResult.GetHashCode* + name: GetHashCode + href: api/client/EchoHub.Client.UI.Dialogs.SearchResult.html#EchoHub_Client_UI_Dialogs_SearchResult_GetHashCode_ + commentId: Overload:EchoHub.Client.UI.Dialogs.SearchResult.GetHashCode + fullName: EchoHub.Client.UI.Dialogs.SearchResult.GetHashCode + nameWithType: SearchResult.GetHashCode +- uid: EchoHub.Client.UI.Dialogs.SearchResult.Key + name: Key + href: api/client/EchoHub.Client.UI.Dialogs.SearchResult.html#EchoHub_Client_UI_Dialogs_SearchResult_Key + commentId: P:EchoHub.Client.UI.Dialogs.SearchResult.Key + fullName: EchoHub.Client.UI.Dialogs.SearchResult.Key + nameWithType: SearchResult.Key +- uid: EchoHub.Client.UI.Dialogs.SearchResult.Key* + name: Key + href: api/client/EchoHub.Client.UI.Dialogs.SearchResult.html#EchoHub_Client_UI_Dialogs_SearchResult_Key_ + commentId: Overload:EchoHub.Client.UI.Dialogs.SearchResult.Key + fullName: EchoHub.Client.UI.Dialogs.SearchResult.Key + nameWithType: SearchResult.Key +- uid: EchoHub.Client.UI.Dialogs.SearchResult.Label + name: Label + href: api/client/EchoHub.Client.UI.Dialogs.SearchResult.html#EchoHub_Client_UI_Dialogs_SearchResult_Label + commentId: P:EchoHub.Client.UI.Dialogs.SearchResult.Label + fullName: EchoHub.Client.UI.Dialogs.SearchResult.Label + nameWithType: SearchResult.Label +- uid: EchoHub.Client.UI.Dialogs.SearchResult.Label* + name: Label + href: api/client/EchoHub.Client.UI.Dialogs.SearchResult.html#EchoHub_Client_UI_Dialogs_SearchResult_Label_ + commentId: Overload:EchoHub.Client.UI.Dialogs.SearchResult.Label + fullName: EchoHub.Client.UI.Dialogs.SearchResult.Label + nameWithType: SearchResult.Label +- uid: EchoHub.Client.UI.Dialogs.SearchResult.PrintMembers(System.Text.StringBuilder) + name: PrintMembers(StringBuilder) + href: api/client/EchoHub.Client.UI.Dialogs.SearchResult.html#EchoHub_Client_UI_Dialogs_SearchResult_PrintMembers_System_Text_StringBuilder_ + commentId: M:EchoHub.Client.UI.Dialogs.SearchResult.PrintMembers(System.Text.StringBuilder) + fullName: EchoHub.Client.UI.Dialogs.SearchResult.PrintMembers(System.Text.StringBuilder) + nameWithType: SearchResult.PrintMembers(StringBuilder) +- uid: EchoHub.Client.UI.Dialogs.SearchResult.PrintMembers* + name: PrintMembers + href: api/client/EchoHub.Client.UI.Dialogs.SearchResult.html#EchoHub_Client_UI_Dialogs_SearchResult_PrintMembers_ + commentId: Overload:EchoHub.Client.UI.Dialogs.SearchResult.PrintMembers + fullName: EchoHub.Client.UI.Dialogs.SearchResult.PrintMembers + nameWithType: SearchResult.PrintMembers +- uid: EchoHub.Client.UI.Dialogs.SearchResult.ToString + name: ToString() + href: api/client/EchoHub.Client.UI.Dialogs.SearchResult.html#EchoHub_Client_UI_Dialogs_SearchResult_ToString + commentId: M:EchoHub.Client.UI.Dialogs.SearchResult.ToString + fullName: EchoHub.Client.UI.Dialogs.SearchResult.ToString() + nameWithType: SearchResult.ToString() +- uid: EchoHub.Client.UI.Dialogs.SearchResult.ToString* + name: ToString + href: api/client/EchoHub.Client.UI.Dialogs.SearchResult.html#EchoHub_Client_UI_Dialogs_SearchResult_ToString_ + commentId: Overload:EchoHub.Client.UI.Dialogs.SearchResult.ToString + fullName: EchoHub.Client.UI.Dialogs.SearchResult.ToString + nameWithType: SearchResult.ToString +- uid: EchoHub.Client.UI.Dialogs.SearchResult.Type + name: Type + href: api/client/EchoHub.Client.UI.Dialogs.SearchResult.html#EchoHub_Client_UI_Dialogs_SearchResult_Type + commentId: P:EchoHub.Client.UI.Dialogs.SearchResult.Type + fullName: EchoHub.Client.UI.Dialogs.SearchResult.Type + nameWithType: SearchResult.Type +- uid: EchoHub.Client.UI.Dialogs.SearchResult.Type* + name: Type + href: api/client/EchoHub.Client.UI.Dialogs.SearchResult.html#EchoHub_Client_UI_Dialogs_SearchResult_Type_ + commentId: Overload:EchoHub.Client.UI.Dialogs.SearchResult.Type + fullName: EchoHub.Client.UI.Dialogs.SearchResult.Type + nameWithType: SearchResult.Type +- uid: EchoHub.Client.UI.Dialogs.SearchResult.op_Equality(EchoHub.Client.UI.Dialogs.SearchResult,EchoHub.Client.UI.Dialogs.SearchResult) + name: operator ==(SearchResult?, SearchResult?) + href: api/client/EchoHub.Client.UI.Dialogs.SearchResult.html#EchoHub_Client_UI_Dialogs_SearchResult_op_Equality_EchoHub_Client_UI_Dialogs_SearchResult_EchoHub_Client_UI_Dialogs_SearchResult_ + commentId: M:EchoHub.Client.UI.Dialogs.SearchResult.op_Equality(EchoHub.Client.UI.Dialogs.SearchResult,EchoHub.Client.UI.Dialogs.SearchResult) + name.vb: =(SearchResult, SearchResult) + fullName: EchoHub.Client.UI.Dialogs.SearchResult.operator ==(EchoHub.Client.UI.Dialogs.SearchResult?, EchoHub.Client.UI.Dialogs.SearchResult?) + fullName.vb: EchoHub.Client.UI.Dialogs.SearchResult.=(EchoHub.Client.UI.Dialogs.SearchResult, EchoHub.Client.UI.Dialogs.SearchResult) + nameWithType: SearchResult.operator ==(SearchResult?, SearchResult?) + nameWithType.vb: SearchResult.=(SearchResult, SearchResult) +- uid: EchoHub.Client.UI.Dialogs.SearchResult.op_Equality* + name: operator == + href: api/client/EchoHub.Client.UI.Dialogs.SearchResult.html#EchoHub_Client_UI_Dialogs_SearchResult_op_Equality_ + commentId: Overload:EchoHub.Client.UI.Dialogs.SearchResult.op_Equality + name.vb: = + fullName: EchoHub.Client.UI.Dialogs.SearchResult.operator == + fullName.vb: EchoHub.Client.UI.Dialogs.SearchResult.= + nameWithType: SearchResult.operator == + nameWithType.vb: SearchResult.= +- uid: EchoHub.Client.UI.Dialogs.SearchResult.op_Inequality(EchoHub.Client.UI.Dialogs.SearchResult,EchoHub.Client.UI.Dialogs.SearchResult) + name: operator !=(SearchResult?, SearchResult?) + href: api/client/EchoHub.Client.UI.Dialogs.SearchResult.html#EchoHub_Client_UI_Dialogs_SearchResult_op_Inequality_EchoHub_Client_UI_Dialogs_SearchResult_EchoHub_Client_UI_Dialogs_SearchResult_ + commentId: M:EchoHub.Client.UI.Dialogs.SearchResult.op_Inequality(EchoHub.Client.UI.Dialogs.SearchResult,EchoHub.Client.UI.Dialogs.SearchResult) + name.vb: <>(SearchResult, SearchResult) + fullName: EchoHub.Client.UI.Dialogs.SearchResult.operator !=(EchoHub.Client.UI.Dialogs.SearchResult?, EchoHub.Client.UI.Dialogs.SearchResult?) + fullName.vb: EchoHub.Client.UI.Dialogs.SearchResult.<>(EchoHub.Client.UI.Dialogs.SearchResult, EchoHub.Client.UI.Dialogs.SearchResult) + nameWithType: SearchResult.operator !=(SearchResult?, SearchResult?) + nameWithType.vb: SearchResult.<>(SearchResult, SearchResult) +- uid: EchoHub.Client.UI.Dialogs.SearchResult.op_Inequality* + name: operator != + href: api/client/EchoHub.Client.UI.Dialogs.SearchResult.html#EchoHub_Client_UI_Dialogs_SearchResult_op_Inequality_ + commentId: Overload:EchoHub.Client.UI.Dialogs.SearchResult.op_Inequality + name.vb: <> + fullName: EchoHub.Client.UI.Dialogs.SearchResult.operator != + fullName.vb: EchoHub.Client.UI.Dialogs.SearchResult.<> + nameWithType: SearchResult.operator != + nameWithType.vb: SearchResult.<> +- uid: EchoHub.Client.UI.Dialogs.SearchResultType + name: SearchResultType + href: api/client/EchoHub.Client.UI.Dialogs.SearchResultType.html + commentId: T:EchoHub.Client.UI.Dialogs.SearchResultType + fullName: EchoHub.Client.UI.Dialogs.SearchResultType + nameWithType: SearchResultType +- uid: EchoHub.Client.UI.Dialogs.SearchResultType.Action + name: Action + href: api/client/EchoHub.Client.UI.Dialogs.SearchResultType.html#EchoHub_Client_UI_Dialogs_SearchResultType_Action + commentId: F:EchoHub.Client.UI.Dialogs.SearchResultType.Action + fullName: EchoHub.Client.UI.Dialogs.SearchResultType.Action + nameWithType: SearchResultType.Action +- uid: EchoHub.Client.UI.Dialogs.SearchResultType.Channel + name: Channel + href: api/client/EchoHub.Client.UI.Dialogs.SearchResultType.html#EchoHub_Client_UI_Dialogs_SearchResultType_Channel + commentId: F:EchoHub.Client.UI.Dialogs.SearchResultType.Channel + fullName: EchoHub.Client.UI.Dialogs.SearchResultType.Channel + nameWithType: SearchResultType.Channel - uid: EchoHub.Client.UI.Dialogs.StatusDialog name: StatusDialog href: api/client/EchoHub.Client.UI.Dialogs.StatusDialog.html @@ -4750,6 +5002,171 @@ references: commentId: Overload:EchoHub.Client.UI.ListSources.ChannelListSource.Update fullName: EchoHub.Client.UI.ListSources.ChannelListSource.Update nameWithType: ChannelListSource.Update +- uid: EchoHub.Client.UI.ListSources.SearchListSource + name: SearchListSource + href: api/client/EchoHub.Client.UI.ListSources.SearchListSource.html + commentId: T:EchoHub.Client.UI.ListSources.SearchListSource + fullName: EchoHub.Client.UI.ListSources.SearchListSource + nameWithType: SearchListSource +- uid: EchoHub.Client.UI.ListSources.SearchListSource.#ctor(System.Collections.Generic.List{EchoHub.Client.UI.Dialogs.SearchResult}) + name: SearchListSource(List) + href: api/client/EchoHub.Client.UI.ListSources.SearchListSource.html#EchoHub_Client_UI_ListSources_SearchListSource__ctor_System_Collections_Generic_List_EchoHub_Client_UI_Dialogs_SearchResult__ + commentId: M:EchoHub.Client.UI.ListSources.SearchListSource.#ctor(System.Collections.Generic.List{EchoHub.Client.UI.Dialogs.SearchResult}) + name.vb: New(List(Of SearchResult)) + fullName: EchoHub.Client.UI.ListSources.SearchListSource.SearchListSource(System.Collections.Generic.List) + fullName.vb: EchoHub.Client.UI.ListSources.SearchListSource.New(System.Collections.Generic.List(Of EchoHub.Client.UI.Dialogs.SearchResult)) + nameWithType: SearchListSource.SearchListSource(List) + nameWithType.vb: SearchListSource.New(List(Of SearchResult)) +- uid: EchoHub.Client.UI.ListSources.SearchListSource.#ctor* + name: SearchListSource + href: api/client/EchoHub.Client.UI.ListSources.SearchListSource.html#EchoHub_Client_UI_ListSources_SearchListSource__ctor_ + commentId: Overload:EchoHub.Client.UI.ListSources.SearchListSource.#ctor + name.vb: New + fullName: EchoHub.Client.UI.ListSources.SearchListSource.SearchListSource + fullName.vb: EchoHub.Client.UI.ListSources.SearchListSource.New + nameWithType: SearchListSource.SearchListSource + nameWithType.vb: SearchListSource.New +- uid: EchoHub.Client.UI.ListSources.SearchListSource.CollectionChanged + name: CollectionChanged + href: api/client/EchoHub.Client.UI.ListSources.SearchListSource.html#EchoHub_Client_UI_ListSources_SearchListSource_CollectionChanged + commentId: E:EchoHub.Client.UI.ListSources.SearchListSource.CollectionChanged + fullName: EchoHub.Client.UI.ListSources.SearchListSource.CollectionChanged + nameWithType: SearchListSource.CollectionChanged +- uid: EchoHub.Client.UI.ListSources.SearchListSource.Count + name: Count + href: api/client/EchoHub.Client.UI.ListSources.SearchListSource.html#EchoHub_Client_UI_ListSources_SearchListSource_Count + commentId: P:EchoHub.Client.UI.ListSources.SearchListSource.Count + fullName: EchoHub.Client.UI.ListSources.SearchListSource.Count + nameWithType: SearchListSource.Count +- uid: EchoHub.Client.UI.ListSources.SearchListSource.Count* + name: Count + href: api/client/EchoHub.Client.UI.ListSources.SearchListSource.html#EchoHub_Client_UI_ListSources_SearchListSource_Count_ + commentId: Overload:EchoHub.Client.UI.ListSources.SearchListSource.Count + fullName: EchoHub.Client.UI.ListSources.SearchListSource.Count + nameWithType: SearchListSource.Count +- uid: EchoHub.Client.UI.ListSources.SearchListSource.Dispose + name: Dispose() + href: api/client/EchoHub.Client.UI.ListSources.SearchListSource.html#EchoHub_Client_UI_ListSources_SearchListSource_Dispose + commentId: M:EchoHub.Client.UI.ListSources.SearchListSource.Dispose + fullName: EchoHub.Client.UI.ListSources.SearchListSource.Dispose() + nameWithType: SearchListSource.Dispose() +- uid: EchoHub.Client.UI.ListSources.SearchListSource.Dispose* + name: Dispose + href: api/client/EchoHub.Client.UI.ListSources.SearchListSource.html#EchoHub_Client_UI_ListSources_SearchListSource_Dispose_ + commentId: Overload:EchoHub.Client.UI.ListSources.SearchListSource.Dispose + fullName: EchoHub.Client.UI.ListSources.SearchListSource.Dispose + nameWithType: SearchListSource.Dispose +- uid: EchoHub.Client.UI.ListSources.SearchListSource.Filter(System.String) + name: Filter(string) + href: api/client/EchoHub.Client.UI.ListSources.SearchListSource.html#EchoHub_Client_UI_ListSources_SearchListSource_Filter_System_String_ + commentId: M:EchoHub.Client.UI.ListSources.SearchListSource.Filter(System.String) + name.vb: Filter(String) + fullName: EchoHub.Client.UI.ListSources.SearchListSource.Filter(string) + fullName.vb: EchoHub.Client.UI.ListSources.SearchListSource.Filter(String) + nameWithType: SearchListSource.Filter(string) + nameWithType.vb: SearchListSource.Filter(String) +- uid: EchoHub.Client.UI.ListSources.SearchListSource.Filter* + name: Filter + href: api/client/EchoHub.Client.UI.ListSources.SearchListSource.html#EchoHub_Client_UI_ListSources_SearchListSource_Filter_ + commentId: Overload:EchoHub.Client.UI.ListSources.SearchListSource.Filter + fullName: EchoHub.Client.UI.ListSources.SearchListSource.Filter + nameWithType: SearchListSource.Filter +- uid: EchoHub.Client.UI.ListSources.SearchListSource.GetItem(System.Int32) + name: GetItem(int) + href: api/client/EchoHub.Client.UI.ListSources.SearchListSource.html#EchoHub_Client_UI_ListSources_SearchListSource_GetItem_System_Int32_ + commentId: M:EchoHub.Client.UI.ListSources.SearchListSource.GetItem(System.Int32) + name.vb: GetItem(Integer) + fullName: EchoHub.Client.UI.ListSources.SearchListSource.GetItem(int) + fullName.vb: EchoHub.Client.UI.ListSources.SearchListSource.GetItem(Integer) + nameWithType: SearchListSource.GetItem(int) + nameWithType.vb: SearchListSource.GetItem(Integer) +- uid: EchoHub.Client.UI.ListSources.SearchListSource.GetItem* + name: GetItem + href: api/client/EchoHub.Client.UI.ListSources.SearchListSource.html#EchoHub_Client_UI_ListSources_SearchListSource_GetItem_ + commentId: Overload:EchoHub.Client.UI.ListSources.SearchListSource.GetItem + fullName: EchoHub.Client.UI.ListSources.SearchListSource.GetItem + nameWithType: SearchListSource.GetItem +- uid: EchoHub.Client.UI.ListSources.SearchListSource.IsMarked(System.Int32) + name: IsMarked(int) + href: api/client/EchoHub.Client.UI.ListSources.SearchListSource.html#EchoHub_Client_UI_ListSources_SearchListSource_IsMarked_System_Int32_ + commentId: M:EchoHub.Client.UI.ListSources.SearchListSource.IsMarked(System.Int32) + name.vb: IsMarked(Integer) + fullName: EchoHub.Client.UI.ListSources.SearchListSource.IsMarked(int) + fullName.vb: EchoHub.Client.UI.ListSources.SearchListSource.IsMarked(Integer) + nameWithType: SearchListSource.IsMarked(int) + nameWithType.vb: SearchListSource.IsMarked(Integer) +- uid: EchoHub.Client.UI.ListSources.SearchListSource.IsMarked* + name: IsMarked + href: api/client/EchoHub.Client.UI.ListSources.SearchListSource.html#EchoHub_Client_UI_ListSources_SearchListSource_IsMarked_ + commentId: Overload:EchoHub.Client.UI.ListSources.SearchListSource.IsMarked + fullName: EchoHub.Client.UI.ListSources.SearchListSource.IsMarked + nameWithType: SearchListSource.IsMarked +- uid: EchoHub.Client.UI.ListSources.SearchListSource.MaxItemLength + name: MaxItemLength + href: api/client/EchoHub.Client.UI.ListSources.SearchListSource.html#EchoHub_Client_UI_ListSources_SearchListSource_MaxItemLength + commentId: P:EchoHub.Client.UI.ListSources.SearchListSource.MaxItemLength + fullName: EchoHub.Client.UI.ListSources.SearchListSource.MaxItemLength + nameWithType: SearchListSource.MaxItemLength +- uid: EchoHub.Client.UI.ListSources.SearchListSource.MaxItemLength* + name: MaxItemLength + href: api/client/EchoHub.Client.UI.ListSources.SearchListSource.html#EchoHub_Client_UI_ListSources_SearchListSource_MaxItemLength_ + commentId: Overload:EchoHub.Client.UI.ListSources.SearchListSource.MaxItemLength + fullName: EchoHub.Client.UI.ListSources.SearchListSource.MaxItemLength + nameWithType: SearchListSource.MaxItemLength +- uid: EchoHub.Client.UI.ListSources.SearchListSource.Render(Terminal.Gui.Views.ListView,System.Boolean,System.Int32,System.Int32,System.Int32,System.Int32,System.Int32) + name: Render(ListView, bool, int, int, int, int, int) + href: api/client/EchoHub.Client.UI.ListSources.SearchListSource.html#EchoHub_Client_UI_ListSources_SearchListSource_Render_Terminal_Gui_Views_ListView_System_Boolean_System_Int32_System_Int32_System_Int32_System_Int32_System_Int32_ + commentId: M:EchoHub.Client.UI.ListSources.SearchListSource.Render(Terminal.Gui.Views.ListView,System.Boolean,System.Int32,System.Int32,System.Int32,System.Int32,System.Int32) + name.vb: Render(ListView, Boolean, Integer, Integer, Integer, Integer, Integer) + fullName: EchoHub.Client.UI.ListSources.SearchListSource.Render(Terminal.Gui.Views.ListView, bool, int, int, int, int, int) + fullName.vb: EchoHub.Client.UI.ListSources.SearchListSource.Render(Terminal.Gui.Views.ListView, Boolean, Integer, Integer, Integer, Integer, Integer) + nameWithType: SearchListSource.Render(ListView, bool, int, int, int, int, int) + nameWithType.vb: SearchListSource.Render(ListView, Boolean, Integer, Integer, Integer, Integer, Integer) +- uid: EchoHub.Client.UI.ListSources.SearchListSource.Render* + name: Render + href: api/client/EchoHub.Client.UI.ListSources.SearchListSource.html#EchoHub_Client_UI_ListSources_SearchListSource_Render_ + commentId: Overload:EchoHub.Client.UI.ListSources.SearchListSource.Render + fullName: EchoHub.Client.UI.ListSources.SearchListSource.Render + nameWithType: SearchListSource.Render +- uid: EchoHub.Client.UI.ListSources.SearchListSource.SetMark(System.Int32,System.Boolean) + name: SetMark(int, bool) + href: api/client/EchoHub.Client.UI.ListSources.SearchListSource.html#EchoHub_Client_UI_ListSources_SearchListSource_SetMark_System_Int32_System_Boolean_ + commentId: M:EchoHub.Client.UI.ListSources.SearchListSource.SetMark(System.Int32,System.Boolean) + name.vb: SetMark(Integer, Boolean) + fullName: EchoHub.Client.UI.ListSources.SearchListSource.SetMark(int, bool) + fullName.vb: EchoHub.Client.UI.ListSources.SearchListSource.SetMark(Integer, Boolean) + nameWithType: SearchListSource.SetMark(int, bool) + nameWithType.vb: SearchListSource.SetMark(Integer, Boolean) +- uid: EchoHub.Client.UI.ListSources.SearchListSource.SetMark* + name: SetMark + href: api/client/EchoHub.Client.UI.ListSources.SearchListSource.html#EchoHub_Client_UI_ListSources_SearchListSource_SetMark_ + commentId: Overload:EchoHub.Client.UI.ListSources.SearchListSource.SetMark + fullName: EchoHub.Client.UI.ListSources.SearchListSource.SetMark + nameWithType: SearchListSource.SetMark +- uid: EchoHub.Client.UI.ListSources.SearchListSource.SuspendCollectionChangedEvent + name: SuspendCollectionChangedEvent + href: api/client/EchoHub.Client.UI.ListSources.SearchListSource.html#EchoHub_Client_UI_ListSources_SearchListSource_SuspendCollectionChangedEvent + commentId: P:EchoHub.Client.UI.ListSources.SearchListSource.SuspendCollectionChangedEvent + fullName: EchoHub.Client.UI.ListSources.SearchListSource.SuspendCollectionChangedEvent + nameWithType: SearchListSource.SuspendCollectionChangedEvent +- uid: EchoHub.Client.UI.ListSources.SearchListSource.SuspendCollectionChangedEvent* + name: SuspendCollectionChangedEvent + href: api/client/EchoHub.Client.UI.ListSources.SearchListSource.html#EchoHub_Client_UI_ListSources_SearchListSource_SuspendCollectionChangedEvent_ + commentId: Overload:EchoHub.Client.UI.ListSources.SearchListSource.SuspendCollectionChangedEvent + fullName: EchoHub.Client.UI.ListSources.SearchListSource.SuspendCollectionChangedEvent + nameWithType: SearchListSource.SuspendCollectionChangedEvent +- uid: EchoHub.Client.UI.ListSources.SearchListSource.ToList + name: ToList() + href: api/client/EchoHub.Client.UI.ListSources.SearchListSource.html#EchoHub_Client_UI_ListSources_SearchListSource_ToList + commentId: M:EchoHub.Client.UI.ListSources.SearchListSource.ToList + fullName: EchoHub.Client.UI.ListSources.SearchListSource.ToList() + nameWithType: SearchListSource.ToList() +- uid: EchoHub.Client.UI.ListSources.SearchListSource.ToList* + name: ToList + href: api/client/EchoHub.Client.UI.ListSources.SearchListSource.html#EchoHub_Client_UI_ListSources_SearchListSource_ToList_ + commentId: Overload:EchoHub.Client.UI.ListSources.SearchListSource.ToList + fullName: EchoHub.Client.UI.ListSources.SearchListSource.ToList + nameWithType: SearchListSource.ToList - uid: EchoHub.Client.UI.ListSources.UserListSource name: UserListSource href: api/client/EchoHub.Client.UI.ListSources.UserListSource.html @@ -5068,6 +5485,12 @@ references: commentId: E:EchoHub.Client.UI.MainWindow.OnFileDownloadRequested fullName: EchoHub.Client.UI.MainWindow.OnFileDownloadRequested nameWithType: MainWindow.OnFileDownloadRequested +- uid: EchoHub.Client.UI.MainWindow.OnLoadMoreRequested + name: OnLoadMoreRequested + href: api/client/EchoHub.Client.UI.MainWindow.html#EchoHub_Client_UI_MainWindow_OnLoadMoreRequested + commentId: E:EchoHub.Client.UI.MainWindow.OnLoadMoreRequested + fullName: EchoHub.Client.UI.MainWindow.OnLoadMoreRequested + nameWithType: MainWindow.OnLoadMoreRequested - uid: EchoHub.Client.UI.MainWindow.OnLogoutRequested name: OnLogoutRequested href: api/client/EchoHub.Client.UI.MainWindow.html#EchoHub_Client_UI_MainWindow_OnLogoutRequested @@ -5098,6 +5521,12 @@ references: commentId: E:EchoHub.Client.UI.MainWindow.OnSavedServersRequested fullName: EchoHub.Client.UI.MainWindow.OnSavedServersRequested nameWithType: MainWindow.OnSavedServersRequested +- uid: EchoHub.Client.UI.MainWindow.OnSearchRequested + name: OnSearchRequested + href: api/client/EchoHub.Client.UI.MainWindow.html#EchoHub_Client_UI_MainWindow_OnSearchRequested + commentId: E:EchoHub.Client.UI.MainWindow.OnSearchRequested + fullName: EchoHub.Client.UI.MainWindow.OnSearchRequested + nameWithType: MainWindow.OnSearchRequested - uid: EchoHub.Client.UI.MainWindow.OnStatusRequested name: OnStatusRequested href: api/client/EchoHub.Client.UI.MainWindow.html#EchoHub_Client_UI_MainWindow_OnStatusRequested @@ -5998,15 +6427,15 @@ references: commentId: Overload:EchoHub.Core.Contracts.IChatService.BroadcastMessageAsync fullName: EchoHub.Core.Contracts.IChatService.BroadcastMessageAsync nameWithType: IChatService.BroadcastMessageAsync -- uid: EchoHub.Core.Contracts.IChatService.GetChannelHistoryAsync(System.String,System.Int32) - name: GetChannelHistoryAsync(string, int) - href: api/core/EchoHub.Core.Contracts.IChatService.html#EchoHub_Core_Contracts_IChatService_GetChannelHistoryAsync_System_String_System_Int32_ - commentId: M:EchoHub.Core.Contracts.IChatService.GetChannelHistoryAsync(System.String,System.Int32) - name.vb: GetChannelHistoryAsync(String, Integer) - fullName: EchoHub.Core.Contracts.IChatService.GetChannelHistoryAsync(string, int) - fullName.vb: EchoHub.Core.Contracts.IChatService.GetChannelHistoryAsync(String, Integer) - nameWithType: IChatService.GetChannelHistoryAsync(string, int) - nameWithType.vb: IChatService.GetChannelHistoryAsync(String, Integer) +- uid: EchoHub.Core.Contracts.IChatService.GetChannelHistoryAsync(System.String,System.Int32,System.Int32) + name: GetChannelHistoryAsync(string, int, int) + href: api/core/EchoHub.Core.Contracts.IChatService.html#EchoHub_Core_Contracts_IChatService_GetChannelHistoryAsync_System_String_System_Int32_System_Int32_ + commentId: M:EchoHub.Core.Contracts.IChatService.GetChannelHistoryAsync(System.String,System.Int32,System.Int32) + name.vb: GetChannelHistoryAsync(String, Integer, Integer) + fullName: EchoHub.Core.Contracts.IChatService.GetChannelHistoryAsync(string, int, int) + fullName.vb: EchoHub.Core.Contracts.IChatService.GetChannelHistoryAsync(String, Integer, Integer) + nameWithType: IChatService.GetChannelHistoryAsync(string, int, int) + nameWithType.vb: IChatService.GetChannelHistoryAsync(String, Integer, Integer) - uid: EchoHub.Core.Contracts.IChatService.GetChannelHistoryAsync* name: GetChannelHistoryAsync href: api/core/EchoHub.Core.Contracts.IChatService.html#EchoHub_Core_Contracts_IChatService_GetChannelHistoryAsync_ @@ -14536,15 +14965,15 @@ references: fullName.vb: EchoHub.Server.Hubs.ChatHub.New nameWithType: ChatHub.ChatHub nameWithType.vb: ChatHub.New -- uid: EchoHub.Server.Hubs.ChatHub.GetChannelHistory(System.String,System.Int32) - name: GetChannelHistory(string, int) - href: api/server/EchoHub.Server.Hubs.ChatHub.html#EchoHub_Server_Hubs_ChatHub_GetChannelHistory_System_String_System_Int32_ - commentId: M:EchoHub.Server.Hubs.ChatHub.GetChannelHistory(System.String,System.Int32) - name.vb: GetChannelHistory(String, Integer) - fullName: EchoHub.Server.Hubs.ChatHub.GetChannelHistory(string, int) - fullName.vb: EchoHub.Server.Hubs.ChatHub.GetChannelHistory(String, Integer) - nameWithType: ChatHub.GetChannelHistory(string, int) - nameWithType.vb: ChatHub.GetChannelHistory(String, Integer) +- uid: EchoHub.Server.Hubs.ChatHub.GetChannelHistory(System.String,System.Int32,System.Int32) + name: GetChannelHistory(string, int, int) + href: api/server/EchoHub.Server.Hubs.ChatHub.html#EchoHub_Server_Hubs_ChatHub_GetChannelHistory_System_String_System_Int32_System_Int32_ + commentId: M:EchoHub.Server.Hubs.ChatHub.GetChannelHistory(System.String,System.Int32,System.Int32) + name.vb: GetChannelHistory(String, Integer, Integer) + fullName: EchoHub.Server.Hubs.ChatHub.GetChannelHistory(string, int, int) + fullName.vb: EchoHub.Server.Hubs.ChatHub.GetChannelHistory(String, Integer, Integer) + nameWithType: ChatHub.GetChannelHistory(string, int, int) + nameWithType.vb: ChatHub.GetChannelHistory(String, Integer, Integer) - uid: EchoHub.Server.Hubs.ChatHub.GetChannelHistory* name: GetChannelHistory href: api/server/EchoHub.Server.Hubs.ChatHub.html#EchoHub_Server_Hubs_ChatHub_GetChannelHistory_ @@ -16015,15 +16444,15 @@ references: commentId: Overload:EchoHub.Server.Services.ChatService.BroadcastMessageAsync fullName: EchoHub.Server.Services.ChatService.BroadcastMessageAsync nameWithType: ChatService.BroadcastMessageAsync -- uid: EchoHub.Server.Services.ChatService.GetChannelHistoryAsync(System.String,System.Int32) - name: GetChannelHistoryAsync(string, int) - href: api/server/EchoHub.Server.Services.ChatService.html#EchoHub_Server_Services_ChatService_GetChannelHistoryAsync_System_String_System_Int32_ - commentId: M:EchoHub.Server.Services.ChatService.GetChannelHistoryAsync(System.String,System.Int32) - name.vb: GetChannelHistoryAsync(String, Integer) - fullName: EchoHub.Server.Services.ChatService.GetChannelHistoryAsync(string, int) - fullName.vb: EchoHub.Server.Services.ChatService.GetChannelHistoryAsync(String, Integer) - nameWithType: ChatService.GetChannelHistoryAsync(string, int) - nameWithType.vb: ChatService.GetChannelHistoryAsync(String, Integer) +- uid: EchoHub.Server.Services.ChatService.GetChannelHistoryAsync(System.String,System.Int32,System.Int32) + name: GetChannelHistoryAsync(string, int, int) + href: api/server/EchoHub.Server.Services.ChatService.html#EchoHub_Server_Services_ChatService_GetChannelHistoryAsync_System_String_System_Int32_System_Int32_ + commentId: M:EchoHub.Server.Services.ChatService.GetChannelHistoryAsync(System.String,System.Int32,System.Int32) + name.vb: GetChannelHistoryAsync(String, Integer, Integer) + fullName: EchoHub.Server.Services.ChatService.GetChannelHistoryAsync(string, int, int) + fullName.vb: EchoHub.Server.Services.ChatService.GetChannelHistoryAsync(String, Integer, Integer) + nameWithType: ChatService.GetChannelHistoryAsync(string, int, int) + nameWithType.vb: ChatService.GetChannelHistoryAsync(String, Integer, Integer) - uid: EchoHub.Server.Services.ChatService.GetChannelHistoryAsync* name: GetChannelHistoryAsync href: api/server/EchoHub.Server.Services.ChatService.html#EchoHub_Server_Services_ChatService_GetChannelHistoryAsync_