From 35bf05433ecc107b747d70c1864cd4f001755744 Mon Sep 17 00:00:00 2001 From: HueByte Date: Fri, 24 Apr 2026 14:14:33 +0000 Subject: [PATCH] deploy: 62355654807caab96133c9dc35732d3d861a6d54 --- ...b.Server.Controllers.ServerController.html | 44 +- ...b.Server.Services.DirectoryClaimStore.html | 492 ++++++++++++++ ...hoHub.Server.Services.PresenceTracker.html | 35 + ...ub.Server.Services.RegistrationStatus.html | 629 ++++++++++++++++++ ...erver.Services.ServerDirectoryService.html | 8 +- api/server/EchoHub.Server.Services.html | 12 + api/toc.html | 6 + api/toc.json | 2 +- articles/getting-started.html | 2 +- changelog/index.html | 1 + changelog/toc.html | 3 + changelog/toc.json | 2 +- changelog/v0.2.11.html | 137 ++++ index.json | 27 +- manifest.json | 38 ++ xrefmap.yml | 363 +++++++++- 16 files changed, 1768 insertions(+), 33 deletions(-) create mode 100644 api/server/EchoHub.Server.Services.DirectoryClaimStore.html create mode 100644 api/server/EchoHub.Server.Services.RegistrationStatus.html create mode 100644 changelog/v0.2.11.html diff --git a/api/server/EchoHub.Server.Controllers.ServerController.html b/api/server/EchoHub.Server.Controllers.ServerController.html index 9e82355..82b6c60 100644 --- a/api/server/EchoHub.Server.Controllers.ServerController.html +++ b/api/server/EchoHub.Server.Controllers.ServerController.html @@ -157,8 +157,8 @@ public class ServerController : ControllerBase -

- ServerController(EchoHubDbContext, IConfiguration) +

+ ServerController(EchoHubDbContext, IConfiguration, DirectoryClaimStore)

@@ -166,7 +166,7 @@ public class ServerController : ControllerBase
-
public ServerController(EchoHubDbContext db, IConfiguration config)
+
public ServerController(EchoHubDbContext db, IConfiguration config, DirectoryClaimStore claimStore)

Parameters

@@ -175,6 +175,8 @@ public class ServerController : ControllerBase
config IConfiguration
+
claimStore DirectoryClaimStore
+
@@ -192,6 +194,42 @@ public class ServerController : ControllerBase + + +

+ GetDirectoryStatus() + +

+ +

Operator-facing view of the EchoHubSpace directory registration: ServerId for admin +support tickets, current registration state, and the last error/conflict if any. +Never exposes the claim token itself.

+
+
+ +
+
[HttpGet("directory")]
+[Authorize]
+public Task<IActionResult> GetDirectoryStatus()
+
+ + +

Returns

+
+
Task<IActionResult>
+
+
+ + + + + + + + + + +

diff --git a/api/server/EchoHub.Server.Services.DirectoryClaimStore.html b/api/server/EchoHub.Server.Services.DirectoryClaimStore.html new file mode 100644 index 0000000..f27eb70 --- /dev/null +++ b/api/server/EchoHub.Server.Services.DirectoryClaimStore.html @@ -0,0 +1,492 @@ + + + + + Class DirectoryClaimStore | EchoHub Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+
Table of Contents
+ +
+
+ +
+
+
+ +
+
+ + + +
+ +
+ + + +

+Class DirectoryClaimStore +

+ +
+
Namespace
EchoHub.Server.Services
+
Assembly
EchoHub.Server.dll
+
+ +

Persists and exposes the EchoHubSpace directory claim — the opaque token issued on first +registration and the row's stable ServerId. Also surfaces ephemeral registration +status (success/failure code, conflicting hosts) for operator-facing endpoints.

+

Persistence uses atomic write (tmp + rename). Treat the file contents as a secret.

+
+
+ +
+
public sealed class DirectoryClaimStore
+
+ + + + +
+
Inheritance
+
+ +
DirectoryClaimStore
+
+
+ + + +
+
Inherited Members
+
+ + + + + + +
+ + + + + + +

Constructors +

+ + + + +

+ DirectoryClaimStore(IConfiguration, ILogger<DirectoryClaimStore>) + +

+ +
+
+ +
+
public DirectoryClaimStore(IConfiguration configuration, ILogger<DirectoryClaimStore> logger)
+
+ +

Parameters

+
+
configuration IConfiguration
+
+
logger ILogger<DirectoryClaimStore>
+
+
+ + + + + + + + + + + + +

Properties +

+ + + + +

+ ClaimToken + +

+ +
+
+ +
+
public string? ClaimToken { get; }
+
+ + + + + +

Property Value

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

+ FilePath + +

+ +
+
+ +
+
public string FilePath { get; }
+
+ + + + + +

Property Value

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

+ ServerId + +

+ +
+
+ +
+
public Guid? ServerId { get; }
+
+ + + + + +

Property Value

+
+
Guid?
+
+
+ + + + + + + + + + +

+ Status + +

+ +
+
+ +
+
public RegistrationStatus Status { get; }
+
+ + + + + +

Property Value

+
+
RegistrationStatus
+
+
+ + + + + + + + +

Methods +

+ + + + +

+ SaveClaimAsync(string, Guid, CancellationToken) + +

+ +

Persist a freshly-issued claim token alongside the server's stable ServerId. +Called exactly once per row's lifetime — on first claim. Atomic on-disk swap.

+
+
+ +
+
public Task SaveClaimAsync(string claimToken, Guid serverId, CancellationToken ct = default)
+
+ +

Parameters

+
+
claimToken string
+
+
serverId Guid
+
+
ct CancellationToken
+
+
+ +

Returns

+
+
Task
+
+
+ + + + + + + + + + + + + +

+ SetFailure(string, string[]?) + +

+ +
+
+ +
+
public void SetFailure(string errorCode, string[]? conflictingHosts)
+
+ +

Parameters

+
+
errorCode string
+
+
conflictingHosts string[]
+
+
+ + + + + + + + + + + + + + +

+ SetSuccess(Guid) + +

+ +
+
+ +
+
public void SetSuccess(Guid serverId)
+
+ +

Parameters

+
+
serverId Guid
+
+
+ + + + + + + + + + + + + + +

+ UpdateServerIdAsync(Guid, CancellationToken) + +

+ +

Update only the ServerId — used when re-registering with an existing token (Success path, +hub returns ServerId again but no fresh token). No-op if the value is unchanged.

+
+
+ +
+
public Task UpdateServerIdAsync(Guid serverId, CancellationToken ct = default)
+
+ +

Parameters

+
+
serverId Guid
+
+
ct CancellationToken
+
+
+ +

Returns

+
+
Task
+
+
+ + + + + + + + + + + + +
+ + + + +
+ +
+ +
+
+ +
+ + + + diff --git a/api/server/EchoHub.Server.Services.PresenceTracker.html b/api/server/EchoHub.Server.Services.PresenceTracker.html index 80970ce..6f15bcc 100644 --- a/api/server/EchoHub.Server.Services.PresenceTracker.html +++ b/api/server/EchoHub.Server.Services.PresenceTracker.html @@ -575,6 +575,41 @@ so the caller can broadcast departures and force-disconnect connections.

+

Events +

+ + + +

+ UserCountChanged + +

+ +

Raised when the distinct online user count changes (multi-connection users only fire once).

+
+
+ +
+
public event Action<int>? UserCountChanged
+
+ + + + + + +

Event Type

+
+
Action<int>
+
+
+ + + + + + + diff --git a/api/server/EchoHub.Server.Services.RegistrationStatus.html b/api/server/EchoHub.Server.Services.RegistrationStatus.html new file mode 100644 index 0000000..1182387 --- /dev/null +++ b/api/server/EchoHub.Server.Services.RegistrationStatus.html @@ -0,0 +1,629 @@ + + + + + Class RegistrationStatus | EchoHub Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+
Table of Contents
+ +
+
+ +
+
+
+ +
+
+ + + +
+ +
+ + + +

+Class RegistrationStatus +

+ +
+
Namespace
EchoHub.Server.Services
+
Assembly
EchoHub.Server.dll
+
+ +
+
+ +
+
public sealed record RegistrationStatus : IEquatable<RegistrationStatus>
+
+ + + + +
+
Inheritance
+
+ +
RegistrationStatus
+
+
+ +
+
Implements
+
+ +
+
+ + +
+
Inherited Members
+
+ + + +
+ + + + + + +

Constructors +

+ + + + +

+ RegistrationStatus(bool, Guid?, DateTimeOffset?, string?, string[]?) + +

+ +
+
+ +
+
public RegistrationStatus(bool IsRegistered, Guid? ServerId, DateTimeOffset? LastRegisteredAt, string? LastError, string[]? ConflictingHosts)
+
+ +

Parameters

+
+
IsRegistered bool
+
+
ServerId Guid?
+
+
LastRegisteredAt DateTimeOffset?
+
+
LastError string
+
+
ConflictingHosts string[]
+
+
+ + + + + + + + + + + + +

Properties +

+ + + + +

+ ConflictingHosts + +

+ +
+
+ +
+
public string[]? ConflictingHosts { get; init; }
+
+ + + + + +

Property Value

+
+
string[]
+
+
+ + + + + + + + + + +

+ IsRegistered + +

+ +
+
+ +
+
public bool IsRegistered { get; init; }
+
+ + + + + +

Property Value

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

+ LastError + +

+ +
+
+ +
+
public string? LastError { get; init; }
+
+ + + + + +

Property Value

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

+ LastRegisteredAt + +

+ +
+
+ +
+
public DateTimeOffset? LastRegisteredAt { get; init; }
+
+ + + + + +

Property Value

+
+
DateTimeOffset?
+
+
+ + + + + + + + + + +

+ ServerId + +

+ +
+
+ +
+
public Guid? ServerId { get; init; }
+
+ + + + + +

Property Value

+
+
Guid?
+
+
+ + + + + + + + +

Methods +

+ + + + +

+ Deconstruct(out bool, out Guid?, out DateTimeOffset?, out string?, out string[]?) + +

+ +
+
+ +
+
public void Deconstruct(out bool IsRegistered, out Guid? ServerId, out DateTimeOffset? LastRegisteredAt, out string? LastError, out string[]? ConflictingHosts)
+
+ +

Parameters

+
+
IsRegistered bool
+
+
ServerId Guid?
+
+
LastRegisteredAt DateTimeOffset?
+
+
LastError string
+
+
ConflictingHosts string[]
+
+
+ + + + + + + + + + + + + + +

+ Equals(RegistrationStatus?) + +

+ +
+
+ +
+
public bool Equals(RegistrationStatus? other)
+
+ +

Parameters

+
+
other RegistrationStatus
+
+
+ +

Returns

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

+ Equals(object?) + +

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

Parameters

+
+
obj object
+
+
+ +

Returns

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

+ GetHashCode() + +

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

Returns

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

+ ToString() + +

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

Returns

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

Operators +

+ + + + +

+ operator ==(RegistrationStatus?, RegistrationStatus?) + +

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

Parameters

+
+
left RegistrationStatus
+
+
right RegistrationStatus
+
+
+ +

Returns

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

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

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

Parameters

+
+
left RegistrationStatus
+
+
right RegistrationStatus
+
+
+ +

Returns

+
+
bool
+
+
+ + + + + + + + + + + + +
+ + + + +
+ +
+ +
+
+ +
+ + + + diff --git a/api/server/EchoHub.Server.Services.ServerDirectoryService.html b/api/server/EchoHub.Server.Services.ServerDirectoryService.html index 8187379..d6bf74d 100644 --- a/api/server/EchoHub.Server.Services.ServerDirectoryService.html +++ b/api/server/EchoHub.Server.Services.ServerDirectoryService.html @@ -158,8 +158,8 @@ Class ServerDirectoryService -

- ServerDirectoryService(IConfiguration, PresenceTracker, ILogger<ServerDirectoryService>) +

+ ServerDirectoryService(IConfiguration, PresenceTracker, DirectoryClaimStore, ILogger<ServerDirectoryService>)

@@ -167,7 +167,7 @@ Class ServerDirectoryService
-
public ServerDirectoryService(IConfiguration configuration, PresenceTracker presenceTracker, ILogger<ServerDirectoryService> logger)
+
public ServerDirectoryService(IConfiguration configuration, PresenceTracker presenceTracker, DirectoryClaimStore claimStore, ILogger<ServerDirectoryService> logger)

Parameters

@@ -176,6 +176,8 @@ Class ServerDirectoryService
PresenceTracker
+
claimStore DirectoryClaimStore
+
logger ILogger<ServerDirectoryService>
diff --git a/api/server/EchoHub.Server.Services.html b/api/server/EchoHub.Server.Services.html index 4c64ea2..686fba1 100644 --- a/api/server/EchoHub.Server.Services.html +++ b/api/server/EchoHub.Server.Services.html @@ -102,6 +102,14 @@ Classes
ChatService
+
+
DirectoryClaimStore
+

Persists and exposes the EchoHubSpace directory claim — the opaque token issued on first +registration and the row's stable ServerId. Also surfaces ephemeral registration +status (success/failure code, conflicting hosts) for operator-facing endpoints.

+

Persistence uses atomic write (tmp + rename). Treat the file contents as a secret.

+
+
FileCleanupService
@@ -135,6 +143,10 @@ Classes
PresenceTracker
+
+
RegistrationStatus
+
+
ServerDirectoryService
diff --git a/api/toc.html b/api/toc.html index 27d84c6..5066580 100644 --- a/api/toc.html +++ b/api/toc.html @@ -553,6 +553,9 @@
  • ChatService
  • +
  • + DirectoryClaimStore +
  • FileCleanupService
  • @@ -577,6 +580,9 @@
  • PresenceTracker
  • +
  • + RegistrationStatus +
  • ServerDirectoryService
  • diff --git a/api/toc.json b/api/toc.json index 7c9619c..d69df73 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":"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"}]}]}]}]} +{"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":"DirectoryClaimStore","href":"server/EchoHub.Server.Services.DirectoryClaimStore.html","topicHref":"server/EchoHub.Server.Services.DirectoryClaimStore.html","topicUid":"EchoHub.Server.Services.DirectoryClaimStore","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":"RegistrationStatus","href":"server/EchoHub.Server.Services.RegistrationStatus.html","topicHref":"server/EchoHub.Server.Services.RegistrationStatus.html","topicUid":"EchoHub.Server.Services.RegistrationStatus","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 f2d437c..ae98cd3 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.10
    +
    curl -sSfL .../install.sh | sh -s -- --version 0.2.11
     curl -sSfL .../install.sh | sh -s -- --install-dir /opt/echohub
     

    Manual Download

    diff --git a/changelog/index.html b/changelog/index.html index 07a8271..23a90ca 100644 --- a/changelog/index.html +++ b/changelog/index.html @@ -90,6 +90,7 @@

    Release history for EchoHub.

    Releases

      +
    • v0.2.11 - EchoHubSpace Auth, Live Directory Updates & Server Browser Metadata
    • 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
    • diff --git a/changelog/toc.html b/changelog/toc.html index 35d553d..0ad1431 100644 --- a/changelog/toc.html +++ b/changelog/toc.html @@ -15,6 +15,9 @@
    • Overview
    • +
    • + v0.2.11 +
    • v0.2.10
    • diff --git a/changelog/toc.json b/changelog/toc.json index 809b6fe..7d2ec0a 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.10","href":"v0.2.10.html","topicHref":"v0.2.10.html"},{"name":"v0.2.9","href":"v0.2.9.html","topicHref":"v0.2.9.html"},{"name":"v0.2.8","href":"v0.2.8.html","topicHref":"v0.2.8.html"},{"name":"v0.2.7","href":"v0.2.7.html","topicHref":"v0.2.7.html"},{"name":"v0.2.6","href":"v0.2.6.html","topicHref":"v0.2.6.html"},{"name":"v0.2.5","href":"v0.2.5.html","topicHref":"v0.2.5.html"},{"name":"v0.2.4","href":"v0.2.4.html","topicHref":"v0.2.4.html"},{"name":"v0.2.3","href":"v0.2.3.html","topicHref":"v0.2.3.html"},{"name":"v0.2.2","href":"v0.2.2.html","topicHref":"v0.2.2.html"},{"name":"v0.2.1","href":"v0.2.1.html","topicHref":"v0.2.1.html"},{"name":"v0.2.0","href":"v0.2.0.html","topicHref":"v0.2.0.html"},{"name":"v0.1.1","href":"v0.1.1.html","topicHref":"v0.1.1.html"},{"name":"v0.1.0","href":"v0.1.0.html","topicHref":"v0.1.0.html"}]} +{"items":[{"name":"Overview","href":"index.html","topicHref":"index.html"},{"name":"v0.2.11","href":"v0.2.11.html","topicHref":"v0.2.11.html"},{"name":"v0.2.10","href":"v0.2.10.html","topicHref":"v0.2.10.html"},{"name":"v0.2.9","href":"v0.2.9.html","topicHref":"v0.2.9.html"},{"name":"v0.2.8","href":"v0.2.8.html","topicHref":"v0.2.8.html"},{"name":"v0.2.7","href":"v0.2.7.html","topicHref":"v0.2.7.html"},{"name":"v0.2.6","href":"v0.2.6.html","topicHref":"v0.2.6.html"},{"name":"v0.2.5","href":"v0.2.5.html","topicHref":"v0.2.5.html"},{"name":"v0.2.4","href":"v0.2.4.html","topicHref":"v0.2.4.html"},{"name":"v0.2.3","href":"v0.2.3.html","topicHref":"v0.2.3.html"},{"name":"v0.2.2","href":"v0.2.2.html","topicHref":"v0.2.2.html"},{"name":"v0.2.1","href":"v0.2.1.html","topicHref":"v0.2.1.html"},{"name":"v0.2.0","href":"v0.2.0.html","topicHref":"v0.2.0.html"},{"name":"v0.1.1","href":"v0.1.1.html","topicHref":"v0.1.1.html"},{"name":"v0.1.0","href":"v0.1.0.html","topicHref":"v0.1.0.html"}]} diff --git a/changelog/v0.2.11.html b/changelog/v0.2.11.html new file mode 100644 index 0000000..ed34f9b --- /dev/null +++ b/changelog/v0.2.11.html @@ -0,0 +1,137 @@ + + + + + v0.2.11 | EchoHub Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + +
      + +
      +
      +
      +
      +
      Table of Contents
      + +
      +
      + +
      +
      +
      + +
      +
      + + + +
      + +
      +

      v0.2.11

      + +

      EchoHubSpace directory protocol overhaul: authenticated server registration with persistent claim tokens, near-real-time user-count updates, and richer server metadata (tags, multi-host, version). Coordinated cutover with the EchoHubSpace directory deploy.

      +

      New Features

      +
        +
      • EchoHubSpace claim-token authentication — the directory issues a per-server claim token on first registration, persisted atomically alongside the SQLite database (chmod 0600 on Unix). Subsequent reconnects authenticate with the token instead of relying on raw hostname-squatting protection. Token survives both client and directory restarts; lost tokens require an admin-side DELETE /api/servers/{id} on the directory to recover
      • +
      • Server tags — public servers can advertise topic tags via the new Server:Tags config array, surfacing as filter facets in the EchoHubSpace browser
      • +
      • Multi-host advertisement — a single server can register multiple hostnames (e.g. apex domain, IPv6, alias domains) by listing them in Server:PublicHosts. All hosts route to the same directory row
      • +
      • Server version sent to directory — the EchoHubSpace browser shows what version each public server is running, pulled from the server's assembly informational version
      • +
      • Operator-facing GET /api/server/directory endpoint (Admin role required) — returns ServerId, IsRegistered, LastRegisteredAt, LastError, and any ConflictingHosts for support tickets. Never exposes the claim token itself, only a HasClaimToken boolean
      • +
      +

      Refactoring

      +
        +
      • Replace 30s polling with event-driven directory updates — PresenceTracker now raises UserCountChanged only when the distinct user count actually changes (multi-tab/multi-connection users no longer trigger). ServerDirectoryService consumes via a single-slot Channel<int> (latest-wins coalesces bursts) with a 1-second min-interval throttle. Directory reflects user-count changes within ~1s instead of up to 30s stale
      • +
      • Wrap directory hub responses in a Response<T> envelope with IsSuccess/Data/Errors/Version shape — protocol version is pinned client-side (currently 1.0); mismatches trigger a permanent-failure stop with operator-facing log
      • +
      • Stop attempting re-registration after permanent failures (HostAlreadyClaimed, InvalidToken, HostConflict, InvalidInput) — the directory no longer terminates the connection on these errors, so the client suppresses re-register on Reconnected to avoid tight retry loops. Operator must restart the server after fixing config
      • +
      +

      Configuration

      +
        +
      • Breaking: Server:PublicHost (string) renamed to Server:PublicHosts (string array). Public servers must update appsettings.json — single-host deployments use a one-element array
      • +
      • New Server:Tags (string array) — defaults to empty
      • +
      • New optional Server:DirectoryClaimPath — overrides the path of the persisted claim file. Defaults to a directory-claim.json next to the SQLite database. Treat the file as a secret; back it up alongside the database
      • +
      + +
      + + + + + +
      + +
      + +
      +
      + +
      + + + + diff --git a/index.json b/index.json index a24dfac..deb0b65 100644 --- a/index.json +++ b/index.json @@ -657,7 +657,7 @@ "api/server/EchoHub.Server.Controllers.ServerController.html": { "href": "api/server/EchoHub.Server.Controllers.ServerController.html", "title": "Class ServerController | EchoHub Documentation", - "summary": "Class ServerController Namespace EchoHub.Server.Controllers Assembly EchoHub.Server.dll [ApiController] [Route(\"api/server\")] public class ServerController : ControllerBase Inheritance object ControllerBase ServerController Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors ServerController(EchoHubDbContext, IConfiguration) public ServerController(EchoHubDbContext db, IConfiguration config) Parameters db EchoHubDbContext config IConfiguration Methods GetEncryptionKey() [HttpGet(\"encryption-key\")] [Authorize] [EnableRateLimiting(\"auth\")] public IActionResult GetEncryptionKey() Returns IActionResult GetInfo() [HttpGet(\"info\")] public Task GetInfo() Returns Task" + "summary": "Class ServerController Namespace EchoHub.Server.Controllers Assembly EchoHub.Server.dll [ApiController] [Route(\"api/server\")] public class ServerController : ControllerBase Inheritance object ControllerBase ServerController Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors ServerController(EchoHubDbContext, IConfiguration, DirectoryClaimStore) public ServerController(EchoHubDbContext db, IConfiguration config, DirectoryClaimStore claimStore) Parameters db EchoHubDbContext config IConfiguration claimStore DirectoryClaimStore Methods GetDirectoryStatus() Operator-facing view of the EchoHubSpace directory registration: ServerId for admin support tickets, current registration state, and the last error/conflict if any. Never exposes the claim token itself. [HttpGet(\"directory\")] [Authorize] public Task GetDirectoryStatus() Returns Task GetEncryptionKey() [HttpGet(\"encryption-key\")] [Authorize] [EnableRateLimiting(\"auth\")] public IActionResult GetEncryptionKey() Returns IActionResult GetInfo() [HttpGet(\"info\")] public Task GetInfo() Returns Task" }, "api/server/EchoHub.Server.Controllers.UsersController.html": { "href": "api/server/EchoHub.Server.Controllers.UsersController.html", @@ -739,6 +739,11 @@ "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, 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.DirectoryClaimStore.html": { + "href": "api/server/EchoHub.Server.Services.DirectoryClaimStore.html", + "title": "Class DirectoryClaimStore | EchoHub Documentation", + "summary": "Class DirectoryClaimStore Namespace EchoHub.Server.Services Assembly EchoHub.Server.dll Persists and exposes the EchoHubSpace directory claim — the opaque token issued on first registration and the row's stable ServerId. Also surfaces ephemeral registration status (success/failure code, conflicting hosts) for operator-facing endpoints. Persistence uses atomic write (tmp + rename). Treat the file contents as a secret. public sealed class DirectoryClaimStore Inheritance object DirectoryClaimStore Inherited Members object.GetType() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors DirectoryClaimStore(IConfiguration, ILogger) public DirectoryClaimStore(IConfiguration configuration, ILogger logger) Parameters configuration IConfiguration logger ILogger Properties ClaimToken public string? ClaimToken { get; } Property Value string FilePath public string FilePath { get; } Property Value string ServerId public Guid? ServerId { get; } Property Value Guid? Status public RegistrationStatus Status { get; } Property Value RegistrationStatus Methods SaveClaimAsync(string, Guid, CancellationToken) Persist a freshly-issued claim token alongside the server's stable ServerId. Called exactly once per row's lifetime — on first claim. Atomic on-disk swap. public Task SaveClaimAsync(string claimToken, Guid serverId, CancellationToken ct = default) Parameters claimToken string serverId Guid ct CancellationToken Returns Task SetFailure(string, string[]?) public void SetFailure(string errorCode, string[]? conflictingHosts) Parameters errorCode string conflictingHosts string[] SetSuccess(Guid) public void SetSuccess(Guid serverId) Parameters serverId Guid UpdateServerIdAsync(Guid, CancellationToken) Update only the ServerId — used when re-registering with an existing token (Success path, hub returns ServerId again but no fresh token). No-op if the value is unchanged. public Task UpdateServerIdAsync(Guid serverId, CancellationToken ct = default) Parameters serverId Guid ct CancellationToken Returns Task" + }, "api/server/EchoHub.Server.Services.FileCleanupService.html": { "href": "api/server/EchoHub.Server.Services.FileCleanupService.html", "title": "Class FileCleanupService | EchoHub Documentation", @@ -777,12 +782,17 @@ "api/server/EchoHub.Server.Services.PresenceTracker.html": { "href": "api/server/EchoHub.Server.Services.PresenceTracker.html", "title": "Class PresenceTracker | EchoHub Documentation", - "summary": "Class PresenceTracker Namespace EchoHub.Server.Services Assembly EchoHub.Server.dll public class PresenceTracker Inheritance object PresenceTracker Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors PresenceTracker() public PresenceTracker() Methods ForceRemoveUser(string) Forcibly remove a user from all tracking. Returns their connection IDs and channels so the caller can broadcast departures and force-disconnect connections. public (List ConnectionIds, List Channels) ForceRemoveUser(string username) Parameters username string Returns (List ConnectionIds, List Channels) GetChannelsForUser(string) public List GetChannelsForUser(string username) Parameters username string Returns List GetConnectionsInChannels(List) Get all unique connection IDs for users who share any of the given channels. public List GetConnectionsInChannels(List channels) Parameters channels List Returns List GetOnlineUserCount() public int GetOnlineUserCount() Returns int GetOnlineUsersInChannel(string) public List GetOnlineUsersInChannel(string channelName) Parameters channelName string Returns List GetUsernameForConnection(string) public string? GetUsernameForConnection(string connectionId) Parameters connectionId string Returns string IsOnline(string) public bool IsOnline(string username) Parameters username string Returns bool JoinChannel(string, string) Returns true if this is a new join, false if the user was already in the channel. public bool JoinChannel(string username, string channelName) Parameters username string channelName string Returns bool LeaveChannel(string, string) public void LeaveChannel(string username, string channelName) Parameters username string channelName string UserConnected(string, Guid, string) public void UserConnected(string connectionId, Guid userId, string username) Parameters connectionId string userId Guid username string UserDisconnected(string) public string? UserDisconnected(string connectionId) Parameters connectionId string Returns string" + "summary": "Class PresenceTracker Namespace EchoHub.Server.Services Assembly EchoHub.Server.dll public class PresenceTracker Inheritance object PresenceTracker Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors PresenceTracker() public PresenceTracker() Methods ForceRemoveUser(string) Forcibly remove a user from all tracking. Returns their connection IDs and channels so the caller can broadcast departures and force-disconnect connections. public (List ConnectionIds, List Channels) ForceRemoveUser(string username) Parameters username string Returns (List ConnectionIds, List Channels) GetChannelsForUser(string) public List GetChannelsForUser(string username) Parameters username string Returns List GetConnectionsInChannels(List) Get all unique connection IDs for users who share any of the given channels. public List GetConnectionsInChannels(List channels) Parameters channels List Returns List GetOnlineUserCount() public int GetOnlineUserCount() Returns int GetOnlineUsersInChannel(string) public List GetOnlineUsersInChannel(string channelName) Parameters channelName string Returns List GetUsernameForConnection(string) public string? GetUsernameForConnection(string connectionId) Parameters connectionId string Returns string IsOnline(string) public bool IsOnline(string username) Parameters username string Returns bool JoinChannel(string, string) Returns true if this is a new join, false if the user was already in the channel. public bool JoinChannel(string username, string channelName) Parameters username string channelName string Returns bool LeaveChannel(string, string) public void LeaveChannel(string username, string channelName) Parameters username string channelName string UserConnected(string, Guid, string) public void UserConnected(string connectionId, Guid userId, string username) Parameters connectionId string userId Guid username string UserDisconnected(string) public string? UserDisconnected(string connectionId) Parameters connectionId string Returns string Events UserCountChanged Raised when the distinct online user count changes (multi-connection users only fire once). public event Action? UserCountChanged Event Type Action" + }, + "api/server/EchoHub.Server.Services.RegistrationStatus.html": { + "href": "api/server/EchoHub.Server.Services.RegistrationStatus.html", + "title": "Class RegistrationStatus | EchoHub Documentation", + "summary": "Class RegistrationStatus Namespace EchoHub.Server.Services Assembly EchoHub.Server.dll public sealed record RegistrationStatus : IEquatable Inheritance object RegistrationStatus Implements IEquatable Inherited Members object.GetType() object.Equals(object, object) object.ReferenceEquals(object, object) Constructors RegistrationStatus(bool, Guid?, DateTimeOffset?, string?, string[]?) public RegistrationStatus(bool IsRegistered, Guid? ServerId, DateTimeOffset? LastRegisteredAt, string? LastError, string[]? ConflictingHosts) Parameters IsRegistered bool ServerId Guid? LastRegisteredAt DateTimeOffset? LastError string ConflictingHosts string[] Properties ConflictingHosts public string[]? ConflictingHosts { get; init; } Property Value string[] IsRegistered public bool IsRegistered { get; init; } Property Value bool LastError public string? LastError { get; init; } Property Value string LastRegisteredAt public DateTimeOffset? LastRegisteredAt { get; init; } Property Value DateTimeOffset? ServerId public Guid? ServerId { get; init; } Property Value Guid? Methods Deconstruct(out bool, out Guid?, out DateTimeOffset?, out string?, out string[]?) public void Deconstruct(out bool IsRegistered, out Guid? ServerId, out DateTimeOffset? LastRegisteredAt, out string? LastError, out string[]? ConflictingHosts) Parameters IsRegistered bool ServerId Guid? LastRegisteredAt DateTimeOffset? LastError string ConflictingHosts string[] Equals(RegistrationStatus?) public bool Equals(RegistrationStatus? other) Parameters other RegistrationStatus Returns bool Equals(object?) public override bool Equals(object? obj) Parameters obj object Returns bool GetHashCode() public override int GetHashCode() Returns int ToString() public override string ToString() Returns string Operators operator ==(RegistrationStatus?, RegistrationStatus?) public static bool operator ==(RegistrationStatus? left, RegistrationStatus? right) Parameters left RegistrationStatus right RegistrationStatus Returns bool operator !=(RegistrationStatus?, RegistrationStatus?) public static bool operator !=(RegistrationStatus? left, RegistrationStatus? right) Parameters left RegistrationStatus right RegistrationStatus Returns bool" }, "api/server/EchoHub.Server.Services.ServerDirectoryService.html": { "href": "api/server/EchoHub.Server.Services.ServerDirectoryService.html", "title": "Class ServerDirectoryService | EchoHub Documentation", - "summary": "Class ServerDirectoryService Namespace EchoHub.Server.Services Assembly EchoHub.Server.dll public sealed class ServerDirectoryService : BackgroundService, IDisposable Inheritance object BackgroundService ServerDirectoryService Implements IDisposable Inherited Members object.GetType() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors ServerDirectoryService(IConfiguration, PresenceTracker, ILogger) public ServerDirectoryService(IConfiguration configuration, PresenceTracker presenceTracker, ILogger logger) Parameters configuration IConfiguration presenceTracker PresenceTracker logger ILogger Methods ExecuteAsync(CancellationToken) protected override Task ExecuteAsync(CancellationToken stoppingToken) Parameters stoppingToken CancellationToken Returns Task StopAsync(CancellationToken) public override Task StopAsync(CancellationToken cancellationToken) Parameters cancellationToken CancellationToken Returns Task" + "summary": "Class ServerDirectoryService Namespace EchoHub.Server.Services Assembly EchoHub.Server.dll public sealed class ServerDirectoryService : BackgroundService, IDisposable Inheritance object BackgroundService ServerDirectoryService Implements IDisposable Inherited Members object.GetType() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors ServerDirectoryService(IConfiguration, PresenceTracker, DirectoryClaimStore, ILogger) public ServerDirectoryService(IConfiguration configuration, PresenceTracker presenceTracker, DirectoryClaimStore claimStore, ILogger logger) Parameters configuration IConfiguration presenceTracker PresenceTracker claimStore DirectoryClaimStore logger ILogger Methods ExecuteAsync(CancellationToken) protected override Task ExecuteAsync(CancellationToken stoppingToken) Parameters stoppingToken CancellationToken Returns Task StopAsync(CancellationToken) public override Task StopAsync(CancellationToken cancellationToken) Parameters cancellationToken CancellationToken Returns Task" }, "api/server/EchoHub.Server.Services.SignalRBroadcaster.html": { "href": "api/server/EchoHub.Server.Services.SignalRBroadcaster.html", @@ -797,7 +807,7 @@ "api/server/EchoHub.Server.Services.html": { "href": "api/server/EchoHub.Server.Services.html", "title": "Namespace EchoHub.Server.Services | EchoHub Documentation", - "summary": "Namespace EchoHub.Server.Services Classes ChannelService ChatService FileCleanupService FileStorageService FileValidationHelper ImageToAsciiService LinkEmbedService MessageEncryptionService MuteExpirationService Background service that periodically unmutes users whose timed mute has expired. PresenceTracker ServerDirectoryService SignalRBroadcaster UserService" + "summary": "Namespace EchoHub.Server.Services Classes ChannelService ChatService DirectoryClaimStore Persists and exposes the EchoHubSpace directory claim — the opaque token issued on first registration and the row's stable ServerId. Also surfaces ephemeral registration status (success/failure code, conflicting hosts) for operator-facing endpoints. Persistence uses atomic write (tmp + rename). Treat the file contents as a secret. FileCleanupService FileStorageService FileValidationHelper ImageToAsciiService LinkEmbedService MessageEncryptionService MuteExpirationService Background service that periodically unmutes users whose timed mute has expired. PresenceTracker RegistrationStatus ServerDirectoryService SignalRBroadcaster UserService" }, "api/server/EchoHub.Server.Setup.DataMigrationService.html": { "href": "api/server/EchoHub.Server.Setup.DataMigrationService.html", @@ -842,7 +852,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.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" + "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.11 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", @@ -852,7 +862,7 @@ "changelog/index.html": { "href": "changelog/index.html", "title": "Changelog | EchoHub Documentation", - "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" + "summary": "Changelog Release history for EchoHub. Releases v0.2.11 - EchoHubSpace Auth, Live Directory Updates & Server Browser Metadata 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", @@ -879,6 +889,11 @@ "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) Fix client crashing on startup with No Serilog:Using configuration section is defined under single-file publish — pass ConfigurationReaderOptions with the Serilog.Sinks.File assembly explicitly so Serilog can resolve sinks without scanning the filesystem for .dlls (which don't exist in a bundled exe) 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.11.html": { + "href": "changelog/v0.2.11.html", + "title": "v0.2.11 | EchoHub Documentation", + "summary": "v0.2.11 EchoHubSpace directory protocol overhaul: authenticated server registration with persistent claim tokens, near-real-time user-count updates, and richer server metadata (tags, multi-host, version). Coordinated cutover with the EchoHubSpace directory deploy. New Features EchoHubSpace claim-token authentication — the directory issues a per-server claim token on first registration, persisted atomically alongside the SQLite database (chmod 0600 on Unix). Subsequent reconnects authenticate with the token instead of relying on raw hostname-squatting protection. Token survives both client and directory restarts; lost tokens require an admin-side DELETE /api/servers/{id} on the directory to recover Server tags — public servers can advertise topic tags via the new Server:Tags config array, surfacing as filter facets in the EchoHubSpace browser Multi-host advertisement — a single server can register multiple hostnames (e.g. apex domain, IPv6, alias domains) by listing them in Server:PublicHosts. All hosts route to the same directory row Server version sent to directory — the EchoHubSpace browser shows what version each public server is running, pulled from the server's assembly informational version Operator-facing GET /api/server/directory endpoint (Admin role required) — returns ServerId, IsRegistered, LastRegisteredAt, LastError, and any ConflictingHosts for support tickets. Never exposes the claim token itself, only a HasClaimToken boolean Refactoring Replace 30s polling with event-driven directory updates — PresenceTracker now raises UserCountChanged only when the distinct user count actually changes (multi-tab/multi-connection users no longer trigger). ServerDirectoryService consumes via a single-slot Channel (latest-wins coalesces bursts) with a 1-second min-interval throttle. Directory reflects user-count changes within ~1s instead of up to 30s stale Wrap directory hub responses in a Response envelope with IsSuccess/Data/Errors/Version shape — protocol version is pinned client-side (currently 1.0); mismatches trigger a permanent-failure stop with operator-facing log Stop attempting re-registration after permanent failures (HostAlreadyClaimed, InvalidToken, HostConflict, InvalidInput) — the directory no longer terminates the connection on these errors, so the client suppresses re-register on Reconnected to avoid tight retry loops. Operator must restart the server after fixing config Configuration Breaking: Server:PublicHost (string) renamed to Server:PublicHosts (string array). Public servers must update appsettings.json — single-host deployments use a one-element array New Server:Tags (string array) — defaults to empty New optional Server:DirectoryClaimPath — overrides the path of the persisted claim file. Defaults to a directory-claim.json next to the SQLite database. Treat the file as a secret; back it up alongside the database" + }, "changelog/v0.2.2.html": { "href": "changelog/v0.2.2.html", "title": "v0.2.2 - Startup & Shutdown Fixes | EchoHub Documentation", diff --git a/manifest.json b/manifest.json index 5d9f7bc..be29e0f 100644 --- a/manifest.json +++ b/manifest.json @@ -2026,6 +2026,20 @@ "Title": "EchoHub.Server.Services.ChatService", "Summary": null }, + { + "type": "ManagedReference", + "source_relative_path": "_api_meta/server/EchoHub.Server.Services.DirectoryClaimStore.yml", + "output": { + ".html": { + "relative_path": "api/server/EchoHub.Server.Services.DirectoryClaimStore.html" + } + }, + "version": "", + "Uid": null, + "IsMRef": true, + "Title": "EchoHub.Server.Services.DirectoryClaimStore", + "Summary": "

      Persists and exposes the EchoHubSpace directory claim — the opaque token issued on first\nregistration and the row's stable ServerId. Also surfaces ephemeral registration\nstatus (success/failure code, conflicting hosts) for operator-facing endpoints.

      \n

      Persistence uses atomic write (tmp + rename). Treat the file contents as a secret.

      \n" + }, { "type": "ManagedReference", "source_relative_path": "_api_meta/server/EchoHub.Server.Services.FileCleanupService.yml", @@ -2138,6 +2152,20 @@ "Title": "EchoHub.Server.Services.PresenceTracker", "Summary": null }, + { + "type": "ManagedReference", + "source_relative_path": "_api_meta/server/EchoHub.Server.Services.RegistrationStatus.yml", + "output": { + ".html": { + "relative_path": "api/server/EchoHub.Server.Services.RegistrationStatus.html" + } + }, + "version": "", + "Uid": null, + "IsMRef": true, + "Title": "EchoHub.Server.Services.RegistrationStatus", + "Summary": null + }, { "type": "ManagedReference", "source_relative_path": "_api_meta/server/EchoHub.Server.Services.ServerDirectoryService.yml", @@ -2488,6 +2516,16 @@ }, "version": "" }, + { + "type": "Conceptual", + "source_relative_path": "changelog/v0.2.11.md", + "output": { + ".html": { + "relative_path": "changelog/v0.2.11.html" + } + }, + "version": "" + }, { "type": "Conceptual", "source_relative_path": "changelog/v0.2.2.md", diff --git a/xrefmap.yml b/xrefmap.yml index 30dc13c..ac8e91a 100644 --- a/xrefmap.yml +++ b/xrefmap.yml @@ -14290,15 +14290,15 @@ references: commentId: T:EchoHub.Server.Controllers.ServerController fullName: EchoHub.Server.Controllers.ServerController nameWithType: ServerController -- uid: EchoHub.Server.Controllers.ServerController.#ctor(EchoHub.Server.Data.EchoHubDbContext,Microsoft.Extensions.Configuration.IConfiguration) - name: ServerController(EchoHubDbContext, IConfiguration) - href: api/server/EchoHub.Server.Controllers.ServerController.html#EchoHub_Server_Controllers_ServerController__ctor_EchoHub_Server_Data_EchoHubDbContext_Microsoft_Extensions_Configuration_IConfiguration_ - commentId: M:EchoHub.Server.Controllers.ServerController.#ctor(EchoHub.Server.Data.EchoHubDbContext,Microsoft.Extensions.Configuration.IConfiguration) - name.vb: New(EchoHubDbContext, IConfiguration) - fullName: EchoHub.Server.Controllers.ServerController.ServerController(EchoHub.Server.Data.EchoHubDbContext, Microsoft.Extensions.Configuration.IConfiguration) - fullName.vb: EchoHub.Server.Controllers.ServerController.New(EchoHub.Server.Data.EchoHubDbContext, Microsoft.Extensions.Configuration.IConfiguration) - nameWithType: ServerController.ServerController(EchoHubDbContext, IConfiguration) - nameWithType.vb: ServerController.New(EchoHubDbContext, IConfiguration) +- uid: EchoHub.Server.Controllers.ServerController.#ctor(EchoHub.Server.Data.EchoHubDbContext,Microsoft.Extensions.Configuration.IConfiguration,EchoHub.Server.Services.DirectoryClaimStore) + name: ServerController(EchoHubDbContext, IConfiguration, DirectoryClaimStore) + href: api/server/EchoHub.Server.Controllers.ServerController.html#EchoHub_Server_Controllers_ServerController__ctor_EchoHub_Server_Data_EchoHubDbContext_Microsoft_Extensions_Configuration_IConfiguration_EchoHub_Server_Services_DirectoryClaimStore_ + commentId: M:EchoHub.Server.Controllers.ServerController.#ctor(EchoHub.Server.Data.EchoHubDbContext,Microsoft.Extensions.Configuration.IConfiguration,EchoHub.Server.Services.DirectoryClaimStore) + name.vb: New(EchoHubDbContext, IConfiguration, DirectoryClaimStore) + fullName: EchoHub.Server.Controllers.ServerController.ServerController(EchoHub.Server.Data.EchoHubDbContext, Microsoft.Extensions.Configuration.IConfiguration, EchoHub.Server.Services.DirectoryClaimStore) + fullName.vb: EchoHub.Server.Controllers.ServerController.New(EchoHub.Server.Data.EchoHubDbContext, Microsoft.Extensions.Configuration.IConfiguration, EchoHub.Server.Services.DirectoryClaimStore) + nameWithType: ServerController.ServerController(EchoHubDbContext, IConfiguration, DirectoryClaimStore) + nameWithType.vb: ServerController.New(EchoHubDbContext, IConfiguration, DirectoryClaimStore) - uid: EchoHub.Server.Controllers.ServerController.#ctor* name: ServerController href: api/server/EchoHub.Server.Controllers.ServerController.html#EchoHub_Server_Controllers_ServerController__ctor_ @@ -14308,6 +14308,18 @@ references: fullName.vb: EchoHub.Server.Controllers.ServerController.New nameWithType: ServerController.ServerController nameWithType.vb: ServerController.New +- uid: EchoHub.Server.Controllers.ServerController.GetDirectoryStatus + name: GetDirectoryStatus() + href: api/server/EchoHub.Server.Controllers.ServerController.html#EchoHub_Server_Controllers_ServerController_GetDirectoryStatus + commentId: M:EchoHub.Server.Controllers.ServerController.GetDirectoryStatus + fullName: EchoHub.Server.Controllers.ServerController.GetDirectoryStatus() + nameWithType: ServerController.GetDirectoryStatus() +- uid: EchoHub.Server.Controllers.ServerController.GetDirectoryStatus* + name: GetDirectoryStatus + href: api/server/EchoHub.Server.Controllers.ServerController.html#EchoHub_Server_Controllers_ServerController_GetDirectoryStatus_ + commentId: Overload:EchoHub.Server.Controllers.ServerController.GetDirectoryStatus + fullName: EchoHub.Server.Controllers.ServerController.GetDirectoryStatus + nameWithType: ServerController.GetDirectoryStatus - uid: EchoHub.Server.Controllers.ServerController.GetEncryptionKey name: GetEncryptionKey() href: api/server/EchoHub.Server.Controllers.ServerController.html#EchoHub_Server_Controllers_ServerController_GetEncryptionKey @@ -16579,6 +16591,132 @@ references: commentId: Overload:EchoHub.Server.Services.ChatService.UserDisconnectedAsync fullName: EchoHub.Server.Services.ChatService.UserDisconnectedAsync nameWithType: ChatService.UserDisconnectedAsync +- uid: EchoHub.Server.Services.DirectoryClaimStore + name: DirectoryClaimStore + href: api/server/EchoHub.Server.Services.DirectoryClaimStore.html + commentId: T:EchoHub.Server.Services.DirectoryClaimStore + fullName: EchoHub.Server.Services.DirectoryClaimStore + nameWithType: DirectoryClaimStore +- uid: EchoHub.Server.Services.DirectoryClaimStore.#ctor(Microsoft.Extensions.Configuration.IConfiguration,Microsoft.Extensions.Logging.ILogger{EchoHub.Server.Services.DirectoryClaimStore}) + name: DirectoryClaimStore(IConfiguration, ILogger) + href: api/server/EchoHub.Server.Services.DirectoryClaimStore.html#EchoHub_Server_Services_DirectoryClaimStore__ctor_Microsoft_Extensions_Configuration_IConfiguration_Microsoft_Extensions_Logging_ILogger_EchoHub_Server_Services_DirectoryClaimStore__ + commentId: M:EchoHub.Server.Services.DirectoryClaimStore.#ctor(Microsoft.Extensions.Configuration.IConfiguration,Microsoft.Extensions.Logging.ILogger{EchoHub.Server.Services.DirectoryClaimStore}) + name.vb: New(IConfiguration, ILogger(Of DirectoryClaimStore)) + fullName: EchoHub.Server.Services.DirectoryClaimStore.DirectoryClaimStore(Microsoft.Extensions.Configuration.IConfiguration, Microsoft.Extensions.Logging.ILogger) + fullName.vb: EchoHub.Server.Services.DirectoryClaimStore.New(Microsoft.Extensions.Configuration.IConfiguration, Microsoft.Extensions.Logging.ILogger(Of EchoHub.Server.Services.DirectoryClaimStore)) + nameWithType: DirectoryClaimStore.DirectoryClaimStore(IConfiguration, ILogger) + nameWithType.vb: DirectoryClaimStore.New(IConfiguration, ILogger(Of DirectoryClaimStore)) +- uid: EchoHub.Server.Services.DirectoryClaimStore.#ctor* + name: DirectoryClaimStore + href: api/server/EchoHub.Server.Services.DirectoryClaimStore.html#EchoHub_Server_Services_DirectoryClaimStore__ctor_ + commentId: Overload:EchoHub.Server.Services.DirectoryClaimStore.#ctor + name.vb: New + fullName: EchoHub.Server.Services.DirectoryClaimStore.DirectoryClaimStore + fullName.vb: EchoHub.Server.Services.DirectoryClaimStore.New + nameWithType: DirectoryClaimStore.DirectoryClaimStore + nameWithType.vb: DirectoryClaimStore.New +- uid: EchoHub.Server.Services.DirectoryClaimStore.ClaimToken + name: ClaimToken + href: api/server/EchoHub.Server.Services.DirectoryClaimStore.html#EchoHub_Server_Services_DirectoryClaimStore_ClaimToken + commentId: P:EchoHub.Server.Services.DirectoryClaimStore.ClaimToken + fullName: EchoHub.Server.Services.DirectoryClaimStore.ClaimToken + nameWithType: DirectoryClaimStore.ClaimToken +- uid: EchoHub.Server.Services.DirectoryClaimStore.ClaimToken* + name: ClaimToken + href: api/server/EchoHub.Server.Services.DirectoryClaimStore.html#EchoHub_Server_Services_DirectoryClaimStore_ClaimToken_ + commentId: Overload:EchoHub.Server.Services.DirectoryClaimStore.ClaimToken + fullName: EchoHub.Server.Services.DirectoryClaimStore.ClaimToken + nameWithType: DirectoryClaimStore.ClaimToken +- uid: EchoHub.Server.Services.DirectoryClaimStore.FilePath + name: FilePath + href: api/server/EchoHub.Server.Services.DirectoryClaimStore.html#EchoHub_Server_Services_DirectoryClaimStore_FilePath + commentId: P:EchoHub.Server.Services.DirectoryClaimStore.FilePath + fullName: EchoHub.Server.Services.DirectoryClaimStore.FilePath + nameWithType: DirectoryClaimStore.FilePath +- uid: EchoHub.Server.Services.DirectoryClaimStore.FilePath* + name: FilePath + href: api/server/EchoHub.Server.Services.DirectoryClaimStore.html#EchoHub_Server_Services_DirectoryClaimStore_FilePath_ + commentId: Overload:EchoHub.Server.Services.DirectoryClaimStore.FilePath + fullName: EchoHub.Server.Services.DirectoryClaimStore.FilePath + nameWithType: DirectoryClaimStore.FilePath +- uid: EchoHub.Server.Services.DirectoryClaimStore.SaveClaimAsync(System.String,System.Guid,System.Threading.CancellationToken) + name: SaveClaimAsync(string, Guid, CancellationToken) + href: api/server/EchoHub.Server.Services.DirectoryClaimStore.html#EchoHub_Server_Services_DirectoryClaimStore_SaveClaimAsync_System_String_System_Guid_System_Threading_CancellationToken_ + commentId: M:EchoHub.Server.Services.DirectoryClaimStore.SaveClaimAsync(System.String,System.Guid,System.Threading.CancellationToken) + name.vb: SaveClaimAsync(String, Guid, CancellationToken) + fullName: EchoHub.Server.Services.DirectoryClaimStore.SaveClaimAsync(string, System.Guid, System.Threading.CancellationToken) + fullName.vb: EchoHub.Server.Services.DirectoryClaimStore.SaveClaimAsync(String, System.Guid, System.Threading.CancellationToken) + nameWithType: DirectoryClaimStore.SaveClaimAsync(string, Guid, CancellationToken) + nameWithType.vb: DirectoryClaimStore.SaveClaimAsync(String, Guid, CancellationToken) +- uid: EchoHub.Server.Services.DirectoryClaimStore.SaveClaimAsync* + name: SaveClaimAsync + href: api/server/EchoHub.Server.Services.DirectoryClaimStore.html#EchoHub_Server_Services_DirectoryClaimStore_SaveClaimAsync_ + commentId: Overload:EchoHub.Server.Services.DirectoryClaimStore.SaveClaimAsync + fullName: EchoHub.Server.Services.DirectoryClaimStore.SaveClaimAsync + nameWithType: DirectoryClaimStore.SaveClaimAsync +- uid: EchoHub.Server.Services.DirectoryClaimStore.ServerId + name: ServerId + href: api/server/EchoHub.Server.Services.DirectoryClaimStore.html#EchoHub_Server_Services_DirectoryClaimStore_ServerId + commentId: P:EchoHub.Server.Services.DirectoryClaimStore.ServerId + fullName: EchoHub.Server.Services.DirectoryClaimStore.ServerId + nameWithType: DirectoryClaimStore.ServerId +- uid: EchoHub.Server.Services.DirectoryClaimStore.ServerId* + name: ServerId + href: api/server/EchoHub.Server.Services.DirectoryClaimStore.html#EchoHub_Server_Services_DirectoryClaimStore_ServerId_ + commentId: Overload:EchoHub.Server.Services.DirectoryClaimStore.ServerId + fullName: EchoHub.Server.Services.DirectoryClaimStore.ServerId + nameWithType: DirectoryClaimStore.ServerId +- uid: EchoHub.Server.Services.DirectoryClaimStore.SetFailure(System.String,System.String[]) + name: SetFailure(string, string[]?) + href: api/server/EchoHub.Server.Services.DirectoryClaimStore.html#EchoHub_Server_Services_DirectoryClaimStore_SetFailure_System_String_System_String___ + commentId: M:EchoHub.Server.Services.DirectoryClaimStore.SetFailure(System.String,System.String[]) + name.vb: SetFailure(String, String()) + fullName: EchoHub.Server.Services.DirectoryClaimStore.SetFailure(string, string[]?) + fullName.vb: EchoHub.Server.Services.DirectoryClaimStore.SetFailure(String, String()) + nameWithType: DirectoryClaimStore.SetFailure(string, string[]?) + nameWithType.vb: DirectoryClaimStore.SetFailure(String, String()) +- uid: EchoHub.Server.Services.DirectoryClaimStore.SetFailure* + name: SetFailure + href: api/server/EchoHub.Server.Services.DirectoryClaimStore.html#EchoHub_Server_Services_DirectoryClaimStore_SetFailure_ + commentId: Overload:EchoHub.Server.Services.DirectoryClaimStore.SetFailure + fullName: EchoHub.Server.Services.DirectoryClaimStore.SetFailure + nameWithType: DirectoryClaimStore.SetFailure +- uid: EchoHub.Server.Services.DirectoryClaimStore.SetSuccess(System.Guid) + name: SetSuccess(Guid) + href: api/server/EchoHub.Server.Services.DirectoryClaimStore.html#EchoHub_Server_Services_DirectoryClaimStore_SetSuccess_System_Guid_ + commentId: M:EchoHub.Server.Services.DirectoryClaimStore.SetSuccess(System.Guid) + fullName: EchoHub.Server.Services.DirectoryClaimStore.SetSuccess(System.Guid) + nameWithType: DirectoryClaimStore.SetSuccess(Guid) +- uid: EchoHub.Server.Services.DirectoryClaimStore.SetSuccess* + name: SetSuccess + href: api/server/EchoHub.Server.Services.DirectoryClaimStore.html#EchoHub_Server_Services_DirectoryClaimStore_SetSuccess_ + commentId: Overload:EchoHub.Server.Services.DirectoryClaimStore.SetSuccess + fullName: EchoHub.Server.Services.DirectoryClaimStore.SetSuccess + nameWithType: DirectoryClaimStore.SetSuccess +- uid: EchoHub.Server.Services.DirectoryClaimStore.Status + name: Status + href: api/server/EchoHub.Server.Services.DirectoryClaimStore.html#EchoHub_Server_Services_DirectoryClaimStore_Status + commentId: P:EchoHub.Server.Services.DirectoryClaimStore.Status + fullName: EchoHub.Server.Services.DirectoryClaimStore.Status + nameWithType: DirectoryClaimStore.Status +- uid: EchoHub.Server.Services.DirectoryClaimStore.Status* + name: Status + href: api/server/EchoHub.Server.Services.DirectoryClaimStore.html#EchoHub_Server_Services_DirectoryClaimStore_Status_ + commentId: Overload:EchoHub.Server.Services.DirectoryClaimStore.Status + fullName: EchoHub.Server.Services.DirectoryClaimStore.Status + nameWithType: DirectoryClaimStore.Status +- uid: EchoHub.Server.Services.DirectoryClaimStore.UpdateServerIdAsync(System.Guid,System.Threading.CancellationToken) + name: UpdateServerIdAsync(Guid, CancellationToken) + href: api/server/EchoHub.Server.Services.DirectoryClaimStore.html#EchoHub_Server_Services_DirectoryClaimStore_UpdateServerIdAsync_System_Guid_System_Threading_CancellationToken_ + commentId: M:EchoHub.Server.Services.DirectoryClaimStore.UpdateServerIdAsync(System.Guid,System.Threading.CancellationToken) + fullName: EchoHub.Server.Services.DirectoryClaimStore.UpdateServerIdAsync(System.Guid, System.Threading.CancellationToken) + nameWithType: DirectoryClaimStore.UpdateServerIdAsync(Guid, CancellationToken) +- uid: EchoHub.Server.Services.DirectoryClaimStore.UpdateServerIdAsync* + name: UpdateServerIdAsync + href: api/server/EchoHub.Server.Services.DirectoryClaimStore.html#EchoHub_Server_Services_DirectoryClaimStore_UpdateServerIdAsync_ + commentId: Overload:EchoHub.Server.Services.DirectoryClaimStore.UpdateServerIdAsync + fullName: EchoHub.Server.Services.DirectoryClaimStore.UpdateServerIdAsync + nameWithType: DirectoryClaimStore.UpdateServerIdAsync - uid: EchoHub.Server.Services.FileCleanupService name: FileCleanupService href: api/server/EchoHub.Server.Services.FileCleanupService.html @@ -17113,6 +17251,12 @@ references: commentId: Overload:EchoHub.Server.Services.PresenceTracker.UserConnected fullName: EchoHub.Server.Services.PresenceTracker.UserConnected nameWithType: PresenceTracker.UserConnected +- uid: EchoHub.Server.Services.PresenceTracker.UserCountChanged + name: UserCountChanged + href: api/server/EchoHub.Server.Services.PresenceTracker.html#EchoHub_Server_Services_PresenceTracker_UserCountChanged + commentId: E:EchoHub.Server.Services.PresenceTracker.UserCountChanged + fullName: EchoHub.Server.Services.PresenceTracker.UserCountChanged + nameWithType: PresenceTracker.UserCountChanged - uid: EchoHub.Server.Services.PresenceTracker.UserDisconnected(System.String) name: UserDisconnected(string) href: api/server/EchoHub.Server.Services.PresenceTracker.html#EchoHub_Server_Services_PresenceTracker_UserDisconnected_System_String_ @@ -17128,21 +17272,204 @@ references: commentId: Overload:EchoHub.Server.Services.PresenceTracker.UserDisconnected fullName: EchoHub.Server.Services.PresenceTracker.UserDisconnected nameWithType: PresenceTracker.UserDisconnected +- uid: EchoHub.Server.Services.RegistrationStatus + name: RegistrationStatus + href: api/server/EchoHub.Server.Services.RegistrationStatus.html + commentId: T:EchoHub.Server.Services.RegistrationStatus + fullName: EchoHub.Server.Services.RegistrationStatus + nameWithType: RegistrationStatus +- uid: EchoHub.Server.Services.RegistrationStatus.#ctor(System.Boolean,System.Nullable{System.Guid},System.Nullable{System.DateTimeOffset},System.String,System.String[]) + name: RegistrationStatus(bool, Guid?, DateTimeOffset?, string?, string[]?) + href: api/server/EchoHub.Server.Services.RegistrationStatus.html#EchoHub_Server_Services_RegistrationStatus__ctor_System_Boolean_System_Nullable_System_Guid__System_Nullable_System_DateTimeOffset__System_String_System_String___ + commentId: M:EchoHub.Server.Services.RegistrationStatus.#ctor(System.Boolean,System.Nullable{System.Guid},System.Nullable{System.DateTimeOffset},System.String,System.String[]) + name.vb: New(Boolean, Guid?, DateTimeOffset?, String, String()) + fullName: EchoHub.Server.Services.RegistrationStatus.RegistrationStatus(bool, System.Guid?, System.DateTimeOffset?, string?, string[]?) + fullName.vb: EchoHub.Server.Services.RegistrationStatus.New(Boolean, System.Guid?, System.DateTimeOffset?, String, String()) + nameWithType: RegistrationStatus.RegistrationStatus(bool, Guid?, DateTimeOffset?, string?, string[]?) + nameWithType.vb: RegistrationStatus.New(Boolean, Guid?, DateTimeOffset?, String, String()) +- uid: EchoHub.Server.Services.RegistrationStatus.#ctor* + name: RegistrationStatus + href: api/server/EchoHub.Server.Services.RegistrationStatus.html#EchoHub_Server_Services_RegistrationStatus__ctor_ + commentId: Overload:EchoHub.Server.Services.RegistrationStatus.#ctor + name.vb: New + fullName: EchoHub.Server.Services.RegistrationStatus.RegistrationStatus + fullName.vb: EchoHub.Server.Services.RegistrationStatus.New + nameWithType: RegistrationStatus.RegistrationStatus + nameWithType.vb: RegistrationStatus.New +- uid: EchoHub.Server.Services.RegistrationStatus.ConflictingHosts + name: ConflictingHosts + href: api/server/EchoHub.Server.Services.RegistrationStatus.html#EchoHub_Server_Services_RegistrationStatus_ConflictingHosts + commentId: P:EchoHub.Server.Services.RegistrationStatus.ConflictingHosts + fullName: EchoHub.Server.Services.RegistrationStatus.ConflictingHosts + nameWithType: RegistrationStatus.ConflictingHosts +- uid: EchoHub.Server.Services.RegistrationStatus.ConflictingHosts* + name: ConflictingHosts + href: api/server/EchoHub.Server.Services.RegistrationStatus.html#EchoHub_Server_Services_RegistrationStatus_ConflictingHosts_ + commentId: Overload:EchoHub.Server.Services.RegistrationStatus.ConflictingHosts + fullName: EchoHub.Server.Services.RegistrationStatus.ConflictingHosts + nameWithType: RegistrationStatus.ConflictingHosts +- uid: EchoHub.Server.Services.RegistrationStatus.Deconstruct(System.Boolean@,System.Nullable{System.Guid}@,System.Nullable{System.DateTimeOffset}@,System.String@,System.String[]@) + name: Deconstruct(out bool, out Guid?, out DateTimeOffset?, out string?, out string[]?) + href: api/server/EchoHub.Server.Services.RegistrationStatus.html#EchoHub_Server_Services_RegistrationStatus_Deconstruct_System_Boolean__System_Nullable_System_Guid___System_Nullable_System_DateTimeOffset___System_String__System_String____ + commentId: M:EchoHub.Server.Services.RegistrationStatus.Deconstruct(System.Boolean@,System.Nullable{System.Guid}@,System.Nullable{System.DateTimeOffset}@,System.String@,System.String[]@) + name.vb: Deconstruct(Boolean, Guid?, DateTimeOffset?, String, String()) + fullName: EchoHub.Server.Services.RegistrationStatus.Deconstruct(out bool, out System.Guid?, out System.DateTimeOffset?, out string?, out string[]?) + fullName.vb: EchoHub.Server.Services.RegistrationStatus.Deconstruct(Boolean, System.Guid?, System.DateTimeOffset?, String, String()) + nameWithType: RegistrationStatus.Deconstruct(out bool, out Guid?, out DateTimeOffset?, out string?, out string[]?) + nameWithType.vb: RegistrationStatus.Deconstruct(Boolean, Guid?, DateTimeOffset?, String, String()) +- uid: EchoHub.Server.Services.RegistrationStatus.Deconstruct* + name: Deconstruct + href: api/server/EchoHub.Server.Services.RegistrationStatus.html#EchoHub_Server_Services_RegistrationStatus_Deconstruct_ + commentId: Overload:EchoHub.Server.Services.RegistrationStatus.Deconstruct + fullName: EchoHub.Server.Services.RegistrationStatus.Deconstruct + nameWithType: RegistrationStatus.Deconstruct +- uid: EchoHub.Server.Services.RegistrationStatus.Equals(EchoHub.Server.Services.RegistrationStatus) + name: Equals(RegistrationStatus?) + href: api/server/EchoHub.Server.Services.RegistrationStatus.html#EchoHub_Server_Services_RegistrationStatus_Equals_EchoHub_Server_Services_RegistrationStatus_ + commentId: M:EchoHub.Server.Services.RegistrationStatus.Equals(EchoHub.Server.Services.RegistrationStatus) + name.vb: Equals(RegistrationStatus) + fullName: EchoHub.Server.Services.RegistrationStatus.Equals(EchoHub.Server.Services.RegistrationStatus?) + fullName.vb: EchoHub.Server.Services.RegistrationStatus.Equals(EchoHub.Server.Services.RegistrationStatus) + nameWithType: RegistrationStatus.Equals(RegistrationStatus?) + nameWithType.vb: RegistrationStatus.Equals(RegistrationStatus) +- uid: EchoHub.Server.Services.RegistrationStatus.Equals(System.Object) + name: Equals(object?) + href: api/server/EchoHub.Server.Services.RegistrationStatus.html#EchoHub_Server_Services_RegistrationStatus_Equals_System_Object_ + commentId: M:EchoHub.Server.Services.RegistrationStatus.Equals(System.Object) + name.vb: Equals(Object) + fullName: EchoHub.Server.Services.RegistrationStatus.Equals(object?) + fullName.vb: EchoHub.Server.Services.RegistrationStatus.Equals(Object) + nameWithType: RegistrationStatus.Equals(object?) + nameWithType.vb: RegistrationStatus.Equals(Object) +- uid: EchoHub.Server.Services.RegistrationStatus.Equals* + name: Equals + href: api/server/EchoHub.Server.Services.RegistrationStatus.html#EchoHub_Server_Services_RegistrationStatus_Equals_ + commentId: Overload:EchoHub.Server.Services.RegistrationStatus.Equals + fullName: EchoHub.Server.Services.RegistrationStatus.Equals + nameWithType: RegistrationStatus.Equals +- uid: EchoHub.Server.Services.RegistrationStatus.GetHashCode + name: GetHashCode() + href: api/server/EchoHub.Server.Services.RegistrationStatus.html#EchoHub_Server_Services_RegistrationStatus_GetHashCode + commentId: M:EchoHub.Server.Services.RegistrationStatus.GetHashCode + fullName: EchoHub.Server.Services.RegistrationStatus.GetHashCode() + nameWithType: RegistrationStatus.GetHashCode() +- uid: EchoHub.Server.Services.RegistrationStatus.GetHashCode* + name: GetHashCode + href: api/server/EchoHub.Server.Services.RegistrationStatus.html#EchoHub_Server_Services_RegistrationStatus_GetHashCode_ + commentId: Overload:EchoHub.Server.Services.RegistrationStatus.GetHashCode + fullName: EchoHub.Server.Services.RegistrationStatus.GetHashCode + nameWithType: RegistrationStatus.GetHashCode +- uid: EchoHub.Server.Services.RegistrationStatus.IsRegistered + name: IsRegistered + href: api/server/EchoHub.Server.Services.RegistrationStatus.html#EchoHub_Server_Services_RegistrationStatus_IsRegistered + commentId: P:EchoHub.Server.Services.RegistrationStatus.IsRegistered + fullName: EchoHub.Server.Services.RegistrationStatus.IsRegistered + nameWithType: RegistrationStatus.IsRegistered +- uid: EchoHub.Server.Services.RegistrationStatus.IsRegistered* + name: IsRegistered + href: api/server/EchoHub.Server.Services.RegistrationStatus.html#EchoHub_Server_Services_RegistrationStatus_IsRegistered_ + commentId: Overload:EchoHub.Server.Services.RegistrationStatus.IsRegistered + fullName: EchoHub.Server.Services.RegistrationStatus.IsRegistered + nameWithType: RegistrationStatus.IsRegistered +- uid: EchoHub.Server.Services.RegistrationStatus.LastError + name: LastError + href: api/server/EchoHub.Server.Services.RegistrationStatus.html#EchoHub_Server_Services_RegistrationStatus_LastError + commentId: P:EchoHub.Server.Services.RegistrationStatus.LastError + fullName: EchoHub.Server.Services.RegistrationStatus.LastError + nameWithType: RegistrationStatus.LastError +- uid: EchoHub.Server.Services.RegistrationStatus.LastError* + name: LastError + href: api/server/EchoHub.Server.Services.RegistrationStatus.html#EchoHub_Server_Services_RegistrationStatus_LastError_ + commentId: Overload:EchoHub.Server.Services.RegistrationStatus.LastError + fullName: EchoHub.Server.Services.RegistrationStatus.LastError + nameWithType: RegistrationStatus.LastError +- uid: EchoHub.Server.Services.RegistrationStatus.LastRegisteredAt + name: LastRegisteredAt + href: api/server/EchoHub.Server.Services.RegistrationStatus.html#EchoHub_Server_Services_RegistrationStatus_LastRegisteredAt + commentId: P:EchoHub.Server.Services.RegistrationStatus.LastRegisteredAt + fullName: EchoHub.Server.Services.RegistrationStatus.LastRegisteredAt + nameWithType: RegistrationStatus.LastRegisteredAt +- uid: EchoHub.Server.Services.RegistrationStatus.LastRegisteredAt* + name: LastRegisteredAt + href: api/server/EchoHub.Server.Services.RegistrationStatus.html#EchoHub_Server_Services_RegistrationStatus_LastRegisteredAt_ + commentId: Overload:EchoHub.Server.Services.RegistrationStatus.LastRegisteredAt + fullName: EchoHub.Server.Services.RegistrationStatus.LastRegisteredAt + nameWithType: RegistrationStatus.LastRegisteredAt +- uid: EchoHub.Server.Services.RegistrationStatus.ServerId + name: ServerId + href: api/server/EchoHub.Server.Services.RegistrationStatus.html#EchoHub_Server_Services_RegistrationStatus_ServerId + commentId: P:EchoHub.Server.Services.RegistrationStatus.ServerId + fullName: EchoHub.Server.Services.RegistrationStatus.ServerId + nameWithType: RegistrationStatus.ServerId +- uid: EchoHub.Server.Services.RegistrationStatus.ServerId* + name: ServerId + href: api/server/EchoHub.Server.Services.RegistrationStatus.html#EchoHub_Server_Services_RegistrationStatus_ServerId_ + commentId: Overload:EchoHub.Server.Services.RegistrationStatus.ServerId + fullName: EchoHub.Server.Services.RegistrationStatus.ServerId + nameWithType: RegistrationStatus.ServerId +- uid: EchoHub.Server.Services.RegistrationStatus.ToString + name: ToString() + href: api/server/EchoHub.Server.Services.RegistrationStatus.html#EchoHub_Server_Services_RegistrationStatus_ToString + commentId: M:EchoHub.Server.Services.RegistrationStatus.ToString + fullName: EchoHub.Server.Services.RegistrationStatus.ToString() + nameWithType: RegistrationStatus.ToString() +- uid: EchoHub.Server.Services.RegistrationStatus.ToString* + name: ToString + href: api/server/EchoHub.Server.Services.RegistrationStatus.html#EchoHub_Server_Services_RegistrationStatus_ToString_ + commentId: Overload:EchoHub.Server.Services.RegistrationStatus.ToString + fullName: EchoHub.Server.Services.RegistrationStatus.ToString + nameWithType: RegistrationStatus.ToString +- uid: EchoHub.Server.Services.RegistrationStatus.op_Equality(EchoHub.Server.Services.RegistrationStatus,EchoHub.Server.Services.RegistrationStatus) + name: operator ==(RegistrationStatus?, RegistrationStatus?) + href: api/server/EchoHub.Server.Services.RegistrationStatus.html#EchoHub_Server_Services_RegistrationStatus_op_Equality_EchoHub_Server_Services_RegistrationStatus_EchoHub_Server_Services_RegistrationStatus_ + commentId: M:EchoHub.Server.Services.RegistrationStatus.op_Equality(EchoHub.Server.Services.RegistrationStatus,EchoHub.Server.Services.RegistrationStatus) + name.vb: =(RegistrationStatus, RegistrationStatus) + fullName: EchoHub.Server.Services.RegistrationStatus.operator ==(EchoHub.Server.Services.RegistrationStatus?, EchoHub.Server.Services.RegistrationStatus?) + fullName.vb: EchoHub.Server.Services.RegistrationStatus.=(EchoHub.Server.Services.RegistrationStatus, EchoHub.Server.Services.RegistrationStatus) + nameWithType: RegistrationStatus.operator ==(RegistrationStatus?, RegistrationStatus?) + nameWithType.vb: RegistrationStatus.=(RegistrationStatus, RegistrationStatus) +- uid: EchoHub.Server.Services.RegistrationStatus.op_Equality* + name: operator == + href: api/server/EchoHub.Server.Services.RegistrationStatus.html#EchoHub_Server_Services_RegistrationStatus_op_Equality_ + commentId: Overload:EchoHub.Server.Services.RegistrationStatus.op_Equality + name.vb: = + fullName: EchoHub.Server.Services.RegistrationStatus.operator == + fullName.vb: EchoHub.Server.Services.RegistrationStatus.= + nameWithType: RegistrationStatus.operator == + nameWithType.vb: RegistrationStatus.= +- uid: EchoHub.Server.Services.RegistrationStatus.op_Inequality(EchoHub.Server.Services.RegistrationStatus,EchoHub.Server.Services.RegistrationStatus) + name: operator !=(RegistrationStatus?, RegistrationStatus?) + href: api/server/EchoHub.Server.Services.RegistrationStatus.html#EchoHub_Server_Services_RegistrationStatus_op_Inequality_EchoHub_Server_Services_RegistrationStatus_EchoHub_Server_Services_RegistrationStatus_ + commentId: M:EchoHub.Server.Services.RegistrationStatus.op_Inequality(EchoHub.Server.Services.RegistrationStatus,EchoHub.Server.Services.RegistrationStatus) + name.vb: <>(RegistrationStatus, RegistrationStatus) + fullName: EchoHub.Server.Services.RegistrationStatus.operator !=(EchoHub.Server.Services.RegistrationStatus?, EchoHub.Server.Services.RegistrationStatus?) + fullName.vb: EchoHub.Server.Services.RegistrationStatus.<>(EchoHub.Server.Services.RegistrationStatus, EchoHub.Server.Services.RegistrationStatus) + nameWithType: RegistrationStatus.operator !=(RegistrationStatus?, RegistrationStatus?) + nameWithType.vb: RegistrationStatus.<>(RegistrationStatus, RegistrationStatus) +- uid: EchoHub.Server.Services.RegistrationStatus.op_Inequality* + name: operator != + href: api/server/EchoHub.Server.Services.RegistrationStatus.html#EchoHub_Server_Services_RegistrationStatus_op_Inequality_ + commentId: Overload:EchoHub.Server.Services.RegistrationStatus.op_Inequality + name.vb: <> + fullName: EchoHub.Server.Services.RegistrationStatus.operator != + fullName.vb: EchoHub.Server.Services.RegistrationStatus.<> + nameWithType: RegistrationStatus.operator != + nameWithType.vb: RegistrationStatus.<> - uid: EchoHub.Server.Services.ServerDirectoryService name: ServerDirectoryService href: api/server/EchoHub.Server.Services.ServerDirectoryService.html commentId: T:EchoHub.Server.Services.ServerDirectoryService fullName: EchoHub.Server.Services.ServerDirectoryService nameWithType: ServerDirectoryService -- uid: EchoHub.Server.Services.ServerDirectoryService.#ctor(Microsoft.Extensions.Configuration.IConfiguration,EchoHub.Server.Services.PresenceTracker,Microsoft.Extensions.Logging.ILogger{EchoHub.Server.Services.ServerDirectoryService}) - name: ServerDirectoryService(IConfiguration, PresenceTracker, ILogger) - href: api/server/EchoHub.Server.Services.ServerDirectoryService.html#EchoHub_Server_Services_ServerDirectoryService__ctor_Microsoft_Extensions_Configuration_IConfiguration_EchoHub_Server_Services_PresenceTracker_Microsoft_Extensions_Logging_ILogger_EchoHub_Server_Services_ServerDirectoryService__ - commentId: M:EchoHub.Server.Services.ServerDirectoryService.#ctor(Microsoft.Extensions.Configuration.IConfiguration,EchoHub.Server.Services.PresenceTracker,Microsoft.Extensions.Logging.ILogger{EchoHub.Server.Services.ServerDirectoryService}) - name.vb: New(IConfiguration, PresenceTracker, ILogger(Of ServerDirectoryService)) - fullName: EchoHub.Server.Services.ServerDirectoryService.ServerDirectoryService(Microsoft.Extensions.Configuration.IConfiguration, EchoHub.Server.Services.PresenceTracker, Microsoft.Extensions.Logging.ILogger) - fullName.vb: EchoHub.Server.Services.ServerDirectoryService.New(Microsoft.Extensions.Configuration.IConfiguration, EchoHub.Server.Services.PresenceTracker, Microsoft.Extensions.Logging.ILogger(Of EchoHub.Server.Services.ServerDirectoryService)) - nameWithType: ServerDirectoryService.ServerDirectoryService(IConfiguration, PresenceTracker, ILogger) - nameWithType.vb: ServerDirectoryService.New(IConfiguration, PresenceTracker, ILogger(Of ServerDirectoryService)) +- uid: EchoHub.Server.Services.ServerDirectoryService.#ctor(Microsoft.Extensions.Configuration.IConfiguration,EchoHub.Server.Services.PresenceTracker,EchoHub.Server.Services.DirectoryClaimStore,Microsoft.Extensions.Logging.ILogger{EchoHub.Server.Services.ServerDirectoryService}) + name: ServerDirectoryService(IConfiguration, PresenceTracker, DirectoryClaimStore, ILogger) + href: api/server/EchoHub.Server.Services.ServerDirectoryService.html#EchoHub_Server_Services_ServerDirectoryService__ctor_Microsoft_Extensions_Configuration_IConfiguration_EchoHub_Server_Services_PresenceTracker_EchoHub_Server_Services_DirectoryClaimStore_Microsoft_Extensions_Logging_ILogger_EchoHub_Server_Services_ServerDirectoryService__ + commentId: M:EchoHub.Server.Services.ServerDirectoryService.#ctor(Microsoft.Extensions.Configuration.IConfiguration,EchoHub.Server.Services.PresenceTracker,EchoHub.Server.Services.DirectoryClaimStore,Microsoft.Extensions.Logging.ILogger{EchoHub.Server.Services.ServerDirectoryService}) + name.vb: New(IConfiguration, PresenceTracker, DirectoryClaimStore, ILogger(Of ServerDirectoryService)) + fullName: EchoHub.Server.Services.ServerDirectoryService.ServerDirectoryService(Microsoft.Extensions.Configuration.IConfiguration, EchoHub.Server.Services.PresenceTracker, EchoHub.Server.Services.DirectoryClaimStore, Microsoft.Extensions.Logging.ILogger) + fullName.vb: EchoHub.Server.Services.ServerDirectoryService.New(Microsoft.Extensions.Configuration.IConfiguration, EchoHub.Server.Services.PresenceTracker, EchoHub.Server.Services.DirectoryClaimStore, Microsoft.Extensions.Logging.ILogger(Of EchoHub.Server.Services.ServerDirectoryService)) + nameWithType: ServerDirectoryService.ServerDirectoryService(IConfiguration, PresenceTracker, DirectoryClaimStore, ILogger) + nameWithType.vb: ServerDirectoryService.New(IConfiguration, PresenceTracker, DirectoryClaimStore, ILogger(Of ServerDirectoryService)) - uid: EchoHub.Server.Services.ServerDirectoryService.#ctor* name: ServerDirectoryService href: api/server/EchoHub.Server.Services.ServerDirectoryService.html#EchoHub_Server_Services_ServerDirectoryService__ctor_