From 9944e86ee3f69c75edd5a72ced30207a34538449 Mon Sep 17 00:00:00 2001 From: HueByte Date: Thu, 16 Jul 2026 03:54:30 +0000 Subject: [PATCH] deploy: ce41ef9c0ae18d8f118d5caa68f8a4c29b7a7700 --- ...choHub.Client.Commands.CommandHandler.html | 124 +- .../EchoHub.Client.Config.ClientConfig.html | 66 + .../EchoHub.Client.Config.SavedServer.html | 34 + .../EchoHub.Client.Services.ApiClient.html | 175 +- ...ices.ChannelPasswordRequiredException.html | 275 ++ ...choHub.Client.Services.ClipboardFiles.html | 219 ++ ...Hub.Client.Services.EchoHubConnection.html | 52 +- ...oHub.Client.Services.FolderPickResult.html | 524 +++ .../EchoHub.Client.Services.JoinOutcome.html | 563 +++ ...ub.Client.Services.NativeFolderPicker.html | 219 ++ ...ub.Client.Services.OutgoingAttachment.html | 602 +++ ...EchoHub.Client.Services.PickerOutcome.html | 159 + .../EchoHub.Client.Services.RoomKeyStore.html | 407 ++ api/client/EchoHub.Client.Services.html | 52 + .../EchoHub.Client.UI.Chat.ChatLine.html | 62 +- ...ient.UI.Dialogs.ChannelPasswordDialog.html | 249 ++ ...Client.UI.Dialogs.CreateChannelResult.html | 47 +- api/client/EchoHub.Client.UI.Dialogs.html | 6 + ...b.Client.UI.Helpers.DroppedFileParser.html | 266 ++ api/client/EchoHub.Client.UI.Helpers.html | 7 + ...ient.UI.ListSources.ChannelListSource.html | 8 +- api/client/EchoHub.Client.UI.MainWindow.html | 105 +- .../EchoHub.Core.Constants.HubConstants.html | 30 + ...ub.Core.Constants.ValidationConstants.html | 30 + ...choHub.Core.Contracts.ChannelListItem.html | 82 +- ...choHub.Core.Contracts.IChannelService.html | 180 +- .../EchoHub.Core.Contracts.IChatService.html | 10 +- api/core/EchoHub.Core.DTOs.AttachmentDto.html | 736 ++++ .../EchoHub.Core.DTOs.ChannelCryptoDto.html | 629 ++++ api/core/EchoHub.Core.DTOs.ChannelDto.html | 82 +- ...choHub.Core.DTOs.CreateChannelRequest.html | 127 +- .../EchoHub.Core.DTOs.JoinChannelResult.html | 127 +- api/core/EchoHub.Core.DTOs.MessageDto.html | 131 +- ...EchoHub.Core.DTOs.RekeyChannelRequest.html | 699 ++++ api/core/EchoHub.Core.DTOs.html | 19 + api/core/EchoHub.Core.Models.Attachment.html | 465 +++ .../EchoHub.Core.Models.AttachmentKind.html | 158 + api/core/EchoHub.Core.Models.Channel.html | 93 + api/core/EchoHub.Core.Models.Message.html | 35 +- api/core/EchoHub.Core.Models.html | 12 + ....Core.Security.RoomCrypto.DerivedKeys.html | 524 +++ .../EchoHub.Core.Security.RoomCrypto.html | 601 +++ api/core/EchoHub.Core.Security.html | 141 + ...b.Core.Services.FileValidationHelper.html} | 26 +- ...ub.Core.Services.ImageToAsciiService.html} | 32 +- api/core/EchoHub.Core.Services.html | 130 + .../EchoHub.Server.Irc.IrcNumericReply.html | 120 + ...Server.Controllers.ChannelsController.html | 175 +- ...rver.Controllers.ModerationController.html | 8 +- ...ub.Server.Controllers.UsersController.html | 4 +- .../EchoHub.Server.Data.EchoHubDbContext.html | 31 + ...grations.AddChannelEncryptionEnvelope.html | 306 ++ ...ata.Migrations.AddChannelPasswordHash.html | 306 ++ ...Data.Migrations.AddMessageAttachments.html | 306 ++ .../EchoHub.Server.Data.Migrations.html | 12 + api/server/EchoHub.Server.Hubs.ChatHub.html | 16 +- ...choHub.Server.Services.ChannelService.html | 187 +- .../EchoHub.Server.Services.ChatService.html | 18 +- ...ub.Server.Services.FileStorageService.html | 35 +- api/server/EchoHub.Server.Services.html | 8 - api/toc.html | 86 +- api/toc.json | 2 +- articles/architecture.html | 2 +- changelog/index.html | 1 + changelog/toc.html | 3 + changelog/toc.json | 2 +- changelog/v0.2.12.html | 169 + index.json | 211 +- manifest.json | 374 +- todo.html | 2 +- xrefmap.yml | 3341 ++++++++++++++--- 71 files changed, 14161 insertions(+), 884 deletions(-) create mode 100644 api/client/EchoHub.Client.Services.ChannelPasswordRequiredException.html create mode 100644 api/client/EchoHub.Client.Services.ClipboardFiles.html create mode 100644 api/client/EchoHub.Client.Services.FolderPickResult.html create mode 100644 api/client/EchoHub.Client.Services.JoinOutcome.html create mode 100644 api/client/EchoHub.Client.Services.NativeFolderPicker.html create mode 100644 api/client/EchoHub.Client.Services.OutgoingAttachment.html create mode 100644 api/client/EchoHub.Client.Services.PickerOutcome.html create mode 100644 api/client/EchoHub.Client.Services.RoomKeyStore.html create mode 100644 api/client/EchoHub.Client.UI.Dialogs.ChannelPasswordDialog.html create mode 100644 api/client/EchoHub.Client.UI.Helpers.DroppedFileParser.html create mode 100644 api/core/EchoHub.Core.DTOs.AttachmentDto.html create mode 100644 api/core/EchoHub.Core.DTOs.ChannelCryptoDto.html create mode 100644 api/core/EchoHub.Core.DTOs.RekeyChannelRequest.html create mode 100644 api/core/EchoHub.Core.Models.Attachment.html create mode 100644 api/core/EchoHub.Core.Models.AttachmentKind.html create mode 100644 api/core/EchoHub.Core.Security.RoomCrypto.DerivedKeys.html create mode 100644 api/core/EchoHub.Core.Security.RoomCrypto.html create mode 100644 api/core/EchoHub.Core.Security.html rename api/{server/EchoHub.Server.Services.FileValidationHelper.html => core/EchoHub.Core.Services.FileValidationHelper.html} (81%) rename api/{server/EchoHub.Server.Services.ImageToAsciiService.html => core/EchoHub.Core.Services.ImageToAsciiService.html} (80%) create mode 100644 api/core/EchoHub.Core.Services.html create mode 100644 api/server/EchoHub.Server.Data.Migrations.AddChannelEncryptionEnvelope.html create mode 100644 api/server/EchoHub.Server.Data.Migrations.AddChannelPasswordHash.html create mode 100644 api/server/EchoHub.Server.Data.Migrations.AddMessageAttachments.html create mode 100644 changelog/v0.2.12.html diff --git a/api/client/EchoHub.Client.Commands.CommandHandler.html b/api/client/EchoHub.Client.Commands.CommandHandler.html index 6f8148a..7acdbbb 100644 --- a/api/client/EchoHub.Client.Commands.CommandHandler.html +++ b/api/client/EchoHub.Client.Commands.CommandHandler.html @@ -319,6 +319,66 @@ Class CommandHandler + OnChangeRoomPassword + + + +
+
+ +
+
public event Func<string, string, Task>? OnChangeRoomPassword
+
+ + + + + + +

Event Type

+
+
Func<string, string, Task>
+
+
+ + + + + + + + +

+ OnClearAttachments + +

+ +
+
+ +
+
public event Func<Task>? OnClearAttachments
+
+ + + + + + +

Event Type

+
+
Func<Task>
+
+
+ + + + + + + +

OnHelp @@ -358,7 +418,7 @@ Class CommandHandler
-
public event Func<string, Task>? OnJoinChannel
+
public event Func<string, string?, Task>? OnJoinChannel
@@ -368,7 +428,7 @@ Class CommandHandler
Event Type

-
Func<string, Task>
+
Func<string, string, Task>
@@ -649,6 +709,36 @@ Class CommandHandler + OnSetAsciiSize + + + +
+
+ +
+
public event Func<string, Task>? OnSetAsciiSize
+
+ + + + + + +

Event Type

+
+
Func<string, Task>
+
+
+ + + + + + + +

OnSetAvatar @@ -709,6 +799,36 @@ Class CommandHandler + OnSetDownloadPath + +

+ +
+
+ +
+
public event Func<string, Task>? OnSetDownloadPath
+
+ + + + + + +

Event Type

+
+
Func<string, Task>
+
+
+ + + + + + + +

OnSetNick diff --git a/api/client/EchoHub.Client.Config.ClientConfig.html b/api/client/EchoHub.Client.Config.ClientConfig.html index 542225c..e934077 100644 --- a/api/client/EchoHub.Client.Config.ClientConfig.html +++ b/api/client/EchoHub.Client.Config.ClientConfig.html @@ -213,6 +213,39 @@ Class ClientConfig + +

+ DefaultAsciiSize + +

+ +

ASCII-art rendering size for images you attach: "s" (40×40), "m" (80×80), or "l" (120×120). +Applies to copy-paste/drag-drop attachments, which have no per-file size flag.

+
+
+ +
+
public string DefaultAsciiSize { get; set; }
+
+ + + + + +

Property Value

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

@@ -244,6 +277,39 @@ Class ClientConfig + +

+ DownloadPath + +

+ +

Folder where downloaded attachments and saved images are written. When null, the +OS Downloads folder is used. Set via the native folder picker or /downloadpath.

+
+
+ +
+
public string? DownloadPath { get; set; }
+
+ + + + + +

Property Value

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

diff --git a/api/client/EchoHub.Client.Config.SavedServer.html b/api/client/EchoHub.Client.Config.SavedServer.html index 2b017ea..c9c5d00 100644 --- a/api/client/EchoHub.Client.Config.SavedServer.html +++ b/api/client/EchoHub.Client.Config.SavedServer.html @@ -182,6 +182,40 @@ Class SavedServer + + +

+ ChannelKeys + +

+ +

Cached room content keys for end-to-end encrypted channels on this server, +keyed by channel name (base64). Like RefreshToken, these live only on the +user's machine — the server never sees them.

+
+
+ +
+
public Dictionary<string, string> ChannelKeys { get; set; }
+
+ + + + + +

Property Value

+
+
Dictionary<string, string>
+
+
+ + + + + + + +

diff --git a/api/client/EchoHub.Client.Services.ApiClient.html b/api/client/EchoHub.Client.Services.ApiClient.html index 6b85df8..eb82300 100644 --- a/api/client/EchoHub.Client.Services.ApiClient.html +++ b/api/client/EchoHub.Client.Services.ApiClient.html @@ -365,8 +365,8 @@ Class ApiClient -

- CreateChannelAsync(string, string?, bool) +

+ CreateChannelAsync(string, string?, bool, string?, string?, string?)

@@ -374,7 +374,7 @@ Class ApiClient
-
public Task<ChannelDto?> CreateChannelAsync(string name, string? topic = null, bool isPublic = true)
+
public Task<ChannelDto?> CreateChannelAsync(string name, string? topic = null, bool isPublic = true, string? password = null, string? encryptionSalt = null, string? wrappedRoomKey = null)

Parameters

@@ -385,6 +385,12 @@ Class ApiClient
isPublic bool
+
password string
+
+
encryptionSalt string
+
+
wrappedRoomKey string
+

Returns

@@ -539,6 +545,44 @@ Class ApiClient + +

+ GetChannelCryptoAsync(string) + +

+ +

Fetches a channel's public crypto metadata (whether it's E2E-encrypted and its +key-derivation salt). Returns null when the channel doesn't exist.

+
+
+ +
+
public Task<ChannelCryptoDto?> GetChannelCryptoAsync(string channelName)
+
+ +

Parameters

+
+
channelName string
+
+
+ +

Returns

+
+
Task<ChannelCryptoDto>
+
+
+ + + + + + + + + + +

@@ -991,6 +1035,89 @@ Used by EchoHubConnection for SignalR token provider.

+ + +

+ RekeyChannelAsync(string, RekeyChannelRequest) + +

+ +
+
+ +
+
public Task<ChannelDto?> RekeyChannelAsync(string channelName, RekeyChannelRequest request)
+
+ +

Parameters

+
+
channelName string
+
+
request RekeyChannelRequest
+
+
+ +

Returns

+
+
Task<ChannelDto>
+
+
+ + + + + + + + + + + + + +

+ SendMessageWithAttachmentsAsync(string, string, IReadOnlyList<OutgoingAttachment>, string?) + +

+ +

Sends one message with optional text and one or more file attachments. +For end-to-end encrypted channels each attachment carries a declared kind and a +room-encrypted preview (empty when none); the caption is likewise room-encrypted.

+
+
+ +
+
public Task<MessageDto?> SendMessageWithAttachmentsAsync(string channelName, string content, IReadOnlyList<OutgoingAttachment> attachments, string? size = null)
+
+ +

Parameters

+
+
channelName string
+
+
content string
+
+
attachments IReadOnlyList<OutgoingAttachment>
+
+
size string
+
+
+ +

Returns

+
+
Task<MessageDto>
+
+
+ + + + + + + + + + +

@@ -1215,48 +1342,6 @@ Used by EchoHubConnection for SignalR token provider.

- - -

- UploadFileAsync(string, Stream, string, string?) - -

- -
-
- -
-
public Task<MessageDto?> UploadFileAsync(string channelName, Stream fileStream, string fileName, string? size = null)
-
- -

Parameters

-
-
channelName string
-
-
fileStream Stream
-
-
fileName string
-
-
size string
-
-
- -

Returns

-
-
Task<MessageDto>
-
-
- - - - - - - - - - -

Events

diff --git a/api/client/EchoHub.Client.Services.ChannelPasswordRequiredException.html b/api/client/EchoHub.Client.Services.ChannelPasswordRequiredException.html new file mode 100644 index 0000000..d4320df --- /dev/null +++ b/api/client/EchoHub.Client.Services.ChannelPasswordRequiredException.html @@ -0,0 +1,275 @@ + + + + + Class ChannelPasswordRequiredException | EchoHub Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+
Table of Contents
+ +
+
+ +
+
+
+ +
+
+ + + +
+ +
+ + + +

+Class ChannelPasswordRequiredException +

+ +
+
Namespace
EchoHub.Client.Services
+
Assembly
EchoHub.Client.dll
+
+ +

Thrown when joining a channel fails because a password is required or incorrect. +The UI catches this to prompt the user and retry.

+
+
+ +
+
public sealed class ChannelPasswordRequiredException : Exception
+
+ + + + +
+
Inheritance
+
+ + +
ChannelPasswordRequiredException
+
+
+ + + +
+
Inherited Members
+
+ + + + + + + + + + + + + + + +
+ + + + + + +

Constructors +

+ + + + +

+ ChannelPasswordRequiredException(string, string) + +

+ +
+
+ +
+
public ChannelPasswordRequiredException(string channelName, string message)
+
+ +

Parameters

+
+
channelName string
+
+
message string
+
+
+ + + + + + + + + + + + +

Properties +

+ + + + +

+ ChannelName + +

+ +
+
+ +
+
public string ChannelName { get; }
+
+ + + + + +

Property Value

+
+
string
+
+
+ + + + + + + + + +
+ + + + +
+ +
+ +
+
+ +
+ + + + diff --git a/api/client/EchoHub.Client.Services.ClipboardFiles.html b/api/client/EchoHub.Client.Services.ClipboardFiles.html new file mode 100644 index 0000000..df0be62 --- /dev/null +++ b/api/client/EchoHub.Client.Services.ClipboardFiles.html @@ -0,0 +1,219 @@ + + + + + Class ClipboardFiles | EchoHub Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+
Table of Contents
+ +
+
+ +
+
+
+ +
+
+ + + +
+ +
+ + + +

+Class ClipboardFiles +

+ +
+
Namespace
EchoHub.Client.Services
+
Assembly
EchoHub.Client.dll
+
+ +

Reads file paths that live on the OS clipboard as a file list (e.g. after copying a file in +Explorer/Finder/Nautilus), which terminals do not paste as text. Lets Ctrl+V attach a copied +file directly instead of requiring the user to paste a raw path.

+
+
+ +
+
public static class ClipboardFiles
+
+ + + + +
+
Inheritance
+
+ +
ClipboardFiles
+
+
+ + + +
+
Inherited Members
+
+ + + + + + + +
+ + + + + + +

Methods +

+ + + + +

+ TryGetFiles(out List<string>) + +

+ +
+
+ +
+
public static bool TryGetFiles(out List<string> files)
+
+ +

Parameters

+
+
files List<string>
+
+
+ +

Returns

+
+
bool
+
+
+ + + + + + + + + + + + +
+ + + + +
+ +
+ +
+
+ +
+ + + + diff --git a/api/client/EchoHub.Client.Services.EchoHubConnection.html b/api/client/EchoHub.Client.Services.EchoHubConnection.html index 3e1c01c..b25f25f 100644 --- a/api/client/EchoHub.Client.Services.EchoHubConnection.html +++ b/api/client/EchoHub.Client.Services.EchoHubConnection.html @@ -157,8 +157,8 @@ Class EchoHubConnection -

- EchoHubConnection(string, ApiClient, ClientEncryptionService) +

+ EchoHubConnection(string, ApiClient, ClientEncryptionService, RoomKeyStore)

@@ -166,7 +166,7 @@ Class EchoHubConnection
-
public EchoHubConnection(string serverUrl, ApiClient apiClient, ClientEncryptionService encryption)
+
public EchoHubConnection(string serverUrl, ApiClient apiClient, ClientEncryptionService encryption, RoomKeyStore roomKeys)

Parameters

@@ -177,6 +177,8 @@ Class EchoHubConnection
ClientEncryptionService
+
roomKeys RoomKeyStore
+
@@ -190,6 +192,40 @@ Class EchoHubConnection Fields + + + + +

+ LockedMessagePlaceholder + +

+ +
+
+ +
+
public const string LockedMessagePlaceholder = "[encrypted — rejoin this channel with its passphrase to unlock]"
+
+ + + + +

Field Value

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

Properties

@@ -400,8 +436,8 @@ Class EchoHubConnection -

- JoinChannelAsync(string) +

+ JoinChannelAsync(string, string?)

@@ -409,18 +445,20 @@ Class EchoHubConnection
-
public Task<List<MessageDto>> JoinChannelAsync(string channelName)
+
public Task<JoinOutcome> JoinChannelAsync(string channelName, string? password = null)

Parameters

channelName string
+
password string
+

Returns

-
Task<List<MessageDto>>
+
Task<JoinOutcome>
diff --git a/api/client/EchoHub.Client.Services.FolderPickResult.html b/api/client/EchoHub.Client.Services.FolderPickResult.html new file mode 100644 index 0000000..44201ac --- /dev/null +++ b/api/client/EchoHub.Client.Services.FolderPickResult.html @@ -0,0 +1,524 @@ + + + + + Class FolderPickResult | EchoHub Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+
Table of Contents
+ +
+
+ +
+
+
+ +
+
+ + + +
+ +
+ + + +

+Class FolderPickResult +

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

Constructors +

+ + + + +

+ FolderPickResult(PickerOutcome, string?) + +

+ +
+
+ +
+
public FolderPickResult(PickerOutcome Outcome, string? Path)
+
+ +

Parameters

+
+
Outcome PickerOutcome
+
+
Path string
+
+
+ + + + + + + + + + + + +

Properties +

+ + + + +

+ Outcome + +

+ +
+
+ +
+
public PickerOutcome Outcome { get; init; }
+
+ + + + + +

Property Value

+
+
PickerOutcome
+
+
+ + + + + + + + + + +

+ Path + +

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

Property Value

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

Methods +

+ + + + +

+ Deconstruct(out PickerOutcome, out string?) + +

+ +
+
+ +
+
public void Deconstruct(out PickerOutcome Outcome, out string? Path)
+
+ +

Parameters

+
+
Outcome PickerOutcome
+
+
Path string
+
+
+ + + + + + + + + + + + + + +

+ Equals(FolderPickResult?) + +

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

Parameters

+
+
other FolderPickResult
+
+
+ +

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 ==(FolderPickResult?, FolderPickResult?) + +

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

Parameters

+
+
left FolderPickResult
+
+
right FolderPickResult
+
+
+ +

Returns

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

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

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

Parameters

+
+
left FolderPickResult
+
+
right FolderPickResult
+
+
+ +

Returns

+
+
bool
+
+
+ + + + + + + + + + + + +
+ + + + +
+ +
+ +
+
+ +
+ + + + diff --git a/api/client/EchoHub.Client.Services.JoinOutcome.html b/api/client/EchoHub.Client.Services.JoinOutcome.html new file mode 100644 index 0000000..30caa57 --- /dev/null +++ b/api/client/EchoHub.Client.Services.JoinOutcome.html @@ -0,0 +1,563 @@ + + + + + Class JoinOutcome | EchoHub Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+
Table of Contents
+ +
+
+ +
+
+
+ +
+
+ + + +
+ +
+ + + +

+Class JoinOutcome +

+ +
+
Namespace
EchoHub.Client.Services
+
Assembly
EchoHub.Client.dll
+
+ +

Result of joining a channel: decrypted history plus, for end-to-end encrypted +channels, the key envelope needed to unlock the room content key.

+
+
+ +
+
public sealed record JoinOutcome : IEquatable<JoinOutcome>
+
+ + + + +
+
Inheritance
+
+ +
JoinOutcome
+
+
+ +
+
Implements
+
+ +
+
+ + +
+
Inherited Members
+
+ + + +
+ + + + + + +

Constructors +

+ + + + +

+ JoinOutcome(List<MessageDto>, string?, string?) + +

+ +

Result of joining a channel: decrypted history plus, for end-to-end encrypted +channels, the key envelope needed to unlock the room content key.

+
+
+ +
+
public JoinOutcome(List<MessageDto> History, string? EncryptionSalt, string? WrappedRoomKey)
+
+ +

Parameters

+
+
History List<MessageDto>
+
+
EncryptionSalt string
+
+
WrappedRoomKey string
+
+
+ + + + + + + + + + + + +

Properties +

+ + + + +

+ EncryptionSalt + +

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

Property Value

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

+ History + +

+ +
+
+ +
+
public List<MessageDto> History { get; init; }
+
+ + + + + +

Property Value

+
+
List<MessageDto>
+
+
+ + + + + + + + + + +

+ WrappedRoomKey + +

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

Property Value

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

Methods +

+ + + + +

+ Deconstruct(out List<MessageDto>, out string?, out string?) + +

+ +
+
+ +
+
public void Deconstruct(out List<MessageDto> History, out string? EncryptionSalt, out string? WrappedRoomKey)
+
+ +

Parameters

+
+
History List<MessageDto>
+
+
EncryptionSalt string
+
+
WrappedRoomKey string
+
+
+ + + + + + + + + + + + + + +

+ Equals(JoinOutcome?) + +

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

Parameters

+
+
other JoinOutcome
+
+
+ +

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 ==(JoinOutcome?, JoinOutcome?) + +

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

Parameters

+
+
left JoinOutcome
+
+
right JoinOutcome
+
+
+ +

Returns

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

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

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

Parameters

+
+
left JoinOutcome
+
+
right JoinOutcome
+
+
+ +

Returns

+
+
bool
+
+
+ + + + + + + + + + + + +
+ + + + +
+ +
+ +
+
+ +
+ + + + diff --git a/api/client/EchoHub.Client.Services.NativeFolderPicker.html b/api/client/EchoHub.Client.Services.NativeFolderPicker.html new file mode 100644 index 0000000..6626135 --- /dev/null +++ b/api/client/EchoHub.Client.Services.NativeFolderPicker.html @@ -0,0 +1,219 @@ + + + + + Class NativeFolderPicker | EchoHub Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+
Table of Contents
+ +
+
+ +
+
+
+ +
+
+ + + +
+ +
+ + + +

+Class NativeFolderPicker +

+ +
+
Namespace
EchoHub.Client.Services
+
Assembly
EchoHub.Client.dll
+
+ +

Opens the OS-native folder chooser (Windows Explorer, macOS Finder, Linux GTK/KDE) by shelling +out, so the TUI doesn't need a GUI toolkit reference. Returns Unavailable +when no native dialog can run, so callers can fall back to a configured path.

+
+
+ +
+
public static class NativeFolderPicker
+
+ + + + +
+
Inheritance
+
+ +
NativeFolderPicker
+
+
+ + + +
+
Inherited Members
+
+ + + + + + + +
+ + + + + + +

Methods +

+ + + + +

+ PickFolderAsync(string?) + +

+ +
+
+ +
+
public static Task<FolderPickResult> PickFolderAsync(string? initialDir)
+
+ +

Parameters

+
+
initialDir string
+
+
+ +

Returns

+
+
Task<FolderPickResult>
+
+
+ + + + + + + + + + + + +
+ + + + +
+ +
+ +
+
+ +
+ + + + diff --git a/api/client/EchoHub.Client.Services.OutgoingAttachment.html b/api/client/EchoHub.Client.Services.OutgoingAttachment.html new file mode 100644 index 0000000..b1d576f --- /dev/null +++ b/api/client/EchoHub.Client.Services.OutgoingAttachment.html @@ -0,0 +1,602 @@ + + + + + Class OutgoingAttachment | EchoHub Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+
Table of Contents
+ +
+
+ +
+
+
+ +
+
+ + + +
+ +
+ + + +

+Class OutgoingAttachment +

+ +
+
Namespace
EchoHub.Client.Services
+
Assembly
EchoHub.Client.dll
+
+ +

One file to upload as part of a message. For end-to-end encrypted channels the stream +is already ciphertext, DeclaredKind is set (image/audio/file), and +EncryptedPreview holds the room-encrypted ASCII art for images. +For normal channels only Stream and FileName are set.

+
+
+ +
+
public sealed record OutgoingAttachment : IEquatable<OutgoingAttachment>
+
+ + + + +
+
Inheritance
+
+ +
OutgoingAttachment
+
+
+ +
+
Implements
+
+ +
+
+ + +
+
Inherited Members
+
+ + + +
+ + + + + + +

Constructors +

+ + + + +

+ OutgoingAttachment(Stream, string, string?, string?) + +

+ +

One file to upload as part of a message. For end-to-end encrypted channels the stream +is already ciphertext, DeclaredKind is set (image/audio/file), and +EncryptedPreview holds the room-encrypted ASCII art for images. +For normal channels only Stream and FileName are set.

+
+
+ +
+
public OutgoingAttachment(Stream Stream, string FileName, string? DeclaredKind = null, string? EncryptedPreview = null)
+
+ +

Parameters

+
+
Stream Stream
+
+
FileName string
+
+
DeclaredKind string
+
+
EncryptedPreview string
+
+
+ + + + + + + + + + + + +

Properties +

+ + + + +

+ DeclaredKind + +

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

Property Value

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

+ EncryptedPreview + +

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

Property Value

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

+ FileName + +

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

Property Value

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

+ Stream + +

+ +
+
+ +
+
public Stream Stream { get; init; }
+
+ + + + + +

Property Value

+
+
Stream
+
+
+ + + + + + + + +

Methods +

+ + + + +

+ Deconstruct(out Stream, out string, out string?, out string?) + +

+ +
+
+ +
+
public void Deconstruct(out Stream Stream, out string FileName, out string? DeclaredKind, out string? EncryptedPreview)
+
+ +

Parameters

+
+
Stream Stream
+
+
FileName string
+
+
DeclaredKind string
+
+
EncryptedPreview string
+
+
+ + + + + + + + + + + + + + +

+ Equals(OutgoingAttachment?) + +

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

Parameters

+
+
other OutgoingAttachment
+
+
+ +

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 ==(OutgoingAttachment?, OutgoingAttachment?) + +

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

Parameters

+
+
left OutgoingAttachment
+
+
right OutgoingAttachment
+
+
+ +

Returns

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

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

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

Parameters

+
+
left OutgoingAttachment
+
+
right OutgoingAttachment
+
+
+ +

Returns

+
+
bool
+
+
+ + + + + + + + + + + + +
+ + + + +
+ +
+ +
+
+ +
+ + + + diff --git a/api/client/EchoHub.Client.Services.PickerOutcome.html b/api/client/EchoHub.Client.Services.PickerOutcome.html new file mode 100644 index 0000000..0321caa --- /dev/null +++ b/api/client/EchoHub.Client.Services.PickerOutcome.html @@ -0,0 +1,159 @@ + + + + + Enum PickerOutcome | EchoHub Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+
Table of Contents
+ +
+
+ +
+
+
+ +
+
+ + + +
+ +
+ + + + +

+Enum PickerOutcome +

+ +
+
Namespace
EchoHub.Client.Services
+
Assembly
EchoHub.Client.dll
+
+ +
+
+ +
+
public enum PickerOutcome
+
+ + + + + + + + + +

Fields +

+
+
Cancelled = 1
+ +

The native dialog ran but the user cancelled it.

+
+
Chosen = 0
+ +

The user picked a folder (Path is set).

+
+
Unavailable = 2
+ +

No native picker is available on this machine (headless, missing tool, etc.).

+
+
+ + + +
+ + + + +
+ +
+ +
+
+ +
+ + + + diff --git a/api/client/EchoHub.Client.Services.RoomKeyStore.html b/api/client/EchoHub.Client.Services.RoomKeyStore.html new file mode 100644 index 0000000..e3181e6 --- /dev/null +++ b/api/client/EchoHub.Client.Services.RoomKeyStore.html @@ -0,0 +1,407 @@ + + + + + Class RoomKeyStore | EchoHub Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+
Table of Contents
+ +
+
+ +
+
+
+ +
+
+ + + +
+ +
+ + + +

+Class RoomKeyStore +

+ +
+
Namespace
EchoHub.Client.Services
+
Assembly
EchoHub.Client.dll
+
+ +

Holds room content keys for end-to-end encrypted channels: in-memory for the +active session, persisted per-server in the client config (like saved sessions) +so users don't retype the passphrase every launch. Keys never leave this machine.

+
+
+ +
+
public sealed class RoomKeyStore
+
+ + + + +
+
Inheritance
+
+ +
RoomKeyStore
+
+
+ + + +
+
Inherited Members
+
+ + + + + + +
+ + + + + + +

Constructors +

+ + + + +

+ RoomKeyStore() + +

+ +
+
+ +
+
public RoomKeyStore()
+
+ + + + + + + + + + + + + +

Methods +

+ + + + +

+ Clear() + +

+ +
+
+ +
+
public void Clear()
+
+ + + + + + + + + + + + + + + +

+ HasKey(string) + +

+ +
+
+ +
+
public bool HasKey(string channelName)
+
+ +

Parameters

+
+
channelName string
+
+
+ +

Returns

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

+ LoadForServer(string) + +

+ +

Binds the store to a server and loads that server's cached keys from config.

+
+
+ +
+
public void LoadForServer(string serverUrl)
+
+ +

Parameters

+
+
serverUrl string
+
+
+ + + + + + + + + + + + + + +

+ RemoveKey(string) + +

+ +
+
+ +
+
public void RemoveKey(string channelName)
+
+ +

Parameters

+
+
channelName string
+
+
+ + + + + + + + + + + + + + +

+ StoreKey(string, byte[]) + +

+ +

Stores a key for the session and persists it to the server's config entry.

+
+
+ +
+
public void StoreKey(string channelName, byte[] key)
+
+ +

Parameters

+
+
channelName string
+
+
key byte[]
+
+
+ + + + + + + + + + + + + + +

+ TryGetKey(string, out byte[]) + +

+ +
+
+ +
+
public bool TryGetKey(string channelName, out byte[] key)
+
+ +

Parameters

+
+
channelName string
+
+
key byte[]
+
+
+ +

Returns

+
+
bool
+
+
+ + + + + + + + + + + + +
+ + + + +
+ +
+ +
+
+ +
+ + + + diff --git a/api/client/EchoHub.Client.Services.html b/api/client/EchoHub.Client.Services.html index 0641c38..ff392eb 100644 --- a/api/client/EchoHub.Client.Services.html +++ b/api/client/EchoHub.Client.Services.html @@ -112,24 +112,69 @@ Runs async work on a background thread and routes exceptions to the UI.

BackupInfo
+
+
ChannelPasswordRequiredException
+

Thrown when joining a channel fails because a password is required or incorrect. +The UI catches this to prompt the user and retry.

+
+
ClientEncryptionService

Client-side encryption service. Uses the same AES-256-GCM format as the server so messages are encrypted end-to-end between client and server.

+
+
+
+
ClipboardFiles
+

Reads file paths that live on the OS clipboard as a file list (e.g. after copying a file in +Explorer/Finder/Nautilus), which terminals do not paste as text. Lets Ctrl+V attach a copied +file directly instead of requiring the user to paste a raw path.

EchoHubConnection
+
+
FolderPickResult
+
+
+
+
JoinOutcome
+

Result of joining a channel: decrypted history plus, for end-to-end encrypted +channels, the key envelope needed to unlock the room content key.

+
+
+
+
NativeFolderPicker
+

Opens the OS-native folder chooser (Windows Explorer, macOS Finder, Linux GTK/KDE) by shelling +out, so the TUI doesn't need a GUI toolkit reference. Returns Unavailable +when no native dialog can run, so callers can fall back to a configured path.

+
+
NotificationSoundService
+
+
OutgoingAttachment
+

One file to upload as part of a message. For end-to-end encrypted channels the stream +is already ciphertext, DeclaredKind is set (image/audio/file), and +EncryptedPreview holds the room-encrypted ASCII art for images. +For normal channels only Stream and FileName are set.

+
+
PathSetup

Ensures the application's directory is on the system PATH so users can run 'echohub' from any terminal session.

+
+
+
+
RoomKeyStore
+

Holds room content keys for end-to-end encrypted channels: in-memory for the +active session, persisted per-server in the client config (like saved sessions) +so users don't retype the passphrase every launch. Keys never leave this machine.

@@ -142,6 +187,13 @@ Backup location: ~/.echohub/update-backup/

UpdateChecker
+

+Enums +

+
+
PickerOutcome
+
+
diff --git a/api/client/EchoHub.Client.UI.Chat.ChatLine.html b/api/client/EchoHub.Client.UI.Chat.ChatLine.html index 6bf208a..4fd62a6 100644 --- a/api/client/EchoHub.Client.UI.Chat.ChatLine.html +++ b/api/client/EchoHub.Client.UI.Chat.ChatLine.html @@ -247,6 +247,37 @@ Class ChatLine + +

+ AttachmentKind + +

+ +
+
+ +
+
public AttachmentKind? AttachmentKind { get; set; }
+
+ + + + + +

Property Value

+
+
AttachmentKind?
+
+
+ + + + + + + +

@@ -465,37 +496,6 @@ Class ChatLine - -

- Type - -

- -
-
- -
-
public MessageType? Type { get; set; }
-
- - - - - -

Property Value

-
-
MessageType?
-
-
- - - - - - - -

Methods

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

+Class ChannelPasswordDialog +

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

Prompts for a channel password when joining a protected channel. +Returns the entered password, or null if the user cancels.

+
+
+ +
+
public sealed class ChannelPasswordDialog
+
+ + + + +
+
Inheritance
+
+ +
ChannelPasswordDialog
+
+
+ + + +
+
Inherited Members
+
+ + + + + + +
+ + + + + + +

Constructors +

+ + + + +

+ ChannelPasswordDialog() + +

+ +
+
+ +
+
public ChannelPasswordDialog()
+
+ + + + + + + + + + + + + +

Methods +

+ + + + +

+ Show(IApplication, string, string?) + +

+ +
+
+ +
+
public static string? Show(IApplication app, string channelName, string? message = null)
+
+ +

Parameters

+
+
app IApplication
+
+
channelName string
+
+
message string
+
+
+ +

Returns

+
+
string
+
+
+ + + + + + + + + + + + +
+ + + + +
+ +
+ +
+
+ +
+ + + + diff --git a/api/client/EchoHub.Client.UI.Dialogs.CreateChannelResult.html b/api/client/EchoHub.Client.UI.Dialogs.CreateChannelResult.html index 33fa451..bc8cb32 100644 --- a/api/client/EchoHub.Client.UI.Dialogs.CreateChannelResult.html +++ b/api/client/EchoHub.Client.UI.Dialogs.CreateChannelResult.html @@ -182,8 +182,8 @@ Class CreateChannelResult -

- CreateChannelResult(string, string?, bool) +

+ CreateChannelResult(string, string?, bool, string?)

@@ -191,7 +191,7 @@ Class CreateChannelResult
-
public CreateChannelResult(string Name, string? Topic, bool IsPublic)
+
public CreateChannelResult(string Name, string? Topic, bool IsPublic, string? Password)

Parameters

@@ -202,6 +202,8 @@ Class CreateChannelResult
bool
+
Password string
+
@@ -312,6 +314,37 @@ Class CreateChannelResult + +

+ Password + +

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

Property Value

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

@@ -349,8 +382,8 @@ Class CreateChannelResult -

- Deconstruct(out string, out string?, out bool) +

+ Deconstruct(out string, out string?, out bool, out string?)

@@ -358,7 +391,7 @@ Class CreateChannelResult
-
public void Deconstruct(out string Name, out string? Topic, out bool IsPublic)
+
public void Deconstruct(out string Name, out string? Topic, out bool IsPublic, out string? Password)

Parameters

@@ -369,6 +402,8 @@ Class CreateChannelResult
bool
+
Password string
+
diff --git a/api/client/EchoHub.Client.UI.Dialogs.html b/api/client/EchoHub.Client.UI.Dialogs.html index f6cdf6f..c8098fa 100644 --- a/api/client/EchoHub.Client.UI.Dialogs.html +++ b/api/client/EchoHub.Client.UI.Dialogs.html @@ -98,6 +98,12 @@ Classes
AudioPlayerDialog
+
+
ChannelPasswordDialog
+

Prompts for a channel password when joining a protected channel. +Returns the entered password, or null if the user cancels.

+
+
ConnectDialog

A Terminal.Gui dialog for entering server connection and authentication details. diff --git a/api/client/EchoHub.Client.UI.Helpers.DroppedFileParser.html b/api/client/EchoHub.Client.UI.Helpers.DroppedFileParser.html new file mode 100644 index 0000000..7d8b588 --- /dev/null +++ b/api/client/EchoHub.Client.UI.Helpers.DroppedFileParser.html @@ -0,0 +1,266 @@ + + + + + Class DroppedFileParser | EchoHub Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+ +
+ +
+
+
+
+
Table of Contents
+ +
+
+ +
+
+
+ +
+
+ + + +
+ +
+ + + +

+Class DroppedFileParser +

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

Recognizes a dragged-and-dropped file (or files) that a terminal delivers into the input as an +absolute path. Terminals differ: some paste the whole path at once, others send it character by +character; either way this checks whether the current input text resolves to existing file(s).

+
+
+ +
+
public static class DroppedFileParser
+
+ + + + +
+
Inheritance
+
+ +
DroppedFileParser
+
+
+ + + +
+
Inherited Members
+
+ + + + + + + +
+ + + + + + +

Methods +

+ + + + +

+ LooksLikePath(string) + +

+ +

Cheap pre-check so callers only stat the filesystem when the input plausibly holds a path: +a quoted path, a Windows drive path (X:</code>/X:/), a UNC path (\), or a +POSIX absolute path (/). Normal chat text never starts this way.

+
+
+ +
+
public static bool LooksLikePath(string text)
+
+ +

Parameters

+
+
text string
+
+
+ +

Returns

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

+ TryGetFiles(string, out List<string>, Func<string, bool>?) + +

+ +

Returns true when text resolves to one or more existing files. +Handles a single path (quoted or not, possibly containing spaces) and multiple +space-separated (optionally quoted) paths. fileExists is injectable +for testing; production passes Exists(string).

+
+
+ +
+
public static bool TryGetFiles(string text, out List<string> files, Func<string, bool>? fileExists = null)
+
+ +

Parameters

+
+
text string
+
+
files List<string>
+
+
fileExists Func<string, bool>
+
+
+ +

Returns

+
+
bool
+
+
+ + + + + + + + + + + + +
+ + + + +
+ +
+ +
+
+ +
+ + + + diff --git a/api/client/EchoHub.Client.UI.Helpers.html b/api/client/EchoHub.Client.UI.Helpers.html index d247dc5..c9f23d0 100644 --- a/api/client/EchoHub.Client.UI.Helpers.html +++ b/api/client/EchoHub.Client.UI.Helpers.html @@ -94,6 +94,13 @@

Classes

+
+
DroppedFileParser
+

Recognizes a dragged-and-dropped file (or files) that a terminal delivers into the input as an +absolute path. Terminals differ: some paste the whole path at once, others send it character by +character; either way this checks whether the current input text resolves to existing file(s).

+
+
EmojiHelper

Converts emoji grapheme clusters to text shortcodes for safe TUI rendering. diff --git a/api/client/EchoHub.Client.UI.ListSources.ChannelListSource.html b/api/client/EchoHub.Client.UI.ListSources.ChannelListSource.html index 83ce409..91e77d9 100644 --- a/api/client/EchoHub.Client.UI.ListSources.ChannelListSource.html +++ b/api/client/EchoHub.Client.UI.ListSources.ChannelListSource.html @@ -459,8 +459,8 @@ Active channel gets a > indicator, unread channels are bright with a count ba -

- Update(List<string>, Dictionary<string, int>, string) +

+ Update(List<string>, Dictionary<string, int>, string, IReadOnlySet<string>?)

@@ -468,7 +468,7 @@ Active channel gets a > indicator, unread channels are bright with a count ba
-
public void Update(List<string> channels, Dictionary<string, int> unread, string activeChannel)
+
public void Update(List<string> channels, Dictionary<string, int> unread, string activeChannel, IReadOnlySet<string>? protectedChannels = null)

Parameters

@@ -479,6 +479,8 @@ Active channel gets a > indicator, unread channels are bright with a count ba
activeChannel string
+
protectedChannels IReadOnlySet<string>
+
diff --git a/api/client/EchoHub.Client.UI.MainWindow.html b/api/client/EchoHub.Client.UI.MainWindow.html index 461d0bb..1298eb9 100644 --- a/api/client/EchoHub.Client.UI.MainWindow.html +++ b/api/client/EchoHub.Client.UI.MainWindow.html @@ -943,8 +943,8 @@ Call after theme changes to refresh colors.

-

- EnsureChannelInList(string, bool?) +

+ EnsureChannelInList(string, bool?, bool?)

@@ -953,7 +953,7 @@ Call after theme changes to refresh colors.

-
public void EnsureChannelInList(string channelName, bool? isPublic = null)
+
public void EnsureChannelInList(string channelName, bool? isPublic = null, bool? isProtected = null)

Parameters

@@ -962,6 +962,8 @@ Call after theme changes to refresh colors.

isPublic bool?
+
isProtected bool?
+
@@ -1191,6 +1193,41 @@ Call after theme changes to refresh colors.

+ + +

+ SetStagedAttachments(IReadOnlyList<string>, string) + +

+ +

Updates the attachment staging indicator shown on the input frame's title, including the +current ASCII-art size for images. Passing an empty list restores the default hint.

+
+
+ +
+
public void SetStagedAttachments(IReadOnlyList<string> fileNames, string asciiSizeLabel)
+
+ +

Parameters

+
+
fileNames IReadOnlyList<string>
+
+
asciiSizeLabel string
+
+
+ + + + + + + + + + + +

@@ -1568,6 +1605,37 @@ Call after theme changes to refresh colors.

+

+ OnDeleteMessageRequested + +

+ +

Fired when the user presses Delete on the selected message. Parameter is the message id.

+
+
+ +
+
public event Action<Guid>? OnDeleteMessageRequested
+
+ + + + + + +

Event Type

+
+
Action<Guid>
+
+
+ + + + + + + +

OnDisconnectRequested @@ -1630,6 +1698,37 @@ Call after theme changes to refresh colors.

+

+ OnImageSaveRequested + +

+ +

Fired when the user activates an image's "[save original]" line. Parameters: attachmentUrl, fileName.

+
+
+ +
+
public event Action<string, string>? OnImageSaveRequested
+
+ + + + + + +

Event Type

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

OnLoadMoreRequested diff --git a/api/core/EchoHub.Core.Constants.HubConstants.html b/api/core/EchoHub.Core.Constants.HubConstants.html index 64fe4d3..393a537 100644 --- a/api/core/EchoHub.Core.Constants.HubConstants.html +++ b/api/core/EchoHub.Core.Constants.HubConstants.html @@ -453,6 +453,36 @@ Class HubConstants + MaxAttachmentsPerMessage + +

+ +
+
+ +
+
public const int MaxAttachmentsPerMessage = 10
+
+ + + + +

Field Value

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

MaxAudioFileSizeBytes diff --git a/api/core/EchoHub.Core.Constants.ValidationConstants.html b/api/core/EchoHub.Core.Constants.ValidationConstants.html index 2963158..664a0d4 100644 --- a/api/core/EchoHub.Core.Constants.ValidationConstants.html +++ b/api/core/EchoHub.Core.Constants.ValidationConstants.html @@ -393,6 +393,36 @@ Class ValidationConstants + MinChannelPasswordLength + +

+ +
+
+ +
+
public const int MinChannelPasswordLength = 3
+
+ + + + +

Field Value

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

UsernamePattern diff --git a/api/core/EchoHub.Core.Contracts.ChannelListItem.html b/api/core/EchoHub.Core.Contracts.ChannelListItem.html index 85ae4b9..7186359 100644 --- a/api/core/EchoHub.Core.Contracts.ChannelListItem.html +++ b/api/core/EchoHub.Core.Contracts.ChannelListItem.html @@ -182,8 +182,8 @@ Class ChannelListItem -

- ChannelListItem(string, string?, int) +

+ ChannelListItem(string, string?, int, bool, bool)

@@ -191,7 +191,7 @@ Class ChannelListItem
-
public ChannelListItem(string Name, string? Topic, int OnlineCount)
+
public ChannelListItem(string Name, string? Topic, int OnlineCount, bool IsPublic = true, bool IsProtected = false)

Parameters

@@ -202,6 +202,10 @@ Class ChannelListItem
int
+
IsPublic bool
+
+
IsProtected bool
+
@@ -250,6 +254,68 @@ Class ChannelListItem + +

+ IsProtected + +

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

Property Value

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

+ IsPublic + +

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

Property Value

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

@@ -349,8 +415,8 @@ Class ChannelListItem -

- Deconstruct(out string, out string?, out int) +

+ Deconstruct(out string, out string?, out int, out bool, out bool)

@@ -358,7 +424,7 @@ Class ChannelListItem
-
public void Deconstruct(out string Name, out string? Topic, out int OnlineCount)
+
public void Deconstruct(out string Name, out string? Topic, out int OnlineCount, out bool IsPublic, out bool IsProtected)

Parameters

@@ -369,6 +435,10 @@ Class ChannelListItem
int
+
IsPublic bool
+
+
IsProtected bool
+
diff --git a/api/core/EchoHub.Core.Contracts.IChannelService.html b/api/core/EchoHub.Core.Contracts.IChannelService.html index e289cc7..9eb6fe7 100644 --- a/api/core/EchoHub.Core.Contracts.IChannelService.html +++ b/api/core/EchoHub.Core.Contracts.IChannelService.html @@ -122,8 +122,8 @@ Interface IChannelService -

- CreateChannelAsync(Guid, string, string?, bool) +

+ CreateChannelAsync(Guid, string, string?, bool, string?, string?, string?)

@@ -131,7 +131,7 @@ Interface IChannelService
-
Task<ChannelOperationResult> CreateChannelAsync(Guid creatorUserId, string name, string? topic, bool isPublic)
+
Task<ChannelOperationResult> CreateChannelAsync(Guid creatorUserId, string name, string? topic, bool isPublic, string? password = null, string? encryptionSalt = null, string? wrappedRoomKey = null)

Parameters

@@ -144,6 +144,12 @@ Interface IChannelService
bool
+
password string
+
+
encryptionSalt string
+
+
wrappedRoomKey string
+

Returns

@@ -202,8 +208,8 @@ Interface IChannelService -

- EnsureChannelMembershipAsync(Guid, string) +

+ EnsureChannelMembershipAsync(Guid, string, string?)

@@ -211,7 +217,7 @@ Interface IChannelService
-
Task<(bool Success, string? Error)> EnsureChannelMembershipAsync(Guid userId, string channelName)
+
Task<(bool Success, string? Error, bool PasswordRequired)> EnsureChannelMembershipAsync(Guid userId, string channelName, string? password = null)

Parameters

@@ -220,11 +226,13 @@ Interface IChannelService
string
+
password string
+

Returns

-
Task<(bool Success, string Error)>
+
Task<(bool Success, string Error, bool PasswordRequired)>
@@ -274,6 +282,78 @@ Interface IChannelService + +

+ GetChannelCryptoAsync(string) + +

+ +
+
+ +
+
Task<ChannelCryptoDto?> GetChannelCryptoAsync(string channelName)
+
+ +

Parameters

+
+
channelName string
+
+
+ +

Returns

+
+
Task<ChannelCryptoDto>
+
+
+ + + + + + + + + + + + + +

+ GetChannelKeyEnvelopeAsync(string) + +

+ +
+
+ +
+
Task<(string? EncryptionSalt, string? WrappedRoomKey)> GetChannelKeyEnvelopeAsync(string channelName)
+
+ +

Parameters

+
+
channelName string
+
+
+ +

Returns

+
+
Task<(string EncryptionSalt, string WrappedRoomKey)>
+
+
+ + + + + + + + + + +

@@ -381,6 +461,92 @@ Interface IChannelService + +

+ RekeyChannelAsync(Guid, string, string, string, string, string) + +

+ +
+
+ +
+
Task<ChannelOperationResult> RekeyChannelAsync(Guid callerUserId, string channelName, string oldPassword, string newPassword, string newEncryptionSalt, string newWrappedRoomKey)
+
+ +

Parameters

+
+
callerUserId Guid
+
+
channelName string
+
+
oldPassword string
+
+
newPassword string
+
+
newEncryptionSalt string
+
+
newWrappedRoomKey string
+
+
+ +

Returns

+
+
Task<ChannelOperationResult>
+
+
+ + + + + + + + + + + + + +

+ SetChannelPasswordAsync(Guid, string, string?) + +

+ +
+
+ +
+
Task<ChannelOperationResult> SetChannelPasswordAsync(Guid callerUserId, string channelName, string? password)
+
+ +

Parameters

+
+
callerUserId Guid
+
+
channelName string
+
+
password string
+
+
+ +

Returns

+
+
Task<ChannelOperationResult>
+
+
+ + + + + + + + + + +

diff --git a/api/core/EchoHub.Core.Contracts.IChatService.html b/api/core/EchoHub.Core.Contracts.IChatService.html index 0803da2..3798d96 100644 --- a/api/core/EchoHub.Core.Contracts.IChatService.html +++ b/api/core/EchoHub.Core.Contracts.IChatService.html @@ -310,8 +310,8 @@ Interface IChatService -

- JoinChannelAsync(string, Guid, string, string) +

+ JoinChannelAsync(string, Guid, string, string, string?)

@@ -319,7 +319,7 @@ Interface IChatService
-
Task<(List<MessageDto> History, string? Error)> JoinChannelAsync(string connectionId, Guid userId, string username, string channelName)
+
Task<(List<MessageDto> History, string? Error, bool PasswordRequired)> JoinChannelAsync(string connectionId, Guid userId, string username, string channelName, string? password = null)

Parameters

@@ -332,11 +332,13 @@ Interface IChatService
string
+
password string
+

Returns

-
Task<(List<MessageDto> History, string Error)>
+
Task<(List<MessageDto> History, string Error, bool PasswordRequired)>
diff --git a/api/core/EchoHub.Core.DTOs.AttachmentDto.html b/api/core/EchoHub.Core.DTOs.AttachmentDto.html new file mode 100644 index 0000000..74a2ec6 --- /dev/null +++ b/api/core/EchoHub.Core.DTOs.AttachmentDto.html @@ -0,0 +1,736 @@ + + + + + Class AttachmentDto | EchoHub Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+
Table of Contents
+ +
+
+ +
+
+
+ +
+
+ + + +
+ +
+ + + +

+Class AttachmentDto +

+ +
+
Namespace
EchoHub.Core.DTOs
+
Assembly
EchoHub.Core.dll
+
+ +

A file attached to a message. AsciiPreview holds the color-tag art for +images (null otherwise). For end-to-end encrypted channels the content behind +Url and the preview are ciphertext the server cannot read.

+
+
+ +
+
public record AttachmentDto : IEquatable<AttachmentDto>
+
+ + + + +
+
Inheritance
+
+ +
AttachmentDto
+
+
+ +
+
Implements
+
+ +
+
+ + +
+
Inherited Members
+
+ + + + +
+ + + + + + +

Constructors +

+ + + + +

+ AttachmentDto(AttachmentDto) + +

+ +
+
+ +
+
protected AttachmentDto(AttachmentDto original)
+
+ +

Parameters

+
+
original AttachmentDto
+
+
+ + + + + + + + + + + + + + +

+ AttachmentDto(AttachmentKind, string, string, long, string?) + +

+ +

A file attached to a message. AsciiPreview holds the color-tag art for +images (null otherwise). For end-to-end encrypted channels the content behind +Url and the preview are ciphertext the server cannot read.

+
+
+ +
+
public AttachmentDto(AttachmentKind Kind, string Url, string FileName, long FileSize, string? AsciiPreview = null)
+
+ +

Parameters

+
+
Kind AttachmentKind
+
+
Url string
+
+
FileName string
+
+
FileSize long
+
+
AsciiPreview string
+
+
+ + + + + + + + + + + + +

Properties +

+ + + + +

+ AsciiPreview + +

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

Property Value

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

+ EqualityContract + +

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

Property Value

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

+ FileName + +

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

Property Value

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

+ FileSize + +

+ +
+
+ +
+
public long FileSize { get; init; }
+
+ + + + + +

Property Value

+
+
long
+
+
+ + + + + + + + + + +

+ Kind + +

+ +
+
+ +
+
public AttachmentKind Kind { get; init; }
+
+ + + + + +

Property Value

+
+
AttachmentKind
+
+
+ + + + + + + + + + +

+ Url + +

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

Property Value

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

Methods +

+ + + + +

+ Deconstruct(out AttachmentKind, out string, out string, out long, out string?) + +

+ +
+
+ +
+
public void Deconstruct(out AttachmentKind Kind, out string Url, out string FileName, out long FileSize, out string? AsciiPreview)
+
+ +

Parameters

+
+
Kind AttachmentKind
+
+
Url string
+
+
FileName string
+
+
FileSize long
+
+
AsciiPreview string
+
+
+ + + + + + + + + + + + + + +

+ Equals(AttachmentDto?) + +

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

Parameters

+
+
other AttachmentDto
+
+
+ +

Returns

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

+ Equals(object?) + +

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

Parameters

+
+
obj object
+
+
+ +

Returns

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

+ GetHashCode() + +

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

Returns

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

+ PrintMembers(StringBuilder) + +

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

Parameters

+
+
builder StringBuilder
+
+
+ +

Returns

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

+ ToString() + +

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

Returns

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

Operators +

+ + + + +

+ operator ==(AttachmentDto?, AttachmentDto?) + +

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

Parameters

+
+
left AttachmentDto
+
+
right AttachmentDto
+
+
+ +

Returns

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

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

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

Parameters

+
+
left AttachmentDto
+
+
right AttachmentDto
+
+
+ +

Returns

+
+
bool
+
+
+ + + + + + + + + + + + +
+ + + + +
+ +
+ +
+
+ +
+ + + + diff --git a/api/core/EchoHub.Core.DTOs.ChannelCryptoDto.html b/api/core/EchoHub.Core.DTOs.ChannelCryptoDto.html new file mode 100644 index 0000000..d956d01 --- /dev/null +++ b/api/core/EchoHub.Core.DTOs.ChannelCryptoDto.html @@ -0,0 +1,629 @@ + + + + + Class ChannelCryptoDto | EchoHub Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+
Table of Contents
+ +
+
+ +
+
+
+ +
+
+ + + +
+ +
+ + + +

+Class ChannelCryptoDto +

+ +
+
Namespace
EchoHub.Core.DTOs
+
Assembly
EchoHub.Core.dll
+
+ +

Public crypto metadata for a channel — enough for a client to derive its join +credential from a passphrase. Never includes the wrapped room key.

+
+
+ +
+
public record ChannelCryptoDto : IEquatable<ChannelCryptoDto>
+
+ + + + +
+
Inheritance
+
+ +
ChannelCryptoDto
+
+
+ +
+
Implements
+
+ +
+
+ + +
+
Inherited Members
+
+ + + + +
+ + + + + + +

Constructors +

+ + + + +

+ ChannelCryptoDto(ChannelCryptoDto) + +

+ +
+
+ +
+
protected ChannelCryptoDto(ChannelCryptoDto original)
+
+ +

Parameters

+
+
original ChannelCryptoDto
+
+
+ + + + + + + + + + + + + + +

+ ChannelCryptoDto(bool, string?) + +

+ +

Public crypto metadata for a channel — enough for a client to derive its join +credential from a passphrase. Never includes the wrapped room key.

+
+
+ +
+
public ChannelCryptoDto(bool IsEncrypted, string? EncryptionSalt)
+
+ +

Parameters

+
+
IsEncrypted bool
+
+
EncryptionSalt string
+
+
+ + + + + + + + + + + + +

Properties +

+ + + + +

+ EncryptionSalt + +

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

Property Value

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

+ EqualityContract + +

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

Property Value

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

+ IsEncrypted + +

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

Property Value

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

Methods +

+ + + + +

+ Deconstruct(out bool, out string?) + +

+ +
+
+ +
+
public void Deconstruct(out bool IsEncrypted, out string? EncryptionSalt)
+
+ +

Parameters

+
+
IsEncrypted bool
+
+
EncryptionSalt string
+
+
+ + + + + + + + + + + + + + +

+ Equals(ChannelCryptoDto?) + +

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

Parameters

+
+
other ChannelCryptoDto
+
+
+ +

Returns

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

+ Equals(object?) + +

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

Parameters

+
+
obj object
+
+
+ +

Returns

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

+ GetHashCode() + +

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

Returns

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

+ PrintMembers(StringBuilder) + +

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

Parameters

+
+
builder StringBuilder
+
+
+ +

Returns

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

+ ToString() + +

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

Returns

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

Operators +

+ + + + +

+ operator ==(ChannelCryptoDto?, ChannelCryptoDto?) + +

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

Parameters

+
+
left ChannelCryptoDto
+
+
right ChannelCryptoDto
+
+
+ +

Returns

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

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

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

Parameters

+
+
left ChannelCryptoDto
+
+
right ChannelCryptoDto
+
+
+ +

Returns

+
+
bool
+
+
+ + + + + + + + + + + + +
+ + + + +
+ +
+ +
+
+ +
+ + + + diff --git a/api/core/EchoHub.Core.DTOs.ChannelDto.html b/api/core/EchoHub.Core.DTOs.ChannelDto.html index bfd86cd..dbcc195 100644 --- a/api/core/EchoHub.Core.DTOs.ChannelDto.html +++ b/api/core/EchoHub.Core.DTOs.ChannelDto.html @@ -182,8 +182,8 @@ Class ChannelDto -

- ChannelDto(Guid, string, string?, bool, int, DateTimeOffset) +

+ ChannelDto(Guid, string, string?, bool, int, DateTimeOffset, bool, bool)

@@ -191,7 +191,7 @@ Class ChannelDto
-
public ChannelDto(Guid Id, string Name, string? Topic, bool IsPublic, int MessageCount, DateTimeOffset CreatedAt)
+
public ChannelDto(Guid Id, string Name, string? Topic, bool IsPublic, int MessageCount, DateTimeOffset CreatedAt, bool IsProtected = false, bool IsEncrypted = false)

Parameters

@@ -208,6 +208,10 @@ Class ChannelDto
CreatedAt DateTimeOffset
+
IsProtected bool
+
+
IsEncrypted bool
+
@@ -318,6 +322,68 @@ Class ChannelDto + +

+ IsEncrypted + +

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

Property Value

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

+ IsProtected + +

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

Property Value

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

@@ -448,8 +514,8 @@ Class ChannelDto -

- Deconstruct(out Guid, out string, out string?, out bool, out int, out DateTimeOffset) +

+ Deconstruct(out Guid, out string, out string?, out bool, out int, out DateTimeOffset, out bool, out bool)

@@ -457,7 +523,7 @@ Class ChannelDto
-
public void Deconstruct(out Guid Id, out string Name, out string? Topic, out bool IsPublic, out int MessageCount, out DateTimeOffset CreatedAt)
+
public void Deconstruct(out Guid Id, out string Name, out string? Topic, out bool IsPublic, out int MessageCount, out DateTimeOffset CreatedAt, out bool IsProtected, out bool IsEncrypted)

Parameters

@@ -474,6 +540,10 @@ Class ChannelDto
CreatedAt DateTimeOffset
+
IsProtected bool
+
+
IsEncrypted bool
+
diff --git a/api/core/EchoHub.Core.DTOs.CreateChannelRequest.html b/api/core/EchoHub.Core.DTOs.CreateChannelRequest.html index ff8b95c..3ded9cf 100644 --- a/api/core/EchoHub.Core.DTOs.CreateChannelRequest.html +++ b/api/core/EchoHub.Core.DTOs.CreateChannelRequest.html @@ -182,8 +182,8 @@ Class CreateChannelRequest -

- CreateChannelRequest(string, string?, bool) +

+ CreateChannelRequest(string, string?, bool, string?, string?, string?)

@@ -191,7 +191,7 @@ Class CreateChannelRequest
-
public CreateChannelRequest(string Name, string? Topic = null, bool IsPublic = true)
+
public CreateChannelRequest(string Name, string? Topic = null, bool IsPublic = true, string? Password = null, string? EncryptionSalt = null, string? WrappedRoomKey = null)

Parameters

@@ -202,6 +202,12 @@ Class CreateChannelRequest
bool
+
Password string
+
+
EncryptionSalt string
+
+
WrappedRoomKey string
+
@@ -219,6 +225,37 @@ Class CreateChannelRequest + +

+ EncryptionSalt + +

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

Property Value

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

@@ -312,6 +349,37 @@ Class CreateChannelRequest + +

+ Password + +

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

Property Value

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

@@ -343,14 +411,10 @@ Class CreateChannelRequest Methods -

+ - - - -

- Deconstruct(out string, out string?, out bool) +

+ WrappedRoomKey

@@ -358,7 +422,42 @@ Class CreateChannelRequest
-
public void Deconstruct(out string Name, out string? Topic, out bool IsPublic)
+
public string? WrappedRoomKey { get; init; }
+
+ + + + + +

Property Value

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

Methods +

+ + + + +

+ Deconstruct(out string, out string?, out bool, out string?, out string?, out string?) + +

+ +
+
+ +
+
public void Deconstruct(out string Name, out string? Topic, out bool IsPublic, out string? Password, out string? EncryptionSalt, out string? WrappedRoomKey)

Parameters

@@ -369,6 +468,12 @@ Class CreateChannelRequest bool
+
Password string
+
+
EncryptionSalt string
+
+
WrappedRoomKey string
+
diff --git a/api/core/EchoHub.Core.DTOs.JoinChannelResult.html b/api/core/EchoHub.Core.DTOs.JoinChannelResult.html index fab53e8..956a064 100644 --- a/api/core/EchoHub.Core.DTOs.JoinChannelResult.html +++ b/api/core/EchoHub.Core.DTOs.JoinChannelResult.html @@ -182,8 +182,8 @@ Class JoinChannelResult -

- JoinChannelResult(bool, List<MessageDto>, string?) +

+ JoinChannelResult(bool, List<MessageDto>, string?, bool, string?, string?)

@@ -191,7 +191,7 @@ Class JoinChannelResult
-
public JoinChannelResult(bool Success, List<MessageDto> History, string? Error = null)
+
public JoinChannelResult(bool Success, List<MessageDto> History, string? Error = null, bool PasswordRequired = false, string? EncryptionSalt = null, string? WrappedRoomKey = null)

Parameters

@@ -202,6 +202,12 @@ Class JoinChannelResult
string
+
PasswordRequired bool
+
+
EncryptionSalt string
+
+
WrappedRoomKey string
+
@@ -219,6 +225,37 @@ Class JoinChannelResult + +

+ EncryptionSalt + +

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

Property Value

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

@@ -312,6 +349,37 @@ Class JoinChannelResult + +

+ PasswordRequired + +

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

Property Value

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

@@ -343,14 +411,10 @@ Class JoinChannelResult Methods -

+ - - - -

- Deconstruct(out bool, out List<MessageDto>, out string?) +

+ WrappedRoomKey

@@ -358,7 +422,42 @@ Class JoinChannelResult
-
public void Deconstruct(out bool Success, out List<MessageDto> History, out string? Error)
+
public string? WrappedRoomKey { get; init; }
+
+ + + + + +

Property Value

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

Methods +

+ + + + +

+ Deconstruct(out bool, out List<MessageDto>, out string?, out bool, out string?, out string?) + +

+ +
+
+ +
+
public void Deconstruct(out bool Success, out List<MessageDto> History, out string? Error, out bool PasswordRequired, out string? EncryptionSalt, out string? WrappedRoomKey)

Parameters

@@ -369,6 +468,12 @@ Class JoinChannelResult string
+
PasswordRequired bool
+
+
EncryptionSalt string
+
+
WrappedRoomKey string
+
diff --git a/api/core/EchoHub.Core.DTOs.MessageDto.html b/api/core/EchoHub.Core.DTOs.MessageDto.html index 11718ac..174ec9a 100644 --- a/api/core/EchoHub.Core.DTOs.MessageDto.html +++ b/api/core/EchoHub.Core.DTOs.MessageDto.html @@ -182,8 +182,8 @@ Class MessageDto -

- MessageDto(Guid, string, string, string?, string, MessageType, string?, string?, DateTimeOffset, long?, List<EmbedDto>?) +

+ MessageDto(Guid, string, string, string?, string, DateTimeOffset, List<AttachmentDto>?, List<EmbedDto>?)

@@ -191,7 +191,7 @@ Class MessageDto
-
public MessageDto(Guid Id, string Content, string SenderUsername, string? SenderNicknameColor, string ChannelName, MessageType Type, string? AttachmentUrl, string? AttachmentFileName, DateTimeOffset SentAt, long? AttachmentFileSize = null, List<EmbedDto>? Embeds = null)
+
public MessageDto(Guid Id, string Content, string SenderUsername, string? SenderNicknameColor, string ChannelName, DateTimeOffset SentAt, List<AttachmentDto>? Attachments = null, List<EmbedDto>? Embeds = null)

Parameters

@@ -206,15 +206,9 @@ Class MessageDto
ChannelName string
-
Type MessageType
-
-
AttachmentUrl string
-
-
AttachmentFileName string
-
SentAt DateTimeOffset
-
AttachmentFileSize long?
+
Attachments List<AttachmentDto>
Embeds List<EmbedDto>
@@ -235,10 +229,10 @@ Class MessageDto - + -

- AttachmentFileName +

+ Attachments

@@ -246,7 +240,7 @@ Class MessageDto
-
public string? AttachmentFileName { get; init; }
+
public List<AttachmentDto>? Attachments { get; init; }
@@ -255,69 +249,7 @@ Class MessageDto
Property Value
-
string
-
-
- - - - - - - - - - -

- AttachmentFileSize - -

- -
-
- -
-
public long? AttachmentFileSize { get; init; }
-
- - - - - -

Property Value

-
-
long?
-
-
- - - - - - - - - - -

- AttachmentUrl - -

- -
-
- -
-
public string? AttachmentUrl { get; init; }
-
- - - - - -

Property Value

-
-
string
+
List<AttachmentDto>
@@ -576,45 +508,14 @@ Class MessageDto - -

- Type - -

- -
-
- -
-
public MessageType Type { get; init; }
-
- - - - - -

Property Value

-
-
MessageType
-
-
- - - - - - - -

Methods

-

- Deconstruct(out Guid, out string, out string, out string?, out string, out MessageType, out string?, out string?, out DateTimeOffset, out long?, out List<EmbedDto>?) +

+ Deconstruct(out Guid, out string, out string, out string?, out string, out DateTimeOffset, out List<AttachmentDto>?, out List<EmbedDto>?)

@@ -622,7 +523,7 @@ Class MessageDto
-
public void Deconstruct(out Guid Id, out string Content, out string SenderUsername, out string? SenderNicknameColor, out string ChannelName, out MessageType Type, out string? AttachmentUrl, out string? AttachmentFileName, out DateTimeOffset SentAt, out long? AttachmentFileSize, out List<EmbedDto>? Embeds)
+
public void Deconstruct(out Guid Id, out string Content, out string SenderUsername, out string? SenderNicknameColor, out string ChannelName, out DateTimeOffset SentAt, out List<AttachmentDto>? Attachments, out List<EmbedDto>? Embeds)

Parameters

@@ -637,15 +538,9 @@ Class MessageDto
ChannelName string
-
Type MessageType
-
-
AttachmentUrl string
-
-
AttachmentFileName string
-
SentAt DateTimeOffset
-
AttachmentFileSize long?
+
Attachments List<AttachmentDto>
Embeds List<EmbedDto>
diff --git a/api/core/EchoHub.Core.DTOs.RekeyChannelRequest.html b/api/core/EchoHub.Core.DTOs.RekeyChannelRequest.html new file mode 100644 index 0000000..1b57381 --- /dev/null +++ b/api/core/EchoHub.Core.DTOs.RekeyChannelRequest.html @@ -0,0 +1,699 @@ + + + + + Class RekeyChannelRequest | EchoHub Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+
Table of Contents
+ +
+
+ +
+
+
+ +
+
+ + + +
+ +
+ + + +

+Class RekeyChannelRequest +

+ +
+
Namespace
EchoHub.Core.DTOs
+
Assembly
EchoHub.Core.dll
+
+ +

Passphrase change for an encrypted channel: the client proves knowledge of the old +passphrase (old auth key), then supplies the re-wrapped room key under the new one.

+
+
+ +
+
public record RekeyChannelRequest : IEquatable<RekeyChannelRequest>
+
+ + + + +
+
Inheritance
+
+ +
RekeyChannelRequest
+
+
+ +
+
Implements
+
+ +
+
+ + +
+
Inherited Members
+
+ + + + +
+ + + + + + +

Constructors +

+ + + + +

+ RekeyChannelRequest(RekeyChannelRequest) + +

+ +
+
+ +
+
protected RekeyChannelRequest(RekeyChannelRequest original)
+
+ +

Parameters

+
+
original RekeyChannelRequest
+
+
+ + + + + + + + + + + + + + +

+ RekeyChannelRequest(string, string, string, string) + +

+ +

Passphrase change for an encrypted channel: the client proves knowledge of the old +passphrase (old auth key), then supplies the re-wrapped room key under the new one.

+
+
+ +
+
public RekeyChannelRequest(string OldPassword, string NewPassword, string NewEncryptionSalt, string NewWrappedRoomKey)
+
+ +

Parameters

+
+
OldPassword string
+
+
NewPassword string
+
+
NewEncryptionSalt string
+
+
NewWrappedRoomKey string
+
+
+ + + + + + + + + + + + +

Properties +

+ + + + +

+ EqualityContract + +

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

Property Value

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

+ NewEncryptionSalt + +

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

Property Value

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

+ NewPassword + +

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

Property Value

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

+ NewWrappedRoomKey + +

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

Property Value

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

+ OldPassword + +

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

Property Value

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

Methods +

+ + + + +

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

+ +
+
+ +
+
public void Deconstruct(out string OldPassword, out string NewPassword, out string NewEncryptionSalt, out string NewWrappedRoomKey)
+
+ +

Parameters

+
+
OldPassword string
+
+
NewPassword string
+
+
NewEncryptionSalt string
+
+
NewWrappedRoomKey string
+
+
+ + + + + + + + + + + + + + +

+ Equals(RekeyChannelRequest?) + +

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

Parameters

+
+
other RekeyChannelRequest
+
+
+ +

Returns

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

+ Equals(object?) + +

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

Parameters

+
+
obj object
+
+
+ +

Returns

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

+ GetHashCode() + +

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

Returns

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

+ PrintMembers(StringBuilder) + +

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

Parameters

+
+
builder StringBuilder
+
+
+ +

Returns

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

+ ToString() + +

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

Returns

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

Operators +

+ + + + +

+ operator ==(RekeyChannelRequest?, RekeyChannelRequest?) + +

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

Parameters

+
+
left RekeyChannelRequest
+
+
right RekeyChannelRequest
+
+
+ +

Returns

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

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

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

Parameters

+
+
left RekeyChannelRequest
+
+
right RekeyChannelRequest
+
+
+ +

Returns

+
+
bool
+
+
+ + + + + + + + + + + + +
+ + + + +
+ +
+ +
+
+ +
+ + + + diff --git a/api/core/EchoHub.Core.DTOs.html b/api/core/EchoHub.Core.DTOs.html index f32b668..4944bb3 100644 --- a/api/core/EchoHub.Core.DTOs.html +++ b/api/core/EchoHub.Core.DTOs.html @@ -106,6 +106,13 @@ Classes
AssignRoleRequest
+
+
AttachmentDto
+

A file attached to a message. AsciiPreview holds the color-tag art for +images (null otherwise). For end-to-end encrypted channels the content behind +Url and the preview are ciphertext the server cannot read.

+
+
AvatarUploadResponse
@@ -114,6 +121,12 @@ Classes
BanRequest
+
+
ChannelCryptoDto
+

Public crypto metadata for a channel — enough for a client to derive its join +credential from a passphrase. Never includes the wrapped room key.

+
+
ChannelDto
@@ -174,6 +187,12 @@ Classes
RegisterRequest
+
+
RekeyChannelRequest
+

Passphrase change for an encrypted channel: the client proves knowledge of the old +passphrase (old auth key), then supplies the re-wrapped room key under the new one.

+
+
SendMessageRequest
diff --git a/api/core/EchoHub.Core.Models.Attachment.html b/api/core/EchoHub.Core.Models.Attachment.html new file mode 100644 index 0000000..e09ee55 --- /dev/null +++ b/api/core/EchoHub.Core.Models.Attachment.html @@ -0,0 +1,465 @@ + + + + + Class Attachment | EchoHub Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+
Table of Contents
+ +
+
+ +
+
+
+ +
+
+ + + +
+ +
+ + + +

+Class Attachment +

+ +
+
Namespace
EchoHub.Core.Models
+
Assembly
EchoHub.Core.dll
+
+ +

A file attached to a message (image, audio, or any file). A message may carry +zero or more attachments alongside its text content (Discord-style).

+
+
+ +
+
public class Attachment
+
+ + + + +
+
Inheritance
+
+ +
Attachment
+
+
+ + + +
+
Inherited Members
+
+ + + + + + + +
+ + + + + + +

Constructors +

+ + + + +

+ Attachment() + +

+ +
+
+ +
+
public Attachment()
+
+ + + + + + + + + + + + + +

Properties +

+ + + + +

+ AsciiPreview + +

+ +

Rendered ASCII-art preview for images (color-tag format). Null for audio/files. +Stored encrypted-at-rest when database encryption is enabled, and room-encrypted +for end-to-end encrypted channels.

+
+
+ +
+
public string? AsciiPreview { get; set; }
+
+ + + + + +

Property Value

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

+ FileName + +

+ +
+
+ +
+
public required string FileName { get; set; }
+
+ + + + + +

Property Value

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

+ FileSize + +

+ +

Stored blob size in bytes (ciphertext size for encrypted channels).

+
+
+ +
+
public long FileSize { get; set; }
+
+ + + + + +

Property Value

+
+
long
+
+
+ + + + + + + + + + +

+ Id + +

+ +
+
+ +
+
public Guid Id { get; set; }
+
+ + + + + +

Property Value

+
+
Guid
+
+
+ + + + + + + + + + +

+ Kind + +

+ +
+
+ +
+
public AttachmentKind Kind { get; set; }
+
+ + + + + +

Property Value

+
+
AttachmentKind
+
+
+ + + + + + + + + + +

+ Message + +

+ +
+
+ +
+
public Message? Message { get; set; }
+
+ + + + + +

Property Value

+
+
Message
+
+
+ + + + + + + + + + +

+ MessageId + +

+ +
+
+ +
+
public Guid MessageId { get; set; }
+
+ + + + + +

Property Value

+
+
Guid
+
+
+ + + + + + + + + + +

+ Url + +

+ +

Relative download URL, e.g. /api/files/{fileId}.

+
+
+ +
+
public required string Url { get; set; }
+
+ + + + + +

Property Value

+
+
string
+
+
+ + + + + + + + + +
+ + + + +
+ +
+ +
+
+ +
+ + + + diff --git a/api/core/EchoHub.Core.Models.AttachmentKind.html b/api/core/EchoHub.Core.Models.AttachmentKind.html new file mode 100644 index 0000000..1a57a69 --- /dev/null +++ b/api/core/EchoHub.Core.Models.AttachmentKind.html @@ -0,0 +1,158 @@ + + + + + Enum AttachmentKind | EchoHub Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+
Table of Contents
+ +
+
+ +
+
+
+ +
+
+ + + +
+ +
+ + + + +

+Enum AttachmentKind +

+ +
+
Namespace
EchoHub.Core.Models
+
Assembly
EchoHub.Core.dll
+
+ +

The kind of a message attachment. Determines how the client renders it +(ASCII preview for images, a play affordance for audio, a download line for files).

+
+
+ +
+
public enum AttachmentKind
+
+ + + + + + + + + +

Fields +

+
+
Audio = 1
+ +
+
File = 2
+ +
+
Image = 0
+ +
+
+ + + +
+ + + + +
+ +
+ +
+
+ +
+ + + + diff --git a/api/core/EchoHub.Core.Models.Channel.html b/api/core/EchoHub.Core.Models.Channel.html index e37bd5f..cf670c5 100644 --- a/api/core/EchoHub.Core.Models.Channel.html +++ b/api/core/EchoHub.Core.Models.Channel.html @@ -244,6 +244,37 @@ Class Channel + +

+ EncryptionSalt + +

+ +
+
+ +
+
public string? EncryptionSalt { get; set; }
+
+ + + + + +

Property Value

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

@@ -368,6 +399,37 @@ Class Channel + +

+ PasswordHash + +

+ +
+
+ +
+
public string? PasswordHash { get; set; }
+
+ + + + + +

Property Value

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

@@ -399,6 +461,37 @@ Class Channel + +

+ WrappedRoomKey + +

+ +
+
+ +
+
public string? WrappedRoomKey { get; set; }
+
+ + + + + +

Property Value

+
+
string
+
+
+ + + + + + + + diff --git a/api/core/EchoHub.Core.Models.Message.html b/api/core/EchoHub.Core.Models.Message.html index 049a4c8..603ae2d 100644 --- a/api/core/EchoHub.Core.Models.Message.html +++ b/api/core/EchoHub.Core.Models.Message.html @@ -275,6 +275,38 @@ Class Message + +

+ Attachments + +

+ +

Files attached to this message. Empty for a plain text message.

+
+
+ +
+
public List<Attachment> Attachments { get; set; }
+
+ + + + + +

Property Value

+
+
List<Attachment>
+
+
+ + + + + + + +

@@ -344,7 +376,8 @@ Class Message

-
+

The message text/caption. May be empty when the message only carries attachments.

+
diff --git a/api/core/EchoHub.Core.Models.html b/api/core/EchoHub.Core.Models.html index b337a6b..cbca0c7 100644 --- a/api/core/EchoHub.Core.Models.html +++ b/api/core/EchoHub.Core.Models.html @@ -94,6 +94,12 @@

Classes

+
+
Attachment
+

A file attached to a message (image, audio, or any file). A message may carry +zero or more attachments alongside its text content (Discord-style).

+
+
Channel
@@ -117,6 +123,12 @@ Classes

Enums

+
+
AttachmentKind
+

The kind of a message attachment. Determines how the client renders it +(ASCII preview for images, a play affordance for audio, a download line for files).

+
+
MessageType
diff --git a/api/core/EchoHub.Core.Security.RoomCrypto.DerivedKeys.html b/api/core/EchoHub.Core.Security.RoomCrypto.DerivedKeys.html new file mode 100644 index 0000000..a412364 --- /dev/null +++ b/api/core/EchoHub.Core.Security.RoomCrypto.DerivedKeys.html @@ -0,0 +1,524 @@ + + + + + Class RoomCrypto.DerivedKeys | EchoHub Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+
Table of Contents
+ +
+
+ +
+
+
+ +
+
+ + + +
+ +
+ + + +

+Class RoomCrypto.DerivedKeys +

+ +
+
Namespace
EchoHub.Core.Security
+
Assembly
EchoHub.Core.dll
+
+ +
+
+ +
+
public sealed record RoomCrypto.DerivedKeys : IEquatable<RoomCrypto.DerivedKeys>
+
+ + + + +
+
Inheritance
+
+ +
RoomCrypto.DerivedKeys
+
+
+ +
+
Implements
+
+ +
+
+ + +
+
Inherited Members
+
+ + + +
+ + + + + + +

Constructors +

+ + + + +

+ DerivedKeys(string, byte[]) + +

+ +
+
+ +
+
public DerivedKeys(string AuthKeyHex, byte[] KeyEncryptionKey)
+
+ +

Parameters

+
+
AuthKeyHex string
+
+
KeyEncryptionKey byte[]
+
+
+ + + + + + + + + + + + +

Properties +

+ + + + +

+ AuthKeyHex + +

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

Property Value

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

+ KeyEncryptionKey + +

+ +
+
+ +
+
public byte[] KeyEncryptionKey { get; init; }
+
+ + + + + +

Property Value

+
+
byte[]
+
+
+ + + + + + + + +

Methods +

+ + + + +

+ Deconstruct(out string, out byte[]) + +

+ +
+
+ +
+
public void Deconstruct(out string AuthKeyHex, out byte[] KeyEncryptionKey)
+
+ +

Parameters

+
+
AuthKeyHex string
+
+
KeyEncryptionKey byte[]
+
+
+ + + + + + + + + + + + + + +

+ Equals(DerivedKeys?) + +

+ +
+
+ +
+
public bool Equals(RoomCrypto.DerivedKeys? other)
+
+ +

Parameters

+
+
other RoomCrypto.DerivedKeys
+
+
+ +

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 ==(DerivedKeys?, DerivedKeys?) + +

+ +
+
+ +
+
public static bool operator ==(RoomCrypto.DerivedKeys? left, RoomCrypto.DerivedKeys? right)
+
+ +

Parameters

+
+
left RoomCrypto.DerivedKeys
+
+
right RoomCrypto.DerivedKeys
+
+
+ +

Returns

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

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

+ +
+
+ +
+
public static bool operator !=(RoomCrypto.DerivedKeys? left, RoomCrypto.DerivedKeys? right)
+
+ +

Parameters

+
+
left RoomCrypto.DerivedKeys
+
+
right RoomCrypto.DerivedKeys
+
+
+ +

Returns

+
+
bool
+
+
+ + + + + + + + + + + + +
+ + + + +
+ +
+ +
+
+ +
+ + + + diff --git a/api/core/EchoHub.Core.Security.RoomCrypto.html b/api/core/EchoHub.Core.Security.RoomCrypto.html new file mode 100644 index 0000000..648f1d9 --- /dev/null +++ b/api/core/EchoHub.Core.Security.RoomCrypto.html @@ -0,0 +1,601 @@ + + + + + Class RoomCrypto | EchoHub Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+
Table of Contents
+ +
+
+ +
+
+
+ +
+
+ + + +
+ +
+ + + +

+Class RoomCrypto +

+ +
+
Namespace
EchoHub.Core.Security
+
Assembly
EchoHub.Core.dll
+
+ +

Client-side envelope encryption for private (end-to-end encrypted) channels.

+

Design: at creation the client generates a random 256-bit room content key (RCK) +that encrypts all room content. The RCK is stored on the server wrapped +(AES-GCM encrypted) by a key derived from the passphrase, next to a BCrypt hash +of a separately derived auth key used as the join gate. The passphrase, the +key-encryption key, and the RCK never leave the client, so the server can gate +joins and count/measure content without being able to read it. Changing the +passphrase only re-wraps the RCK — history is never re-encrypted.

+

Derivation: PBKDF2-SHA256(passphrase, salt, 210000 iterations) → 64 bytes; +first 32 bytes are the auth key (sent to the server as lowercase hex), +last 32 bytes are the key-encryption key (never sent).

+
+
+ +
+
public static class RoomCrypto
+
+ + + + +
+
Inheritance
+
+ +
RoomCrypto
+
+
+ + + +
+
Inherited Members
+
+ + + + + + + +
+ + + + + + +

Fields +

+ + + +

+ CiphertextPrefix + +

+ +
+
+ +
+
public const string CiphertextPrefix = "$RC1$"
+
+ + + + +

Field Value

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

Methods +

+ + + + +

+ DecryptBytes(byte[], byte[]) + +

+ +

Decrypts a blob produced by EncryptBytes(byte[], byte[]). Throws System.Security.Cryptography.CryptographicException on key mismatch.

+
+
+ +
+
public static byte[] DecryptBytes(byte[] blob, byte[] key)
+
+ +

Parameters

+
+
blob byte[]
+
+
key byte[]
+
+
+ +

Returns

+
+
byte[]
+
+
+ + + + + + + + + + + + + +

+ DeriveKeys(string, byte[]) + +

+ +

Derives the auth key (join gate credential) and key-encryption key from a passphrase.

+
+
+ +
+
public static RoomCrypto.DerivedKeys DeriveKeys(string passphrase, byte[] salt)
+
+ +

Parameters

+
+
passphrase string
+
+
salt byte[]
+
+
+ +

Returns

+
+
RoomCrypto.DerivedKeys
+
+
+ + + + + + + + + + + + + +

+ EncryptBytes(byte[], byte[]) + +

+ +

Encrypts a binary blob (file contents) with the room key: nonce||tag||ciphertext.

+
+
+ +
+
public static byte[] EncryptBytes(byte[] plaintext, byte[] key)
+
+ +

Parameters

+
+
plaintext byte[]
+
+
key byte[]
+
+
+ +

Returns

+
+
byte[]
+
+
+ + + + + + + + + + + + + +

+ EncryptText(string, byte[]) + +

+ +

Encrypts UTF-8 text with the room key. Output: $RC1$base64(nonce||tag||ciphertext).

+
+
+ +
+
public static string EncryptText(string plaintext, byte[] key)
+
+ +

Parameters

+
+
plaintext string
+
+
key byte[]
+
+
+ +

Returns

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

+ GenerateRoomKey() + +

+ +
+
+ +
+
public static byte[] GenerateRoomKey()
+
+ + +

Returns

+
+
byte[]
+
+
+ + + + + + + + + + + + + +

+ GenerateSalt() + +

+ +
+
+ +
+
public static byte[] GenerateSalt()
+
+ + +

Returns

+
+
byte[]
+
+
+ + + + + + + + + + + + + +

+ IsRoomCiphertext(string?) + +

+ +
+
+ +
+
public static bool IsRoomCiphertext(string? content)
+
+ +

Parameters

+
+
content string
+
+
+ +

Returns

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

+ TryDecryptText(string, byte[], out string) + +

+ +

Decrypts text produced by EncryptText(string, byte[]). Returns false when the input +is not room ciphertext or the key does not match.

+
+
+ +
+
public static bool TryDecryptText(string content, byte[] key, out string plaintext)
+
+ +

Parameters

+
+
content string
+
+
key byte[]
+
+
plaintext string
+
+
+ +

Returns

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

+ TryUnwrapRoomKey(string, byte[], out byte[]) + +

+ +

Unwraps the stored room content key. Returns false when the KEK (passphrase) is wrong.

+
+
+ +
+
public static bool TryUnwrapRoomKey(string wrappedRoomKey, byte[] kek, out byte[] roomKey)
+
+ +

Parameters

+
+
wrappedRoomKey string
+
+
kek byte[]
+
+
roomKey byte[]
+
+
+ +

Returns

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

+ WrapRoomKey(byte[], byte[]) + +

+ +

Wraps the room content key under the key-encryption key for server storage.

+
+
+ +
+
public static string WrapRoomKey(byte[] roomKey, byte[] kek)
+
+ +

Parameters

+
+
roomKey byte[]
+
+
kek byte[]
+
+
+ +

Returns

+
+
string
+
+
+ + + + + + + + + + + + +
+ + + + +
+ +
+ +
+
+ +
+ + + + diff --git a/api/core/EchoHub.Core.Security.html b/api/core/EchoHub.Core.Security.html new file mode 100644 index 0000000..3d84f20 --- /dev/null +++ b/api/core/EchoHub.Core.Security.html @@ -0,0 +1,141 @@ + + + + + Namespace EchoHub.Core.Security | EchoHub Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+
Table of Contents
+ +
+
+ +
+
+
+ +
+
+ + + +
+ +
+ +

Namespace EchoHub.Core.Security

+
+
+
+ +

+Classes +

+
+
RoomCrypto
+

Client-side envelope encryption for private (end-to-end encrypted) channels.

+

Design: at creation the client generates a random 256-bit room content key (RCK) +that encrypts all room content. The RCK is stored on the server wrapped +(AES-GCM encrypted) by a key derived from the passphrase, next to a BCrypt hash +of a separately derived auth key used as the join gate. The passphrase, the +key-encryption key, and the RCK never leave the client, so the server can gate +joins and count/measure content without being able to read it. Changing the +passphrase only re-wraps the RCK — history is never re-encrypted.

+

Derivation: PBKDF2-SHA256(passphrase, salt, 210000 iterations) → 64 bytes; +first 32 bytes are the auth key (sent to the server as lowercase hex), +last 32 bytes are the key-encryption key (never sent).

+
+
+
+
RoomCrypto.DerivedKeys
+
+
+ + +
+ +
+
+ + +
+ +
+ +
+
+ +
+ + + + diff --git a/api/server/EchoHub.Server.Services.FileValidationHelper.html b/api/core/EchoHub.Core.Services.FileValidationHelper.html similarity index 81% rename from api/server/EchoHub.Server.Services.FileValidationHelper.html rename to api/core/EchoHub.Core.Services.FileValidationHelper.html index 6530971..aff52c4 100644 --- a/api/server/EchoHub.Server.Services.FileValidationHelper.html +++ b/api/core/EchoHub.Core.Services.FileValidationHelper.html @@ -16,7 +16,7 @@ - + @@ -84,17 +84,17 @@
-
+
-

-Class FileValidationHelper +

+Class FileValidationHelper

-
Namespace
EchoHub.Server.Services
-
Assembly
EchoHub.Server.dll
+
Namespace
EchoHub.Core.Services
+
Assembly
EchoHub.Core.dll
@@ -152,11 +152,11 @@ Class FileValidationHelper + -

+

IsAudioFile(string) - +

Checks whether the file name has a recognized audio extension.

@@ -189,11 +189,11 @@ Class FileValidationHelper + -

+

IsValidImage(Stream) - +

Validates that a stream contains a recognized image format by checking magic bytes. @@ -231,7 +231,7 @@ The stream position is reset to the beginning after validation.

diff --git a/api/server/EchoHub.Server.Services.ImageToAsciiService.html b/api/core/EchoHub.Core.Services.ImageToAsciiService.html similarity index 80% rename from api/server/EchoHub.Server.Services.ImageToAsciiService.html rename to api/core/EchoHub.Core.Services.ImageToAsciiService.html index 8f2ebbf..de5ede6 100644 --- a/api/server/EchoHub.Server.Services.ImageToAsciiService.html +++ b/api/core/EchoHub.Core.Services.ImageToAsciiService.html @@ -16,7 +16,7 @@ - + @@ -84,17 +84,17 @@ -
+
-

-Class ImageToAsciiService +

+Class ImageToAsciiService

-
Namespace
EchoHub.Server.Services
-
Assembly
EchoHub.Server.dll
+
Namespace
EchoHub.Core.Services
+
Assembly
EchoHub.Core.dll
@@ -152,11 +152,11 @@ Class ImageToAsciiService + -

+

ImageToAsciiService() - +

@@ -182,11 +182,11 @@ Class ImageToAsciiService + -

+

ConvertToAscii(Stream, int, int) - +

Converts an image to ASCII art using half-block characters (▀▄█) with @@ -227,11 +227,11 @@ Uses only printable ASCII — no terminal escape bytes.

- + -

+

GetDimensions(string?) - +

Returns (width, height) dimensions for the given size code. @@ -269,7 +269,7 @@ s = small (40x40), m = medium/default (80x80), l = large (120x120).

diff --git a/api/core/EchoHub.Core.Services.html b/api/core/EchoHub.Core.Services.html new file mode 100644 index 0000000..d55fffa --- /dev/null +++ b/api/core/EchoHub.Core.Services.html @@ -0,0 +1,130 @@ + + + + + Namespace EchoHub.Core.Services | EchoHub Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+
Table of Contents
+ +
+
+ +
+
+
+ +
+
+ + + +
+ + + +
+
+ + +
+ +
+ +
+
+ +
+ + + + diff --git a/api/server-irc/EchoHub.Server.Irc.IrcNumericReply.html b/api/server-irc/EchoHub.Server.Irc.IrcNumericReply.html index 437cafe..4901aa6 100644 --- a/api/server-irc/EchoHub.Server.Irc.IrcNumericReply.html +++ b/api/server-irc/EchoHub.Server.Irc.IrcNumericReply.html @@ -183,6 +183,36 @@ Class IrcNumericReply + ERR_BADCHANNELKEY + + + +
+
+ +
+
public const string ERR_BADCHANNELKEY = "475"
+
+ + + + +

Field Value

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

ERR_CANNOTSENDTOCHAN @@ -273,6 +303,36 @@ Class IrcNumericReply + ERR_KEYSET + +

+ +
+
+ +
+
public const string ERR_KEYSET = "467"
+
+ + + + +

Field Value

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

ERR_NEEDMOREPARAMS @@ -603,6 +663,36 @@ Class IrcNumericReply + ERR_UNKNOWNMODE + +

+ +
+
+ +
+
public const string ERR_UNKNOWNMODE = "472"
+
+ + + + +

Field Value

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

RPL_AWAY @@ -693,6 +783,36 @@ Class IrcNumericReply + RPL_ENDOFBANLIST + +

+ +
+
+ +
+
public const string RPL_ENDOFBANLIST = "368"
+
+ + + + +

Field Value

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

RPL_ENDOFMOTD diff --git a/api/server/EchoHub.Server.Controllers.ChannelsController.html b/api/server/EchoHub.Server.Controllers.ChannelsController.html index 78b2d37..b951f2b 100644 --- a/api/server/EchoHub.Server.Controllers.ChannelsController.html +++ b/api/server/EchoHub.Server.Controllers.ChannelsController.html @@ -159,7 +159,7 @@ public class ChannelsController : ControllerBase -

+

ChannelsController(IChannelService, EchoHubDbContext, FileStorageService, ImageToAsciiService, IHttpClientFactory, IChatService, IMessageEncryptionService)

@@ -179,7 +179,7 @@ public class ChannelsController : ControllerBase
fileStorage FileStorageService
-
asciiService ImageToAsciiService
+
asciiService ImageToAsciiService
httpClientFactory IHttpClientFactory
@@ -278,6 +278,46 @@ public Task<IActionResult> DeleteChannel(string channel) + + +

+ GetChannelCrypto(string) + +

+ +

Public crypto metadata for a channel: whether it is end-to-end encrypted and the +PBKDF2 salt clients need to derive their join credential. Never returns the +wrapped room key — that is only handed out after a successful join.

+
+
+ +
+
[HttpGet("{channel}/crypto")]
+public Task<IActionResult> GetChannelCrypto(string channel)
+
+ +

Parameters

+
+
channel string
+
+
+ +

Returns

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

@@ -317,6 +357,95 @@ public Task<IActionResult> GetChannels(int offset = 0, int limit = 50) + +

+ RekeyChannel(string, RekeyChannelRequest) + +

+ +

Changes an encrypted channel's passphrase by re-wrapping its room key. +The caller proves knowledge of the old passphrase via the old auth key; +history is never re-encrypted (the room content key does not change).

+
+
+ +
+
[HttpPost("{channel}/rekey")]
+public Task<IActionResult> RekeyChannel(string channel, RekeyChannelRequest request)
+
+ +

Parameters

+
+
channel string
+
+
request RekeyChannelRequest
+
+
+ +

Returns

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

+ SendMessageWithAttachments(string, string?) + +

+ +

Sends one message carrying optional text (content form field) plus zero or more +file attachments (Discord-style). For non-encrypted channels the server sniffs each file's +kind and renders ASCII previews for images. For end-to-end encrypted channels the client +uploads ciphertext blobs and declares each file's kind (kind) and pre-rendered, +room-encrypted preview (preview), aligned by file order — the server never inspects them.

+
+
+ +
+
[HttpPost("{channel}/messages")]
+[EnableRateLimiting("upload")]
+[RequestSizeLimit(1048576000)]
+[RequestFormLimits(MultipartBodyLengthLimit = 1048576000)]
+public Task<IActionResult> SendMessageWithAttachments(string channel, string? size = null)
+
+ +

Parameters

+
+
channel string
+
+
size string
+
+
+ +

Returns

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

@@ -398,48 +527,6 @@ public Task<IActionResult> UpdateTopic(string channel, UpdateTopicRequest - - -

- Upload(string, string?) - -

- -
-
- -
-
[HttpPost("{channel}/upload")]
-[EnableRateLimiting("upload")]
-[RequestSizeLimit(104857600)]
-[RequestFormLimits(MultipartBodyLengthLimit = 104857600)]
-public Task<IActionResult> Upload(string channel, string? size = null)
-
- -

Parameters

-
-
channel string
-
-
size string
-
-
- -

Returns

-
-
Task<IActionResult>
-
-
- - - - - - - - - - -
diff --git a/api/server/EchoHub.Server.Controllers.ModerationController.html b/api/server/EchoHub.Server.Controllers.ModerationController.html index 263df51..6477493 100644 --- a/api/server/EchoHub.Server.Controllers.ModerationController.html +++ b/api/server/EchoHub.Server.Controllers.ModerationController.html @@ -159,8 +159,8 @@ public class ModerationController : ControllerBase -

- ModerationController(EchoHubDbContext, IChatService, PresenceTracker, IEnumerable<IChatBroadcaster>) +

+ ModerationController(EchoHubDbContext, IChatService, PresenceTracker, FileStorageService, IEnumerable<IChatBroadcaster>)

@@ -168,7 +168,7 @@ public class ModerationController : ControllerBase
-
public ModerationController(EchoHubDbContext db, IChatService chatService, PresenceTracker presenceTracker, IEnumerable<IChatBroadcaster> broadcasters)
+
public ModerationController(EchoHubDbContext db, IChatService chatService, PresenceTracker presenceTracker, FileStorageService fileStorage, IEnumerable<IChatBroadcaster> broadcasters)

Parameters

@@ -179,6 +179,8 @@ public class ModerationController : ControllerBase
presenceTracker PresenceTracker
+
fileStorage FileStorageService
+
broadcasters IEnumerable<IChatBroadcaster>
diff --git a/api/server/EchoHub.Server.Controllers.UsersController.html b/api/server/EchoHub.Server.Controllers.UsersController.html index cee8ebf..969d230 100644 --- a/api/server/EchoHub.Server.Controllers.UsersController.html +++ b/api/server/EchoHub.Server.Controllers.UsersController.html @@ -159,7 +159,7 @@ public class UsersController : ControllerBase -

+

UsersController(IUserService, ImageToAsciiService)

@@ -175,7 +175,7 @@ public class UsersController : ControllerBase
userService IUserService
-
asciiService ImageToAsciiService
+
asciiService ImageToAsciiService
diff --git a/api/server/EchoHub.Server.Data.EchoHubDbContext.html b/api/server/EchoHub.Server.Data.EchoHubDbContext.html index a6f3ac2..864b879 100644 --- a/api/server/EchoHub.Server.Data.EchoHubDbContext.html +++ b/api/server/EchoHub.Server.Data.EchoHubDbContext.html @@ -195,6 +195,37 @@ Class EchoHubDbContext + +

+ Attachments + +

+ +
+
+ +
+
public DbSet<Attachment> Attachments { get; }
+
+ + + + + +

Property Value

+
+
DbSet<Attachment>
+
+
+ + + + + + + +

diff --git a/api/server/EchoHub.Server.Data.Migrations.AddChannelEncryptionEnvelope.html b/api/server/EchoHub.Server.Data.Migrations.AddChannelEncryptionEnvelope.html new file mode 100644 index 0000000..6b0f94b --- /dev/null +++ b/api/server/EchoHub.Server.Data.Migrations.AddChannelEncryptionEnvelope.html @@ -0,0 +1,306 @@ + + + + + Class AddChannelEncryptionEnvelope | EchoHub Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+
Table of Contents
+ +
+
+ +
+
+
+ +
+
+ + + +
+ +
+ + + +

+Class AddChannelEncryptionEnvelope +

+ +
+
Namespace
EchoHub.Server.Data.Migrations
+
Assembly
EchoHub.Server.dll
+
+ +
+
+ +
+
[DbContext(typeof(EchoHubDbContext))]
+[Migration("20260716012917_AddChannelEncryptionEnvelope")]
+public class AddChannelEncryptionEnvelope : Migration
+
+ + + + +
+
Inheritance
+
+ +
Migration
+
AddChannelEncryptionEnvelope
+
+
+ + + +
+
Inherited Members
+
+ + + + + + + +
+ + + + + + +

Constructors +

+ + + + +

+ AddChannelEncryptionEnvelope() + +

+ +
+
+ +
+
public AddChannelEncryptionEnvelope()
+
+ + + + + + + + + + + + + +

Methods +

+ + + + +

+ BuildTargetModel(ModelBuilder) + +

+ +
+
+ +
+
protected override void BuildTargetModel(ModelBuilder modelBuilder)
+
+ +

Parameters

+
+
modelBuilder ModelBuilder
+
+
+ + + + + + + + + + + + + + +

+ Down(MigrationBuilder) + +

+ +
+
+ +
+
protected override void Down(MigrationBuilder migrationBuilder)
+
+ +

Parameters

+
+
migrationBuilder MigrationBuilder
+
+
+ + + + + + + + + + + + + + +

+ Up(MigrationBuilder) + +

+ +
+
+ +
+
protected override void Up(MigrationBuilder migrationBuilder)
+
+ +

Parameters

+
+
migrationBuilder MigrationBuilder
+
+
+ + + + + + + + + + + + + +
+ + + + +
+ +
+ +
+
+ +
+ + + + diff --git a/api/server/EchoHub.Server.Data.Migrations.AddChannelPasswordHash.html b/api/server/EchoHub.Server.Data.Migrations.AddChannelPasswordHash.html new file mode 100644 index 0000000..32ca2b9 --- /dev/null +++ b/api/server/EchoHub.Server.Data.Migrations.AddChannelPasswordHash.html @@ -0,0 +1,306 @@ + + + + + Class AddChannelPasswordHash | EchoHub Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+
Table of Contents
+ +
+
+ +
+
+
+ +
+
+ + + +
+ +
+ + + +

+Class AddChannelPasswordHash +

+ +
+
Namespace
EchoHub.Server.Data.Migrations
+
Assembly
EchoHub.Server.dll
+
+ +
+
+ +
+
[DbContext(typeof(EchoHubDbContext))]
+[Migration("20260715232856_AddChannelPasswordHash")]
+public class AddChannelPasswordHash : Migration
+
+ + + + +
+
Inheritance
+
+ +
Migration
+
AddChannelPasswordHash
+
+
+ + + +
+
Inherited Members
+
+ + + + + + + +
+ + + + + + +

Constructors +

+ + + + +

+ AddChannelPasswordHash() + +

+ +
+
+ +
+
public AddChannelPasswordHash()
+
+ + + + + + + + + + + + + +

Methods +

+ + + + +

+ BuildTargetModel(ModelBuilder) + +

+ +
+
+ +
+
protected override void BuildTargetModel(ModelBuilder modelBuilder)
+
+ +

Parameters

+
+
modelBuilder ModelBuilder
+
+
+ + + + + + + + + + + + + + +

+ Down(MigrationBuilder) + +

+ +
+
+ +
+
protected override void Down(MigrationBuilder migrationBuilder)
+
+ +

Parameters

+
+
migrationBuilder MigrationBuilder
+
+
+ + + + + + + + + + + + + + +

+ Up(MigrationBuilder) + +

+ +
+
+ +
+
protected override void Up(MigrationBuilder migrationBuilder)
+
+ +

Parameters

+
+
migrationBuilder MigrationBuilder
+
+
+ + + + + + + + + + + + + +
+ + + + +
+ +
+ +
+
+ +
+ + + + diff --git a/api/server/EchoHub.Server.Data.Migrations.AddMessageAttachments.html b/api/server/EchoHub.Server.Data.Migrations.AddMessageAttachments.html new file mode 100644 index 0000000..e824f1d --- /dev/null +++ b/api/server/EchoHub.Server.Data.Migrations.AddMessageAttachments.html @@ -0,0 +1,306 @@ + + + + + Class AddMessageAttachments | EchoHub Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+
Table of Contents
+ +
+
+ +
+
+
+ +
+
+ + + +
+ +
+ + + +

+Class AddMessageAttachments +

+ +
+
Namespace
EchoHub.Server.Data.Migrations
+
Assembly
EchoHub.Server.dll
+
+ +
+
+ +
+
[DbContext(typeof(EchoHubDbContext))]
+[Migration("20260716020211_AddMessageAttachments")]
+public class AddMessageAttachments : Migration
+
+ + + + +
+
Inheritance
+
+ +
Migration
+
AddMessageAttachments
+
+
+ + + +
+
Inherited Members
+
+ + + + + + + +
+ + + + + + +

Constructors +

+ + + + +

+ AddMessageAttachments() + +

+ +
+
+ +
+
public AddMessageAttachments()
+
+ + + + + + + + + + + + + +

Methods +

+ + + + +

+ BuildTargetModel(ModelBuilder) + +

+ +
+
+ +
+
protected override void BuildTargetModel(ModelBuilder modelBuilder)
+
+ +

Parameters

+
+
modelBuilder ModelBuilder
+
+
+ + + + + + + + + + + + + + +

+ Down(MigrationBuilder) + +

+ +
+
+ +
+
protected override void Down(MigrationBuilder migrationBuilder)
+
+ +

Parameters

+
+
migrationBuilder MigrationBuilder
+
+
+ + + + + + + + + + + + + + +

+ Up(MigrationBuilder) + +

+ +
+
+ +
+
protected override void Up(MigrationBuilder migrationBuilder)
+
+ +

Parameters

+
+
migrationBuilder MigrationBuilder
+
+
+ + + + + + + + + + + + + +
+ + + + +
+ +
+ +
+
+ +
+ + + + diff --git a/api/server/EchoHub.Server.Data.Migrations.html b/api/server/EchoHub.Server.Data.Migrations.html index b9cb7cb..2eba51f 100644 --- a/api/server/EchoHub.Server.Data.Migrations.html +++ b/api/server/EchoHub.Server.Data.Migrations.html @@ -98,6 +98,10 @@ Classes
AddAttachmentFileSize
+
+
AddChannelEncryptionEnvelope
+
+
AddChannelIsPublic
@@ -106,10 +110,18 @@ Classes
AddChannelMembership
+
+
AddChannelPasswordHash
+
+
AddEncryptionSupport
+
+
AddMessageAttachments
+
+
AddMessageEmbed
diff --git a/api/server/EchoHub.Server.Hubs.ChatHub.html b/api/server/EchoHub.Server.Hubs.ChatHub.html index b40e047..4b06a16 100644 --- a/api/server/EchoHub.Server.Hubs.ChatHub.html +++ b/api/server/EchoHub.Server.Hubs.ChatHub.html @@ -163,8 +163,8 @@ public class ChatHub : Hub<IEchoHubClient>, IDisposable -

- ChatHub(IChatService, ILogger<ChatHub>) +

+ ChatHub(IChatService, IChannelService, ILogger<ChatHub>)

@@ -172,13 +172,15 @@ public class ChatHub : Hub<IEchoHubClient>, IDisposable
-
public ChatHub(IChatService chatService, ILogger<ChatHub> logger)
+
public ChatHub(IChatService chatService, IChannelService channelService, ILogger<ChatHub> logger)

Parameters

chatService IChatService
+
channelService IChannelService
+
logger ILogger<ChatHub>
@@ -276,8 +278,8 @@ public class ChatHub : Hub<IEchoHubClient>, IDisposable -

- JoinChannel(string) +

+ JoinChannel(string, string?)

@@ -285,13 +287,15 @@ public class ChatHub : Hub<IEchoHubClient>, IDisposable
-
public Task<JoinChannelResult> JoinChannel(string channelName)
+
public Task<JoinChannelResult> JoinChannel(string channelName, string? password = null)

Parameters

channelName string
+
password string
+

Returns

diff --git a/api/server/EchoHub.Server.Services.ChannelService.html b/api/server/EchoHub.Server.Services.ChannelService.html index 0cf2d05..3230cbe 100644 --- a/api/server/EchoHub.Server.Services.ChannelService.html +++ b/api/server/EchoHub.Server.Services.ChannelService.html @@ -199,8 +199,8 @@ Class ChannelService -

- CreateChannelAsync(Guid, string, string?, bool) +

+ CreateChannelAsync(Guid, string, string?, bool, string?, string?, string?)

@@ -208,7 +208,7 @@ Class ChannelService
-
public Task<ChannelOperationResult> CreateChannelAsync(Guid creatorUserId, string name, string? topic, bool isPublic)
+
public Task<ChannelOperationResult> CreateChannelAsync(Guid creatorUserId, string name, string? topic, bool isPublic, string? password = null, string? encryptionSalt = null, string? wrappedRoomKey = null)

Parameters

@@ -221,6 +221,12 @@ Class ChannelService
bool
+
password string
+
+
encryptionSalt string
+
+
wrappedRoomKey string
+

Returns

@@ -279,8 +285,8 @@ Class ChannelService -

- EnsureChannelMembershipAsync(Guid, string) +

+ EnsureChannelMembershipAsync(Guid, string, string?)

@@ -288,7 +294,7 @@ Class ChannelService
-
public Task<(bool Success, string? Error)> EnsureChannelMembershipAsync(Guid userId, string channelName)
+
public Task<(bool Success, string? Error, bool PasswordRequired)> EnsureChannelMembershipAsync(Guid userId, string channelName, string? password = null)

Parameters

@@ -297,11 +303,13 @@ Class ChannelService
string
+
password string
+

Returns

-
Task<(bool Success, string Error)>
+
Task<(bool Success, string Error, bool PasswordRequired)>
@@ -351,6 +359,78 @@ Class ChannelService + +

+ GetChannelCryptoAsync(string) + +

+ +
+
+ +
+
public Task<ChannelCryptoDto?> GetChannelCryptoAsync(string channelName)
+
+ +

Parameters

+
+
channelName string
+
+
+ +

Returns

+
+
Task<ChannelCryptoDto>
+
+
+ + + + + + + + + + + + + +

+ GetChannelKeyEnvelopeAsync(string) + +

+ +
+
+ +
+
public Task<(string? EncryptionSalt, string? WrappedRoomKey)> GetChannelKeyEnvelopeAsync(string channelName)
+
+ +

Parameters

+
+
channelName string
+
+
+ +

Returns

+
+
Task<(string EncryptionSalt, string WrappedRoomKey)>
+
+
+ + + + + + + + + + +

@@ -458,6 +538,99 @@ Class ChannelService + +

+ RekeyChannelAsync(Guid, string, string, string, string, string) + +

+ +

Changes an encrypted channel's passphrase by swapping the join-gate hash and the +wrapped room key. The room content key itself never changes, so history stays +readable — the client re-wraps it under the new passphrase-derived key. +Creator only: admins cannot rekey a room whose passphrase they don't know.

+
+
+ +
+
public Task<ChannelOperationResult> RekeyChannelAsync(Guid callerUserId, string channelName, string oldPassword, string newPassword, string newEncryptionSalt, string newWrappedRoomKey)
+
+ +

Parameters

+
+
callerUserId Guid
+
+
channelName string
+
+
oldPassword string
+
+
newPassword string
+
+
newEncryptionSalt string
+
+
newWrappedRoomKey string
+
+
+ +

Returns

+
+
Task<ChannelOperationResult>
+
+
+ + + + + + + + + + + + + +

+ SetChannelPasswordAsync(Guid, string, string?) + +

+ +

Sets, changes, or clears (null) a channel's join password. Creator or admin only. +Not available on end-to-end encrypted channels — those change passphrase via +RekeyChannelAsync(Guid, string, string, string, string, string) so the room key envelope stays consistent.

+
+
+ +
+
public Task<ChannelOperationResult> SetChannelPasswordAsync(Guid callerUserId, string channelName, string? password)
+
+ +

Parameters

+
+
callerUserId Guid
+
+
channelName string
+
+
password string
+
+
+ +

Returns

+
+
Task<ChannelOperationResult>
+
+
+ + + + + + + + + + +

diff --git a/api/server/EchoHub.Server.Services.ChatService.html b/api/server/EchoHub.Server.Services.ChatService.html index a0ed2b0..0c343ae 100644 --- a/api/server/EchoHub.Server.Services.ChatService.html +++ b/api/server/EchoHub.Server.Services.ChatService.html @@ -160,8 +160,8 @@ Class ChatService -

- ChatService(IServiceScopeFactory, PresenceTracker, IEnumerable<IChatBroadcaster>, LinkEmbedService, IMessageEncryptionService, IChannelService, ILogger<ChatService>) +

+ ChatService(IServiceScopeFactory, PresenceTracker, IEnumerable<IChatBroadcaster>, LinkEmbedService, IMessageEncryptionService, IChannelService, FileStorageService, ILogger<ChatService>)

@@ -169,7 +169,7 @@ Class ChatService
-
public ChatService(IServiceScopeFactory scopeFactory, PresenceTracker presenceTracker, IEnumerable<IChatBroadcaster> broadcasters, LinkEmbedService embedService, IMessageEncryptionService encryption, IChannelService channelService, ILogger<ChatService> logger)
+
public ChatService(IServiceScopeFactory scopeFactory, PresenceTracker presenceTracker, IEnumerable<IChatBroadcaster> broadcasters, LinkEmbedService embedService, IMessageEncryptionService encryption, IChannelService channelService, FileStorageService fileStorage, ILogger<ChatService> logger)

Parameters

@@ -186,6 +186,8 @@ Class ChatService
channelService IChannelService
+
fileStorage FileStorageService
+
logger ILogger<ChatService>
@@ -395,8 +397,8 @@ Class ChatService -

- JoinChannelAsync(string, Guid, string, string) +

+ JoinChannelAsync(string, Guid, string, string, string?)

@@ -404,7 +406,7 @@ Class ChatService
-
public Task<(List<MessageDto> History, string? Error)> JoinChannelAsync(string connectionId, Guid userId, string username, string channelName)
+
public Task<(List<MessageDto> History, string? Error, bool PasswordRequired)> JoinChannelAsync(string connectionId, Guid userId, string username, string channelName, string? password = null)

Parameters

@@ -417,11 +419,13 @@ Class ChatService
channelName string
+
password string
+

Returns

-
Task<(List<MessageDto> History, string Error)>
+
Task<(List<MessageDto> History, string Error, bool PasswordRequired)>
diff --git a/api/server/EchoHub.Server.Services.FileStorageService.html b/api/server/EchoHub.Server.Services.FileStorageService.html index 5ab0190..e7c1856 100644 --- a/api/server/EchoHub.Server.Services.FileStorageService.html +++ b/api/server/EchoHub.Server.Services.FileStorageService.html @@ -254,6 +254,39 @@ Class FileStorageService + +

+ GetStoredFileIds() + +

+ +

Returns the set of stored file ids (filenames without extension) currently on disk. +One directory scan, so callers can bulk-check many attachments without a glob per file.

+
+
+ +
+
public HashSet<string> GetStoredFileIds()
+
+ + +

Returns

+
+
HashSet<string>
+
+
+ + + + + + + + + + +

@@ -278,7 +311,7 @@ Class FileStorageService Returns

-
Task<(string fileId, string filePath)>
+
Task<(string EncryptionSalt, string WrappedRoomKey)>
diff --git a/api/server/EchoHub.Server.Services.html b/api/server/EchoHub.Server.Services.html index 686fba1..709663f 100644 --- a/api/server/EchoHub.Server.Services.html +++ b/api/server/EchoHub.Server.Services.html @@ -118,14 +118,6 @@ status (success/failure code, conflicting hosts) for operator-facing endpoints.<
FileStorageService
-
-
FileValidationHelper
-
-
-
-
ImageToAsciiService
-
-
LinkEmbedService
diff --git a/api/toc.html b/api/toc.html index 5066580..e3066f2 100644 --- a/api/toc.html +++ b/api/toc.html @@ -84,18 +84,42 @@
  • BackupInfo
  • +
  • + ChannelPasswordRequiredException +
  • ClientEncryptionService
  • +
  • + ClipboardFiles +
  • EchoHubConnection
  • +
  • + FolderPickResult +
  • +
  • + JoinOutcome +
  • +
  • + NativeFolderPicker +
  • NotificationSoundService
  • +
  • + OutgoingAttachment +
  • PathSetup
  • +
  • + PickerOutcome +
  • +
  • + RoomKeyStore +
  • UpdateBackupService
  • @@ -160,6 +184,9 @@
  • AudioPlayerDialog
  • +
  • + ChannelPasswordDialog +
  • ConnectDialog
  • @@ -212,6 +239,9 @@ EchoHub.Client.UI.Helpers
  • @@ -512,15 +583,24 @@
  • AddAttachmentFileSize
  • +
  • + AddChannelEncryptionEnvelope +
  • AddChannelIsPublic
  • AddChannelMembership
  • +
  • + AddChannelPasswordHash +
  • AddEncryptionSupport
  • +
  • + AddMessageAttachments +
  • AddMessageEmbed
  • @@ -562,12 +642,6 @@
  • FileStorageService
  • -
  • - FileValidationHelper -
  • -
  • - ImageToAsciiService -
  • LinkEmbedService
  • diff --git a/api/toc.json b/api/toc.json index d69df73..c755f2b 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":"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"}]}]}]}]} +{"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":"ChannelPasswordRequiredException","href":"client/EchoHub.Client.Services.ChannelPasswordRequiredException.html","topicHref":"client/EchoHub.Client.Services.ChannelPasswordRequiredException.html","topicUid":"EchoHub.Client.Services.ChannelPasswordRequiredException","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":"ClipboardFiles","href":"client/EchoHub.Client.Services.ClipboardFiles.html","topicHref":"client/EchoHub.Client.Services.ClipboardFiles.html","topicUid":"EchoHub.Client.Services.ClipboardFiles","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":"FolderPickResult","href":"client/EchoHub.Client.Services.FolderPickResult.html","topicHref":"client/EchoHub.Client.Services.FolderPickResult.html","topicUid":"EchoHub.Client.Services.FolderPickResult","type":"Class"},{"name":"JoinOutcome","href":"client/EchoHub.Client.Services.JoinOutcome.html","topicHref":"client/EchoHub.Client.Services.JoinOutcome.html","topicUid":"EchoHub.Client.Services.JoinOutcome","type":"Class"},{"name":"NativeFolderPicker","href":"client/EchoHub.Client.Services.NativeFolderPicker.html","topicHref":"client/EchoHub.Client.Services.NativeFolderPicker.html","topicUid":"EchoHub.Client.Services.NativeFolderPicker","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":"OutgoingAttachment","href":"client/EchoHub.Client.Services.OutgoingAttachment.html","topicHref":"client/EchoHub.Client.Services.OutgoingAttachment.html","topicUid":"EchoHub.Client.Services.OutgoingAttachment","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":"PickerOutcome","href":"client/EchoHub.Client.Services.PickerOutcome.html","topicHref":"client/EchoHub.Client.Services.PickerOutcome.html","topicUid":"EchoHub.Client.Services.PickerOutcome","type":"Enum"},{"name":"RoomKeyStore","href":"client/EchoHub.Client.Services.RoomKeyStore.html","topicHref":"client/EchoHub.Client.Services.RoomKeyStore.html","topicUid":"EchoHub.Client.Services.RoomKeyStore","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":"ChannelPasswordDialog","href":"client/EchoHub.Client.UI.Dialogs.ChannelPasswordDialog.html","topicHref":"client/EchoHub.Client.UI.Dialogs.ChannelPasswordDialog.html","topicUid":"EchoHub.Client.UI.Dialogs.ChannelPasswordDialog","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":"DroppedFileParser","href":"client/EchoHub.Client.UI.Helpers.DroppedFileParser.html","topicHref":"client/EchoHub.Client.UI.Helpers.DroppedFileParser.html","topicUid":"EchoHub.Client.UI.Helpers.DroppedFileParser","type":"Class"},{"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":"AttachmentDto","href":"core/EchoHub.Core.DTOs.AttachmentDto.html","topicHref":"core/EchoHub.Core.DTOs.AttachmentDto.html","topicUid":"EchoHub.Core.DTOs.AttachmentDto","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":"ChannelCryptoDto","href":"core/EchoHub.Core.DTOs.ChannelCryptoDto.html","topicHref":"core/EchoHub.Core.DTOs.ChannelCryptoDto.html","topicUid":"EchoHub.Core.DTOs.ChannelCryptoDto","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":"RekeyChannelRequest","href":"core/EchoHub.Core.DTOs.RekeyChannelRequest.html","topicHref":"core/EchoHub.Core.DTOs.RekeyChannelRequest.html","topicUid":"EchoHub.Core.DTOs.RekeyChannelRequest","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":"Attachment","href":"core/EchoHub.Core.Models.Attachment.html","topicHref":"core/EchoHub.Core.Models.Attachment.html","topicUid":"EchoHub.Core.Models.Attachment","type":"Class"},{"name":"AttachmentKind","href":"core/EchoHub.Core.Models.AttachmentKind.html","topicHref":"core/EchoHub.Core.Models.AttachmentKind.html","topicUid":"EchoHub.Core.Models.AttachmentKind","type":"Enum"},{"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":"EchoHub.Core.Security","href":"core/EchoHub.Core.Security.html","topicHref":"core/EchoHub.Core.Security.html","topicUid":"EchoHub.Core.Security","type":"Namespace","items":[{"name":"RoomCrypto","href":"core/EchoHub.Core.Security.RoomCrypto.html","topicHref":"core/EchoHub.Core.Security.RoomCrypto.html","topicUid":"EchoHub.Core.Security.RoomCrypto","type":"Class"},{"name":"RoomCrypto.DerivedKeys","href":"core/EchoHub.Core.Security.RoomCrypto.DerivedKeys.html","topicHref":"core/EchoHub.Core.Security.RoomCrypto.DerivedKeys.html","topicUid":"EchoHub.Core.Security.RoomCrypto.DerivedKeys","type":"Class"}]},{"name":"EchoHub.Core.Services","href":"core/EchoHub.Core.Services.html","topicHref":"core/EchoHub.Core.Services.html","topicUid":"EchoHub.Core.Services","type":"Namespace","items":[{"name":"FileValidationHelper","href":"core/EchoHub.Core.Services.FileValidationHelper.html","topicHref":"core/EchoHub.Core.Services.FileValidationHelper.html","topicUid":"EchoHub.Core.Services.FileValidationHelper","type":"Class"},{"name":"ImageToAsciiService","href":"core/EchoHub.Core.Services.ImageToAsciiService.html","topicHref":"core/EchoHub.Core.Services.ImageToAsciiService.html","topicUid":"EchoHub.Core.Services.ImageToAsciiService","type":"Class"}]}]},{"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":"AddChannelEncryptionEnvelope","href":"server/EchoHub.Server.Data.Migrations.AddChannelEncryptionEnvelope.html","topicHref":"server/EchoHub.Server.Data.Migrations.AddChannelEncryptionEnvelope.html","topicUid":"EchoHub.Server.Data.Migrations.AddChannelEncryptionEnvelope","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":"AddChannelPasswordHash","href":"server/EchoHub.Server.Data.Migrations.AddChannelPasswordHash.html","topicHref":"server/EchoHub.Server.Data.Migrations.AddChannelPasswordHash.html","topicUid":"EchoHub.Server.Data.Migrations.AddChannelPasswordHash","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":"AddMessageAttachments","href":"server/EchoHub.Server.Data.Migrations.AddMessageAttachments.html","topicHref":"server/EchoHub.Server.Data.Migrations.AddMessageAttachments.html","topicUid":"EchoHub.Server.Data.Migrations.AddMessageAttachments","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":"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/architecture.html b/articles/architecture.html index 503ee2a..58353d4 100644 --- a/articles/architecture.html +++ b/articles/architecture.html @@ -127,7 +127,7 @@ TUI Client ──► WebSocket ──► ChatHub ─────┘
    • UI: Main window, dialogs, chat renderer with ANSI color support
    • Services: API client with automatic token refresh, SignalR connection wrapper, audio playback (NetCoreAudio), automatic update checker (AlwaysUpToDate)
    • -
    • Themes: 13 built-in color themes (including transparent theme with true terminal transparency)
    • +
    • Themes: 14 built-in color themes (including transparent dark/light themes with true terminal transparency)
    • Config: Client configuration management with session persistence ("Remember Me" refresh tokens)

    Communication

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

    Release history for EchoHub.

    Releases

      +
    • v0.2.12 - End-to-End Encrypted Channels, IRC Channel Keys, Image Save & Ctrl+W Crash Fix
    • 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
    • diff --git a/changelog/toc.html b/changelog/toc.html index 0ad1431..5522b12 100644 --- a/changelog/toc.html +++ b/changelog/toc.html @@ -15,6 +15,9 @@
    • Overview
    • +
    • + v0.2.12 +
    • v0.2.11
    • diff --git a/changelog/toc.json b/changelog/toc.json index 7d2ec0a..26ccc79 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.11","href":"v0.2.11.html","topicHref":"v0.2.11.html"},{"name":"v0.2.10","href":"v0.2.10.html","topicHref":"v0.2.10.html"},{"name":"v0.2.9","href":"v0.2.9.html","topicHref":"v0.2.9.html"},{"name":"v0.2.8","href":"v0.2.8.html","topicHref":"v0.2.8.html"},{"name":"v0.2.7","href":"v0.2.7.html","topicHref":"v0.2.7.html"},{"name":"v0.2.6","href":"v0.2.6.html","topicHref":"v0.2.6.html"},{"name":"v0.2.5","href":"v0.2.5.html","topicHref":"v0.2.5.html"},{"name":"v0.2.4","href":"v0.2.4.html","topicHref":"v0.2.4.html"},{"name":"v0.2.3","href":"v0.2.3.html","topicHref":"v0.2.3.html"},{"name":"v0.2.2","href":"v0.2.2.html","topicHref":"v0.2.2.html"},{"name":"v0.2.1","href":"v0.2.1.html","topicHref":"v0.2.1.html"},{"name":"v0.2.0","href":"v0.2.0.html","topicHref":"v0.2.0.html"},{"name":"v0.1.1","href":"v0.1.1.html","topicHref":"v0.1.1.html"},{"name":"v0.1.0","href":"v0.1.0.html","topicHref":"v0.1.0.html"}]} +{"items":[{"name":"Overview","href":"index.html","topicHref":"index.html"},{"name":"v0.2.12","href":"v0.2.12.html","topicHref":"v0.2.12.html"},{"name":"v0.2.11","href":"v0.2.11.html","topicHref":"v0.2.11.html"},{"name":"v0.2.10","href":"v0.2.10.html","topicHref":"v0.2.10.html"},{"name":"v0.2.9","href":"v0.2.9.html","topicHref":"v0.2.9.html"},{"name":"v0.2.8","href":"v0.2.8.html","topicHref":"v0.2.8.html"},{"name":"v0.2.7","href":"v0.2.7.html","topicHref":"v0.2.7.html"},{"name":"v0.2.6","href":"v0.2.6.html","topicHref":"v0.2.6.html"},{"name":"v0.2.5","href":"v0.2.5.html","topicHref":"v0.2.5.html"},{"name":"v0.2.4","href":"v0.2.4.html","topicHref":"v0.2.4.html"},{"name":"v0.2.3","href":"v0.2.3.html","topicHref":"v0.2.3.html"},{"name":"v0.2.2","href":"v0.2.2.html","topicHref":"v0.2.2.html"},{"name":"v0.2.1","href":"v0.2.1.html","topicHref":"v0.2.1.html"},{"name":"v0.2.0","href":"v0.2.0.html","topicHref":"v0.2.0.html"},{"name":"v0.1.1","href":"v0.1.1.html","topicHref":"v0.1.1.html"},{"name":"v0.1.0","href":"v0.1.0.html","topicHref":"v0.1.0.html"}]} diff --git a/changelog/v0.2.12.html b/changelog/v0.2.12.html new file mode 100644 index 0000000..1f575e1 --- /dev/null +++ b/changelog/v0.2.12.html @@ -0,0 +1,169 @@ + + + + + v0.2.12 | EchoHub Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + +
      + +
      +
      +
      +
      +
      Table of Contents
      + +
      +
      + +
      +
      +
      + +
      +
      + + + +
      + +
      +

      v0.2.12

      + +

      Private channels are now genuinely private: password-protected channels are end-to-end encrypted, so the server (and its operators) can gate joins and measure storage but cannot read message or file contents. The IRC gateway grows real MODE/TOPIC support and channel keys, and the client gets image "save original", a transparent-light theme, drag-and-drop file sending, Ctrl+V paste, and a fix for the intermittent Ctrl+W crash.

      +

      New Features

      +
        +
      • End-to-end encrypted channels — creating a channel with a password now provisions a zero-knowledge room: +
          +
        • The passphrase never leaves the client. It derives (PBKDF2-SHA256, 210k iterations) two keys: an auth key sent to the server as the join credential, and a key-encryption key that never leaves the machine.
        • +
        • A random room content key encrypts every message and file with AES-256-GCM. The server only ever stores the room key wrapped under the passphrase, so it can gate joins and report a channel's message count, storage size, and attachments — but cannot decrypt any of it. Even the server owner cannot read a private room's contents.
        • +
        • Members' clients cache the derived room key locally (in the per-server config, like saved sessions) so the passphrase isn't retyped every launch; joining on a new device prompts for it once.
        • +
        • Change the passphrase with /passwd <old> <new> (channel creator only). The room key is re-wrapped, not rotated, so existing history stays readable and members who join later with the new passphrase can still read older messages.
        • +
        • Files and images are encrypted client-side before upload; for images the ASCII-art preview is rendered on the client and stored room-encrypted too. Sending images by URL is disabled in encrypted channels (the server can't fetch-and-render without the key).
        • +
        • End-to-end encrypted channels cannot be joined over the IRC gateway (that would require the server to hold the room key) — IRC JOIN returns 475 directing users to the EchoHub client.
        • +
        +
      • +
      • Password-protected channels — set an optional password when creating a channel (masked field in the Create Channel dialog, password on POST /api/channels). Passwords are BCrypt-hashed server-side; the join gate applies on first join only (existing members and the creator are unaffected). Protected channels show a * marker in the channel list and +k in the status bar
      • +
      • Save original images — image messages now show a clickable "[↓ save original]" line under the ASCII-art preview that downloads the full-resolution original to your Downloads folder (decrypting locally in encrypted channels)
      • +
      • Messages with attachments (Discord-style) — a message is now text plus a list of attachments instead of being either text or a single file. One message can carry a caption and several files (images, audio, docs) together: +
          +
        • Compose with a staging tray: /send <file> or dropping files onto the terminal stages them (shown on the input bar); the next Enter sends your typed caption and all staged files as one message. /clear drops staged files. /send <URL> still posts an image immediately.
        • +
        • Each image attachment renders its own ASCII preview with its own "save original" action; audio/file attachments each get their own play/download line.
        • +
        • In encrypted channels every attachment is encrypted individually (blob + ASCII preview), and the caption is room-encrypted — the server still stores only ciphertext and can report count/size but not contents.
        • +
        • Up to 10 attachments per message.
        • +
        +
      • +
      • Right-click message menu — right-click any message for a context menu: save/download/play its attachment, mention the sender, view their profile, copy the text, copy the message ID (for linking or command arguments), or delete the message. (Keyboard: F6 focuses the message list for arrow-key selection + Delete.) The selected message is now highlighted while the list is focused.
      • +
      • Message deletion — press Delete on a selected message to remove it. You can always delete your own messages; moderators and above can delete others' messages, but only from users below their own role (a mod can't delete an admin's or owner's message). Deleting a message also removes its attachment blobs from server storage.
      • +
      • Customizable download folder/downloadpath opens your OS-native folder picker (Windows Explorer / macOS Finder / Linux GTK or KDE) to choose where downloaded attachments and saved images go; /downloadpath <path> sets it directly (the fallback when no native picker is available). Downloaded files now land in that folder (with automatic (n) de-duplication) instead of a temp directory.
      • +
      • /join <channel> [password] — join protected channels inline, or let the client prompt: joining a protected channel without a password opens a masked prompt that re-prompts on a wrong password
      • +
      • IRC channel keys — JOIN #room <key> works against room passwords (RFC 1459 comma-paired key lists supported); keyless or wrong-key joins get 475 ERR_BADCHANNELKEY
      • +
      • IRC MODE implemented — MODE #chan reports +k/+, MODE #chan +k <key> sets and -k clears the room password (channel creator or admin only), ban-list probes get a clean empty reply, and CHANMODES is advertised in ISUPPORT
      • +
      • IRC TOPIC set support — the channel creator can change the topic from IRC; the change broadcasts to connected TUI clients (previously topic changes were rejected with a stub error)
      • +
      • Attach a file by drag & drop or by pasting — drop a file onto the terminal, or copy a file in your file manager and press Ctrl+V, to stage it as an attachment (the next Enter sends it with your caption). Multiple files at once are supported. Ctrl+V still pastes text when the clipboard holds text; Ctrl+Y is a paste alias. On Windows the copied-file paste reads the clipboard's file list directly (Windows Terminal never pastes copied files as text), with xclip/wl-paste used on Linux
      • +
      • Pick ASCII-art size for attached images — /size opens a Small/Medium/Large picker (40×40 / 80×80 / 120×120) with descriptions, /size <s|m|l> sets it directly, and /send <file> -l sets it for that message. The choice is a saved preference and applies to copy-paste/drag-drop images (which have no per-file flag); the current size is shown in the staging tray
      • +
      • New TransparentLight theme — dark characters on a transparent background, for light terminal color schemes (/theme transparentlight)
      • +
      • Timestamps in messages are now aware of the current culture and display the short time pattern for today's messages and the short date+time pattern for older messages.
      • +
      +

      Bug Fixes

      +
        +
      • Transparent themes no longer draw an opaque box behind the message input. The input TextView renders with the Editable visual role, which Terminal.Gui derives as an opaque color when a theme leaves it unset; the themes now pin Editable/ReadOnly to their base colors so the input matches its (transparent) background.
      • +
      • Attachments whose files have been pruned (retention cleanup deletes blobs older than Storage:RetentionDays but left the message rows) no longer render a dead download/preview. When channel history loads, the server checks which attachment blobs still exist: missing ones are dropped from the message, and an attachment-only message whose files are all gone is removed from the database.
      • +
      • Fixed intermittent crash on Ctrl+W — Terminal.Gui binds Ctrl+W to clipboard-cut, and Windows clipboard contention (another app holding the clipboard) threw an unhandled Win32Exception that took the app down. Ctrl+W now deletes the previous word (readline behavior, no clipboard), and all clipboard shortcuts (Ctrl+X/C/V/Y) are guarded so transient clipboard failures log a warning instead of crashing
      • +
      • Fixed emoji shortcode replacement permanently disabling itself if a cursor update threw mid-replacement
      • +
      • IRC LIST no longer leaks private channels; protected channels are marked [+k]
      • +
      +

      API Changes

      +
        +
      • ChannelDto gains isProtected and isEncrypted; CreateChannelRequest gains optional password, encryptionSalt, and wrappedRoomKey; SignalR JoinChannel takes an optional second password argument and JoinChannelResult gains passwordRequired, encryptionSalt, and wrappedRoomKey (older clients must update to join over SignalR)
      • +
      • New endpoints: GET /api/channels/{channel}/crypto (public crypto metadata — salt only, never the wrapped key) and POST /api/channels/{channel}/rekey (creator-only passphrase change)
      • +
      • The upload endpoint accepts type and content form fields for encrypted channels, where the client supplies the declared message type and room-encrypted content
      • +
      • ImageToAsciiService and FileValidationHelper moved from EchoHub.Server to EchoHub.Core so the client can render ASCII art and detect file types for encrypted uploads
      • +
      • Message shape change: MessageDto drops Type/AttachmentUrl/AttachmentFileName/AttachmentFileSize and gains Attachments (a list of AttachmentDto { Kind, Url, FileName, FileSize, AsciiPreview }, null/empty for plain text). New Attachment entity + table with a cascade FK to Message
      • +
      • New endpoint POST /api/channels/{channel}/messages (multipart: content + N files, plus kind/preview per file for encrypted channels) replaces the single-file upload endpoint; DELETE /api/moderation/messages/{id} now enforces the own-or-higher-role rule
      • +
      • New EF migrations AddChannelPasswordHash, AddChannelEncryptionEnvelope, and AddMessageAttachments (applied automatically on server start); a one-time startup data migration folds legacy single-attachment messages into the new model
      • +
      + +
      + + + + + +
      + +
      + +
      +
      + +
      + + + + diff --git a/index.json b/index.json index deb0b65..eb3a808 100644 --- a/index.json +++ b/index.json @@ -12,7 +12,7 @@ "api/client/EchoHub.Client.Commands.CommandHandler.html": { "href": "api/client/EchoHub.Client.Commands.CommandHandler.html", "title": "Class CommandHandler | EchoHub Documentation", - "summary": "Class CommandHandler Namespace EchoHub.Client.Commands Assembly EchoHub.Client.dll public class CommandHandler Inheritance object CommandHandler Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors CommandHandler() public CommandHandler() Methods HandleAsync(string) public Task HandleAsync(string input) Parameters input string Returns Task IsCommand(string) public bool IsCommand(string input) Parameters input string Returns bool Events OnAssignRole public event Func? OnAssignRole Event Type Func OnBanUser public event Func? OnBanUser Event Type Func OnHelp public event Func? OnHelp Event Type Func OnJoinChannel public event Func? OnJoinChannel Event Type Func OnKickUser public event Func? OnKickUser Event Type Func OnLeaveChannel public event Func? OnLeaveChannel Event Type Func OnListUsers public event Func? OnListUsers Event Type Func OnMuteUser public event Func? OnMuteUser Event Type Func OnNukeChannel public event Func? OnNukeChannel Event Type Func OnOpenProfile public event Func? OnOpenProfile Event Type Func OnOpenServers public event Func? OnOpenServers Event Type Func OnQuit public event Func? OnQuit Event Type Func OnSendFile public event Func? OnSendFile Event Type Func OnSetAvatar public event Func? OnSetAvatar Event Type Func OnSetColor public event Func? OnSetColor Event Type Func OnSetNick public event Func? OnSetNick Event Type Func OnSetStatus public event Func? OnSetStatus Event Type Func OnSetTheme public event Func? OnSetTheme Event Type Func OnSetTopic public event Func? OnSetTopic Event Type Func OnTestSound public event Func? OnTestSound Event Type Func OnUnbanUser public event Func? OnUnbanUser Event Type Func OnUnmuteUser public event Func? OnUnmuteUser Event Type Func" + "summary": "Class CommandHandler Namespace EchoHub.Client.Commands Assembly EchoHub.Client.dll public class CommandHandler Inheritance object CommandHandler Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors CommandHandler() public CommandHandler() Methods HandleAsync(string) public Task HandleAsync(string input) Parameters input string Returns Task IsCommand(string) public bool IsCommand(string input) Parameters input string Returns bool Events OnAssignRole public event Func? OnAssignRole Event Type Func OnBanUser public event Func? OnBanUser Event Type Func OnChangeRoomPassword public event Func? OnChangeRoomPassword Event Type Func OnClearAttachments public event Func? OnClearAttachments Event Type Func OnHelp public event Func? OnHelp Event Type Func OnJoinChannel public event Func? OnJoinChannel Event Type Func OnKickUser public event Func? OnKickUser Event Type Func OnLeaveChannel public event Func? OnLeaveChannel Event Type Func OnListUsers public event Func? OnListUsers Event Type Func OnMuteUser public event Func? OnMuteUser Event Type Func OnNukeChannel public event Func? OnNukeChannel Event Type Func OnOpenProfile public event Func? OnOpenProfile Event Type Func OnOpenServers public event Func? OnOpenServers Event Type Func OnQuit public event Func? OnQuit Event Type Func OnSendFile public event Func? OnSendFile Event Type Func OnSetAsciiSize public event Func? OnSetAsciiSize Event Type Func OnSetAvatar public event Func? OnSetAvatar Event Type Func OnSetColor public event Func? OnSetColor Event Type Func OnSetDownloadPath public event Func? OnSetDownloadPath Event Type Func OnSetNick public event Func? OnSetNick Event Type Func OnSetStatus public event Func? OnSetStatus Event Type Func OnSetTheme public event Func? OnSetTheme Event Type Func OnSetTopic public event Func? OnSetTopic Event Type Func OnTestSound public event Func? OnTestSound Event Type Func OnUnbanUser public event Func? OnUnbanUser Event Type Func OnUnmuteUser public event Func? OnUnmuteUser Event Type Func" }, "api/client/EchoHub.Client.Commands.CommandResult.html": { "href": "api/client/EchoHub.Client.Commands.CommandResult.html", @@ -32,7 +32,7 @@ "api/client/EchoHub.Client.Config.ClientConfig.html": { "href": "api/client/EchoHub.Client.Config.ClientConfig.html", "title": "Class ClientConfig | EchoHub Documentation", - "summary": "Class ClientConfig Namespace EchoHub.Client.Config Assembly EchoHub.Client.dll public class ClientConfig Inheritance object ClientConfig Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors ClientConfig() public ClientConfig() Properties ActiveTheme public string ActiveTheme { get; set; } Property Value string DefaultPreset public AccountPreset DefaultPreset { get; set; } Property Value AccountPreset Notifications public NotificationConfig Notifications { get; set; } Property Value NotificationConfig SavedServers public List SavedServers { get; set; } Property Value List" + "summary": "Class ClientConfig Namespace EchoHub.Client.Config Assembly EchoHub.Client.dll public class ClientConfig Inheritance object ClientConfig Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors ClientConfig() public ClientConfig() Properties ActiveTheme public string ActiveTheme { get; set; } Property Value string DefaultAsciiSize ASCII-art rendering size for images you attach: \"s\" (40×40), \"m\" (80×80), or \"l\" (120×120). Applies to copy-paste/drag-drop attachments, which have no per-file size flag. public string DefaultAsciiSize { get; set; } Property Value string DefaultPreset public AccountPreset DefaultPreset { get; set; } Property Value AccountPreset DownloadPath Folder where downloaded attachments and saved images are written. When null, the OS Downloads folder is used. Set via the native folder picker or /downloadpath. public string? DownloadPath { get; set; } Property Value string Notifications public NotificationConfig Notifications { get; set; } Property Value NotificationConfig SavedServers public List SavedServers { get; set; } Property Value List" }, "api/client/EchoHub.Client.Config.ConfigManager.html": { "href": "api/client/EchoHub.Client.Config.ConfigManager.html", @@ -47,7 +47,7 @@ "api/client/EchoHub.Client.Config.SavedServer.html": { "href": "api/client/EchoHub.Client.Config.SavedServer.html", "title": "Class SavedServer | EchoHub Documentation", - "summary": "Class SavedServer Namespace EchoHub.Client.Config Assembly EchoHub.Client.dll public class SavedServer Inheritance object SavedServer Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors SavedServer() public SavedServer() Properties LastConnected public DateTimeOffset LastConnected { get; set; } Property Value DateTimeOffset Name public required string Name { get; set; } Property Value string RefreshToken public string? RefreshToken { get; set; } Property Value string RememberMe public bool RememberMe { get; set; } Property Value bool Url public required string Url { get; set; } Property Value string Username public string? Username { get; set; } Property Value string" + "summary": "Class SavedServer Namespace EchoHub.Client.Config Assembly EchoHub.Client.dll public class SavedServer Inheritance object SavedServer Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors SavedServer() public SavedServer() Properties ChannelKeys Cached room content keys for end-to-end encrypted channels on this server, keyed by channel name (base64). Like RefreshToken, these live only on the user's machine — the server never sees them. public Dictionary ChannelKeys { get; set; } Property Value Dictionary LastConnected public DateTimeOffset LastConnected { get; set; } Property Value DateTimeOffset Name public required string Name { get; set; } Property Value string RefreshToken public string? RefreshToken { get; set; } Property Value string RememberMe public bool RememberMe { get; set; } Property Value bool Url public required string Url { get; set; } Property Value string Username public string? Username { get; set; } Property Value string" }, "api/client/EchoHub.Client.Config.html": { "href": "api/client/EchoHub.Client.Config.html", @@ -57,7 +57,7 @@ "api/client/EchoHub.Client.Services.ApiClient.html": { "href": "api/client/EchoHub.Client.Services.ApiClient.html", "title": "Class ApiClient | EchoHub Documentation", - "summary": "Class ApiClient Namespace EchoHub.Client.Services Assembly EchoHub.Client.dll public sealed class ApiClient : IDisposable Inheritance object ApiClient Implements IDisposable Inherited Members object.GetType() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors ApiClient(string) public ApiClient(string baseUrl) Parameters baseUrl string Properties BaseUrl public string BaseUrl { get; } Property Value string RefreshToken public string? RefreshToken { get; } Property Value string Token public string? Token { get; } Property Value string Methods AssignRoleAsync(string, ServerRole) public Task AssignRoleAsync(string username, ServerRole role) Parameters username string role ServerRole Returns Task BanUserAsync(string, string?) public Task BanUserAsync(string username, string? reason = null) Parameters username string reason string Returns Task CreateChannelAsync(string, string?, bool) public Task CreateChannelAsync(string name, string? topic = null, bool isPublic = true) Parameters name string topic string isPublic bool Returns Task DeleteChannelAsync(string) public Task DeleteChannelAsync(string channelName) Parameters channelName string Returns Task DeleteMessageAsync(Guid) public Task DeleteMessageAsync(Guid messageId) Parameters messageId Guid Returns Task Dispose() public void Dispose() DownloadFileToTempAsync(string, string) public Task DownloadFileToTempAsync(string relativeUrl, string fileName) Parameters relativeUrl string fileName string Returns Task GetChannelsAsync() public Task> GetChannelsAsync() Returns Task> GetEncryptionKeyAsync() public Task GetEncryptionKeyAsync() Returns Task GetServerInfoAsync() public Task GetServerInfoAsync() Returns Task GetUserProfileAsync(string) public Task GetUserProfileAsync(string username) Parameters username string Returns Task GetValidTokenAsync() Returns a valid access token, refreshing if expired. Used by EchoHubConnection for SignalR token provider. public Task GetValidTokenAsync() Returns Task KickUserAsync(string, string?) public Task KickUserAsync(string username, string? reason = null) Parameters username string reason string Returns Task LoginAsync(string, string) public Task LoginAsync(string username, string password) Parameters username string password string Returns Task LoginWithRefreshTokenAsync(string) public Task LoginWithRefreshTokenAsync(string refreshToken) Parameters refreshToken string Returns Task LogoutAsync() public Task LogoutAsync() Returns Task MuteUserAsync(string, int?, string?) public Task MuteUserAsync(string username, int? durationMinutes = null, string? reason = null) Parameters username string durationMinutes int? reason string Returns Task NukeChannelAsync(string) public Task NukeChannelAsync(string channelName) Parameters channelName string Returns Task RefreshTokenAsync() public Task RefreshTokenAsync() Returns Task RegisterAsync(string, string, string?) public Task RegisterAsync(string username, string password, string? displayName = null) Parameters username string password string displayName string Returns Task SendUrlAsync(string, string, string?) public Task SendUrlAsync(string channelName, string url, string? size = null) Parameters channelName string url string size string Returns Task UnbanUserAsync(string) public Task UnbanUserAsync(string username) Parameters username string Returns Task UnmuteUserAsync(string) public Task UnmuteUserAsync(string username) Parameters username string Returns Task UpdateChannelTopicAsync(string, string?) public Task UpdateChannelTopicAsync(string channelName, string? topic) Parameters channelName string topic string Returns Task UpdateProfileAsync(UpdateProfileRequest) public Task UpdateProfileAsync(UpdateProfileRequest request) Parameters request UpdateProfileRequest Returns Task UploadAvatarAsync(Stream, string) public Task UploadAvatarAsync(Stream imageStream, string fileName) Parameters imageStream Stream fileName string Returns Task UploadFileAsync(string, Stream, string, string?) public Task UploadFileAsync(string channelName, Stream fileStream, string fileName, string? size = null) Parameters channelName string fileStream Stream fileName string size string Returns Task Events OnTokensRefreshed public event Action? OnTokensRefreshed Event Type Action" + "summary": "Class ApiClient Namespace EchoHub.Client.Services Assembly EchoHub.Client.dll public sealed class ApiClient : IDisposable Inheritance object ApiClient Implements IDisposable Inherited Members object.GetType() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors ApiClient(string) public ApiClient(string baseUrl) Parameters baseUrl string Properties BaseUrl public string BaseUrl { get; } Property Value string RefreshToken public string? RefreshToken { get; } Property Value string Token public string? Token { get; } Property Value string Methods AssignRoleAsync(string, ServerRole) public Task AssignRoleAsync(string username, ServerRole role) Parameters username string role ServerRole Returns Task BanUserAsync(string, string?) public Task BanUserAsync(string username, string? reason = null) Parameters username string reason string Returns Task CreateChannelAsync(string, string?, bool, string?, string?, string?) public Task CreateChannelAsync(string name, string? topic = null, bool isPublic = true, string? password = null, string? encryptionSalt = null, string? wrappedRoomKey = null) Parameters name string topic string isPublic bool password string encryptionSalt string wrappedRoomKey string Returns Task DeleteChannelAsync(string) public Task DeleteChannelAsync(string channelName) Parameters channelName string Returns Task DeleteMessageAsync(Guid) public Task DeleteMessageAsync(Guid messageId) Parameters messageId Guid Returns Task Dispose() public void Dispose() DownloadFileToTempAsync(string, string) public Task DownloadFileToTempAsync(string relativeUrl, string fileName) Parameters relativeUrl string fileName string Returns Task GetChannelCryptoAsync(string) Fetches a channel's public crypto metadata (whether it's E2E-encrypted and its key-derivation salt). Returns null when the channel doesn't exist. public Task GetChannelCryptoAsync(string channelName) Parameters channelName string Returns Task GetChannelsAsync() public Task> GetChannelsAsync() Returns Task> GetEncryptionKeyAsync() public Task GetEncryptionKeyAsync() Returns Task GetServerInfoAsync() public Task GetServerInfoAsync() Returns Task GetUserProfileAsync(string) public Task GetUserProfileAsync(string username) Parameters username string Returns Task GetValidTokenAsync() Returns a valid access token, refreshing if expired. Used by EchoHubConnection for SignalR token provider. public Task GetValidTokenAsync() Returns Task KickUserAsync(string, string?) public Task KickUserAsync(string username, string? reason = null) Parameters username string reason string Returns Task LoginAsync(string, string) public Task LoginAsync(string username, string password) Parameters username string password string Returns Task LoginWithRefreshTokenAsync(string) public Task LoginWithRefreshTokenAsync(string refreshToken) Parameters refreshToken string Returns Task LogoutAsync() public Task LogoutAsync() Returns Task MuteUserAsync(string, int?, string?) public Task MuteUserAsync(string username, int? durationMinutes = null, string? reason = null) Parameters username string durationMinutes int? reason string Returns Task NukeChannelAsync(string) public Task NukeChannelAsync(string channelName) Parameters channelName string Returns Task RefreshTokenAsync() public Task RefreshTokenAsync() Returns Task RegisterAsync(string, string, string?) public Task RegisterAsync(string username, string password, string? displayName = null) Parameters username string password string displayName string Returns Task RekeyChannelAsync(string, RekeyChannelRequest) public Task RekeyChannelAsync(string channelName, RekeyChannelRequest request) Parameters channelName string request RekeyChannelRequest Returns Task SendMessageWithAttachmentsAsync(string, string, IReadOnlyList, string?) Sends one message with optional text and one or more file attachments. For end-to-end encrypted channels each attachment carries a declared kind and a room-encrypted preview (empty when none); the caption is likewise room-encrypted. public Task SendMessageWithAttachmentsAsync(string channelName, string content, IReadOnlyList attachments, string? size = null) Parameters channelName string content string attachments IReadOnlyList size string Returns Task SendUrlAsync(string, string, string?) public Task SendUrlAsync(string channelName, string url, string? size = null) Parameters channelName string url string size string Returns Task UnbanUserAsync(string) public Task UnbanUserAsync(string username) Parameters username string Returns Task UnmuteUserAsync(string) public Task UnmuteUserAsync(string username) Parameters username string Returns Task UpdateChannelTopicAsync(string, string?) public Task UpdateChannelTopicAsync(string channelName, string? topic) Parameters channelName string topic string Returns Task UpdateProfileAsync(UpdateProfileRequest) public Task UpdateProfileAsync(UpdateProfileRequest request) Parameters request UpdateProfileRequest Returns Task UploadAvatarAsync(Stream, string) public Task UploadAvatarAsync(Stream imageStream, string fileName) Parameters imageStream Stream fileName string Returns Task Events OnTokensRefreshed public event Action? OnTokensRefreshed Event Type Action" }, "api/client/EchoHub.Client.Services.AsyncRunner.html": { "href": "api/client/EchoHub.Client.Services.AsyncRunner.html", @@ -74,26 +74,66 @@ "title": "Class BackupInfo | EchoHub Documentation", "summary": "Class BackupInfo Namespace EchoHub.Client.Services Assembly EchoHub.Client.dll public record BackupInfo : IEquatable Inheritance object BackupInfo Implements IEquatable Inherited Members object.GetType() object.MemberwiseClone() object.Equals(object, object) object.ReferenceEquals(object, object) Constructors BackupInfo(BackupInfo) protected BackupInfo(BackupInfo original) Parameters original BackupInfo BackupInfo(string, string, DateTimeOffset) public BackupInfo(string Version, string AppDirectory, DateTimeOffset CreatedAt) Parameters Version string AppDirectory string CreatedAt DateTimeOffset Properties AppDirectory public string AppDirectory { get; init; } Property Value string CreatedAt public DateTimeOffset CreatedAt { get; init; } Property Value DateTimeOffset EqualityContract protected virtual Type EqualityContract { get; } Property Value Type Version public string Version { get; init; } Property Value string Methods Deconstruct(out string, out string, out DateTimeOffset) public void Deconstruct(out string Version, out string AppDirectory, out DateTimeOffset CreatedAt) Parameters Version string AppDirectory string CreatedAt DateTimeOffset Equals(BackupInfo?) public virtual bool Equals(BackupInfo? other) Parameters other BackupInfo Returns bool Equals(object?) public override bool Equals(object? obj) Parameters obj object Returns bool GetHashCode() public override int GetHashCode() Returns int PrintMembers(StringBuilder) protected virtual bool PrintMembers(StringBuilder builder) Parameters builder StringBuilder Returns bool ToString() public override string ToString() Returns string Operators operator ==(BackupInfo?, BackupInfo?) public static bool operator ==(BackupInfo? left, BackupInfo? right) Parameters left BackupInfo right BackupInfo Returns bool operator !=(BackupInfo?, BackupInfo?) public static bool operator !=(BackupInfo? left, BackupInfo? right) Parameters left BackupInfo right BackupInfo Returns bool" }, + "api/client/EchoHub.Client.Services.ChannelPasswordRequiredException.html": { + "href": "api/client/EchoHub.Client.Services.ChannelPasswordRequiredException.html", + "title": "Class ChannelPasswordRequiredException | EchoHub Documentation", + "summary": "Class ChannelPasswordRequiredException Namespace EchoHub.Client.Services Assembly EchoHub.Client.dll Thrown when joining a channel fails because a password is required or incorrect. The UI catches this to prompt the user and retry. public sealed class ChannelPasswordRequiredException : Exception Inheritance object Exception ChannelPasswordRequiredException Inherited Members Exception.GetBaseException() Exception.ToString() Exception.GetType() Exception.TargetSite Exception.Message Exception.Data Exception.InnerException Exception.HelpLink Exception.Source Exception.HResult Exception.StackTrace object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors ChannelPasswordRequiredException(string, string) public ChannelPasswordRequiredException(string channelName, string message) Parameters channelName string message string Properties ChannelName public string ChannelName { get; } Property Value string" + }, "api/client/EchoHub.Client.Services.ClientEncryptionService.html": { "href": "api/client/EchoHub.Client.Services.ClientEncryptionService.html", "title": "Class ClientEncryptionService | EchoHub Documentation", "summary": "Class ClientEncryptionService Namespace EchoHub.Client.Services Assembly EchoHub.Client.dll Client-side encryption service. Uses the same AES-256-GCM format as the server so messages are encrypted end-to-end between client and server. public sealed class ClientEncryptionService : IMessageEncryptionService Inheritance object ClientEncryptionService Implements IMessageEncryptionService Inherited Members object.GetType() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors ClientEncryptionService() public ClientEncryptionService() Properties EncryptDatabaseEnabled Whether database content should be encrypted at rest (server setting). public bool EncryptDatabaseEnabled { get; } Property Value bool IsInitialized public bool IsInitialized { get; } Property Value bool Methods Decrypt(string) public string Decrypt(string content) Parameters content string Returns string DecryptNullable(string?) public string? DecryptNullable(string? value) Parameters value string Returns string Encrypt(string) public string Encrypt(string plaintext) Parameters plaintext string Returns string EncryptNullable(string?) public string? EncryptNullable(string? value) Parameters value string Returns string SetKey(string) Initialize with the server's encryption key (fetched after login). public void SetKey(string base64Key) Parameters base64Key string" }, + "api/client/EchoHub.Client.Services.ClipboardFiles.html": { + "href": "api/client/EchoHub.Client.Services.ClipboardFiles.html", + "title": "Class ClipboardFiles | EchoHub Documentation", + "summary": "Class ClipboardFiles Namespace EchoHub.Client.Services Assembly EchoHub.Client.dll Reads file paths that live on the OS clipboard as a file list (e.g. after copying a file in Explorer/Finder/Nautilus), which terminals do not paste as text. Lets Ctrl+V attach a copied file directly instead of requiring the user to paste a raw path. public static class ClipboardFiles Inheritance object ClipboardFiles Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Methods TryGetFiles(out List) public static bool TryGetFiles(out List files) Parameters files List Returns bool" + }, "api/client/EchoHub.Client.Services.EchoHubConnection.html": { "href": "api/client/EchoHub.Client.Services.EchoHubConnection.html", "title": "Class EchoHubConnection | EchoHub Documentation", - "summary": "Class EchoHubConnection Namespace EchoHub.Client.Services Assembly EchoHub.Client.dll public sealed class EchoHubConnection : IAsyncDisposable Inheritance object EchoHubConnection Implements IAsyncDisposable Inherited Members object.GetType() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors EchoHubConnection(string, ApiClient, ClientEncryptionService) public EchoHubConnection(string serverUrl, ApiClient apiClient, ClientEncryptionService encryption) Parameters serverUrl string apiClient ApiClient encryption ClientEncryptionService Properties IsConnected public bool IsConnected { get; } Property Value bool Methods ConnectAsync() public Task ConnectAsync() Returns Task DisconnectAsync() public Task DisconnectAsync() Returns Task DisposeAsync() public ValueTask DisposeAsync() Returns ValueTask GetHistoryAsync(string, int, int) public Task> GetHistoryAsync(string channelName, int count = 100, int offset = 0) Parameters channelName string count int offset int Returns Task> GetOnlineUsersAsync(string) public Task> GetOnlineUsersAsync(string channelName) Parameters channelName string Returns Task> JoinChannelAsync(string) public Task> JoinChannelAsync(string channelName) Parameters channelName string Returns Task> LeaveChannelAsync(string) public Task LeaveChannelAsync(string channelName) Parameters channelName string Returns Task SendMessageAsync(string, string) public Task SendMessageAsync(string channelName, string content) Parameters channelName string content string Returns Task UpdateStatusAsync(UserStatus, string?) public Task UpdateStatusAsync(UserStatus status, string? statusMessage = null) Parameters status UserStatus statusMessage string Returns Task Events OnChannelNuked public event Action? OnChannelNuked Event Type Action OnChannelUpdated public event Action? OnChannelUpdated Event Type Action OnConnectionStateChanged public event Action? OnConnectionStateChanged Event Type Action OnError public event Action? OnError Event Type Action OnForceDisconnect public event Action? OnForceDisconnect Event Type Action OnMessageDeleted public event Action? OnMessageDeleted Event Type Action OnMessageReceived public event Action? OnMessageReceived Event Type Action OnReconnected public event Action? OnReconnected Event Type Action OnUserBanned public event Action? OnUserBanned Event Type Action OnUserJoined public event Action? OnUserJoined Event Type Action OnUserKicked public event Action? OnUserKicked Event Type Action OnUserLeft public event Action? OnUserLeft Event Type Action OnUserStatusChanged public event Action? OnUserStatusChanged Event Type Action" + "summary": "Class EchoHubConnection Namespace EchoHub.Client.Services Assembly EchoHub.Client.dll public sealed class EchoHubConnection : IAsyncDisposable Inheritance object EchoHubConnection Implements IAsyncDisposable Inherited Members object.GetType() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors EchoHubConnection(string, ApiClient, ClientEncryptionService, RoomKeyStore) public EchoHubConnection(string serverUrl, ApiClient apiClient, ClientEncryptionService encryption, RoomKeyStore roomKeys) Parameters serverUrl string apiClient ApiClient encryption ClientEncryptionService roomKeys RoomKeyStore Fields LockedMessagePlaceholder public const string LockedMessagePlaceholder = \"[encrypted — rejoin this channel with its passphrase to unlock]\" Field Value string Properties IsConnected public bool IsConnected { get; } Property Value bool Methods ConnectAsync() public Task ConnectAsync() Returns Task DisconnectAsync() public Task DisconnectAsync() Returns Task DisposeAsync() public ValueTask DisposeAsync() Returns ValueTask GetHistoryAsync(string, int, int) public Task> GetHistoryAsync(string channelName, int count = 100, int offset = 0) Parameters channelName string count int offset int Returns Task> GetOnlineUsersAsync(string) public Task> GetOnlineUsersAsync(string channelName) Parameters channelName string Returns Task> JoinChannelAsync(string, string?) public Task JoinChannelAsync(string channelName, string? password = null) Parameters channelName string password string Returns Task LeaveChannelAsync(string) public Task LeaveChannelAsync(string channelName) Parameters channelName string Returns Task SendMessageAsync(string, string) public Task SendMessageAsync(string channelName, string content) Parameters channelName string content string Returns Task UpdateStatusAsync(UserStatus, string?) public Task UpdateStatusAsync(UserStatus status, string? statusMessage = null) Parameters status UserStatus statusMessage string Returns Task Events OnChannelNuked public event Action? OnChannelNuked Event Type Action OnChannelUpdated public event Action? OnChannelUpdated Event Type Action OnConnectionStateChanged public event Action? OnConnectionStateChanged Event Type Action OnError public event Action? OnError Event Type Action OnForceDisconnect public event Action? OnForceDisconnect Event Type Action OnMessageDeleted public event Action? OnMessageDeleted Event Type Action OnMessageReceived public event Action? OnMessageReceived Event Type Action OnReconnected public event Action? OnReconnected Event Type Action OnUserBanned public event Action? OnUserBanned Event Type Action OnUserJoined public event Action? OnUserJoined Event Type Action OnUserKicked public event Action? OnUserKicked Event Type Action OnUserLeft public event Action? OnUserLeft Event Type Action OnUserStatusChanged public event Action? OnUserStatusChanged Event Type Action" + }, + "api/client/EchoHub.Client.Services.FolderPickResult.html": { + "href": "api/client/EchoHub.Client.Services.FolderPickResult.html", + "title": "Class FolderPickResult | EchoHub Documentation", + "summary": "Class FolderPickResult Namespace EchoHub.Client.Services Assembly EchoHub.Client.dll public sealed record FolderPickResult : IEquatable Inheritance object FolderPickResult Implements IEquatable Inherited Members object.GetType() object.Equals(object, object) object.ReferenceEquals(object, object) Constructors FolderPickResult(PickerOutcome, string?) public FolderPickResult(PickerOutcome Outcome, string? Path) Parameters Outcome PickerOutcome Path string Properties Outcome public PickerOutcome Outcome { get; init; } Property Value PickerOutcome Path public string? Path { get; init; } Property Value string Methods Deconstruct(out PickerOutcome, out string?) public void Deconstruct(out PickerOutcome Outcome, out string? Path) Parameters Outcome PickerOutcome Path string Equals(FolderPickResult?) public bool Equals(FolderPickResult? other) Parameters other FolderPickResult 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 ==(FolderPickResult?, FolderPickResult?) public static bool operator ==(FolderPickResult? left, FolderPickResult? right) Parameters left FolderPickResult right FolderPickResult Returns bool operator !=(FolderPickResult?, FolderPickResult?) public static bool operator !=(FolderPickResult? left, FolderPickResult? right) Parameters left FolderPickResult right FolderPickResult Returns bool" + }, + "api/client/EchoHub.Client.Services.JoinOutcome.html": { + "href": "api/client/EchoHub.Client.Services.JoinOutcome.html", + "title": "Class JoinOutcome | EchoHub Documentation", + "summary": "Class JoinOutcome Namespace EchoHub.Client.Services Assembly EchoHub.Client.dll Result of joining a channel: decrypted history plus, for end-to-end encrypted channels, the key envelope needed to unlock the room content key. public sealed record JoinOutcome : IEquatable Inheritance object JoinOutcome Implements IEquatable Inherited Members object.GetType() object.Equals(object, object) object.ReferenceEquals(object, object) Constructors JoinOutcome(List, string?, string?) Result of joining a channel: decrypted history plus, for end-to-end encrypted channels, the key envelope needed to unlock the room content key. public JoinOutcome(List History, string? EncryptionSalt, string? WrappedRoomKey) Parameters History List EncryptionSalt string WrappedRoomKey string Properties EncryptionSalt public string? EncryptionSalt { get; init; } Property Value string History public List History { get; init; } Property Value List WrappedRoomKey public string? WrappedRoomKey { get; init; } Property Value string Methods Deconstruct(out List, out string?, out string?) public void Deconstruct(out List History, out string? EncryptionSalt, out string? WrappedRoomKey) Parameters History List EncryptionSalt string WrappedRoomKey string Equals(JoinOutcome?) public bool Equals(JoinOutcome? other) Parameters other JoinOutcome 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 ==(JoinOutcome?, JoinOutcome?) public static bool operator ==(JoinOutcome? left, JoinOutcome? right) Parameters left JoinOutcome right JoinOutcome Returns bool operator !=(JoinOutcome?, JoinOutcome?) public static bool operator !=(JoinOutcome? left, JoinOutcome? right) Parameters left JoinOutcome right JoinOutcome Returns bool" + }, + "api/client/EchoHub.Client.Services.NativeFolderPicker.html": { + "href": "api/client/EchoHub.Client.Services.NativeFolderPicker.html", + "title": "Class NativeFolderPicker | EchoHub Documentation", + "summary": "Class NativeFolderPicker Namespace EchoHub.Client.Services Assembly EchoHub.Client.dll Opens the OS-native folder chooser (Windows Explorer, macOS Finder, Linux GTK/KDE) by shelling out, so the TUI doesn't need a GUI toolkit reference. Returns Unavailable when no native dialog can run, so callers can fall back to a configured path. public static class NativeFolderPicker Inheritance object NativeFolderPicker Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Methods PickFolderAsync(string?) public static Task PickFolderAsync(string? initialDir) Parameters initialDir string Returns Task" }, "api/client/EchoHub.Client.Services.NotificationSoundService.html": { "href": "api/client/EchoHub.Client.Services.NotificationSoundService.html", "title": "Class NotificationSoundService | EchoHub Documentation", "summary": "Class NotificationSoundService Namespace EchoHub.Client.Services Assembly EchoHub.Client.dll public class NotificationSoundService Inheritance object NotificationSoundService Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors NotificationSoundService(NotificationConfig) public NotificationSoundService(NotificationConfig config) Parameters config NotificationConfig Methods PlayAsync() public Task PlayAsync() Returns Task PlayTestAsync() Plays the notification sound regardless of the Enabled setting (for /test-sound). public Task PlayTestAsync() Returns Task SetEnabled(bool) public void SetEnabled(bool enabled) Parameters enabled bool SetVolume(byte) public void SetVolume(byte volume) Parameters volume byte" }, + "api/client/EchoHub.Client.Services.OutgoingAttachment.html": { + "href": "api/client/EchoHub.Client.Services.OutgoingAttachment.html", + "title": "Class OutgoingAttachment | EchoHub Documentation", + "summary": "Class OutgoingAttachment Namespace EchoHub.Client.Services Assembly EchoHub.Client.dll One file to upload as part of a message. For end-to-end encrypted channels the stream is already ciphertext, DeclaredKind is set (image/audio/file), and EncryptedPreview holds the room-encrypted ASCII art for images. For normal channels only Stream and FileName are set. public sealed record OutgoingAttachment : IEquatable Inheritance object OutgoingAttachment Implements IEquatable Inherited Members object.GetType() object.Equals(object, object) object.ReferenceEquals(object, object) Constructors OutgoingAttachment(Stream, string, string?, string?) One file to upload as part of a message. For end-to-end encrypted channels the stream is already ciphertext, DeclaredKind is set (image/audio/file), and EncryptedPreview holds the room-encrypted ASCII art for images. For normal channels only Stream and FileName are set. public OutgoingAttachment(Stream Stream, string FileName, string? DeclaredKind = null, string? EncryptedPreview = null) Parameters Stream Stream FileName string DeclaredKind string EncryptedPreview string Properties DeclaredKind public string? DeclaredKind { get; init; } Property Value string EncryptedPreview public string? EncryptedPreview { get; init; } Property Value string FileName public string FileName { get; init; } Property Value string Stream public Stream Stream { get; init; } Property Value Stream Methods Deconstruct(out Stream, out string, out string?, out string?) public void Deconstruct(out Stream Stream, out string FileName, out string? DeclaredKind, out string? EncryptedPreview) Parameters Stream Stream FileName string DeclaredKind string EncryptedPreview string Equals(OutgoingAttachment?) public bool Equals(OutgoingAttachment? other) Parameters other OutgoingAttachment 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 ==(OutgoingAttachment?, OutgoingAttachment?) public static bool operator ==(OutgoingAttachment? left, OutgoingAttachment? right) Parameters left OutgoingAttachment right OutgoingAttachment Returns bool operator !=(OutgoingAttachment?, OutgoingAttachment?) public static bool operator !=(OutgoingAttachment? left, OutgoingAttachment? right) Parameters left OutgoingAttachment right OutgoingAttachment Returns bool" + }, "api/client/EchoHub.Client.Services.PathSetup.html": { "href": "api/client/EchoHub.Client.Services.PathSetup.html", "title": "Class PathSetup | EchoHub Documentation", "summary": "Class PathSetup Namespace EchoHub.Client.Services Assembly EchoHub.Client.dll Ensures the application's directory is on the system PATH so users can run 'echohub' from any terminal session. public static class PathSetup Inheritance object PathSetup Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Methods EnsureOnPath() Checks if the app directory is on PATH; if not, adds it persistently. On Windows: modifies user-level PATH environment variable. On Linux/macOS: appends an export line to shell profile files. public static void EnsureOnPath()" }, + "api/client/EchoHub.Client.Services.PickerOutcome.html": { + "href": "api/client/EchoHub.Client.Services.PickerOutcome.html", + "title": "Enum PickerOutcome | EchoHub Documentation", + "summary": "Enum PickerOutcome Namespace EchoHub.Client.Services Assembly EchoHub.Client.dll public enum PickerOutcome Fields Cancelled = 1 The native dialog ran but the user cancelled it. Chosen = 0 The user picked a folder (Path is set). Unavailable = 2 No native picker is available on this machine (headless, missing tool, etc.)." + }, + "api/client/EchoHub.Client.Services.RoomKeyStore.html": { + "href": "api/client/EchoHub.Client.Services.RoomKeyStore.html", + "title": "Class RoomKeyStore | EchoHub Documentation", + "summary": "Class RoomKeyStore Namespace EchoHub.Client.Services Assembly EchoHub.Client.dll Holds room content keys for end-to-end encrypted channels: in-memory for the active session, persisted per-server in the client config (like saved sessions) so users don't retype the passphrase every launch. Keys never leave this machine. public sealed class RoomKeyStore Inheritance object RoomKeyStore Inherited Members object.GetType() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors RoomKeyStore() public RoomKeyStore() Methods Clear() public void Clear() HasKey(string) public bool HasKey(string channelName) Parameters channelName string Returns bool LoadForServer(string) Binds the store to a server and loads that server's cached keys from config. public void LoadForServer(string serverUrl) Parameters serverUrl string RemoveKey(string) public void RemoveKey(string channelName) Parameters channelName string StoreKey(string, byte[]) Stores a key for the session and persists it to the server's config entry. public void StoreKey(string channelName, byte[] key) Parameters channelName string key byte[] TryGetKey(string, out byte[]) public bool TryGetKey(string channelName, out byte[] key) Parameters channelName string key byte[] Returns bool" + }, "api/client/EchoHub.Client.Services.UpdateBackupService.html": { "href": "api/client/EchoHub.Client.Services.UpdateBackupService.html", "title": "Class UpdateBackupService | EchoHub Documentation", @@ -107,7 +147,7 @@ "api/client/EchoHub.Client.Services.html": { "href": "api/client/EchoHub.Client.Services.html", "title": "Namespace EchoHub.Client.Services | EchoHub Documentation", - "summary": "Namespace EchoHub.Client.Services Classes ApiClient AsyncRunner Eliminates repeated Task.Run/try/catch/app.Invoke(ShowError) boilerplate. Runs async work on a background thread and routes exceptions to the UI. AudioPlaybackService BackupInfo ClientEncryptionService Client-side encryption service. Uses the same AES-256-GCM format as the server so messages are encrypted end-to-end between client and server. EchoHubConnection NotificationSoundService PathSetup Ensures the application's directory is on the system PATH so users can run 'echohub' from any terminal session. UpdateBackupService Manages pre-update backups and rollback restoration for the auto-updater. Backup location: ~/.echohub/update-backup/ UpdateChecker" + "summary": "Namespace EchoHub.Client.Services Classes ApiClient AsyncRunner Eliminates repeated Task.Run/try/catch/app.Invoke(ShowError) boilerplate. Runs async work on a background thread and routes exceptions to the UI. AudioPlaybackService BackupInfo ChannelPasswordRequiredException Thrown when joining a channel fails because a password is required or incorrect. The UI catches this to prompt the user and retry. ClientEncryptionService Client-side encryption service. Uses the same AES-256-GCM format as the server so messages are encrypted end-to-end between client and server. ClipboardFiles Reads file paths that live on the OS clipboard as a file list (e.g. after copying a file in Explorer/Finder/Nautilus), which terminals do not paste as text. Lets Ctrl+V attach a copied file directly instead of requiring the user to paste a raw path. EchoHubConnection FolderPickResult JoinOutcome Result of joining a channel: decrypted history plus, for end-to-end encrypted channels, the key envelope needed to unlock the room content key. NativeFolderPicker Opens the OS-native folder chooser (Windows Explorer, macOS Finder, Linux GTK/KDE) by shelling out, so the TUI doesn't need a GUI toolkit reference. Returns Unavailable when no native dialog can run, so callers can fall back to a configured path. NotificationSoundService OutgoingAttachment One file to upload as part of a message. For end-to-end encrypted channels the stream is already ciphertext, DeclaredKind is set (image/audio/file), and EncryptedPreview holds the room-encrypted ASCII art for images. For normal channels only Stream and FileName are set. PathSetup Ensures the application's directory is on the system PATH so users can run 'echohub' from any terminal session. RoomKeyStore Holds room content keys for end-to-end encrypted channels: in-memory for the active session, persisted per-server in the client config (like saved sessions) so users don't retype the passphrase every launch. Keys never leave this machine. UpdateBackupService Manages pre-update backups and rollback restoration for the auto-updater. Backup location: ~/.echohub/update-backup/ UpdateChecker Enums PickerOutcome" }, "api/client/EchoHub.Client.Themes.Theme.html": { "href": "api/client/EchoHub.Client.Themes.Theme.html", @@ -137,7 +177,7 @@ "api/client/EchoHub.Client.UI.Chat.ChatLine.html": { "href": "api/client/EchoHub.Client.UI.Chat.ChatLine.html", "title": "Class ChatLine | EchoHub Documentation", - "summary": "Class ChatLine Namespace EchoHub.Client.UI.Chat Assembly EchoHub.Client.dll A single line in the chat, composed of colored segments. public class ChatLine Inheritance object ChatLine Inherited Members object.GetType() object.MemberwiseClone() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors ChatLine(List) public ChatLine(List segments) Parameters segments List ChatLine(string) public ChatLine(string plainText) Parameters plainText string Properties AttachmentFileName public string? AttachmentFileName { get; set; } Property Value string AttachmentUrl public string? AttachmentUrl { get; set; } Property Value string ContinuationIndent Number of spaces to prepend on continuation lines when this line is word-wrapped. public int ContinuationIndent { get; set; } Property Value int IsMention public bool IsMention { get; set; } Property Value bool MessageId public Guid? MessageId { get; set; } Property Value Guid? Segments public List Segments { get; } Property Value List SenderUsername public string? SenderUsername { get; set; } Property Value string TextLength public int TextLength { get; } Property Value int Type public MessageType? Type { get; set; } Property Value MessageType? Methods FromColoredText(string, Attribute?) Parse a string containing printable color tags into colored segments. Format: {F:RRGGBB} (foreground), {B:RRGGBB} (background), {X} (reset). public static ChatLine FromColoredText(string text, Attribute? defaultAttr = null) Parameters text string defaultAttr Attribute? Returns ChatLine HasColorTags(string) Returns true if a line contains printable color tags. public static bool HasColorTags(string text) Parameters text string Returns bool StripColorTags(string) Remove all color tags from text, returning only the visible characters. public static string StripColorTags(string text) Parameters text string Returns string ToString() public override string ToString() Returns string Wrap(int, int) Wrap this line into multiple lines that fit within the given width. Continuation lines are indented with the specified number of spaces. public List Wrap(int width, int continuationIndent = 0) Parameters width int continuationIndent int Returns List" + "summary": "Class ChatLine Namespace EchoHub.Client.UI.Chat Assembly EchoHub.Client.dll A single line in the chat, composed of colored segments. public class ChatLine Inheritance object ChatLine Inherited Members object.GetType() object.MemberwiseClone() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors ChatLine(List) public ChatLine(List segments) Parameters segments List ChatLine(string) public ChatLine(string plainText) Parameters plainText string Properties AttachmentFileName public string? AttachmentFileName { get; set; } Property Value string AttachmentKind public AttachmentKind? AttachmentKind { get; set; } Property Value AttachmentKind? AttachmentUrl public string? AttachmentUrl { get; set; } Property Value string ContinuationIndent Number of spaces to prepend on continuation lines when this line is word-wrapped. public int ContinuationIndent { get; set; } Property Value int IsMention public bool IsMention { get; set; } Property Value bool MessageId public Guid? MessageId { get; set; } Property Value Guid? Segments public List Segments { get; } Property Value List SenderUsername public string? SenderUsername { get; set; } Property Value string TextLength public int TextLength { get; } Property Value int Methods FromColoredText(string, Attribute?) Parse a string containing printable color tags into colored segments. Format: {F:RRGGBB} (foreground), {B:RRGGBB} (background), {X} (reset). public static ChatLine FromColoredText(string text, Attribute? defaultAttr = null) Parameters text string defaultAttr Attribute? Returns ChatLine HasColorTags(string) Returns true if a line contains printable color tags. public static bool HasColorTags(string text) Parameters text string Returns bool StripColorTags(string) Remove all color tags from text, returning only the visible characters. public static string StripColorTags(string text) Parameters text string Returns string ToString() public override string ToString() Returns string Wrap(int, int) Wrap this line into multiple lines that fit within the given width. Continuation lines are indented with the specified number of spaces. public List Wrap(int width, int continuationIndent = 0) Parameters width int continuationIndent int Returns List" }, "api/client/EchoHub.Client.UI.Chat.ChatListSource.html": { "href": "api/client/EchoHub.Client.UI.Chat.ChatListSource.html", @@ -164,6 +204,11 @@ "title": "Class AudioPlayerDialog | EchoHub Documentation", "summary": "Class AudioPlayerDialog Namespace EchoHub.Client.UI.Dialogs Assembly EchoHub.Client.dll public sealed class AudioPlayerDialog Inheritance object AudioPlayerDialog Inherited Members object.GetType() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors AudioPlayerDialog() public AudioPlayerDialog() Methods Show(IApplication, AudioPlaybackService, string, string) public static void Show(IApplication app, AudioPlaybackService audioService, string filePath, string fileName) Parameters app IApplication audioService AudioPlaybackService filePath string fileName string" }, + "api/client/EchoHub.Client.UI.Dialogs.ChannelPasswordDialog.html": { + "href": "api/client/EchoHub.Client.UI.Dialogs.ChannelPasswordDialog.html", + "title": "Class ChannelPasswordDialog | EchoHub Documentation", + "summary": "Class ChannelPasswordDialog Namespace EchoHub.Client.UI.Dialogs Assembly EchoHub.Client.dll Prompts for a channel password when joining a protected channel. Returns the entered password, or null if the user cancels. public sealed class ChannelPasswordDialog Inheritance object ChannelPasswordDialog Inherited Members object.GetType() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors ChannelPasswordDialog() public ChannelPasswordDialog() Methods Show(IApplication, string, string?) public static string? Show(IApplication app, string channelName, string? message = null) Parameters app IApplication channelName string message string Returns string" + }, "api/client/EchoHub.Client.UI.Dialogs.ConnectDialog.html": { "href": "api/client/EchoHub.Client.UI.Dialogs.ConnectDialog.html", "title": "Class ConnectDialog | EchoHub Documentation", @@ -182,7 +227,7 @@ "api/client/EchoHub.Client.UI.Dialogs.CreateChannelResult.html": { "href": "api/client/EchoHub.Client.UI.Dialogs.CreateChannelResult.html", "title": "Class CreateChannelResult | EchoHub Documentation", - "summary": "Class CreateChannelResult Namespace EchoHub.Client.UI.Dialogs Assembly EchoHub.Client.dll public record CreateChannelResult : IEquatable Inheritance object CreateChannelResult Implements IEquatable Inherited Members object.GetType() object.MemberwiseClone() object.Equals(object, object) object.ReferenceEquals(object, object) Constructors CreateChannelResult(CreateChannelResult) protected CreateChannelResult(CreateChannelResult original) Parameters original CreateChannelResult CreateChannelResult(string, string?, bool) public CreateChannelResult(string Name, string? Topic, bool IsPublic) Parameters Name string Topic string IsPublic bool Properties EqualityContract protected virtual Type EqualityContract { get; } Property Value Type IsPublic public bool IsPublic { get; init; } Property Value bool Name public string Name { get; init; } Property Value string Topic public string? Topic { get; init; } Property Value string Methods Deconstruct(out string, out string?, out bool) public void Deconstruct(out string Name, out string? Topic, out bool IsPublic) Parameters Name string Topic string IsPublic bool Equals(CreateChannelResult?) public virtual bool Equals(CreateChannelResult? other) Parameters other CreateChannelResult Returns bool Equals(object?) public override bool Equals(object? obj) Parameters obj object Returns bool GetHashCode() public override int GetHashCode() Returns int PrintMembers(StringBuilder) protected virtual bool PrintMembers(StringBuilder builder) Parameters builder StringBuilder Returns bool ToString() public override string ToString() Returns string Operators operator ==(CreateChannelResult?, CreateChannelResult?) public static bool operator ==(CreateChannelResult? left, CreateChannelResult? right) Parameters left CreateChannelResult right CreateChannelResult Returns bool operator !=(CreateChannelResult?, CreateChannelResult?) public static bool operator !=(CreateChannelResult? left, CreateChannelResult? right) Parameters left CreateChannelResult right CreateChannelResult Returns bool" + "summary": "Class CreateChannelResult Namespace EchoHub.Client.UI.Dialogs Assembly EchoHub.Client.dll public record CreateChannelResult : IEquatable Inheritance object CreateChannelResult Implements IEquatable Inherited Members object.GetType() object.MemberwiseClone() object.Equals(object, object) object.ReferenceEquals(object, object) Constructors CreateChannelResult(CreateChannelResult) protected CreateChannelResult(CreateChannelResult original) Parameters original CreateChannelResult CreateChannelResult(string, string?, bool, string?) public CreateChannelResult(string Name, string? Topic, bool IsPublic, string? Password) Parameters Name string Topic string IsPublic bool Password string Properties EqualityContract protected virtual Type EqualityContract { get; } Property Value Type IsPublic public bool IsPublic { get; init; } Property Value bool Name public string Name { get; init; } Property Value string Password public string? Password { get; init; } Property Value string Topic public string? Topic { get; init; } Property Value string Methods Deconstruct(out string, out string?, out bool, out string?) public void Deconstruct(out string Name, out string? Topic, out bool IsPublic, out string? Password) Parameters Name string Topic string IsPublic bool Password string Equals(CreateChannelResult?) public virtual bool Equals(CreateChannelResult? other) Parameters other CreateChannelResult Returns bool Equals(object?) public override bool Equals(object? obj) Parameters obj object Returns bool GetHashCode() public override int GetHashCode() Returns int PrintMembers(StringBuilder) protected virtual bool PrintMembers(StringBuilder builder) Parameters builder StringBuilder Returns bool ToString() public override string ToString() Returns string Operators operator ==(CreateChannelResult?, CreateChannelResult?) public static bool operator ==(CreateChannelResult? left, CreateChannelResult? right) Parameters left CreateChannelResult right CreateChannelResult Returns bool operator !=(CreateChannelResult?, CreateChannelResult?) public static bool operator !=(CreateChannelResult? left, CreateChannelResult? right) Parameters left CreateChannelResult right CreateChannelResult Returns bool" }, "api/client/EchoHub.Client.UI.Dialogs.ProfileAction.html": { "href": "api/client/EchoHub.Client.UI.Dialogs.ProfileAction.html", @@ -242,7 +287,12 @@ "api/client/EchoHub.Client.UI.Dialogs.html": { "href": "api/client/EchoHub.Client.UI.Dialogs.html", "title": "Namespace EchoHub.Client.UI.Dialogs | EchoHub Documentation", - "summary": "Namespace EchoHub.Client.UI.Dialogs Classes AudioPlayerDialog ConnectDialog A Terminal.Gui dialog for entering server connection and authentication details. Includes a saved servers selector when saved servers are available. ConnectDialogResult Result returned from the connect dialog. CreateChannelDialog CreateChannelResult ProfileEditDialog A Terminal.Gui dialog for editing the user's profile (display name, bio, nickname color). ProfileEditResult Result returned from the profile edit dialog. ProfileViewDialog Dialog for viewing a user's server profile. Shows Edit Profile / Set Status buttons when viewing own profile. SearchDialog Command-palette style search dialog (Ctrl+K) for navigating channels and triggering app actions. SearchResult StatusDialog A Terminal.Gui dialog for setting the user's status and status message. StatusDialogResult Result returned from the status dialog. UpdateConfirmDialog UpdateProgressDialog Enums ProfileAction Action selected by the user in their own profile dialog. SearchResultType" + "summary": "Namespace EchoHub.Client.UI.Dialogs Classes AudioPlayerDialog ChannelPasswordDialog Prompts for a channel password when joining a protected channel. Returns the entered password, or null if the user cancels. ConnectDialog A Terminal.Gui dialog for entering server connection and authentication details. Includes a saved servers selector when saved servers are available. ConnectDialogResult Result returned from the connect dialog. CreateChannelDialog CreateChannelResult ProfileEditDialog A Terminal.Gui dialog for editing the user's profile (display name, bio, nickname color). ProfileEditResult Result returned from the profile edit dialog. ProfileViewDialog Dialog for viewing a user's server profile. Shows Edit Profile / Set Status buttons when viewing own profile. SearchDialog Command-palette style search dialog (Ctrl+K) for navigating channels and triggering app actions. SearchResult StatusDialog A Terminal.Gui dialog for setting the user's status and status message. StatusDialogResult Result returned from the status dialog. UpdateConfirmDialog UpdateProgressDialog Enums ProfileAction Action selected by the user in their own profile dialog. SearchResultType" + }, + "api/client/EchoHub.Client.UI.Helpers.DroppedFileParser.html": { + "href": "api/client/EchoHub.Client.UI.Helpers.DroppedFileParser.html", + "title": "Class DroppedFileParser | EchoHub Documentation", + "summary": "Class DroppedFileParser Namespace EchoHub.Client.UI.Helpers Assembly EchoHub.Client.dll Recognizes a dragged-and-dropped file (or files) that a terminal delivers into the input as an absolute path. Terminals differ: some paste the whole path at once, others send it character by character; either way this checks whether the current input text resolves to existing file(s). public static class DroppedFileParser Inheritance object DroppedFileParser Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Methods LooksLikePath(string) Cheap pre-check so callers only stat the filesystem when the input plausibly holds a path: a quoted path, a Windows drive path (X:/X:/), a UNC path (\\), or a POSIX absolute path (/). Normal chat text never starts this way. public static bool LooksLikePath(string text) Parameters text string Returns bool TryGetFiles(string, out List, Func?) Returns true when text resolves to one or more existing files. Handles a single path (quoted or not, possibly containing spaces) and multiple space-separated (optionally quoted) paths. fileExists is injectable for testing; production passes Exists(string). public static bool TryGetFiles(string text, out List files, Func? fileExists = null) Parameters text string files List fileExists Func Returns bool" }, "api/client/EchoHub.Client.UI.Helpers.EmojiHelper.html": { "href": "api/client/EchoHub.Client.UI.Helpers.EmojiHelper.html", @@ -257,12 +307,12 @@ "api/client/EchoHub.Client.UI.Helpers.html": { "href": "api/client/EchoHub.Client.UI.Helpers.html", "title": "Namespace EchoHub.Client.UI.Helpers | EchoHub Documentation", - "summary": "Namespace EchoHub.Client.UI.Helpers Classes EmojiHelper Converts emoji grapheme clusters to text shortcodes for safe TUI rendering. Terminal width calculations for emoji are unreliable across different terminals, so we replace them with fixed-width ASCII shortcodes for display only. HexColorHelper Helper to parse hex colors to Terminal.Gui Attributes." + "summary": "Namespace EchoHub.Client.UI.Helpers Classes DroppedFileParser Recognizes a dragged-and-dropped file (or files) that a terminal delivers into the input as an absolute path. Terminals differ: some paste the whole path at once, others send it character by character; either way this checks whether the current input text resolves to existing file(s). EmojiHelper Converts emoji grapheme clusters to text shortcodes for safe TUI rendering. Terminal width calculations for emoji are unreliable across different terminals, so we replace them with fixed-width ASCII shortcodes for display only. HexColorHelper Helper to parse hex colors to Terminal.Gui Attributes." }, "api/client/EchoHub.Client.UI.ListSources.ChannelListSource.html": { "href": "api/client/EchoHub.Client.UI.ListSources.ChannelListSource.html", "title": "Class ChannelListSource | EchoHub Documentation", - "summary": "Class ChannelListSource Namespace EchoHub.Client.UI.ListSources Assembly EchoHub.Client.dll Custom list data source for colored channel list rendering. Active channel gets a > indicator, unread channels are bright with a count badge. public class ChannelListSource : IListDataSource, IDisposable Inheritance object ChannelListSource Implements IListDataSource IDisposable Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors ChannelListSource() public ChannelListSource() Properties Count public int Count { get; } Property Value int MaxItemLength public int MaxItemLength { get; } Property Value int SuspendCollectionChangedEvent public bool SuspendCollectionChangedEvent { get; set; } Property Value bool Methods Dispose() public void Dispose() IsMarked(int) public bool IsMarked(int item) Parameters item int Returns bool Render(ListView, bool, int, int, int, int, int) public void Render(ListView listView, bool selected, int item, int col, int row, int width, int viewportX = 0) Parameters listView ListView selected bool item int col int row int width int viewportX int SetMark(int, bool) public void SetMark(int item, bool value) Parameters item int value bool ToList() public IList ToList() Returns IList Update(List, Dictionary, string) public void Update(List channels, Dictionary unread, string activeChannel) Parameters channels List unread Dictionary activeChannel string Events CollectionChanged public event NotifyCollectionChangedEventHandler? CollectionChanged Event Type NotifyCollectionChangedEventHandler" + "summary": "Class ChannelListSource Namespace EchoHub.Client.UI.ListSources Assembly EchoHub.Client.dll Custom list data source for colored channel list rendering. Active channel gets a > indicator, unread channels are bright with a count badge. public class ChannelListSource : IListDataSource, IDisposable Inheritance object ChannelListSource Implements IListDataSource IDisposable Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors ChannelListSource() public ChannelListSource() Properties Count public int Count { get; } Property Value int MaxItemLength public int MaxItemLength { get; } Property Value int SuspendCollectionChangedEvent public bool SuspendCollectionChangedEvent { get; set; } Property Value bool Methods Dispose() public void Dispose() IsMarked(int) public bool IsMarked(int item) Parameters item int Returns bool Render(ListView, bool, int, int, int, int, int) public void Render(ListView listView, bool selected, int item, int col, int row, int width, int viewportX = 0) Parameters listView ListView selected bool item int col int row int width int viewportX int SetMark(int, bool) public void SetMark(int item, bool value) Parameters item int value bool ToList() public IList ToList() Returns IList Update(List, Dictionary, string, IReadOnlySet?) public void Update(List channels, Dictionary unread, string activeChannel, IReadOnlySet? protectedChannels = null) Parameters channels List unread Dictionary activeChannel string protectedChannels IReadOnlySet Events CollectionChanged public event NotifyCollectionChangedEventHandler? CollectionChanged Event Type NotifyCollectionChangedEventHandler" }, "api/client/EchoHub.Client.UI.ListSources.SearchListSource.html": { "href": "api/client/EchoHub.Client.UI.ListSources.SearchListSource.html", @@ -282,7 +332,7 @@ "api/client/EchoHub.Client.UI.MainWindow.html": { "href": "api/client/EchoHub.Client.UI.MainWindow.html", "title": "Class MainWindow | EchoHub Documentation", - "summary": "Class MainWindow Namespace EchoHub.Client.UI Assembly EchoHub.Client.dll Main Terminal.Gui window for the EchoHub chat client. public sealed class MainWindow : Runnable, IDisposable, IRunnable Inheritance object View Runnable MainWindow Implements IDisposable IRunnable Inherited Members Runnable.SetApp(IApplication) Runnable.SetIsRunning(bool) Runnable.RequestStop() Runnable.RaiseIsRunningChanging(bool, bool) Runnable.RaiseIsRunningChangedEvent(bool) Runnable.SetIsModal(bool) Runnable.RaiseIsModalChangedEvent(bool) Runnable.Result Runnable.IsRunning Runnable.IsModal Runnable.StopRequested Runnable.IsRunningChanging Runnable.IsRunningChanged Runnable.IsModalChanged View.NewMouseEvent(Mouse) View.RaiseMouseEvent(Mouse) View.GetAdornmentsThickness() View.GetSupportedCommands() View.InvokeCommands(Command[], ICommandBinding) View.InvokeCommand(Command, ICommandBinding) View.InvokeCommand(Command, ICommandContext) View.InvokeCommand(Command) View.SetContentSize(Size?) View.GetContentSize() View.GetWidthRequiredForSubViews() View.GetHeightRequiredForSubViews() View.ContentToScreen(in Point) View.ScreenToContent(in Point) View.ViewportToScreen(in Rectangle) View.ViewportToScreen(in Point) View.ViewportToScreen() View.ScreenToViewport(in Point) View.GetViewportOffsetFromFrame() View.ScrollVertical(int) View.ScrollHorizontal(int) View.Dispose() View.ToString() View.ToDebugString() View.BeginInit() View.EndInit() View.OnEnabledChanged() View.SetCursorNeedsUpdate() View.GetCurrentAttribute() View.GetAttributeForRole(VisualRole) View.SetAttribute(Attribute) View.SetAttributeForRole(VisualRole) View.GetClip() View.SetClip(Region) View.SetClipToScreen() View.ExcludeFromClip(Rectangle) View.ExcludeFromClip(Region) View.AddViewportToClip() View.Draw(DrawContext) View.DrawAdornments() View.ClearViewport(DrawContext) View.DrawText(DrawContext) View.DrawSubViews(DrawContext) View.RenderLineCanvas(DrawContext) View.Move(int, int) View.AddRune(Rune) View.AddRune(char) View.AddRune(int, int, Rune) View.AddStr(string) View.AddStr(int, int, string) View.DrawHotString(string, Attribute, Attribute) View.DrawHotString(string, bool) View.FillRect(Rectangle, Color?) View.FillRect(Rectangle, Rune) View.GetScheme() View.SetScheme(Scheme) View.GetSubViews(bool, bool, bool) View.Add(View) View.Add(params View[]) View.Remove(View) View.RemoveAll() View.RemoveAll() View.GetTopSuperView(View, View) View.IsInHierarchy(View, View, bool) View.MoveSubViewTowardsEnd(View) View.MoveSubViewToEnd(View) View.MoveSubViewTowardsStart(View) View.MoveSubViewToStart(View) View.AddKeyBindingsForHotKey(Key, Key, object) View.AssignHotKeysToSubViews() View.NewKeyDownEvent(Key) View.Contains(in Point) View.FrameToScreen() View.ScreenToFrame(in Point) View.Layout(Size) View.Layout() View.SetRelativeLayout(Size) View.SetNeedsLayout() View.GetContainerSize() View.GetViewsUnderLocation(in Point, ViewportSettingsFlags) View.AdvanceFocus(NavigationDirection, TabBehavior?) View.FocusDeepest(NavigationDirection, TabBehavior?) View.OnCanFocusChanged() View.ClearFocus() View.SetFocus() View.SetNeedsDraw() View.SetNeedsDraw(Rectangle) View.OnTextChanged() View.MouseBindings View.MouseHoldRepeat View.MousePositionTracking View.MouseState View.MouseHighlightStates View.Margin View.ShadowStyle View.Border View.BorderStyle View.Padding View.Arrangement View.DefaultAcceptView View.CommandsToBubbleUp View.ContentSizeTracksViewport View.ViewportSettings View.Viewport View.Data View.Id View.App View.IsInitialized View.Enabled View.Visible View.Title View.Cursor View.Diagnostics View.LineCanvas View.SuperViewRendersLineCanvas View.SchemeName View.HasScheme View.SubViews View.SuperView View.HotKey View.HotKeySpecifier View.AssignHotKeys View.UsedHotKeys View.KeyBindings View.HotKeyBindings View.Frame View.X View.Y View.Height View.Width View.NeedsLayout View.ValidatePosDim View.CanFocus View.Focused View.IsCurrentTop View.MostFocused View.HasFocus View.TabStop View.NeedsDraw View.HorizontalScrollBar View.VerticalScrollBar View.PreserveTrailingSpaces View.Text View.TextAlignment View.TextDirection View.TextFormatter View.VerticalTextAlignment View.MouseEnter View.MouseLeave View.MouseHoldRepeatChanging View.MouseHoldRepeatChanged View.MouseEvent View.MouseStateChanged View.BorderStyleChanged View.CommandNotBound View.Accepting View.Accepted View.Activating View.Activated View.HandlingHotKey View.HotKeyCommand View.ContentSizeChanging View.ContentSizeChanged View.ViewportChanged View.Disposing View.Initialized View.EnabledChanged View.VisibleChanging View.VisibleChanged View.TitleChanging View.TitleChanged View.GettingAttributeForRole View.ClearingViewport View.ClearedViewport View.DrawingText View.DrewText View.DrawingContent View.DrawingSubViews View.DrawComplete View.SchemeNameChanging View.SchemeNameChanged View.GettingScheme View.SchemeChanging View.SchemeChanged View.SuperViewChanging View.SuperViewChanged View.SubViewAdded View.SubViewRemoved View.Removed View.HotKeyChanged View.KeyDown View.KeyDownNotHandled View.FrameChanged View.HeightChanging View.HeightChanged View.WidthChanging View.WidthChanged View.SubViewLayout View.SubViewsLaidOut View.AdvancingFocus View.CanFocusChanged View.FocusedChanged View.HasFocusChanging View.HasFocusChanged View.TextChanged object.GetType() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors MainWindow(IApplication, ChatMessageManager) public MainWindow(IApplication app, ChatMessageManager messageManager) Parameters app IApplication messageManager ChatMessageManager Properties CurrentChannel Get the current channel name. public string CurrentChannel { get; } Property Value string Methods ApplyColorSchemes() Applies the currently registered color schemes to all views. Call after theme changes to refresh colors. public void ApplyColorSchemes() ClearAll() Clear all messages and channels (used on disconnect). public void ClearAll() EnsureChannelInList(string, bool?) Ensure a channel exists in the left panel list (used for private channels joined via /join). public void EnsureChannelInList(string channelName, bool? isPublic = null) Parameters channelName string isPublic bool? FocusInput() Focus the input field for typing. public void FocusInput() GetChannelNames() Get all channel names that have message buffers (for broadcasting status changes). public IReadOnlyList GetChannelNames() Returns IReadOnlyList RefreshMenuBar() Rebuilds and replaces the menu bar (e.g., after theme list changes). public void RefreshMenuBar() RemoveChannel(string) Remove a channel from the left panel list. public void RemoveChannel(string channelName) Parameters channelName string SetChannelTopic(string, string?) Update the topic for a specific channel. public void SetChannelTopic(string channelName, string? topic) Parameters channelName string topic string SetChannels(List) Set the list of available channels, storing topics, and refresh the channel list view. public void SetChannels(List channels) Parameters channels List SetCurrentUser(string) Set the current user name (delegates to message manager for @mention detection). public void SetCurrentUser(string username) Parameters username string ShowError(string) Show an error message to the user. public void ShowError(string message) Parameters message string SwitchToChannel(string) Switch the chat view to the given channel, resetting its unread count and updating the topic bar. public void SwitchToChannel(string channelName) Parameters channelName string ToggleUsersPanel() Toggle the online users panel visibility (F2). public void ToggleUsersPanel() UpdateOnlineUsers(List) Update the online users list display. public void UpdateOnlineUsers(List users) Parameters users List UpdateStatusBar(string) Update the connection status displayed in the status bar. public void UpdateStatusBar(string status) Parameters status string Events OnAudioPlayRequested Fired when the user activates (Enter/click) an audio message. Parameters: attachmentUrl, fileName. public event Action? OnAudioPlayRequested Event Type Action OnChannelJoinRequested Fired when the user activates a #channel reference in a message. Parameter is the channel name. public event Action? OnChannelJoinRequested Event Type Action OnChannelSelected Fired when the user selects a channel. Parameter is the channel name. public event Action? OnChannelSelected Event Type Action OnCheckForUpdatesRequested Fired when the user requests to check for updates. public event Action? OnCheckForUpdatesRequested Event Type Action OnConnectRequested Fired when the user requests to connect via the menu. public event Action? OnConnectRequested Event Type Action OnCreateChannelRequested Fired when the user requests to create a new channel. public event Action? OnCreateChannelRequested Event Type Action OnDeleteChannelRequested Fired when the user requests to delete the current channel. public event Action? OnDeleteChannelRequested Event Type Action OnDisconnectRequested Fired when the user requests to disconnect via the menu. public event Action? OnDisconnectRequested Event Type Action OnFileDownloadRequested Fired when the user activates (Enter/click) a file message. Parameters: attachmentUrl, fileName. public event Action? OnFileDownloadRequested Event Type Action OnLoadMoreRequested Fired when the user scrolls to the top of the message list and older messages should be loaded. public event Action? OnLoadMoreRequested Event Type Action OnLogoutRequested Fired when the user requests to logout (disconnect + revoke session). public event Action? OnLogoutRequested Event Type Action OnMessageSubmitted Fired when the user presses Enter in the input field. Parameters: channel name, message content. public event Action? OnMessageSubmitted Event Type Action OnProfileRequested Fired when the user requests to open their profile panel. public event Action? OnProfileRequested Event Type Action OnRollbackRequested Fired when the user requests to rollback to the previous version. public event Action? OnRollbackRequested Event Type Action OnSavedServersRequested Fired when the user requests to view saved servers. public event Action? OnSavedServersRequested Event Type Action OnSearchRequested Fired when the user requests to open the search dialog (via menu or Ctrl+K). public event Action? OnSearchRequested Event Type Action OnStatusRequested Fired when the user requests to set their status. public event Action? OnStatusRequested Event Type Action OnThemeSelected Fired when the user selects a theme from the menu. Parameter is the theme name. public event Action? OnThemeSelected Event Type Action OnUserProfileRequested Fired when the user activates a username (in userlist or message). Parameter is the username. public event Action? OnUserProfileRequested Event Type Action" + "summary": "Class MainWindow Namespace EchoHub.Client.UI Assembly EchoHub.Client.dll Main Terminal.Gui window for the EchoHub chat client. public sealed class MainWindow : Runnable, IDisposable, IRunnable Inheritance object View Runnable MainWindow Implements IDisposable IRunnable Inherited Members Runnable.SetApp(IApplication) Runnable.SetIsRunning(bool) Runnable.RequestStop() Runnable.RaiseIsRunningChanging(bool, bool) Runnable.RaiseIsRunningChangedEvent(bool) Runnable.SetIsModal(bool) Runnable.RaiseIsModalChangedEvent(bool) Runnable.Result Runnable.IsRunning Runnable.IsModal Runnable.StopRequested Runnable.IsRunningChanging Runnable.IsRunningChanged Runnable.IsModalChanged View.NewMouseEvent(Mouse) View.RaiseMouseEvent(Mouse) View.GetAdornmentsThickness() View.GetSupportedCommands() View.InvokeCommands(Command[], ICommandBinding) View.InvokeCommand(Command, ICommandBinding) View.InvokeCommand(Command, ICommandContext) View.InvokeCommand(Command) View.SetContentSize(Size?) View.GetContentSize() View.GetWidthRequiredForSubViews() View.GetHeightRequiredForSubViews() View.ContentToScreen(in Point) View.ScreenToContent(in Point) View.ViewportToScreen(in Rectangle) View.ViewportToScreen(in Point) View.ViewportToScreen() View.ScreenToViewport(in Point) View.GetViewportOffsetFromFrame() View.ScrollVertical(int) View.ScrollHorizontal(int) View.Dispose() View.ToString() View.ToDebugString() View.BeginInit() View.EndInit() View.OnEnabledChanged() View.SetCursorNeedsUpdate() View.GetCurrentAttribute() View.GetAttributeForRole(VisualRole) View.SetAttribute(Attribute) View.SetAttributeForRole(VisualRole) View.GetClip() View.SetClip(Region) View.SetClipToScreen() View.ExcludeFromClip(Rectangle) View.ExcludeFromClip(Region) View.AddViewportToClip() View.Draw(DrawContext) View.DrawAdornments() View.ClearViewport(DrawContext) View.DrawText(DrawContext) View.DrawSubViews(DrawContext) View.RenderLineCanvas(DrawContext) View.Move(int, int) View.AddRune(Rune) View.AddRune(char) View.AddRune(int, int, Rune) View.AddStr(string) View.AddStr(int, int, string) View.DrawHotString(string, Attribute, Attribute) View.DrawHotString(string, bool) View.FillRect(Rectangle, Color?) View.FillRect(Rectangle, Rune) View.GetScheme() View.SetScheme(Scheme) View.GetSubViews(bool, bool, bool) View.Add(View) View.Add(params View[]) View.Remove(View) View.RemoveAll() View.RemoveAll() View.GetTopSuperView(View, View) View.IsInHierarchy(View, View, bool) View.MoveSubViewTowardsEnd(View) View.MoveSubViewToEnd(View) View.MoveSubViewTowardsStart(View) View.MoveSubViewToStart(View) View.AddKeyBindingsForHotKey(Key, Key, object) View.AssignHotKeysToSubViews() View.NewKeyDownEvent(Key) View.Contains(in Point) View.FrameToScreen() View.ScreenToFrame(in Point) View.Layout(Size) View.Layout() View.SetRelativeLayout(Size) View.SetNeedsLayout() View.GetContainerSize() View.GetViewsUnderLocation(in Point, ViewportSettingsFlags) View.AdvanceFocus(NavigationDirection, TabBehavior?) View.FocusDeepest(NavigationDirection, TabBehavior?) View.OnCanFocusChanged() View.ClearFocus() View.SetFocus() View.SetNeedsDraw() View.SetNeedsDraw(Rectangle) View.OnTextChanged() View.MouseBindings View.MouseHoldRepeat View.MousePositionTracking View.MouseState View.MouseHighlightStates View.Margin View.ShadowStyle View.Border View.BorderStyle View.Padding View.Arrangement View.DefaultAcceptView View.CommandsToBubbleUp View.ContentSizeTracksViewport View.ViewportSettings View.Viewport View.Data View.Id View.App View.IsInitialized View.Enabled View.Visible View.Title View.Cursor View.Diagnostics View.LineCanvas View.SuperViewRendersLineCanvas View.SchemeName View.HasScheme View.SubViews View.SuperView View.HotKey View.HotKeySpecifier View.AssignHotKeys View.UsedHotKeys View.KeyBindings View.HotKeyBindings View.Frame View.X View.Y View.Height View.Width View.NeedsLayout View.ValidatePosDim View.CanFocus View.Focused View.IsCurrentTop View.MostFocused View.HasFocus View.TabStop View.NeedsDraw View.HorizontalScrollBar View.VerticalScrollBar View.PreserveTrailingSpaces View.Text View.TextAlignment View.TextDirection View.TextFormatter View.VerticalTextAlignment View.MouseEnter View.MouseLeave View.MouseHoldRepeatChanging View.MouseHoldRepeatChanged View.MouseEvent View.MouseStateChanged View.BorderStyleChanged View.CommandNotBound View.Accepting View.Accepted View.Activating View.Activated View.HandlingHotKey View.HotKeyCommand View.ContentSizeChanging View.ContentSizeChanged View.ViewportChanged View.Disposing View.Initialized View.EnabledChanged View.VisibleChanging View.VisibleChanged View.TitleChanging View.TitleChanged View.GettingAttributeForRole View.ClearingViewport View.ClearedViewport View.DrawingText View.DrewText View.DrawingContent View.DrawingSubViews View.DrawComplete View.SchemeNameChanging View.SchemeNameChanged View.GettingScheme View.SchemeChanging View.SchemeChanged View.SuperViewChanging View.SuperViewChanged View.SubViewAdded View.SubViewRemoved View.Removed View.HotKeyChanged View.KeyDown View.KeyDownNotHandled View.FrameChanged View.HeightChanging View.HeightChanged View.WidthChanging View.WidthChanged View.SubViewLayout View.SubViewsLaidOut View.AdvancingFocus View.CanFocusChanged View.FocusedChanged View.HasFocusChanging View.HasFocusChanged View.TextChanged object.GetType() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors MainWindow(IApplication, ChatMessageManager) public MainWindow(IApplication app, ChatMessageManager messageManager) Parameters app IApplication messageManager ChatMessageManager Properties CurrentChannel Get the current channel name. public string CurrentChannel { get; } Property Value string Methods ApplyColorSchemes() Applies the currently registered color schemes to all views. Call after theme changes to refresh colors. public void ApplyColorSchemes() ClearAll() Clear all messages and channels (used on disconnect). public void ClearAll() EnsureChannelInList(string, bool?, bool?) Ensure a channel exists in the left panel list (used for private channels joined via /join). public void EnsureChannelInList(string channelName, bool? isPublic = null, bool? isProtected = null) Parameters channelName string isPublic bool? isProtected bool? FocusInput() Focus the input field for typing. public void FocusInput() GetChannelNames() Get all channel names that have message buffers (for broadcasting status changes). public IReadOnlyList GetChannelNames() Returns IReadOnlyList RefreshMenuBar() Rebuilds and replaces the menu bar (e.g., after theme list changes). public void RefreshMenuBar() RemoveChannel(string) Remove a channel from the left panel list. public void RemoveChannel(string channelName) Parameters channelName string SetChannelTopic(string, string?) Update the topic for a specific channel. public void SetChannelTopic(string channelName, string? topic) Parameters channelName string topic string SetChannels(List) Set the list of available channels, storing topics, and refresh the channel list view. public void SetChannels(List channels) Parameters channels List SetCurrentUser(string) Set the current user name (delegates to message manager for @mention detection). public void SetCurrentUser(string username) Parameters username string SetStagedAttachments(IReadOnlyList, string) Updates the attachment staging indicator shown on the input frame's title, including the current ASCII-art size for images. Passing an empty list restores the default hint. public void SetStagedAttachments(IReadOnlyList fileNames, string asciiSizeLabel) Parameters fileNames IReadOnlyList asciiSizeLabel string ShowError(string) Show an error message to the user. public void ShowError(string message) Parameters message string SwitchToChannel(string) Switch the chat view to the given channel, resetting its unread count and updating the topic bar. public void SwitchToChannel(string channelName) Parameters channelName string ToggleUsersPanel() Toggle the online users panel visibility (F2). public void ToggleUsersPanel() UpdateOnlineUsers(List) Update the online users list display. public void UpdateOnlineUsers(List users) Parameters users List UpdateStatusBar(string) Update the connection status displayed in the status bar. public void UpdateStatusBar(string status) Parameters status string Events OnAudioPlayRequested Fired when the user activates (Enter/click) an audio message. Parameters: attachmentUrl, fileName. public event Action? OnAudioPlayRequested Event Type Action OnChannelJoinRequested Fired when the user activates a #channel reference in a message. Parameter is the channel name. public event Action? OnChannelJoinRequested Event Type Action OnChannelSelected Fired when the user selects a channel. Parameter is the channel name. public event Action? OnChannelSelected Event Type Action OnCheckForUpdatesRequested Fired when the user requests to check for updates. public event Action? OnCheckForUpdatesRequested Event Type Action OnConnectRequested Fired when the user requests to connect via the menu. public event Action? OnConnectRequested Event Type Action OnCreateChannelRequested Fired when the user requests to create a new channel. public event Action? OnCreateChannelRequested Event Type Action OnDeleteChannelRequested Fired when the user requests to delete the current channel. public event Action? OnDeleteChannelRequested Event Type Action OnDeleteMessageRequested Fired when the user presses Delete on the selected message. Parameter is the message id. public event Action? OnDeleteMessageRequested Event Type Action OnDisconnectRequested Fired when the user requests to disconnect via the menu. public event Action? OnDisconnectRequested Event Type Action OnFileDownloadRequested Fired when the user activates (Enter/click) a file message. Parameters: attachmentUrl, fileName. public event Action? OnFileDownloadRequested Event Type Action OnImageSaveRequested Fired when the user activates an image's \"[save original]\" line. Parameters: attachmentUrl, fileName. public event Action? OnImageSaveRequested Event Type Action OnLoadMoreRequested Fired when the user scrolls to the top of the message list and older messages should be loaded. public event Action? OnLoadMoreRequested Event Type Action OnLogoutRequested Fired when the user requests to logout (disconnect + revoke session). public event Action? OnLogoutRequested Event Type Action OnMessageSubmitted Fired when the user presses Enter in the input field. Parameters: channel name, message content. public event Action? OnMessageSubmitted Event Type Action OnProfileRequested Fired when the user requests to open their profile panel. public event Action? OnProfileRequested Event Type Action OnRollbackRequested Fired when the user requests to rollback to the previous version. public event Action? OnRollbackRequested Event Type Action OnSavedServersRequested Fired when the user requests to view saved servers. public event Action? OnSavedServersRequested Event Type Action OnSearchRequested Fired when the user requests to open the search dialog (via menu or Ctrl+K). public event Action? OnSearchRequested Event Type Action OnStatusRequested Fired when the user requests to set their status. public event Action? OnStatusRequested Event Type Action OnThemeSelected Fired when the user selects a theme from the menu. Parameter is the theme name. public event Action? OnThemeSelected Event Type Action OnUserProfileRequested Fired when the user activates a username (in userlist or message). Parameter is the username. public event Action? OnUserProfileRequested Event Type Action" }, "api/client/EchoHub.Client.UI.html": { "href": "api/client/EchoHub.Client.UI.html", @@ -302,12 +352,12 @@ "api/core/EchoHub.Core.Constants.HubConstants.html": { "href": "api/core/EchoHub.Core.Constants.HubConstants.html", "title": "Class HubConstants | EchoHub Documentation", - "summary": "Class HubConstants Namespace EchoHub.Core.Constants Assembly EchoHub.Core.dll public static class HubConstants Inheritance object HubConstants Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Fields AsciiArtHeight public const int AsciiArtHeight = 40 Field Value int AsciiArtHeightHalfBlock public const int AsciiArtHeightHalfBlock = 80 Field Value int AsciiArtWidth public const int AsciiArtWidth = 80 Field Value int ChatHubPath public const string ChatHubPath = \"/hubs/chat\" Field Value string DefaultChannel public const string DefaultChannel = \"general\" Field Value string DefaultHistoryCount public const int DefaultHistoryCount = 100 Field Value int EmbedFetchTimeoutSeconds public const int EmbedFetchTimeoutSeconds = 5 Field Value int EmbedMaxDescriptionLength public const int EmbedMaxDescriptionLength = 500 Field Value int EmbedMaxHtmlBytes public const int EmbedMaxHtmlBytes = 65536 Field Value int EmbedMaxUrlsPerMessage public const int EmbedMaxUrlsPerMessage = 3 Field Value int MaxAudioFileSizeBytes public const int MaxAudioFileSizeBytes = 10485760 Field Value int MaxAvatarSizeBytes public const int MaxAvatarSizeBytes = 2097152 Field Value int MaxConsecutiveNewlines public const int MaxConsecutiveNewlines = 1 Field Value int MaxFileSizeBytes public const int MaxFileSizeBytes = 104857600 Field Value int MaxImageSizeBytes public const int MaxImageSizeBytes = 10485760 Field Value int MaxMessageLength public const int MaxMessageLength = 2000 Field Value int MaxMessageNewlines public const int MaxMessageNewlines = 30 Field Value int" + "summary": "Class HubConstants Namespace EchoHub.Core.Constants Assembly EchoHub.Core.dll public static class HubConstants Inheritance object HubConstants Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Fields AsciiArtHeight public const int AsciiArtHeight = 40 Field Value int AsciiArtHeightHalfBlock public const int AsciiArtHeightHalfBlock = 80 Field Value int AsciiArtWidth public const int AsciiArtWidth = 80 Field Value int ChatHubPath public const string ChatHubPath = \"/hubs/chat\" Field Value string DefaultChannel public const string DefaultChannel = \"general\" Field Value string DefaultHistoryCount public const int DefaultHistoryCount = 100 Field Value int EmbedFetchTimeoutSeconds public const int EmbedFetchTimeoutSeconds = 5 Field Value int EmbedMaxDescriptionLength public const int EmbedMaxDescriptionLength = 500 Field Value int EmbedMaxHtmlBytes public const int EmbedMaxHtmlBytes = 65536 Field Value int EmbedMaxUrlsPerMessage public const int EmbedMaxUrlsPerMessage = 3 Field Value int MaxAttachmentsPerMessage public const int MaxAttachmentsPerMessage = 10 Field Value int MaxAudioFileSizeBytes public const int MaxAudioFileSizeBytes = 10485760 Field Value int MaxAvatarSizeBytes public const int MaxAvatarSizeBytes = 2097152 Field Value int MaxConsecutiveNewlines public const int MaxConsecutiveNewlines = 1 Field Value int MaxFileSizeBytes public const int MaxFileSizeBytes = 104857600 Field Value int MaxImageSizeBytes public const int MaxImageSizeBytes = 10485760 Field Value int MaxMessageLength public const int MaxMessageLength = 2000 Field Value int MaxMessageNewlines public const int MaxMessageNewlines = 30 Field Value int" }, "api/core/EchoHub.Core.Constants.ValidationConstants.html": { "href": "api/core/EchoHub.Core.Constants.ValidationConstants.html", "title": "Class ValidationConstants | EchoHub Documentation", - "summary": "Class ValidationConstants Namespace EchoHub.Core.Constants Assembly EchoHub.Core.dll public static class ValidationConstants Inheritance object ValidationConstants Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Fields ChannelNamePattern public const string ChannelNamePattern = \"^[a-zA-Z0-9_-]{2,100}$\" Field Value string HexColorPattern public const string HexColorPattern = \"^#[0-9a-fA-F]{6}$\" Field Value string MaxBioLength public const int MaxBioLength = 500 Field Value int MaxChannelTopicLength public const int MaxChannelTopicLength = 500 Field Value int MaxDisplayNameLength public const int MaxDisplayNameLength = 100 Field Value int MaxHistoryCount public const int MaxHistoryCount = 200 Field Value int MaxPasswordLength public const int MaxPasswordLength = 128 Field Value int MaxStatusMessageLength public const int MaxStatusMessageLength = 100 Field Value int UsernamePattern public const string UsernamePattern = \"^[a-zA-Z0-9_-]{3,50}$\" Field Value string Methods ChannelNameRegex() [GeneratedRegex(\"^[a-zA-Z0-9_-]{2,100}$\")] public static Regex ChannelNameRegex() Returns Regex Remarks Pattern: ^[a-zA-Z0-9_-]{2,100}$ Explanation: ○ Match if at the beginning of the string. ○ Match a character in the set [\\-0-9A-Z_a-z] atomically at least 2 and at most 100 times. ○ Match if at the end of the string or if before an ending newline. HexColorRegex() [GeneratedRegex(\"^#[0-9a-fA-F]{6}$\")] public static Regex HexColorRegex() Returns Regex Remarks Pattern: ^#[0-9a-fA-F]{6}$ Explanation: ○ Match if at the beginning of the string. ○ Match '#'. ○ Match a hexadecimal digit exactly 6 times. ○ Match if at the end of the string or if before an ending newline. UsernameRegex() [GeneratedRegex(\"^[a-zA-Z0-9_-]{3,50}$\")] public static Regex UsernameRegex() Returns Regex Remarks Pattern: ^[a-zA-Z0-9_-]{3,50}$ Explanation: ○ Match if at the beginning of the string. ○ Match a character in the set [\\-0-9A-Z_a-z] atomically at least 3 and at most 50 times. ○ Match if at the end of the string or if before an ending newline." + "summary": "Class ValidationConstants Namespace EchoHub.Core.Constants Assembly EchoHub.Core.dll public static class ValidationConstants Inheritance object ValidationConstants Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Fields ChannelNamePattern public const string ChannelNamePattern = \"^[a-zA-Z0-9_-]{2,100}$\" Field Value string HexColorPattern public const string HexColorPattern = \"^#[0-9a-fA-F]{6}$\" Field Value string MaxBioLength public const int MaxBioLength = 500 Field Value int MaxChannelTopicLength public const int MaxChannelTopicLength = 500 Field Value int MaxDisplayNameLength public const int MaxDisplayNameLength = 100 Field Value int MaxHistoryCount public const int MaxHistoryCount = 200 Field Value int MaxPasswordLength public const int MaxPasswordLength = 128 Field Value int MaxStatusMessageLength public const int MaxStatusMessageLength = 100 Field Value int MinChannelPasswordLength public const int MinChannelPasswordLength = 3 Field Value int UsernamePattern public const string UsernamePattern = \"^[a-zA-Z0-9_-]{3,50}$\" Field Value string Methods ChannelNameRegex() [GeneratedRegex(\"^[a-zA-Z0-9_-]{2,100}$\")] public static Regex ChannelNameRegex() Returns Regex Remarks Pattern: ^[a-zA-Z0-9_-]{2,100}$ Explanation: ○ Match if at the beginning of the string. ○ Match a character in the set [\\-0-9A-Z_a-z] atomically at least 2 and at most 100 times. ○ Match if at the end of the string or if before an ending newline. HexColorRegex() [GeneratedRegex(\"^#[0-9a-fA-F]{6}$\")] public static Regex HexColorRegex() Returns Regex Remarks Pattern: ^#[0-9a-fA-F]{6}$ Explanation: ○ Match if at the beginning of the string. ○ Match '#'. ○ Match a hexadecimal digit exactly 6 times. ○ Match if at the end of the string or if before an ending newline. UsernameRegex() [GeneratedRegex(\"^[a-zA-Z0-9_-]{3,50}$\")] public static Regex UsernameRegex() Returns Regex Remarks Pattern: ^[a-zA-Z0-9_-]{3,50}$ Explanation: ○ Match if at the beginning of the string. ○ Match a character in the set [\\-0-9A-Z_a-z] atomically at least 3 and at most 50 times. ○ Match if at the end of the string or if before an ending newline." }, "api/core/EchoHub.Core.Constants.html": { "href": "api/core/EchoHub.Core.Constants.html", @@ -317,12 +367,12 @@ "api/core/EchoHub.Core.Contracts.ChannelListItem.html": { "href": "api/core/EchoHub.Core.Contracts.ChannelListItem.html", "title": "Class ChannelListItem | EchoHub Documentation", - "summary": "Class ChannelListItem Namespace EchoHub.Core.Contracts Assembly EchoHub.Core.dll public record ChannelListItem : IEquatable Inheritance object ChannelListItem Implements IEquatable Inherited Members object.GetType() object.MemberwiseClone() object.Equals(object, object) object.ReferenceEquals(object, object) Constructors ChannelListItem(ChannelListItem) protected ChannelListItem(ChannelListItem original) Parameters original ChannelListItem ChannelListItem(string, string?, int) public ChannelListItem(string Name, string? Topic, int OnlineCount) Parameters Name string Topic string OnlineCount int Properties EqualityContract protected virtual Type EqualityContract { get; } Property Value Type Name public string Name { get; init; } Property Value string OnlineCount public int OnlineCount { get; init; } Property Value int Topic public string? Topic { get; init; } Property Value string Methods Deconstruct(out string, out string?, out int) public void Deconstruct(out string Name, out string? Topic, out int OnlineCount) Parameters Name string Topic string OnlineCount int Equals(ChannelListItem?) public virtual bool Equals(ChannelListItem? other) Parameters other ChannelListItem Returns bool Equals(object?) public override bool Equals(object? obj) Parameters obj object Returns bool GetHashCode() public override int GetHashCode() Returns int PrintMembers(StringBuilder) protected virtual bool PrintMembers(StringBuilder builder) Parameters builder StringBuilder Returns bool ToString() public override string ToString() Returns string Operators operator ==(ChannelListItem?, ChannelListItem?) public static bool operator ==(ChannelListItem? left, ChannelListItem? right) Parameters left ChannelListItem right ChannelListItem Returns bool operator !=(ChannelListItem?, ChannelListItem?) public static bool operator !=(ChannelListItem? left, ChannelListItem? right) Parameters left ChannelListItem right ChannelListItem Returns bool" + "summary": "Class ChannelListItem Namespace EchoHub.Core.Contracts Assembly EchoHub.Core.dll public record ChannelListItem : IEquatable Inheritance object ChannelListItem Implements IEquatable Inherited Members object.GetType() object.MemberwiseClone() object.Equals(object, object) object.ReferenceEquals(object, object) Constructors ChannelListItem(ChannelListItem) protected ChannelListItem(ChannelListItem original) Parameters original ChannelListItem ChannelListItem(string, string?, int, bool, bool) public ChannelListItem(string Name, string? Topic, int OnlineCount, bool IsPublic = true, bool IsProtected = false) Parameters Name string Topic string OnlineCount int IsPublic bool IsProtected bool Properties EqualityContract protected virtual Type EqualityContract { get; } Property Value Type IsProtected public bool IsProtected { get; init; } Property Value bool IsPublic public bool IsPublic { get; init; } Property Value bool Name public string Name { get; init; } Property Value string OnlineCount public int OnlineCount { get; init; } Property Value int Topic public string? Topic { get; init; } Property Value string Methods Deconstruct(out string, out string?, out int, out bool, out bool) public void Deconstruct(out string Name, out string? Topic, out int OnlineCount, out bool IsPublic, out bool IsProtected) Parameters Name string Topic string OnlineCount int IsPublic bool IsProtected bool Equals(ChannelListItem?) public virtual bool Equals(ChannelListItem? other) Parameters other ChannelListItem Returns bool Equals(object?) public override bool Equals(object? obj) Parameters obj object Returns bool GetHashCode() public override int GetHashCode() Returns int PrintMembers(StringBuilder) protected virtual bool PrintMembers(StringBuilder builder) Parameters builder StringBuilder Returns bool ToString() public override string ToString() Returns string Operators operator ==(ChannelListItem?, ChannelListItem?) public static bool operator ==(ChannelListItem? left, ChannelListItem? right) Parameters left ChannelListItem right ChannelListItem Returns bool operator !=(ChannelListItem?, ChannelListItem?) public static bool operator !=(ChannelListItem? left, ChannelListItem? right) Parameters left ChannelListItem right ChannelListItem Returns bool" }, "api/core/EchoHub.Core.Contracts.IChannelService.html": { "href": "api/core/EchoHub.Core.Contracts.IChannelService.html", "title": "Interface IChannelService | EchoHub Documentation", - "summary": "Interface IChannelService Namespace EchoHub.Core.Contracts Assembly EchoHub.Core.dll public interface IChannelService Methods CreateChannelAsync(Guid, string, string?, bool) Task CreateChannelAsync(Guid creatorUserId, string name, string? topic, bool isPublic) Parameters creatorUserId Guid name string topic string isPublic bool Returns Task DeleteChannelAsync(Guid, string) Task DeleteChannelAsync(Guid callerUserId, string channelName) Parameters callerUserId Guid channelName string Returns Task EnsureChannelMembershipAsync(Guid, string) Task<(bool Success, string? Error)> EnsureChannelMembershipAsync(Guid userId, string channelName) Parameters userId Guid channelName string Returns Task<(bool Success, string Error)> GetChannelByNameAsync(string) Task GetChannelByNameAsync(string channelName) Parameters channelName string Returns Task GetChannelListAsync() Task> GetChannelListAsync() Returns Task> GetChannelTopicAsync(string) Task<(string? Topic, bool Exists)> GetChannelTopicAsync(string channelName) Parameters channelName string Returns Task<(string Topic, bool Exists)> GetChannelsAsync(Guid, int, int) Task> GetChannelsAsync(Guid userId, int offset, int limit) Parameters userId Guid offset int limit int Returns Task> UpdateTopicAsync(Guid, string, string?) Task UpdateTopicAsync(Guid callerUserId, string channelName, string? topic) Parameters callerUserId Guid channelName string topic string Returns Task" + "summary": "Interface IChannelService Namespace EchoHub.Core.Contracts Assembly EchoHub.Core.dll public interface IChannelService Methods CreateChannelAsync(Guid, string, string?, bool, string?, string?, string?) Task CreateChannelAsync(Guid creatorUserId, string name, string? topic, bool isPublic, string? password = null, string? encryptionSalt = null, string? wrappedRoomKey = null) Parameters creatorUserId Guid name string topic string isPublic bool password string encryptionSalt string wrappedRoomKey string Returns Task DeleteChannelAsync(Guid, string) Task DeleteChannelAsync(Guid callerUserId, string channelName) Parameters callerUserId Guid channelName string Returns Task EnsureChannelMembershipAsync(Guid, string, string?) Task<(bool Success, string? Error, bool PasswordRequired)> EnsureChannelMembershipAsync(Guid userId, string channelName, string? password = null) Parameters userId Guid channelName string password string Returns Task<(bool Success, string Error, bool PasswordRequired)> GetChannelByNameAsync(string) Task GetChannelByNameAsync(string channelName) Parameters channelName string Returns Task GetChannelCryptoAsync(string) Task GetChannelCryptoAsync(string channelName) Parameters channelName string Returns Task GetChannelKeyEnvelopeAsync(string) Task<(string? EncryptionSalt, string? WrappedRoomKey)> GetChannelKeyEnvelopeAsync(string channelName) Parameters channelName string Returns Task<(string EncryptionSalt, string WrappedRoomKey)> GetChannelListAsync() Task> GetChannelListAsync() Returns Task> GetChannelTopicAsync(string) Task<(string? Topic, bool Exists)> GetChannelTopicAsync(string channelName) Parameters channelName string Returns Task<(string Topic, bool Exists)> GetChannelsAsync(Guid, int, int) Task> GetChannelsAsync(Guid userId, int offset, int limit) Parameters userId Guid offset int limit int Returns Task> RekeyChannelAsync(Guid, string, string, string, string, string) Task RekeyChannelAsync(Guid callerUserId, string channelName, string oldPassword, string newPassword, string newEncryptionSalt, string newWrappedRoomKey) Parameters callerUserId Guid channelName string oldPassword string newPassword string newEncryptionSalt string newWrappedRoomKey string Returns Task SetChannelPasswordAsync(Guid, string, string?) Task SetChannelPasswordAsync(Guid callerUserId, string channelName, string? password) Parameters callerUserId Guid channelName string password string Returns Task UpdateTopicAsync(Guid, string, string?) Task UpdateTopicAsync(Guid callerUserId, string channelName, string? topic) Parameters callerUserId Guid channelName string topic string Returns Task" }, "api/core/EchoHub.Core.Contracts.IChatBroadcaster.html": { "href": "api/core/EchoHub.Core.Contracts.IChatBroadcaster.html", @@ -332,7 +382,7 @@ "api/core/EchoHub.Core.Contracts.IChatService.html": { "href": "api/core/EchoHub.Core.Contracts.IChatService.html", "title": "Interface IChatService | EchoHub Documentation", - "summary": "Interface IChatService Namespace EchoHub.Core.Contracts Assembly EchoHub.Core.dll public interface IChatService Methods BroadcastChannelUpdatedAsync(ChannelDto, string?) Task BroadcastChannelUpdatedAsync(ChannelDto channel, string? channelName = null) Parameters channel ChannelDto channelName string Returns Task BroadcastMessageAsync(string, MessageDto) Task BroadcastMessageAsync(string channelName, MessageDto message) Parameters channelName string message MessageDto Returns Task GetChannelHistoryAsync(string, int, int) Task> GetChannelHistoryAsync(string channelName, int count, int offset = 0) Parameters channelName string count int offset int Returns Task> GetChannelsForUserAsync(string) Task> GetChannelsForUserAsync(string username) Parameters username string Returns Task> GetOnlineUsersAsync(string) Task> GetOnlineUsersAsync(string channelName) Parameters channelName string Returns Task> JoinChannelAsync(string, Guid, string, string) Task<(List History, string? Error)> JoinChannelAsync(string connectionId, Guid userId, string username, string channelName) Parameters connectionId string userId Guid username string channelName string Returns Task<(List History, string Error)> LeaveChannelAsync(string, string, string) Task LeaveChannelAsync(string connectionId, string username, string channelName) Parameters connectionId string username string channelName string Returns Task SendMessageAsync(Guid, string, string, string) Task SendMessageAsync(Guid userId, string username, string channelName, string content) Parameters userId Guid username string channelName string content string Returns Task UpdateStatusAsync(Guid, string, UserStatus, string?) Task UpdateStatusAsync(Guid userId, string username, UserStatus status, string? statusMessage) Parameters userId Guid username string status UserStatus statusMessage string Returns Task UserConnectedAsync(string, Guid, string) Task UserConnectedAsync(string connectionId, Guid userId, string username) Parameters connectionId string userId Guid username string Returns Task UserDisconnectedAsync(string) Task UserDisconnectedAsync(string connectionId) Parameters connectionId string Returns Task" + "summary": "Interface IChatService Namespace EchoHub.Core.Contracts Assembly EchoHub.Core.dll public interface IChatService Methods BroadcastChannelUpdatedAsync(ChannelDto, string?) Task BroadcastChannelUpdatedAsync(ChannelDto channel, string? channelName = null) Parameters channel ChannelDto channelName string Returns Task BroadcastMessageAsync(string, MessageDto) Task BroadcastMessageAsync(string channelName, MessageDto message) Parameters channelName string message MessageDto Returns Task GetChannelHistoryAsync(string, int, int) Task> GetChannelHistoryAsync(string channelName, int count, int offset = 0) Parameters channelName string count int offset int Returns Task> GetChannelsForUserAsync(string) Task> GetChannelsForUserAsync(string username) Parameters username string Returns Task> GetOnlineUsersAsync(string) Task> GetOnlineUsersAsync(string channelName) Parameters channelName string Returns Task> JoinChannelAsync(string, Guid, string, string, string?) Task<(List History, string? Error, bool PasswordRequired)> JoinChannelAsync(string connectionId, Guid userId, string username, string channelName, string? password = null) Parameters connectionId string userId Guid username string channelName string password string Returns Task<(List History, string Error, bool PasswordRequired)> LeaveChannelAsync(string, string, string) Task LeaveChannelAsync(string connectionId, string username, string channelName) Parameters connectionId string username string channelName string Returns Task SendMessageAsync(Guid, string, string, string) Task SendMessageAsync(Guid userId, string username, string channelName, string content) Parameters userId Guid username string channelName string content string Returns Task UpdateStatusAsync(Guid, string, UserStatus, string?) Task UpdateStatusAsync(Guid userId, string username, UserStatus status, string? statusMessage) Parameters userId Guid username string status UserStatus statusMessage string Returns Task UserConnectedAsync(string, Guid, string) Task UserConnectedAsync(string connectionId, Guid userId, string username) Parameters connectionId string userId Guid username string Returns Task UserDisconnectedAsync(string) Task UserDisconnectedAsync(string connectionId) Parameters connectionId string Returns Task" }, "api/core/EchoHub.Core.Contracts.IEchoHubClient.html": { "href": "api/core/EchoHub.Core.Contracts.IEchoHubClient.html", @@ -369,6 +419,11 @@ "title": "Class AssignRoleRequest | EchoHub Documentation", "summary": "Class AssignRoleRequest Namespace EchoHub.Core.DTOs Assembly EchoHub.Core.dll public record AssignRoleRequest : IEquatable Inheritance object AssignRoleRequest Implements IEquatable Inherited Members object.GetType() object.MemberwiseClone() object.Equals(object, object) object.ReferenceEquals(object, object) Constructors AssignRoleRequest(AssignRoleRequest) protected AssignRoleRequest(AssignRoleRequest original) Parameters original AssignRoleRequest AssignRoleRequest(string, ServerRole) public AssignRoleRequest(string Username, ServerRole Role) Parameters Username string Role ServerRole Properties EqualityContract protected virtual Type EqualityContract { get; } Property Value Type Role public ServerRole Role { get; init; } Property Value ServerRole Username public string Username { get; init; } Property Value string Methods Deconstruct(out string, out ServerRole) public void Deconstruct(out string Username, out ServerRole Role) Parameters Username string Role ServerRole Equals(AssignRoleRequest?) public virtual bool Equals(AssignRoleRequest? other) Parameters other AssignRoleRequest Returns bool Equals(object?) public override bool Equals(object? obj) Parameters obj object Returns bool GetHashCode() public override int GetHashCode() Returns int PrintMembers(StringBuilder) protected virtual bool PrintMembers(StringBuilder builder) Parameters builder StringBuilder Returns bool ToString() public override string ToString() Returns string Operators operator ==(AssignRoleRequest?, AssignRoleRequest?) public static bool operator ==(AssignRoleRequest? left, AssignRoleRequest? right) Parameters left AssignRoleRequest right AssignRoleRequest Returns bool operator !=(AssignRoleRequest?, AssignRoleRequest?) public static bool operator !=(AssignRoleRequest? left, AssignRoleRequest? right) Parameters left AssignRoleRequest right AssignRoleRequest Returns bool" }, + "api/core/EchoHub.Core.DTOs.AttachmentDto.html": { + "href": "api/core/EchoHub.Core.DTOs.AttachmentDto.html", + "title": "Class AttachmentDto | EchoHub Documentation", + "summary": "Class AttachmentDto Namespace EchoHub.Core.DTOs Assembly EchoHub.Core.dll A file attached to a message. AsciiPreview holds the color-tag art for images (null otherwise). For end-to-end encrypted channels the content behind Url and the preview are ciphertext the server cannot read. public record AttachmentDto : IEquatable Inheritance object AttachmentDto Implements IEquatable Inherited Members object.GetType() object.MemberwiseClone() object.Equals(object, object) object.ReferenceEquals(object, object) Constructors AttachmentDto(AttachmentDto) protected AttachmentDto(AttachmentDto original) Parameters original AttachmentDto AttachmentDto(AttachmentKind, string, string, long, string?) A file attached to a message. AsciiPreview holds the color-tag art for images (null otherwise). For end-to-end encrypted channels the content behind Url and the preview are ciphertext the server cannot read. public AttachmentDto(AttachmentKind Kind, string Url, string FileName, long FileSize, string? AsciiPreview = null) Parameters Kind AttachmentKind Url string FileName string FileSize long AsciiPreview string Properties AsciiPreview public string? AsciiPreview { get; init; } Property Value string EqualityContract protected virtual Type EqualityContract { get; } Property Value Type FileName public string FileName { get; init; } Property Value string FileSize public long FileSize { get; init; } Property Value long Kind public AttachmentKind Kind { get; init; } Property Value AttachmentKind Url public string Url { get; init; } Property Value string Methods Deconstruct(out AttachmentKind, out string, out string, out long, out string?) public void Deconstruct(out AttachmentKind Kind, out string Url, out string FileName, out long FileSize, out string? AsciiPreview) Parameters Kind AttachmentKind Url string FileName string FileSize long AsciiPreview string Equals(AttachmentDto?) public virtual bool Equals(AttachmentDto? other) Parameters other AttachmentDto Returns bool Equals(object?) public override bool Equals(object? obj) Parameters obj object Returns bool GetHashCode() public override int GetHashCode() Returns int PrintMembers(StringBuilder) protected virtual bool PrintMembers(StringBuilder builder) Parameters builder StringBuilder Returns bool ToString() public override string ToString() Returns string Operators operator ==(AttachmentDto?, AttachmentDto?) public static bool operator ==(AttachmentDto? left, AttachmentDto? right) Parameters left AttachmentDto right AttachmentDto Returns bool operator !=(AttachmentDto?, AttachmentDto?) public static bool operator !=(AttachmentDto? left, AttachmentDto? right) Parameters left AttachmentDto right AttachmentDto Returns bool" + }, "api/core/EchoHub.Core.DTOs.AvatarUploadResponse.html": { "href": "api/core/EchoHub.Core.DTOs.AvatarUploadResponse.html", "title": "Class AvatarUploadResponse | EchoHub Documentation", @@ -379,10 +434,15 @@ "title": "Class BanRequest | EchoHub Documentation", "summary": "Class BanRequest Namespace EchoHub.Core.DTOs Assembly EchoHub.Core.dll public record BanRequest : IEquatable Inheritance object BanRequest Implements IEquatable Inherited Members object.GetType() object.MemberwiseClone() object.Equals(object, object) object.ReferenceEquals(object, object) Constructors BanRequest(BanRequest) protected BanRequest(BanRequest original) Parameters original BanRequest BanRequest(string?) public BanRequest(string? Reason = null) Parameters Reason string Properties EqualityContract protected virtual Type EqualityContract { get; } Property Value Type Reason public string? Reason { get; init; } Property Value string Methods Deconstruct(out string?) public void Deconstruct(out string? Reason) Parameters Reason string Equals(BanRequest?) public virtual bool Equals(BanRequest? other) Parameters other BanRequest Returns bool Equals(object?) public override bool Equals(object? obj) Parameters obj object Returns bool GetHashCode() public override int GetHashCode() Returns int PrintMembers(StringBuilder) protected virtual bool PrintMembers(StringBuilder builder) Parameters builder StringBuilder Returns bool ToString() public override string ToString() Returns string Operators operator ==(BanRequest?, BanRequest?) public static bool operator ==(BanRequest? left, BanRequest? right) Parameters left BanRequest right BanRequest Returns bool operator !=(BanRequest?, BanRequest?) public static bool operator !=(BanRequest? left, BanRequest? right) Parameters left BanRequest right BanRequest Returns bool" }, + "api/core/EchoHub.Core.DTOs.ChannelCryptoDto.html": { + "href": "api/core/EchoHub.Core.DTOs.ChannelCryptoDto.html", + "title": "Class ChannelCryptoDto | EchoHub Documentation", + "summary": "Class ChannelCryptoDto Namespace EchoHub.Core.DTOs Assembly EchoHub.Core.dll Public crypto metadata for a channel — enough for a client to derive its join credential from a passphrase. Never includes the wrapped room key. public record ChannelCryptoDto : IEquatable Inheritance object ChannelCryptoDto Implements IEquatable Inherited Members object.GetType() object.MemberwiseClone() object.Equals(object, object) object.ReferenceEquals(object, object) Constructors ChannelCryptoDto(ChannelCryptoDto) protected ChannelCryptoDto(ChannelCryptoDto original) Parameters original ChannelCryptoDto ChannelCryptoDto(bool, string?) Public crypto metadata for a channel — enough for a client to derive its join credential from a passphrase. Never includes the wrapped room key. public ChannelCryptoDto(bool IsEncrypted, string? EncryptionSalt) Parameters IsEncrypted bool EncryptionSalt string Properties EncryptionSalt public string? EncryptionSalt { get; init; } Property Value string EqualityContract protected virtual Type EqualityContract { get; } Property Value Type IsEncrypted public bool IsEncrypted { get; init; } Property Value bool Methods Deconstruct(out bool, out string?) public void Deconstruct(out bool IsEncrypted, out string? EncryptionSalt) Parameters IsEncrypted bool EncryptionSalt string Equals(ChannelCryptoDto?) public virtual bool Equals(ChannelCryptoDto? other) Parameters other ChannelCryptoDto Returns bool Equals(object?) public override bool Equals(object? obj) Parameters obj object Returns bool GetHashCode() public override int GetHashCode() Returns int PrintMembers(StringBuilder) protected virtual bool PrintMembers(StringBuilder builder) Parameters builder StringBuilder Returns bool ToString() public override string ToString() Returns string Operators operator ==(ChannelCryptoDto?, ChannelCryptoDto?) public static bool operator ==(ChannelCryptoDto? left, ChannelCryptoDto? right) Parameters left ChannelCryptoDto right ChannelCryptoDto Returns bool operator !=(ChannelCryptoDto?, ChannelCryptoDto?) public static bool operator !=(ChannelCryptoDto? left, ChannelCryptoDto? right) Parameters left ChannelCryptoDto right ChannelCryptoDto Returns bool" + }, "api/core/EchoHub.Core.DTOs.ChannelDto.html": { "href": "api/core/EchoHub.Core.DTOs.ChannelDto.html", "title": "Class ChannelDto | EchoHub Documentation", - "summary": "Class ChannelDto Namespace EchoHub.Core.DTOs Assembly EchoHub.Core.dll public record ChannelDto : IEquatable Inheritance object ChannelDto Implements IEquatable Inherited Members object.GetType() object.MemberwiseClone() object.Equals(object, object) object.ReferenceEquals(object, object) Constructors ChannelDto(ChannelDto) protected ChannelDto(ChannelDto original) Parameters original ChannelDto ChannelDto(Guid, string, string?, bool, int, DateTimeOffset) public ChannelDto(Guid Id, string Name, string? Topic, bool IsPublic, int MessageCount, DateTimeOffset CreatedAt) Parameters Id Guid Name string Topic string IsPublic bool MessageCount int CreatedAt DateTimeOffset Properties CreatedAt public DateTimeOffset CreatedAt { get; init; } Property Value DateTimeOffset EqualityContract protected virtual Type EqualityContract { get; } Property Value Type Id public Guid Id { get; init; } Property Value Guid IsPublic public bool IsPublic { get; init; } Property Value bool MessageCount public int MessageCount { get; init; } Property Value int Name public string Name { get; init; } Property Value string Topic public string? Topic { get; init; } Property Value string Methods Deconstruct(out Guid, out string, out string?, out bool, out int, out DateTimeOffset) public void Deconstruct(out Guid Id, out string Name, out string? Topic, out bool IsPublic, out int MessageCount, out DateTimeOffset CreatedAt) Parameters Id Guid Name string Topic string IsPublic bool MessageCount int CreatedAt DateTimeOffset Equals(ChannelDto?) public virtual bool Equals(ChannelDto? other) Parameters other ChannelDto Returns bool Equals(object?) public override bool Equals(object? obj) Parameters obj object Returns bool GetHashCode() public override int GetHashCode() Returns int PrintMembers(StringBuilder) protected virtual bool PrintMembers(StringBuilder builder) Parameters builder StringBuilder Returns bool ToString() public override string ToString() Returns string Operators operator ==(ChannelDto?, ChannelDto?) public static bool operator ==(ChannelDto? left, ChannelDto? right) Parameters left ChannelDto right ChannelDto Returns bool operator !=(ChannelDto?, ChannelDto?) public static bool operator !=(ChannelDto? left, ChannelDto? right) Parameters left ChannelDto right ChannelDto Returns bool" + "summary": "Class ChannelDto Namespace EchoHub.Core.DTOs Assembly EchoHub.Core.dll public record ChannelDto : IEquatable Inheritance object ChannelDto Implements IEquatable Inherited Members object.GetType() object.MemberwiseClone() object.Equals(object, object) object.ReferenceEquals(object, object) Constructors ChannelDto(ChannelDto) protected ChannelDto(ChannelDto original) Parameters original ChannelDto ChannelDto(Guid, string, string?, bool, int, DateTimeOffset, bool, bool) public ChannelDto(Guid Id, string Name, string? Topic, bool IsPublic, int MessageCount, DateTimeOffset CreatedAt, bool IsProtected = false, bool IsEncrypted = false) Parameters Id Guid Name string Topic string IsPublic bool MessageCount int CreatedAt DateTimeOffset IsProtected bool IsEncrypted bool Properties CreatedAt public DateTimeOffset CreatedAt { get; init; } Property Value DateTimeOffset EqualityContract protected virtual Type EqualityContract { get; } Property Value Type Id public Guid Id { get; init; } Property Value Guid IsEncrypted public bool IsEncrypted { get; init; } Property Value bool IsProtected public bool IsProtected { get; init; } Property Value bool IsPublic public bool IsPublic { get; init; } Property Value bool MessageCount public int MessageCount { get; init; } Property Value int Name public string Name { get; init; } Property Value string Topic public string? Topic { get; init; } Property Value string Methods Deconstruct(out Guid, out string, out string?, out bool, out int, out DateTimeOffset, out bool, out bool) public void Deconstruct(out Guid Id, out string Name, out string? Topic, out bool IsPublic, out int MessageCount, out DateTimeOffset CreatedAt, out bool IsProtected, out bool IsEncrypted) Parameters Id Guid Name string Topic string IsPublic bool MessageCount int CreatedAt DateTimeOffset IsProtected bool IsEncrypted bool Equals(ChannelDto?) public virtual bool Equals(ChannelDto? other) Parameters other ChannelDto Returns bool Equals(object?) public override bool Equals(object? obj) Parameters obj object Returns bool GetHashCode() public override int GetHashCode() Returns int PrintMembers(StringBuilder) protected virtual bool PrintMembers(StringBuilder builder) Parameters builder StringBuilder Returns bool ToString() public override string ToString() Returns string Operators operator ==(ChannelDto?, ChannelDto?) public static bool operator ==(ChannelDto? left, ChannelDto? right) Parameters left ChannelDto right ChannelDto Returns bool operator !=(ChannelDto?, ChannelDto?) public static bool operator !=(ChannelDto? left, ChannelDto? right) Parameters left ChannelDto right ChannelDto Returns bool" }, "api/core/EchoHub.Core.DTOs.ChannelError.html": { "href": "api/core/EchoHub.Core.DTOs.ChannelError.html", @@ -397,7 +457,7 @@ "api/core/EchoHub.Core.DTOs.CreateChannelRequest.html": { "href": "api/core/EchoHub.Core.DTOs.CreateChannelRequest.html", "title": "Class CreateChannelRequest | EchoHub Documentation", - "summary": "Class CreateChannelRequest Namespace EchoHub.Core.DTOs Assembly EchoHub.Core.dll public record CreateChannelRequest : IEquatable Inheritance object CreateChannelRequest Implements IEquatable Inherited Members object.GetType() object.MemberwiseClone() object.Equals(object, object) object.ReferenceEquals(object, object) Constructors CreateChannelRequest(CreateChannelRequest) protected CreateChannelRequest(CreateChannelRequest original) Parameters original CreateChannelRequest CreateChannelRequest(string, string?, bool) public CreateChannelRequest(string Name, string? Topic = null, bool IsPublic = true) Parameters Name string Topic string IsPublic bool Properties EqualityContract protected virtual Type EqualityContract { get; } Property Value Type IsPublic public bool IsPublic { get; init; } Property Value bool Name public string Name { get; init; } Property Value string Topic public string? Topic { get; init; } Property Value string Methods Deconstruct(out string, out string?, out bool) public void Deconstruct(out string Name, out string? Topic, out bool IsPublic) Parameters Name string Topic string IsPublic bool Equals(CreateChannelRequest?) public virtual bool Equals(CreateChannelRequest? other) Parameters other CreateChannelRequest Returns bool Equals(object?) public override bool Equals(object? obj) Parameters obj object Returns bool GetHashCode() public override int GetHashCode() Returns int PrintMembers(StringBuilder) protected virtual bool PrintMembers(StringBuilder builder) Parameters builder StringBuilder Returns bool ToString() public override string ToString() Returns string Operators operator ==(CreateChannelRequest?, CreateChannelRequest?) public static bool operator ==(CreateChannelRequest? left, CreateChannelRequest? right) Parameters left CreateChannelRequest right CreateChannelRequest Returns bool operator !=(CreateChannelRequest?, CreateChannelRequest?) public static bool operator !=(CreateChannelRequest? left, CreateChannelRequest? right) Parameters left CreateChannelRequest right CreateChannelRequest Returns bool" + "summary": "Class CreateChannelRequest Namespace EchoHub.Core.DTOs Assembly EchoHub.Core.dll public record CreateChannelRequest : IEquatable Inheritance object CreateChannelRequest Implements IEquatable Inherited Members object.GetType() object.MemberwiseClone() object.Equals(object, object) object.ReferenceEquals(object, object) Constructors CreateChannelRequest(CreateChannelRequest) protected CreateChannelRequest(CreateChannelRequest original) Parameters original CreateChannelRequest CreateChannelRequest(string, string?, bool, string?, string?, string?) public CreateChannelRequest(string Name, string? Topic = null, bool IsPublic = true, string? Password = null, string? EncryptionSalt = null, string? WrappedRoomKey = null) Parameters Name string Topic string IsPublic bool Password string EncryptionSalt string WrappedRoomKey string Properties EncryptionSalt public string? EncryptionSalt { get; init; } Property Value string EqualityContract protected virtual Type EqualityContract { get; } Property Value Type IsPublic public bool IsPublic { get; init; } Property Value bool Name public string Name { get; init; } Property Value string Password public string? Password { get; init; } Property Value string Topic public string? Topic { get; init; } Property Value string WrappedRoomKey public string? WrappedRoomKey { get; init; } Property Value string Methods Deconstruct(out string, out string?, out bool, out string?, out string?, out string?) public void Deconstruct(out string Name, out string? Topic, out bool IsPublic, out string? Password, out string? EncryptionSalt, out string? WrappedRoomKey) Parameters Name string Topic string IsPublic bool Password string EncryptionSalt string WrappedRoomKey string Equals(CreateChannelRequest?) public virtual bool Equals(CreateChannelRequest? other) Parameters other CreateChannelRequest Returns bool Equals(object?) public override bool Equals(object? obj) Parameters obj object Returns bool GetHashCode() public override int GetHashCode() Returns int PrintMembers(StringBuilder) protected virtual bool PrintMembers(StringBuilder builder) Parameters builder StringBuilder Returns bool ToString() public override string ToString() Returns string Operators operator ==(CreateChannelRequest?, CreateChannelRequest?) public static bool operator ==(CreateChannelRequest? left, CreateChannelRequest? right) Parameters left CreateChannelRequest right CreateChannelRequest Returns bool operator !=(CreateChannelRequest?, CreateChannelRequest?) public static bool operator !=(CreateChannelRequest? left, CreateChannelRequest? right) Parameters left CreateChannelRequest right CreateChannelRequest Returns bool" }, "api/core/EchoHub.Core.DTOs.EmbedDto.html": { "href": "api/core/EchoHub.Core.DTOs.EmbedDto.html", @@ -417,7 +477,7 @@ "api/core/EchoHub.Core.DTOs.JoinChannelResult.html": { "href": "api/core/EchoHub.Core.DTOs.JoinChannelResult.html", "title": "Class JoinChannelResult | EchoHub Documentation", - "summary": "Class JoinChannelResult Namespace EchoHub.Core.DTOs Assembly EchoHub.Core.dll public record JoinChannelResult : IEquatable Inheritance object JoinChannelResult Implements IEquatable Inherited Members object.GetType() object.MemberwiseClone() object.Equals(object, object) object.ReferenceEquals(object, object) Constructors JoinChannelResult(JoinChannelResult) protected JoinChannelResult(JoinChannelResult original) Parameters original JoinChannelResult JoinChannelResult(bool, List, string?) public JoinChannelResult(bool Success, List History, string? Error = null) Parameters Success bool History List Error string Properties EqualityContract protected virtual Type EqualityContract { get; } Property Value Type Error public string? Error { get; init; } Property Value string History public List History { get; init; } Property Value List Success public bool Success { get; init; } Property Value bool Methods Deconstruct(out bool, out List, out string?) public void Deconstruct(out bool Success, out List History, out string? Error) Parameters Success bool History List Error string Equals(JoinChannelResult?) public virtual bool Equals(JoinChannelResult? other) Parameters other JoinChannelResult Returns bool Equals(object?) public override bool Equals(object? obj) Parameters obj object Returns bool GetHashCode() public override int GetHashCode() Returns int PrintMembers(StringBuilder) protected virtual bool PrintMembers(StringBuilder builder) Parameters builder StringBuilder Returns bool ToString() public override string ToString() Returns string Operators operator ==(JoinChannelResult?, JoinChannelResult?) public static bool operator ==(JoinChannelResult? left, JoinChannelResult? right) Parameters left JoinChannelResult right JoinChannelResult Returns bool operator !=(JoinChannelResult?, JoinChannelResult?) public static bool operator !=(JoinChannelResult? left, JoinChannelResult? right) Parameters left JoinChannelResult right JoinChannelResult Returns bool" + "summary": "Class JoinChannelResult Namespace EchoHub.Core.DTOs Assembly EchoHub.Core.dll public record JoinChannelResult : IEquatable Inheritance object JoinChannelResult Implements IEquatable Inherited Members object.GetType() object.MemberwiseClone() object.Equals(object, object) object.ReferenceEquals(object, object) Constructors JoinChannelResult(JoinChannelResult) protected JoinChannelResult(JoinChannelResult original) Parameters original JoinChannelResult JoinChannelResult(bool, List, string?, bool, string?, string?) public JoinChannelResult(bool Success, List History, string? Error = null, bool PasswordRequired = false, string? EncryptionSalt = null, string? WrappedRoomKey = null) Parameters Success bool History List Error string PasswordRequired bool EncryptionSalt string WrappedRoomKey string Properties EncryptionSalt public string? EncryptionSalt { get; init; } Property Value string EqualityContract protected virtual Type EqualityContract { get; } Property Value Type Error public string? Error { get; init; } Property Value string History public List History { get; init; } Property Value List PasswordRequired public bool PasswordRequired { get; init; } Property Value bool Success public bool Success { get; init; } Property Value bool WrappedRoomKey public string? WrappedRoomKey { get; init; } Property Value string Methods Deconstruct(out bool, out List, out string?, out bool, out string?, out string?) public void Deconstruct(out bool Success, out List History, out string? Error, out bool PasswordRequired, out string? EncryptionSalt, out string? WrappedRoomKey) Parameters Success bool History List Error string PasswordRequired bool EncryptionSalt string WrappedRoomKey string Equals(JoinChannelResult?) public virtual bool Equals(JoinChannelResult? other) Parameters other JoinChannelResult Returns bool Equals(object?) public override bool Equals(object? obj) Parameters obj object Returns bool GetHashCode() public override int GetHashCode() Returns int PrintMembers(StringBuilder) protected virtual bool PrintMembers(StringBuilder builder) Parameters builder StringBuilder Returns bool ToString() public override string ToString() Returns string Operators operator ==(JoinChannelResult?, JoinChannelResult?) public static bool operator ==(JoinChannelResult? left, JoinChannelResult? right) Parameters left JoinChannelResult right JoinChannelResult Returns bool operator !=(JoinChannelResult?, JoinChannelResult?) public static bool operator !=(JoinChannelResult? left, JoinChannelResult? right) Parameters left JoinChannelResult right JoinChannelResult Returns bool" }, "api/core/EchoHub.Core.DTOs.KickRequest.html": { "href": "api/core/EchoHub.Core.DTOs.KickRequest.html", @@ -437,7 +497,7 @@ "api/core/EchoHub.Core.DTOs.MessageDto.html": { "href": "api/core/EchoHub.Core.DTOs.MessageDto.html", "title": "Class MessageDto | EchoHub Documentation", - "summary": "Class MessageDto Namespace EchoHub.Core.DTOs Assembly EchoHub.Core.dll public record MessageDto : IEquatable Inheritance object MessageDto Implements IEquatable Inherited Members object.GetType() object.MemberwiseClone() object.Equals(object, object) object.ReferenceEquals(object, object) Constructors MessageDto(MessageDto) protected MessageDto(MessageDto original) Parameters original MessageDto MessageDto(Guid, string, string, string?, string, MessageType, string?, string?, DateTimeOffset, long?, List?) public MessageDto(Guid Id, string Content, string SenderUsername, string? SenderNicknameColor, string ChannelName, MessageType Type, string? AttachmentUrl, string? AttachmentFileName, DateTimeOffset SentAt, long? AttachmentFileSize = null, List? Embeds = null) Parameters Id Guid Content string SenderUsername string SenderNicknameColor string ChannelName string Type MessageType AttachmentUrl string AttachmentFileName string SentAt DateTimeOffset AttachmentFileSize long? Embeds List Properties AttachmentFileName public string? AttachmentFileName { get; init; } Property Value string AttachmentFileSize public long? AttachmentFileSize { get; init; } Property Value long? AttachmentUrl public string? AttachmentUrl { get; init; } Property Value string ChannelName public string ChannelName { get; init; } Property Value string Content public string Content { get; init; } Property Value string Embeds public List? Embeds { get; init; } Property Value List EqualityContract protected virtual Type EqualityContract { get; } Property Value Type Id public Guid Id { get; init; } Property Value Guid SenderNicknameColor public string? SenderNicknameColor { get; init; } Property Value string SenderUsername public string SenderUsername { get; init; } Property Value string SentAt public DateTimeOffset SentAt { get; init; } Property Value DateTimeOffset Type public MessageType Type { get; init; } Property Value MessageType Methods Deconstruct(out Guid, out string, out string, out string?, out string, out MessageType, out string?, out string?, out DateTimeOffset, out long?, out List?) public void Deconstruct(out Guid Id, out string Content, out string SenderUsername, out string? SenderNicknameColor, out string ChannelName, out MessageType Type, out string? AttachmentUrl, out string? AttachmentFileName, out DateTimeOffset SentAt, out long? AttachmentFileSize, out List? Embeds) Parameters Id Guid Content string SenderUsername string SenderNicknameColor string ChannelName string Type MessageType AttachmentUrl string AttachmentFileName string SentAt DateTimeOffset AttachmentFileSize long? Embeds List Equals(MessageDto?) public virtual bool Equals(MessageDto? other) Parameters other MessageDto Returns bool Equals(object?) public override bool Equals(object? obj) Parameters obj object Returns bool GetHashCode() public override int GetHashCode() Returns int PrintMembers(StringBuilder) protected virtual bool PrintMembers(StringBuilder builder) Parameters builder StringBuilder Returns bool ToString() public override string ToString() Returns string Operators operator ==(MessageDto?, MessageDto?) public static bool operator ==(MessageDto? left, MessageDto? right) Parameters left MessageDto right MessageDto Returns bool operator !=(MessageDto?, MessageDto?) public static bool operator !=(MessageDto? left, MessageDto? right) Parameters left MessageDto right MessageDto Returns bool" + "summary": "Class MessageDto Namespace EchoHub.Core.DTOs Assembly EchoHub.Core.dll public record MessageDto : IEquatable Inheritance object MessageDto Implements IEquatable Inherited Members object.GetType() object.MemberwiseClone() object.Equals(object, object) object.ReferenceEquals(object, object) Constructors MessageDto(MessageDto) protected MessageDto(MessageDto original) Parameters original MessageDto MessageDto(Guid, string, string, string?, string, DateTimeOffset, List?, List?) public MessageDto(Guid Id, string Content, string SenderUsername, string? SenderNicknameColor, string ChannelName, DateTimeOffset SentAt, List? Attachments = null, List? Embeds = null) Parameters Id Guid Content string SenderUsername string SenderNicknameColor string ChannelName string SentAt DateTimeOffset Attachments List Embeds List Properties Attachments public List? Attachments { get; init; } Property Value List ChannelName public string ChannelName { get; init; } Property Value string Content public string Content { get; init; } Property Value string Embeds public List? Embeds { get; init; } Property Value List EqualityContract protected virtual Type EqualityContract { get; } Property Value Type Id public Guid Id { get; init; } Property Value Guid SenderNicknameColor public string? SenderNicknameColor { get; init; } Property Value string SenderUsername public string SenderUsername { get; init; } Property Value string SentAt public DateTimeOffset SentAt { get; init; } Property Value DateTimeOffset Methods Deconstruct(out Guid, out string, out string, out string?, out string, out DateTimeOffset, out List?, out List?) public void Deconstruct(out Guid Id, out string Content, out string SenderUsername, out string? SenderNicknameColor, out string ChannelName, out DateTimeOffset SentAt, out List? Attachments, out List? Embeds) Parameters Id Guid Content string SenderUsername string SenderNicknameColor string ChannelName string SentAt DateTimeOffset Attachments List Embeds List Equals(MessageDto?) public virtual bool Equals(MessageDto? other) Parameters other MessageDto Returns bool Equals(object?) public override bool Equals(object? obj) Parameters obj object Returns bool GetHashCode() public override int GetHashCode() Returns int PrintMembers(StringBuilder) protected virtual bool PrintMembers(StringBuilder builder) Parameters builder StringBuilder Returns bool ToString() public override string ToString() Returns string Operators operator ==(MessageDto?, MessageDto?) public static bool operator ==(MessageDto? left, MessageDto? right) Parameters left MessageDto right MessageDto Returns bool operator !=(MessageDto?, MessageDto?) public static bool operator !=(MessageDto? left, MessageDto? right) Parameters left MessageDto right MessageDto Returns bool" }, "api/core/EchoHub.Core.DTOs.MuteRequest.html": { "href": "api/core/EchoHub.Core.DTOs.MuteRequest.html", @@ -459,6 +519,11 @@ "title": "Class RegisterRequest | EchoHub Documentation", "summary": "Class RegisterRequest Namespace EchoHub.Core.DTOs Assembly EchoHub.Core.dll public record RegisterRequest : IEquatable Inheritance object RegisterRequest Implements IEquatable Inherited Members object.GetType() object.MemberwiseClone() object.Equals(object, object) object.ReferenceEquals(object, object) Constructors RegisterRequest(RegisterRequest) protected RegisterRequest(RegisterRequest original) Parameters original RegisterRequest RegisterRequest(string, string, string?) public RegisterRequest(string Username, string Password, string? DisplayName = null) Parameters Username string Password string DisplayName string Properties DisplayName public string? DisplayName { get; init; } Property Value string EqualityContract protected virtual Type EqualityContract { get; } Property Value Type Password public string Password { get; init; } Property Value string Username public string Username { get; init; } Property Value string Methods Deconstruct(out string, out string, out string?) public void Deconstruct(out string Username, out string Password, out string? DisplayName) Parameters Username string Password string DisplayName string Equals(RegisterRequest?) public virtual bool Equals(RegisterRequest? other) Parameters other RegisterRequest Returns bool Equals(object?) public override bool Equals(object? obj) Parameters obj object Returns bool GetHashCode() public override int GetHashCode() Returns int PrintMembers(StringBuilder) protected virtual bool PrintMembers(StringBuilder builder) Parameters builder StringBuilder Returns bool ToString() public override string ToString() Returns string Operators operator ==(RegisterRequest?, RegisterRequest?) public static bool operator ==(RegisterRequest? left, RegisterRequest? right) Parameters left RegisterRequest right RegisterRequest Returns bool operator !=(RegisterRequest?, RegisterRequest?) public static bool operator !=(RegisterRequest? left, RegisterRequest? right) Parameters left RegisterRequest right RegisterRequest Returns bool" }, + "api/core/EchoHub.Core.DTOs.RekeyChannelRequest.html": { + "href": "api/core/EchoHub.Core.DTOs.RekeyChannelRequest.html", + "title": "Class RekeyChannelRequest | EchoHub Documentation", + "summary": "Class RekeyChannelRequest Namespace EchoHub.Core.DTOs Assembly EchoHub.Core.dll Passphrase change for an encrypted channel: the client proves knowledge of the old passphrase (old auth key), then supplies the re-wrapped room key under the new one. public record RekeyChannelRequest : IEquatable Inheritance object RekeyChannelRequest Implements IEquatable Inherited Members object.GetType() object.MemberwiseClone() object.Equals(object, object) object.ReferenceEquals(object, object) Constructors RekeyChannelRequest(RekeyChannelRequest) protected RekeyChannelRequest(RekeyChannelRequest original) Parameters original RekeyChannelRequest RekeyChannelRequest(string, string, string, string) Passphrase change for an encrypted channel: the client proves knowledge of the old passphrase (old auth key), then supplies the re-wrapped room key under the new one. public RekeyChannelRequest(string OldPassword, string NewPassword, string NewEncryptionSalt, string NewWrappedRoomKey) Parameters OldPassword string NewPassword string NewEncryptionSalt string NewWrappedRoomKey string Properties EqualityContract protected virtual Type EqualityContract { get; } Property Value Type NewEncryptionSalt public string NewEncryptionSalt { get; init; } Property Value string NewPassword public string NewPassword { get; init; } Property Value string NewWrappedRoomKey public string NewWrappedRoomKey { get; init; } Property Value string OldPassword public string OldPassword { get; init; } Property Value string Methods Deconstruct(out string, out string, out string, out string) public void Deconstruct(out string OldPassword, out string NewPassword, out string NewEncryptionSalt, out string NewWrappedRoomKey) Parameters OldPassword string NewPassword string NewEncryptionSalt string NewWrappedRoomKey string Equals(RekeyChannelRequest?) public virtual bool Equals(RekeyChannelRequest? other) Parameters other RekeyChannelRequest Returns bool Equals(object?) public override bool Equals(object? obj) Parameters obj object Returns bool GetHashCode() public override int GetHashCode() Returns int PrintMembers(StringBuilder) protected virtual bool PrintMembers(StringBuilder builder) Parameters builder StringBuilder Returns bool ToString() public override string ToString() Returns string Operators operator ==(RekeyChannelRequest?, RekeyChannelRequest?) public static bool operator ==(RekeyChannelRequest? left, RekeyChannelRequest? right) Parameters left RekeyChannelRequest right RekeyChannelRequest Returns bool operator !=(RekeyChannelRequest?, RekeyChannelRequest?) public static bool operator !=(RekeyChannelRequest? left, RekeyChannelRequest? right) Parameters left RekeyChannelRequest right RekeyChannelRequest Returns bool" + }, "api/core/EchoHub.Core.DTOs.SendMessageRequest.html": { "href": "api/core/EchoHub.Core.DTOs.SendMessageRequest.html", "title": "Class SendMessageRequest | EchoHub Documentation", @@ -517,12 +582,22 @@ "api/core/EchoHub.Core.DTOs.html": { "href": "api/core/EchoHub.Core.DTOs.html", "title": "Namespace EchoHub.Core.DTOs | EchoHub Documentation", - "summary": "Namespace EchoHub.Core.DTOs Classes ApiResponse ApiResponse AssignRoleRequest AvatarUploadResponse BanRequest ChannelDto ChannelOperationResult CreateChannelRequest EmbedDto EncryptionKeyResponse ErrorResponse JoinChannelResult KickRequest LoginRequest LoginResponse MessageDto MuteRequest PaginatedResponse RefreshRequest RegisterRequest SendMessageRequest SendUrlRequest ServerStatusDto UpdateProfileRequest UpdateStatusRequest UpdateTopicRequest UserDto UserOperationResult UserPresenceDto UserProfileDto Enums ChannelError UserError" + "summary": "Namespace EchoHub.Core.DTOs Classes ApiResponse ApiResponse AssignRoleRequest AttachmentDto A file attached to a message. AsciiPreview holds the color-tag art for images (null otherwise). For end-to-end encrypted channels the content behind Url and the preview are ciphertext the server cannot read. AvatarUploadResponse BanRequest ChannelCryptoDto Public crypto metadata for a channel — enough for a client to derive its join credential from a passphrase. Never includes the wrapped room key. ChannelDto ChannelOperationResult CreateChannelRequest EmbedDto EncryptionKeyResponse ErrorResponse JoinChannelResult KickRequest LoginRequest LoginResponse MessageDto MuteRequest PaginatedResponse RefreshRequest RegisterRequest RekeyChannelRequest Passphrase change for an encrypted channel: the client proves knowledge of the old passphrase (old auth key), then supplies the re-wrapped room key under the new one. SendMessageRequest SendUrlRequest ServerStatusDto UpdateProfileRequest UpdateStatusRequest UpdateTopicRequest UserDto UserOperationResult UserPresenceDto UserProfileDto Enums ChannelError UserError" + }, + "api/core/EchoHub.Core.Models.Attachment.html": { + "href": "api/core/EchoHub.Core.Models.Attachment.html", + "title": "Class Attachment | EchoHub Documentation", + "summary": "Class Attachment Namespace EchoHub.Core.Models Assembly EchoHub.Core.dll A file attached to a message (image, audio, or any file). A message may carry zero or more attachments alongside its text content (Discord-style). public class Attachment Inheritance object Attachment Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors Attachment() public Attachment() Properties AsciiPreview Rendered ASCII-art preview for images (color-tag format). Null for audio/files. Stored encrypted-at-rest when database encryption is enabled, and room-encrypted for end-to-end encrypted channels. public string? AsciiPreview { get; set; } Property Value string FileName public required string FileName { get; set; } Property Value string FileSize Stored blob size in bytes (ciphertext size for encrypted channels). public long FileSize { get; set; } Property Value long Id public Guid Id { get; set; } Property Value Guid Kind public AttachmentKind Kind { get; set; } Property Value AttachmentKind Message public Message? Message { get; set; } Property Value Message MessageId public Guid MessageId { get; set; } Property Value Guid Url Relative download URL, e.g. /api/files/{fileId}. public required string Url { get; set; } Property Value string" + }, + "api/core/EchoHub.Core.Models.AttachmentKind.html": { + "href": "api/core/EchoHub.Core.Models.AttachmentKind.html", + "title": "Enum AttachmentKind | EchoHub Documentation", + "summary": "Enum AttachmentKind Namespace EchoHub.Core.Models Assembly EchoHub.Core.dll The kind of a message attachment. Determines how the client renders it (ASCII preview for images, a play affordance for audio, a download line for files). public enum AttachmentKind Fields Audio = 1 File = 2 Image = 0" }, "api/core/EchoHub.Core.Models.Channel.html": { "href": "api/core/EchoHub.Core.Models.Channel.html", "title": "Class Channel | EchoHub Documentation", - "summary": "Class Channel Namespace EchoHub.Core.Models Assembly EchoHub.Core.dll public class Channel Inheritance object Channel Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors Channel() public Channel() Properties CreatedAt public DateTimeOffset CreatedAt { get; set; } Property Value DateTimeOffset CreatedByUserId public Guid CreatedByUserId { get; set; } Property Value Guid Id public Guid Id { get; set; } Property Value Guid IsPublic public bool IsPublic { get; set; } Property Value bool Messages public List Messages { get; set; } Property Value List Name public required string Name { get; set; } Property Value string Topic public string? Topic { get; set; } Property Value string" + "summary": "Class Channel Namespace EchoHub.Core.Models Assembly EchoHub.Core.dll public class Channel Inheritance object Channel Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors Channel() public Channel() Properties CreatedAt public DateTimeOffset CreatedAt { get; set; } Property Value DateTimeOffset CreatedByUserId public Guid CreatedByUserId { get; set; } Property Value Guid EncryptionSalt public string? EncryptionSalt { get; set; } Property Value string Id public Guid Id { get; set; } Property Value Guid IsPublic public bool IsPublic { get; set; } Property Value bool Messages public List Messages { get; set; } Property Value List Name public required string Name { get; set; } Property Value string PasswordHash public string? PasswordHash { get; set; } Property Value string Topic public string? Topic { get; set; } Property Value string WrappedRoomKey public string? WrappedRoomKey { get; set; } Property Value string" }, "api/core/EchoHub.Core.Models.ChannelMembership.html": { "href": "api/core/EchoHub.Core.Models.ChannelMembership.html", @@ -532,7 +607,7 @@ "api/core/EchoHub.Core.Models.Message.html": { "href": "api/core/EchoHub.Core.Models.Message.html", "title": "Class Message | EchoHub Documentation", - "summary": "Class Message Namespace EchoHub.Core.Models Assembly EchoHub.Core.dll public class Message Inheritance object Message Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors Message() public Message() Properties AttachmentFileName public string? AttachmentFileName { get; set; } Property Value string AttachmentFileSize public long? AttachmentFileSize { get; set; } Property Value long? AttachmentUrl public string? AttachmentUrl { get; set; } Property Value string Channel public Channel? Channel { get; set; } Property Value Channel ChannelId public Guid ChannelId { get; set; } Property Value Guid Content public required string Content { get; set; } Property Value string EmbedJson public string? EmbedJson { get; set; } Property Value string Id public Guid Id { get; set; } Property Value Guid SenderUserId public Guid SenderUserId { get; set; } Property Value Guid SenderUsername public required string SenderUsername { get; set; } Property Value string SentAt public DateTimeOffset SentAt { get; set; } Property Value DateTimeOffset Type public MessageType Type { get; set; } Property Value MessageType" + "summary": "Class Message Namespace EchoHub.Core.Models Assembly EchoHub.Core.dll public class Message Inheritance object Message Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors Message() public Message() Properties AttachmentFileName public string? AttachmentFileName { get; set; } Property Value string AttachmentFileSize public long? AttachmentFileSize { get; set; } Property Value long? AttachmentUrl public string? AttachmentUrl { get; set; } Property Value string Attachments Files attached to this message. Empty for a plain text message. public List Attachments { get; set; } Property Value List Channel public Channel? Channel { get; set; } Property Value Channel ChannelId public Guid ChannelId { get; set; } Property Value Guid Content The message text/caption. May be empty when the message only carries attachments. public required string Content { get; set; } Property Value string EmbedJson public string? EmbedJson { get; set; } Property Value string Id public Guid Id { get; set; } Property Value Guid SenderUserId public Guid SenderUserId { get; set; } Property Value Guid SenderUsername public required string SenderUsername { get; set; } Property Value string SentAt public DateTimeOffset SentAt { get; set; } Property Value DateTimeOffset Type public MessageType Type { get; set; } Property Value MessageType" }, "api/core/EchoHub.Core.Models.MessageType.html": { "href": "api/core/EchoHub.Core.Models.MessageType.html", @@ -562,7 +637,37 @@ "api/core/EchoHub.Core.Models.html": { "href": "api/core/EchoHub.Core.Models.html", "title": "Namespace EchoHub.Core.Models | EchoHub Documentation", - "summary": "Namespace EchoHub.Core.Models Classes Channel ChannelMembership Message RefreshToken User Enums MessageType ServerRole UserStatus" + "summary": "Namespace EchoHub.Core.Models Classes Attachment A file attached to a message (image, audio, or any file). A message may carry zero or more attachments alongside its text content (Discord-style). Channel ChannelMembership Message RefreshToken User Enums AttachmentKind The kind of a message attachment. Determines how the client renders it (ASCII preview for images, a play affordance for audio, a download line for files). MessageType ServerRole UserStatus" + }, + "api/core/EchoHub.Core.Security.RoomCrypto.DerivedKeys.html": { + "href": "api/core/EchoHub.Core.Security.RoomCrypto.DerivedKeys.html", + "title": "Class RoomCrypto.DerivedKeys | EchoHub Documentation", + "summary": "Class RoomCrypto.DerivedKeys Namespace EchoHub.Core.Security Assembly EchoHub.Core.dll public sealed record RoomCrypto.DerivedKeys : IEquatable Inheritance object RoomCrypto.DerivedKeys Implements IEquatable Inherited Members object.GetType() object.Equals(object, object) object.ReferenceEquals(object, object) Constructors DerivedKeys(string, byte[]) public DerivedKeys(string AuthKeyHex, byte[] KeyEncryptionKey) Parameters AuthKeyHex string KeyEncryptionKey byte[] Properties AuthKeyHex public string AuthKeyHex { get; init; } Property Value string KeyEncryptionKey public byte[] KeyEncryptionKey { get; init; } Property Value byte[] Methods Deconstruct(out string, out byte[]) public void Deconstruct(out string AuthKeyHex, out byte[] KeyEncryptionKey) Parameters AuthKeyHex string KeyEncryptionKey byte[] Equals(DerivedKeys?) public bool Equals(RoomCrypto.DerivedKeys? other) Parameters other RoomCrypto.DerivedKeys 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 ==(DerivedKeys?, DerivedKeys?) public static bool operator ==(RoomCrypto.DerivedKeys? left, RoomCrypto.DerivedKeys? right) Parameters left RoomCrypto.DerivedKeys right RoomCrypto.DerivedKeys Returns bool operator !=(DerivedKeys?, DerivedKeys?) public static bool operator !=(RoomCrypto.DerivedKeys? left, RoomCrypto.DerivedKeys? right) Parameters left RoomCrypto.DerivedKeys right RoomCrypto.DerivedKeys Returns bool" + }, + "api/core/EchoHub.Core.Security.RoomCrypto.html": { + "href": "api/core/EchoHub.Core.Security.RoomCrypto.html", + "title": "Class RoomCrypto | EchoHub Documentation", + "summary": "Class RoomCrypto Namespace EchoHub.Core.Security Assembly EchoHub.Core.dll Client-side envelope encryption for private (end-to-end encrypted) channels. Design: at creation the client generates a random 256-bit room content key (RCK) that encrypts all room content. The RCK is stored on the server wrapped (AES-GCM encrypted) by a key derived from the passphrase, next to a BCrypt hash of a separately derived auth key used as the join gate. The passphrase, the key-encryption key, and the RCK never leave the client, so the server can gate joins and count/measure content without being able to read it. Changing the passphrase only re-wraps the RCK — history is never re-encrypted. Derivation: PBKDF2-SHA256(passphrase, salt, 210000 iterations) → 64 bytes; first 32 bytes are the auth key (sent to the server as lowercase hex), last 32 bytes are the key-encryption key (never sent). public static class RoomCrypto Inheritance object RoomCrypto Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Fields CiphertextPrefix public const string CiphertextPrefix = \"$RC1$\" Field Value string Methods DecryptBytes(byte[], byte[]) Decrypts a blob produced by EncryptBytes(byte[], byte[]). Throws System.Security.Cryptography.CryptographicException on key mismatch. public static byte[] DecryptBytes(byte[] blob, byte[] key) Parameters blob byte[] key byte[] Returns byte[] DeriveKeys(string, byte[]) Derives the auth key (join gate credential) and key-encryption key from a passphrase. public static RoomCrypto.DerivedKeys DeriveKeys(string passphrase, byte[] salt) Parameters passphrase string salt byte[] Returns RoomCrypto.DerivedKeys EncryptBytes(byte[], byte[]) Encrypts a binary blob (file contents) with the room key: nonce||tag||ciphertext. public static byte[] EncryptBytes(byte[] plaintext, byte[] key) Parameters plaintext byte[] key byte[] Returns byte[] EncryptText(string, byte[]) Encrypts UTF-8 text with the room key. Output: $RC1$base64(nonce||tag||ciphertext). public static string EncryptText(string plaintext, byte[] key) Parameters plaintext string key byte[] Returns string GenerateRoomKey() public static byte[] GenerateRoomKey() Returns byte[] GenerateSalt() public static byte[] GenerateSalt() Returns byte[] IsRoomCiphertext(string?) public static bool IsRoomCiphertext(string? content) Parameters content string Returns bool TryDecryptText(string, byte[], out string) Decrypts text produced by EncryptText(string, byte[]). Returns false when the input is not room ciphertext or the key does not match. public static bool TryDecryptText(string content, byte[] key, out string plaintext) Parameters content string key byte[] plaintext string Returns bool TryUnwrapRoomKey(string, byte[], out byte[]) Unwraps the stored room content key. Returns false when the KEK (passphrase) is wrong. public static bool TryUnwrapRoomKey(string wrappedRoomKey, byte[] kek, out byte[] roomKey) Parameters wrappedRoomKey string kek byte[] roomKey byte[] Returns bool WrapRoomKey(byte[], byte[]) Wraps the room content key under the key-encryption key for server storage. public static string WrapRoomKey(byte[] roomKey, byte[] kek) Parameters roomKey byte[] kek byte[] Returns string" + }, + "api/core/EchoHub.Core.Security.html": { + "href": "api/core/EchoHub.Core.Security.html", + "title": "Namespace EchoHub.Core.Security | EchoHub Documentation", + "summary": "Namespace EchoHub.Core.Security Classes RoomCrypto Client-side envelope encryption for private (end-to-end encrypted) channels. Design: at creation the client generates a random 256-bit room content key (RCK) that encrypts all room content. The RCK is stored on the server wrapped (AES-GCM encrypted) by a key derived from the passphrase, next to a BCrypt hash of a separately derived auth key used as the join gate. The passphrase, the key-encryption key, and the RCK never leave the client, so the server can gate joins and count/measure content without being able to read it. Changing the passphrase only re-wraps the RCK — history is never re-encrypted. Derivation: PBKDF2-SHA256(passphrase, salt, 210000 iterations) → 64 bytes; first 32 bytes are the auth key (sent to the server as lowercase hex), last 32 bytes are the key-encryption key (never sent). RoomCrypto.DerivedKeys" + }, + "api/core/EchoHub.Core.Services.FileValidationHelper.html": { + "href": "api/core/EchoHub.Core.Services.FileValidationHelper.html", + "title": "Class FileValidationHelper | EchoHub Documentation", + "summary": "Class FileValidationHelper Namespace EchoHub.Core.Services Assembly EchoHub.Core.dll public static class FileValidationHelper Inheritance object FileValidationHelper Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Methods IsAudioFile(string) Checks whether the file name has a recognized audio extension. public static bool IsAudioFile(string fileName) Parameters fileName string Returns bool IsValidImage(Stream) Validates that a stream contains a recognized image format by checking magic bytes. The stream position is reset to the beginning after validation. public static bool IsValidImage(Stream stream) Parameters stream Stream Returns bool" + }, + "api/core/EchoHub.Core.Services.ImageToAsciiService.html": { + "href": "api/core/EchoHub.Core.Services.ImageToAsciiService.html", + "title": "Class ImageToAsciiService | EchoHub Documentation", + "summary": "Class ImageToAsciiService Namespace EchoHub.Core.Services Assembly EchoHub.Core.dll public class ImageToAsciiService Inheritance object ImageToAsciiService Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors ImageToAsciiService() public ImageToAsciiService() Methods ConvertToAscii(Stream, int, int) Converts an image to ASCII art using half-block characters (▀▄█) with printable color tags for 2x vertical resolution. Each character cell represents two vertical pixels. Format: {F:RRGGBB} foreground, {B:RRGGBB} background, {X} reset. Uses only printable ASCII — no terminal escape bytes. public string ConvertToAscii(Stream imageStream, int width = 80, int height = 80) Parameters imageStream Stream width int height int Returns string GetDimensions(string?) Returns (width, height) dimensions for the given size code. s = small (40x40), m = medium/default (80x80), l = large (120x120). public static (int Width, int Height) GetDimensions(string? size) Parameters size string Returns (int Width, int Height)" + }, + "api/core/EchoHub.Core.Services.html": { + "href": "api/core/EchoHub.Core.Services.html", + "title": "Namespace EchoHub.Core.Services | EchoHub Documentation", + "summary": "Namespace EchoHub.Core.Services Classes FileValidationHelper ImageToAsciiService" }, "api/index.html": { "href": "api/index.html", @@ -607,7 +712,7 @@ "api/server-irc/EchoHub.Server.Irc.IrcNumericReply.html": { "href": "api/server-irc/EchoHub.Server.Irc.IrcNumericReply.html", "title": "Class IrcNumericReply | EchoHub Documentation", - "summary": "Class IrcNumericReply Namespace EchoHub.Server.Irc Assembly EchoHub.Server.Irc.dll public static class IrcNumericReply Inheritance object IrcNumericReply Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Fields ERR_ALREADYREGISTERED public const string ERR_ALREADYREGISTERED = \"462\" Field Value string ERR_CANNOTSENDTOCHAN public const string ERR_CANNOTSENDTOCHAN = \"404\" Field Value string ERR_CHANOPRIVSNEEDED public const string ERR_CHANOPRIVSNEEDED = \"482\" Field Value string ERR_ERRONEUSNICKNAME public const string ERR_ERRONEUSNICKNAME = \"432\" Field Value string ERR_NEEDMOREPARAMS public const string ERR_NEEDMOREPARAMS = \"461\" Field Value string ERR_NICKNAMEINUSE public const string ERR_NICKNAMEINUSE = \"433\" Field Value string ERR_NOMOTD public const string ERR_NOMOTD = \"422\" Field Value string ERR_NONICKNAMEGIVEN public const string ERR_NONICKNAMEGIVEN = \"431\" Field Value string ERR_NOSUCHCHANNEL public const string ERR_NOSUCHCHANNEL = \"403\" Field Value string ERR_NOSUCHNICK public const string ERR_NOSUCHNICK = \"401\" Field Value string ERR_NOTONCHANNEL public const string ERR_NOTONCHANNEL = \"442\" Field Value string ERR_NOTREGISTERED public const string ERR_NOTREGISTERED = \"451\" Field Value string ERR_PASSWDMISMATCH public const string ERR_PASSWDMISMATCH = \"464\" Field Value string ERR_SASLFAIL public const string ERR_SASLFAIL = \"904\" Field Value string ERR_UNKNOWNCOMMAND public const string ERR_UNKNOWNCOMMAND = \"421\" Field Value string RPL_AWAY public const string RPL_AWAY = \"301\" Field Value string RPL_CHANNELMODEIS public const string RPL_CHANNELMODEIS = \"324\" Field Value string RPL_CREATED public const string RPL_CREATED = \"003\" Field Value string RPL_ENDOFMOTD public const string RPL_ENDOFMOTD = \"376\" Field Value string RPL_ENDOFNAMES public const string RPL_ENDOFNAMES = \"366\" Field Value string RPL_ENDOFWHO public const string RPL_ENDOFWHO = \"315\" Field Value string RPL_ENDOFWHOIS public const string RPL_ENDOFWHOIS = \"318\" Field Value string RPL_ISUPPORT public const string RPL_ISUPPORT = \"005\" Field Value string RPL_LIST public const string RPL_LIST = \"322\" Field Value string RPL_LISTEND public const string RPL_LISTEND = \"323\" Field Value string RPL_LOGGEDIN public const string RPL_LOGGEDIN = \"900\" Field Value string RPL_MOTD public const string RPL_MOTD = \"372\" Field Value string RPL_MOTDSTART public const string RPL_MOTDSTART = \"375\" Field Value string RPL_MYINFO public const string RPL_MYINFO = \"004\" Field Value string RPL_NAMREPLY public const string RPL_NAMREPLY = \"353\" Field Value string RPL_NOTOPIC public const string RPL_NOTOPIC = \"331\" Field Value string RPL_NOWAWAY public const string RPL_NOWAWAY = \"306\" Field Value string RPL_SASLSUCCESS public const string RPL_SASLSUCCESS = \"903\" Field Value string RPL_TOPIC public const string RPL_TOPIC = \"332\" Field Value string RPL_UMODEIS public const string RPL_UMODEIS = \"221\" Field Value string RPL_UNAWAY public const string RPL_UNAWAY = \"305\" Field Value string RPL_WELCOME public const string RPL_WELCOME = \"001\" Field Value string RPL_WHOISCHANNELS public const string RPL_WHOISCHANNELS = \"319\" Field Value string RPL_WHOISIDLE public const string RPL_WHOISIDLE = \"317\" Field Value string RPL_WHOISSERVER public const string RPL_WHOISSERVER = \"312\" Field Value string RPL_WHOISUSER public const string RPL_WHOISUSER = \"311\" Field Value string RPL_WHOREPLY public const string RPL_WHOREPLY = \"352\" Field Value string RPL_YOURHOST public const string RPL_YOURHOST = \"002\" Field Value string" + "summary": "Class IrcNumericReply Namespace EchoHub.Server.Irc Assembly EchoHub.Server.Irc.dll public static class IrcNumericReply Inheritance object IrcNumericReply Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Fields ERR_ALREADYREGISTERED public const string ERR_ALREADYREGISTERED = \"462\" Field Value string ERR_BADCHANNELKEY public const string ERR_BADCHANNELKEY = \"475\" Field Value string ERR_CANNOTSENDTOCHAN public const string ERR_CANNOTSENDTOCHAN = \"404\" Field Value string ERR_CHANOPRIVSNEEDED public const string ERR_CHANOPRIVSNEEDED = \"482\" Field Value string ERR_ERRONEUSNICKNAME public const string ERR_ERRONEUSNICKNAME = \"432\" Field Value string ERR_KEYSET public const string ERR_KEYSET = \"467\" Field Value string ERR_NEEDMOREPARAMS public const string ERR_NEEDMOREPARAMS = \"461\" Field Value string ERR_NICKNAMEINUSE public const string ERR_NICKNAMEINUSE = \"433\" Field Value string ERR_NOMOTD public const string ERR_NOMOTD = \"422\" Field Value string ERR_NONICKNAMEGIVEN public const string ERR_NONICKNAMEGIVEN = \"431\" Field Value string ERR_NOSUCHCHANNEL public const string ERR_NOSUCHCHANNEL = \"403\" Field Value string ERR_NOSUCHNICK public const string ERR_NOSUCHNICK = \"401\" Field Value string ERR_NOTONCHANNEL public const string ERR_NOTONCHANNEL = \"442\" Field Value string ERR_NOTREGISTERED public const string ERR_NOTREGISTERED = \"451\" Field Value string ERR_PASSWDMISMATCH public const string ERR_PASSWDMISMATCH = \"464\" Field Value string ERR_SASLFAIL public const string ERR_SASLFAIL = \"904\" Field Value string ERR_UNKNOWNCOMMAND public const string ERR_UNKNOWNCOMMAND = \"421\" Field Value string ERR_UNKNOWNMODE public const string ERR_UNKNOWNMODE = \"472\" Field Value string RPL_AWAY public const string RPL_AWAY = \"301\" Field Value string RPL_CHANNELMODEIS public const string RPL_CHANNELMODEIS = \"324\" Field Value string RPL_CREATED public const string RPL_CREATED = \"003\" Field Value string RPL_ENDOFBANLIST public const string RPL_ENDOFBANLIST = \"368\" Field Value string RPL_ENDOFMOTD public const string RPL_ENDOFMOTD = \"376\" Field Value string RPL_ENDOFNAMES public const string RPL_ENDOFNAMES = \"366\" Field Value string RPL_ENDOFWHO public const string RPL_ENDOFWHO = \"315\" Field Value string RPL_ENDOFWHOIS public const string RPL_ENDOFWHOIS = \"318\" Field Value string RPL_ISUPPORT public const string RPL_ISUPPORT = \"005\" Field Value string RPL_LIST public const string RPL_LIST = \"322\" Field Value string RPL_LISTEND public const string RPL_LISTEND = \"323\" Field Value string RPL_LOGGEDIN public const string RPL_LOGGEDIN = \"900\" Field Value string RPL_MOTD public const string RPL_MOTD = \"372\" Field Value string RPL_MOTDSTART public const string RPL_MOTDSTART = \"375\" Field Value string RPL_MYINFO public const string RPL_MYINFO = \"004\" Field Value string RPL_NAMREPLY public const string RPL_NAMREPLY = \"353\" Field Value string RPL_NOTOPIC public const string RPL_NOTOPIC = \"331\" Field Value string RPL_NOWAWAY public const string RPL_NOWAWAY = \"306\" Field Value string RPL_SASLSUCCESS public const string RPL_SASLSUCCESS = \"903\" Field Value string RPL_TOPIC public const string RPL_TOPIC = \"332\" Field Value string RPL_UMODEIS public const string RPL_UMODEIS = \"221\" Field Value string RPL_UNAWAY public const string RPL_UNAWAY = \"305\" Field Value string RPL_WELCOME public const string RPL_WELCOME = \"001\" Field Value string RPL_WHOISCHANNELS public const string RPL_WHOISCHANNELS = \"319\" Field Value string RPL_WHOISIDLE public const string RPL_WHOISIDLE = \"317\" Field Value string RPL_WHOISSERVER public const string RPL_WHOISSERVER = \"312\" Field Value string RPL_WHOISUSER public const string RPL_WHOISUSER = \"311\" Field Value string RPL_WHOREPLY public const string RPL_WHOREPLY = \"352\" Field Value string RPL_YOURHOST public const string RPL_YOURHOST = \"002\" Field Value string" }, "api/server-irc/EchoHub.Server.Irc.IrcOptions.html": { "href": "api/server-irc/EchoHub.Server.Irc.IrcOptions.html", @@ -642,7 +747,7 @@ "api/server/EchoHub.Server.Controllers.ChannelsController.html": { "href": "api/server/EchoHub.Server.Controllers.ChannelsController.html", "title": "Class ChannelsController | EchoHub Documentation", - "summary": "Class ChannelsController Namespace EchoHub.Server.Controllers Assembly EchoHub.Server.dll [ApiController] [Route(\"api/channels\")] [Authorize] [EnableRateLimiting(\"general\")] public class ChannelsController : ControllerBase Inheritance object ControllerBase ChannelsController Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors ChannelsController(IChannelService, EchoHubDbContext, FileStorageService, ImageToAsciiService, IHttpClientFactory, IChatService, IMessageEncryptionService) public ChannelsController(IChannelService channelService, EchoHubDbContext db, FileStorageService fileStorage, ImageToAsciiService asciiService, IHttpClientFactory httpClientFactory, IChatService chatService, IMessageEncryptionService encryption) Parameters channelService IChannelService db EchoHubDbContext fileStorage FileStorageService asciiService ImageToAsciiService httpClientFactory IHttpClientFactory chatService IChatService encryption IMessageEncryptionService Methods CreateChannel(CreateChannelRequest) [HttpPost] public Task CreateChannel(CreateChannelRequest request) Parameters request CreateChannelRequest Returns Task DeleteChannel(string) [HttpDelete(\"{channel}\")] public Task DeleteChannel(string channel) Parameters channel string Returns Task GetChannels(int, int) [HttpGet] public Task GetChannels(int offset = 0, int limit = 50) Parameters offset int limit int Returns Task SendUrl(string, SendUrlRequest, string?) [HttpPost(\"{channel}/send-url\")] [EnableRateLimiting(\"upload\")] public Task SendUrl(string channel, SendUrlRequest request, string? size = null) Parameters channel string request SendUrlRequest size string Returns Task UpdateTopic(string, UpdateTopicRequest) [HttpPut(\"{channel}/topic\")] public Task UpdateTopic(string channel, UpdateTopicRequest request) Parameters channel string request UpdateTopicRequest Returns Task Upload(string, string?) [HttpPost(\"{channel}/upload\")] [EnableRateLimiting(\"upload\")] [RequestSizeLimit(104857600)] [RequestFormLimits(MultipartBodyLengthLimit = 104857600)] public Task Upload(string channel, string? size = null) Parameters channel string size string Returns Task" + "summary": "Class ChannelsController Namespace EchoHub.Server.Controllers Assembly EchoHub.Server.dll [ApiController] [Route(\"api/channels\")] [Authorize] [EnableRateLimiting(\"general\")] public class ChannelsController : ControllerBase Inheritance object ControllerBase ChannelsController Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors ChannelsController(IChannelService, EchoHubDbContext, FileStorageService, ImageToAsciiService, IHttpClientFactory, IChatService, IMessageEncryptionService) public ChannelsController(IChannelService channelService, EchoHubDbContext db, FileStorageService fileStorage, ImageToAsciiService asciiService, IHttpClientFactory httpClientFactory, IChatService chatService, IMessageEncryptionService encryption) Parameters channelService IChannelService db EchoHubDbContext fileStorage FileStorageService asciiService ImageToAsciiService httpClientFactory IHttpClientFactory chatService IChatService encryption IMessageEncryptionService Methods CreateChannel(CreateChannelRequest) [HttpPost] public Task CreateChannel(CreateChannelRequest request) Parameters request CreateChannelRequest Returns Task DeleteChannel(string) [HttpDelete(\"{channel}\")] public Task DeleteChannel(string channel) Parameters channel string Returns Task GetChannelCrypto(string) Public crypto metadata for a channel: whether it is end-to-end encrypted and the PBKDF2 salt clients need to derive their join credential. Never returns the wrapped room key — that is only handed out after a successful join. [HttpGet(\"{channel}/crypto\")] public Task GetChannelCrypto(string channel) Parameters channel string Returns Task GetChannels(int, int) [HttpGet] public Task GetChannels(int offset = 0, int limit = 50) Parameters offset int limit int Returns Task RekeyChannel(string, RekeyChannelRequest) Changes an encrypted channel's passphrase by re-wrapping its room key. The caller proves knowledge of the old passphrase via the old auth key; history is never re-encrypted (the room content key does not change). [HttpPost(\"{channel}/rekey\")] public Task RekeyChannel(string channel, RekeyChannelRequest request) Parameters channel string request RekeyChannelRequest Returns Task SendMessageWithAttachments(string, string?) Sends one message carrying optional text (content form field) plus zero or more file attachments (Discord-style). For non-encrypted channels the server sniffs each file's kind and renders ASCII previews for images. For end-to-end encrypted channels the client uploads ciphertext blobs and declares each file's kind (kind) and pre-rendered, room-encrypted preview (preview), aligned by file order — the server never inspects them. [HttpPost(\"{channel}/messages\")] [EnableRateLimiting(\"upload\")] [RequestSizeLimit(1048576000)] [RequestFormLimits(MultipartBodyLengthLimit = 1048576000)] public Task SendMessageWithAttachments(string channel, string? size = null) Parameters channel string size string Returns Task SendUrl(string, SendUrlRequest, string?) [HttpPost(\"{channel}/send-url\")] [EnableRateLimiting(\"upload\")] public Task SendUrl(string channel, SendUrlRequest request, string? size = null) Parameters channel string request SendUrlRequest size string Returns Task UpdateTopic(string, UpdateTopicRequest) [HttpPut(\"{channel}/topic\")] public Task UpdateTopic(string channel, UpdateTopicRequest request) Parameters channel string request UpdateTopicRequest Returns Task" }, "api/server/EchoHub.Server.Controllers.FilesController.html": { "href": "api/server/EchoHub.Server.Controllers.FilesController.html", @@ -652,7 +757,7 @@ "api/server/EchoHub.Server.Controllers.ModerationController.html": { "href": "api/server/EchoHub.Server.Controllers.ModerationController.html", "title": "Class ModerationController | EchoHub Documentation", - "summary": "Class ModerationController Namespace EchoHub.Server.Controllers Assembly EchoHub.Server.dll [ApiController] [Route(\"api/moderation\")] [Authorize] [EnableRateLimiting(\"general\")] public class ModerationController : ControllerBase Inheritance object ControllerBase ModerationController Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors ModerationController(EchoHubDbContext, IChatService, PresenceTracker, IEnumerable) public ModerationController(EchoHubDbContext db, IChatService chatService, PresenceTracker presenceTracker, IEnumerable broadcasters) Parameters db EchoHubDbContext chatService IChatService presenceTracker PresenceTracker broadcasters IEnumerable Methods AssignRole(AssignRoleRequest) [HttpPost(\"role\")] public Task AssignRole(AssignRoleRequest request) Parameters request AssignRoleRequest Returns Task BanUser(string, BanRequest?) [HttpPost(\"ban/{username}\")] public Task BanUser(string username, BanRequest? request = null) Parameters username string request BanRequest Returns Task DeleteMessage(Guid) [HttpDelete(\"messages/{messageId:guid}\")] public Task DeleteMessage(Guid messageId) Parameters messageId Guid Returns Task KickUser(string, KickRequest?) [HttpPost(\"kick/{username}\")] public Task KickUser(string username, KickRequest? request = null) Parameters username string request KickRequest Returns Task MuteUser(string, MuteRequest?) [HttpPost(\"mute/{username}\")] public Task MuteUser(string username, MuteRequest? request = null) Parameters username string request MuteRequest Returns Task NukeChannel(string) [HttpDelete(\"channels/{channel}/nuke\")] public Task NukeChannel(string channel) Parameters channel string Returns Task UnbanUser(string) [HttpPost(\"unban/{username}\")] public Task UnbanUser(string username) Parameters username string Returns Task UnmuteUser(string) [HttpPost(\"unmute/{username}\")] public Task UnmuteUser(string username) Parameters username string Returns Task" + "summary": "Class ModerationController Namespace EchoHub.Server.Controllers Assembly EchoHub.Server.dll [ApiController] [Route(\"api/moderation\")] [Authorize] [EnableRateLimiting(\"general\")] public class ModerationController : ControllerBase Inheritance object ControllerBase ModerationController Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors ModerationController(EchoHubDbContext, IChatService, PresenceTracker, FileStorageService, IEnumerable) public ModerationController(EchoHubDbContext db, IChatService chatService, PresenceTracker presenceTracker, FileStorageService fileStorage, IEnumerable broadcasters) Parameters db EchoHubDbContext chatService IChatService presenceTracker PresenceTracker fileStorage FileStorageService broadcasters IEnumerable Methods AssignRole(AssignRoleRequest) [HttpPost(\"role\")] public Task AssignRole(AssignRoleRequest request) Parameters request AssignRoleRequest Returns Task BanUser(string, BanRequest?) [HttpPost(\"ban/{username}\")] public Task BanUser(string username, BanRequest? request = null) Parameters username string request BanRequest Returns Task DeleteMessage(Guid) [HttpDelete(\"messages/{messageId:guid}\")] public Task DeleteMessage(Guid messageId) Parameters messageId Guid Returns Task KickUser(string, KickRequest?) [HttpPost(\"kick/{username}\")] public Task KickUser(string username, KickRequest? request = null) Parameters username string request KickRequest Returns Task MuteUser(string, MuteRequest?) [HttpPost(\"mute/{username}\")] public Task MuteUser(string username, MuteRequest? request = null) Parameters username string request MuteRequest Returns Task NukeChannel(string) [HttpDelete(\"channels/{channel}/nuke\")] public Task NukeChannel(string channel) Parameters channel string Returns Task UnbanUser(string) [HttpPost(\"unban/{username}\")] public Task UnbanUser(string username) Parameters username string Returns Task UnmuteUser(string) [HttpPost(\"unmute/{username}\")] public Task UnmuteUser(string username) Parameters username string Returns Task" }, "api/server/EchoHub.Server.Controllers.ServerController.html": { "href": "api/server/EchoHub.Server.Controllers.ServerController.html", @@ -672,13 +777,18 @@ "api/server/EchoHub.Server.Data.EchoHubDbContext.html": { "href": "api/server/EchoHub.Server.Data.EchoHubDbContext.html", "title": "Class EchoHubDbContext | EchoHub Documentation", - "summary": "Class EchoHubDbContext Namespace EchoHub.Server.Data Assembly EchoHub.Server.dll public class EchoHubDbContext : DbContext, IDisposable, IAsyncDisposable Inheritance object DbContext EchoHubDbContext Implements IDisposable IAsyncDisposable Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors EchoHubDbContext(DbContextOptions) public EchoHubDbContext(DbContextOptions options) Parameters options DbContextOptions Properties ChannelMemberships public DbSet ChannelMemberships { get; } Property Value DbSet Channels public DbSet Channels { get; } Property Value DbSet Messages public DbSet Messages { get; } Property Value DbSet RefreshTokens public DbSet RefreshTokens { get; } Property Value DbSet Users public DbSet Users { get; } Property Value DbSet Methods OnConfiguring(DbContextOptionsBuilder) protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) Parameters optionsBuilder DbContextOptionsBuilder OnModelCreating(ModelBuilder) protected override void OnModelCreating(ModelBuilder modelBuilder) Parameters modelBuilder ModelBuilder" + "summary": "Class EchoHubDbContext Namespace EchoHub.Server.Data Assembly EchoHub.Server.dll public class EchoHubDbContext : DbContext, IDisposable, IAsyncDisposable Inheritance object DbContext EchoHubDbContext Implements IDisposable IAsyncDisposable Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors EchoHubDbContext(DbContextOptions) public EchoHubDbContext(DbContextOptions options) Parameters options DbContextOptions Properties Attachments public DbSet Attachments { get; } Property Value DbSet ChannelMemberships public DbSet ChannelMemberships { get; } Property Value DbSet Channels public DbSet Channels { get; } Property Value DbSet Messages public DbSet Messages { get; } Property Value DbSet RefreshTokens public DbSet RefreshTokens { get; } Property Value DbSet Users public DbSet Users { get; } Property Value DbSet Methods OnConfiguring(DbContextOptionsBuilder) protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) Parameters optionsBuilder DbContextOptionsBuilder OnModelCreating(ModelBuilder) protected override void OnModelCreating(ModelBuilder modelBuilder) Parameters modelBuilder ModelBuilder" }, "api/server/EchoHub.Server.Data.Migrations.AddAttachmentFileSize.html": { "href": "api/server/EchoHub.Server.Data.Migrations.AddAttachmentFileSize.html", "title": "Class AddAttachmentFileSize | EchoHub Documentation", "summary": "Class AddAttachmentFileSize Namespace EchoHub.Server.Data.Migrations Assembly EchoHub.Server.dll [DbContext(typeof(EchoHubDbContext))] [Migration(\"20260221193444_AddAttachmentFileSize\")] public class AddAttachmentFileSize : Migration Inheritance object Migration AddAttachmentFileSize Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors AddAttachmentFileSize() public AddAttachmentFileSize() Methods BuildTargetModel(ModelBuilder) protected override void BuildTargetModel(ModelBuilder modelBuilder) Parameters modelBuilder ModelBuilder Down(MigrationBuilder) protected override void Down(MigrationBuilder migrationBuilder) Parameters migrationBuilder MigrationBuilder Up(MigrationBuilder) protected override void Up(MigrationBuilder migrationBuilder) Parameters migrationBuilder MigrationBuilder" }, + "api/server/EchoHub.Server.Data.Migrations.AddChannelEncryptionEnvelope.html": { + "href": "api/server/EchoHub.Server.Data.Migrations.AddChannelEncryptionEnvelope.html", + "title": "Class AddChannelEncryptionEnvelope | EchoHub Documentation", + "summary": "Class AddChannelEncryptionEnvelope Namespace EchoHub.Server.Data.Migrations Assembly EchoHub.Server.dll [DbContext(typeof(EchoHubDbContext))] [Migration(\"20260716012917_AddChannelEncryptionEnvelope\")] public class AddChannelEncryptionEnvelope : Migration Inheritance object Migration AddChannelEncryptionEnvelope Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors AddChannelEncryptionEnvelope() public AddChannelEncryptionEnvelope() Methods BuildTargetModel(ModelBuilder) protected override void BuildTargetModel(ModelBuilder modelBuilder) Parameters modelBuilder ModelBuilder Down(MigrationBuilder) protected override void Down(MigrationBuilder migrationBuilder) Parameters migrationBuilder MigrationBuilder Up(MigrationBuilder) protected override void Up(MigrationBuilder migrationBuilder) Parameters migrationBuilder MigrationBuilder" + }, "api/server/EchoHub.Server.Data.Migrations.AddChannelIsPublic.html": { "href": "api/server/EchoHub.Server.Data.Migrations.AddChannelIsPublic.html", "title": "Class AddChannelIsPublic | EchoHub Documentation", @@ -689,11 +799,21 @@ "title": "Class AddChannelMembership | EchoHub Documentation", "summary": "Class AddChannelMembership Namespace EchoHub.Server.Data.Migrations Assembly EchoHub.Server.dll [DbContext(typeof(EchoHubDbContext))] [Migration(\"20260219181720_AddChannelMembership\")] public class AddChannelMembership : Migration Inheritance object Migration AddChannelMembership Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors AddChannelMembership() public AddChannelMembership() Methods BuildTargetModel(ModelBuilder) protected override void BuildTargetModel(ModelBuilder modelBuilder) Parameters modelBuilder ModelBuilder Down(MigrationBuilder) protected override void Down(MigrationBuilder migrationBuilder) Parameters migrationBuilder MigrationBuilder Up(MigrationBuilder) protected override void Up(MigrationBuilder migrationBuilder) Parameters migrationBuilder MigrationBuilder" }, + "api/server/EchoHub.Server.Data.Migrations.AddChannelPasswordHash.html": { + "href": "api/server/EchoHub.Server.Data.Migrations.AddChannelPasswordHash.html", + "title": "Class AddChannelPasswordHash | EchoHub Documentation", + "summary": "Class AddChannelPasswordHash Namespace EchoHub.Server.Data.Migrations Assembly EchoHub.Server.dll [DbContext(typeof(EchoHubDbContext))] [Migration(\"20260715232856_AddChannelPasswordHash\")] public class AddChannelPasswordHash : Migration Inheritance object Migration AddChannelPasswordHash Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors AddChannelPasswordHash() public AddChannelPasswordHash() Methods BuildTargetModel(ModelBuilder) protected override void BuildTargetModel(ModelBuilder modelBuilder) Parameters modelBuilder ModelBuilder Down(MigrationBuilder) protected override void Down(MigrationBuilder migrationBuilder) Parameters migrationBuilder MigrationBuilder Up(MigrationBuilder) protected override void Up(MigrationBuilder migrationBuilder) Parameters migrationBuilder MigrationBuilder" + }, "api/server/EchoHub.Server.Data.Migrations.AddEncryptionSupport.html": { "href": "api/server/EchoHub.Server.Data.Migrations.AddEncryptionSupport.html", "title": "Class AddEncryptionSupport | EchoHub Documentation", "summary": "Class AddEncryptionSupport Namespace EchoHub.Server.Data.Migrations Assembly EchoHub.Server.dll [DbContext(typeof(EchoHubDbContext))] [Migration(\"20260220133627_AddEncryptionSupport\")] public class AddEncryptionSupport : Migration Inheritance object Migration AddEncryptionSupport Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors AddEncryptionSupport() public AddEncryptionSupport() Methods BuildTargetModel(ModelBuilder) protected override void BuildTargetModel(ModelBuilder modelBuilder) Parameters modelBuilder ModelBuilder Down(MigrationBuilder) protected override void Down(MigrationBuilder migrationBuilder) Parameters migrationBuilder MigrationBuilder Up(MigrationBuilder) protected override void Up(MigrationBuilder migrationBuilder) Parameters migrationBuilder MigrationBuilder" }, + "api/server/EchoHub.Server.Data.Migrations.AddMessageAttachments.html": { + "href": "api/server/EchoHub.Server.Data.Migrations.AddMessageAttachments.html", + "title": "Class AddMessageAttachments | EchoHub Documentation", + "summary": "Class AddMessageAttachments Namespace EchoHub.Server.Data.Migrations Assembly EchoHub.Server.dll [DbContext(typeof(EchoHubDbContext))] [Migration(\"20260716020211_AddMessageAttachments\")] public class AddMessageAttachments : Migration Inheritance object Migration AddMessageAttachments Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors AddMessageAttachments() public AddMessageAttachments() Methods BuildTargetModel(ModelBuilder) protected override void BuildTargetModel(ModelBuilder modelBuilder) Parameters modelBuilder ModelBuilder Down(MigrationBuilder) protected override void Down(MigrationBuilder migrationBuilder) Parameters migrationBuilder MigrationBuilder Up(MigrationBuilder) protected override void Up(MigrationBuilder migrationBuilder) Parameters migrationBuilder MigrationBuilder" + }, "api/server/EchoHub.Server.Data.Migrations.AddMessageEmbed.html": { "href": "api/server/EchoHub.Server.Data.Migrations.AddMessageEmbed.html", "title": "Class AddMessageEmbed | EchoHub Documentation", @@ -712,7 +832,7 @@ "api/server/EchoHub.Server.Data.Migrations.html": { "href": "api/server/EchoHub.Server.Data.Migrations.html", "title": "Namespace EchoHub.Server.Data.Migrations | EchoHub Documentation", - "summary": "Namespace EchoHub.Server.Data.Migrations Classes AddAttachmentFileSize AddChannelIsPublic AddChannelMembership AddEncryptionSupport AddMessageEmbed AddModerationRoles InitialCreate" + "summary": "Namespace EchoHub.Server.Data.Migrations Classes AddAttachmentFileSize AddChannelEncryptionEnvelope AddChannelIsPublic AddChannelMembership AddChannelPasswordHash AddEncryptionSupport AddMessageAttachments AddMessageEmbed AddModerationRoles InitialCreate" }, "api/server/EchoHub.Server.Data.html": { "href": "api/server/EchoHub.Server.Data.html", @@ -722,7 +842,7 @@ "api/server/EchoHub.Server.Hubs.ChatHub.html": { "href": "api/server/EchoHub.Server.Hubs.ChatHub.html", "title": "Class ChatHub | EchoHub Documentation", - "summary": "Class ChatHub Namespace EchoHub.Server.Hubs Assembly EchoHub.Server.dll [Authorize] public class ChatHub : Hub, IDisposable Inheritance object Hub Hub ChatHub Implements IDisposable Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors ChatHub(IChatService, ILogger) public ChatHub(IChatService chatService, ILogger logger) Parameters chatService IChatService logger ILogger Methods GetChannelHistory(string, int, int) public Task> GetChannelHistory(string channelName, int count = 100, int offset = 0) Parameters channelName string count int offset int Returns Task> GetOnlineUsers(string) public Task> GetOnlineUsers(string channelName) Parameters channelName string Returns Task> JoinChannel(string) public Task JoinChannel(string channelName) Parameters channelName string Returns Task LeaveChannel(string) public Task LeaveChannel(string channelName) Parameters channelName string Returns Task OnConnectedAsync() public override Task OnConnectedAsync() Returns Task OnDisconnectedAsync(Exception?) public override Task OnDisconnectedAsync(Exception? exception) Parameters exception Exception Returns Task SendMessage(string, string) public Task SendMessage(string channelName, string content) Parameters channelName string content string Returns Task UpdateStatus(UserStatus, string?) public Task UpdateStatus(UserStatus status, string? statusMessage) Parameters status UserStatus statusMessage string Returns Task" + "summary": "Class ChatHub Namespace EchoHub.Server.Hubs Assembly EchoHub.Server.dll [Authorize] public class ChatHub : Hub, IDisposable Inheritance object Hub Hub ChatHub Implements IDisposable Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors ChatHub(IChatService, IChannelService, ILogger) public ChatHub(IChatService chatService, IChannelService channelService, ILogger logger) Parameters chatService IChatService channelService IChannelService logger ILogger Methods GetChannelHistory(string, int, int) public Task> GetChannelHistory(string channelName, int count = 100, int offset = 0) Parameters channelName string count int offset int Returns Task> GetOnlineUsers(string) public Task> GetOnlineUsers(string channelName) Parameters channelName string Returns Task> JoinChannel(string, string?) public Task JoinChannel(string channelName, string? password = null) Parameters channelName string password string Returns Task LeaveChannel(string) public Task LeaveChannel(string channelName) Parameters channelName string Returns Task OnConnectedAsync() public override Task OnConnectedAsync() Returns Task OnDisconnectedAsync(Exception?) public override Task OnDisconnectedAsync(Exception? exception) Parameters exception Exception Returns Task SendMessage(string, string) public Task SendMessage(string channelName, string content) Parameters channelName string content string Returns Task UpdateStatus(UserStatus, string?) public Task UpdateStatus(UserStatus status, string? statusMessage) Parameters status UserStatus statusMessage string Returns Task" }, "api/server/EchoHub.Server.Hubs.html": { "href": "api/server/EchoHub.Server.Hubs.html", @@ -732,12 +852,12 @@ "api/server/EchoHub.Server.Services.ChannelService.html": { "href": "api/server/EchoHub.Server.Services.ChannelService.html", "title": "Class ChannelService | EchoHub Documentation", - "summary": "Class ChannelService Namespace EchoHub.Server.Services Assembly EchoHub.Server.dll public class ChannelService : IChannelService Inheritance object ChannelService Implements IChannelService Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors ChannelService(IServiceScopeFactory, PresenceTracker, ILogger) public ChannelService(IServiceScopeFactory scopeFactory, PresenceTracker presenceTracker, ILogger logger) Parameters scopeFactory IServiceScopeFactory presenceTracker PresenceTracker logger ILogger Methods CreateChannelAsync(Guid, string, string?, bool) public Task CreateChannelAsync(Guid creatorUserId, string name, string? topic, bool isPublic) Parameters creatorUserId Guid name string topic string isPublic bool Returns Task DeleteChannelAsync(Guid, string) public Task DeleteChannelAsync(Guid callerUserId, string channelName) Parameters callerUserId Guid channelName string Returns Task EnsureChannelMembershipAsync(Guid, string) public Task<(bool Success, string? Error)> EnsureChannelMembershipAsync(Guid userId, string channelName) Parameters userId Guid channelName string Returns Task<(bool Success, string Error)> GetChannelByNameAsync(string) public Task GetChannelByNameAsync(string channelName) Parameters channelName string Returns Task GetChannelListAsync() public Task> GetChannelListAsync() Returns Task> GetChannelTopicAsync(string) public Task<(string? Topic, bool Exists)> GetChannelTopicAsync(string channelName) Parameters channelName string Returns Task<(string Topic, bool Exists)> GetChannelsAsync(Guid, int, int) public Task> GetChannelsAsync(Guid userId, int offset, int limit) Parameters userId Guid offset int limit int Returns Task> UpdateTopicAsync(Guid, string, string?) public Task UpdateTopicAsync(Guid callerUserId, string channelName, string? topic) Parameters callerUserId Guid channelName string topic string Returns Task" + "summary": "Class ChannelService Namespace EchoHub.Server.Services Assembly EchoHub.Server.dll public class ChannelService : IChannelService Inheritance object ChannelService Implements IChannelService Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors ChannelService(IServiceScopeFactory, PresenceTracker, ILogger) public ChannelService(IServiceScopeFactory scopeFactory, PresenceTracker presenceTracker, ILogger logger) Parameters scopeFactory IServiceScopeFactory presenceTracker PresenceTracker logger ILogger Methods CreateChannelAsync(Guid, string, string?, bool, string?, string?, string?) public Task CreateChannelAsync(Guid creatorUserId, string name, string? topic, bool isPublic, string? password = null, string? encryptionSalt = null, string? wrappedRoomKey = null) Parameters creatorUserId Guid name string topic string isPublic bool password string encryptionSalt string wrappedRoomKey string Returns Task DeleteChannelAsync(Guid, string) public Task DeleteChannelAsync(Guid callerUserId, string channelName) Parameters callerUserId Guid channelName string Returns Task EnsureChannelMembershipAsync(Guid, string, string?) public Task<(bool Success, string? Error, bool PasswordRequired)> EnsureChannelMembershipAsync(Guid userId, string channelName, string? password = null) Parameters userId Guid channelName string password string Returns Task<(bool Success, string Error, bool PasswordRequired)> GetChannelByNameAsync(string) public Task GetChannelByNameAsync(string channelName) Parameters channelName string Returns Task GetChannelCryptoAsync(string) public Task GetChannelCryptoAsync(string channelName) Parameters channelName string Returns Task GetChannelKeyEnvelopeAsync(string) public Task<(string? EncryptionSalt, string? WrappedRoomKey)> GetChannelKeyEnvelopeAsync(string channelName) Parameters channelName string Returns Task<(string EncryptionSalt, string WrappedRoomKey)> GetChannelListAsync() public Task> GetChannelListAsync() Returns Task> GetChannelTopicAsync(string) public Task<(string? Topic, bool Exists)> GetChannelTopicAsync(string channelName) Parameters channelName string Returns Task<(string Topic, bool Exists)> GetChannelsAsync(Guid, int, int) public Task> GetChannelsAsync(Guid userId, int offset, int limit) Parameters userId Guid offset int limit int Returns Task> RekeyChannelAsync(Guid, string, string, string, string, string) Changes an encrypted channel's passphrase by swapping the join-gate hash and the wrapped room key. The room content key itself never changes, so history stays readable — the client re-wraps it under the new passphrase-derived key. Creator only: admins cannot rekey a room whose passphrase they don't know. public Task RekeyChannelAsync(Guid callerUserId, string channelName, string oldPassword, string newPassword, string newEncryptionSalt, string newWrappedRoomKey) Parameters callerUserId Guid channelName string oldPassword string newPassword string newEncryptionSalt string newWrappedRoomKey string Returns Task SetChannelPasswordAsync(Guid, string, string?) Sets, changes, or clears (null) a channel's join password. Creator or admin only. Not available on end-to-end encrypted channels — those change passphrase via RekeyChannelAsync(Guid, string, string, string, string, string) so the room key envelope stays consistent. public Task SetChannelPasswordAsync(Guid callerUserId, string channelName, string? password) Parameters callerUserId Guid channelName string password string Returns Task UpdateTopicAsync(Guid, string, string?) public Task UpdateTopicAsync(Guid callerUserId, string channelName, string? topic) Parameters callerUserId Guid channelName string topic string Returns Task" }, "api/server/EchoHub.Server.Services.ChatService.html": { "href": "api/server/EchoHub.Server.Services.ChatService.html", "title": "Class ChatService | EchoHub Documentation", - "summary": "Class ChatService Namespace EchoHub.Server.Services Assembly EchoHub.Server.dll public class ChatService : IChatService Inheritance object ChatService Implements IChatService Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors ChatService(IServiceScopeFactory, PresenceTracker, IEnumerable, LinkEmbedService, IMessageEncryptionService, IChannelService, ILogger) public ChatService(IServiceScopeFactory scopeFactory, PresenceTracker presenceTracker, IEnumerable broadcasters, LinkEmbedService embedService, IMessageEncryptionService encryption, IChannelService channelService, ILogger logger) Parameters scopeFactory IServiceScopeFactory presenceTracker PresenceTracker broadcasters IEnumerable embedService LinkEmbedService encryption IMessageEncryptionService channelService IChannelService logger ILogger Methods BroadcastChannelUpdatedAsync(ChannelDto, string?) public Task BroadcastChannelUpdatedAsync(ChannelDto channel, string? channelName = null) Parameters channel ChannelDto channelName string Returns Task BroadcastMessageAsync(string, MessageDto) public Task BroadcastMessageAsync(string channelName, MessageDto message) Parameters channelName string message MessageDto Returns Task GetChannelHistoryAsync(string, int, 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" + "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, FileStorageService, ILogger) public ChatService(IServiceScopeFactory scopeFactory, PresenceTracker presenceTracker, IEnumerable broadcasters, LinkEmbedService embedService, IMessageEncryptionService encryption, IChannelService channelService, FileStorageService fileStorage, ILogger logger) Parameters scopeFactory IServiceScopeFactory presenceTracker PresenceTracker broadcasters IEnumerable embedService LinkEmbedService encryption IMessageEncryptionService channelService IChannelService fileStorage FileStorageService 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, string?) public Task<(List History, string? Error, bool PasswordRequired)> JoinChannelAsync(string connectionId, Guid userId, string username, string channelName, string? password = null) Parameters connectionId string userId Guid username string channelName string password string Returns Task<(List History, string Error, bool PasswordRequired)> 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", @@ -752,17 +872,7 @@ "api/server/EchoHub.Server.Services.FileStorageService.html": { "href": "api/server/EchoHub.Server.Services.FileStorageService.html", "title": "Class FileStorageService | EchoHub Documentation", - "summary": "Class FileStorageService Namespace EchoHub.Server.Services Assembly EchoHub.Server.dll public class FileStorageService Inheritance object FileStorageService Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors FileStorageService(IConfiguration) public FileStorageService(IConfiguration configuration) Parameters configuration IConfiguration Methods DeleteFile(string) public void DeleteFile(string fileId) Parameters fileId string GetFilePath(string) public string? GetFilePath(string fileId) Parameters fileId string Returns string SaveFileAsync(Stream, string) public Task<(string fileId, string filePath)> SaveFileAsync(Stream stream, string fileName) Parameters stream Stream fileName string Returns Task<(string fileId, string filePath)>" - }, - "api/server/EchoHub.Server.Services.FileValidationHelper.html": { - "href": "api/server/EchoHub.Server.Services.FileValidationHelper.html", - "title": "Class FileValidationHelper | EchoHub Documentation", - "summary": "Class FileValidationHelper Namespace EchoHub.Server.Services Assembly EchoHub.Server.dll public static class FileValidationHelper Inheritance object FileValidationHelper Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Methods IsAudioFile(string) Checks whether the file name has a recognized audio extension. public static bool IsAudioFile(string fileName) Parameters fileName string Returns bool IsValidImage(Stream) Validates that a stream contains a recognized image format by checking magic bytes. The stream position is reset to the beginning after validation. public static bool IsValidImage(Stream stream) Parameters stream Stream Returns bool" - }, - "api/server/EchoHub.Server.Services.ImageToAsciiService.html": { - "href": "api/server/EchoHub.Server.Services.ImageToAsciiService.html", - "title": "Class ImageToAsciiService | EchoHub Documentation", - "summary": "Class ImageToAsciiService Namespace EchoHub.Server.Services Assembly EchoHub.Server.dll public class ImageToAsciiService Inheritance object ImageToAsciiService Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors ImageToAsciiService() public ImageToAsciiService() Methods ConvertToAscii(Stream, int, int) Converts an image to ASCII art using half-block characters (▀▄█) with printable color tags for 2x vertical resolution. Each character cell represents two vertical pixels. Format: {F:RRGGBB} foreground, {B:RRGGBB} background, {X} reset. Uses only printable ASCII — no terminal escape bytes. public string ConvertToAscii(Stream imageStream, int width = 80, int height = 80) Parameters imageStream Stream width int height int Returns string GetDimensions(string?) Returns (width, height) dimensions for the given size code. s = small (40x40), m = medium/default (80x80), l = large (120x120). public static (int Width, int Height) GetDimensions(string? size) Parameters size string Returns (int Width, int Height)" + "summary": "Class FileStorageService Namespace EchoHub.Server.Services Assembly EchoHub.Server.dll public class FileStorageService Inheritance object FileStorageService Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors FileStorageService(IConfiguration) public FileStorageService(IConfiguration configuration) Parameters configuration IConfiguration Methods DeleteFile(string) public void DeleteFile(string fileId) Parameters fileId string GetFilePath(string) public string? GetFilePath(string fileId) Parameters fileId string Returns string GetStoredFileIds() Returns the set of stored file ids (filenames without extension) currently on disk. One directory scan, so callers can bulk-check many attachments without a glob per file. public HashSet GetStoredFileIds() Returns HashSet SaveFileAsync(Stream, string) public Task<(string fileId, string filePath)> SaveFileAsync(Stream stream, string fileName) Parameters stream Stream fileName string Returns Task<(string EncryptionSalt, string WrappedRoomKey)>" }, "api/server/EchoHub.Server.Services.LinkEmbedService.html": { "href": "api/server/EchoHub.Server.Services.LinkEmbedService.html", @@ -807,7 +917,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 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" + "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 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", @@ -832,7 +942,7 @@ "articles/architecture.html": { "href": "articles/architecture.html", "title": "Architecture | EchoHub Documentation", - "summary": "Architecture Overview EchoHub follows a decentralized model where each server is fully independent. There is no central authority or account federation. Users create one account per server. The server exposes two protocol interfaces to the same chat backend: IRC Client ──► TCP :6667 ──► IrcGateway ──┐ ├──► ChatService ──► DB + PresenceTracker TUI Client ──► WebSocket ──► ChatHub ─────┘ Both protocols call into a shared IChatService for business logic. Events fan out to all registered IChatBroadcaster implementations (SignalR and IRC). Components EchoHub.Core Shared library containing: Models: User, Channel, Message, RefreshToken DTOs: Record types for API requests/responses Contracts: IChatService (protocol-agnostic chat operations), IChannelService (channel CRUD and membership), IChatBroadcaster (event fan-out interface), IEchoHubClient (SignalR client interface) Constants: ValidationConstants (shared regex patterns), HubConstants EchoHub.Server ASP.NET Core web application: Controllers: REST API endpoints for auth, channels, users, files, server info Hubs: SignalR ChatHub -- thin adapter delegating to IChatService Auth: JWT token service (15-min access tokens, 30-day refresh tokens) Data: EF Core with SQLite Services: ChatService (core business logic), ChannelService (channel CRUD and membership), SignalRBroadcaster, presence tracking, file storage, image-to-ASCII conversion, FileCleanupService (periodic removal of expired uploads), DataMigrationService (startup schema/data evolution) EchoHub.Server.Irc IRC protocol gateway (separate project for clean separation of concerns): IrcGatewayService: BackgroundService with TCP listener on configured port(s), optional TLS IrcCommandHandler: Per-client IRC command dispatch -- handles CAP/SASL, NICK/USER/PASS, JOIN/PART/PRIVMSG/QUIT, NAMES/TOPIC/WHO/WHOIS/AWAY/LIST/MODE/MOTD IrcBroadcaster: IChatBroadcaster implementation that formats chat events as IRC protocol lines, with echo suppression (IRC convention) IrcMessageFormatter: Converts MessageDto to IRC PRIVMSG lines -- splits long text at word boundaries (~400 byte chunks), sends images as ASCII art line-by-line IRC users authenticate with existing EchoHub accounts via PASS/NICK/USER or SASL PLAIN (BCrypt verification against the database). EchoHub.Client Terminal.Gui v2 TUI application: UI: Main window, dialogs, chat renderer with ANSI color support Services: API client with automatic token refresh, SignalR connection wrapper, audio playback (NetCoreAudio), automatic update checker (AlwaysUpToDate) Themes: 13 built-in color themes (including transparent theme with true terminal transparency) Config: Client configuration management with session persistence (\"Remember Me\" refresh tokens) Communication REST API for authentication, profile management, channel CRUD, file uploads SignalR WebSocket for real-time messaging and presence updates (TUI client) IRC TCP for real-time messaging via standard IRC protocol (IRC clients) JWT tokens passed via query string for SignalR authentication IRC authentication via PASS/SASL PLAIN against BCrypt password hashes Broadcaster Pattern The IChatBroadcaster interface allows multiple protocols to receive chat events: SignalRBroadcaster: Wraps IHubContext, filters out IRC connections IrcBroadcaster: Iterates live IRC connections in a channel, formats events as IRC protocol lines Both are registered in DI and called by ChatService when events occur. This means a message sent from an IRC client appears in the TUI client, and vice versa." + "summary": "Architecture Overview EchoHub follows a decentralized model where each server is fully independent. There is no central authority or account federation. Users create one account per server. The server exposes two protocol interfaces to the same chat backend: IRC Client ──► TCP :6667 ──► IrcGateway ──┐ ├──► ChatService ──► DB + PresenceTracker TUI Client ──► WebSocket ──► ChatHub ─────┘ Both protocols call into a shared IChatService for business logic. Events fan out to all registered IChatBroadcaster implementations (SignalR and IRC). Components EchoHub.Core Shared library containing: Models: User, Channel, Message, RefreshToken DTOs: Record types for API requests/responses Contracts: IChatService (protocol-agnostic chat operations), IChannelService (channel CRUD and membership), IChatBroadcaster (event fan-out interface), IEchoHubClient (SignalR client interface) Constants: ValidationConstants (shared regex patterns), HubConstants EchoHub.Server ASP.NET Core web application: Controllers: REST API endpoints for auth, channels, users, files, server info Hubs: SignalR ChatHub -- thin adapter delegating to IChatService Auth: JWT token service (15-min access tokens, 30-day refresh tokens) Data: EF Core with SQLite Services: ChatService (core business logic), ChannelService (channel CRUD and membership), SignalRBroadcaster, presence tracking, file storage, image-to-ASCII conversion, FileCleanupService (periodic removal of expired uploads), DataMigrationService (startup schema/data evolution) EchoHub.Server.Irc IRC protocol gateway (separate project for clean separation of concerns): IrcGatewayService: BackgroundService with TCP listener on configured port(s), optional TLS IrcCommandHandler: Per-client IRC command dispatch -- handles CAP/SASL, NICK/USER/PASS, JOIN/PART/PRIVMSG/QUIT, NAMES/TOPIC/WHO/WHOIS/AWAY/LIST/MODE/MOTD IrcBroadcaster: IChatBroadcaster implementation that formats chat events as IRC protocol lines, with echo suppression (IRC convention) IrcMessageFormatter: Converts MessageDto to IRC PRIVMSG lines -- splits long text at word boundaries (~400 byte chunks), sends images as ASCII art line-by-line IRC users authenticate with existing EchoHub accounts via PASS/NICK/USER or SASL PLAIN (BCrypt verification against the database). EchoHub.Client Terminal.Gui v2 TUI application: UI: Main window, dialogs, chat renderer with ANSI color support Services: API client with automatic token refresh, SignalR connection wrapper, audio playback (NetCoreAudio), automatic update checker (AlwaysUpToDate) Themes: 14 built-in color themes (including transparent dark/light themes with true terminal transparency) Config: Client configuration management with session persistence (\"Remember Me\" refresh tokens) Communication REST API for authentication, profile management, channel CRUD, file uploads SignalR WebSocket for real-time messaging and presence updates (TUI client) IRC TCP for real-time messaging via standard IRC protocol (IRC clients) JWT tokens passed via query string for SignalR authentication IRC authentication via PASS/SASL PLAIN against BCrypt password hashes Broadcaster Pattern The IChatBroadcaster interface allows multiple protocols to receive chat events: SignalRBroadcaster: Wraps IHubContext, filters out IRC connections IrcBroadcaster: Iterates live IRC connections in a channel, formats events as IRC protocol lines Both are registered in DI and called by ChatService when events occur. This means a message sent from an IRC client appears in the TUI client, and vice versa." }, "articles/configuration.html": { "href": "articles/configuration.html", @@ -862,7 +972,7 @@ "changelog/index.html": { "href": "changelog/index.html", "title": "Changelog | EchoHub Documentation", - "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" + "summary": "Changelog Release history for EchoHub. Releases v0.2.12 - End-to-End Encrypted Channels, IRC Channel Keys, Image Save & Ctrl+W Crash Fix 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", @@ -894,6 +1004,11 @@ "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.12.html": { + "href": "changelog/v0.2.12.html", + "title": "v0.2.12 | EchoHub Documentation", + "summary": "v0.2.12 Private channels are now genuinely private: password-protected channels are end-to-end encrypted, so the server (and its operators) can gate joins and measure storage but cannot read message or file contents. The IRC gateway grows real MODE/TOPIC support and channel keys, and the client gets image \"save original\", a transparent-light theme, drag-and-drop file sending, Ctrl+V paste, and a fix for the intermittent Ctrl+W crash. New Features End-to-end encrypted channels — creating a channel with a password now provisions a zero-knowledge room: The passphrase never leaves the client. It derives (PBKDF2-SHA256, 210k iterations) two keys: an auth key sent to the server as the join credential, and a key-encryption key that never leaves the machine. A random room content key encrypts every message and file with AES-256-GCM. The server only ever stores the room key wrapped under the passphrase, so it can gate joins and report a channel's message count, storage size, and attachments — but cannot decrypt any of it. Even the server owner cannot read a private room's contents. Members' clients cache the derived room key locally (in the per-server config, like saved sessions) so the passphrase isn't retyped every launch; joining on a new device prompts for it once. Change the passphrase with /passwd (channel creator only). The room key is re-wrapped, not rotated, so existing history stays readable and members who join later with the new passphrase can still read older messages. Files and images are encrypted client-side before upload; for images the ASCII-art preview is rendered on the client and stored room-encrypted too. Sending images by URL is disabled in encrypted channels (the server can't fetch-and-render without the key). End-to-end encrypted channels cannot be joined over the IRC gateway (that would require the server to hold the room key) — IRC JOIN returns 475 directing users to the EchoHub client. Password-protected channels — set an optional password when creating a channel (masked field in the Create Channel dialog, password on POST /api/channels). Passwords are BCrypt-hashed server-side; the join gate applies on first join only (existing members and the creator are unaffected). Protected channels show a * marker in the channel list and +k in the status bar Save original images — image messages now show a clickable \"[↓ save original]\" line under the ASCII-art preview that downloads the full-resolution original to your Downloads folder (decrypting locally in encrypted channels) Messages with attachments (Discord-style) — a message is now text plus a list of attachments instead of being either text or a single file. One message can carry a caption and several files (images, audio, docs) together: Compose with a staging tray: /send or dropping files onto the terminal stages them (shown on the input bar); the next Enter sends your typed caption and all staged files as one message. /clear drops staged files. /send still posts an image immediately. Each image attachment renders its own ASCII preview with its own \"save original\" action; audio/file attachments each get their own play/download line. In encrypted channels every attachment is encrypted individually (blob + ASCII preview), and the caption is room-encrypted — the server still stores only ciphertext and can report count/size but not contents. Up to 10 attachments per message. Right-click message menu — right-click any message for a context menu: save/download/play its attachment, mention the sender, view their profile, copy the text, copy the message ID (for linking or command arguments), or delete the message. (Keyboard: F6 focuses the message list for arrow-key selection + Delete.) The selected message is now highlighted while the list is focused. Message deletion — press Delete on a selected message to remove it. You can always delete your own messages; moderators and above can delete others' messages, but only from users below their own role (a mod can't delete an admin's or owner's message). Deleting a message also removes its attachment blobs from server storage. Customizable download folder — /downloadpath opens your OS-native folder picker (Windows Explorer / macOS Finder / Linux GTK or KDE) to choose where downloaded attachments and saved images go; /downloadpath sets it directly (the fallback when no native picker is available). Downloaded files now land in that folder (with automatic (n) de-duplication) instead of a temp directory. /join [password] — join protected channels inline, or let the client prompt: joining a protected channel without a password opens a masked prompt that re-prompts on a wrong password IRC channel keys — JOIN #room works against room passwords (RFC 1459 comma-paired key lists supported); keyless or wrong-key joins get 475 ERR_BADCHANNELKEY IRC MODE implemented — MODE #chan reports +k/+, MODE #chan +k sets and -k clears the room password (channel creator or admin only), ban-list probes get a clean empty reply, and CHANMODES is advertised in ISUPPORT IRC TOPIC set support — the channel creator can change the topic from IRC; the change broadcasts to connected TUI clients (previously topic changes were rejected with a stub error) Attach a file by drag & drop or by pasting — drop a file onto the terminal, or copy a file in your file manager and press Ctrl+V, to stage it as an attachment (the next Enter sends it with your caption). Multiple files at once are supported. Ctrl+V still pastes text when the clipboard holds text; Ctrl+Y is a paste alias. On Windows the copied-file paste reads the clipboard's file list directly (Windows Terminal never pastes copied files as text), with xclip/wl-paste used on Linux Pick ASCII-art size for attached images — /size opens a Small/Medium/Large picker (40×40 / 80×80 / 120×120) with descriptions, /size sets it directly, and /send -l sets it for that message. The choice is a saved preference and applies to copy-paste/drag-drop images (which have no per-file flag); the current size is shown in the staging tray New TransparentLight theme — dark characters on a transparent background, for light terminal color schemes (/theme transparentlight) Timestamps in messages are now aware of the current culture and display the short time pattern for today's messages and the short date+time pattern for older messages. Bug Fixes Transparent themes no longer draw an opaque box behind the message input. The input TextView renders with the Editable visual role, which Terminal.Gui derives as an opaque color when a theme leaves it unset; the themes now pin Editable/ReadOnly to their base colors so the input matches its (transparent) background. Attachments whose files have been pruned (retention cleanup deletes blobs older than Storage:RetentionDays but left the message rows) no longer render a dead download/preview. When channel history loads, the server checks which attachment blobs still exist: missing ones are dropped from the message, and an attachment-only message whose files are all gone is removed from the database. Fixed intermittent crash on Ctrl+W — Terminal.Gui binds Ctrl+W to clipboard-cut, and Windows clipboard contention (another app holding the clipboard) threw an unhandled Win32Exception that took the app down. Ctrl+W now deletes the previous word (readline behavior, no clipboard), and all clipboard shortcuts (Ctrl+X/C/V/Y) are guarded so transient clipboard failures log a warning instead of crashing Fixed emoji shortcode replacement permanently disabling itself if a cursor update threw mid-replacement IRC LIST no longer leaks private channels; protected channels are marked [+k] API Changes ChannelDto gains isProtected and isEncrypted; CreateChannelRequest gains optional password, encryptionSalt, and wrappedRoomKey; SignalR JoinChannel takes an optional second password argument and JoinChannelResult gains passwordRequired, encryptionSalt, and wrappedRoomKey (older clients must update to join over SignalR) New endpoints: GET /api/channels/{channel}/crypto (public crypto metadata — salt only, never the wrapped key) and POST /api/channels/{channel}/rekey (creator-only passphrase change) The upload endpoint accepts type and content form fields for encrypted channels, where the client supplies the declared message type and room-encrypted content ImageToAsciiService and FileValidationHelper moved from EchoHub.Server to EchoHub.Core so the client can render ASCII art and detect file types for encrypted uploads Message shape change: MessageDto drops Type/AttachmentUrl/AttachmentFileName/AttachmentFileSize and gains Attachments (a list of AttachmentDto { Kind, Url, FileName, FileSize, AsciiPreview }, null/empty for plain text). New Attachment entity + table with a cascade FK to Message New endpoint POST /api/channels/{channel}/messages (multipart: content + N files, plus kind/preview per file for encrypted channels) replaces the single-file upload endpoint; DELETE /api/moderation/messages/{id} now enforces the own-or-higher-role rule New EF migrations AddChannelPasswordHash, AddChannelEncryptionEnvelope, and AddMessageAttachments (applied automatically on server start); a one-time startup data migration folds legacy single-attachment messages into the new model" + }, "changelog/v0.2.2.html": { "href": "changelog/v0.2.2.html", "title": "v0.2.2 - Startup & Shutdown Fixes | EchoHub Documentation", @@ -977,6 +1092,6 @@ "todo.html": { "href": "todo.html", "title": "TODO | EchoHub Documentation", - "summary": "TODO [ ] fix the chat trailing; when user scrolls up, and somebody sends a message – the chat instantly \"teleports\" to the very bottom [x] disable the autorun of files (maybe keep for mp4? gotta do some sec research on it) [x] when user creates a new channel, he gets moved to that channel; but the userlist does not refresh the state on that – it refreshes when user re-enters the channel again [ ] password protected rooms [ ] better audio lib, current one (NetCoreAudio) does not support seek or other audio actions [ ] Use options pattern for both client & server ref: https://learn.microsoft.com/en-us/aspnet/core/fundamentals/configuration/options?view=aspnetcore-10.0 [x] The vertical line of embeds should be the same colour as theme-color meta tag of the source [x] change text wrapping to honor the offset of the user. (Preferably wrap whole words if they fit in on line. Basically how the CSS \"text-wrap-mode: wrap;\" works) [x] make usernames in messages, mentions and in the user list clickable to open the user profile [ ] Add tags support for public servers & add filters on echohubspace for those tags in the server \"browser\" [ ] when trying to /join a channel that doesn't exist a client side-ghost channel gets created that does not work [x] unmute timer does not seem to work [ ] add IRC network like support that means basically multiple servers linked, so users can chat cross-server in this network [x] when users clicks public -> private -> public checkbox in the channel creation, it ends up creating the channel on 3rd check switch [ ] add keyboard only controls | at least for most important parts and the rest might be accessible with: (down) [x] add search bar / search modal – that will allow users to instantly navigate to room / focus on app element & etc [ ] Actually smart data management – cache messages, lazy load messages on scroll (currently hardcoded 100msgs fetched + new ones) [x] Another thing would be stateful userlist – basically fetch once and listen for userlist updates [x] Send to EchohubSpace only state changes, currently we send user count periodically, instead of updating it on update [x] space between mod|admin \"icon\" and username [ ] Embeds still incorrectly display colors" + "summary": "TODO [ ] fix the chat trailing; when user scrolls up, and somebody sends a message – the chat instantly \"teleports\" to the very bottom [x] disable the autorun of files (maybe keep for mp4? gotta do some sec research on it) [x] when user creates a new channel, he gets moved to that channel; but the userlist does not refresh the state on that – it refreshes when user re-enters the channel again [x] password protected rooms (end-to-end encrypted — server cannot read contents) [ ] better audio lib, current one (NetCoreAudio) does not support seek or other audio actions [ ] Use options pattern for both client & server ref: https://learn.microsoft.com/en-us/aspnet/core/fundamentals/configuration/options?view=aspnetcore-10.0 [x] The vertical line of embeds should be the same colour as theme-color meta tag of the source [x] change text wrapping to honor the offset of the user. (Preferably wrap whole words if they fit in on line. Basically how the CSS \"text-wrap-mode: wrap;\" works) [x] make usernames in messages, mentions and in the user list clickable to open the user profile [ ] Add tags support for public servers & add filters on echohubspace for those tags in the server \"browser\" [ ] when trying to /join a channel that doesn't exist a client side-ghost channel gets created that does not work [x] unmute timer does not seem to work [ ] add IRC network like support that means basically multiple servers linked, so users can chat cross-server in this network [x] when users clicks public -> private -> public checkbox in the channel creation, it ends up creating the channel on 3rd check switch [ ] add keyboard only controls | at least for most important parts and the rest might be accessible with: (down) [x] add search bar / search modal – that will allow users to instantly navigate to room / focus on app element & etc [ ] Actually smart data management – cache messages, lazy load messages on scroll (currently hardcoded 100msgs fetched + new ones) [x] Another thing would be stateful userlist – basically fetch once and listen for userlist updates [x] Send to EchohubSpace only state changes, currently we send user count periodically, instead of updating it on update [x] space between mod|admin \"icon\" and username [ ] Embeds still incorrectly display colors" } } \ No newline at end of file diff --git a/manifest.json b/manifest.json index be29e0f..83f45af 100644 --- a/manifest.json +++ b/manifest.json @@ -206,6 +206,20 @@ "Title": "EchoHub.Client.Services.BackupInfo", "Summary": null }, + { + "type": "ManagedReference", + "source_relative_path": "_api_meta/client/EchoHub.Client.Services.ChannelPasswordRequiredException.yml", + "output": { + ".html": { + "relative_path": "api/client/EchoHub.Client.Services.ChannelPasswordRequiredException.html" + } + }, + "version": "", + "Uid": null, + "IsMRef": true, + "Title": "EchoHub.Client.Services.ChannelPasswordRequiredException", + "Summary": "

      Thrown when joining a channel fails because a password is required or incorrect.\nThe UI catches this to prompt the user and retry.

      \n" + }, { "type": "ManagedReference", "source_relative_path": "_api_meta/client/EchoHub.Client.Services.ClientEncryptionService.yml", @@ -220,6 +234,20 @@ "Title": "EchoHub.Client.Services.ClientEncryptionService", "Summary": "

      Client-side encryption service. Uses the same AES-256-GCM format as the server\nso messages are encrypted end-to-end between client and server.

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

      Reads file paths that live on the OS clipboard as a file list (e.g. after copying a file in\nExplorer/Finder/Nautilus), which terminals do not paste as text. Lets Ctrl+V attach a copied\nfile directly instead of requiring the user to paste a raw path.

      \n" + }, { "type": "ManagedReference", "source_relative_path": "_api_meta/client/EchoHub.Client.Services.EchoHubConnection.yml", @@ -234,6 +262,48 @@ "Title": "EchoHub.Client.Services.EchoHubConnection", "Summary": null }, + { + "type": "ManagedReference", + "source_relative_path": "_api_meta/client/EchoHub.Client.Services.FolderPickResult.yml", + "output": { + ".html": { + "relative_path": "api/client/EchoHub.Client.Services.FolderPickResult.html" + } + }, + "version": "", + "Uid": null, + "IsMRef": true, + "Title": "EchoHub.Client.Services.FolderPickResult", + "Summary": null + }, + { + "type": "ManagedReference", + "source_relative_path": "_api_meta/client/EchoHub.Client.Services.JoinOutcome.yml", + "output": { + ".html": { + "relative_path": "api/client/EchoHub.Client.Services.JoinOutcome.html" + } + }, + "version": "", + "Uid": null, + "IsMRef": true, + "Title": "EchoHub.Client.Services.JoinOutcome", + "Summary": "

      Result of joining a channel: decrypted history plus, for end-to-end encrypted\nchannels, the key envelope needed to unlock the room content key.

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

      Opens the OS-native folder chooser (Windows Explorer, macOS Finder, Linux GTK/KDE) by shelling\nout, so the TUI doesn't need a GUI toolkit reference. Returns \nwhen no native dialog can run, so callers can fall back to a configured path.

      \n" + }, { "type": "ManagedReference", "source_relative_path": "_api_meta/client/EchoHub.Client.Services.NotificationSoundService.yml", @@ -248,6 +318,20 @@ "Title": "EchoHub.Client.Services.NotificationSoundService", "Summary": null }, + { + "type": "ManagedReference", + "source_relative_path": "_api_meta/client/EchoHub.Client.Services.OutgoingAttachment.yml", + "output": { + ".html": { + "relative_path": "api/client/EchoHub.Client.Services.OutgoingAttachment.html" + } + }, + "version": "", + "Uid": null, + "IsMRef": true, + "Title": "EchoHub.Client.Services.OutgoingAttachment", + "Summary": "

      One file to upload as part of a message. For end-to-end encrypted channels the stream\nis already ciphertext, is set (image/audio/file), and\n holds the room-encrypted ASCII art for images.\nFor normal channels only and are set.

      \n" + }, { "type": "ManagedReference", "source_relative_path": "_api_meta/client/EchoHub.Client.Services.PathSetup.yml", @@ -262,6 +346,34 @@ "Title": "EchoHub.Client.Services.PathSetup", "Summary": "

      Ensures the application's directory is on the system PATH so users\ncan run 'echohub' from any terminal session.

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

      Holds room content keys for end-to-end encrypted channels: in-memory for the\nactive session, persisted per-server in the client config (like saved sessions)\nso users don't retype the passphrase every launch. Keys never leave this machine.

      \n" + }, { "type": "ManagedReference", "source_relative_path": "_api_meta/client/EchoHub.Client.Services.UpdateBackupService.yml", @@ -458,6 +570,20 @@ "Title": "EchoHub.Client.UI.Dialogs.AudioPlayerDialog", "Summary": null }, + { + "type": "ManagedReference", + "source_relative_path": "_api_meta/client/EchoHub.Client.UI.Dialogs.ChannelPasswordDialog.yml", + "output": { + ".html": { + "relative_path": "api/client/EchoHub.Client.UI.Dialogs.ChannelPasswordDialog.html" + } + }, + "version": "", + "Uid": null, + "IsMRef": true, + "Title": "EchoHub.Client.UI.Dialogs.ChannelPasswordDialog", + "Summary": "

      Prompts for a channel password when joining a protected channel.\nReturns the entered password, or null if the user cancels.

      \n" + }, { "type": "ManagedReference", "source_relative_path": "_api_meta/client/EchoHub.Client.UI.Dialogs.ConnectDialog.yml", @@ -682,6 +808,20 @@ "Title": "EchoHub.Client.UI.Dialogs", "Summary": null }, + { + "type": "ManagedReference", + "source_relative_path": "_api_meta/client/EchoHub.Client.UI.Helpers.DroppedFileParser.yml", + "output": { + ".html": { + "relative_path": "api/client/EchoHub.Client.UI.Helpers.DroppedFileParser.html" + } + }, + "version": "", + "Uid": null, + "IsMRef": true, + "Title": "EchoHub.Client.UI.Helpers.DroppedFileParser", + "Summary": "

      Recognizes a dragged-and-dropped file (or files) that a terminal delivers into the input as an\nabsolute path. Terminals differ: some paste the whole path at once, others send it character by\ncharacter; either way this checks whether the current input text resolves to existing file(s).

      \n" + }, { "type": "ManagedReference", "source_relative_path": "_api_meta/client/EchoHub.Client.UI.Helpers.EmojiHelper.yml", @@ -1018,6 +1158,20 @@ "Title": "EchoHub.Core.DTOs.AssignRoleRequest", "Summary": null }, + { + "type": "ManagedReference", + "source_relative_path": "_api_meta/core/EchoHub.Core.DTOs.AttachmentDto.yml", + "output": { + ".html": { + "relative_path": "api/core/EchoHub.Core.DTOs.AttachmentDto.html" + } + }, + "version": "", + "Uid": null, + "IsMRef": true, + "Title": "EchoHub.Core.DTOs.AttachmentDto", + "Summary": "

      A file attached to a message. holds the color-tag art for\nimages (null otherwise). For end-to-end encrypted channels the content behind\n and the preview are ciphertext the server cannot read.

      \n" + }, { "type": "ManagedReference", "source_relative_path": "_api_meta/core/EchoHub.Core.DTOs.AvatarUploadResponse.yml", @@ -1046,6 +1200,20 @@ "Title": "EchoHub.Core.DTOs.BanRequest", "Summary": null }, + { + "type": "ManagedReference", + "source_relative_path": "_api_meta/core/EchoHub.Core.DTOs.ChannelCryptoDto.yml", + "output": { + ".html": { + "relative_path": "api/core/EchoHub.Core.DTOs.ChannelCryptoDto.html" + } + }, + "version": "", + "Uid": null, + "IsMRef": true, + "Title": "EchoHub.Core.DTOs.ChannelCryptoDto", + "Summary": "

      Public crypto metadata for a channel — enough for a client to derive its join\ncredential from a passphrase. Never includes the wrapped room key.

      \n" + }, { "type": "ManagedReference", "source_relative_path": "_api_meta/core/EchoHub.Core.DTOs.ChannelDto.yml", @@ -1270,6 +1438,20 @@ "Title": "EchoHub.Core.DTOs.RegisterRequest", "Summary": null }, + { + "type": "ManagedReference", + "source_relative_path": "_api_meta/core/EchoHub.Core.DTOs.RekeyChannelRequest.yml", + "output": { + ".html": { + "relative_path": "api/core/EchoHub.Core.DTOs.RekeyChannelRequest.html" + } + }, + "version": "", + "Uid": null, + "IsMRef": true, + "Title": "EchoHub.Core.DTOs.RekeyChannelRequest", + "Summary": "

      Passphrase change for an encrypted channel: the client proves knowledge of the old\npassphrase (old auth key), then supplies the re-wrapped room key under the new one.

      \n" + }, { "type": "ManagedReference", "source_relative_path": "_api_meta/core/EchoHub.Core.DTOs.SendMessageRequest.yml", @@ -1438,6 +1620,34 @@ "Title": "EchoHub.Core.DTOs", "Summary": null }, + { + "type": "ManagedReference", + "source_relative_path": "_api_meta/core/EchoHub.Core.Models.Attachment.yml", + "output": { + ".html": { + "relative_path": "api/core/EchoHub.Core.Models.Attachment.html" + } + }, + "version": "", + "Uid": null, + "IsMRef": true, + "Title": "EchoHub.Core.Models.Attachment", + "Summary": "

      A file attached to a message (image, audio, or any file). A message may carry\nzero or more attachments alongside its text content (Discord-style).

      \n" + }, + { + "type": "ManagedReference", + "source_relative_path": "_api_meta/core/EchoHub.Core.Models.AttachmentKind.yml", + "output": { + ".html": { + "relative_path": "api/core/EchoHub.Core.Models.AttachmentKind.html" + } + }, + "version": "", + "Uid": null, + "IsMRef": true, + "Title": "EchoHub.Core.Models.AttachmentKind", + "Summary": "

      The kind of a message attachment. Determines how the client renders it\n(ASCII preview for images, a play affordance for audio, a download line for files).

      \n" + }, { "type": "ManagedReference", "source_relative_path": "_api_meta/core/EchoHub.Core.Models.Channel.yml", @@ -1564,6 +1774,90 @@ "Title": "EchoHub.Core.Models", "Summary": null }, + { + "type": "ManagedReference", + "source_relative_path": "_api_meta/core/EchoHub.Core.Security.RoomCrypto.DerivedKeys.yml", + "output": { + ".html": { + "relative_path": "api/core/EchoHub.Core.Security.RoomCrypto.DerivedKeys.html" + } + }, + "version": "", + "Uid": null, + "IsMRef": true, + "Title": "EchoHub.Core.Security.RoomCrypto.DerivedKeys", + "Summary": null + }, + { + "type": "ManagedReference", + "source_relative_path": "_api_meta/core/EchoHub.Core.Security.RoomCrypto.yml", + "output": { + ".html": { + "relative_path": "api/core/EchoHub.Core.Security.RoomCrypto.html" + } + }, + "version": "", + "Uid": null, + "IsMRef": true, + "Title": "EchoHub.Core.Security.RoomCrypto", + "Summary": "

      Client-side envelope encryption for private (end-to-end encrypted) channels.

      \n

      Design: at creation the client generates a random 256-bit room content key (RCK)\nthat encrypts all room content. The RCK is stored on the server wrapped\n(AES-GCM encrypted) by a key derived from the passphrase, next to a BCrypt hash\nof a separately derived auth key used as the join gate. The passphrase, the\nkey-encryption key, and the RCK never leave the client, so the server can gate\njoins and count/measure content without being able to read it. Changing the\npassphrase only re-wraps the RCK — history is never re-encrypted.

      \n

      Derivation: PBKDF2-SHA256(passphrase, salt, 210000 iterations) → 64 bytes;\nfirst 32 bytes are the auth key (sent to the server as lowercase hex),\nlast 32 bytes are the key-encryption key (never sent).

      \n" + }, + { + "type": "ManagedReference", + "source_relative_path": "_api_meta/core/EchoHub.Core.Security.yml", + "output": { + ".html": { + "relative_path": "api/core/EchoHub.Core.Security.html" + } + }, + "version": "", + "Uid": null, + "IsMRef": true, + "Title": "EchoHub.Core.Security", + "Summary": null + }, + { + "type": "ManagedReference", + "source_relative_path": "_api_meta/core/EchoHub.Core.Services.FileValidationHelper.yml", + "output": { + ".html": { + "relative_path": "api/core/EchoHub.Core.Services.FileValidationHelper.html" + } + }, + "version": "", + "Uid": null, + "IsMRef": true, + "Title": "EchoHub.Core.Services.FileValidationHelper", + "Summary": null + }, + { + "type": "ManagedReference", + "source_relative_path": "_api_meta/core/EchoHub.Core.Services.ImageToAsciiService.yml", + "output": { + ".html": { + "relative_path": "api/core/EchoHub.Core.Services.ImageToAsciiService.html" + } + }, + "version": "", + "Uid": null, + "IsMRef": true, + "Title": "EchoHub.Core.Services.ImageToAsciiService", + "Summary": null + }, + { + "type": "ManagedReference", + "source_relative_path": "_api_meta/core/EchoHub.Core.Services.yml", + "output": { + ".html": { + "relative_path": "api/core/EchoHub.Core.Services.html" + } + }, + "version": "", + "Uid": null, + "IsMRef": true, + "Title": "EchoHub.Core.Services", + "Summary": null + }, { "type": "ManagedReference", "source_relative_path": "_api_meta/server-irc/EchoHub.Server.Irc.IrcBroadcaster.yml", @@ -1858,6 +2152,20 @@ "Title": "EchoHub.Server.Data.Migrations.AddAttachmentFileSize", "Summary": null }, + { + "type": "ManagedReference", + "source_relative_path": "_api_meta/server/EchoHub.Server.Data.Migrations.AddChannelEncryptionEnvelope.yml", + "output": { + ".html": { + "relative_path": "api/server/EchoHub.Server.Data.Migrations.AddChannelEncryptionEnvelope.html" + } + }, + "version": "", + "Uid": null, + "IsMRef": true, + "Title": "EchoHub.Server.Data.Migrations.AddChannelEncryptionEnvelope", + "Summary": null + }, { "type": "ManagedReference", "source_relative_path": "_api_meta/server/EchoHub.Server.Data.Migrations.AddChannelIsPublic.yml", @@ -1886,6 +2194,20 @@ "Title": "EchoHub.Server.Data.Migrations.AddChannelMembership", "Summary": null }, + { + "type": "ManagedReference", + "source_relative_path": "_api_meta/server/EchoHub.Server.Data.Migrations.AddChannelPasswordHash.yml", + "output": { + ".html": { + "relative_path": "api/server/EchoHub.Server.Data.Migrations.AddChannelPasswordHash.html" + } + }, + "version": "", + "Uid": null, + "IsMRef": true, + "Title": "EchoHub.Server.Data.Migrations.AddChannelPasswordHash", + "Summary": null + }, { "type": "ManagedReference", "source_relative_path": "_api_meta/server/EchoHub.Server.Data.Migrations.AddEncryptionSupport.yml", @@ -1900,6 +2222,20 @@ "Title": "EchoHub.Server.Data.Migrations.AddEncryptionSupport", "Summary": null }, + { + "type": "ManagedReference", + "source_relative_path": "_api_meta/server/EchoHub.Server.Data.Migrations.AddMessageAttachments.yml", + "output": { + ".html": { + "relative_path": "api/server/EchoHub.Server.Data.Migrations.AddMessageAttachments.html" + } + }, + "version": "", + "Uid": null, + "IsMRef": true, + "Title": "EchoHub.Server.Data.Migrations.AddMessageAttachments", + "Summary": null + }, { "type": "ManagedReference", "source_relative_path": "_api_meta/server/EchoHub.Server.Data.Migrations.AddMessageEmbed.yml", @@ -2068,34 +2404,6 @@ "Title": "EchoHub.Server.Services.FileStorageService", "Summary": null }, - { - "type": "ManagedReference", - "source_relative_path": "_api_meta/server/EchoHub.Server.Services.FileValidationHelper.yml", - "output": { - ".html": { - "relative_path": "api/server/EchoHub.Server.Services.FileValidationHelper.html" - } - }, - "version": "", - "Uid": null, - "IsMRef": true, - "Title": "EchoHub.Server.Services.FileValidationHelper", - "Summary": null - }, - { - "type": "ManagedReference", - "source_relative_path": "_api_meta/server/EchoHub.Server.Services.ImageToAsciiService.yml", - "output": { - ".html": { - "relative_path": "api/server/EchoHub.Server.Services.ImageToAsciiService.html" - } - }, - "version": "", - "Uid": null, - "IsMRef": true, - "Title": "EchoHub.Server.Services.ImageToAsciiService", - "Summary": null - }, { "type": "ManagedReference", "source_relative_path": "_api_meta/server/EchoHub.Server.Services.LinkEmbedService.yml", @@ -2526,6 +2834,16 @@ }, "version": "" }, + { + "type": "Conceptual", + "source_relative_path": "changelog/v0.2.12.md", + "output": { + ".html": { + "relative_path": "changelog/v0.2.12.html" + } + }, + "version": "" + }, { "type": "Conceptual", "source_relative_path": "changelog/v0.2.2.md", diff --git a/todo.html b/todo.html index 5d50244..8c3157f 100644 --- a/todo.html +++ b/todo.html @@ -77,7 +77,7 @@
    • [ ] fix the chat trailing; when user scrolls up, and somebody sends a message – the chat instantly "teleports" to the very bottom
    • [x] disable the autorun of files (maybe keep for mp4? gotta do some sec research on it)
    • [x] when user creates a new channel, he gets moved to that channel; but the userlist does not refresh the state on that – it refreshes when user re-enters the channel again
    • -
    • [ ] password protected rooms
    • +
    • [x] password protected rooms (end-to-end encrypted — server cannot read contents)
    • [ ] better audio lib, current one (NetCoreAudio) does not support seek or other audio actions
    • [ ] Use options pattern for both client & server
        diff --git a/xrefmap.yml b/xrefmap.yml index ac8e91a..c70fe3f 100644 --- a/xrefmap.yml +++ b/xrefmap.yml @@ -127,6 +127,18 @@ references: commentId: E:EchoHub.Client.Commands.CommandHandler.OnBanUser fullName: EchoHub.Client.Commands.CommandHandler.OnBanUser nameWithType: CommandHandler.OnBanUser +- uid: EchoHub.Client.Commands.CommandHandler.OnChangeRoomPassword + name: OnChangeRoomPassword + href: api/client/EchoHub.Client.Commands.CommandHandler.html#EchoHub_Client_Commands_CommandHandler_OnChangeRoomPassword + commentId: E:EchoHub.Client.Commands.CommandHandler.OnChangeRoomPassword + fullName: EchoHub.Client.Commands.CommandHandler.OnChangeRoomPassword + nameWithType: CommandHandler.OnChangeRoomPassword +- uid: EchoHub.Client.Commands.CommandHandler.OnClearAttachments + name: OnClearAttachments + href: api/client/EchoHub.Client.Commands.CommandHandler.html#EchoHub_Client_Commands_CommandHandler_OnClearAttachments + commentId: E:EchoHub.Client.Commands.CommandHandler.OnClearAttachments + fullName: EchoHub.Client.Commands.CommandHandler.OnClearAttachments + nameWithType: CommandHandler.OnClearAttachments - uid: EchoHub.Client.Commands.CommandHandler.OnHelp name: OnHelp href: api/client/EchoHub.Client.Commands.CommandHandler.html#EchoHub_Client_Commands_CommandHandler_OnHelp @@ -193,6 +205,12 @@ references: commentId: E:EchoHub.Client.Commands.CommandHandler.OnSendFile fullName: EchoHub.Client.Commands.CommandHandler.OnSendFile nameWithType: CommandHandler.OnSendFile +- uid: EchoHub.Client.Commands.CommandHandler.OnSetAsciiSize + name: OnSetAsciiSize + href: api/client/EchoHub.Client.Commands.CommandHandler.html#EchoHub_Client_Commands_CommandHandler_OnSetAsciiSize + commentId: E:EchoHub.Client.Commands.CommandHandler.OnSetAsciiSize + fullName: EchoHub.Client.Commands.CommandHandler.OnSetAsciiSize + nameWithType: CommandHandler.OnSetAsciiSize - uid: EchoHub.Client.Commands.CommandHandler.OnSetAvatar name: OnSetAvatar href: api/client/EchoHub.Client.Commands.CommandHandler.html#EchoHub_Client_Commands_CommandHandler_OnSetAvatar @@ -205,6 +223,12 @@ references: commentId: E:EchoHub.Client.Commands.CommandHandler.OnSetColor fullName: EchoHub.Client.Commands.CommandHandler.OnSetColor nameWithType: CommandHandler.OnSetColor +- uid: EchoHub.Client.Commands.CommandHandler.OnSetDownloadPath + name: OnSetDownloadPath + href: api/client/EchoHub.Client.Commands.CommandHandler.html#EchoHub_Client_Commands_CommandHandler_OnSetDownloadPath + commentId: E:EchoHub.Client.Commands.CommandHandler.OnSetDownloadPath + fullName: EchoHub.Client.Commands.CommandHandler.OnSetDownloadPath + nameWithType: CommandHandler.OnSetDownloadPath - uid: EchoHub.Client.Commands.CommandHandler.OnSetNick name: OnSetNick href: api/client/EchoHub.Client.Commands.CommandHandler.html#EchoHub_Client_Commands_CommandHandler_OnSetNick @@ -541,6 +565,18 @@ references: commentId: Overload:EchoHub.Client.Config.ClientConfig.ActiveTheme fullName: EchoHub.Client.Config.ClientConfig.ActiveTheme nameWithType: ClientConfig.ActiveTheme +- uid: EchoHub.Client.Config.ClientConfig.DefaultAsciiSize + name: DefaultAsciiSize + href: api/client/EchoHub.Client.Config.ClientConfig.html#EchoHub_Client_Config_ClientConfig_DefaultAsciiSize + commentId: P:EchoHub.Client.Config.ClientConfig.DefaultAsciiSize + fullName: EchoHub.Client.Config.ClientConfig.DefaultAsciiSize + nameWithType: ClientConfig.DefaultAsciiSize +- uid: EchoHub.Client.Config.ClientConfig.DefaultAsciiSize* + name: DefaultAsciiSize + href: api/client/EchoHub.Client.Config.ClientConfig.html#EchoHub_Client_Config_ClientConfig_DefaultAsciiSize_ + commentId: Overload:EchoHub.Client.Config.ClientConfig.DefaultAsciiSize + fullName: EchoHub.Client.Config.ClientConfig.DefaultAsciiSize + nameWithType: ClientConfig.DefaultAsciiSize - uid: EchoHub.Client.Config.ClientConfig.DefaultPreset name: DefaultPreset href: api/client/EchoHub.Client.Config.ClientConfig.html#EchoHub_Client_Config_ClientConfig_DefaultPreset @@ -553,6 +589,18 @@ references: commentId: Overload:EchoHub.Client.Config.ClientConfig.DefaultPreset fullName: EchoHub.Client.Config.ClientConfig.DefaultPreset nameWithType: ClientConfig.DefaultPreset +- uid: EchoHub.Client.Config.ClientConfig.DownloadPath + name: DownloadPath + href: api/client/EchoHub.Client.Config.ClientConfig.html#EchoHub_Client_Config_ClientConfig_DownloadPath + commentId: P:EchoHub.Client.Config.ClientConfig.DownloadPath + fullName: EchoHub.Client.Config.ClientConfig.DownloadPath + nameWithType: ClientConfig.DownloadPath +- uid: EchoHub.Client.Config.ClientConfig.DownloadPath* + name: DownloadPath + href: api/client/EchoHub.Client.Config.ClientConfig.html#EchoHub_Client_Config_ClientConfig_DownloadPath_ + commentId: Overload:EchoHub.Client.Config.ClientConfig.DownloadPath + fullName: EchoHub.Client.Config.ClientConfig.DownloadPath + nameWithType: ClientConfig.DownloadPath - uid: EchoHub.Client.Config.ClientConfig.Notifications name: Notifications href: api/client/EchoHub.Client.Config.ClientConfig.html#EchoHub_Client_Config_ClientConfig_Notifications @@ -718,6 +766,18 @@ references: fullName.vb: EchoHub.Client.Config.SavedServer.New nameWithType: SavedServer.SavedServer nameWithType.vb: SavedServer.New +- uid: EchoHub.Client.Config.SavedServer.ChannelKeys + name: ChannelKeys + href: api/client/EchoHub.Client.Config.SavedServer.html#EchoHub_Client_Config_SavedServer_ChannelKeys + commentId: P:EchoHub.Client.Config.SavedServer.ChannelKeys + fullName: EchoHub.Client.Config.SavedServer.ChannelKeys + nameWithType: SavedServer.ChannelKeys +- uid: EchoHub.Client.Config.SavedServer.ChannelKeys* + name: ChannelKeys + href: api/client/EchoHub.Client.Config.SavedServer.html#EchoHub_Client_Config_SavedServer_ChannelKeys_ + commentId: Overload:EchoHub.Client.Config.SavedServer.ChannelKeys + fullName: EchoHub.Client.Config.SavedServer.ChannelKeys + nameWithType: SavedServer.ChannelKeys - uid: EchoHub.Client.Config.SavedServer.LastConnected name: LastConnected href: api/client/EchoHub.Client.Config.SavedServer.html#EchoHub_Client_Config_SavedServer_LastConnected @@ -862,15 +922,15 @@ references: commentId: Overload:EchoHub.Client.Services.ApiClient.BaseUrl fullName: EchoHub.Client.Services.ApiClient.BaseUrl nameWithType: ApiClient.BaseUrl -- uid: EchoHub.Client.Services.ApiClient.CreateChannelAsync(System.String,System.String,System.Boolean) - name: CreateChannelAsync(string, string?, bool) - href: api/client/EchoHub.Client.Services.ApiClient.html#EchoHub_Client_Services_ApiClient_CreateChannelAsync_System_String_System_String_System_Boolean_ - commentId: M:EchoHub.Client.Services.ApiClient.CreateChannelAsync(System.String,System.String,System.Boolean) - name.vb: CreateChannelAsync(String, String, Boolean) - fullName: EchoHub.Client.Services.ApiClient.CreateChannelAsync(string, string?, bool) - fullName.vb: EchoHub.Client.Services.ApiClient.CreateChannelAsync(String, String, Boolean) - nameWithType: ApiClient.CreateChannelAsync(string, string?, bool) - nameWithType.vb: ApiClient.CreateChannelAsync(String, String, Boolean) +- uid: EchoHub.Client.Services.ApiClient.CreateChannelAsync(System.String,System.String,System.Boolean,System.String,System.String,System.String) + name: CreateChannelAsync(string, string?, bool, string?, string?, string?) + href: api/client/EchoHub.Client.Services.ApiClient.html#EchoHub_Client_Services_ApiClient_CreateChannelAsync_System_String_System_String_System_Boolean_System_String_System_String_System_String_ + commentId: M:EchoHub.Client.Services.ApiClient.CreateChannelAsync(System.String,System.String,System.Boolean,System.String,System.String,System.String) + name.vb: CreateChannelAsync(String, String, Boolean, String, String, String) + fullName: EchoHub.Client.Services.ApiClient.CreateChannelAsync(string, string?, bool, string?, string?, string?) + fullName.vb: EchoHub.Client.Services.ApiClient.CreateChannelAsync(String, String, Boolean, String, String, String) + nameWithType: ApiClient.CreateChannelAsync(string, string?, bool, string?, string?, string?) + nameWithType.vb: ApiClient.CreateChannelAsync(String, String, Boolean, String, String, String) - uid: EchoHub.Client.Services.ApiClient.CreateChannelAsync* name: CreateChannelAsync href: api/client/EchoHub.Client.Services.ApiClient.html#EchoHub_Client_Services_ApiClient_CreateChannelAsync_ @@ -931,6 +991,21 @@ references: commentId: Overload:EchoHub.Client.Services.ApiClient.DownloadFileToTempAsync fullName: EchoHub.Client.Services.ApiClient.DownloadFileToTempAsync nameWithType: ApiClient.DownloadFileToTempAsync +- uid: EchoHub.Client.Services.ApiClient.GetChannelCryptoAsync(System.String) + name: GetChannelCryptoAsync(string) + href: api/client/EchoHub.Client.Services.ApiClient.html#EchoHub_Client_Services_ApiClient_GetChannelCryptoAsync_System_String_ + commentId: M:EchoHub.Client.Services.ApiClient.GetChannelCryptoAsync(System.String) + name.vb: GetChannelCryptoAsync(String) + fullName: EchoHub.Client.Services.ApiClient.GetChannelCryptoAsync(string) + fullName.vb: EchoHub.Client.Services.ApiClient.GetChannelCryptoAsync(String) + nameWithType: ApiClient.GetChannelCryptoAsync(string) + nameWithType.vb: ApiClient.GetChannelCryptoAsync(String) +- uid: EchoHub.Client.Services.ApiClient.GetChannelCryptoAsync* + name: GetChannelCryptoAsync + href: api/client/EchoHub.Client.Services.ApiClient.html#EchoHub_Client_Services_ApiClient_GetChannelCryptoAsync_ + commentId: Overload:EchoHub.Client.Services.ApiClient.GetChannelCryptoAsync + fullName: EchoHub.Client.Services.ApiClient.GetChannelCryptoAsync + nameWithType: ApiClient.GetChannelCryptoAsync - uid: EchoHub.Client.Services.ApiClient.GetChannelsAsync name: GetChannelsAsync() href: api/client/EchoHub.Client.Services.ApiClient.html#EchoHub_Client_Services_ApiClient_GetChannelsAsync @@ -1126,6 +1201,36 @@ references: commentId: Overload:EchoHub.Client.Services.ApiClient.RegisterAsync fullName: EchoHub.Client.Services.ApiClient.RegisterAsync nameWithType: ApiClient.RegisterAsync +- uid: EchoHub.Client.Services.ApiClient.RekeyChannelAsync(System.String,EchoHub.Core.DTOs.RekeyChannelRequest) + name: RekeyChannelAsync(string, RekeyChannelRequest) + href: api/client/EchoHub.Client.Services.ApiClient.html#EchoHub_Client_Services_ApiClient_RekeyChannelAsync_System_String_EchoHub_Core_DTOs_RekeyChannelRequest_ + commentId: M:EchoHub.Client.Services.ApiClient.RekeyChannelAsync(System.String,EchoHub.Core.DTOs.RekeyChannelRequest) + name.vb: RekeyChannelAsync(String, RekeyChannelRequest) + fullName: EchoHub.Client.Services.ApiClient.RekeyChannelAsync(string, EchoHub.Core.DTOs.RekeyChannelRequest) + fullName.vb: EchoHub.Client.Services.ApiClient.RekeyChannelAsync(String, EchoHub.Core.DTOs.RekeyChannelRequest) + nameWithType: ApiClient.RekeyChannelAsync(string, RekeyChannelRequest) + nameWithType.vb: ApiClient.RekeyChannelAsync(String, RekeyChannelRequest) +- uid: EchoHub.Client.Services.ApiClient.RekeyChannelAsync* + name: RekeyChannelAsync + href: api/client/EchoHub.Client.Services.ApiClient.html#EchoHub_Client_Services_ApiClient_RekeyChannelAsync_ + commentId: Overload:EchoHub.Client.Services.ApiClient.RekeyChannelAsync + fullName: EchoHub.Client.Services.ApiClient.RekeyChannelAsync + nameWithType: ApiClient.RekeyChannelAsync +- uid: EchoHub.Client.Services.ApiClient.SendMessageWithAttachmentsAsync(System.String,System.String,System.Collections.Generic.IReadOnlyList{EchoHub.Client.Services.OutgoingAttachment},System.String) + name: SendMessageWithAttachmentsAsync(string, string, IReadOnlyList, string?) + href: api/client/EchoHub.Client.Services.ApiClient.html#EchoHub_Client_Services_ApiClient_SendMessageWithAttachmentsAsync_System_String_System_String_System_Collections_Generic_IReadOnlyList_EchoHub_Client_Services_OutgoingAttachment__System_String_ + commentId: M:EchoHub.Client.Services.ApiClient.SendMessageWithAttachmentsAsync(System.String,System.String,System.Collections.Generic.IReadOnlyList{EchoHub.Client.Services.OutgoingAttachment},System.String) + name.vb: SendMessageWithAttachmentsAsync(String, String, IReadOnlyList(Of OutgoingAttachment), String) + fullName: EchoHub.Client.Services.ApiClient.SendMessageWithAttachmentsAsync(string, string, System.Collections.Generic.IReadOnlyList, string?) + fullName.vb: EchoHub.Client.Services.ApiClient.SendMessageWithAttachmentsAsync(String, String, System.Collections.Generic.IReadOnlyList(Of EchoHub.Client.Services.OutgoingAttachment), String) + nameWithType: ApiClient.SendMessageWithAttachmentsAsync(string, string, IReadOnlyList, string?) + nameWithType.vb: ApiClient.SendMessageWithAttachmentsAsync(String, String, IReadOnlyList(Of OutgoingAttachment), String) +- uid: EchoHub.Client.Services.ApiClient.SendMessageWithAttachmentsAsync* + name: SendMessageWithAttachmentsAsync + href: api/client/EchoHub.Client.Services.ApiClient.html#EchoHub_Client_Services_ApiClient_SendMessageWithAttachmentsAsync_ + commentId: Overload:EchoHub.Client.Services.ApiClient.SendMessageWithAttachmentsAsync + fullName: EchoHub.Client.Services.ApiClient.SendMessageWithAttachmentsAsync + nameWithType: ApiClient.SendMessageWithAttachmentsAsync - uid: EchoHub.Client.Services.ApiClient.SendUrlAsync(System.String,System.String,System.String) name: SendUrlAsync(string, string, string?) href: api/client/EchoHub.Client.Services.ApiClient.html#EchoHub_Client_Services_ApiClient_SendUrlAsync_System_String_System_String_System_String_ @@ -1225,21 +1330,6 @@ references: commentId: Overload:EchoHub.Client.Services.ApiClient.UploadAvatarAsync fullName: EchoHub.Client.Services.ApiClient.UploadAvatarAsync nameWithType: ApiClient.UploadAvatarAsync -- uid: EchoHub.Client.Services.ApiClient.UploadFileAsync(System.String,System.IO.Stream,System.String,System.String) - name: UploadFileAsync(string, Stream, string, string?) - href: api/client/EchoHub.Client.Services.ApiClient.html#EchoHub_Client_Services_ApiClient_UploadFileAsync_System_String_System_IO_Stream_System_String_System_String_ - commentId: M:EchoHub.Client.Services.ApiClient.UploadFileAsync(System.String,System.IO.Stream,System.String,System.String) - name.vb: UploadFileAsync(String, Stream, String, String) - fullName: EchoHub.Client.Services.ApiClient.UploadFileAsync(string, System.IO.Stream, string, string?) - fullName.vb: EchoHub.Client.Services.ApiClient.UploadFileAsync(String, System.IO.Stream, String, String) - nameWithType: ApiClient.UploadFileAsync(string, Stream, string, string?) - nameWithType.vb: ApiClient.UploadFileAsync(String, Stream, String, String) -- uid: EchoHub.Client.Services.ApiClient.UploadFileAsync* - name: UploadFileAsync - href: api/client/EchoHub.Client.Services.ApiClient.html#EchoHub_Client_Services_ApiClient_UploadFileAsync_ - commentId: Overload:EchoHub.Client.Services.ApiClient.UploadFileAsync - fullName: EchoHub.Client.Services.ApiClient.UploadFileAsync - nameWithType: ApiClient.UploadFileAsync - uid: EchoHub.Client.Services.AsyncRunner name: AsyncRunner href: api/client/EchoHub.Client.Services.AsyncRunner.html @@ -1573,6 +1663,42 @@ references: fullName.vb: EchoHub.Client.Services.BackupInfo.<> nameWithType: BackupInfo.operator != nameWithType.vb: BackupInfo.<> +- uid: EchoHub.Client.Services.ChannelPasswordRequiredException + name: ChannelPasswordRequiredException + href: api/client/EchoHub.Client.Services.ChannelPasswordRequiredException.html + commentId: T:EchoHub.Client.Services.ChannelPasswordRequiredException + fullName: EchoHub.Client.Services.ChannelPasswordRequiredException + nameWithType: ChannelPasswordRequiredException +- uid: EchoHub.Client.Services.ChannelPasswordRequiredException.#ctor(System.String,System.String) + name: ChannelPasswordRequiredException(string, string) + href: api/client/EchoHub.Client.Services.ChannelPasswordRequiredException.html#EchoHub_Client_Services_ChannelPasswordRequiredException__ctor_System_String_System_String_ + commentId: M:EchoHub.Client.Services.ChannelPasswordRequiredException.#ctor(System.String,System.String) + name.vb: New(String, String) + fullName: EchoHub.Client.Services.ChannelPasswordRequiredException.ChannelPasswordRequiredException(string, string) + fullName.vb: EchoHub.Client.Services.ChannelPasswordRequiredException.New(String, String) + nameWithType: ChannelPasswordRequiredException.ChannelPasswordRequiredException(string, string) + nameWithType.vb: ChannelPasswordRequiredException.New(String, String) +- uid: EchoHub.Client.Services.ChannelPasswordRequiredException.#ctor* + name: ChannelPasswordRequiredException + href: api/client/EchoHub.Client.Services.ChannelPasswordRequiredException.html#EchoHub_Client_Services_ChannelPasswordRequiredException__ctor_ + commentId: Overload:EchoHub.Client.Services.ChannelPasswordRequiredException.#ctor + name.vb: New + fullName: EchoHub.Client.Services.ChannelPasswordRequiredException.ChannelPasswordRequiredException + fullName.vb: EchoHub.Client.Services.ChannelPasswordRequiredException.New + nameWithType: ChannelPasswordRequiredException.ChannelPasswordRequiredException + nameWithType.vb: ChannelPasswordRequiredException.New +- uid: EchoHub.Client.Services.ChannelPasswordRequiredException.ChannelName + name: ChannelName + href: api/client/EchoHub.Client.Services.ChannelPasswordRequiredException.html#EchoHub_Client_Services_ChannelPasswordRequiredException_ChannelName + commentId: P:EchoHub.Client.Services.ChannelPasswordRequiredException.ChannelName + fullName: EchoHub.Client.Services.ChannelPasswordRequiredException.ChannelName + nameWithType: ChannelPasswordRequiredException.ChannelName +- uid: EchoHub.Client.Services.ChannelPasswordRequiredException.ChannelName* + name: ChannelName + href: api/client/EchoHub.Client.Services.ChannelPasswordRequiredException.html#EchoHub_Client_Services_ChannelPasswordRequiredException_ChannelName_ + commentId: Overload:EchoHub.Client.Services.ChannelPasswordRequiredException.ChannelName + fullName: EchoHub.Client.Services.ChannelPasswordRequiredException.ChannelName + nameWithType: ChannelPasswordRequiredException.ChannelName - uid: EchoHub.Client.Services.ClientEncryptionService name: ClientEncryptionService href: api/client/EchoHub.Client.Services.ClientEncryptionService.html @@ -1696,21 +1822,42 @@ references: commentId: Overload:EchoHub.Client.Services.ClientEncryptionService.SetKey fullName: EchoHub.Client.Services.ClientEncryptionService.SetKey nameWithType: ClientEncryptionService.SetKey +- uid: EchoHub.Client.Services.ClipboardFiles + name: ClipboardFiles + href: api/client/EchoHub.Client.Services.ClipboardFiles.html + commentId: T:EchoHub.Client.Services.ClipboardFiles + fullName: EchoHub.Client.Services.ClipboardFiles + nameWithType: ClipboardFiles +- uid: EchoHub.Client.Services.ClipboardFiles.TryGetFiles(System.Collections.Generic.List{System.String}@) + name: TryGetFiles(out List) + href: api/client/EchoHub.Client.Services.ClipboardFiles.html#EchoHub_Client_Services_ClipboardFiles_TryGetFiles_System_Collections_Generic_List_System_String___ + commentId: M:EchoHub.Client.Services.ClipboardFiles.TryGetFiles(System.Collections.Generic.List{System.String}@) + name.vb: TryGetFiles(List(Of String)) + fullName: EchoHub.Client.Services.ClipboardFiles.TryGetFiles(out System.Collections.Generic.List) + fullName.vb: EchoHub.Client.Services.ClipboardFiles.TryGetFiles(System.Collections.Generic.List(Of String)) + nameWithType: ClipboardFiles.TryGetFiles(out List) + nameWithType.vb: ClipboardFiles.TryGetFiles(List(Of String)) +- uid: EchoHub.Client.Services.ClipboardFiles.TryGetFiles* + name: TryGetFiles + href: api/client/EchoHub.Client.Services.ClipboardFiles.html#EchoHub_Client_Services_ClipboardFiles_TryGetFiles_ + commentId: Overload:EchoHub.Client.Services.ClipboardFiles.TryGetFiles + fullName: EchoHub.Client.Services.ClipboardFiles.TryGetFiles + nameWithType: ClipboardFiles.TryGetFiles - uid: EchoHub.Client.Services.EchoHubConnection name: EchoHubConnection href: api/client/EchoHub.Client.Services.EchoHubConnection.html commentId: T:EchoHub.Client.Services.EchoHubConnection fullName: EchoHub.Client.Services.EchoHubConnection nameWithType: EchoHubConnection -- uid: EchoHub.Client.Services.EchoHubConnection.#ctor(System.String,EchoHub.Client.Services.ApiClient,EchoHub.Client.Services.ClientEncryptionService) - name: EchoHubConnection(string, ApiClient, ClientEncryptionService) - href: api/client/EchoHub.Client.Services.EchoHubConnection.html#EchoHub_Client_Services_EchoHubConnection__ctor_System_String_EchoHub_Client_Services_ApiClient_EchoHub_Client_Services_ClientEncryptionService_ - commentId: M:EchoHub.Client.Services.EchoHubConnection.#ctor(System.String,EchoHub.Client.Services.ApiClient,EchoHub.Client.Services.ClientEncryptionService) - name.vb: New(String, ApiClient, ClientEncryptionService) - fullName: EchoHub.Client.Services.EchoHubConnection.EchoHubConnection(string, EchoHub.Client.Services.ApiClient, EchoHub.Client.Services.ClientEncryptionService) - fullName.vb: EchoHub.Client.Services.EchoHubConnection.New(String, EchoHub.Client.Services.ApiClient, EchoHub.Client.Services.ClientEncryptionService) - nameWithType: EchoHubConnection.EchoHubConnection(string, ApiClient, ClientEncryptionService) - nameWithType.vb: EchoHubConnection.New(String, ApiClient, ClientEncryptionService) +- uid: EchoHub.Client.Services.EchoHubConnection.#ctor(System.String,EchoHub.Client.Services.ApiClient,EchoHub.Client.Services.ClientEncryptionService,EchoHub.Client.Services.RoomKeyStore) + name: EchoHubConnection(string, ApiClient, ClientEncryptionService, RoomKeyStore) + href: api/client/EchoHub.Client.Services.EchoHubConnection.html#EchoHub_Client_Services_EchoHubConnection__ctor_System_String_EchoHub_Client_Services_ApiClient_EchoHub_Client_Services_ClientEncryptionService_EchoHub_Client_Services_RoomKeyStore_ + commentId: M:EchoHub.Client.Services.EchoHubConnection.#ctor(System.String,EchoHub.Client.Services.ApiClient,EchoHub.Client.Services.ClientEncryptionService,EchoHub.Client.Services.RoomKeyStore) + name.vb: New(String, ApiClient, ClientEncryptionService, RoomKeyStore) + fullName: EchoHub.Client.Services.EchoHubConnection.EchoHubConnection(string, EchoHub.Client.Services.ApiClient, EchoHub.Client.Services.ClientEncryptionService, EchoHub.Client.Services.RoomKeyStore) + fullName.vb: EchoHub.Client.Services.EchoHubConnection.New(String, EchoHub.Client.Services.ApiClient, EchoHub.Client.Services.ClientEncryptionService, EchoHub.Client.Services.RoomKeyStore) + nameWithType: EchoHubConnection.EchoHubConnection(string, ApiClient, ClientEncryptionService, RoomKeyStore) + nameWithType.vb: EchoHubConnection.New(String, ApiClient, ClientEncryptionService, RoomKeyStore) - uid: EchoHub.Client.Services.EchoHubConnection.#ctor* name: EchoHubConnection href: api/client/EchoHub.Client.Services.EchoHubConnection.html#EchoHub_Client_Services_EchoHubConnection__ctor_ @@ -1798,15 +1945,15 @@ references: commentId: Overload:EchoHub.Client.Services.EchoHubConnection.IsConnected fullName: EchoHub.Client.Services.EchoHubConnection.IsConnected nameWithType: EchoHubConnection.IsConnected -- uid: EchoHub.Client.Services.EchoHubConnection.JoinChannelAsync(System.String) - name: JoinChannelAsync(string) - href: api/client/EchoHub.Client.Services.EchoHubConnection.html#EchoHub_Client_Services_EchoHubConnection_JoinChannelAsync_System_String_ - commentId: M:EchoHub.Client.Services.EchoHubConnection.JoinChannelAsync(System.String) - name.vb: JoinChannelAsync(String) - fullName: EchoHub.Client.Services.EchoHubConnection.JoinChannelAsync(string) - fullName.vb: EchoHub.Client.Services.EchoHubConnection.JoinChannelAsync(String) - nameWithType: EchoHubConnection.JoinChannelAsync(string) - nameWithType.vb: EchoHubConnection.JoinChannelAsync(String) +- uid: EchoHub.Client.Services.EchoHubConnection.JoinChannelAsync(System.String,System.String) + name: JoinChannelAsync(string, string?) + href: api/client/EchoHub.Client.Services.EchoHubConnection.html#EchoHub_Client_Services_EchoHubConnection_JoinChannelAsync_System_String_System_String_ + commentId: M:EchoHub.Client.Services.EchoHubConnection.JoinChannelAsync(System.String,System.String) + name.vb: JoinChannelAsync(String, String) + fullName: EchoHub.Client.Services.EchoHubConnection.JoinChannelAsync(string, string?) + fullName.vb: EchoHub.Client.Services.EchoHubConnection.JoinChannelAsync(String, String) + nameWithType: EchoHubConnection.JoinChannelAsync(string, string?) + nameWithType.vb: EchoHubConnection.JoinChannelAsync(String, String) - uid: EchoHub.Client.Services.EchoHubConnection.JoinChannelAsync* name: JoinChannelAsync href: api/client/EchoHub.Client.Services.EchoHubConnection.html#EchoHub_Client_Services_EchoHubConnection_JoinChannelAsync_ @@ -1828,6 +1975,12 @@ references: commentId: Overload:EchoHub.Client.Services.EchoHubConnection.LeaveChannelAsync fullName: EchoHub.Client.Services.EchoHubConnection.LeaveChannelAsync nameWithType: EchoHubConnection.LeaveChannelAsync +- uid: EchoHub.Client.Services.EchoHubConnection.LockedMessagePlaceholder + name: LockedMessagePlaceholder + href: api/client/EchoHub.Client.Services.EchoHubConnection.html#EchoHub_Client_Services_EchoHubConnection_LockedMessagePlaceholder + commentId: F:EchoHub.Client.Services.EchoHubConnection.LockedMessagePlaceholder + fullName: EchoHub.Client.Services.EchoHubConnection.LockedMessagePlaceholder + nameWithType: EchoHubConnection.LockedMessagePlaceholder - uid: EchoHub.Client.Services.EchoHubConnection.OnChannelNuked name: OnChannelNuked href: api/client/EchoHub.Client.Services.EchoHubConnection.html#EchoHub_Client_Services_EchoHubConnection_OnChannelNuked @@ -1936,6 +2089,333 @@ references: commentId: Overload:EchoHub.Client.Services.EchoHubConnection.UpdateStatusAsync fullName: EchoHub.Client.Services.EchoHubConnection.UpdateStatusAsync nameWithType: EchoHubConnection.UpdateStatusAsync +- uid: EchoHub.Client.Services.FolderPickResult + name: FolderPickResult + href: api/client/EchoHub.Client.Services.FolderPickResult.html + commentId: T:EchoHub.Client.Services.FolderPickResult + fullName: EchoHub.Client.Services.FolderPickResult + nameWithType: FolderPickResult +- uid: EchoHub.Client.Services.FolderPickResult.#ctor(EchoHub.Client.Services.PickerOutcome,System.String) + name: FolderPickResult(PickerOutcome, string?) + href: api/client/EchoHub.Client.Services.FolderPickResult.html#EchoHub_Client_Services_FolderPickResult__ctor_EchoHub_Client_Services_PickerOutcome_System_String_ + commentId: M:EchoHub.Client.Services.FolderPickResult.#ctor(EchoHub.Client.Services.PickerOutcome,System.String) + name.vb: New(PickerOutcome, String) + fullName: EchoHub.Client.Services.FolderPickResult.FolderPickResult(EchoHub.Client.Services.PickerOutcome, string?) + fullName.vb: EchoHub.Client.Services.FolderPickResult.New(EchoHub.Client.Services.PickerOutcome, String) + nameWithType: FolderPickResult.FolderPickResult(PickerOutcome, string?) + nameWithType.vb: FolderPickResult.New(PickerOutcome, String) +- uid: EchoHub.Client.Services.FolderPickResult.#ctor* + name: FolderPickResult + href: api/client/EchoHub.Client.Services.FolderPickResult.html#EchoHub_Client_Services_FolderPickResult__ctor_ + commentId: Overload:EchoHub.Client.Services.FolderPickResult.#ctor + name.vb: New + fullName: EchoHub.Client.Services.FolderPickResult.FolderPickResult + fullName.vb: EchoHub.Client.Services.FolderPickResult.New + nameWithType: FolderPickResult.FolderPickResult + nameWithType.vb: FolderPickResult.New +- uid: EchoHub.Client.Services.FolderPickResult.Deconstruct(EchoHub.Client.Services.PickerOutcome@,System.String@) + name: Deconstruct(out PickerOutcome, out string?) + href: api/client/EchoHub.Client.Services.FolderPickResult.html#EchoHub_Client_Services_FolderPickResult_Deconstruct_EchoHub_Client_Services_PickerOutcome__System_String__ + commentId: M:EchoHub.Client.Services.FolderPickResult.Deconstruct(EchoHub.Client.Services.PickerOutcome@,System.String@) + name.vb: Deconstruct(PickerOutcome, String) + fullName: EchoHub.Client.Services.FolderPickResult.Deconstruct(out EchoHub.Client.Services.PickerOutcome, out string?) + fullName.vb: EchoHub.Client.Services.FolderPickResult.Deconstruct(EchoHub.Client.Services.PickerOutcome, String) + nameWithType: FolderPickResult.Deconstruct(out PickerOutcome, out string?) + nameWithType.vb: FolderPickResult.Deconstruct(PickerOutcome, String) +- uid: EchoHub.Client.Services.FolderPickResult.Deconstruct* + name: Deconstruct + href: api/client/EchoHub.Client.Services.FolderPickResult.html#EchoHub_Client_Services_FolderPickResult_Deconstruct_ + commentId: Overload:EchoHub.Client.Services.FolderPickResult.Deconstruct + fullName: EchoHub.Client.Services.FolderPickResult.Deconstruct + nameWithType: FolderPickResult.Deconstruct +- uid: EchoHub.Client.Services.FolderPickResult.Equals(EchoHub.Client.Services.FolderPickResult) + name: Equals(FolderPickResult?) + href: api/client/EchoHub.Client.Services.FolderPickResult.html#EchoHub_Client_Services_FolderPickResult_Equals_EchoHub_Client_Services_FolderPickResult_ + commentId: M:EchoHub.Client.Services.FolderPickResult.Equals(EchoHub.Client.Services.FolderPickResult) + name.vb: Equals(FolderPickResult) + fullName: EchoHub.Client.Services.FolderPickResult.Equals(EchoHub.Client.Services.FolderPickResult?) + fullName.vb: EchoHub.Client.Services.FolderPickResult.Equals(EchoHub.Client.Services.FolderPickResult) + nameWithType: FolderPickResult.Equals(FolderPickResult?) + nameWithType.vb: FolderPickResult.Equals(FolderPickResult) +- uid: EchoHub.Client.Services.FolderPickResult.Equals(System.Object) + name: Equals(object?) + href: api/client/EchoHub.Client.Services.FolderPickResult.html#EchoHub_Client_Services_FolderPickResult_Equals_System_Object_ + commentId: M:EchoHub.Client.Services.FolderPickResult.Equals(System.Object) + name.vb: Equals(Object) + fullName: EchoHub.Client.Services.FolderPickResult.Equals(object?) + fullName.vb: EchoHub.Client.Services.FolderPickResult.Equals(Object) + nameWithType: FolderPickResult.Equals(object?) + nameWithType.vb: FolderPickResult.Equals(Object) +- uid: EchoHub.Client.Services.FolderPickResult.Equals* + name: Equals + href: api/client/EchoHub.Client.Services.FolderPickResult.html#EchoHub_Client_Services_FolderPickResult_Equals_ + commentId: Overload:EchoHub.Client.Services.FolderPickResult.Equals + fullName: EchoHub.Client.Services.FolderPickResult.Equals + nameWithType: FolderPickResult.Equals +- uid: EchoHub.Client.Services.FolderPickResult.GetHashCode + name: GetHashCode() + href: api/client/EchoHub.Client.Services.FolderPickResult.html#EchoHub_Client_Services_FolderPickResult_GetHashCode + commentId: M:EchoHub.Client.Services.FolderPickResult.GetHashCode + fullName: EchoHub.Client.Services.FolderPickResult.GetHashCode() + nameWithType: FolderPickResult.GetHashCode() +- uid: EchoHub.Client.Services.FolderPickResult.GetHashCode* + name: GetHashCode + href: api/client/EchoHub.Client.Services.FolderPickResult.html#EchoHub_Client_Services_FolderPickResult_GetHashCode_ + commentId: Overload:EchoHub.Client.Services.FolderPickResult.GetHashCode + fullName: EchoHub.Client.Services.FolderPickResult.GetHashCode + nameWithType: FolderPickResult.GetHashCode +- uid: EchoHub.Client.Services.FolderPickResult.Outcome + name: Outcome + href: api/client/EchoHub.Client.Services.FolderPickResult.html#EchoHub_Client_Services_FolderPickResult_Outcome + commentId: P:EchoHub.Client.Services.FolderPickResult.Outcome + fullName: EchoHub.Client.Services.FolderPickResult.Outcome + nameWithType: FolderPickResult.Outcome +- uid: EchoHub.Client.Services.FolderPickResult.Outcome* + name: Outcome + href: api/client/EchoHub.Client.Services.FolderPickResult.html#EchoHub_Client_Services_FolderPickResult_Outcome_ + commentId: Overload:EchoHub.Client.Services.FolderPickResult.Outcome + fullName: EchoHub.Client.Services.FolderPickResult.Outcome + nameWithType: FolderPickResult.Outcome +- uid: EchoHub.Client.Services.FolderPickResult.Path + name: Path + href: api/client/EchoHub.Client.Services.FolderPickResult.html#EchoHub_Client_Services_FolderPickResult_Path + commentId: P:EchoHub.Client.Services.FolderPickResult.Path + fullName: EchoHub.Client.Services.FolderPickResult.Path + nameWithType: FolderPickResult.Path +- uid: EchoHub.Client.Services.FolderPickResult.Path* + name: Path + href: api/client/EchoHub.Client.Services.FolderPickResult.html#EchoHub_Client_Services_FolderPickResult_Path_ + commentId: Overload:EchoHub.Client.Services.FolderPickResult.Path + fullName: EchoHub.Client.Services.FolderPickResult.Path + nameWithType: FolderPickResult.Path +- uid: EchoHub.Client.Services.FolderPickResult.ToString + name: ToString() + href: api/client/EchoHub.Client.Services.FolderPickResult.html#EchoHub_Client_Services_FolderPickResult_ToString + commentId: M:EchoHub.Client.Services.FolderPickResult.ToString + fullName: EchoHub.Client.Services.FolderPickResult.ToString() + nameWithType: FolderPickResult.ToString() +- uid: EchoHub.Client.Services.FolderPickResult.ToString* + name: ToString + href: api/client/EchoHub.Client.Services.FolderPickResult.html#EchoHub_Client_Services_FolderPickResult_ToString_ + commentId: Overload:EchoHub.Client.Services.FolderPickResult.ToString + fullName: EchoHub.Client.Services.FolderPickResult.ToString + nameWithType: FolderPickResult.ToString +- uid: EchoHub.Client.Services.FolderPickResult.op_Equality(EchoHub.Client.Services.FolderPickResult,EchoHub.Client.Services.FolderPickResult) + name: operator ==(FolderPickResult?, FolderPickResult?) + href: api/client/EchoHub.Client.Services.FolderPickResult.html#EchoHub_Client_Services_FolderPickResult_op_Equality_EchoHub_Client_Services_FolderPickResult_EchoHub_Client_Services_FolderPickResult_ + commentId: M:EchoHub.Client.Services.FolderPickResult.op_Equality(EchoHub.Client.Services.FolderPickResult,EchoHub.Client.Services.FolderPickResult) + name.vb: =(FolderPickResult, FolderPickResult) + fullName: EchoHub.Client.Services.FolderPickResult.operator ==(EchoHub.Client.Services.FolderPickResult?, EchoHub.Client.Services.FolderPickResult?) + fullName.vb: EchoHub.Client.Services.FolderPickResult.=(EchoHub.Client.Services.FolderPickResult, EchoHub.Client.Services.FolderPickResult) + nameWithType: FolderPickResult.operator ==(FolderPickResult?, FolderPickResult?) + nameWithType.vb: FolderPickResult.=(FolderPickResult, FolderPickResult) +- uid: EchoHub.Client.Services.FolderPickResult.op_Equality* + name: operator == + href: api/client/EchoHub.Client.Services.FolderPickResult.html#EchoHub_Client_Services_FolderPickResult_op_Equality_ + commentId: Overload:EchoHub.Client.Services.FolderPickResult.op_Equality + name.vb: = + fullName: EchoHub.Client.Services.FolderPickResult.operator == + fullName.vb: EchoHub.Client.Services.FolderPickResult.= + nameWithType: FolderPickResult.operator == + nameWithType.vb: FolderPickResult.= +- uid: EchoHub.Client.Services.FolderPickResult.op_Inequality(EchoHub.Client.Services.FolderPickResult,EchoHub.Client.Services.FolderPickResult) + name: operator !=(FolderPickResult?, FolderPickResult?) + href: api/client/EchoHub.Client.Services.FolderPickResult.html#EchoHub_Client_Services_FolderPickResult_op_Inequality_EchoHub_Client_Services_FolderPickResult_EchoHub_Client_Services_FolderPickResult_ + commentId: M:EchoHub.Client.Services.FolderPickResult.op_Inequality(EchoHub.Client.Services.FolderPickResult,EchoHub.Client.Services.FolderPickResult) + name.vb: <>(FolderPickResult, FolderPickResult) + fullName: EchoHub.Client.Services.FolderPickResult.operator !=(EchoHub.Client.Services.FolderPickResult?, EchoHub.Client.Services.FolderPickResult?) + fullName.vb: EchoHub.Client.Services.FolderPickResult.<>(EchoHub.Client.Services.FolderPickResult, EchoHub.Client.Services.FolderPickResult) + nameWithType: FolderPickResult.operator !=(FolderPickResult?, FolderPickResult?) + nameWithType.vb: FolderPickResult.<>(FolderPickResult, FolderPickResult) +- uid: EchoHub.Client.Services.FolderPickResult.op_Inequality* + name: operator != + href: api/client/EchoHub.Client.Services.FolderPickResult.html#EchoHub_Client_Services_FolderPickResult_op_Inequality_ + commentId: Overload:EchoHub.Client.Services.FolderPickResult.op_Inequality + name.vb: <> + fullName: EchoHub.Client.Services.FolderPickResult.operator != + fullName.vb: EchoHub.Client.Services.FolderPickResult.<> + nameWithType: FolderPickResult.operator != + nameWithType.vb: FolderPickResult.<> +- uid: EchoHub.Client.Services.JoinOutcome + name: JoinOutcome + href: api/client/EchoHub.Client.Services.JoinOutcome.html + commentId: T:EchoHub.Client.Services.JoinOutcome + fullName: EchoHub.Client.Services.JoinOutcome + nameWithType: JoinOutcome +- uid: EchoHub.Client.Services.JoinOutcome.#ctor(System.Collections.Generic.List{EchoHub.Core.DTOs.MessageDto},System.String,System.String) + name: JoinOutcome(List, string?, string?) + href: api/client/EchoHub.Client.Services.JoinOutcome.html#EchoHub_Client_Services_JoinOutcome__ctor_System_Collections_Generic_List_EchoHub_Core_DTOs_MessageDto__System_String_System_String_ + commentId: M:EchoHub.Client.Services.JoinOutcome.#ctor(System.Collections.Generic.List{EchoHub.Core.DTOs.MessageDto},System.String,System.String) + name.vb: New(List(Of MessageDto), String, String) + fullName: EchoHub.Client.Services.JoinOutcome.JoinOutcome(System.Collections.Generic.List, string?, string?) + fullName.vb: EchoHub.Client.Services.JoinOutcome.New(System.Collections.Generic.List(Of EchoHub.Core.DTOs.MessageDto), String, String) + nameWithType: JoinOutcome.JoinOutcome(List, string?, string?) + nameWithType.vb: JoinOutcome.New(List(Of MessageDto), String, String) +- uid: EchoHub.Client.Services.JoinOutcome.#ctor* + name: JoinOutcome + href: api/client/EchoHub.Client.Services.JoinOutcome.html#EchoHub_Client_Services_JoinOutcome__ctor_ + commentId: Overload:EchoHub.Client.Services.JoinOutcome.#ctor + name.vb: New + fullName: EchoHub.Client.Services.JoinOutcome.JoinOutcome + fullName.vb: EchoHub.Client.Services.JoinOutcome.New + nameWithType: JoinOutcome.JoinOutcome + nameWithType.vb: JoinOutcome.New +- uid: EchoHub.Client.Services.JoinOutcome.Deconstruct(System.Collections.Generic.List{EchoHub.Core.DTOs.MessageDto}@,System.String@,System.String@) + name: Deconstruct(out List, out string?, out string?) + href: api/client/EchoHub.Client.Services.JoinOutcome.html#EchoHub_Client_Services_JoinOutcome_Deconstruct_System_Collections_Generic_List_EchoHub_Core_DTOs_MessageDto___System_String__System_String__ + commentId: M:EchoHub.Client.Services.JoinOutcome.Deconstruct(System.Collections.Generic.List{EchoHub.Core.DTOs.MessageDto}@,System.String@,System.String@) + name.vb: Deconstruct(List(Of MessageDto), String, String) + fullName: EchoHub.Client.Services.JoinOutcome.Deconstruct(out System.Collections.Generic.List, out string?, out string?) + fullName.vb: EchoHub.Client.Services.JoinOutcome.Deconstruct(System.Collections.Generic.List(Of EchoHub.Core.DTOs.MessageDto), String, String) + nameWithType: JoinOutcome.Deconstruct(out List, out string?, out string?) + nameWithType.vb: JoinOutcome.Deconstruct(List(Of MessageDto), String, String) +- uid: EchoHub.Client.Services.JoinOutcome.Deconstruct* + name: Deconstruct + href: api/client/EchoHub.Client.Services.JoinOutcome.html#EchoHub_Client_Services_JoinOutcome_Deconstruct_ + commentId: Overload:EchoHub.Client.Services.JoinOutcome.Deconstruct + fullName: EchoHub.Client.Services.JoinOutcome.Deconstruct + nameWithType: JoinOutcome.Deconstruct +- uid: EchoHub.Client.Services.JoinOutcome.EncryptionSalt + name: EncryptionSalt + href: api/client/EchoHub.Client.Services.JoinOutcome.html#EchoHub_Client_Services_JoinOutcome_EncryptionSalt + commentId: P:EchoHub.Client.Services.JoinOutcome.EncryptionSalt + fullName: EchoHub.Client.Services.JoinOutcome.EncryptionSalt + nameWithType: JoinOutcome.EncryptionSalt +- uid: EchoHub.Client.Services.JoinOutcome.EncryptionSalt* + name: EncryptionSalt + href: api/client/EchoHub.Client.Services.JoinOutcome.html#EchoHub_Client_Services_JoinOutcome_EncryptionSalt_ + commentId: Overload:EchoHub.Client.Services.JoinOutcome.EncryptionSalt + fullName: EchoHub.Client.Services.JoinOutcome.EncryptionSalt + nameWithType: JoinOutcome.EncryptionSalt +- uid: EchoHub.Client.Services.JoinOutcome.Equals(EchoHub.Client.Services.JoinOutcome) + name: Equals(JoinOutcome?) + href: api/client/EchoHub.Client.Services.JoinOutcome.html#EchoHub_Client_Services_JoinOutcome_Equals_EchoHub_Client_Services_JoinOutcome_ + commentId: M:EchoHub.Client.Services.JoinOutcome.Equals(EchoHub.Client.Services.JoinOutcome) + name.vb: Equals(JoinOutcome) + fullName: EchoHub.Client.Services.JoinOutcome.Equals(EchoHub.Client.Services.JoinOutcome?) + fullName.vb: EchoHub.Client.Services.JoinOutcome.Equals(EchoHub.Client.Services.JoinOutcome) + nameWithType: JoinOutcome.Equals(JoinOutcome?) + nameWithType.vb: JoinOutcome.Equals(JoinOutcome) +- uid: EchoHub.Client.Services.JoinOutcome.Equals(System.Object) + name: Equals(object?) + href: api/client/EchoHub.Client.Services.JoinOutcome.html#EchoHub_Client_Services_JoinOutcome_Equals_System_Object_ + commentId: M:EchoHub.Client.Services.JoinOutcome.Equals(System.Object) + name.vb: Equals(Object) + fullName: EchoHub.Client.Services.JoinOutcome.Equals(object?) + fullName.vb: EchoHub.Client.Services.JoinOutcome.Equals(Object) + nameWithType: JoinOutcome.Equals(object?) + nameWithType.vb: JoinOutcome.Equals(Object) +- uid: EchoHub.Client.Services.JoinOutcome.Equals* + name: Equals + href: api/client/EchoHub.Client.Services.JoinOutcome.html#EchoHub_Client_Services_JoinOutcome_Equals_ + commentId: Overload:EchoHub.Client.Services.JoinOutcome.Equals + fullName: EchoHub.Client.Services.JoinOutcome.Equals + nameWithType: JoinOutcome.Equals +- uid: EchoHub.Client.Services.JoinOutcome.GetHashCode + name: GetHashCode() + href: api/client/EchoHub.Client.Services.JoinOutcome.html#EchoHub_Client_Services_JoinOutcome_GetHashCode + commentId: M:EchoHub.Client.Services.JoinOutcome.GetHashCode + fullName: EchoHub.Client.Services.JoinOutcome.GetHashCode() + nameWithType: JoinOutcome.GetHashCode() +- uid: EchoHub.Client.Services.JoinOutcome.GetHashCode* + name: GetHashCode + href: api/client/EchoHub.Client.Services.JoinOutcome.html#EchoHub_Client_Services_JoinOutcome_GetHashCode_ + commentId: Overload:EchoHub.Client.Services.JoinOutcome.GetHashCode + fullName: EchoHub.Client.Services.JoinOutcome.GetHashCode + nameWithType: JoinOutcome.GetHashCode +- uid: EchoHub.Client.Services.JoinOutcome.History + name: History + href: api/client/EchoHub.Client.Services.JoinOutcome.html#EchoHub_Client_Services_JoinOutcome_History + commentId: P:EchoHub.Client.Services.JoinOutcome.History + fullName: EchoHub.Client.Services.JoinOutcome.History + nameWithType: JoinOutcome.History +- uid: EchoHub.Client.Services.JoinOutcome.History* + name: History + href: api/client/EchoHub.Client.Services.JoinOutcome.html#EchoHub_Client_Services_JoinOutcome_History_ + commentId: Overload:EchoHub.Client.Services.JoinOutcome.History + fullName: EchoHub.Client.Services.JoinOutcome.History + nameWithType: JoinOutcome.History +- uid: EchoHub.Client.Services.JoinOutcome.ToString + name: ToString() + href: api/client/EchoHub.Client.Services.JoinOutcome.html#EchoHub_Client_Services_JoinOutcome_ToString + commentId: M:EchoHub.Client.Services.JoinOutcome.ToString + fullName: EchoHub.Client.Services.JoinOutcome.ToString() + nameWithType: JoinOutcome.ToString() +- uid: EchoHub.Client.Services.JoinOutcome.ToString* + name: ToString + href: api/client/EchoHub.Client.Services.JoinOutcome.html#EchoHub_Client_Services_JoinOutcome_ToString_ + commentId: Overload:EchoHub.Client.Services.JoinOutcome.ToString + fullName: EchoHub.Client.Services.JoinOutcome.ToString + nameWithType: JoinOutcome.ToString +- uid: EchoHub.Client.Services.JoinOutcome.WrappedRoomKey + name: WrappedRoomKey + href: api/client/EchoHub.Client.Services.JoinOutcome.html#EchoHub_Client_Services_JoinOutcome_WrappedRoomKey + commentId: P:EchoHub.Client.Services.JoinOutcome.WrappedRoomKey + fullName: EchoHub.Client.Services.JoinOutcome.WrappedRoomKey + nameWithType: JoinOutcome.WrappedRoomKey +- uid: EchoHub.Client.Services.JoinOutcome.WrappedRoomKey* + name: WrappedRoomKey + href: api/client/EchoHub.Client.Services.JoinOutcome.html#EchoHub_Client_Services_JoinOutcome_WrappedRoomKey_ + commentId: Overload:EchoHub.Client.Services.JoinOutcome.WrappedRoomKey + fullName: EchoHub.Client.Services.JoinOutcome.WrappedRoomKey + nameWithType: JoinOutcome.WrappedRoomKey +- uid: EchoHub.Client.Services.JoinOutcome.op_Equality(EchoHub.Client.Services.JoinOutcome,EchoHub.Client.Services.JoinOutcome) + name: operator ==(JoinOutcome?, JoinOutcome?) + href: api/client/EchoHub.Client.Services.JoinOutcome.html#EchoHub_Client_Services_JoinOutcome_op_Equality_EchoHub_Client_Services_JoinOutcome_EchoHub_Client_Services_JoinOutcome_ + commentId: M:EchoHub.Client.Services.JoinOutcome.op_Equality(EchoHub.Client.Services.JoinOutcome,EchoHub.Client.Services.JoinOutcome) + name.vb: =(JoinOutcome, JoinOutcome) + fullName: EchoHub.Client.Services.JoinOutcome.operator ==(EchoHub.Client.Services.JoinOutcome?, EchoHub.Client.Services.JoinOutcome?) + fullName.vb: EchoHub.Client.Services.JoinOutcome.=(EchoHub.Client.Services.JoinOutcome, EchoHub.Client.Services.JoinOutcome) + nameWithType: JoinOutcome.operator ==(JoinOutcome?, JoinOutcome?) + nameWithType.vb: JoinOutcome.=(JoinOutcome, JoinOutcome) +- uid: EchoHub.Client.Services.JoinOutcome.op_Equality* + name: operator == + href: api/client/EchoHub.Client.Services.JoinOutcome.html#EchoHub_Client_Services_JoinOutcome_op_Equality_ + commentId: Overload:EchoHub.Client.Services.JoinOutcome.op_Equality + name.vb: = + fullName: EchoHub.Client.Services.JoinOutcome.operator == + fullName.vb: EchoHub.Client.Services.JoinOutcome.= + nameWithType: JoinOutcome.operator == + nameWithType.vb: JoinOutcome.= +- uid: EchoHub.Client.Services.JoinOutcome.op_Inequality(EchoHub.Client.Services.JoinOutcome,EchoHub.Client.Services.JoinOutcome) + name: operator !=(JoinOutcome?, JoinOutcome?) + href: api/client/EchoHub.Client.Services.JoinOutcome.html#EchoHub_Client_Services_JoinOutcome_op_Inequality_EchoHub_Client_Services_JoinOutcome_EchoHub_Client_Services_JoinOutcome_ + commentId: M:EchoHub.Client.Services.JoinOutcome.op_Inequality(EchoHub.Client.Services.JoinOutcome,EchoHub.Client.Services.JoinOutcome) + name.vb: <>(JoinOutcome, JoinOutcome) + fullName: EchoHub.Client.Services.JoinOutcome.operator !=(EchoHub.Client.Services.JoinOutcome?, EchoHub.Client.Services.JoinOutcome?) + fullName.vb: EchoHub.Client.Services.JoinOutcome.<>(EchoHub.Client.Services.JoinOutcome, EchoHub.Client.Services.JoinOutcome) + nameWithType: JoinOutcome.operator !=(JoinOutcome?, JoinOutcome?) + nameWithType.vb: JoinOutcome.<>(JoinOutcome, JoinOutcome) +- uid: EchoHub.Client.Services.JoinOutcome.op_Inequality* + name: operator != + href: api/client/EchoHub.Client.Services.JoinOutcome.html#EchoHub_Client_Services_JoinOutcome_op_Inequality_ + commentId: Overload:EchoHub.Client.Services.JoinOutcome.op_Inequality + name.vb: <> + fullName: EchoHub.Client.Services.JoinOutcome.operator != + fullName.vb: EchoHub.Client.Services.JoinOutcome.<> + nameWithType: JoinOutcome.operator != + nameWithType.vb: JoinOutcome.<> +- uid: EchoHub.Client.Services.NativeFolderPicker + name: NativeFolderPicker + href: api/client/EchoHub.Client.Services.NativeFolderPicker.html + commentId: T:EchoHub.Client.Services.NativeFolderPicker + fullName: EchoHub.Client.Services.NativeFolderPicker + nameWithType: NativeFolderPicker +- uid: EchoHub.Client.Services.NativeFolderPicker.PickFolderAsync(System.String) + name: PickFolderAsync(string?) + href: api/client/EchoHub.Client.Services.NativeFolderPicker.html#EchoHub_Client_Services_NativeFolderPicker_PickFolderAsync_System_String_ + commentId: M:EchoHub.Client.Services.NativeFolderPicker.PickFolderAsync(System.String) + name.vb: PickFolderAsync(String) + fullName: EchoHub.Client.Services.NativeFolderPicker.PickFolderAsync(string?) + fullName.vb: EchoHub.Client.Services.NativeFolderPicker.PickFolderAsync(String) + nameWithType: NativeFolderPicker.PickFolderAsync(string?) + nameWithType.vb: NativeFolderPicker.PickFolderAsync(String) +- uid: EchoHub.Client.Services.NativeFolderPicker.PickFolderAsync* + name: PickFolderAsync + href: api/client/EchoHub.Client.Services.NativeFolderPicker.html#EchoHub_Client_Services_NativeFolderPicker_PickFolderAsync_ + commentId: Overload:EchoHub.Client.Services.NativeFolderPicker.PickFolderAsync + fullName: EchoHub.Client.Services.NativeFolderPicker.PickFolderAsync + nameWithType: NativeFolderPicker.PickFolderAsync - uid: EchoHub.Client.Services.NotificationSoundService name: NotificationSoundService href: api/client/EchoHub.Client.Services.NotificationSoundService.html @@ -2014,6 +2494,177 @@ references: commentId: Overload:EchoHub.Client.Services.NotificationSoundService.SetVolume fullName: EchoHub.Client.Services.NotificationSoundService.SetVolume nameWithType: NotificationSoundService.SetVolume +- uid: EchoHub.Client.Services.OutgoingAttachment + name: OutgoingAttachment + href: api/client/EchoHub.Client.Services.OutgoingAttachment.html + commentId: T:EchoHub.Client.Services.OutgoingAttachment + fullName: EchoHub.Client.Services.OutgoingAttachment + nameWithType: OutgoingAttachment +- uid: EchoHub.Client.Services.OutgoingAttachment.#ctor(System.IO.Stream,System.String,System.String,System.String) + name: OutgoingAttachment(Stream, string, string?, string?) + href: api/client/EchoHub.Client.Services.OutgoingAttachment.html#EchoHub_Client_Services_OutgoingAttachment__ctor_System_IO_Stream_System_String_System_String_System_String_ + commentId: M:EchoHub.Client.Services.OutgoingAttachment.#ctor(System.IO.Stream,System.String,System.String,System.String) + name.vb: New(Stream, String, String, String) + fullName: EchoHub.Client.Services.OutgoingAttachment.OutgoingAttachment(System.IO.Stream, string, string?, string?) + fullName.vb: EchoHub.Client.Services.OutgoingAttachment.New(System.IO.Stream, String, String, String) + nameWithType: OutgoingAttachment.OutgoingAttachment(Stream, string, string?, string?) + nameWithType.vb: OutgoingAttachment.New(Stream, String, String, String) +- uid: EchoHub.Client.Services.OutgoingAttachment.#ctor* + name: OutgoingAttachment + href: api/client/EchoHub.Client.Services.OutgoingAttachment.html#EchoHub_Client_Services_OutgoingAttachment__ctor_ + commentId: Overload:EchoHub.Client.Services.OutgoingAttachment.#ctor + name.vb: New + fullName: EchoHub.Client.Services.OutgoingAttachment.OutgoingAttachment + fullName.vb: EchoHub.Client.Services.OutgoingAttachment.New + nameWithType: OutgoingAttachment.OutgoingAttachment + nameWithType.vb: OutgoingAttachment.New +- uid: EchoHub.Client.Services.OutgoingAttachment.DeclaredKind + name: DeclaredKind + href: api/client/EchoHub.Client.Services.OutgoingAttachment.html#EchoHub_Client_Services_OutgoingAttachment_DeclaredKind + commentId: P:EchoHub.Client.Services.OutgoingAttachment.DeclaredKind + fullName: EchoHub.Client.Services.OutgoingAttachment.DeclaredKind + nameWithType: OutgoingAttachment.DeclaredKind +- uid: EchoHub.Client.Services.OutgoingAttachment.DeclaredKind* + name: DeclaredKind + href: api/client/EchoHub.Client.Services.OutgoingAttachment.html#EchoHub_Client_Services_OutgoingAttachment_DeclaredKind_ + commentId: Overload:EchoHub.Client.Services.OutgoingAttachment.DeclaredKind + fullName: EchoHub.Client.Services.OutgoingAttachment.DeclaredKind + nameWithType: OutgoingAttachment.DeclaredKind +- uid: EchoHub.Client.Services.OutgoingAttachment.Deconstruct(System.IO.Stream@,System.String@,System.String@,System.String@) + name: Deconstruct(out Stream, out string, out string?, out string?) + href: api/client/EchoHub.Client.Services.OutgoingAttachment.html#EchoHub_Client_Services_OutgoingAttachment_Deconstruct_System_IO_Stream__System_String__System_String__System_String__ + commentId: M:EchoHub.Client.Services.OutgoingAttachment.Deconstruct(System.IO.Stream@,System.String@,System.String@,System.String@) + name.vb: Deconstruct(Stream, String, String, String) + fullName: EchoHub.Client.Services.OutgoingAttachment.Deconstruct(out System.IO.Stream, out string, out string?, out string?) + fullName.vb: EchoHub.Client.Services.OutgoingAttachment.Deconstruct(System.IO.Stream, String, String, String) + nameWithType: OutgoingAttachment.Deconstruct(out Stream, out string, out string?, out string?) + nameWithType.vb: OutgoingAttachment.Deconstruct(Stream, String, String, String) +- uid: EchoHub.Client.Services.OutgoingAttachment.Deconstruct* + name: Deconstruct + href: api/client/EchoHub.Client.Services.OutgoingAttachment.html#EchoHub_Client_Services_OutgoingAttachment_Deconstruct_ + commentId: Overload:EchoHub.Client.Services.OutgoingAttachment.Deconstruct + fullName: EchoHub.Client.Services.OutgoingAttachment.Deconstruct + nameWithType: OutgoingAttachment.Deconstruct +- uid: EchoHub.Client.Services.OutgoingAttachment.EncryptedPreview + name: EncryptedPreview + href: api/client/EchoHub.Client.Services.OutgoingAttachment.html#EchoHub_Client_Services_OutgoingAttachment_EncryptedPreview + commentId: P:EchoHub.Client.Services.OutgoingAttachment.EncryptedPreview + fullName: EchoHub.Client.Services.OutgoingAttachment.EncryptedPreview + nameWithType: OutgoingAttachment.EncryptedPreview +- uid: EchoHub.Client.Services.OutgoingAttachment.EncryptedPreview* + name: EncryptedPreview + href: api/client/EchoHub.Client.Services.OutgoingAttachment.html#EchoHub_Client_Services_OutgoingAttachment_EncryptedPreview_ + commentId: Overload:EchoHub.Client.Services.OutgoingAttachment.EncryptedPreview + fullName: EchoHub.Client.Services.OutgoingAttachment.EncryptedPreview + nameWithType: OutgoingAttachment.EncryptedPreview +- uid: EchoHub.Client.Services.OutgoingAttachment.Equals(EchoHub.Client.Services.OutgoingAttachment) + name: Equals(OutgoingAttachment?) + href: api/client/EchoHub.Client.Services.OutgoingAttachment.html#EchoHub_Client_Services_OutgoingAttachment_Equals_EchoHub_Client_Services_OutgoingAttachment_ + commentId: M:EchoHub.Client.Services.OutgoingAttachment.Equals(EchoHub.Client.Services.OutgoingAttachment) + name.vb: Equals(OutgoingAttachment) + fullName: EchoHub.Client.Services.OutgoingAttachment.Equals(EchoHub.Client.Services.OutgoingAttachment?) + fullName.vb: EchoHub.Client.Services.OutgoingAttachment.Equals(EchoHub.Client.Services.OutgoingAttachment) + nameWithType: OutgoingAttachment.Equals(OutgoingAttachment?) + nameWithType.vb: OutgoingAttachment.Equals(OutgoingAttachment) +- uid: EchoHub.Client.Services.OutgoingAttachment.Equals(System.Object) + name: Equals(object?) + href: api/client/EchoHub.Client.Services.OutgoingAttachment.html#EchoHub_Client_Services_OutgoingAttachment_Equals_System_Object_ + commentId: M:EchoHub.Client.Services.OutgoingAttachment.Equals(System.Object) + name.vb: Equals(Object) + fullName: EchoHub.Client.Services.OutgoingAttachment.Equals(object?) + fullName.vb: EchoHub.Client.Services.OutgoingAttachment.Equals(Object) + nameWithType: OutgoingAttachment.Equals(object?) + nameWithType.vb: OutgoingAttachment.Equals(Object) +- uid: EchoHub.Client.Services.OutgoingAttachment.Equals* + name: Equals + href: api/client/EchoHub.Client.Services.OutgoingAttachment.html#EchoHub_Client_Services_OutgoingAttachment_Equals_ + commentId: Overload:EchoHub.Client.Services.OutgoingAttachment.Equals + fullName: EchoHub.Client.Services.OutgoingAttachment.Equals + nameWithType: OutgoingAttachment.Equals +- uid: EchoHub.Client.Services.OutgoingAttachment.FileName + name: FileName + href: api/client/EchoHub.Client.Services.OutgoingAttachment.html#EchoHub_Client_Services_OutgoingAttachment_FileName + commentId: P:EchoHub.Client.Services.OutgoingAttachment.FileName + fullName: EchoHub.Client.Services.OutgoingAttachment.FileName + nameWithType: OutgoingAttachment.FileName +- uid: EchoHub.Client.Services.OutgoingAttachment.FileName* + name: FileName + href: api/client/EchoHub.Client.Services.OutgoingAttachment.html#EchoHub_Client_Services_OutgoingAttachment_FileName_ + commentId: Overload:EchoHub.Client.Services.OutgoingAttachment.FileName + fullName: EchoHub.Client.Services.OutgoingAttachment.FileName + nameWithType: OutgoingAttachment.FileName +- uid: EchoHub.Client.Services.OutgoingAttachment.GetHashCode + name: GetHashCode() + href: api/client/EchoHub.Client.Services.OutgoingAttachment.html#EchoHub_Client_Services_OutgoingAttachment_GetHashCode + commentId: M:EchoHub.Client.Services.OutgoingAttachment.GetHashCode + fullName: EchoHub.Client.Services.OutgoingAttachment.GetHashCode() + nameWithType: OutgoingAttachment.GetHashCode() +- uid: EchoHub.Client.Services.OutgoingAttachment.GetHashCode* + name: GetHashCode + href: api/client/EchoHub.Client.Services.OutgoingAttachment.html#EchoHub_Client_Services_OutgoingAttachment_GetHashCode_ + commentId: Overload:EchoHub.Client.Services.OutgoingAttachment.GetHashCode + fullName: EchoHub.Client.Services.OutgoingAttachment.GetHashCode + nameWithType: OutgoingAttachment.GetHashCode +- uid: EchoHub.Client.Services.OutgoingAttachment.Stream + name: Stream + href: api/client/EchoHub.Client.Services.OutgoingAttachment.html#EchoHub_Client_Services_OutgoingAttachment_Stream + commentId: P:EchoHub.Client.Services.OutgoingAttachment.Stream + fullName: EchoHub.Client.Services.OutgoingAttachment.Stream + nameWithType: OutgoingAttachment.Stream +- uid: EchoHub.Client.Services.OutgoingAttachment.Stream* + name: Stream + href: api/client/EchoHub.Client.Services.OutgoingAttachment.html#EchoHub_Client_Services_OutgoingAttachment_Stream_ + commentId: Overload:EchoHub.Client.Services.OutgoingAttachment.Stream + fullName: EchoHub.Client.Services.OutgoingAttachment.Stream + nameWithType: OutgoingAttachment.Stream +- uid: EchoHub.Client.Services.OutgoingAttachment.ToString + name: ToString() + href: api/client/EchoHub.Client.Services.OutgoingAttachment.html#EchoHub_Client_Services_OutgoingAttachment_ToString + commentId: M:EchoHub.Client.Services.OutgoingAttachment.ToString + fullName: EchoHub.Client.Services.OutgoingAttachment.ToString() + nameWithType: OutgoingAttachment.ToString() +- uid: EchoHub.Client.Services.OutgoingAttachment.ToString* + name: ToString + href: api/client/EchoHub.Client.Services.OutgoingAttachment.html#EchoHub_Client_Services_OutgoingAttachment_ToString_ + commentId: Overload:EchoHub.Client.Services.OutgoingAttachment.ToString + fullName: EchoHub.Client.Services.OutgoingAttachment.ToString + nameWithType: OutgoingAttachment.ToString +- uid: EchoHub.Client.Services.OutgoingAttachment.op_Equality(EchoHub.Client.Services.OutgoingAttachment,EchoHub.Client.Services.OutgoingAttachment) + name: operator ==(OutgoingAttachment?, OutgoingAttachment?) + href: api/client/EchoHub.Client.Services.OutgoingAttachment.html#EchoHub_Client_Services_OutgoingAttachment_op_Equality_EchoHub_Client_Services_OutgoingAttachment_EchoHub_Client_Services_OutgoingAttachment_ + commentId: M:EchoHub.Client.Services.OutgoingAttachment.op_Equality(EchoHub.Client.Services.OutgoingAttachment,EchoHub.Client.Services.OutgoingAttachment) + name.vb: =(OutgoingAttachment, OutgoingAttachment) + fullName: EchoHub.Client.Services.OutgoingAttachment.operator ==(EchoHub.Client.Services.OutgoingAttachment?, EchoHub.Client.Services.OutgoingAttachment?) + fullName.vb: EchoHub.Client.Services.OutgoingAttachment.=(EchoHub.Client.Services.OutgoingAttachment, EchoHub.Client.Services.OutgoingAttachment) + nameWithType: OutgoingAttachment.operator ==(OutgoingAttachment?, OutgoingAttachment?) + nameWithType.vb: OutgoingAttachment.=(OutgoingAttachment, OutgoingAttachment) +- uid: EchoHub.Client.Services.OutgoingAttachment.op_Equality* + name: operator == + href: api/client/EchoHub.Client.Services.OutgoingAttachment.html#EchoHub_Client_Services_OutgoingAttachment_op_Equality_ + commentId: Overload:EchoHub.Client.Services.OutgoingAttachment.op_Equality + name.vb: = + fullName: EchoHub.Client.Services.OutgoingAttachment.operator == + fullName.vb: EchoHub.Client.Services.OutgoingAttachment.= + nameWithType: OutgoingAttachment.operator == + nameWithType.vb: OutgoingAttachment.= +- uid: EchoHub.Client.Services.OutgoingAttachment.op_Inequality(EchoHub.Client.Services.OutgoingAttachment,EchoHub.Client.Services.OutgoingAttachment) + name: operator !=(OutgoingAttachment?, OutgoingAttachment?) + href: api/client/EchoHub.Client.Services.OutgoingAttachment.html#EchoHub_Client_Services_OutgoingAttachment_op_Inequality_EchoHub_Client_Services_OutgoingAttachment_EchoHub_Client_Services_OutgoingAttachment_ + commentId: M:EchoHub.Client.Services.OutgoingAttachment.op_Inequality(EchoHub.Client.Services.OutgoingAttachment,EchoHub.Client.Services.OutgoingAttachment) + name.vb: <>(OutgoingAttachment, OutgoingAttachment) + fullName: EchoHub.Client.Services.OutgoingAttachment.operator !=(EchoHub.Client.Services.OutgoingAttachment?, EchoHub.Client.Services.OutgoingAttachment?) + fullName.vb: EchoHub.Client.Services.OutgoingAttachment.<>(EchoHub.Client.Services.OutgoingAttachment, EchoHub.Client.Services.OutgoingAttachment) + nameWithType: OutgoingAttachment.operator !=(OutgoingAttachment?, OutgoingAttachment?) + nameWithType.vb: OutgoingAttachment.<>(OutgoingAttachment, OutgoingAttachment) +- uid: EchoHub.Client.Services.OutgoingAttachment.op_Inequality* + name: operator != + href: api/client/EchoHub.Client.Services.OutgoingAttachment.html#EchoHub_Client_Services_OutgoingAttachment_op_Inequality_ + commentId: Overload:EchoHub.Client.Services.OutgoingAttachment.op_Inequality + name.vb: <> + fullName: EchoHub.Client.Services.OutgoingAttachment.operator != + fullName.vb: EchoHub.Client.Services.OutgoingAttachment.<> + nameWithType: OutgoingAttachment.operator != + nameWithType.vb: OutgoingAttachment.<> - uid: EchoHub.Client.Services.PathSetup name: PathSetup href: api/client/EchoHub.Client.Services.PathSetup.html @@ -2032,6 +2683,141 @@ references: commentId: Overload:EchoHub.Client.Services.PathSetup.EnsureOnPath fullName: EchoHub.Client.Services.PathSetup.EnsureOnPath nameWithType: PathSetup.EnsureOnPath +- uid: EchoHub.Client.Services.PickerOutcome + name: PickerOutcome + href: api/client/EchoHub.Client.Services.PickerOutcome.html + commentId: T:EchoHub.Client.Services.PickerOutcome + fullName: EchoHub.Client.Services.PickerOutcome + nameWithType: PickerOutcome +- uid: EchoHub.Client.Services.PickerOutcome.Cancelled + name: Cancelled + href: api/client/EchoHub.Client.Services.PickerOutcome.html#EchoHub_Client_Services_PickerOutcome_Cancelled + commentId: F:EchoHub.Client.Services.PickerOutcome.Cancelled + fullName: EchoHub.Client.Services.PickerOutcome.Cancelled + nameWithType: PickerOutcome.Cancelled +- uid: EchoHub.Client.Services.PickerOutcome.Chosen + name: Chosen + href: api/client/EchoHub.Client.Services.PickerOutcome.html#EchoHub_Client_Services_PickerOutcome_Chosen + commentId: F:EchoHub.Client.Services.PickerOutcome.Chosen + fullName: EchoHub.Client.Services.PickerOutcome.Chosen + nameWithType: PickerOutcome.Chosen +- uid: EchoHub.Client.Services.PickerOutcome.Unavailable + name: Unavailable + href: api/client/EchoHub.Client.Services.PickerOutcome.html#EchoHub_Client_Services_PickerOutcome_Unavailable + commentId: F:EchoHub.Client.Services.PickerOutcome.Unavailable + fullName: EchoHub.Client.Services.PickerOutcome.Unavailable + nameWithType: PickerOutcome.Unavailable +- uid: EchoHub.Client.Services.RoomKeyStore + name: RoomKeyStore + href: api/client/EchoHub.Client.Services.RoomKeyStore.html + commentId: T:EchoHub.Client.Services.RoomKeyStore + fullName: EchoHub.Client.Services.RoomKeyStore + nameWithType: RoomKeyStore +- uid: EchoHub.Client.Services.RoomKeyStore.#ctor + name: RoomKeyStore() + href: api/client/EchoHub.Client.Services.RoomKeyStore.html#EchoHub_Client_Services_RoomKeyStore__ctor + commentId: M:EchoHub.Client.Services.RoomKeyStore.#ctor + name.vb: New() + fullName: EchoHub.Client.Services.RoomKeyStore.RoomKeyStore() + fullName.vb: EchoHub.Client.Services.RoomKeyStore.New() + nameWithType: RoomKeyStore.RoomKeyStore() + nameWithType.vb: RoomKeyStore.New() +- uid: EchoHub.Client.Services.RoomKeyStore.#ctor* + name: RoomKeyStore + href: api/client/EchoHub.Client.Services.RoomKeyStore.html#EchoHub_Client_Services_RoomKeyStore__ctor_ + commentId: Overload:EchoHub.Client.Services.RoomKeyStore.#ctor + name.vb: New + fullName: EchoHub.Client.Services.RoomKeyStore.RoomKeyStore + fullName.vb: EchoHub.Client.Services.RoomKeyStore.New + nameWithType: RoomKeyStore.RoomKeyStore + nameWithType.vb: RoomKeyStore.New +- uid: EchoHub.Client.Services.RoomKeyStore.Clear + name: Clear() + href: api/client/EchoHub.Client.Services.RoomKeyStore.html#EchoHub_Client_Services_RoomKeyStore_Clear + commentId: M:EchoHub.Client.Services.RoomKeyStore.Clear + fullName: EchoHub.Client.Services.RoomKeyStore.Clear() + nameWithType: RoomKeyStore.Clear() +- uid: EchoHub.Client.Services.RoomKeyStore.Clear* + name: Clear + href: api/client/EchoHub.Client.Services.RoomKeyStore.html#EchoHub_Client_Services_RoomKeyStore_Clear_ + commentId: Overload:EchoHub.Client.Services.RoomKeyStore.Clear + fullName: EchoHub.Client.Services.RoomKeyStore.Clear + nameWithType: RoomKeyStore.Clear +- uid: EchoHub.Client.Services.RoomKeyStore.HasKey(System.String) + name: HasKey(string) + href: api/client/EchoHub.Client.Services.RoomKeyStore.html#EchoHub_Client_Services_RoomKeyStore_HasKey_System_String_ + commentId: M:EchoHub.Client.Services.RoomKeyStore.HasKey(System.String) + name.vb: HasKey(String) + fullName: EchoHub.Client.Services.RoomKeyStore.HasKey(string) + fullName.vb: EchoHub.Client.Services.RoomKeyStore.HasKey(String) + nameWithType: RoomKeyStore.HasKey(string) + nameWithType.vb: RoomKeyStore.HasKey(String) +- uid: EchoHub.Client.Services.RoomKeyStore.HasKey* + name: HasKey + href: api/client/EchoHub.Client.Services.RoomKeyStore.html#EchoHub_Client_Services_RoomKeyStore_HasKey_ + commentId: Overload:EchoHub.Client.Services.RoomKeyStore.HasKey + fullName: EchoHub.Client.Services.RoomKeyStore.HasKey + nameWithType: RoomKeyStore.HasKey +- uid: EchoHub.Client.Services.RoomKeyStore.LoadForServer(System.String) + name: LoadForServer(string) + href: api/client/EchoHub.Client.Services.RoomKeyStore.html#EchoHub_Client_Services_RoomKeyStore_LoadForServer_System_String_ + commentId: M:EchoHub.Client.Services.RoomKeyStore.LoadForServer(System.String) + name.vb: LoadForServer(String) + fullName: EchoHub.Client.Services.RoomKeyStore.LoadForServer(string) + fullName.vb: EchoHub.Client.Services.RoomKeyStore.LoadForServer(String) + nameWithType: RoomKeyStore.LoadForServer(string) + nameWithType.vb: RoomKeyStore.LoadForServer(String) +- uid: EchoHub.Client.Services.RoomKeyStore.LoadForServer* + name: LoadForServer + href: api/client/EchoHub.Client.Services.RoomKeyStore.html#EchoHub_Client_Services_RoomKeyStore_LoadForServer_ + commentId: Overload:EchoHub.Client.Services.RoomKeyStore.LoadForServer + fullName: EchoHub.Client.Services.RoomKeyStore.LoadForServer + nameWithType: RoomKeyStore.LoadForServer +- uid: EchoHub.Client.Services.RoomKeyStore.RemoveKey(System.String) + name: RemoveKey(string) + href: api/client/EchoHub.Client.Services.RoomKeyStore.html#EchoHub_Client_Services_RoomKeyStore_RemoveKey_System_String_ + commentId: M:EchoHub.Client.Services.RoomKeyStore.RemoveKey(System.String) + name.vb: RemoveKey(String) + fullName: EchoHub.Client.Services.RoomKeyStore.RemoveKey(string) + fullName.vb: EchoHub.Client.Services.RoomKeyStore.RemoveKey(String) + nameWithType: RoomKeyStore.RemoveKey(string) + nameWithType.vb: RoomKeyStore.RemoveKey(String) +- uid: EchoHub.Client.Services.RoomKeyStore.RemoveKey* + name: RemoveKey + href: api/client/EchoHub.Client.Services.RoomKeyStore.html#EchoHub_Client_Services_RoomKeyStore_RemoveKey_ + commentId: Overload:EchoHub.Client.Services.RoomKeyStore.RemoveKey + fullName: EchoHub.Client.Services.RoomKeyStore.RemoveKey + nameWithType: RoomKeyStore.RemoveKey +- uid: EchoHub.Client.Services.RoomKeyStore.StoreKey(System.String,System.Byte[]) + name: StoreKey(string, byte[]) + href: api/client/EchoHub.Client.Services.RoomKeyStore.html#EchoHub_Client_Services_RoomKeyStore_StoreKey_System_String_System_Byte___ + commentId: M:EchoHub.Client.Services.RoomKeyStore.StoreKey(System.String,System.Byte[]) + name.vb: StoreKey(String, Byte()) + fullName: EchoHub.Client.Services.RoomKeyStore.StoreKey(string, byte[]) + fullName.vb: EchoHub.Client.Services.RoomKeyStore.StoreKey(String, Byte()) + nameWithType: RoomKeyStore.StoreKey(string, byte[]) + nameWithType.vb: RoomKeyStore.StoreKey(String, Byte()) +- uid: EchoHub.Client.Services.RoomKeyStore.StoreKey* + name: StoreKey + href: api/client/EchoHub.Client.Services.RoomKeyStore.html#EchoHub_Client_Services_RoomKeyStore_StoreKey_ + commentId: Overload:EchoHub.Client.Services.RoomKeyStore.StoreKey + fullName: EchoHub.Client.Services.RoomKeyStore.StoreKey + nameWithType: RoomKeyStore.StoreKey +- uid: EchoHub.Client.Services.RoomKeyStore.TryGetKey(System.String,System.Byte[]@) + name: TryGetKey(string, out byte[]) + href: api/client/EchoHub.Client.Services.RoomKeyStore.html#EchoHub_Client_Services_RoomKeyStore_TryGetKey_System_String_System_Byte____ + commentId: M:EchoHub.Client.Services.RoomKeyStore.TryGetKey(System.String,System.Byte[]@) + name.vb: TryGetKey(String, Byte()) + fullName: EchoHub.Client.Services.RoomKeyStore.TryGetKey(string, out byte[]) + fullName.vb: EchoHub.Client.Services.RoomKeyStore.TryGetKey(String, Byte()) + nameWithType: RoomKeyStore.TryGetKey(string, out byte[]) + nameWithType.vb: RoomKeyStore.TryGetKey(String, Byte()) +- uid: EchoHub.Client.Services.RoomKeyStore.TryGetKey* + name: TryGetKey + href: api/client/EchoHub.Client.Services.RoomKeyStore.html#EchoHub_Client_Services_RoomKeyStore_TryGetKey_ + commentId: Overload:EchoHub.Client.Services.RoomKeyStore.TryGetKey + fullName: EchoHub.Client.Services.RoomKeyStore.TryGetKey + nameWithType: RoomKeyStore.TryGetKey - uid: EchoHub.Client.Services.UpdateBackupService name: UpdateBackupService href: api/client/EchoHub.Client.Services.UpdateBackupService.html @@ -2545,6 +3331,18 @@ references: commentId: Overload:EchoHub.Client.UI.Chat.ChatLine.AttachmentFileName fullName: EchoHub.Client.UI.Chat.ChatLine.AttachmentFileName nameWithType: ChatLine.AttachmentFileName +- uid: EchoHub.Client.UI.Chat.ChatLine.AttachmentKind + name: AttachmentKind + href: api/client/EchoHub.Client.UI.Chat.ChatLine.html#EchoHub_Client_UI_Chat_ChatLine_AttachmentKind + commentId: P:EchoHub.Client.UI.Chat.ChatLine.AttachmentKind + fullName: EchoHub.Client.UI.Chat.ChatLine.AttachmentKind + nameWithType: ChatLine.AttachmentKind +- uid: EchoHub.Client.UI.Chat.ChatLine.AttachmentKind* + name: AttachmentKind + href: api/client/EchoHub.Client.UI.Chat.ChatLine.html#EchoHub_Client_UI_Chat_ChatLine_AttachmentKind_ + commentId: Overload:EchoHub.Client.UI.Chat.ChatLine.AttachmentKind + fullName: EchoHub.Client.UI.Chat.ChatLine.AttachmentKind + nameWithType: ChatLine.AttachmentKind - uid: EchoHub.Client.UI.Chat.ChatLine.AttachmentUrl name: AttachmentUrl href: api/client/EchoHub.Client.UI.Chat.ChatLine.html#EchoHub_Client_UI_Chat_ChatLine_AttachmentUrl @@ -2686,18 +3484,6 @@ references: commentId: Overload:EchoHub.Client.UI.Chat.ChatLine.ToString fullName: EchoHub.Client.UI.Chat.ChatLine.ToString nameWithType: ChatLine.ToString -- uid: EchoHub.Client.UI.Chat.ChatLine.Type - name: Type - href: api/client/EchoHub.Client.UI.Chat.ChatLine.html#EchoHub_Client_UI_Chat_ChatLine_Type - commentId: P:EchoHub.Client.UI.Chat.ChatLine.Type - fullName: EchoHub.Client.UI.Chat.ChatLine.Type - nameWithType: ChatLine.Type -- uid: EchoHub.Client.UI.Chat.ChatLine.Type* - name: Type - href: api/client/EchoHub.Client.UI.Chat.ChatLine.html#EchoHub_Client_UI_Chat_ChatLine_Type_ - commentId: Overload:EchoHub.Client.UI.Chat.ChatLine.Type - fullName: EchoHub.Client.UI.Chat.ChatLine.Type - nameWithType: ChatLine.Type - uid: EchoHub.Client.UI.Chat.ChatLine.Wrap(System.Int32,System.Int32) name: Wrap(int, int) href: api/client/EchoHub.Client.UI.Chat.ChatLine.html#EchoHub_Client_UI_Chat_ChatLine_Wrap_System_Int32_System_Int32_ @@ -3391,6 +4177,45 @@ references: commentId: Overload:EchoHub.Client.UI.Dialogs.AudioPlayerDialog.Show fullName: EchoHub.Client.UI.Dialogs.AudioPlayerDialog.Show nameWithType: AudioPlayerDialog.Show +- uid: EchoHub.Client.UI.Dialogs.ChannelPasswordDialog + name: ChannelPasswordDialog + href: api/client/EchoHub.Client.UI.Dialogs.ChannelPasswordDialog.html + commentId: T:EchoHub.Client.UI.Dialogs.ChannelPasswordDialog + fullName: EchoHub.Client.UI.Dialogs.ChannelPasswordDialog + nameWithType: ChannelPasswordDialog +- uid: EchoHub.Client.UI.Dialogs.ChannelPasswordDialog.#ctor + name: ChannelPasswordDialog() + href: api/client/EchoHub.Client.UI.Dialogs.ChannelPasswordDialog.html#EchoHub_Client_UI_Dialogs_ChannelPasswordDialog__ctor + commentId: M:EchoHub.Client.UI.Dialogs.ChannelPasswordDialog.#ctor + name.vb: New() + fullName: EchoHub.Client.UI.Dialogs.ChannelPasswordDialog.ChannelPasswordDialog() + fullName.vb: EchoHub.Client.UI.Dialogs.ChannelPasswordDialog.New() + nameWithType: ChannelPasswordDialog.ChannelPasswordDialog() + nameWithType.vb: ChannelPasswordDialog.New() +- uid: EchoHub.Client.UI.Dialogs.ChannelPasswordDialog.#ctor* + name: ChannelPasswordDialog + href: api/client/EchoHub.Client.UI.Dialogs.ChannelPasswordDialog.html#EchoHub_Client_UI_Dialogs_ChannelPasswordDialog__ctor_ + commentId: Overload:EchoHub.Client.UI.Dialogs.ChannelPasswordDialog.#ctor + name.vb: New + fullName: EchoHub.Client.UI.Dialogs.ChannelPasswordDialog.ChannelPasswordDialog + fullName.vb: EchoHub.Client.UI.Dialogs.ChannelPasswordDialog.New + nameWithType: ChannelPasswordDialog.ChannelPasswordDialog + nameWithType.vb: ChannelPasswordDialog.New +- uid: EchoHub.Client.UI.Dialogs.ChannelPasswordDialog.Show(Terminal.Gui.App.IApplication,System.String,System.String) + name: Show(IApplication, string, string?) + href: api/client/EchoHub.Client.UI.Dialogs.ChannelPasswordDialog.html#EchoHub_Client_UI_Dialogs_ChannelPasswordDialog_Show_Terminal_Gui_App_IApplication_System_String_System_String_ + commentId: M:EchoHub.Client.UI.Dialogs.ChannelPasswordDialog.Show(Terminal.Gui.App.IApplication,System.String,System.String) + name.vb: Show(IApplication, String, String) + fullName: EchoHub.Client.UI.Dialogs.ChannelPasswordDialog.Show(Terminal.Gui.App.IApplication, string, string?) + fullName.vb: EchoHub.Client.UI.Dialogs.ChannelPasswordDialog.Show(Terminal.Gui.App.IApplication, String, String) + nameWithType: ChannelPasswordDialog.Show(IApplication, string, string?) + nameWithType.vb: ChannelPasswordDialog.Show(IApplication, String, String) +- uid: EchoHub.Client.UI.Dialogs.ChannelPasswordDialog.Show* + name: Show + href: api/client/EchoHub.Client.UI.Dialogs.ChannelPasswordDialog.html#EchoHub_Client_UI_Dialogs_ChannelPasswordDialog_Show_ + commentId: Overload:EchoHub.Client.UI.Dialogs.ChannelPasswordDialog.Show + fullName: EchoHub.Client.UI.Dialogs.ChannelPasswordDialog.Show + nameWithType: ChannelPasswordDialog.Show - uid: EchoHub.Client.UI.Dialogs.ConnectDialog name: ConnectDialog href: api/client/EchoHub.Client.UI.Dialogs.ConnectDialog.html @@ -3709,15 +4534,15 @@ references: fullName.vb: EchoHub.Client.UI.Dialogs.CreateChannelResult.New(EchoHub.Client.UI.Dialogs.CreateChannelResult) nameWithType: CreateChannelResult.CreateChannelResult(CreateChannelResult) nameWithType.vb: CreateChannelResult.New(CreateChannelResult) -- uid: EchoHub.Client.UI.Dialogs.CreateChannelResult.#ctor(System.String,System.String,System.Boolean) - name: CreateChannelResult(string, string?, bool) - href: api/client/EchoHub.Client.UI.Dialogs.CreateChannelResult.html#EchoHub_Client_UI_Dialogs_CreateChannelResult__ctor_System_String_System_String_System_Boolean_ - commentId: M:EchoHub.Client.UI.Dialogs.CreateChannelResult.#ctor(System.String,System.String,System.Boolean) - name.vb: New(String, String, Boolean) - fullName: EchoHub.Client.UI.Dialogs.CreateChannelResult.CreateChannelResult(string, string?, bool) - fullName.vb: EchoHub.Client.UI.Dialogs.CreateChannelResult.New(String, String, Boolean) - nameWithType: CreateChannelResult.CreateChannelResult(string, string?, bool) - nameWithType.vb: CreateChannelResult.New(String, String, Boolean) +- uid: EchoHub.Client.UI.Dialogs.CreateChannelResult.#ctor(System.String,System.String,System.Boolean,System.String) + name: CreateChannelResult(string, string?, bool, string?) + href: api/client/EchoHub.Client.UI.Dialogs.CreateChannelResult.html#EchoHub_Client_UI_Dialogs_CreateChannelResult__ctor_System_String_System_String_System_Boolean_System_String_ + commentId: M:EchoHub.Client.UI.Dialogs.CreateChannelResult.#ctor(System.String,System.String,System.Boolean,System.String) + name.vb: New(String, String, Boolean, String) + fullName: EchoHub.Client.UI.Dialogs.CreateChannelResult.CreateChannelResult(string, string?, bool, string?) + fullName.vb: EchoHub.Client.UI.Dialogs.CreateChannelResult.New(String, String, Boolean, String) + nameWithType: CreateChannelResult.CreateChannelResult(string, string?, bool, string?) + nameWithType.vb: CreateChannelResult.New(String, String, Boolean, String) - uid: EchoHub.Client.UI.Dialogs.CreateChannelResult.#ctor* name: CreateChannelResult href: api/client/EchoHub.Client.UI.Dialogs.CreateChannelResult.html#EchoHub_Client_UI_Dialogs_CreateChannelResult__ctor_ @@ -3727,15 +4552,15 @@ references: fullName.vb: EchoHub.Client.UI.Dialogs.CreateChannelResult.New nameWithType: CreateChannelResult.CreateChannelResult nameWithType.vb: CreateChannelResult.New -- uid: EchoHub.Client.UI.Dialogs.CreateChannelResult.Deconstruct(System.String@,System.String@,System.Boolean@) - name: Deconstruct(out string, out string?, out bool) - href: api/client/EchoHub.Client.UI.Dialogs.CreateChannelResult.html#EchoHub_Client_UI_Dialogs_CreateChannelResult_Deconstruct_System_String__System_String__System_Boolean__ - commentId: M:EchoHub.Client.UI.Dialogs.CreateChannelResult.Deconstruct(System.String@,System.String@,System.Boolean@) - name.vb: Deconstruct(String, String, Boolean) - fullName: EchoHub.Client.UI.Dialogs.CreateChannelResult.Deconstruct(out string, out string?, out bool) - fullName.vb: EchoHub.Client.UI.Dialogs.CreateChannelResult.Deconstruct(String, String, Boolean) - nameWithType: CreateChannelResult.Deconstruct(out string, out string?, out bool) - nameWithType.vb: CreateChannelResult.Deconstruct(String, String, Boolean) +- uid: EchoHub.Client.UI.Dialogs.CreateChannelResult.Deconstruct(System.String@,System.String@,System.Boolean@,System.String@) + name: Deconstruct(out string, out string?, out bool, out string?) + href: api/client/EchoHub.Client.UI.Dialogs.CreateChannelResult.html#EchoHub_Client_UI_Dialogs_CreateChannelResult_Deconstruct_System_String__System_String__System_Boolean__System_String__ + commentId: M:EchoHub.Client.UI.Dialogs.CreateChannelResult.Deconstruct(System.String@,System.String@,System.Boolean@,System.String@) + name.vb: Deconstruct(String, String, Boolean, String) + fullName: EchoHub.Client.UI.Dialogs.CreateChannelResult.Deconstruct(out string, out string?, out bool, out string?) + fullName.vb: EchoHub.Client.UI.Dialogs.CreateChannelResult.Deconstruct(String, String, Boolean, String) + nameWithType: CreateChannelResult.Deconstruct(out string, out string?, out bool, out string?) + nameWithType.vb: CreateChannelResult.Deconstruct(String, String, Boolean, String) - uid: EchoHub.Client.UI.Dialogs.CreateChannelResult.Deconstruct* name: Deconstruct href: api/client/EchoHub.Client.UI.Dialogs.CreateChannelResult.html#EchoHub_Client_UI_Dialogs_CreateChannelResult_Deconstruct_ @@ -3814,6 +4639,18 @@ references: commentId: Overload:EchoHub.Client.UI.Dialogs.CreateChannelResult.Name fullName: EchoHub.Client.UI.Dialogs.CreateChannelResult.Name nameWithType: CreateChannelResult.Name +- uid: EchoHub.Client.UI.Dialogs.CreateChannelResult.Password + name: Password + href: api/client/EchoHub.Client.UI.Dialogs.CreateChannelResult.html#EchoHub_Client_UI_Dialogs_CreateChannelResult_Password + commentId: P:EchoHub.Client.UI.Dialogs.CreateChannelResult.Password + fullName: EchoHub.Client.UI.Dialogs.CreateChannelResult.Password + nameWithType: CreateChannelResult.Password +- uid: EchoHub.Client.UI.Dialogs.CreateChannelResult.Password* + name: Password + href: api/client/EchoHub.Client.UI.Dialogs.CreateChannelResult.html#EchoHub_Client_UI_Dialogs_CreateChannelResult_Password_ + commentId: Overload:EchoHub.Client.UI.Dialogs.CreateChannelResult.Password + fullName: EchoHub.Client.UI.Dialogs.CreateChannelResult.Password + nameWithType: CreateChannelResult.Password - uid: EchoHub.Client.UI.Dialogs.CreateChannelResult.PrintMembers(System.Text.StringBuilder) name: PrintMembers(StringBuilder) href: api/client/EchoHub.Client.UI.Dialogs.CreateChannelResult.html#EchoHub_Client_UI_Dialogs_CreateChannelResult_PrintMembers_System_Text_StringBuilder_ @@ -4789,6 +5626,42 @@ references: commentId: N:EchoHub.Client.UI.Helpers fullName: EchoHub.Client.UI.Helpers nameWithType: EchoHub.Client.UI.Helpers +- uid: EchoHub.Client.UI.Helpers.DroppedFileParser + name: DroppedFileParser + href: api/client/EchoHub.Client.UI.Helpers.DroppedFileParser.html + commentId: T:EchoHub.Client.UI.Helpers.DroppedFileParser + fullName: EchoHub.Client.UI.Helpers.DroppedFileParser + nameWithType: DroppedFileParser +- uid: EchoHub.Client.UI.Helpers.DroppedFileParser.LooksLikePath(System.String) + name: LooksLikePath(string) + href: api/client/EchoHub.Client.UI.Helpers.DroppedFileParser.html#EchoHub_Client_UI_Helpers_DroppedFileParser_LooksLikePath_System_String_ + commentId: M:EchoHub.Client.UI.Helpers.DroppedFileParser.LooksLikePath(System.String) + name.vb: LooksLikePath(String) + fullName: EchoHub.Client.UI.Helpers.DroppedFileParser.LooksLikePath(string) + fullName.vb: EchoHub.Client.UI.Helpers.DroppedFileParser.LooksLikePath(String) + nameWithType: DroppedFileParser.LooksLikePath(string) + nameWithType.vb: DroppedFileParser.LooksLikePath(String) +- uid: EchoHub.Client.UI.Helpers.DroppedFileParser.LooksLikePath* + name: LooksLikePath + href: api/client/EchoHub.Client.UI.Helpers.DroppedFileParser.html#EchoHub_Client_UI_Helpers_DroppedFileParser_LooksLikePath_ + commentId: Overload:EchoHub.Client.UI.Helpers.DroppedFileParser.LooksLikePath + fullName: EchoHub.Client.UI.Helpers.DroppedFileParser.LooksLikePath + nameWithType: DroppedFileParser.LooksLikePath +- uid: EchoHub.Client.UI.Helpers.DroppedFileParser.TryGetFiles(System.String,System.Collections.Generic.List{System.String}@,System.Func{System.String,System.Boolean}) + name: TryGetFiles(string, out List, Func?) + href: api/client/EchoHub.Client.UI.Helpers.DroppedFileParser.html#EchoHub_Client_UI_Helpers_DroppedFileParser_TryGetFiles_System_String_System_Collections_Generic_List_System_String___System_Func_System_String_System_Boolean__ + commentId: M:EchoHub.Client.UI.Helpers.DroppedFileParser.TryGetFiles(System.String,System.Collections.Generic.List{System.String}@,System.Func{System.String,System.Boolean}) + name.vb: TryGetFiles(String, List(Of String), Func(Of String, Boolean)) + fullName: EchoHub.Client.UI.Helpers.DroppedFileParser.TryGetFiles(string, out System.Collections.Generic.List, System.Func?) + fullName.vb: EchoHub.Client.UI.Helpers.DroppedFileParser.TryGetFiles(String, System.Collections.Generic.List(Of String), System.Func(Of String, Boolean)) + nameWithType: DroppedFileParser.TryGetFiles(string, out List, Func?) + nameWithType.vb: DroppedFileParser.TryGetFiles(String, List(Of String), Func(Of String, Boolean)) +- uid: EchoHub.Client.UI.Helpers.DroppedFileParser.TryGetFiles* + name: TryGetFiles + href: api/client/EchoHub.Client.UI.Helpers.DroppedFileParser.html#EchoHub_Client_UI_Helpers_DroppedFileParser_TryGetFiles_ + commentId: Overload:EchoHub.Client.UI.Helpers.DroppedFileParser.TryGetFiles + fullName: EchoHub.Client.UI.Helpers.DroppedFileParser.TryGetFiles + nameWithType: DroppedFileParser.TryGetFiles - uid: EchoHub.Client.UI.Helpers.EmojiHelper name: EmojiHelper href: api/client/EchoHub.Client.UI.Helpers.EmojiHelper.html @@ -4987,15 +5860,15 @@ references: commentId: Overload:EchoHub.Client.UI.ListSources.ChannelListSource.ToList fullName: EchoHub.Client.UI.ListSources.ChannelListSource.ToList nameWithType: ChannelListSource.ToList -- uid: EchoHub.Client.UI.ListSources.ChannelListSource.Update(System.Collections.Generic.List{System.String},System.Collections.Generic.Dictionary{System.String,System.Int32},System.String) - name: Update(List, Dictionary, string) - href: api/client/EchoHub.Client.UI.ListSources.ChannelListSource.html#EchoHub_Client_UI_ListSources_ChannelListSource_Update_System_Collections_Generic_List_System_String__System_Collections_Generic_Dictionary_System_String_System_Int32__System_String_ - commentId: M:EchoHub.Client.UI.ListSources.ChannelListSource.Update(System.Collections.Generic.List{System.String},System.Collections.Generic.Dictionary{System.String,System.Int32},System.String) - name.vb: Update(List(Of String), Dictionary(Of String, Integer), String) - fullName: EchoHub.Client.UI.ListSources.ChannelListSource.Update(System.Collections.Generic.List, System.Collections.Generic.Dictionary, string) - fullName.vb: EchoHub.Client.UI.ListSources.ChannelListSource.Update(System.Collections.Generic.List(Of String), System.Collections.Generic.Dictionary(Of String, Integer), String) - nameWithType: ChannelListSource.Update(List, Dictionary, string) - nameWithType.vb: ChannelListSource.Update(List(Of String), Dictionary(Of String, Integer), String) +- uid: EchoHub.Client.UI.ListSources.ChannelListSource.Update(System.Collections.Generic.List{System.String},System.Collections.Generic.Dictionary{System.String,System.Int32},System.String,System.Collections.Generic.IReadOnlySet{System.String}) + name: Update(List, Dictionary, string, IReadOnlySet?) + href: api/client/EchoHub.Client.UI.ListSources.ChannelListSource.html#EchoHub_Client_UI_ListSources_ChannelListSource_Update_System_Collections_Generic_List_System_String__System_Collections_Generic_Dictionary_System_String_System_Int32__System_String_System_Collections_Generic_IReadOnlySet_System_String__ + commentId: M:EchoHub.Client.UI.ListSources.ChannelListSource.Update(System.Collections.Generic.List{System.String},System.Collections.Generic.Dictionary{System.String,System.Int32},System.String,System.Collections.Generic.IReadOnlySet{System.String}) + name.vb: Update(List(Of String), Dictionary(Of String, Integer), String, IReadOnlySet(Of String)) + fullName: EchoHub.Client.UI.ListSources.ChannelListSource.Update(System.Collections.Generic.List, System.Collections.Generic.Dictionary, string, System.Collections.Generic.IReadOnlySet?) + fullName.vb: EchoHub.Client.UI.ListSources.ChannelListSource.Update(System.Collections.Generic.List(Of String), System.Collections.Generic.Dictionary(Of String, Integer), String, System.Collections.Generic.IReadOnlySet(Of String)) + nameWithType: ChannelListSource.Update(List, Dictionary, string, IReadOnlySet?) + nameWithType.vb: ChannelListSource.Update(List(Of String), Dictionary(Of String, Integer), String, IReadOnlySet(Of String)) - uid: EchoHub.Client.UI.ListSources.ChannelListSource.Update* name: Update href: api/client/EchoHub.Client.UI.ListSources.ChannelListSource.html#EchoHub_Client_UI_ListSources_ChannelListSource_Update_ @@ -5392,15 +6265,15 @@ references: commentId: Overload:EchoHub.Client.UI.MainWindow.CurrentChannel fullName: EchoHub.Client.UI.MainWindow.CurrentChannel nameWithType: MainWindow.CurrentChannel -- uid: EchoHub.Client.UI.MainWindow.EnsureChannelInList(System.String,System.Nullable{System.Boolean}) - name: EnsureChannelInList(string, bool?) - href: api/client/EchoHub.Client.UI.MainWindow.html#EchoHub_Client_UI_MainWindow_EnsureChannelInList_System_String_System_Nullable_System_Boolean__ - commentId: M:EchoHub.Client.UI.MainWindow.EnsureChannelInList(System.String,System.Nullable{System.Boolean}) - name.vb: EnsureChannelInList(String, Boolean?) - fullName: EchoHub.Client.UI.MainWindow.EnsureChannelInList(string, bool?) - fullName.vb: EchoHub.Client.UI.MainWindow.EnsureChannelInList(String, Boolean?) - nameWithType: MainWindow.EnsureChannelInList(string, bool?) - nameWithType.vb: MainWindow.EnsureChannelInList(String, Boolean?) +- uid: EchoHub.Client.UI.MainWindow.EnsureChannelInList(System.String,System.Nullable{System.Boolean},System.Nullable{System.Boolean}) + name: EnsureChannelInList(string, bool?, bool?) + href: api/client/EchoHub.Client.UI.MainWindow.html#EchoHub_Client_UI_MainWindow_EnsureChannelInList_System_String_System_Nullable_System_Boolean__System_Nullable_System_Boolean__ + commentId: M:EchoHub.Client.UI.MainWindow.EnsureChannelInList(System.String,System.Nullable{System.Boolean},System.Nullable{System.Boolean}) + name.vb: EnsureChannelInList(String, Boolean?, Boolean?) + fullName: EchoHub.Client.UI.MainWindow.EnsureChannelInList(string, bool?, bool?) + fullName.vb: EchoHub.Client.UI.MainWindow.EnsureChannelInList(String, Boolean?, Boolean?) + nameWithType: MainWindow.EnsureChannelInList(string, bool?, bool?) + nameWithType.vb: MainWindow.EnsureChannelInList(String, Boolean?, Boolean?) - uid: EchoHub.Client.UI.MainWindow.EnsureChannelInList* name: EnsureChannelInList href: api/client/EchoHub.Client.UI.MainWindow.html#EchoHub_Client_UI_MainWindow_EnsureChannelInList_ @@ -5473,6 +6346,12 @@ references: commentId: E:EchoHub.Client.UI.MainWindow.OnDeleteChannelRequested fullName: EchoHub.Client.UI.MainWindow.OnDeleteChannelRequested nameWithType: MainWindow.OnDeleteChannelRequested +- uid: EchoHub.Client.UI.MainWindow.OnDeleteMessageRequested + name: OnDeleteMessageRequested + href: api/client/EchoHub.Client.UI.MainWindow.html#EchoHub_Client_UI_MainWindow_OnDeleteMessageRequested + commentId: E:EchoHub.Client.UI.MainWindow.OnDeleteMessageRequested + fullName: EchoHub.Client.UI.MainWindow.OnDeleteMessageRequested + nameWithType: MainWindow.OnDeleteMessageRequested - uid: EchoHub.Client.UI.MainWindow.OnDisconnectRequested name: OnDisconnectRequested href: api/client/EchoHub.Client.UI.MainWindow.html#EchoHub_Client_UI_MainWindow_OnDisconnectRequested @@ -5485,6 +6364,12 @@ references: commentId: E:EchoHub.Client.UI.MainWindow.OnFileDownloadRequested fullName: EchoHub.Client.UI.MainWindow.OnFileDownloadRequested nameWithType: MainWindow.OnFileDownloadRequested +- uid: EchoHub.Client.UI.MainWindow.OnImageSaveRequested + name: OnImageSaveRequested + href: api/client/EchoHub.Client.UI.MainWindow.html#EchoHub_Client_UI_MainWindow_OnImageSaveRequested + commentId: E:EchoHub.Client.UI.MainWindow.OnImageSaveRequested + fullName: EchoHub.Client.UI.MainWindow.OnImageSaveRequested + nameWithType: MainWindow.OnImageSaveRequested - uid: EchoHub.Client.UI.MainWindow.OnLoadMoreRequested name: OnLoadMoreRequested href: api/client/EchoHub.Client.UI.MainWindow.html#EchoHub_Client_UI_MainWindow_OnLoadMoreRequested @@ -5617,6 +6502,21 @@ references: commentId: Overload:EchoHub.Client.UI.MainWindow.SetCurrentUser fullName: EchoHub.Client.UI.MainWindow.SetCurrentUser nameWithType: MainWindow.SetCurrentUser +- uid: EchoHub.Client.UI.MainWindow.SetStagedAttachments(System.Collections.Generic.IReadOnlyList{System.String},System.String) + name: SetStagedAttachments(IReadOnlyList, string) + href: api/client/EchoHub.Client.UI.MainWindow.html#EchoHub_Client_UI_MainWindow_SetStagedAttachments_System_Collections_Generic_IReadOnlyList_System_String__System_String_ + commentId: M:EchoHub.Client.UI.MainWindow.SetStagedAttachments(System.Collections.Generic.IReadOnlyList{System.String},System.String) + name.vb: SetStagedAttachments(IReadOnlyList(Of String), String) + fullName: EchoHub.Client.UI.MainWindow.SetStagedAttachments(System.Collections.Generic.IReadOnlyList, string) + fullName.vb: EchoHub.Client.UI.MainWindow.SetStagedAttachments(System.Collections.Generic.IReadOnlyList(Of String), String) + nameWithType: MainWindow.SetStagedAttachments(IReadOnlyList, string) + nameWithType.vb: MainWindow.SetStagedAttachments(IReadOnlyList(Of String), String) +- uid: EchoHub.Client.UI.MainWindow.SetStagedAttachments* + name: SetStagedAttachments + href: api/client/EchoHub.Client.UI.MainWindow.html#EchoHub_Client_UI_MainWindow_SetStagedAttachments_ + commentId: Overload:EchoHub.Client.UI.MainWindow.SetStagedAttachments + fullName: EchoHub.Client.UI.MainWindow.SetStagedAttachments + nameWithType: MainWindow.SetStagedAttachments - uid: EchoHub.Client.UI.MainWindow.ShowError(System.String) name: ShowError(string) href: api/client/EchoHub.Client.UI.MainWindow.html#EchoHub_Client_UI_MainWindow_ShowError_System_String_ @@ -5761,6 +6661,12 @@ references: commentId: F:EchoHub.Core.Constants.HubConstants.EmbedMaxUrlsPerMessage fullName: EchoHub.Core.Constants.HubConstants.EmbedMaxUrlsPerMessage nameWithType: HubConstants.EmbedMaxUrlsPerMessage +- uid: EchoHub.Core.Constants.HubConstants.MaxAttachmentsPerMessage + name: MaxAttachmentsPerMessage + href: api/core/EchoHub.Core.Constants.HubConstants.html#EchoHub_Core_Constants_HubConstants_MaxAttachmentsPerMessage + commentId: F:EchoHub.Core.Constants.HubConstants.MaxAttachmentsPerMessage + fullName: EchoHub.Core.Constants.HubConstants.MaxAttachmentsPerMessage + nameWithType: HubConstants.MaxAttachmentsPerMessage - uid: EchoHub.Core.Constants.HubConstants.MaxAudioFileSizeBytes name: MaxAudioFileSizeBytes href: api/core/EchoHub.Core.Constants.HubConstants.html#EchoHub_Core_Constants_HubConstants_MaxAudioFileSizeBytes @@ -5881,6 +6787,12 @@ references: commentId: F:EchoHub.Core.Constants.ValidationConstants.MaxStatusMessageLength fullName: EchoHub.Core.Constants.ValidationConstants.MaxStatusMessageLength nameWithType: ValidationConstants.MaxStatusMessageLength +- uid: EchoHub.Core.Constants.ValidationConstants.MinChannelPasswordLength + name: MinChannelPasswordLength + href: api/core/EchoHub.Core.Constants.ValidationConstants.html#EchoHub_Core_Constants_ValidationConstants_MinChannelPasswordLength + commentId: F:EchoHub.Core.Constants.ValidationConstants.MinChannelPasswordLength + fullName: EchoHub.Core.Constants.ValidationConstants.MinChannelPasswordLength + nameWithType: ValidationConstants.MinChannelPasswordLength - uid: EchoHub.Core.Constants.ValidationConstants.UsernamePattern name: UsernamePattern href: api/core/EchoHub.Core.Constants.ValidationConstants.html#EchoHub_Core_Constants_ValidationConstants_UsernamePattern @@ -5920,15 +6832,15 @@ references: fullName.vb: EchoHub.Core.Contracts.ChannelListItem.New(EchoHub.Core.Contracts.ChannelListItem) nameWithType: ChannelListItem.ChannelListItem(ChannelListItem) nameWithType.vb: ChannelListItem.New(ChannelListItem) -- uid: EchoHub.Core.Contracts.ChannelListItem.#ctor(System.String,System.String,System.Int32) - name: ChannelListItem(string, string?, int) - href: api/core/EchoHub.Core.Contracts.ChannelListItem.html#EchoHub_Core_Contracts_ChannelListItem__ctor_System_String_System_String_System_Int32_ - commentId: M:EchoHub.Core.Contracts.ChannelListItem.#ctor(System.String,System.String,System.Int32) - name.vb: New(String, String, Integer) - fullName: EchoHub.Core.Contracts.ChannelListItem.ChannelListItem(string, string?, int) - fullName.vb: EchoHub.Core.Contracts.ChannelListItem.New(String, String, Integer) - nameWithType: ChannelListItem.ChannelListItem(string, string?, int) - nameWithType.vb: ChannelListItem.New(String, String, Integer) +- uid: EchoHub.Core.Contracts.ChannelListItem.#ctor(System.String,System.String,System.Int32,System.Boolean,System.Boolean) + name: ChannelListItem(string, string?, int, bool, bool) + href: api/core/EchoHub.Core.Contracts.ChannelListItem.html#EchoHub_Core_Contracts_ChannelListItem__ctor_System_String_System_String_System_Int32_System_Boolean_System_Boolean_ + commentId: M:EchoHub.Core.Contracts.ChannelListItem.#ctor(System.String,System.String,System.Int32,System.Boolean,System.Boolean) + name.vb: New(String, String, Integer, Boolean, Boolean) + fullName: EchoHub.Core.Contracts.ChannelListItem.ChannelListItem(string, string?, int, bool, bool) + fullName.vb: EchoHub.Core.Contracts.ChannelListItem.New(String, String, Integer, Boolean, Boolean) + nameWithType: ChannelListItem.ChannelListItem(string, string?, int, bool, bool) + nameWithType.vb: ChannelListItem.New(String, String, Integer, Boolean, Boolean) - uid: EchoHub.Core.Contracts.ChannelListItem.#ctor* name: ChannelListItem href: api/core/EchoHub.Core.Contracts.ChannelListItem.html#EchoHub_Core_Contracts_ChannelListItem__ctor_ @@ -5938,15 +6850,15 @@ references: fullName.vb: EchoHub.Core.Contracts.ChannelListItem.New nameWithType: ChannelListItem.ChannelListItem nameWithType.vb: ChannelListItem.New -- uid: EchoHub.Core.Contracts.ChannelListItem.Deconstruct(System.String@,System.String@,System.Int32@) - name: Deconstruct(out string, out string?, out int) - href: api/core/EchoHub.Core.Contracts.ChannelListItem.html#EchoHub_Core_Contracts_ChannelListItem_Deconstruct_System_String__System_String__System_Int32__ - commentId: M:EchoHub.Core.Contracts.ChannelListItem.Deconstruct(System.String@,System.String@,System.Int32@) - name.vb: Deconstruct(String, String, Integer) - fullName: EchoHub.Core.Contracts.ChannelListItem.Deconstruct(out string, out string?, out int) - fullName.vb: EchoHub.Core.Contracts.ChannelListItem.Deconstruct(String, String, Integer) - nameWithType: ChannelListItem.Deconstruct(out string, out string?, out int) - nameWithType.vb: ChannelListItem.Deconstruct(String, String, Integer) +- uid: EchoHub.Core.Contracts.ChannelListItem.Deconstruct(System.String@,System.String@,System.Int32@,System.Boolean@,System.Boolean@) + name: Deconstruct(out string, out string?, out int, out bool, out bool) + href: api/core/EchoHub.Core.Contracts.ChannelListItem.html#EchoHub_Core_Contracts_ChannelListItem_Deconstruct_System_String__System_String__System_Int32__System_Boolean__System_Boolean__ + commentId: M:EchoHub.Core.Contracts.ChannelListItem.Deconstruct(System.String@,System.String@,System.Int32@,System.Boolean@,System.Boolean@) + name.vb: Deconstruct(String, String, Integer, Boolean, Boolean) + fullName: EchoHub.Core.Contracts.ChannelListItem.Deconstruct(out string, out string?, out int, out bool, out bool) + fullName.vb: EchoHub.Core.Contracts.ChannelListItem.Deconstruct(String, String, Integer, Boolean, Boolean) + nameWithType: ChannelListItem.Deconstruct(out string, out string?, out int, out bool, out bool) + nameWithType.vb: ChannelListItem.Deconstruct(String, String, Integer, Boolean, Boolean) - uid: EchoHub.Core.Contracts.ChannelListItem.Deconstruct* name: Deconstruct href: api/core/EchoHub.Core.Contracts.ChannelListItem.html#EchoHub_Core_Contracts_ChannelListItem_Deconstruct_ @@ -6001,6 +6913,30 @@ references: commentId: Overload:EchoHub.Core.Contracts.ChannelListItem.GetHashCode fullName: EchoHub.Core.Contracts.ChannelListItem.GetHashCode nameWithType: ChannelListItem.GetHashCode +- uid: EchoHub.Core.Contracts.ChannelListItem.IsProtected + name: IsProtected + href: api/core/EchoHub.Core.Contracts.ChannelListItem.html#EchoHub_Core_Contracts_ChannelListItem_IsProtected + commentId: P:EchoHub.Core.Contracts.ChannelListItem.IsProtected + fullName: EchoHub.Core.Contracts.ChannelListItem.IsProtected + nameWithType: ChannelListItem.IsProtected +- uid: EchoHub.Core.Contracts.ChannelListItem.IsProtected* + name: IsProtected + href: api/core/EchoHub.Core.Contracts.ChannelListItem.html#EchoHub_Core_Contracts_ChannelListItem_IsProtected_ + commentId: Overload:EchoHub.Core.Contracts.ChannelListItem.IsProtected + fullName: EchoHub.Core.Contracts.ChannelListItem.IsProtected + nameWithType: ChannelListItem.IsProtected +- uid: EchoHub.Core.Contracts.ChannelListItem.IsPublic + name: IsPublic + href: api/core/EchoHub.Core.Contracts.ChannelListItem.html#EchoHub_Core_Contracts_ChannelListItem_IsPublic + commentId: P:EchoHub.Core.Contracts.ChannelListItem.IsPublic + fullName: EchoHub.Core.Contracts.ChannelListItem.IsPublic + nameWithType: ChannelListItem.IsPublic +- uid: EchoHub.Core.Contracts.ChannelListItem.IsPublic* + name: IsPublic + href: api/core/EchoHub.Core.Contracts.ChannelListItem.html#EchoHub_Core_Contracts_ChannelListItem_IsPublic_ + commentId: Overload:EchoHub.Core.Contracts.ChannelListItem.IsPublic + fullName: EchoHub.Core.Contracts.ChannelListItem.IsPublic + nameWithType: ChannelListItem.IsPublic - uid: EchoHub.Core.Contracts.ChannelListItem.Name name: Name href: api/core/EchoHub.Core.Contracts.ChannelListItem.html#EchoHub_Core_Contracts_ChannelListItem_Name @@ -6103,15 +7039,15 @@ references: commentId: T:EchoHub.Core.Contracts.IChannelService fullName: EchoHub.Core.Contracts.IChannelService nameWithType: IChannelService -- uid: EchoHub.Core.Contracts.IChannelService.CreateChannelAsync(System.Guid,System.String,System.String,System.Boolean) - name: CreateChannelAsync(Guid, string, string?, bool) - href: api/core/EchoHub.Core.Contracts.IChannelService.html#EchoHub_Core_Contracts_IChannelService_CreateChannelAsync_System_Guid_System_String_System_String_System_Boolean_ - commentId: M:EchoHub.Core.Contracts.IChannelService.CreateChannelAsync(System.Guid,System.String,System.String,System.Boolean) - name.vb: CreateChannelAsync(Guid, String, String, Boolean) - fullName: EchoHub.Core.Contracts.IChannelService.CreateChannelAsync(System.Guid, string, string?, bool) - fullName.vb: EchoHub.Core.Contracts.IChannelService.CreateChannelAsync(System.Guid, String, String, Boolean) - nameWithType: IChannelService.CreateChannelAsync(Guid, string, string?, bool) - nameWithType.vb: IChannelService.CreateChannelAsync(Guid, String, String, Boolean) +- uid: EchoHub.Core.Contracts.IChannelService.CreateChannelAsync(System.Guid,System.String,System.String,System.Boolean,System.String,System.String,System.String) + name: CreateChannelAsync(Guid, string, string?, bool, string?, string?, string?) + href: api/core/EchoHub.Core.Contracts.IChannelService.html#EchoHub_Core_Contracts_IChannelService_CreateChannelAsync_System_Guid_System_String_System_String_System_Boolean_System_String_System_String_System_String_ + commentId: M:EchoHub.Core.Contracts.IChannelService.CreateChannelAsync(System.Guid,System.String,System.String,System.Boolean,System.String,System.String,System.String) + name.vb: CreateChannelAsync(Guid, String, String, Boolean, String, String, String) + fullName: EchoHub.Core.Contracts.IChannelService.CreateChannelAsync(System.Guid, string, string?, bool, string?, string?, string?) + fullName.vb: EchoHub.Core.Contracts.IChannelService.CreateChannelAsync(System.Guid, String, String, Boolean, String, String, String) + nameWithType: IChannelService.CreateChannelAsync(Guid, string, string?, bool, string?, string?, string?) + nameWithType.vb: IChannelService.CreateChannelAsync(Guid, String, String, Boolean, String, String, String) - uid: EchoHub.Core.Contracts.IChannelService.CreateChannelAsync* name: CreateChannelAsync href: api/core/EchoHub.Core.Contracts.IChannelService.html#EchoHub_Core_Contracts_IChannelService_CreateChannelAsync_ @@ -6133,15 +7069,15 @@ references: commentId: Overload:EchoHub.Core.Contracts.IChannelService.DeleteChannelAsync fullName: EchoHub.Core.Contracts.IChannelService.DeleteChannelAsync nameWithType: IChannelService.DeleteChannelAsync -- uid: EchoHub.Core.Contracts.IChannelService.EnsureChannelMembershipAsync(System.Guid,System.String) - name: EnsureChannelMembershipAsync(Guid, string) - href: api/core/EchoHub.Core.Contracts.IChannelService.html#EchoHub_Core_Contracts_IChannelService_EnsureChannelMembershipAsync_System_Guid_System_String_ - commentId: M:EchoHub.Core.Contracts.IChannelService.EnsureChannelMembershipAsync(System.Guid,System.String) - name.vb: EnsureChannelMembershipAsync(Guid, String) - fullName: EchoHub.Core.Contracts.IChannelService.EnsureChannelMembershipAsync(System.Guid, string) - fullName.vb: EchoHub.Core.Contracts.IChannelService.EnsureChannelMembershipAsync(System.Guid, String) - nameWithType: IChannelService.EnsureChannelMembershipAsync(Guid, string) - nameWithType.vb: IChannelService.EnsureChannelMembershipAsync(Guid, String) +- uid: EchoHub.Core.Contracts.IChannelService.EnsureChannelMembershipAsync(System.Guid,System.String,System.String) + name: EnsureChannelMembershipAsync(Guid, string, string?) + href: api/core/EchoHub.Core.Contracts.IChannelService.html#EchoHub_Core_Contracts_IChannelService_EnsureChannelMembershipAsync_System_Guid_System_String_System_String_ + commentId: M:EchoHub.Core.Contracts.IChannelService.EnsureChannelMembershipAsync(System.Guid,System.String,System.String) + name.vb: EnsureChannelMembershipAsync(Guid, String, String) + fullName: EchoHub.Core.Contracts.IChannelService.EnsureChannelMembershipAsync(System.Guid, string, string?) + fullName.vb: EchoHub.Core.Contracts.IChannelService.EnsureChannelMembershipAsync(System.Guid, String, String) + nameWithType: IChannelService.EnsureChannelMembershipAsync(Guid, string, string?) + nameWithType.vb: IChannelService.EnsureChannelMembershipAsync(Guid, String, String) - uid: EchoHub.Core.Contracts.IChannelService.EnsureChannelMembershipAsync* name: EnsureChannelMembershipAsync href: api/core/EchoHub.Core.Contracts.IChannelService.html#EchoHub_Core_Contracts_IChannelService_EnsureChannelMembershipAsync_ @@ -6163,6 +7099,36 @@ references: commentId: Overload:EchoHub.Core.Contracts.IChannelService.GetChannelByNameAsync fullName: EchoHub.Core.Contracts.IChannelService.GetChannelByNameAsync nameWithType: IChannelService.GetChannelByNameAsync +- uid: EchoHub.Core.Contracts.IChannelService.GetChannelCryptoAsync(System.String) + name: GetChannelCryptoAsync(string) + href: api/core/EchoHub.Core.Contracts.IChannelService.html#EchoHub_Core_Contracts_IChannelService_GetChannelCryptoAsync_System_String_ + commentId: M:EchoHub.Core.Contracts.IChannelService.GetChannelCryptoAsync(System.String) + name.vb: GetChannelCryptoAsync(String) + fullName: EchoHub.Core.Contracts.IChannelService.GetChannelCryptoAsync(string) + fullName.vb: EchoHub.Core.Contracts.IChannelService.GetChannelCryptoAsync(String) + nameWithType: IChannelService.GetChannelCryptoAsync(string) + nameWithType.vb: IChannelService.GetChannelCryptoAsync(String) +- uid: EchoHub.Core.Contracts.IChannelService.GetChannelCryptoAsync* + name: GetChannelCryptoAsync + href: api/core/EchoHub.Core.Contracts.IChannelService.html#EchoHub_Core_Contracts_IChannelService_GetChannelCryptoAsync_ + commentId: Overload:EchoHub.Core.Contracts.IChannelService.GetChannelCryptoAsync + fullName: EchoHub.Core.Contracts.IChannelService.GetChannelCryptoAsync + nameWithType: IChannelService.GetChannelCryptoAsync +- uid: EchoHub.Core.Contracts.IChannelService.GetChannelKeyEnvelopeAsync(System.String) + name: GetChannelKeyEnvelopeAsync(string) + href: api/core/EchoHub.Core.Contracts.IChannelService.html#EchoHub_Core_Contracts_IChannelService_GetChannelKeyEnvelopeAsync_System_String_ + commentId: M:EchoHub.Core.Contracts.IChannelService.GetChannelKeyEnvelopeAsync(System.String) + name.vb: GetChannelKeyEnvelopeAsync(String) + fullName: EchoHub.Core.Contracts.IChannelService.GetChannelKeyEnvelopeAsync(string) + fullName.vb: EchoHub.Core.Contracts.IChannelService.GetChannelKeyEnvelopeAsync(String) + nameWithType: IChannelService.GetChannelKeyEnvelopeAsync(string) + nameWithType.vb: IChannelService.GetChannelKeyEnvelopeAsync(String) +- uid: EchoHub.Core.Contracts.IChannelService.GetChannelKeyEnvelopeAsync* + name: GetChannelKeyEnvelopeAsync + href: api/core/EchoHub.Core.Contracts.IChannelService.html#EchoHub_Core_Contracts_IChannelService_GetChannelKeyEnvelopeAsync_ + commentId: Overload:EchoHub.Core.Contracts.IChannelService.GetChannelKeyEnvelopeAsync + fullName: EchoHub.Core.Contracts.IChannelService.GetChannelKeyEnvelopeAsync + nameWithType: IChannelService.GetChannelKeyEnvelopeAsync - uid: EchoHub.Core.Contracts.IChannelService.GetChannelListAsync name: GetChannelListAsync() href: api/core/EchoHub.Core.Contracts.IChannelService.html#EchoHub_Core_Contracts_IChannelService_GetChannelListAsync @@ -6205,6 +7171,36 @@ references: commentId: Overload:EchoHub.Core.Contracts.IChannelService.GetChannelsAsync fullName: EchoHub.Core.Contracts.IChannelService.GetChannelsAsync nameWithType: IChannelService.GetChannelsAsync +- uid: EchoHub.Core.Contracts.IChannelService.RekeyChannelAsync(System.Guid,System.String,System.String,System.String,System.String,System.String) + name: RekeyChannelAsync(Guid, string, string, string, string, string) + href: api/core/EchoHub.Core.Contracts.IChannelService.html#EchoHub_Core_Contracts_IChannelService_RekeyChannelAsync_System_Guid_System_String_System_String_System_String_System_String_System_String_ + commentId: M:EchoHub.Core.Contracts.IChannelService.RekeyChannelAsync(System.Guid,System.String,System.String,System.String,System.String,System.String) + name.vb: RekeyChannelAsync(Guid, String, String, String, String, String) + fullName: EchoHub.Core.Contracts.IChannelService.RekeyChannelAsync(System.Guid, string, string, string, string, string) + fullName.vb: EchoHub.Core.Contracts.IChannelService.RekeyChannelAsync(System.Guid, String, String, String, String, String) + nameWithType: IChannelService.RekeyChannelAsync(Guid, string, string, string, string, string) + nameWithType.vb: IChannelService.RekeyChannelAsync(Guid, String, String, String, String, String) +- uid: EchoHub.Core.Contracts.IChannelService.RekeyChannelAsync* + name: RekeyChannelAsync + href: api/core/EchoHub.Core.Contracts.IChannelService.html#EchoHub_Core_Contracts_IChannelService_RekeyChannelAsync_ + commentId: Overload:EchoHub.Core.Contracts.IChannelService.RekeyChannelAsync + fullName: EchoHub.Core.Contracts.IChannelService.RekeyChannelAsync + nameWithType: IChannelService.RekeyChannelAsync +- uid: EchoHub.Core.Contracts.IChannelService.SetChannelPasswordAsync(System.Guid,System.String,System.String) + name: SetChannelPasswordAsync(Guid, string, string?) + href: api/core/EchoHub.Core.Contracts.IChannelService.html#EchoHub_Core_Contracts_IChannelService_SetChannelPasswordAsync_System_Guid_System_String_System_String_ + commentId: M:EchoHub.Core.Contracts.IChannelService.SetChannelPasswordAsync(System.Guid,System.String,System.String) + name.vb: SetChannelPasswordAsync(Guid, String, String) + fullName: EchoHub.Core.Contracts.IChannelService.SetChannelPasswordAsync(System.Guid, string, string?) + fullName.vb: EchoHub.Core.Contracts.IChannelService.SetChannelPasswordAsync(System.Guid, String, String) + nameWithType: IChannelService.SetChannelPasswordAsync(Guid, string, string?) + nameWithType.vb: IChannelService.SetChannelPasswordAsync(Guid, String, String) +- uid: EchoHub.Core.Contracts.IChannelService.SetChannelPasswordAsync* + name: SetChannelPasswordAsync + href: api/core/EchoHub.Core.Contracts.IChannelService.html#EchoHub_Core_Contracts_IChannelService_SetChannelPasswordAsync_ + commentId: Overload:EchoHub.Core.Contracts.IChannelService.SetChannelPasswordAsync + fullName: EchoHub.Core.Contracts.IChannelService.SetChannelPasswordAsync + nameWithType: IChannelService.SetChannelPasswordAsync - uid: EchoHub.Core.Contracts.IChannelService.UpdateTopicAsync(System.Guid,System.String,System.String) name: UpdateTopicAsync(Guid, string, string?) href: api/core/EchoHub.Core.Contracts.IChannelService.html#EchoHub_Core_Contracts_IChannelService_UpdateTopicAsync_System_Guid_System_String_System_String_ @@ -6472,15 +7468,15 @@ references: commentId: Overload:EchoHub.Core.Contracts.IChatService.GetOnlineUsersAsync fullName: EchoHub.Core.Contracts.IChatService.GetOnlineUsersAsync nameWithType: IChatService.GetOnlineUsersAsync -- uid: EchoHub.Core.Contracts.IChatService.JoinChannelAsync(System.String,System.Guid,System.String,System.String) - name: JoinChannelAsync(string, Guid, string, string) - href: api/core/EchoHub.Core.Contracts.IChatService.html#EchoHub_Core_Contracts_IChatService_JoinChannelAsync_System_String_System_Guid_System_String_System_String_ - commentId: M:EchoHub.Core.Contracts.IChatService.JoinChannelAsync(System.String,System.Guid,System.String,System.String) - name.vb: JoinChannelAsync(String, Guid, String, String) - fullName: EchoHub.Core.Contracts.IChatService.JoinChannelAsync(string, System.Guid, string, string) - fullName.vb: EchoHub.Core.Contracts.IChatService.JoinChannelAsync(String, System.Guid, String, String) - nameWithType: IChatService.JoinChannelAsync(string, Guid, string, string) - nameWithType.vb: IChatService.JoinChannelAsync(String, Guid, String, String) +- uid: EchoHub.Core.Contracts.IChatService.JoinChannelAsync(System.String,System.Guid,System.String,System.String,System.String) + name: JoinChannelAsync(string, Guid, string, string, string?) + href: api/core/EchoHub.Core.Contracts.IChatService.html#EchoHub_Core_Contracts_IChatService_JoinChannelAsync_System_String_System_Guid_System_String_System_String_System_String_ + commentId: M:EchoHub.Core.Contracts.IChatService.JoinChannelAsync(System.String,System.Guid,System.String,System.String,System.String) + name.vb: JoinChannelAsync(String, Guid, String, String, String) + fullName: EchoHub.Core.Contracts.IChatService.JoinChannelAsync(string, System.Guid, string, string, string?) + fullName.vb: EchoHub.Core.Contracts.IChatService.JoinChannelAsync(String, System.Guid, String, String, String) + nameWithType: IChatService.JoinChannelAsync(string, Guid, string, string, string?) + nameWithType.vb: IChatService.JoinChannelAsync(String, Guid, String, String, String) - uid: EchoHub.Core.Contracts.IChatService.JoinChannelAsync* name: JoinChannelAsync href: api/core/EchoHub.Core.Contracts.IChatService.html#EchoHub_Core_Contracts_IChatService_JoinChannelAsync_ @@ -7516,6 +8512,222 @@ references: fullName.vb: EchoHub.Core.DTOs.AssignRoleRequest.<> nameWithType: AssignRoleRequest.operator != nameWithType.vb: AssignRoleRequest.<> +- uid: EchoHub.Core.DTOs.AttachmentDto + name: AttachmentDto + href: api/core/EchoHub.Core.DTOs.AttachmentDto.html + commentId: T:EchoHub.Core.DTOs.AttachmentDto + fullName: EchoHub.Core.DTOs.AttachmentDto + nameWithType: AttachmentDto +- uid: EchoHub.Core.DTOs.AttachmentDto.#ctor(EchoHub.Core.DTOs.AttachmentDto) + name: AttachmentDto(AttachmentDto) + href: api/core/EchoHub.Core.DTOs.AttachmentDto.html#EchoHub_Core_DTOs_AttachmentDto__ctor_EchoHub_Core_DTOs_AttachmentDto_ + commentId: M:EchoHub.Core.DTOs.AttachmentDto.#ctor(EchoHub.Core.DTOs.AttachmentDto) + name.vb: New(AttachmentDto) + fullName: EchoHub.Core.DTOs.AttachmentDto.AttachmentDto(EchoHub.Core.DTOs.AttachmentDto) + fullName.vb: EchoHub.Core.DTOs.AttachmentDto.New(EchoHub.Core.DTOs.AttachmentDto) + nameWithType: AttachmentDto.AttachmentDto(AttachmentDto) + nameWithType.vb: AttachmentDto.New(AttachmentDto) +- uid: EchoHub.Core.DTOs.AttachmentDto.#ctor(EchoHub.Core.Models.AttachmentKind,System.String,System.String,System.Int64,System.String) + name: AttachmentDto(AttachmentKind, string, string, long, string?) + href: api/core/EchoHub.Core.DTOs.AttachmentDto.html#EchoHub_Core_DTOs_AttachmentDto__ctor_EchoHub_Core_Models_AttachmentKind_System_String_System_String_System_Int64_System_String_ + commentId: M:EchoHub.Core.DTOs.AttachmentDto.#ctor(EchoHub.Core.Models.AttachmentKind,System.String,System.String,System.Int64,System.String) + name.vb: New(AttachmentKind, String, String, Long, String) + fullName: EchoHub.Core.DTOs.AttachmentDto.AttachmentDto(EchoHub.Core.Models.AttachmentKind, string, string, long, string?) + fullName.vb: EchoHub.Core.DTOs.AttachmentDto.New(EchoHub.Core.Models.AttachmentKind, String, String, Long, String) + nameWithType: AttachmentDto.AttachmentDto(AttachmentKind, string, string, long, string?) + nameWithType.vb: AttachmentDto.New(AttachmentKind, String, String, Long, String) +- uid: EchoHub.Core.DTOs.AttachmentDto.#ctor* + name: AttachmentDto + href: api/core/EchoHub.Core.DTOs.AttachmentDto.html#EchoHub_Core_DTOs_AttachmentDto__ctor_ + commentId: Overload:EchoHub.Core.DTOs.AttachmentDto.#ctor + name.vb: New + fullName: EchoHub.Core.DTOs.AttachmentDto.AttachmentDto + fullName.vb: EchoHub.Core.DTOs.AttachmentDto.New + nameWithType: AttachmentDto.AttachmentDto + nameWithType.vb: AttachmentDto.New +- uid: EchoHub.Core.DTOs.AttachmentDto.AsciiPreview + name: AsciiPreview + href: api/core/EchoHub.Core.DTOs.AttachmentDto.html#EchoHub_Core_DTOs_AttachmentDto_AsciiPreview + commentId: P:EchoHub.Core.DTOs.AttachmentDto.AsciiPreview + fullName: EchoHub.Core.DTOs.AttachmentDto.AsciiPreview + nameWithType: AttachmentDto.AsciiPreview +- uid: EchoHub.Core.DTOs.AttachmentDto.AsciiPreview* + name: AsciiPreview + href: api/core/EchoHub.Core.DTOs.AttachmentDto.html#EchoHub_Core_DTOs_AttachmentDto_AsciiPreview_ + commentId: Overload:EchoHub.Core.DTOs.AttachmentDto.AsciiPreview + fullName: EchoHub.Core.DTOs.AttachmentDto.AsciiPreview + nameWithType: AttachmentDto.AsciiPreview +- uid: EchoHub.Core.DTOs.AttachmentDto.Deconstruct(EchoHub.Core.Models.AttachmentKind@,System.String@,System.String@,System.Int64@,System.String@) + name: Deconstruct(out AttachmentKind, out string, out string, out long, out string?) + href: api/core/EchoHub.Core.DTOs.AttachmentDto.html#EchoHub_Core_DTOs_AttachmentDto_Deconstruct_EchoHub_Core_Models_AttachmentKind__System_String__System_String__System_Int64__System_String__ + commentId: M:EchoHub.Core.DTOs.AttachmentDto.Deconstruct(EchoHub.Core.Models.AttachmentKind@,System.String@,System.String@,System.Int64@,System.String@) + name.vb: Deconstruct(AttachmentKind, String, String, Long, String) + fullName: EchoHub.Core.DTOs.AttachmentDto.Deconstruct(out EchoHub.Core.Models.AttachmentKind, out string, out string, out long, out string?) + fullName.vb: EchoHub.Core.DTOs.AttachmentDto.Deconstruct(EchoHub.Core.Models.AttachmentKind, String, String, Long, String) + nameWithType: AttachmentDto.Deconstruct(out AttachmentKind, out string, out string, out long, out string?) + nameWithType.vb: AttachmentDto.Deconstruct(AttachmentKind, String, String, Long, String) +- uid: EchoHub.Core.DTOs.AttachmentDto.Deconstruct* + name: Deconstruct + href: api/core/EchoHub.Core.DTOs.AttachmentDto.html#EchoHub_Core_DTOs_AttachmentDto_Deconstruct_ + commentId: Overload:EchoHub.Core.DTOs.AttachmentDto.Deconstruct + fullName: EchoHub.Core.DTOs.AttachmentDto.Deconstruct + nameWithType: AttachmentDto.Deconstruct +- uid: EchoHub.Core.DTOs.AttachmentDto.EqualityContract + name: EqualityContract + href: api/core/EchoHub.Core.DTOs.AttachmentDto.html#EchoHub_Core_DTOs_AttachmentDto_EqualityContract + commentId: P:EchoHub.Core.DTOs.AttachmentDto.EqualityContract + fullName: EchoHub.Core.DTOs.AttachmentDto.EqualityContract + nameWithType: AttachmentDto.EqualityContract +- uid: EchoHub.Core.DTOs.AttachmentDto.EqualityContract* + name: EqualityContract + href: api/core/EchoHub.Core.DTOs.AttachmentDto.html#EchoHub_Core_DTOs_AttachmentDto_EqualityContract_ + commentId: Overload:EchoHub.Core.DTOs.AttachmentDto.EqualityContract + fullName: EchoHub.Core.DTOs.AttachmentDto.EqualityContract + nameWithType: AttachmentDto.EqualityContract +- uid: EchoHub.Core.DTOs.AttachmentDto.Equals(EchoHub.Core.DTOs.AttachmentDto) + name: Equals(AttachmentDto?) + href: api/core/EchoHub.Core.DTOs.AttachmentDto.html#EchoHub_Core_DTOs_AttachmentDto_Equals_EchoHub_Core_DTOs_AttachmentDto_ + commentId: M:EchoHub.Core.DTOs.AttachmentDto.Equals(EchoHub.Core.DTOs.AttachmentDto) + name.vb: Equals(AttachmentDto) + fullName: EchoHub.Core.DTOs.AttachmentDto.Equals(EchoHub.Core.DTOs.AttachmentDto?) + fullName.vb: EchoHub.Core.DTOs.AttachmentDto.Equals(EchoHub.Core.DTOs.AttachmentDto) + nameWithType: AttachmentDto.Equals(AttachmentDto?) + nameWithType.vb: AttachmentDto.Equals(AttachmentDto) +- uid: EchoHub.Core.DTOs.AttachmentDto.Equals(System.Object) + name: Equals(object?) + href: api/core/EchoHub.Core.DTOs.AttachmentDto.html#EchoHub_Core_DTOs_AttachmentDto_Equals_System_Object_ + commentId: M:EchoHub.Core.DTOs.AttachmentDto.Equals(System.Object) + name.vb: Equals(Object) + fullName: EchoHub.Core.DTOs.AttachmentDto.Equals(object?) + fullName.vb: EchoHub.Core.DTOs.AttachmentDto.Equals(Object) + nameWithType: AttachmentDto.Equals(object?) + nameWithType.vb: AttachmentDto.Equals(Object) +- uid: EchoHub.Core.DTOs.AttachmentDto.Equals* + name: Equals + href: api/core/EchoHub.Core.DTOs.AttachmentDto.html#EchoHub_Core_DTOs_AttachmentDto_Equals_ + commentId: Overload:EchoHub.Core.DTOs.AttachmentDto.Equals + fullName: EchoHub.Core.DTOs.AttachmentDto.Equals + nameWithType: AttachmentDto.Equals +- uid: EchoHub.Core.DTOs.AttachmentDto.FileName + name: FileName + href: api/core/EchoHub.Core.DTOs.AttachmentDto.html#EchoHub_Core_DTOs_AttachmentDto_FileName + commentId: P:EchoHub.Core.DTOs.AttachmentDto.FileName + fullName: EchoHub.Core.DTOs.AttachmentDto.FileName + nameWithType: AttachmentDto.FileName +- uid: EchoHub.Core.DTOs.AttachmentDto.FileName* + name: FileName + href: api/core/EchoHub.Core.DTOs.AttachmentDto.html#EchoHub_Core_DTOs_AttachmentDto_FileName_ + commentId: Overload:EchoHub.Core.DTOs.AttachmentDto.FileName + fullName: EchoHub.Core.DTOs.AttachmentDto.FileName + nameWithType: AttachmentDto.FileName +- uid: EchoHub.Core.DTOs.AttachmentDto.FileSize + name: FileSize + href: api/core/EchoHub.Core.DTOs.AttachmentDto.html#EchoHub_Core_DTOs_AttachmentDto_FileSize + commentId: P:EchoHub.Core.DTOs.AttachmentDto.FileSize + fullName: EchoHub.Core.DTOs.AttachmentDto.FileSize + nameWithType: AttachmentDto.FileSize +- uid: EchoHub.Core.DTOs.AttachmentDto.FileSize* + name: FileSize + href: api/core/EchoHub.Core.DTOs.AttachmentDto.html#EchoHub_Core_DTOs_AttachmentDto_FileSize_ + commentId: Overload:EchoHub.Core.DTOs.AttachmentDto.FileSize + fullName: EchoHub.Core.DTOs.AttachmentDto.FileSize + nameWithType: AttachmentDto.FileSize +- uid: EchoHub.Core.DTOs.AttachmentDto.GetHashCode + name: GetHashCode() + href: api/core/EchoHub.Core.DTOs.AttachmentDto.html#EchoHub_Core_DTOs_AttachmentDto_GetHashCode + commentId: M:EchoHub.Core.DTOs.AttachmentDto.GetHashCode + fullName: EchoHub.Core.DTOs.AttachmentDto.GetHashCode() + nameWithType: AttachmentDto.GetHashCode() +- uid: EchoHub.Core.DTOs.AttachmentDto.GetHashCode* + name: GetHashCode + href: api/core/EchoHub.Core.DTOs.AttachmentDto.html#EchoHub_Core_DTOs_AttachmentDto_GetHashCode_ + commentId: Overload:EchoHub.Core.DTOs.AttachmentDto.GetHashCode + fullName: EchoHub.Core.DTOs.AttachmentDto.GetHashCode + nameWithType: AttachmentDto.GetHashCode +- uid: EchoHub.Core.DTOs.AttachmentDto.Kind + name: Kind + href: api/core/EchoHub.Core.DTOs.AttachmentDto.html#EchoHub_Core_DTOs_AttachmentDto_Kind + commentId: P:EchoHub.Core.DTOs.AttachmentDto.Kind + fullName: EchoHub.Core.DTOs.AttachmentDto.Kind + nameWithType: AttachmentDto.Kind +- uid: EchoHub.Core.DTOs.AttachmentDto.Kind* + name: Kind + href: api/core/EchoHub.Core.DTOs.AttachmentDto.html#EchoHub_Core_DTOs_AttachmentDto_Kind_ + commentId: Overload:EchoHub.Core.DTOs.AttachmentDto.Kind + fullName: EchoHub.Core.DTOs.AttachmentDto.Kind + nameWithType: AttachmentDto.Kind +- uid: EchoHub.Core.DTOs.AttachmentDto.PrintMembers(System.Text.StringBuilder) + name: PrintMembers(StringBuilder) + href: api/core/EchoHub.Core.DTOs.AttachmentDto.html#EchoHub_Core_DTOs_AttachmentDto_PrintMembers_System_Text_StringBuilder_ + commentId: M:EchoHub.Core.DTOs.AttachmentDto.PrintMembers(System.Text.StringBuilder) + fullName: EchoHub.Core.DTOs.AttachmentDto.PrintMembers(System.Text.StringBuilder) + nameWithType: AttachmentDto.PrintMembers(StringBuilder) +- uid: EchoHub.Core.DTOs.AttachmentDto.PrintMembers* + name: PrintMembers + href: api/core/EchoHub.Core.DTOs.AttachmentDto.html#EchoHub_Core_DTOs_AttachmentDto_PrintMembers_ + commentId: Overload:EchoHub.Core.DTOs.AttachmentDto.PrintMembers + fullName: EchoHub.Core.DTOs.AttachmentDto.PrintMembers + nameWithType: AttachmentDto.PrintMembers +- uid: EchoHub.Core.DTOs.AttachmentDto.ToString + name: ToString() + href: api/core/EchoHub.Core.DTOs.AttachmentDto.html#EchoHub_Core_DTOs_AttachmentDto_ToString + commentId: M:EchoHub.Core.DTOs.AttachmentDto.ToString + fullName: EchoHub.Core.DTOs.AttachmentDto.ToString() + nameWithType: AttachmentDto.ToString() +- uid: EchoHub.Core.DTOs.AttachmentDto.ToString* + name: ToString + href: api/core/EchoHub.Core.DTOs.AttachmentDto.html#EchoHub_Core_DTOs_AttachmentDto_ToString_ + commentId: Overload:EchoHub.Core.DTOs.AttachmentDto.ToString + fullName: EchoHub.Core.DTOs.AttachmentDto.ToString + nameWithType: AttachmentDto.ToString +- uid: EchoHub.Core.DTOs.AttachmentDto.Url + name: Url + href: api/core/EchoHub.Core.DTOs.AttachmentDto.html#EchoHub_Core_DTOs_AttachmentDto_Url + commentId: P:EchoHub.Core.DTOs.AttachmentDto.Url + fullName: EchoHub.Core.DTOs.AttachmentDto.Url + nameWithType: AttachmentDto.Url +- uid: EchoHub.Core.DTOs.AttachmentDto.Url* + name: Url + href: api/core/EchoHub.Core.DTOs.AttachmentDto.html#EchoHub_Core_DTOs_AttachmentDto_Url_ + commentId: Overload:EchoHub.Core.DTOs.AttachmentDto.Url + fullName: EchoHub.Core.DTOs.AttachmentDto.Url + nameWithType: AttachmentDto.Url +- uid: EchoHub.Core.DTOs.AttachmentDto.op_Equality(EchoHub.Core.DTOs.AttachmentDto,EchoHub.Core.DTOs.AttachmentDto) + name: operator ==(AttachmentDto?, AttachmentDto?) + href: api/core/EchoHub.Core.DTOs.AttachmentDto.html#EchoHub_Core_DTOs_AttachmentDto_op_Equality_EchoHub_Core_DTOs_AttachmentDto_EchoHub_Core_DTOs_AttachmentDto_ + commentId: M:EchoHub.Core.DTOs.AttachmentDto.op_Equality(EchoHub.Core.DTOs.AttachmentDto,EchoHub.Core.DTOs.AttachmentDto) + name.vb: =(AttachmentDto, AttachmentDto) + fullName: EchoHub.Core.DTOs.AttachmentDto.operator ==(EchoHub.Core.DTOs.AttachmentDto?, EchoHub.Core.DTOs.AttachmentDto?) + fullName.vb: EchoHub.Core.DTOs.AttachmentDto.=(EchoHub.Core.DTOs.AttachmentDto, EchoHub.Core.DTOs.AttachmentDto) + nameWithType: AttachmentDto.operator ==(AttachmentDto?, AttachmentDto?) + nameWithType.vb: AttachmentDto.=(AttachmentDto, AttachmentDto) +- uid: EchoHub.Core.DTOs.AttachmentDto.op_Equality* + name: operator == + href: api/core/EchoHub.Core.DTOs.AttachmentDto.html#EchoHub_Core_DTOs_AttachmentDto_op_Equality_ + commentId: Overload:EchoHub.Core.DTOs.AttachmentDto.op_Equality + name.vb: = + fullName: EchoHub.Core.DTOs.AttachmentDto.operator == + fullName.vb: EchoHub.Core.DTOs.AttachmentDto.= + nameWithType: AttachmentDto.operator == + nameWithType.vb: AttachmentDto.= +- uid: EchoHub.Core.DTOs.AttachmentDto.op_Inequality(EchoHub.Core.DTOs.AttachmentDto,EchoHub.Core.DTOs.AttachmentDto) + name: operator !=(AttachmentDto?, AttachmentDto?) + href: api/core/EchoHub.Core.DTOs.AttachmentDto.html#EchoHub_Core_DTOs_AttachmentDto_op_Inequality_EchoHub_Core_DTOs_AttachmentDto_EchoHub_Core_DTOs_AttachmentDto_ + commentId: M:EchoHub.Core.DTOs.AttachmentDto.op_Inequality(EchoHub.Core.DTOs.AttachmentDto,EchoHub.Core.DTOs.AttachmentDto) + name.vb: <>(AttachmentDto, AttachmentDto) + fullName: EchoHub.Core.DTOs.AttachmentDto.operator !=(EchoHub.Core.DTOs.AttachmentDto?, EchoHub.Core.DTOs.AttachmentDto?) + fullName.vb: EchoHub.Core.DTOs.AttachmentDto.<>(EchoHub.Core.DTOs.AttachmentDto, EchoHub.Core.DTOs.AttachmentDto) + nameWithType: AttachmentDto.operator !=(AttachmentDto?, AttachmentDto?) + nameWithType.vb: AttachmentDto.<>(AttachmentDto, AttachmentDto) +- uid: EchoHub.Core.DTOs.AttachmentDto.op_Inequality* + name: operator != + href: api/core/EchoHub.Core.DTOs.AttachmentDto.html#EchoHub_Core_DTOs_AttachmentDto_op_Inequality_ + commentId: Overload:EchoHub.Core.DTOs.AttachmentDto.op_Inequality + name.vb: <> + fullName: EchoHub.Core.DTOs.AttachmentDto.operator != + fullName.vb: EchoHub.Core.DTOs.AttachmentDto.<> + nameWithType: AttachmentDto.operator != + nameWithType.vb: AttachmentDto.<> - uid: EchoHub.Core.DTOs.AvatarUploadResponse name: AvatarUploadResponse href: api/core/EchoHub.Core.DTOs.AvatarUploadResponse.html @@ -7852,6 +9064,186 @@ references: fullName.vb: EchoHub.Core.DTOs.BanRequest.<> nameWithType: BanRequest.operator != nameWithType.vb: BanRequest.<> +- uid: EchoHub.Core.DTOs.ChannelCryptoDto + name: ChannelCryptoDto + href: api/core/EchoHub.Core.DTOs.ChannelCryptoDto.html + commentId: T:EchoHub.Core.DTOs.ChannelCryptoDto + fullName: EchoHub.Core.DTOs.ChannelCryptoDto + nameWithType: ChannelCryptoDto +- uid: EchoHub.Core.DTOs.ChannelCryptoDto.#ctor(EchoHub.Core.DTOs.ChannelCryptoDto) + name: ChannelCryptoDto(ChannelCryptoDto) + href: api/core/EchoHub.Core.DTOs.ChannelCryptoDto.html#EchoHub_Core_DTOs_ChannelCryptoDto__ctor_EchoHub_Core_DTOs_ChannelCryptoDto_ + commentId: M:EchoHub.Core.DTOs.ChannelCryptoDto.#ctor(EchoHub.Core.DTOs.ChannelCryptoDto) + name.vb: New(ChannelCryptoDto) + fullName: EchoHub.Core.DTOs.ChannelCryptoDto.ChannelCryptoDto(EchoHub.Core.DTOs.ChannelCryptoDto) + fullName.vb: EchoHub.Core.DTOs.ChannelCryptoDto.New(EchoHub.Core.DTOs.ChannelCryptoDto) + nameWithType: ChannelCryptoDto.ChannelCryptoDto(ChannelCryptoDto) + nameWithType.vb: ChannelCryptoDto.New(ChannelCryptoDto) +- uid: EchoHub.Core.DTOs.ChannelCryptoDto.#ctor(System.Boolean,System.String) + name: ChannelCryptoDto(bool, string?) + href: api/core/EchoHub.Core.DTOs.ChannelCryptoDto.html#EchoHub_Core_DTOs_ChannelCryptoDto__ctor_System_Boolean_System_String_ + commentId: M:EchoHub.Core.DTOs.ChannelCryptoDto.#ctor(System.Boolean,System.String) + name.vb: New(Boolean, String) + fullName: EchoHub.Core.DTOs.ChannelCryptoDto.ChannelCryptoDto(bool, string?) + fullName.vb: EchoHub.Core.DTOs.ChannelCryptoDto.New(Boolean, String) + nameWithType: ChannelCryptoDto.ChannelCryptoDto(bool, string?) + nameWithType.vb: ChannelCryptoDto.New(Boolean, String) +- uid: EchoHub.Core.DTOs.ChannelCryptoDto.#ctor* + name: ChannelCryptoDto + href: api/core/EchoHub.Core.DTOs.ChannelCryptoDto.html#EchoHub_Core_DTOs_ChannelCryptoDto__ctor_ + commentId: Overload:EchoHub.Core.DTOs.ChannelCryptoDto.#ctor + name.vb: New + fullName: EchoHub.Core.DTOs.ChannelCryptoDto.ChannelCryptoDto + fullName.vb: EchoHub.Core.DTOs.ChannelCryptoDto.New + nameWithType: ChannelCryptoDto.ChannelCryptoDto + nameWithType.vb: ChannelCryptoDto.New +- uid: EchoHub.Core.DTOs.ChannelCryptoDto.Deconstruct(System.Boolean@,System.String@) + name: Deconstruct(out bool, out string?) + href: api/core/EchoHub.Core.DTOs.ChannelCryptoDto.html#EchoHub_Core_DTOs_ChannelCryptoDto_Deconstruct_System_Boolean__System_String__ + commentId: M:EchoHub.Core.DTOs.ChannelCryptoDto.Deconstruct(System.Boolean@,System.String@) + name.vb: Deconstruct(Boolean, String) + fullName: EchoHub.Core.DTOs.ChannelCryptoDto.Deconstruct(out bool, out string?) + fullName.vb: EchoHub.Core.DTOs.ChannelCryptoDto.Deconstruct(Boolean, String) + nameWithType: ChannelCryptoDto.Deconstruct(out bool, out string?) + nameWithType.vb: ChannelCryptoDto.Deconstruct(Boolean, String) +- uid: EchoHub.Core.DTOs.ChannelCryptoDto.Deconstruct* + name: Deconstruct + href: api/core/EchoHub.Core.DTOs.ChannelCryptoDto.html#EchoHub_Core_DTOs_ChannelCryptoDto_Deconstruct_ + commentId: Overload:EchoHub.Core.DTOs.ChannelCryptoDto.Deconstruct + fullName: EchoHub.Core.DTOs.ChannelCryptoDto.Deconstruct + nameWithType: ChannelCryptoDto.Deconstruct +- uid: EchoHub.Core.DTOs.ChannelCryptoDto.EncryptionSalt + name: EncryptionSalt + href: api/core/EchoHub.Core.DTOs.ChannelCryptoDto.html#EchoHub_Core_DTOs_ChannelCryptoDto_EncryptionSalt + commentId: P:EchoHub.Core.DTOs.ChannelCryptoDto.EncryptionSalt + fullName: EchoHub.Core.DTOs.ChannelCryptoDto.EncryptionSalt + nameWithType: ChannelCryptoDto.EncryptionSalt +- uid: EchoHub.Core.DTOs.ChannelCryptoDto.EncryptionSalt* + name: EncryptionSalt + href: api/core/EchoHub.Core.DTOs.ChannelCryptoDto.html#EchoHub_Core_DTOs_ChannelCryptoDto_EncryptionSalt_ + commentId: Overload:EchoHub.Core.DTOs.ChannelCryptoDto.EncryptionSalt + fullName: EchoHub.Core.DTOs.ChannelCryptoDto.EncryptionSalt + nameWithType: ChannelCryptoDto.EncryptionSalt +- uid: EchoHub.Core.DTOs.ChannelCryptoDto.EqualityContract + name: EqualityContract + href: api/core/EchoHub.Core.DTOs.ChannelCryptoDto.html#EchoHub_Core_DTOs_ChannelCryptoDto_EqualityContract + commentId: P:EchoHub.Core.DTOs.ChannelCryptoDto.EqualityContract + fullName: EchoHub.Core.DTOs.ChannelCryptoDto.EqualityContract + nameWithType: ChannelCryptoDto.EqualityContract +- uid: EchoHub.Core.DTOs.ChannelCryptoDto.EqualityContract* + name: EqualityContract + href: api/core/EchoHub.Core.DTOs.ChannelCryptoDto.html#EchoHub_Core_DTOs_ChannelCryptoDto_EqualityContract_ + commentId: Overload:EchoHub.Core.DTOs.ChannelCryptoDto.EqualityContract + fullName: EchoHub.Core.DTOs.ChannelCryptoDto.EqualityContract + nameWithType: ChannelCryptoDto.EqualityContract +- uid: EchoHub.Core.DTOs.ChannelCryptoDto.Equals(EchoHub.Core.DTOs.ChannelCryptoDto) + name: Equals(ChannelCryptoDto?) + href: api/core/EchoHub.Core.DTOs.ChannelCryptoDto.html#EchoHub_Core_DTOs_ChannelCryptoDto_Equals_EchoHub_Core_DTOs_ChannelCryptoDto_ + commentId: M:EchoHub.Core.DTOs.ChannelCryptoDto.Equals(EchoHub.Core.DTOs.ChannelCryptoDto) + name.vb: Equals(ChannelCryptoDto) + fullName: EchoHub.Core.DTOs.ChannelCryptoDto.Equals(EchoHub.Core.DTOs.ChannelCryptoDto?) + fullName.vb: EchoHub.Core.DTOs.ChannelCryptoDto.Equals(EchoHub.Core.DTOs.ChannelCryptoDto) + nameWithType: ChannelCryptoDto.Equals(ChannelCryptoDto?) + nameWithType.vb: ChannelCryptoDto.Equals(ChannelCryptoDto) +- uid: EchoHub.Core.DTOs.ChannelCryptoDto.Equals(System.Object) + name: Equals(object?) + href: api/core/EchoHub.Core.DTOs.ChannelCryptoDto.html#EchoHub_Core_DTOs_ChannelCryptoDto_Equals_System_Object_ + commentId: M:EchoHub.Core.DTOs.ChannelCryptoDto.Equals(System.Object) + name.vb: Equals(Object) + fullName: EchoHub.Core.DTOs.ChannelCryptoDto.Equals(object?) + fullName.vb: EchoHub.Core.DTOs.ChannelCryptoDto.Equals(Object) + nameWithType: ChannelCryptoDto.Equals(object?) + nameWithType.vb: ChannelCryptoDto.Equals(Object) +- uid: EchoHub.Core.DTOs.ChannelCryptoDto.Equals* + name: Equals + href: api/core/EchoHub.Core.DTOs.ChannelCryptoDto.html#EchoHub_Core_DTOs_ChannelCryptoDto_Equals_ + commentId: Overload:EchoHub.Core.DTOs.ChannelCryptoDto.Equals + fullName: EchoHub.Core.DTOs.ChannelCryptoDto.Equals + nameWithType: ChannelCryptoDto.Equals +- uid: EchoHub.Core.DTOs.ChannelCryptoDto.GetHashCode + name: GetHashCode() + href: api/core/EchoHub.Core.DTOs.ChannelCryptoDto.html#EchoHub_Core_DTOs_ChannelCryptoDto_GetHashCode + commentId: M:EchoHub.Core.DTOs.ChannelCryptoDto.GetHashCode + fullName: EchoHub.Core.DTOs.ChannelCryptoDto.GetHashCode() + nameWithType: ChannelCryptoDto.GetHashCode() +- uid: EchoHub.Core.DTOs.ChannelCryptoDto.GetHashCode* + name: GetHashCode + href: api/core/EchoHub.Core.DTOs.ChannelCryptoDto.html#EchoHub_Core_DTOs_ChannelCryptoDto_GetHashCode_ + commentId: Overload:EchoHub.Core.DTOs.ChannelCryptoDto.GetHashCode + fullName: EchoHub.Core.DTOs.ChannelCryptoDto.GetHashCode + nameWithType: ChannelCryptoDto.GetHashCode +- uid: EchoHub.Core.DTOs.ChannelCryptoDto.IsEncrypted + name: IsEncrypted + href: api/core/EchoHub.Core.DTOs.ChannelCryptoDto.html#EchoHub_Core_DTOs_ChannelCryptoDto_IsEncrypted + commentId: P:EchoHub.Core.DTOs.ChannelCryptoDto.IsEncrypted + fullName: EchoHub.Core.DTOs.ChannelCryptoDto.IsEncrypted + nameWithType: ChannelCryptoDto.IsEncrypted +- uid: EchoHub.Core.DTOs.ChannelCryptoDto.IsEncrypted* + name: IsEncrypted + href: api/core/EchoHub.Core.DTOs.ChannelCryptoDto.html#EchoHub_Core_DTOs_ChannelCryptoDto_IsEncrypted_ + commentId: Overload:EchoHub.Core.DTOs.ChannelCryptoDto.IsEncrypted + fullName: EchoHub.Core.DTOs.ChannelCryptoDto.IsEncrypted + nameWithType: ChannelCryptoDto.IsEncrypted +- uid: EchoHub.Core.DTOs.ChannelCryptoDto.PrintMembers(System.Text.StringBuilder) + name: PrintMembers(StringBuilder) + href: api/core/EchoHub.Core.DTOs.ChannelCryptoDto.html#EchoHub_Core_DTOs_ChannelCryptoDto_PrintMembers_System_Text_StringBuilder_ + commentId: M:EchoHub.Core.DTOs.ChannelCryptoDto.PrintMembers(System.Text.StringBuilder) + fullName: EchoHub.Core.DTOs.ChannelCryptoDto.PrintMembers(System.Text.StringBuilder) + nameWithType: ChannelCryptoDto.PrintMembers(StringBuilder) +- uid: EchoHub.Core.DTOs.ChannelCryptoDto.PrintMembers* + name: PrintMembers + href: api/core/EchoHub.Core.DTOs.ChannelCryptoDto.html#EchoHub_Core_DTOs_ChannelCryptoDto_PrintMembers_ + commentId: Overload:EchoHub.Core.DTOs.ChannelCryptoDto.PrintMembers + fullName: EchoHub.Core.DTOs.ChannelCryptoDto.PrintMembers + nameWithType: ChannelCryptoDto.PrintMembers +- uid: EchoHub.Core.DTOs.ChannelCryptoDto.ToString + name: ToString() + href: api/core/EchoHub.Core.DTOs.ChannelCryptoDto.html#EchoHub_Core_DTOs_ChannelCryptoDto_ToString + commentId: M:EchoHub.Core.DTOs.ChannelCryptoDto.ToString + fullName: EchoHub.Core.DTOs.ChannelCryptoDto.ToString() + nameWithType: ChannelCryptoDto.ToString() +- uid: EchoHub.Core.DTOs.ChannelCryptoDto.ToString* + name: ToString + href: api/core/EchoHub.Core.DTOs.ChannelCryptoDto.html#EchoHub_Core_DTOs_ChannelCryptoDto_ToString_ + commentId: Overload:EchoHub.Core.DTOs.ChannelCryptoDto.ToString + fullName: EchoHub.Core.DTOs.ChannelCryptoDto.ToString + nameWithType: ChannelCryptoDto.ToString +- uid: EchoHub.Core.DTOs.ChannelCryptoDto.op_Equality(EchoHub.Core.DTOs.ChannelCryptoDto,EchoHub.Core.DTOs.ChannelCryptoDto) + name: operator ==(ChannelCryptoDto?, ChannelCryptoDto?) + href: api/core/EchoHub.Core.DTOs.ChannelCryptoDto.html#EchoHub_Core_DTOs_ChannelCryptoDto_op_Equality_EchoHub_Core_DTOs_ChannelCryptoDto_EchoHub_Core_DTOs_ChannelCryptoDto_ + commentId: M:EchoHub.Core.DTOs.ChannelCryptoDto.op_Equality(EchoHub.Core.DTOs.ChannelCryptoDto,EchoHub.Core.DTOs.ChannelCryptoDto) + name.vb: =(ChannelCryptoDto, ChannelCryptoDto) + fullName: EchoHub.Core.DTOs.ChannelCryptoDto.operator ==(EchoHub.Core.DTOs.ChannelCryptoDto?, EchoHub.Core.DTOs.ChannelCryptoDto?) + fullName.vb: EchoHub.Core.DTOs.ChannelCryptoDto.=(EchoHub.Core.DTOs.ChannelCryptoDto, EchoHub.Core.DTOs.ChannelCryptoDto) + nameWithType: ChannelCryptoDto.operator ==(ChannelCryptoDto?, ChannelCryptoDto?) + nameWithType.vb: ChannelCryptoDto.=(ChannelCryptoDto, ChannelCryptoDto) +- uid: EchoHub.Core.DTOs.ChannelCryptoDto.op_Equality* + name: operator == + href: api/core/EchoHub.Core.DTOs.ChannelCryptoDto.html#EchoHub_Core_DTOs_ChannelCryptoDto_op_Equality_ + commentId: Overload:EchoHub.Core.DTOs.ChannelCryptoDto.op_Equality + name.vb: = + fullName: EchoHub.Core.DTOs.ChannelCryptoDto.operator == + fullName.vb: EchoHub.Core.DTOs.ChannelCryptoDto.= + nameWithType: ChannelCryptoDto.operator == + nameWithType.vb: ChannelCryptoDto.= +- uid: EchoHub.Core.DTOs.ChannelCryptoDto.op_Inequality(EchoHub.Core.DTOs.ChannelCryptoDto,EchoHub.Core.DTOs.ChannelCryptoDto) + name: operator !=(ChannelCryptoDto?, ChannelCryptoDto?) + href: api/core/EchoHub.Core.DTOs.ChannelCryptoDto.html#EchoHub_Core_DTOs_ChannelCryptoDto_op_Inequality_EchoHub_Core_DTOs_ChannelCryptoDto_EchoHub_Core_DTOs_ChannelCryptoDto_ + commentId: M:EchoHub.Core.DTOs.ChannelCryptoDto.op_Inequality(EchoHub.Core.DTOs.ChannelCryptoDto,EchoHub.Core.DTOs.ChannelCryptoDto) + name.vb: <>(ChannelCryptoDto, ChannelCryptoDto) + fullName: EchoHub.Core.DTOs.ChannelCryptoDto.operator !=(EchoHub.Core.DTOs.ChannelCryptoDto?, EchoHub.Core.DTOs.ChannelCryptoDto?) + fullName.vb: EchoHub.Core.DTOs.ChannelCryptoDto.<>(EchoHub.Core.DTOs.ChannelCryptoDto, EchoHub.Core.DTOs.ChannelCryptoDto) + nameWithType: ChannelCryptoDto.operator !=(ChannelCryptoDto?, ChannelCryptoDto?) + nameWithType.vb: ChannelCryptoDto.<>(ChannelCryptoDto, ChannelCryptoDto) +- uid: EchoHub.Core.DTOs.ChannelCryptoDto.op_Inequality* + name: operator != + href: api/core/EchoHub.Core.DTOs.ChannelCryptoDto.html#EchoHub_Core_DTOs_ChannelCryptoDto_op_Inequality_ + commentId: Overload:EchoHub.Core.DTOs.ChannelCryptoDto.op_Inequality + name.vb: <> + fullName: EchoHub.Core.DTOs.ChannelCryptoDto.operator != + fullName.vb: EchoHub.Core.DTOs.ChannelCryptoDto.<> + nameWithType: ChannelCryptoDto.operator != + nameWithType.vb: ChannelCryptoDto.<> - uid: EchoHub.Core.DTOs.ChannelDto name: ChannelDto href: api/core/EchoHub.Core.DTOs.ChannelDto.html @@ -7867,15 +9259,15 @@ references: fullName.vb: EchoHub.Core.DTOs.ChannelDto.New(EchoHub.Core.DTOs.ChannelDto) nameWithType: ChannelDto.ChannelDto(ChannelDto) nameWithType.vb: ChannelDto.New(ChannelDto) -- uid: EchoHub.Core.DTOs.ChannelDto.#ctor(System.Guid,System.String,System.String,System.Boolean,System.Int32,System.DateTimeOffset) - name: ChannelDto(Guid, string, string?, bool, int, DateTimeOffset) - href: api/core/EchoHub.Core.DTOs.ChannelDto.html#EchoHub_Core_DTOs_ChannelDto__ctor_System_Guid_System_String_System_String_System_Boolean_System_Int32_System_DateTimeOffset_ - commentId: M:EchoHub.Core.DTOs.ChannelDto.#ctor(System.Guid,System.String,System.String,System.Boolean,System.Int32,System.DateTimeOffset) - name.vb: New(Guid, String, String, Boolean, Integer, DateTimeOffset) - fullName: EchoHub.Core.DTOs.ChannelDto.ChannelDto(System.Guid, string, string?, bool, int, System.DateTimeOffset) - fullName.vb: EchoHub.Core.DTOs.ChannelDto.New(System.Guid, String, String, Boolean, Integer, System.DateTimeOffset) - nameWithType: ChannelDto.ChannelDto(Guid, string, string?, bool, int, DateTimeOffset) - nameWithType.vb: ChannelDto.New(Guid, String, String, Boolean, Integer, DateTimeOffset) +- uid: EchoHub.Core.DTOs.ChannelDto.#ctor(System.Guid,System.String,System.String,System.Boolean,System.Int32,System.DateTimeOffset,System.Boolean,System.Boolean) + name: ChannelDto(Guid, string, string?, bool, int, DateTimeOffset, bool, bool) + href: api/core/EchoHub.Core.DTOs.ChannelDto.html#EchoHub_Core_DTOs_ChannelDto__ctor_System_Guid_System_String_System_String_System_Boolean_System_Int32_System_DateTimeOffset_System_Boolean_System_Boolean_ + commentId: M:EchoHub.Core.DTOs.ChannelDto.#ctor(System.Guid,System.String,System.String,System.Boolean,System.Int32,System.DateTimeOffset,System.Boolean,System.Boolean) + name.vb: New(Guid, String, String, Boolean, Integer, DateTimeOffset, Boolean, Boolean) + fullName: EchoHub.Core.DTOs.ChannelDto.ChannelDto(System.Guid, string, string?, bool, int, System.DateTimeOffset, bool, bool) + fullName.vb: EchoHub.Core.DTOs.ChannelDto.New(System.Guid, String, String, Boolean, Integer, System.DateTimeOffset, Boolean, Boolean) + nameWithType: ChannelDto.ChannelDto(Guid, string, string?, bool, int, DateTimeOffset, bool, bool) + nameWithType.vb: ChannelDto.New(Guid, String, String, Boolean, Integer, DateTimeOffset, Boolean, Boolean) - uid: EchoHub.Core.DTOs.ChannelDto.#ctor* name: ChannelDto href: api/core/EchoHub.Core.DTOs.ChannelDto.html#EchoHub_Core_DTOs_ChannelDto__ctor_ @@ -7897,15 +9289,15 @@ references: commentId: Overload:EchoHub.Core.DTOs.ChannelDto.CreatedAt fullName: EchoHub.Core.DTOs.ChannelDto.CreatedAt nameWithType: ChannelDto.CreatedAt -- uid: EchoHub.Core.DTOs.ChannelDto.Deconstruct(System.Guid@,System.String@,System.String@,System.Boolean@,System.Int32@,System.DateTimeOffset@) - name: Deconstruct(out Guid, out string, out string?, out bool, out int, out DateTimeOffset) - href: api/core/EchoHub.Core.DTOs.ChannelDto.html#EchoHub_Core_DTOs_ChannelDto_Deconstruct_System_Guid__System_String__System_String__System_Boolean__System_Int32__System_DateTimeOffset__ - commentId: M:EchoHub.Core.DTOs.ChannelDto.Deconstruct(System.Guid@,System.String@,System.String@,System.Boolean@,System.Int32@,System.DateTimeOffset@) - name.vb: Deconstruct(Guid, String, String, Boolean, Integer, DateTimeOffset) - fullName: EchoHub.Core.DTOs.ChannelDto.Deconstruct(out System.Guid, out string, out string?, out bool, out int, out System.DateTimeOffset) - fullName.vb: EchoHub.Core.DTOs.ChannelDto.Deconstruct(System.Guid, String, String, Boolean, Integer, System.DateTimeOffset) - nameWithType: ChannelDto.Deconstruct(out Guid, out string, out string?, out bool, out int, out DateTimeOffset) - nameWithType.vb: ChannelDto.Deconstruct(Guid, String, String, Boolean, Integer, DateTimeOffset) +- uid: EchoHub.Core.DTOs.ChannelDto.Deconstruct(System.Guid@,System.String@,System.String@,System.Boolean@,System.Int32@,System.DateTimeOffset@,System.Boolean@,System.Boolean@) + name: Deconstruct(out Guid, out string, out string?, out bool, out int, out DateTimeOffset, out bool, out bool) + href: api/core/EchoHub.Core.DTOs.ChannelDto.html#EchoHub_Core_DTOs_ChannelDto_Deconstruct_System_Guid__System_String__System_String__System_Boolean__System_Int32__System_DateTimeOffset__System_Boolean__System_Boolean__ + commentId: M:EchoHub.Core.DTOs.ChannelDto.Deconstruct(System.Guid@,System.String@,System.String@,System.Boolean@,System.Int32@,System.DateTimeOffset@,System.Boolean@,System.Boolean@) + name.vb: Deconstruct(Guid, String, String, Boolean, Integer, DateTimeOffset, Boolean, Boolean) + fullName: EchoHub.Core.DTOs.ChannelDto.Deconstruct(out System.Guid, out string, out string?, out bool, out int, out System.DateTimeOffset, out bool, out bool) + fullName.vb: EchoHub.Core.DTOs.ChannelDto.Deconstruct(System.Guid, String, String, Boolean, Integer, System.DateTimeOffset, Boolean, Boolean) + nameWithType: ChannelDto.Deconstruct(out Guid, out string, out string?, out bool, out int, out DateTimeOffset, out bool, out bool) + nameWithType.vb: ChannelDto.Deconstruct(Guid, String, String, Boolean, Integer, DateTimeOffset, Boolean, Boolean) - uid: EchoHub.Core.DTOs.ChannelDto.Deconstruct* name: Deconstruct href: api/core/EchoHub.Core.DTOs.ChannelDto.html#EchoHub_Core_DTOs_ChannelDto_Deconstruct_ @@ -7972,6 +9364,30 @@ references: commentId: Overload:EchoHub.Core.DTOs.ChannelDto.Id fullName: EchoHub.Core.DTOs.ChannelDto.Id nameWithType: ChannelDto.Id +- uid: EchoHub.Core.DTOs.ChannelDto.IsEncrypted + name: IsEncrypted + href: api/core/EchoHub.Core.DTOs.ChannelDto.html#EchoHub_Core_DTOs_ChannelDto_IsEncrypted + commentId: P:EchoHub.Core.DTOs.ChannelDto.IsEncrypted + fullName: EchoHub.Core.DTOs.ChannelDto.IsEncrypted + nameWithType: ChannelDto.IsEncrypted +- uid: EchoHub.Core.DTOs.ChannelDto.IsEncrypted* + name: IsEncrypted + href: api/core/EchoHub.Core.DTOs.ChannelDto.html#EchoHub_Core_DTOs_ChannelDto_IsEncrypted_ + commentId: Overload:EchoHub.Core.DTOs.ChannelDto.IsEncrypted + fullName: EchoHub.Core.DTOs.ChannelDto.IsEncrypted + nameWithType: ChannelDto.IsEncrypted +- uid: EchoHub.Core.DTOs.ChannelDto.IsProtected + name: IsProtected + href: api/core/EchoHub.Core.DTOs.ChannelDto.html#EchoHub_Core_DTOs_ChannelDto_IsProtected + commentId: P:EchoHub.Core.DTOs.ChannelDto.IsProtected + fullName: EchoHub.Core.DTOs.ChannelDto.IsProtected + nameWithType: ChannelDto.IsProtected +- uid: EchoHub.Core.DTOs.ChannelDto.IsProtected* + name: IsProtected + href: api/core/EchoHub.Core.DTOs.ChannelDto.html#EchoHub_Core_DTOs_ChannelDto_IsProtected_ + commentId: Overload:EchoHub.Core.DTOs.ChannelDto.IsProtected + fullName: EchoHub.Core.DTOs.ChannelDto.IsProtected + nameWithType: ChannelDto.IsProtected - uid: EchoHub.Core.DTOs.ChannelDto.IsPublic name: IsPublic href: api/core/EchoHub.Core.DTOs.ChannelDto.html#EchoHub_Core_DTOs_ChannelDto_IsPublic @@ -8362,15 +9778,15 @@ references: fullName.vb: EchoHub.Core.DTOs.CreateChannelRequest.New(EchoHub.Core.DTOs.CreateChannelRequest) nameWithType: CreateChannelRequest.CreateChannelRequest(CreateChannelRequest) nameWithType.vb: CreateChannelRequest.New(CreateChannelRequest) -- uid: EchoHub.Core.DTOs.CreateChannelRequest.#ctor(System.String,System.String,System.Boolean) - name: CreateChannelRequest(string, string?, bool) - href: api/core/EchoHub.Core.DTOs.CreateChannelRequest.html#EchoHub_Core_DTOs_CreateChannelRequest__ctor_System_String_System_String_System_Boolean_ - commentId: M:EchoHub.Core.DTOs.CreateChannelRequest.#ctor(System.String,System.String,System.Boolean) - name.vb: New(String, String, Boolean) - fullName: EchoHub.Core.DTOs.CreateChannelRequest.CreateChannelRequest(string, string?, bool) - fullName.vb: EchoHub.Core.DTOs.CreateChannelRequest.New(String, String, Boolean) - nameWithType: CreateChannelRequest.CreateChannelRequest(string, string?, bool) - nameWithType.vb: CreateChannelRequest.New(String, String, Boolean) +- uid: EchoHub.Core.DTOs.CreateChannelRequest.#ctor(System.String,System.String,System.Boolean,System.String,System.String,System.String) + name: CreateChannelRequest(string, string?, bool, string?, string?, string?) + href: api/core/EchoHub.Core.DTOs.CreateChannelRequest.html#EchoHub_Core_DTOs_CreateChannelRequest__ctor_System_String_System_String_System_Boolean_System_String_System_String_System_String_ + commentId: M:EchoHub.Core.DTOs.CreateChannelRequest.#ctor(System.String,System.String,System.Boolean,System.String,System.String,System.String) + name.vb: New(String, String, Boolean, String, String, String) + fullName: EchoHub.Core.DTOs.CreateChannelRequest.CreateChannelRequest(string, string?, bool, string?, string?, string?) + fullName.vb: EchoHub.Core.DTOs.CreateChannelRequest.New(String, String, Boolean, String, String, String) + nameWithType: CreateChannelRequest.CreateChannelRequest(string, string?, bool, string?, string?, string?) + nameWithType.vb: CreateChannelRequest.New(String, String, Boolean, String, String, String) - uid: EchoHub.Core.DTOs.CreateChannelRequest.#ctor* name: CreateChannelRequest href: api/core/EchoHub.Core.DTOs.CreateChannelRequest.html#EchoHub_Core_DTOs_CreateChannelRequest__ctor_ @@ -8380,21 +9796,33 @@ references: fullName.vb: EchoHub.Core.DTOs.CreateChannelRequest.New nameWithType: CreateChannelRequest.CreateChannelRequest nameWithType.vb: CreateChannelRequest.New -- uid: EchoHub.Core.DTOs.CreateChannelRequest.Deconstruct(System.String@,System.String@,System.Boolean@) - name: Deconstruct(out string, out string?, out bool) - href: api/core/EchoHub.Core.DTOs.CreateChannelRequest.html#EchoHub_Core_DTOs_CreateChannelRequest_Deconstruct_System_String__System_String__System_Boolean__ - commentId: M:EchoHub.Core.DTOs.CreateChannelRequest.Deconstruct(System.String@,System.String@,System.Boolean@) - name.vb: Deconstruct(String, String, Boolean) - fullName: EchoHub.Core.DTOs.CreateChannelRequest.Deconstruct(out string, out string?, out bool) - fullName.vb: EchoHub.Core.DTOs.CreateChannelRequest.Deconstruct(String, String, Boolean) - nameWithType: CreateChannelRequest.Deconstruct(out string, out string?, out bool) - nameWithType.vb: CreateChannelRequest.Deconstruct(String, String, Boolean) +- uid: EchoHub.Core.DTOs.CreateChannelRequest.Deconstruct(System.String@,System.String@,System.Boolean@,System.String@,System.String@,System.String@) + name: Deconstruct(out string, out string?, out bool, out string?, out string?, out string?) + href: api/core/EchoHub.Core.DTOs.CreateChannelRequest.html#EchoHub_Core_DTOs_CreateChannelRequest_Deconstruct_System_String__System_String__System_Boolean__System_String__System_String__System_String__ + commentId: M:EchoHub.Core.DTOs.CreateChannelRequest.Deconstruct(System.String@,System.String@,System.Boolean@,System.String@,System.String@,System.String@) + name.vb: Deconstruct(String, String, Boolean, String, String, String) + fullName: EchoHub.Core.DTOs.CreateChannelRequest.Deconstruct(out string, out string?, out bool, out string?, out string?, out string?) + fullName.vb: EchoHub.Core.DTOs.CreateChannelRequest.Deconstruct(String, String, Boolean, String, String, String) + nameWithType: CreateChannelRequest.Deconstruct(out string, out string?, out bool, out string?, out string?, out string?) + nameWithType.vb: CreateChannelRequest.Deconstruct(String, String, Boolean, String, String, String) - uid: EchoHub.Core.DTOs.CreateChannelRequest.Deconstruct* name: Deconstruct href: api/core/EchoHub.Core.DTOs.CreateChannelRequest.html#EchoHub_Core_DTOs_CreateChannelRequest_Deconstruct_ commentId: Overload:EchoHub.Core.DTOs.CreateChannelRequest.Deconstruct fullName: EchoHub.Core.DTOs.CreateChannelRequest.Deconstruct nameWithType: CreateChannelRequest.Deconstruct +- uid: EchoHub.Core.DTOs.CreateChannelRequest.EncryptionSalt + name: EncryptionSalt + href: api/core/EchoHub.Core.DTOs.CreateChannelRequest.html#EchoHub_Core_DTOs_CreateChannelRequest_EncryptionSalt + commentId: P:EchoHub.Core.DTOs.CreateChannelRequest.EncryptionSalt + fullName: EchoHub.Core.DTOs.CreateChannelRequest.EncryptionSalt + nameWithType: CreateChannelRequest.EncryptionSalt +- uid: EchoHub.Core.DTOs.CreateChannelRequest.EncryptionSalt* + name: EncryptionSalt + href: api/core/EchoHub.Core.DTOs.CreateChannelRequest.html#EchoHub_Core_DTOs_CreateChannelRequest_EncryptionSalt_ + commentId: Overload:EchoHub.Core.DTOs.CreateChannelRequest.EncryptionSalt + fullName: EchoHub.Core.DTOs.CreateChannelRequest.EncryptionSalt + nameWithType: CreateChannelRequest.EncryptionSalt - uid: EchoHub.Core.DTOs.CreateChannelRequest.EqualityContract name: EqualityContract href: api/core/EchoHub.Core.DTOs.CreateChannelRequest.html#EchoHub_Core_DTOs_CreateChannelRequest_EqualityContract @@ -8467,6 +9895,18 @@ references: commentId: Overload:EchoHub.Core.DTOs.CreateChannelRequest.Name fullName: EchoHub.Core.DTOs.CreateChannelRequest.Name nameWithType: CreateChannelRequest.Name +- uid: EchoHub.Core.DTOs.CreateChannelRequest.Password + name: Password + href: api/core/EchoHub.Core.DTOs.CreateChannelRequest.html#EchoHub_Core_DTOs_CreateChannelRequest_Password + commentId: P:EchoHub.Core.DTOs.CreateChannelRequest.Password + fullName: EchoHub.Core.DTOs.CreateChannelRequest.Password + nameWithType: CreateChannelRequest.Password +- uid: EchoHub.Core.DTOs.CreateChannelRequest.Password* + name: Password + href: api/core/EchoHub.Core.DTOs.CreateChannelRequest.html#EchoHub_Core_DTOs_CreateChannelRequest_Password_ + commentId: Overload:EchoHub.Core.DTOs.CreateChannelRequest.Password + fullName: EchoHub.Core.DTOs.CreateChannelRequest.Password + nameWithType: CreateChannelRequest.Password - uid: EchoHub.Core.DTOs.CreateChannelRequest.PrintMembers(System.Text.StringBuilder) name: PrintMembers(StringBuilder) href: api/core/EchoHub.Core.DTOs.CreateChannelRequest.html#EchoHub_Core_DTOs_CreateChannelRequest_PrintMembers_System_Text_StringBuilder_ @@ -8503,6 +9943,18 @@ references: commentId: Overload:EchoHub.Core.DTOs.CreateChannelRequest.Topic fullName: EchoHub.Core.DTOs.CreateChannelRequest.Topic nameWithType: CreateChannelRequest.Topic +- uid: EchoHub.Core.DTOs.CreateChannelRequest.WrappedRoomKey + name: WrappedRoomKey + href: api/core/EchoHub.Core.DTOs.CreateChannelRequest.html#EchoHub_Core_DTOs_CreateChannelRequest_WrappedRoomKey + commentId: P:EchoHub.Core.DTOs.CreateChannelRequest.WrappedRoomKey + fullName: EchoHub.Core.DTOs.CreateChannelRequest.WrappedRoomKey + nameWithType: CreateChannelRequest.WrappedRoomKey +- uid: EchoHub.Core.DTOs.CreateChannelRequest.WrappedRoomKey* + name: WrappedRoomKey + href: api/core/EchoHub.Core.DTOs.CreateChannelRequest.html#EchoHub_Core_DTOs_CreateChannelRequest_WrappedRoomKey_ + commentId: Overload:EchoHub.Core.DTOs.CreateChannelRequest.WrappedRoomKey + fullName: EchoHub.Core.DTOs.CreateChannelRequest.WrappedRoomKey + nameWithType: CreateChannelRequest.WrappedRoomKey - uid: EchoHub.Core.DTOs.CreateChannelRequest.op_Equality(EchoHub.Core.DTOs.CreateChannelRequest,EchoHub.Core.DTOs.CreateChannelRequest) name: operator ==(CreateChannelRequest?, CreateChannelRequest?) href: api/core/EchoHub.Core.DTOs.CreateChannelRequest.html#EchoHub_Core_DTOs_CreateChannelRequest_op_Equality_EchoHub_Core_DTOs_CreateChannelRequest_EchoHub_Core_DTOs_CreateChannelRequest_ @@ -9130,15 +10582,15 @@ references: fullName.vb: EchoHub.Core.DTOs.JoinChannelResult.New(EchoHub.Core.DTOs.JoinChannelResult) nameWithType: JoinChannelResult.JoinChannelResult(JoinChannelResult) nameWithType.vb: JoinChannelResult.New(JoinChannelResult) -- uid: EchoHub.Core.DTOs.JoinChannelResult.#ctor(System.Boolean,System.Collections.Generic.List{EchoHub.Core.DTOs.MessageDto},System.String) - name: JoinChannelResult(bool, List, string?) - href: api/core/EchoHub.Core.DTOs.JoinChannelResult.html#EchoHub_Core_DTOs_JoinChannelResult__ctor_System_Boolean_System_Collections_Generic_List_EchoHub_Core_DTOs_MessageDto__System_String_ - commentId: M:EchoHub.Core.DTOs.JoinChannelResult.#ctor(System.Boolean,System.Collections.Generic.List{EchoHub.Core.DTOs.MessageDto},System.String) - name.vb: New(Boolean, List(Of MessageDto), String) - fullName: EchoHub.Core.DTOs.JoinChannelResult.JoinChannelResult(bool, System.Collections.Generic.List, string?) - fullName.vb: EchoHub.Core.DTOs.JoinChannelResult.New(Boolean, System.Collections.Generic.List(Of EchoHub.Core.DTOs.MessageDto), String) - nameWithType: JoinChannelResult.JoinChannelResult(bool, List, string?) - nameWithType.vb: JoinChannelResult.New(Boolean, List(Of MessageDto), String) +- uid: EchoHub.Core.DTOs.JoinChannelResult.#ctor(System.Boolean,System.Collections.Generic.List{EchoHub.Core.DTOs.MessageDto},System.String,System.Boolean,System.String,System.String) + name: JoinChannelResult(bool, List, string?, bool, string?, string?) + href: api/core/EchoHub.Core.DTOs.JoinChannelResult.html#EchoHub_Core_DTOs_JoinChannelResult__ctor_System_Boolean_System_Collections_Generic_List_EchoHub_Core_DTOs_MessageDto__System_String_System_Boolean_System_String_System_String_ + commentId: M:EchoHub.Core.DTOs.JoinChannelResult.#ctor(System.Boolean,System.Collections.Generic.List{EchoHub.Core.DTOs.MessageDto},System.String,System.Boolean,System.String,System.String) + name.vb: New(Boolean, List(Of MessageDto), String, Boolean, String, String) + fullName: EchoHub.Core.DTOs.JoinChannelResult.JoinChannelResult(bool, System.Collections.Generic.List, string?, bool, string?, string?) + fullName.vb: EchoHub.Core.DTOs.JoinChannelResult.New(Boolean, System.Collections.Generic.List(Of EchoHub.Core.DTOs.MessageDto), String, Boolean, String, String) + nameWithType: JoinChannelResult.JoinChannelResult(bool, List, string?, bool, string?, string?) + nameWithType.vb: JoinChannelResult.New(Boolean, List(Of MessageDto), String, Boolean, String, String) - uid: EchoHub.Core.DTOs.JoinChannelResult.#ctor* name: JoinChannelResult href: api/core/EchoHub.Core.DTOs.JoinChannelResult.html#EchoHub_Core_DTOs_JoinChannelResult__ctor_ @@ -9148,21 +10600,33 @@ references: fullName.vb: EchoHub.Core.DTOs.JoinChannelResult.New nameWithType: JoinChannelResult.JoinChannelResult nameWithType.vb: JoinChannelResult.New -- uid: EchoHub.Core.DTOs.JoinChannelResult.Deconstruct(System.Boolean@,System.Collections.Generic.List{EchoHub.Core.DTOs.MessageDto}@,System.String@) - name: Deconstruct(out bool, out List, out string?) - href: api/core/EchoHub.Core.DTOs.JoinChannelResult.html#EchoHub_Core_DTOs_JoinChannelResult_Deconstruct_System_Boolean__System_Collections_Generic_List_EchoHub_Core_DTOs_MessageDto___System_String__ - commentId: M:EchoHub.Core.DTOs.JoinChannelResult.Deconstruct(System.Boolean@,System.Collections.Generic.List{EchoHub.Core.DTOs.MessageDto}@,System.String@) - name.vb: Deconstruct(Boolean, List(Of MessageDto), String) - fullName: EchoHub.Core.DTOs.JoinChannelResult.Deconstruct(out bool, out System.Collections.Generic.List, out string?) - fullName.vb: EchoHub.Core.DTOs.JoinChannelResult.Deconstruct(Boolean, System.Collections.Generic.List(Of EchoHub.Core.DTOs.MessageDto), String) - nameWithType: JoinChannelResult.Deconstruct(out bool, out List, out string?) - nameWithType.vb: JoinChannelResult.Deconstruct(Boolean, List(Of MessageDto), String) +- uid: EchoHub.Core.DTOs.JoinChannelResult.Deconstruct(System.Boolean@,System.Collections.Generic.List{EchoHub.Core.DTOs.MessageDto}@,System.String@,System.Boolean@,System.String@,System.String@) + name: Deconstruct(out bool, out List, out string?, out bool, out string?, out string?) + href: api/core/EchoHub.Core.DTOs.JoinChannelResult.html#EchoHub_Core_DTOs_JoinChannelResult_Deconstruct_System_Boolean__System_Collections_Generic_List_EchoHub_Core_DTOs_MessageDto___System_String__System_Boolean__System_String__System_String__ + commentId: M:EchoHub.Core.DTOs.JoinChannelResult.Deconstruct(System.Boolean@,System.Collections.Generic.List{EchoHub.Core.DTOs.MessageDto}@,System.String@,System.Boolean@,System.String@,System.String@) + name.vb: Deconstruct(Boolean, List(Of MessageDto), String, Boolean, String, String) + fullName: EchoHub.Core.DTOs.JoinChannelResult.Deconstruct(out bool, out System.Collections.Generic.List, out string?, out bool, out string?, out string?) + fullName.vb: EchoHub.Core.DTOs.JoinChannelResult.Deconstruct(Boolean, System.Collections.Generic.List(Of EchoHub.Core.DTOs.MessageDto), String, Boolean, String, String) + nameWithType: JoinChannelResult.Deconstruct(out bool, out List, out string?, out bool, out string?, out string?) + nameWithType.vb: JoinChannelResult.Deconstruct(Boolean, List(Of MessageDto), String, Boolean, String, String) - uid: EchoHub.Core.DTOs.JoinChannelResult.Deconstruct* name: Deconstruct href: api/core/EchoHub.Core.DTOs.JoinChannelResult.html#EchoHub_Core_DTOs_JoinChannelResult_Deconstruct_ commentId: Overload:EchoHub.Core.DTOs.JoinChannelResult.Deconstruct fullName: EchoHub.Core.DTOs.JoinChannelResult.Deconstruct nameWithType: JoinChannelResult.Deconstruct +- uid: EchoHub.Core.DTOs.JoinChannelResult.EncryptionSalt + name: EncryptionSalt + href: api/core/EchoHub.Core.DTOs.JoinChannelResult.html#EchoHub_Core_DTOs_JoinChannelResult_EncryptionSalt + commentId: P:EchoHub.Core.DTOs.JoinChannelResult.EncryptionSalt + fullName: EchoHub.Core.DTOs.JoinChannelResult.EncryptionSalt + nameWithType: JoinChannelResult.EncryptionSalt +- uid: EchoHub.Core.DTOs.JoinChannelResult.EncryptionSalt* + name: EncryptionSalt + href: api/core/EchoHub.Core.DTOs.JoinChannelResult.html#EchoHub_Core_DTOs_JoinChannelResult_EncryptionSalt_ + commentId: Overload:EchoHub.Core.DTOs.JoinChannelResult.EncryptionSalt + fullName: EchoHub.Core.DTOs.JoinChannelResult.EncryptionSalt + nameWithType: JoinChannelResult.EncryptionSalt - uid: EchoHub.Core.DTOs.JoinChannelResult.EqualityContract name: EqualityContract href: api/core/EchoHub.Core.DTOs.JoinChannelResult.html#EchoHub_Core_DTOs_JoinChannelResult_EqualityContract @@ -9235,6 +10699,18 @@ references: commentId: Overload:EchoHub.Core.DTOs.JoinChannelResult.History fullName: EchoHub.Core.DTOs.JoinChannelResult.History nameWithType: JoinChannelResult.History +- uid: EchoHub.Core.DTOs.JoinChannelResult.PasswordRequired + name: PasswordRequired + href: api/core/EchoHub.Core.DTOs.JoinChannelResult.html#EchoHub_Core_DTOs_JoinChannelResult_PasswordRequired + commentId: P:EchoHub.Core.DTOs.JoinChannelResult.PasswordRequired + fullName: EchoHub.Core.DTOs.JoinChannelResult.PasswordRequired + nameWithType: JoinChannelResult.PasswordRequired +- uid: EchoHub.Core.DTOs.JoinChannelResult.PasswordRequired* + name: PasswordRequired + href: api/core/EchoHub.Core.DTOs.JoinChannelResult.html#EchoHub_Core_DTOs_JoinChannelResult_PasswordRequired_ + commentId: Overload:EchoHub.Core.DTOs.JoinChannelResult.PasswordRequired + fullName: EchoHub.Core.DTOs.JoinChannelResult.PasswordRequired + nameWithType: JoinChannelResult.PasswordRequired - uid: EchoHub.Core.DTOs.JoinChannelResult.PrintMembers(System.Text.StringBuilder) name: PrintMembers(StringBuilder) href: api/core/EchoHub.Core.DTOs.JoinChannelResult.html#EchoHub_Core_DTOs_JoinChannelResult_PrintMembers_System_Text_StringBuilder_ @@ -9271,6 +10747,18 @@ references: commentId: Overload:EchoHub.Core.DTOs.JoinChannelResult.ToString fullName: EchoHub.Core.DTOs.JoinChannelResult.ToString nameWithType: JoinChannelResult.ToString +- uid: EchoHub.Core.DTOs.JoinChannelResult.WrappedRoomKey + name: WrappedRoomKey + href: api/core/EchoHub.Core.DTOs.JoinChannelResult.html#EchoHub_Core_DTOs_JoinChannelResult_WrappedRoomKey + commentId: P:EchoHub.Core.DTOs.JoinChannelResult.WrappedRoomKey + fullName: EchoHub.Core.DTOs.JoinChannelResult.WrappedRoomKey + nameWithType: JoinChannelResult.WrappedRoomKey +- uid: EchoHub.Core.DTOs.JoinChannelResult.WrappedRoomKey* + name: WrappedRoomKey + href: api/core/EchoHub.Core.DTOs.JoinChannelResult.html#EchoHub_Core_DTOs_JoinChannelResult_WrappedRoomKey_ + commentId: Overload:EchoHub.Core.DTOs.JoinChannelResult.WrappedRoomKey + fullName: EchoHub.Core.DTOs.JoinChannelResult.WrappedRoomKey + nameWithType: JoinChannelResult.WrappedRoomKey - uid: EchoHub.Core.DTOs.JoinChannelResult.op_Equality(EchoHub.Core.DTOs.JoinChannelResult,EchoHub.Core.DTOs.JoinChannelResult) name: operator ==(JoinChannelResult?, JoinChannelResult?) href: api/core/EchoHub.Core.DTOs.JoinChannelResult.html#EchoHub_Core_DTOs_JoinChannelResult_op_Equality_EchoHub_Core_DTOs_JoinChannelResult_EchoHub_Core_DTOs_JoinChannelResult_ @@ -9898,15 +11386,15 @@ references: fullName.vb: EchoHub.Core.DTOs.MessageDto.New(EchoHub.Core.DTOs.MessageDto) nameWithType: MessageDto.MessageDto(MessageDto) nameWithType.vb: MessageDto.New(MessageDto) -- uid: EchoHub.Core.DTOs.MessageDto.#ctor(System.Guid,System.String,System.String,System.String,System.String,EchoHub.Core.Models.MessageType,System.String,System.String,System.DateTimeOffset,System.Nullable{System.Int64},System.Collections.Generic.List{EchoHub.Core.DTOs.EmbedDto}) - name: MessageDto(Guid, string, string, string?, string, MessageType, string?, string?, DateTimeOffset, long?, List?) - href: api/core/EchoHub.Core.DTOs.MessageDto.html#EchoHub_Core_DTOs_MessageDto__ctor_System_Guid_System_String_System_String_System_String_System_String_EchoHub_Core_Models_MessageType_System_String_System_String_System_DateTimeOffset_System_Nullable_System_Int64__System_Collections_Generic_List_EchoHub_Core_DTOs_EmbedDto__ - commentId: M:EchoHub.Core.DTOs.MessageDto.#ctor(System.Guid,System.String,System.String,System.String,System.String,EchoHub.Core.Models.MessageType,System.String,System.String,System.DateTimeOffset,System.Nullable{System.Int64},System.Collections.Generic.List{EchoHub.Core.DTOs.EmbedDto}) - name.vb: New(Guid, String, String, String, String, MessageType, String, String, DateTimeOffset, Long?, List(Of EmbedDto)) - fullName: EchoHub.Core.DTOs.MessageDto.MessageDto(System.Guid, string, string, string?, string, EchoHub.Core.Models.MessageType, string?, string?, System.DateTimeOffset, long?, System.Collections.Generic.List?) - fullName.vb: EchoHub.Core.DTOs.MessageDto.New(System.Guid, String, String, String, String, EchoHub.Core.Models.MessageType, String, String, System.DateTimeOffset, Long?, System.Collections.Generic.List(Of EchoHub.Core.DTOs.EmbedDto)) - nameWithType: MessageDto.MessageDto(Guid, string, string, string?, string, MessageType, string?, string?, DateTimeOffset, long?, List?) - nameWithType.vb: MessageDto.New(Guid, String, String, String, String, MessageType, String, String, DateTimeOffset, Long?, List(Of EmbedDto)) +- uid: EchoHub.Core.DTOs.MessageDto.#ctor(System.Guid,System.String,System.String,System.String,System.String,System.DateTimeOffset,System.Collections.Generic.List{EchoHub.Core.DTOs.AttachmentDto},System.Collections.Generic.List{EchoHub.Core.DTOs.EmbedDto}) + name: MessageDto(Guid, string, string, string?, string, DateTimeOffset, List?, List?) + href: api/core/EchoHub.Core.DTOs.MessageDto.html#EchoHub_Core_DTOs_MessageDto__ctor_System_Guid_System_String_System_String_System_String_System_String_System_DateTimeOffset_System_Collections_Generic_List_EchoHub_Core_DTOs_AttachmentDto__System_Collections_Generic_List_EchoHub_Core_DTOs_EmbedDto__ + commentId: M:EchoHub.Core.DTOs.MessageDto.#ctor(System.Guid,System.String,System.String,System.String,System.String,System.DateTimeOffset,System.Collections.Generic.List{EchoHub.Core.DTOs.AttachmentDto},System.Collections.Generic.List{EchoHub.Core.DTOs.EmbedDto}) + name.vb: New(Guid, String, String, String, String, DateTimeOffset, List(Of AttachmentDto), List(Of EmbedDto)) + fullName: EchoHub.Core.DTOs.MessageDto.MessageDto(System.Guid, string, string, string?, string, System.DateTimeOffset, System.Collections.Generic.List?, System.Collections.Generic.List?) + fullName.vb: EchoHub.Core.DTOs.MessageDto.New(System.Guid, String, String, String, String, System.DateTimeOffset, System.Collections.Generic.List(Of EchoHub.Core.DTOs.AttachmentDto), System.Collections.Generic.List(Of EchoHub.Core.DTOs.EmbedDto)) + nameWithType: MessageDto.MessageDto(Guid, string, string, string?, string, DateTimeOffset, List?, List?) + nameWithType.vb: MessageDto.New(Guid, String, String, String, String, DateTimeOffset, List(Of AttachmentDto), List(Of EmbedDto)) - uid: EchoHub.Core.DTOs.MessageDto.#ctor* name: MessageDto href: api/core/EchoHub.Core.DTOs.MessageDto.html#EchoHub_Core_DTOs_MessageDto__ctor_ @@ -9916,42 +11404,18 @@ references: fullName.vb: EchoHub.Core.DTOs.MessageDto.New nameWithType: MessageDto.MessageDto nameWithType.vb: MessageDto.New -- uid: EchoHub.Core.DTOs.MessageDto.AttachmentFileName - name: AttachmentFileName - href: api/core/EchoHub.Core.DTOs.MessageDto.html#EchoHub_Core_DTOs_MessageDto_AttachmentFileName - commentId: P:EchoHub.Core.DTOs.MessageDto.AttachmentFileName - fullName: EchoHub.Core.DTOs.MessageDto.AttachmentFileName - nameWithType: MessageDto.AttachmentFileName -- uid: EchoHub.Core.DTOs.MessageDto.AttachmentFileName* - name: AttachmentFileName - href: api/core/EchoHub.Core.DTOs.MessageDto.html#EchoHub_Core_DTOs_MessageDto_AttachmentFileName_ - commentId: Overload:EchoHub.Core.DTOs.MessageDto.AttachmentFileName - fullName: EchoHub.Core.DTOs.MessageDto.AttachmentFileName - nameWithType: MessageDto.AttachmentFileName -- uid: EchoHub.Core.DTOs.MessageDto.AttachmentFileSize - name: AttachmentFileSize - href: api/core/EchoHub.Core.DTOs.MessageDto.html#EchoHub_Core_DTOs_MessageDto_AttachmentFileSize - commentId: P:EchoHub.Core.DTOs.MessageDto.AttachmentFileSize - fullName: EchoHub.Core.DTOs.MessageDto.AttachmentFileSize - nameWithType: MessageDto.AttachmentFileSize -- uid: EchoHub.Core.DTOs.MessageDto.AttachmentFileSize* - name: AttachmentFileSize - href: api/core/EchoHub.Core.DTOs.MessageDto.html#EchoHub_Core_DTOs_MessageDto_AttachmentFileSize_ - commentId: Overload:EchoHub.Core.DTOs.MessageDto.AttachmentFileSize - fullName: EchoHub.Core.DTOs.MessageDto.AttachmentFileSize - nameWithType: MessageDto.AttachmentFileSize -- uid: EchoHub.Core.DTOs.MessageDto.AttachmentUrl - name: AttachmentUrl - href: api/core/EchoHub.Core.DTOs.MessageDto.html#EchoHub_Core_DTOs_MessageDto_AttachmentUrl - commentId: P:EchoHub.Core.DTOs.MessageDto.AttachmentUrl - fullName: EchoHub.Core.DTOs.MessageDto.AttachmentUrl - nameWithType: MessageDto.AttachmentUrl -- uid: EchoHub.Core.DTOs.MessageDto.AttachmentUrl* - name: AttachmentUrl - href: api/core/EchoHub.Core.DTOs.MessageDto.html#EchoHub_Core_DTOs_MessageDto_AttachmentUrl_ - commentId: Overload:EchoHub.Core.DTOs.MessageDto.AttachmentUrl - fullName: EchoHub.Core.DTOs.MessageDto.AttachmentUrl - nameWithType: MessageDto.AttachmentUrl +- uid: EchoHub.Core.DTOs.MessageDto.Attachments + name: Attachments + href: api/core/EchoHub.Core.DTOs.MessageDto.html#EchoHub_Core_DTOs_MessageDto_Attachments + commentId: P:EchoHub.Core.DTOs.MessageDto.Attachments + fullName: EchoHub.Core.DTOs.MessageDto.Attachments + nameWithType: MessageDto.Attachments +- uid: EchoHub.Core.DTOs.MessageDto.Attachments* + name: Attachments + href: api/core/EchoHub.Core.DTOs.MessageDto.html#EchoHub_Core_DTOs_MessageDto_Attachments_ + commentId: Overload:EchoHub.Core.DTOs.MessageDto.Attachments + fullName: EchoHub.Core.DTOs.MessageDto.Attachments + nameWithType: MessageDto.Attachments - uid: EchoHub.Core.DTOs.MessageDto.ChannelName name: ChannelName href: api/core/EchoHub.Core.DTOs.MessageDto.html#EchoHub_Core_DTOs_MessageDto_ChannelName @@ -9976,15 +11440,15 @@ references: commentId: Overload:EchoHub.Core.DTOs.MessageDto.Content fullName: EchoHub.Core.DTOs.MessageDto.Content nameWithType: MessageDto.Content -- uid: EchoHub.Core.DTOs.MessageDto.Deconstruct(System.Guid@,System.String@,System.String@,System.String@,System.String@,EchoHub.Core.Models.MessageType@,System.String@,System.String@,System.DateTimeOffset@,System.Nullable{System.Int64}@,System.Collections.Generic.List{EchoHub.Core.DTOs.EmbedDto}@) - name: Deconstruct(out Guid, out string, out string, out string?, out string, out MessageType, out string?, out string?, out DateTimeOffset, out long?, out List?) - href: api/core/EchoHub.Core.DTOs.MessageDto.html#EchoHub_Core_DTOs_MessageDto_Deconstruct_System_Guid__System_String__System_String__System_String__System_String__EchoHub_Core_Models_MessageType__System_String__System_String__System_DateTimeOffset__System_Nullable_System_Int64___System_Collections_Generic_List_EchoHub_Core_DTOs_EmbedDto___ - commentId: M:EchoHub.Core.DTOs.MessageDto.Deconstruct(System.Guid@,System.String@,System.String@,System.String@,System.String@,EchoHub.Core.Models.MessageType@,System.String@,System.String@,System.DateTimeOffset@,System.Nullable{System.Int64}@,System.Collections.Generic.List{EchoHub.Core.DTOs.EmbedDto}@) - name.vb: Deconstruct(Guid, String, String, String, String, MessageType, String, String, DateTimeOffset, Long?, List(Of EmbedDto)) - fullName: EchoHub.Core.DTOs.MessageDto.Deconstruct(out System.Guid, out string, out string, out string?, out string, out EchoHub.Core.Models.MessageType, out string?, out string?, out System.DateTimeOffset, out long?, out System.Collections.Generic.List?) - fullName.vb: EchoHub.Core.DTOs.MessageDto.Deconstruct(System.Guid, String, String, String, String, EchoHub.Core.Models.MessageType, String, String, System.DateTimeOffset, Long?, System.Collections.Generic.List(Of EchoHub.Core.DTOs.EmbedDto)) - nameWithType: MessageDto.Deconstruct(out Guid, out string, out string, out string?, out string, out MessageType, out string?, out string?, out DateTimeOffset, out long?, out List?) - nameWithType.vb: MessageDto.Deconstruct(Guid, String, String, String, String, MessageType, String, String, DateTimeOffset, Long?, List(Of EmbedDto)) +- uid: EchoHub.Core.DTOs.MessageDto.Deconstruct(System.Guid@,System.String@,System.String@,System.String@,System.String@,System.DateTimeOffset@,System.Collections.Generic.List{EchoHub.Core.DTOs.AttachmentDto}@,System.Collections.Generic.List{EchoHub.Core.DTOs.EmbedDto}@) + name: Deconstruct(out Guid, out string, out string, out string?, out string, out DateTimeOffset, out List?, out List?) + href: api/core/EchoHub.Core.DTOs.MessageDto.html#EchoHub_Core_DTOs_MessageDto_Deconstruct_System_Guid__System_String__System_String__System_String__System_String__System_DateTimeOffset__System_Collections_Generic_List_EchoHub_Core_DTOs_AttachmentDto___System_Collections_Generic_List_EchoHub_Core_DTOs_EmbedDto___ + commentId: M:EchoHub.Core.DTOs.MessageDto.Deconstruct(System.Guid@,System.String@,System.String@,System.String@,System.String@,System.DateTimeOffset@,System.Collections.Generic.List{EchoHub.Core.DTOs.AttachmentDto}@,System.Collections.Generic.List{EchoHub.Core.DTOs.EmbedDto}@) + name.vb: Deconstruct(Guid, String, String, String, String, DateTimeOffset, List(Of AttachmentDto), List(Of EmbedDto)) + fullName: EchoHub.Core.DTOs.MessageDto.Deconstruct(out System.Guid, out string, out string, out string?, out string, out System.DateTimeOffset, out System.Collections.Generic.List?, out System.Collections.Generic.List?) + fullName.vb: EchoHub.Core.DTOs.MessageDto.Deconstruct(System.Guid, String, String, String, String, System.DateTimeOffset, System.Collections.Generic.List(Of EchoHub.Core.DTOs.AttachmentDto), System.Collections.Generic.List(Of EchoHub.Core.DTOs.EmbedDto)) + nameWithType: MessageDto.Deconstruct(out Guid, out string, out string, out string?, out string, out DateTimeOffset, out List?, out List?) + nameWithType.vb: MessageDto.Deconstruct(Guid, String, String, String, String, DateTimeOffset, List(Of AttachmentDto), List(Of EmbedDto)) - uid: EchoHub.Core.DTOs.MessageDto.Deconstruct* name: Deconstruct href: api/core/EchoHub.Core.DTOs.MessageDto.html#EchoHub_Core_DTOs_MessageDto_Deconstruct_ @@ -10123,18 +11587,6 @@ references: commentId: Overload:EchoHub.Core.DTOs.MessageDto.ToString fullName: EchoHub.Core.DTOs.MessageDto.ToString nameWithType: MessageDto.ToString -- uid: EchoHub.Core.DTOs.MessageDto.Type - name: Type - href: api/core/EchoHub.Core.DTOs.MessageDto.html#EchoHub_Core_DTOs_MessageDto_Type - commentId: P:EchoHub.Core.DTOs.MessageDto.Type - fullName: EchoHub.Core.DTOs.MessageDto.Type - nameWithType: MessageDto.Type -- uid: EchoHub.Core.DTOs.MessageDto.Type* - name: Type - href: api/core/EchoHub.Core.DTOs.MessageDto.html#EchoHub_Core_DTOs_MessageDto_Type_ - commentId: Overload:EchoHub.Core.DTOs.MessageDto.Type - fullName: EchoHub.Core.DTOs.MessageDto.Type - nameWithType: MessageDto.Type - uid: EchoHub.Core.DTOs.MessageDto.op_Equality(EchoHub.Core.DTOs.MessageDto,EchoHub.Core.DTOs.MessageDto) name: operator ==(MessageDto?, MessageDto?) href: api/core/EchoHub.Core.DTOs.MessageDto.html#EchoHub_Core_DTOs_MessageDto_op_Equality_EchoHub_Core_DTOs_MessageDto_EchoHub_Core_DTOs_MessageDto_ @@ -10954,6 +12406,210 @@ references: fullName.vb: EchoHub.Core.DTOs.RegisterRequest.<> nameWithType: RegisterRequest.operator != nameWithType.vb: RegisterRequest.<> +- uid: EchoHub.Core.DTOs.RekeyChannelRequest + name: RekeyChannelRequest + href: api/core/EchoHub.Core.DTOs.RekeyChannelRequest.html + commentId: T:EchoHub.Core.DTOs.RekeyChannelRequest + fullName: EchoHub.Core.DTOs.RekeyChannelRequest + nameWithType: RekeyChannelRequest +- uid: EchoHub.Core.DTOs.RekeyChannelRequest.#ctor(EchoHub.Core.DTOs.RekeyChannelRequest) + name: RekeyChannelRequest(RekeyChannelRequest) + href: api/core/EchoHub.Core.DTOs.RekeyChannelRequest.html#EchoHub_Core_DTOs_RekeyChannelRequest__ctor_EchoHub_Core_DTOs_RekeyChannelRequest_ + commentId: M:EchoHub.Core.DTOs.RekeyChannelRequest.#ctor(EchoHub.Core.DTOs.RekeyChannelRequest) + name.vb: New(RekeyChannelRequest) + fullName: EchoHub.Core.DTOs.RekeyChannelRequest.RekeyChannelRequest(EchoHub.Core.DTOs.RekeyChannelRequest) + fullName.vb: EchoHub.Core.DTOs.RekeyChannelRequest.New(EchoHub.Core.DTOs.RekeyChannelRequest) + nameWithType: RekeyChannelRequest.RekeyChannelRequest(RekeyChannelRequest) + nameWithType.vb: RekeyChannelRequest.New(RekeyChannelRequest) +- uid: EchoHub.Core.DTOs.RekeyChannelRequest.#ctor(System.String,System.String,System.String,System.String) + name: RekeyChannelRequest(string, string, string, string) + href: api/core/EchoHub.Core.DTOs.RekeyChannelRequest.html#EchoHub_Core_DTOs_RekeyChannelRequest__ctor_System_String_System_String_System_String_System_String_ + commentId: M:EchoHub.Core.DTOs.RekeyChannelRequest.#ctor(System.String,System.String,System.String,System.String) + name.vb: New(String, String, String, String) + fullName: EchoHub.Core.DTOs.RekeyChannelRequest.RekeyChannelRequest(string, string, string, string) + fullName.vb: EchoHub.Core.DTOs.RekeyChannelRequest.New(String, String, String, String) + nameWithType: RekeyChannelRequest.RekeyChannelRequest(string, string, string, string) + nameWithType.vb: RekeyChannelRequest.New(String, String, String, String) +- uid: EchoHub.Core.DTOs.RekeyChannelRequest.#ctor* + name: RekeyChannelRequest + href: api/core/EchoHub.Core.DTOs.RekeyChannelRequest.html#EchoHub_Core_DTOs_RekeyChannelRequest__ctor_ + commentId: Overload:EchoHub.Core.DTOs.RekeyChannelRequest.#ctor + name.vb: New + fullName: EchoHub.Core.DTOs.RekeyChannelRequest.RekeyChannelRequest + fullName.vb: EchoHub.Core.DTOs.RekeyChannelRequest.New + nameWithType: RekeyChannelRequest.RekeyChannelRequest + nameWithType.vb: RekeyChannelRequest.New +- uid: EchoHub.Core.DTOs.RekeyChannelRequest.Deconstruct(System.String@,System.String@,System.String@,System.String@) + name: Deconstruct(out string, out string, out string, out string) + href: api/core/EchoHub.Core.DTOs.RekeyChannelRequest.html#EchoHub_Core_DTOs_RekeyChannelRequest_Deconstruct_System_String__System_String__System_String__System_String__ + commentId: M:EchoHub.Core.DTOs.RekeyChannelRequest.Deconstruct(System.String@,System.String@,System.String@,System.String@) + name.vb: Deconstruct(String, String, String, String) + fullName: EchoHub.Core.DTOs.RekeyChannelRequest.Deconstruct(out string, out string, out string, out string) + fullName.vb: EchoHub.Core.DTOs.RekeyChannelRequest.Deconstruct(String, String, String, String) + nameWithType: RekeyChannelRequest.Deconstruct(out string, out string, out string, out string) + nameWithType.vb: RekeyChannelRequest.Deconstruct(String, String, String, String) +- uid: EchoHub.Core.DTOs.RekeyChannelRequest.Deconstruct* + name: Deconstruct + href: api/core/EchoHub.Core.DTOs.RekeyChannelRequest.html#EchoHub_Core_DTOs_RekeyChannelRequest_Deconstruct_ + commentId: Overload:EchoHub.Core.DTOs.RekeyChannelRequest.Deconstruct + fullName: EchoHub.Core.DTOs.RekeyChannelRequest.Deconstruct + nameWithType: RekeyChannelRequest.Deconstruct +- uid: EchoHub.Core.DTOs.RekeyChannelRequest.EqualityContract + name: EqualityContract + href: api/core/EchoHub.Core.DTOs.RekeyChannelRequest.html#EchoHub_Core_DTOs_RekeyChannelRequest_EqualityContract + commentId: P:EchoHub.Core.DTOs.RekeyChannelRequest.EqualityContract + fullName: EchoHub.Core.DTOs.RekeyChannelRequest.EqualityContract + nameWithType: RekeyChannelRequest.EqualityContract +- uid: EchoHub.Core.DTOs.RekeyChannelRequest.EqualityContract* + name: EqualityContract + href: api/core/EchoHub.Core.DTOs.RekeyChannelRequest.html#EchoHub_Core_DTOs_RekeyChannelRequest_EqualityContract_ + commentId: Overload:EchoHub.Core.DTOs.RekeyChannelRequest.EqualityContract + fullName: EchoHub.Core.DTOs.RekeyChannelRequest.EqualityContract + nameWithType: RekeyChannelRequest.EqualityContract +- uid: EchoHub.Core.DTOs.RekeyChannelRequest.Equals(EchoHub.Core.DTOs.RekeyChannelRequest) + name: Equals(RekeyChannelRequest?) + href: api/core/EchoHub.Core.DTOs.RekeyChannelRequest.html#EchoHub_Core_DTOs_RekeyChannelRequest_Equals_EchoHub_Core_DTOs_RekeyChannelRequest_ + commentId: M:EchoHub.Core.DTOs.RekeyChannelRequest.Equals(EchoHub.Core.DTOs.RekeyChannelRequest) + name.vb: Equals(RekeyChannelRequest) + fullName: EchoHub.Core.DTOs.RekeyChannelRequest.Equals(EchoHub.Core.DTOs.RekeyChannelRequest?) + fullName.vb: EchoHub.Core.DTOs.RekeyChannelRequest.Equals(EchoHub.Core.DTOs.RekeyChannelRequest) + nameWithType: RekeyChannelRequest.Equals(RekeyChannelRequest?) + nameWithType.vb: RekeyChannelRequest.Equals(RekeyChannelRequest) +- uid: EchoHub.Core.DTOs.RekeyChannelRequest.Equals(System.Object) + name: Equals(object?) + href: api/core/EchoHub.Core.DTOs.RekeyChannelRequest.html#EchoHub_Core_DTOs_RekeyChannelRequest_Equals_System_Object_ + commentId: M:EchoHub.Core.DTOs.RekeyChannelRequest.Equals(System.Object) + name.vb: Equals(Object) + fullName: EchoHub.Core.DTOs.RekeyChannelRequest.Equals(object?) + fullName.vb: EchoHub.Core.DTOs.RekeyChannelRequest.Equals(Object) + nameWithType: RekeyChannelRequest.Equals(object?) + nameWithType.vb: RekeyChannelRequest.Equals(Object) +- uid: EchoHub.Core.DTOs.RekeyChannelRequest.Equals* + name: Equals + href: api/core/EchoHub.Core.DTOs.RekeyChannelRequest.html#EchoHub_Core_DTOs_RekeyChannelRequest_Equals_ + commentId: Overload:EchoHub.Core.DTOs.RekeyChannelRequest.Equals + fullName: EchoHub.Core.DTOs.RekeyChannelRequest.Equals + nameWithType: RekeyChannelRequest.Equals +- uid: EchoHub.Core.DTOs.RekeyChannelRequest.GetHashCode + name: GetHashCode() + href: api/core/EchoHub.Core.DTOs.RekeyChannelRequest.html#EchoHub_Core_DTOs_RekeyChannelRequest_GetHashCode + commentId: M:EchoHub.Core.DTOs.RekeyChannelRequest.GetHashCode + fullName: EchoHub.Core.DTOs.RekeyChannelRequest.GetHashCode() + nameWithType: RekeyChannelRequest.GetHashCode() +- uid: EchoHub.Core.DTOs.RekeyChannelRequest.GetHashCode* + name: GetHashCode + href: api/core/EchoHub.Core.DTOs.RekeyChannelRequest.html#EchoHub_Core_DTOs_RekeyChannelRequest_GetHashCode_ + commentId: Overload:EchoHub.Core.DTOs.RekeyChannelRequest.GetHashCode + fullName: EchoHub.Core.DTOs.RekeyChannelRequest.GetHashCode + nameWithType: RekeyChannelRequest.GetHashCode +- uid: EchoHub.Core.DTOs.RekeyChannelRequest.NewEncryptionSalt + name: NewEncryptionSalt + href: api/core/EchoHub.Core.DTOs.RekeyChannelRequest.html#EchoHub_Core_DTOs_RekeyChannelRequest_NewEncryptionSalt + commentId: P:EchoHub.Core.DTOs.RekeyChannelRequest.NewEncryptionSalt + fullName: EchoHub.Core.DTOs.RekeyChannelRequest.NewEncryptionSalt + nameWithType: RekeyChannelRequest.NewEncryptionSalt +- uid: EchoHub.Core.DTOs.RekeyChannelRequest.NewEncryptionSalt* + name: NewEncryptionSalt + href: api/core/EchoHub.Core.DTOs.RekeyChannelRequest.html#EchoHub_Core_DTOs_RekeyChannelRequest_NewEncryptionSalt_ + commentId: Overload:EchoHub.Core.DTOs.RekeyChannelRequest.NewEncryptionSalt + fullName: EchoHub.Core.DTOs.RekeyChannelRequest.NewEncryptionSalt + nameWithType: RekeyChannelRequest.NewEncryptionSalt +- uid: EchoHub.Core.DTOs.RekeyChannelRequest.NewPassword + name: NewPassword + href: api/core/EchoHub.Core.DTOs.RekeyChannelRequest.html#EchoHub_Core_DTOs_RekeyChannelRequest_NewPassword + commentId: P:EchoHub.Core.DTOs.RekeyChannelRequest.NewPassword + fullName: EchoHub.Core.DTOs.RekeyChannelRequest.NewPassword + nameWithType: RekeyChannelRequest.NewPassword +- uid: EchoHub.Core.DTOs.RekeyChannelRequest.NewPassword* + name: NewPassword + href: api/core/EchoHub.Core.DTOs.RekeyChannelRequest.html#EchoHub_Core_DTOs_RekeyChannelRequest_NewPassword_ + commentId: Overload:EchoHub.Core.DTOs.RekeyChannelRequest.NewPassword + fullName: EchoHub.Core.DTOs.RekeyChannelRequest.NewPassword + nameWithType: RekeyChannelRequest.NewPassword +- uid: EchoHub.Core.DTOs.RekeyChannelRequest.NewWrappedRoomKey + name: NewWrappedRoomKey + href: api/core/EchoHub.Core.DTOs.RekeyChannelRequest.html#EchoHub_Core_DTOs_RekeyChannelRequest_NewWrappedRoomKey + commentId: P:EchoHub.Core.DTOs.RekeyChannelRequest.NewWrappedRoomKey + fullName: EchoHub.Core.DTOs.RekeyChannelRequest.NewWrappedRoomKey + nameWithType: RekeyChannelRequest.NewWrappedRoomKey +- uid: EchoHub.Core.DTOs.RekeyChannelRequest.NewWrappedRoomKey* + name: NewWrappedRoomKey + href: api/core/EchoHub.Core.DTOs.RekeyChannelRequest.html#EchoHub_Core_DTOs_RekeyChannelRequest_NewWrappedRoomKey_ + commentId: Overload:EchoHub.Core.DTOs.RekeyChannelRequest.NewWrappedRoomKey + fullName: EchoHub.Core.DTOs.RekeyChannelRequest.NewWrappedRoomKey + nameWithType: RekeyChannelRequest.NewWrappedRoomKey +- uid: EchoHub.Core.DTOs.RekeyChannelRequest.OldPassword + name: OldPassword + href: api/core/EchoHub.Core.DTOs.RekeyChannelRequest.html#EchoHub_Core_DTOs_RekeyChannelRequest_OldPassword + commentId: P:EchoHub.Core.DTOs.RekeyChannelRequest.OldPassword + fullName: EchoHub.Core.DTOs.RekeyChannelRequest.OldPassword + nameWithType: RekeyChannelRequest.OldPassword +- uid: EchoHub.Core.DTOs.RekeyChannelRequest.OldPassword* + name: OldPassword + href: api/core/EchoHub.Core.DTOs.RekeyChannelRequest.html#EchoHub_Core_DTOs_RekeyChannelRequest_OldPassword_ + commentId: Overload:EchoHub.Core.DTOs.RekeyChannelRequest.OldPassword + fullName: EchoHub.Core.DTOs.RekeyChannelRequest.OldPassword + nameWithType: RekeyChannelRequest.OldPassword +- uid: EchoHub.Core.DTOs.RekeyChannelRequest.PrintMembers(System.Text.StringBuilder) + name: PrintMembers(StringBuilder) + href: api/core/EchoHub.Core.DTOs.RekeyChannelRequest.html#EchoHub_Core_DTOs_RekeyChannelRequest_PrintMembers_System_Text_StringBuilder_ + commentId: M:EchoHub.Core.DTOs.RekeyChannelRequest.PrintMembers(System.Text.StringBuilder) + fullName: EchoHub.Core.DTOs.RekeyChannelRequest.PrintMembers(System.Text.StringBuilder) + nameWithType: RekeyChannelRequest.PrintMembers(StringBuilder) +- uid: EchoHub.Core.DTOs.RekeyChannelRequest.PrintMembers* + name: PrintMembers + href: api/core/EchoHub.Core.DTOs.RekeyChannelRequest.html#EchoHub_Core_DTOs_RekeyChannelRequest_PrintMembers_ + commentId: Overload:EchoHub.Core.DTOs.RekeyChannelRequest.PrintMembers + fullName: EchoHub.Core.DTOs.RekeyChannelRequest.PrintMembers + nameWithType: RekeyChannelRequest.PrintMembers +- uid: EchoHub.Core.DTOs.RekeyChannelRequest.ToString + name: ToString() + href: api/core/EchoHub.Core.DTOs.RekeyChannelRequest.html#EchoHub_Core_DTOs_RekeyChannelRequest_ToString + commentId: M:EchoHub.Core.DTOs.RekeyChannelRequest.ToString + fullName: EchoHub.Core.DTOs.RekeyChannelRequest.ToString() + nameWithType: RekeyChannelRequest.ToString() +- uid: EchoHub.Core.DTOs.RekeyChannelRequest.ToString* + name: ToString + href: api/core/EchoHub.Core.DTOs.RekeyChannelRequest.html#EchoHub_Core_DTOs_RekeyChannelRequest_ToString_ + commentId: Overload:EchoHub.Core.DTOs.RekeyChannelRequest.ToString + fullName: EchoHub.Core.DTOs.RekeyChannelRequest.ToString + nameWithType: RekeyChannelRequest.ToString +- uid: EchoHub.Core.DTOs.RekeyChannelRequest.op_Equality(EchoHub.Core.DTOs.RekeyChannelRequest,EchoHub.Core.DTOs.RekeyChannelRequest) + name: operator ==(RekeyChannelRequest?, RekeyChannelRequest?) + href: api/core/EchoHub.Core.DTOs.RekeyChannelRequest.html#EchoHub_Core_DTOs_RekeyChannelRequest_op_Equality_EchoHub_Core_DTOs_RekeyChannelRequest_EchoHub_Core_DTOs_RekeyChannelRequest_ + commentId: M:EchoHub.Core.DTOs.RekeyChannelRequest.op_Equality(EchoHub.Core.DTOs.RekeyChannelRequest,EchoHub.Core.DTOs.RekeyChannelRequest) + name.vb: =(RekeyChannelRequest, RekeyChannelRequest) + fullName: EchoHub.Core.DTOs.RekeyChannelRequest.operator ==(EchoHub.Core.DTOs.RekeyChannelRequest?, EchoHub.Core.DTOs.RekeyChannelRequest?) + fullName.vb: EchoHub.Core.DTOs.RekeyChannelRequest.=(EchoHub.Core.DTOs.RekeyChannelRequest, EchoHub.Core.DTOs.RekeyChannelRequest) + nameWithType: RekeyChannelRequest.operator ==(RekeyChannelRequest?, RekeyChannelRequest?) + nameWithType.vb: RekeyChannelRequest.=(RekeyChannelRequest, RekeyChannelRequest) +- uid: EchoHub.Core.DTOs.RekeyChannelRequest.op_Equality* + name: operator == + href: api/core/EchoHub.Core.DTOs.RekeyChannelRequest.html#EchoHub_Core_DTOs_RekeyChannelRequest_op_Equality_ + commentId: Overload:EchoHub.Core.DTOs.RekeyChannelRequest.op_Equality + name.vb: = + fullName: EchoHub.Core.DTOs.RekeyChannelRequest.operator == + fullName.vb: EchoHub.Core.DTOs.RekeyChannelRequest.= + nameWithType: RekeyChannelRequest.operator == + nameWithType.vb: RekeyChannelRequest.= +- uid: EchoHub.Core.DTOs.RekeyChannelRequest.op_Inequality(EchoHub.Core.DTOs.RekeyChannelRequest,EchoHub.Core.DTOs.RekeyChannelRequest) + name: operator !=(RekeyChannelRequest?, RekeyChannelRequest?) + href: api/core/EchoHub.Core.DTOs.RekeyChannelRequest.html#EchoHub_Core_DTOs_RekeyChannelRequest_op_Inequality_EchoHub_Core_DTOs_RekeyChannelRequest_EchoHub_Core_DTOs_RekeyChannelRequest_ + commentId: M:EchoHub.Core.DTOs.RekeyChannelRequest.op_Inequality(EchoHub.Core.DTOs.RekeyChannelRequest,EchoHub.Core.DTOs.RekeyChannelRequest) + name.vb: <>(RekeyChannelRequest, RekeyChannelRequest) + fullName: EchoHub.Core.DTOs.RekeyChannelRequest.operator !=(EchoHub.Core.DTOs.RekeyChannelRequest?, EchoHub.Core.DTOs.RekeyChannelRequest?) + fullName.vb: EchoHub.Core.DTOs.RekeyChannelRequest.<>(EchoHub.Core.DTOs.RekeyChannelRequest, EchoHub.Core.DTOs.RekeyChannelRequest) + nameWithType: RekeyChannelRequest.operator !=(RekeyChannelRequest?, RekeyChannelRequest?) + nameWithType.vb: RekeyChannelRequest.<>(RekeyChannelRequest, RekeyChannelRequest) +- uid: EchoHub.Core.DTOs.RekeyChannelRequest.op_Inequality* + name: operator != + href: api/core/EchoHub.Core.DTOs.RekeyChannelRequest.html#EchoHub_Core_DTOs_RekeyChannelRequest_op_Inequality_ + commentId: Overload:EchoHub.Core.DTOs.RekeyChannelRequest.op_Inequality + name.vb: <> + fullName: EchoHub.Core.DTOs.RekeyChannelRequest.operator != + fullName.vb: EchoHub.Core.DTOs.RekeyChannelRequest.<> + nameWithType: RekeyChannelRequest.operator != + nameWithType.vb: RekeyChannelRequest.<> - uid: EchoHub.Core.DTOs.SendMessageRequest name: SendMessageRequest href: api/core/EchoHub.Core.DTOs.SendMessageRequest.html @@ -13063,6 +14719,150 @@ references: commentId: N:EchoHub.Core.Models fullName: EchoHub.Core.Models nameWithType: EchoHub.Core.Models +- uid: EchoHub.Core.Models.Attachment + name: Attachment + href: api/core/EchoHub.Core.Models.Attachment.html + commentId: T:EchoHub.Core.Models.Attachment + fullName: EchoHub.Core.Models.Attachment + nameWithType: Attachment +- uid: EchoHub.Core.Models.Attachment.#ctor + name: Attachment() + href: api/core/EchoHub.Core.Models.Attachment.html#EchoHub_Core_Models_Attachment__ctor + commentId: M:EchoHub.Core.Models.Attachment.#ctor + name.vb: New() + fullName: EchoHub.Core.Models.Attachment.Attachment() + fullName.vb: EchoHub.Core.Models.Attachment.New() + nameWithType: Attachment.Attachment() + nameWithType.vb: Attachment.New() +- uid: EchoHub.Core.Models.Attachment.#ctor* + name: Attachment + href: api/core/EchoHub.Core.Models.Attachment.html#EchoHub_Core_Models_Attachment__ctor_ + commentId: Overload:EchoHub.Core.Models.Attachment.#ctor + name.vb: New + fullName: EchoHub.Core.Models.Attachment.Attachment + fullName.vb: EchoHub.Core.Models.Attachment.New + nameWithType: Attachment.Attachment + nameWithType.vb: Attachment.New +- uid: EchoHub.Core.Models.Attachment.AsciiPreview + name: AsciiPreview + href: api/core/EchoHub.Core.Models.Attachment.html#EchoHub_Core_Models_Attachment_AsciiPreview + commentId: P:EchoHub.Core.Models.Attachment.AsciiPreview + fullName: EchoHub.Core.Models.Attachment.AsciiPreview + nameWithType: Attachment.AsciiPreview +- uid: EchoHub.Core.Models.Attachment.AsciiPreview* + name: AsciiPreview + href: api/core/EchoHub.Core.Models.Attachment.html#EchoHub_Core_Models_Attachment_AsciiPreview_ + commentId: Overload:EchoHub.Core.Models.Attachment.AsciiPreview + fullName: EchoHub.Core.Models.Attachment.AsciiPreview + nameWithType: Attachment.AsciiPreview +- uid: EchoHub.Core.Models.Attachment.FileName + name: FileName + href: api/core/EchoHub.Core.Models.Attachment.html#EchoHub_Core_Models_Attachment_FileName + commentId: P:EchoHub.Core.Models.Attachment.FileName + fullName: EchoHub.Core.Models.Attachment.FileName + nameWithType: Attachment.FileName +- uid: EchoHub.Core.Models.Attachment.FileName* + name: FileName + href: api/core/EchoHub.Core.Models.Attachment.html#EchoHub_Core_Models_Attachment_FileName_ + commentId: Overload:EchoHub.Core.Models.Attachment.FileName + fullName: EchoHub.Core.Models.Attachment.FileName + nameWithType: Attachment.FileName +- uid: EchoHub.Core.Models.Attachment.FileSize + name: FileSize + href: api/core/EchoHub.Core.Models.Attachment.html#EchoHub_Core_Models_Attachment_FileSize + commentId: P:EchoHub.Core.Models.Attachment.FileSize + fullName: EchoHub.Core.Models.Attachment.FileSize + nameWithType: Attachment.FileSize +- uid: EchoHub.Core.Models.Attachment.FileSize* + name: FileSize + href: api/core/EchoHub.Core.Models.Attachment.html#EchoHub_Core_Models_Attachment_FileSize_ + commentId: Overload:EchoHub.Core.Models.Attachment.FileSize + fullName: EchoHub.Core.Models.Attachment.FileSize + nameWithType: Attachment.FileSize +- uid: EchoHub.Core.Models.Attachment.Id + name: Id + href: api/core/EchoHub.Core.Models.Attachment.html#EchoHub_Core_Models_Attachment_Id + commentId: P:EchoHub.Core.Models.Attachment.Id + fullName: EchoHub.Core.Models.Attachment.Id + nameWithType: Attachment.Id +- uid: EchoHub.Core.Models.Attachment.Id* + name: Id + href: api/core/EchoHub.Core.Models.Attachment.html#EchoHub_Core_Models_Attachment_Id_ + commentId: Overload:EchoHub.Core.Models.Attachment.Id + fullName: EchoHub.Core.Models.Attachment.Id + nameWithType: Attachment.Id +- uid: EchoHub.Core.Models.Attachment.Kind + name: Kind + href: api/core/EchoHub.Core.Models.Attachment.html#EchoHub_Core_Models_Attachment_Kind + commentId: P:EchoHub.Core.Models.Attachment.Kind + fullName: EchoHub.Core.Models.Attachment.Kind + nameWithType: Attachment.Kind +- uid: EchoHub.Core.Models.Attachment.Kind* + name: Kind + href: api/core/EchoHub.Core.Models.Attachment.html#EchoHub_Core_Models_Attachment_Kind_ + commentId: Overload:EchoHub.Core.Models.Attachment.Kind + fullName: EchoHub.Core.Models.Attachment.Kind + nameWithType: Attachment.Kind +- uid: EchoHub.Core.Models.Attachment.Message + name: Message + href: api/core/EchoHub.Core.Models.Attachment.html#EchoHub_Core_Models_Attachment_Message + commentId: P:EchoHub.Core.Models.Attachment.Message + fullName: EchoHub.Core.Models.Attachment.Message + nameWithType: Attachment.Message +- uid: EchoHub.Core.Models.Attachment.Message* + name: Message + href: api/core/EchoHub.Core.Models.Attachment.html#EchoHub_Core_Models_Attachment_Message_ + commentId: Overload:EchoHub.Core.Models.Attachment.Message + fullName: EchoHub.Core.Models.Attachment.Message + nameWithType: Attachment.Message +- uid: EchoHub.Core.Models.Attachment.MessageId + name: MessageId + href: api/core/EchoHub.Core.Models.Attachment.html#EchoHub_Core_Models_Attachment_MessageId + commentId: P:EchoHub.Core.Models.Attachment.MessageId + fullName: EchoHub.Core.Models.Attachment.MessageId + nameWithType: Attachment.MessageId +- uid: EchoHub.Core.Models.Attachment.MessageId* + name: MessageId + href: api/core/EchoHub.Core.Models.Attachment.html#EchoHub_Core_Models_Attachment_MessageId_ + commentId: Overload:EchoHub.Core.Models.Attachment.MessageId + fullName: EchoHub.Core.Models.Attachment.MessageId + nameWithType: Attachment.MessageId +- uid: EchoHub.Core.Models.Attachment.Url + name: Url + href: api/core/EchoHub.Core.Models.Attachment.html#EchoHub_Core_Models_Attachment_Url + commentId: P:EchoHub.Core.Models.Attachment.Url + fullName: EchoHub.Core.Models.Attachment.Url + nameWithType: Attachment.Url +- uid: EchoHub.Core.Models.Attachment.Url* + name: Url + href: api/core/EchoHub.Core.Models.Attachment.html#EchoHub_Core_Models_Attachment_Url_ + commentId: Overload:EchoHub.Core.Models.Attachment.Url + fullName: EchoHub.Core.Models.Attachment.Url + nameWithType: Attachment.Url +- uid: EchoHub.Core.Models.AttachmentKind + name: AttachmentKind + href: api/core/EchoHub.Core.Models.AttachmentKind.html + commentId: T:EchoHub.Core.Models.AttachmentKind + fullName: EchoHub.Core.Models.AttachmentKind + nameWithType: AttachmentKind +- uid: EchoHub.Core.Models.AttachmentKind.Audio + name: Audio + href: api/core/EchoHub.Core.Models.AttachmentKind.html#EchoHub_Core_Models_AttachmentKind_Audio + commentId: F:EchoHub.Core.Models.AttachmentKind.Audio + fullName: EchoHub.Core.Models.AttachmentKind.Audio + nameWithType: AttachmentKind.Audio +- uid: EchoHub.Core.Models.AttachmentKind.File + name: File + href: api/core/EchoHub.Core.Models.AttachmentKind.html#EchoHub_Core_Models_AttachmentKind_File + commentId: F:EchoHub.Core.Models.AttachmentKind.File + fullName: EchoHub.Core.Models.AttachmentKind.File + nameWithType: AttachmentKind.File +- uid: EchoHub.Core.Models.AttachmentKind.Image + name: Image + href: api/core/EchoHub.Core.Models.AttachmentKind.html#EchoHub_Core_Models_AttachmentKind_Image + commentId: F:EchoHub.Core.Models.AttachmentKind.Image + fullName: EchoHub.Core.Models.AttachmentKind.Image + nameWithType: AttachmentKind.Image - uid: EchoHub.Core.Models.Channel name: Channel href: api/core/EchoHub.Core.Models.Channel.html @@ -13111,6 +14911,18 @@ references: commentId: Overload:EchoHub.Core.Models.Channel.CreatedByUserId fullName: EchoHub.Core.Models.Channel.CreatedByUserId nameWithType: Channel.CreatedByUserId +- uid: EchoHub.Core.Models.Channel.EncryptionSalt + name: EncryptionSalt + href: api/core/EchoHub.Core.Models.Channel.html#EchoHub_Core_Models_Channel_EncryptionSalt + commentId: P:EchoHub.Core.Models.Channel.EncryptionSalt + fullName: EchoHub.Core.Models.Channel.EncryptionSalt + nameWithType: Channel.EncryptionSalt +- uid: EchoHub.Core.Models.Channel.EncryptionSalt* + name: EncryptionSalt + href: api/core/EchoHub.Core.Models.Channel.html#EchoHub_Core_Models_Channel_EncryptionSalt_ + commentId: Overload:EchoHub.Core.Models.Channel.EncryptionSalt + fullName: EchoHub.Core.Models.Channel.EncryptionSalt + nameWithType: Channel.EncryptionSalt - uid: EchoHub.Core.Models.Channel.Id name: Id href: api/core/EchoHub.Core.Models.Channel.html#EchoHub_Core_Models_Channel_Id @@ -13159,6 +14971,18 @@ references: commentId: Overload:EchoHub.Core.Models.Channel.Name fullName: EchoHub.Core.Models.Channel.Name nameWithType: Channel.Name +- uid: EchoHub.Core.Models.Channel.PasswordHash + name: PasswordHash + href: api/core/EchoHub.Core.Models.Channel.html#EchoHub_Core_Models_Channel_PasswordHash + commentId: P:EchoHub.Core.Models.Channel.PasswordHash + fullName: EchoHub.Core.Models.Channel.PasswordHash + nameWithType: Channel.PasswordHash +- uid: EchoHub.Core.Models.Channel.PasswordHash* + name: PasswordHash + href: api/core/EchoHub.Core.Models.Channel.html#EchoHub_Core_Models_Channel_PasswordHash_ + commentId: Overload:EchoHub.Core.Models.Channel.PasswordHash + fullName: EchoHub.Core.Models.Channel.PasswordHash + nameWithType: Channel.PasswordHash - uid: EchoHub.Core.Models.Channel.Topic name: Topic href: api/core/EchoHub.Core.Models.Channel.html#EchoHub_Core_Models_Channel_Topic @@ -13171,6 +14995,18 @@ references: commentId: Overload:EchoHub.Core.Models.Channel.Topic fullName: EchoHub.Core.Models.Channel.Topic nameWithType: Channel.Topic +- uid: EchoHub.Core.Models.Channel.WrappedRoomKey + name: WrappedRoomKey + href: api/core/EchoHub.Core.Models.Channel.html#EchoHub_Core_Models_Channel_WrappedRoomKey + commentId: P:EchoHub.Core.Models.Channel.WrappedRoomKey + fullName: EchoHub.Core.Models.Channel.WrappedRoomKey + nameWithType: Channel.WrappedRoomKey +- uid: EchoHub.Core.Models.Channel.WrappedRoomKey* + name: WrappedRoomKey + href: api/core/EchoHub.Core.Models.Channel.html#EchoHub_Core_Models_Channel_WrappedRoomKey_ + commentId: Overload:EchoHub.Core.Models.Channel.WrappedRoomKey + fullName: EchoHub.Core.Models.Channel.WrappedRoomKey + nameWithType: Channel.WrappedRoomKey - uid: EchoHub.Core.Models.ChannelMembership name: ChannelMembership href: api/core/EchoHub.Core.Models.ChannelMembership.html @@ -13291,6 +15127,18 @@ references: commentId: Overload:EchoHub.Core.Models.Message.AttachmentUrl fullName: EchoHub.Core.Models.Message.AttachmentUrl nameWithType: Message.AttachmentUrl +- uid: EchoHub.Core.Models.Message.Attachments + name: Attachments + href: api/core/EchoHub.Core.Models.Message.html#EchoHub_Core_Models_Message_Attachments + commentId: P:EchoHub.Core.Models.Message.Attachments + fullName: EchoHub.Core.Models.Message.Attachments + nameWithType: Message.Attachments +- uid: EchoHub.Core.Models.Message.Attachments* + name: Attachments + href: api/core/EchoHub.Core.Models.Message.html#EchoHub_Core_Models_Message_Attachments_ + commentId: Overload:EchoHub.Core.Models.Message.Attachments + fullName: EchoHub.Core.Models.Message.Attachments + nameWithType: Message.Attachments - uid: EchoHub.Core.Models.Message.Channel name: Channel href: api/core/EchoHub.Core.Models.Message.html#EchoHub_Core_Models_Message_Channel @@ -13837,6 +15685,408 @@ references: commentId: F:EchoHub.Core.Models.UserStatus.Online fullName: EchoHub.Core.Models.UserStatus.Online nameWithType: UserStatus.Online +- uid: EchoHub.Core.Security + name: EchoHub.Core.Security + href: api/core/EchoHub.Core.Security.html + commentId: N:EchoHub.Core.Security + fullName: EchoHub.Core.Security + nameWithType: EchoHub.Core.Security +- uid: EchoHub.Core.Security.RoomCrypto + name: RoomCrypto + href: api/core/EchoHub.Core.Security.RoomCrypto.html + commentId: T:EchoHub.Core.Security.RoomCrypto + fullName: EchoHub.Core.Security.RoomCrypto + nameWithType: RoomCrypto +- uid: EchoHub.Core.Security.RoomCrypto.CiphertextPrefix + name: CiphertextPrefix + href: api/core/EchoHub.Core.Security.RoomCrypto.html#EchoHub_Core_Security_RoomCrypto_CiphertextPrefix + commentId: F:EchoHub.Core.Security.RoomCrypto.CiphertextPrefix + fullName: EchoHub.Core.Security.RoomCrypto.CiphertextPrefix + nameWithType: RoomCrypto.CiphertextPrefix +- uid: EchoHub.Core.Security.RoomCrypto.DecryptBytes(System.Byte[],System.Byte[]) + name: DecryptBytes(byte[], byte[]) + href: api/core/EchoHub.Core.Security.RoomCrypto.html#EchoHub_Core_Security_RoomCrypto_DecryptBytes_System_Byte___System_Byte___ + commentId: M:EchoHub.Core.Security.RoomCrypto.DecryptBytes(System.Byte[],System.Byte[]) + name.vb: DecryptBytes(Byte(), Byte()) + fullName: EchoHub.Core.Security.RoomCrypto.DecryptBytes(byte[], byte[]) + fullName.vb: EchoHub.Core.Security.RoomCrypto.DecryptBytes(Byte(), Byte()) + nameWithType: RoomCrypto.DecryptBytes(byte[], byte[]) + nameWithType.vb: RoomCrypto.DecryptBytes(Byte(), Byte()) +- uid: EchoHub.Core.Security.RoomCrypto.DecryptBytes* + name: DecryptBytes + href: api/core/EchoHub.Core.Security.RoomCrypto.html#EchoHub_Core_Security_RoomCrypto_DecryptBytes_ + commentId: Overload:EchoHub.Core.Security.RoomCrypto.DecryptBytes + fullName: EchoHub.Core.Security.RoomCrypto.DecryptBytes + nameWithType: RoomCrypto.DecryptBytes +- uid: EchoHub.Core.Security.RoomCrypto.DeriveKeys(System.String,System.Byte[]) + name: DeriveKeys(string, byte[]) + href: api/core/EchoHub.Core.Security.RoomCrypto.html#EchoHub_Core_Security_RoomCrypto_DeriveKeys_System_String_System_Byte___ + commentId: M:EchoHub.Core.Security.RoomCrypto.DeriveKeys(System.String,System.Byte[]) + name.vb: DeriveKeys(String, Byte()) + fullName: EchoHub.Core.Security.RoomCrypto.DeriveKeys(string, byte[]) + fullName.vb: EchoHub.Core.Security.RoomCrypto.DeriveKeys(String, Byte()) + nameWithType: RoomCrypto.DeriveKeys(string, byte[]) + nameWithType.vb: RoomCrypto.DeriveKeys(String, Byte()) +- uid: EchoHub.Core.Security.RoomCrypto.DeriveKeys* + name: DeriveKeys + href: api/core/EchoHub.Core.Security.RoomCrypto.html#EchoHub_Core_Security_RoomCrypto_DeriveKeys_ + commentId: Overload:EchoHub.Core.Security.RoomCrypto.DeriveKeys + fullName: EchoHub.Core.Security.RoomCrypto.DeriveKeys + nameWithType: RoomCrypto.DeriveKeys +- uid: EchoHub.Core.Security.RoomCrypto.DerivedKeys + name: RoomCrypto.DerivedKeys + href: api/core/EchoHub.Core.Security.RoomCrypto.DerivedKeys.html + commentId: T:EchoHub.Core.Security.RoomCrypto.DerivedKeys + fullName: EchoHub.Core.Security.RoomCrypto.DerivedKeys + nameWithType: RoomCrypto.DerivedKeys +- uid: EchoHub.Core.Security.RoomCrypto.DerivedKeys.#ctor(System.String,System.Byte[]) + name: DerivedKeys(string, byte[]) + href: api/core/EchoHub.Core.Security.RoomCrypto.DerivedKeys.html#EchoHub_Core_Security_RoomCrypto_DerivedKeys__ctor_System_String_System_Byte___ + commentId: M:EchoHub.Core.Security.RoomCrypto.DerivedKeys.#ctor(System.String,System.Byte[]) + name.vb: New(String, Byte()) + fullName: EchoHub.Core.Security.RoomCrypto.DerivedKeys.DerivedKeys(string, byte[]) + fullName.vb: EchoHub.Core.Security.RoomCrypto.DerivedKeys.New(String, Byte()) + nameWithType: RoomCrypto.DerivedKeys.DerivedKeys(string, byte[]) + nameWithType.vb: RoomCrypto.DerivedKeys.New(String, Byte()) +- uid: EchoHub.Core.Security.RoomCrypto.DerivedKeys.#ctor* + name: DerivedKeys + href: api/core/EchoHub.Core.Security.RoomCrypto.DerivedKeys.html#EchoHub_Core_Security_RoomCrypto_DerivedKeys__ctor_ + commentId: Overload:EchoHub.Core.Security.RoomCrypto.DerivedKeys.#ctor + name.vb: New + fullName: EchoHub.Core.Security.RoomCrypto.DerivedKeys.DerivedKeys + fullName.vb: EchoHub.Core.Security.RoomCrypto.DerivedKeys.New + nameWithType: RoomCrypto.DerivedKeys.DerivedKeys + nameWithType.vb: RoomCrypto.DerivedKeys.New +- uid: EchoHub.Core.Security.RoomCrypto.DerivedKeys.AuthKeyHex + name: AuthKeyHex + href: api/core/EchoHub.Core.Security.RoomCrypto.DerivedKeys.html#EchoHub_Core_Security_RoomCrypto_DerivedKeys_AuthKeyHex + commentId: P:EchoHub.Core.Security.RoomCrypto.DerivedKeys.AuthKeyHex + fullName: EchoHub.Core.Security.RoomCrypto.DerivedKeys.AuthKeyHex + nameWithType: RoomCrypto.DerivedKeys.AuthKeyHex +- uid: EchoHub.Core.Security.RoomCrypto.DerivedKeys.AuthKeyHex* + name: AuthKeyHex + href: api/core/EchoHub.Core.Security.RoomCrypto.DerivedKeys.html#EchoHub_Core_Security_RoomCrypto_DerivedKeys_AuthKeyHex_ + commentId: Overload:EchoHub.Core.Security.RoomCrypto.DerivedKeys.AuthKeyHex + fullName: EchoHub.Core.Security.RoomCrypto.DerivedKeys.AuthKeyHex + nameWithType: RoomCrypto.DerivedKeys.AuthKeyHex +- uid: EchoHub.Core.Security.RoomCrypto.DerivedKeys.Deconstruct(System.String@,System.Byte[]@) + name: Deconstruct(out string, out byte[]) + href: api/core/EchoHub.Core.Security.RoomCrypto.DerivedKeys.html#EchoHub_Core_Security_RoomCrypto_DerivedKeys_Deconstruct_System_String__System_Byte____ + commentId: M:EchoHub.Core.Security.RoomCrypto.DerivedKeys.Deconstruct(System.String@,System.Byte[]@) + name.vb: Deconstruct(String, Byte()) + fullName: EchoHub.Core.Security.RoomCrypto.DerivedKeys.Deconstruct(out string, out byte[]) + fullName.vb: EchoHub.Core.Security.RoomCrypto.DerivedKeys.Deconstruct(String, Byte()) + nameWithType: RoomCrypto.DerivedKeys.Deconstruct(out string, out byte[]) + nameWithType.vb: RoomCrypto.DerivedKeys.Deconstruct(String, Byte()) +- uid: EchoHub.Core.Security.RoomCrypto.DerivedKeys.Deconstruct* + name: Deconstruct + href: api/core/EchoHub.Core.Security.RoomCrypto.DerivedKeys.html#EchoHub_Core_Security_RoomCrypto_DerivedKeys_Deconstruct_ + commentId: Overload:EchoHub.Core.Security.RoomCrypto.DerivedKeys.Deconstruct + fullName: EchoHub.Core.Security.RoomCrypto.DerivedKeys.Deconstruct + nameWithType: RoomCrypto.DerivedKeys.Deconstruct +- uid: EchoHub.Core.Security.RoomCrypto.DerivedKeys.Equals(EchoHub.Core.Security.RoomCrypto.DerivedKeys) + name: Equals(DerivedKeys?) + href: api/core/EchoHub.Core.Security.RoomCrypto.DerivedKeys.html#EchoHub_Core_Security_RoomCrypto_DerivedKeys_Equals_EchoHub_Core_Security_RoomCrypto_DerivedKeys_ + commentId: M:EchoHub.Core.Security.RoomCrypto.DerivedKeys.Equals(EchoHub.Core.Security.RoomCrypto.DerivedKeys) + name.vb: Equals(DerivedKeys) + fullName: EchoHub.Core.Security.RoomCrypto.DerivedKeys.Equals(EchoHub.Core.Security.RoomCrypto.DerivedKeys?) + fullName.vb: EchoHub.Core.Security.RoomCrypto.DerivedKeys.Equals(EchoHub.Core.Security.RoomCrypto.DerivedKeys) + nameWithType: RoomCrypto.DerivedKeys.Equals(RoomCrypto.DerivedKeys?) + nameWithType.vb: RoomCrypto.DerivedKeys.Equals(RoomCrypto.DerivedKeys) +- uid: EchoHub.Core.Security.RoomCrypto.DerivedKeys.Equals(System.Object) + name: Equals(object?) + href: api/core/EchoHub.Core.Security.RoomCrypto.DerivedKeys.html#EchoHub_Core_Security_RoomCrypto_DerivedKeys_Equals_System_Object_ + commentId: M:EchoHub.Core.Security.RoomCrypto.DerivedKeys.Equals(System.Object) + name.vb: Equals(Object) + fullName: EchoHub.Core.Security.RoomCrypto.DerivedKeys.Equals(object?) + fullName.vb: EchoHub.Core.Security.RoomCrypto.DerivedKeys.Equals(Object) + nameWithType: RoomCrypto.DerivedKeys.Equals(object?) + nameWithType.vb: RoomCrypto.DerivedKeys.Equals(Object) +- uid: EchoHub.Core.Security.RoomCrypto.DerivedKeys.Equals* + name: Equals + href: api/core/EchoHub.Core.Security.RoomCrypto.DerivedKeys.html#EchoHub_Core_Security_RoomCrypto_DerivedKeys_Equals_ + commentId: Overload:EchoHub.Core.Security.RoomCrypto.DerivedKeys.Equals + fullName: EchoHub.Core.Security.RoomCrypto.DerivedKeys.Equals + nameWithType: RoomCrypto.DerivedKeys.Equals +- uid: EchoHub.Core.Security.RoomCrypto.DerivedKeys.GetHashCode + name: GetHashCode() + href: api/core/EchoHub.Core.Security.RoomCrypto.DerivedKeys.html#EchoHub_Core_Security_RoomCrypto_DerivedKeys_GetHashCode + commentId: M:EchoHub.Core.Security.RoomCrypto.DerivedKeys.GetHashCode + fullName: EchoHub.Core.Security.RoomCrypto.DerivedKeys.GetHashCode() + nameWithType: RoomCrypto.DerivedKeys.GetHashCode() +- uid: EchoHub.Core.Security.RoomCrypto.DerivedKeys.GetHashCode* + name: GetHashCode + href: api/core/EchoHub.Core.Security.RoomCrypto.DerivedKeys.html#EchoHub_Core_Security_RoomCrypto_DerivedKeys_GetHashCode_ + commentId: Overload:EchoHub.Core.Security.RoomCrypto.DerivedKeys.GetHashCode + fullName: EchoHub.Core.Security.RoomCrypto.DerivedKeys.GetHashCode + nameWithType: RoomCrypto.DerivedKeys.GetHashCode +- uid: EchoHub.Core.Security.RoomCrypto.DerivedKeys.KeyEncryptionKey + name: KeyEncryptionKey + href: api/core/EchoHub.Core.Security.RoomCrypto.DerivedKeys.html#EchoHub_Core_Security_RoomCrypto_DerivedKeys_KeyEncryptionKey + commentId: P:EchoHub.Core.Security.RoomCrypto.DerivedKeys.KeyEncryptionKey + fullName: EchoHub.Core.Security.RoomCrypto.DerivedKeys.KeyEncryptionKey + nameWithType: RoomCrypto.DerivedKeys.KeyEncryptionKey +- uid: EchoHub.Core.Security.RoomCrypto.DerivedKeys.KeyEncryptionKey* + name: KeyEncryptionKey + href: api/core/EchoHub.Core.Security.RoomCrypto.DerivedKeys.html#EchoHub_Core_Security_RoomCrypto_DerivedKeys_KeyEncryptionKey_ + commentId: Overload:EchoHub.Core.Security.RoomCrypto.DerivedKeys.KeyEncryptionKey + fullName: EchoHub.Core.Security.RoomCrypto.DerivedKeys.KeyEncryptionKey + nameWithType: RoomCrypto.DerivedKeys.KeyEncryptionKey +- uid: EchoHub.Core.Security.RoomCrypto.DerivedKeys.ToString + name: ToString() + href: api/core/EchoHub.Core.Security.RoomCrypto.DerivedKeys.html#EchoHub_Core_Security_RoomCrypto_DerivedKeys_ToString + commentId: M:EchoHub.Core.Security.RoomCrypto.DerivedKeys.ToString + fullName: EchoHub.Core.Security.RoomCrypto.DerivedKeys.ToString() + nameWithType: RoomCrypto.DerivedKeys.ToString() +- uid: EchoHub.Core.Security.RoomCrypto.DerivedKeys.ToString* + name: ToString + href: api/core/EchoHub.Core.Security.RoomCrypto.DerivedKeys.html#EchoHub_Core_Security_RoomCrypto_DerivedKeys_ToString_ + commentId: Overload:EchoHub.Core.Security.RoomCrypto.DerivedKeys.ToString + fullName: EchoHub.Core.Security.RoomCrypto.DerivedKeys.ToString + nameWithType: RoomCrypto.DerivedKeys.ToString +- uid: EchoHub.Core.Security.RoomCrypto.DerivedKeys.op_Equality(EchoHub.Core.Security.RoomCrypto.DerivedKeys,EchoHub.Core.Security.RoomCrypto.DerivedKeys) + name: operator ==(DerivedKeys?, DerivedKeys?) + href: api/core/EchoHub.Core.Security.RoomCrypto.DerivedKeys.html#EchoHub_Core_Security_RoomCrypto_DerivedKeys_op_Equality_EchoHub_Core_Security_RoomCrypto_DerivedKeys_EchoHub_Core_Security_RoomCrypto_DerivedKeys_ + commentId: M:EchoHub.Core.Security.RoomCrypto.DerivedKeys.op_Equality(EchoHub.Core.Security.RoomCrypto.DerivedKeys,EchoHub.Core.Security.RoomCrypto.DerivedKeys) + name.vb: =(DerivedKeys, DerivedKeys) + fullName: EchoHub.Core.Security.RoomCrypto.DerivedKeys.operator ==(EchoHub.Core.Security.RoomCrypto.DerivedKeys?, EchoHub.Core.Security.RoomCrypto.DerivedKeys?) + fullName.vb: EchoHub.Core.Security.RoomCrypto.DerivedKeys.=(EchoHub.Core.Security.RoomCrypto.DerivedKeys, EchoHub.Core.Security.RoomCrypto.DerivedKeys) + nameWithType: RoomCrypto.DerivedKeys.operator ==(RoomCrypto.DerivedKeys?, RoomCrypto.DerivedKeys?) + nameWithType.vb: RoomCrypto.DerivedKeys.=(RoomCrypto.DerivedKeys, RoomCrypto.DerivedKeys) +- uid: EchoHub.Core.Security.RoomCrypto.DerivedKeys.op_Equality* + name: operator == + href: api/core/EchoHub.Core.Security.RoomCrypto.DerivedKeys.html#EchoHub_Core_Security_RoomCrypto_DerivedKeys_op_Equality_ + commentId: Overload:EchoHub.Core.Security.RoomCrypto.DerivedKeys.op_Equality + name.vb: = + fullName: EchoHub.Core.Security.RoomCrypto.DerivedKeys.operator == + fullName.vb: EchoHub.Core.Security.RoomCrypto.DerivedKeys.= + nameWithType: RoomCrypto.DerivedKeys.operator == + nameWithType.vb: RoomCrypto.DerivedKeys.= +- uid: EchoHub.Core.Security.RoomCrypto.DerivedKeys.op_Inequality(EchoHub.Core.Security.RoomCrypto.DerivedKeys,EchoHub.Core.Security.RoomCrypto.DerivedKeys) + name: operator !=(DerivedKeys?, DerivedKeys?) + href: api/core/EchoHub.Core.Security.RoomCrypto.DerivedKeys.html#EchoHub_Core_Security_RoomCrypto_DerivedKeys_op_Inequality_EchoHub_Core_Security_RoomCrypto_DerivedKeys_EchoHub_Core_Security_RoomCrypto_DerivedKeys_ + commentId: M:EchoHub.Core.Security.RoomCrypto.DerivedKeys.op_Inequality(EchoHub.Core.Security.RoomCrypto.DerivedKeys,EchoHub.Core.Security.RoomCrypto.DerivedKeys) + name.vb: <>(DerivedKeys, DerivedKeys) + fullName: EchoHub.Core.Security.RoomCrypto.DerivedKeys.operator !=(EchoHub.Core.Security.RoomCrypto.DerivedKeys?, EchoHub.Core.Security.RoomCrypto.DerivedKeys?) + fullName.vb: EchoHub.Core.Security.RoomCrypto.DerivedKeys.<>(EchoHub.Core.Security.RoomCrypto.DerivedKeys, EchoHub.Core.Security.RoomCrypto.DerivedKeys) + nameWithType: RoomCrypto.DerivedKeys.operator !=(RoomCrypto.DerivedKeys?, RoomCrypto.DerivedKeys?) + nameWithType.vb: RoomCrypto.DerivedKeys.<>(RoomCrypto.DerivedKeys, RoomCrypto.DerivedKeys) +- uid: EchoHub.Core.Security.RoomCrypto.DerivedKeys.op_Inequality* + name: operator != + href: api/core/EchoHub.Core.Security.RoomCrypto.DerivedKeys.html#EchoHub_Core_Security_RoomCrypto_DerivedKeys_op_Inequality_ + commentId: Overload:EchoHub.Core.Security.RoomCrypto.DerivedKeys.op_Inequality + name.vb: <> + fullName: EchoHub.Core.Security.RoomCrypto.DerivedKeys.operator != + fullName.vb: EchoHub.Core.Security.RoomCrypto.DerivedKeys.<> + nameWithType: RoomCrypto.DerivedKeys.operator != + nameWithType.vb: RoomCrypto.DerivedKeys.<> +- uid: EchoHub.Core.Security.RoomCrypto.EncryptBytes(System.Byte[],System.Byte[]) + name: EncryptBytes(byte[], byte[]) + href: api/core/EchoHub.Core.Security.RoomCrypto.html#EchoHub_Core_Security_RoomCrypto_EncryptBytes_System_Byte___System_Byte___ + commentId: M:EchoHub.Core.Security.RoomCrypto.EncryptBytes(System.Byte[],System.Byte[]) + name.vb: EncryptBytes(Byte(), Byte()) + fullName: EchoHub.Core.Security.RoomCrypto.EncryptBytes(byte[], byte[]) + fullName.vb: EchoHub.Core.Security.RoomCrypto.EncryptBytes(Byte(), Byte()) + nameWithType: RoomCrypto.EncryptBytes(byte[], byte[]) + nameWithType.vb: RoomCrypto.EncryptBytes(Byte(), Byte()) +- uid: EchoHub.Core.Security.RoomCrypto.EncryptBytes* + name: EncryptBytes + href: api/core/EchoHub.Core.Security.RoomCrypto.html#EchoHub_Core_Security_RoomCrypto_EncryptBytes_ + commentId: Overload:EchoHub.Core.Security.RoomCrypto.EncryptBytes + fullName: EchoHub.Core.Security.RoomCrypto.EncryptBytes + nameWithType: RoomCrypto.EncryptBytes +- uid: EchoHub.Core.Security.RoomCrypto.EncryptText(System.String,System.Byte[]) + name: EncryptText(string, byte[]) + href: api/core/EchoHub.Core.Security.RoomCrypto.html#EchoHub_Core_Security_RoomCrypto_EncryptText_System_String_System_Byte___ + commentId: M:EchoHub.Core.Security.RoomCrypto.EncryptText(System.String,System.Byte[]) + name.vb: EncryptText(String, Byte()) + fullName: EchoHub.Core.Security.RoomCrypto.EncryptText(string, byte[]) + fullName.vb: EchoHub.Core.Security.RoomCrypto.EncryptText(String, Byte()) + nameWithType: RoomCrypto.EncryptText(string, byte[]) + nameWithType.vb: RoomCrypto.EncryptText(String, Byte()) +- uid: EchoHub.Core.Security.RoomCrypto.EncryptText* + name: EncryptText + href: api/core/EchoHub.Core.Security.RoomCrypto.html#EchoHub_Core_Security_RoomCrypto_EncryptText_ + commentId: Overload:EchoHub.Core.Security.RoomCrypto.EncryptText + fullName: EchoHub.Core.Security.RoomCrypto.EncryptText + nameWithType: RoomCrypto.EncryptText +- uid: EchoHub.Core.Security.RoomCrypto.GenerateRoomKey + name: GenerateRoomKey() + href: api/core/EchoHub.Core.Security.RoomCrypto.html#EchoHub_Core_Security_RoomCrypto_GenerateRoomKey + commentId: M:EchoHub.Core.Security.RoomCrypto.GenerateRoomKey + fullName: EchoHub.Core.Security.RoomCrypto.GenerateRoomKey() + nameWithType: RoomCrypto.GenerateRoomKey() +- uid: EchoHub.Core.Security.RoomCrypto.GenerateRoomKey* + name: GenerateRoomKey + href: api/core/EchoHub.Core.Security.RoomCrypto.html#EchoHub_Core_Security_RoomCrypto_GenerateRoomKey_ + commentId: Overload:EchoHub.Core.Security.RoomCrypto.GenerateRoomKey + fullName: EchoHub.Core.Security.RoomCrypto.GenerateRoomKey + nameWithType: RoomCrypto.GenerateRoomKey +- uid: EchoHub.Core.Security.RoomCrypto.GenerateSalt + name: GenerateSalt() + href: api/core/EchoHub.Core.Security.RoomCrypto.html#EchoHub_Core_Security_RoomCrypto_GenerateSalt + commentId: M:EchoHub.Core.Security.RoomCrypto.GenerateSalt + fullName: EchoHub.Core.Security.RoomCrypto.GenerateSalt() + nameWithType: RoomCrypto.GenerateSalt() +- uid: EchoHub.Core.Security.RoomCrypto.GenerateSalt* + name: GenerateSalt + href: api/core/EchoHub.Core.Security.RoomCrypto.html#EchoHub_Core_Security_RoomCrypto_GenerateSalt_ + commentId: Overload:EchoHub.Core.Security.RoomCrypto.GenerateSalt + fullName: EchoHub.Core.Security.RoomCrypto.GenerateSalt + nameWithType: RoomCrypto.GenerateSalt +- uid: EchoHub.Core.Security.RoomCrypto.IsRoomCiphertext(System.String) + name: IsRoomCiphertext(string?) + href: api/core/EchoHub.Core.Security.RoomCrypto.html#EchoHub_Core_Security_RoomCrypto_IsRoomCiphertext_System_String_ + commentId: M:EchoHub.Core.Security.RoomCrypto.IsRoomCiphertext(System.String) + name.vb: IsRoomCiphertext(String) + fullName: EchoHub.Core.Security.RoomCrypto.IsRoomCiphertext(string?) + fullName.vb: EchoHub.Core.Security.RoomCrypto.IsRoomCiphertext(String) + nameWithType: RoomCrypto.IsRoomCiphertext(string?) + nameWithType.vb: RoomCrypto.IsRoomCiphertext(String) +- uid: EchoHub.Core.Security.RoomCrypto.IsRoomCiphertext* + name: IsRoomCiphertext + href: api/core/EchoHub.Core.Security.RoomCrypto.html#EchoHub_Core_Security_RoomCrypto_IsRoomCiphertext_ + commentId: Overload:EchoHub.Core.Security.RoomCrypto.IsRoomCiphertext + fullName: EchoHub.Core.Security.RoomCrypto.IsRoomCiphertext + nameWithType: RoomCrypto.IsRoomCiphertext +- uid: EchoHub.Core.Security.RoomCrypto.TryDecryptText(System.String,System.Byte[],System.String@) + name: TryDecryptText(string, byte[], out string) + href: api/core/EchoHub.Core.Security.RoomCrypto.html#EchoHub_Core_Security_RoomCrypto_TryDecryptText_System_String_System_Byte___System_String__ + commentId: M:EchoHub.Core.Security.RoomCrypto.TryDecryptText(System.String,System.Byte[],System.String@) + name.vb: TryDecryptText(String, Byte(), String) + fullName: EchoHub.Core.Security.RoomCrypto.TryDecryptText(string, byte[], out string) + fullName.vb: EchoHub.Core.Security.RoomCrypto.TryDecryptText(String, Byte(), String) + nameWithType: RoomCrypto.TryDecryptText(string, byte[], out string) + nameWithType.vb: RoomCrypto.TryDecryptText(String, Byte(), String) +- uid: EchoHub.Core.Security.RoomCrypto.TryDecryptText* + name: TryDecryptText + href: api/core/EchoHub.Core.Security.RoomCrypto.html#EchoHub_Core_Security_RoomCrypto_TryDecryptText_ + commentId: Overload:EchoHub.Core.Security.RoomCrypto.TryDecryptText + fullName: EchoHub.Core.Security.RoomCrypto.TryDecryptText + nameWithType: RoomCrypto.TryDecryptText +- uid: EchoHub.Core.Security.RoomCrypto.TryUnwrapRoomKey(System.String,System.Byte[],System.Byte[]@) + name: TryUnwrapRoomKey(string, byte[], out byte[]) + href: api/core/EchoHub.Core.Security.RoomCrypto.html#EchoHub_Core_Security_RoomCrypto_TryUnwrapRoomKey_System_String_System_Byte___System_Byte____ + commentId: M:EchoHub.Core.Security.RoomCrypto.TryUnwrapRoomKey(System.String,System.Byte[],System.Byte[]@) + name.vb: TryUnwrapRoomKey(String, Byte(), Byte()) + fullName: EchoHub.Core.Security.RoomCrypto.TryUnwrapRoomKey(string, byte[], out byte[]) + fullName.vb: EchoHub.Core.Security.RoomCrypto.TryUnwrapRoomKey(String, Byte(), Byte()) + nameWithType: RoomCrypto.TryUnwrapRoomKey(string, byte[], out byte[]) + nameWithType.vb: RoomCrypto.TryUnwrapRoomKey(String, Byte(), Byte()) +- uid: EchoHub.Core.Security.RoomCrypto.TryUnwrapRoomKey* + name: TryUnwrapRoomKey + href: api/core/EchoHub.Core.Security.RoomCrypto.html#EchoHub_Core_Security_RoomCrypto_TryUnwrapRoomKey_ + commentId: Overload:EchoHub.Core.Security.RoomCrypto.TryUnwrapRoomKey + fullName: EchoHub.Core.Security.RoomCrypto.TryUnwrapRoomKey + nameWithType: RoomCrypto.TryUnwrapRoomKey +- uid: EchoHub.Core.Security.RoomCrypto.WrapRoomKey(System.Byte[],System.Byte[]) + name: WrapRoomKey(byte[], byte[]) + href: api/core/EchoHub.Core.Security.RoomCrypto.html#EchoHub_Core_Security_RoomCrypto_WrapRoomKey_System_Byte___System_Byte___ + commentId: M:EchoHub.Core.Security.RoomCrypto.WrapRoomKey(System.Byte[],System.Byte[]) + name.vb: WrapRoomKey(Byte(), Byte()) + fullName: EchoHub.Core.Security.RoomCrypto.WrapRoomKey(byte[], byte[]) + fullName.vb: EchoHub.Core.Security.RoomCrypto.WrapRoomKey(Byte(), Byte()) + nameWithType: RoomCrypto.WrapRoomKey(byte[], byte[]) + nameWithType.vb: RoomCrypto.WrapRoomKey(Byte(), Byte()) +- uid: EchoHub.Core.Security.RoomCrypto.WrapRoomKey* + name: WrapRoomKey + href: api/core/EchoHub.Core.Security.RoomCrypto.html#EchoHub_Core_Security_RoomCrypto_WrapRoomKey_ + commentId: Overload:EchoHub.Core.Security.RoomCrypto.WrapRoomKey + fullName: EchoHub.Core.Security.RoomCrypto.WrapRoomKey + nameWithType: RoomCrypto.WrapRoomKey +- uid: EchoHub.Core.Services + name: EchoHub.Core.Services + href: api/core/EchoHub.Core.Services.html + commentId: N:EchoHub.Core.Services + fullName: EchoHub.Core.Services + nameWithType: EchoHub.Core.Services +- uid: EchoHub.Core.Services.FileValidationHelper + name: FileValidationHelper + href: api/core/EchoHub.Core.Services.FileValidationHelper.html + commentId: T:EchoHub.Core.Services.FileValidationHelper + fullName: EchoHub.Core.Services.FileValidationHelper + nameWithType: FileValidationHelper +- uid: EchoHub.Core.Services.FileValidationHelper.IsAudioFile(System.String) + name: IsAudioFile(string) + href: api/core/EchoHub.Core.Services.FileValidationHelper.html#EchoHub_Core_Services_FileValidationHelper_IsAudioFile_System_String_ + commentId: M:EchoHub.Core.Services.FileValidationHelper.IsAudioFile(System.String) + name.vb: IsAudioFile(String) + fullName: EchoHub.Core.Services.FileValidationHelper.IsAudioFile(string) + fullName.vb: EchoHub.Core.Services.FileValidationHelper.IsAudioFile(String) + nameWithType: FileValidationHelper.IsAudioFile(string) + nameWithType.vb: FileValidationHelper.IsAudioFile(String) +- uid: EchoHub.Core.Services.FileValidationHelper.IsAudioFile* + name: IsAudioFile + href: api/core/EchoHub.Core.Services.FileValidationHelper.html#EchoHub_Core_Services_FileValidationHelper_IsAudioFile_ + commentId: Overload:EchoHub.Core.Services.FileValidationHelper.IsAudioFile + fullName: EchoHub.Core.Services.FileValidationHelper.IsAudioFile + nameWithType: FileValidationHelper.IsAudioFile +- uid: EchoHub.Core.Services.FileValidationHelper.IsValidImage(System.IO.Stream) + name: IsValidImage(Stream) + href: api/core/EchoHub.Core.Services.FileValidationHelper.html#EchoHub_Core_Services_FileValidationHelper_IsValidImage_System_IO_Stream_ + commentId: M:EchoHub.Core.Services.FileValidationHelper.IsValidImage(System.IO.Stream) + fullName: EchoHub.Core.Services.FileValidationHelper.IsValidImage(System.IO.Stream) + nameWithType: FileValidationHelper.IsValidImage(Stream) +- uid: EchoHub.Core.Services.FileValidationHelper.IsValidImage* + name: IsValidImage + href: api/core/EchoHub.Core.Services.FileValidationHelper.html#EchoHub_Core_Services_FileValidationHelper_IsValidImage_ + commentId: Overload:EchoHub.Core.Services.FileValidationHelper.IsValidImage + fullName: EchoHub.Core.Services.FileValidationHelper.IsValidImage + nameWithType: FileValidationHelper.IsValidImage +- uid: EchoHub.Core.Services.ImageToAsciiService + name: ImageToAsciiService + href: api/core/EchoHub.Core.Services.ImageToAsciiService.html + commentId: T:EchoHub.Core.Services.ImageToAsciiService + fullName: EchoHub.Core.Services.ImageToAsciiService + nameWithType: ImageToAsciiService +- uid: EchoHub.Core.Services.ImageToAsciiService.#ctor + name: ImageToAsciiService() + href: api/core/EchoHub.Core.Services.ImageToAsciiService.html#EchoHub_Core_Services_ImageToAsciiService__ctor + commentId: M:EchoHub.Core.Services.ImageToAsciiService.#ctor + name.vb: New() + fullName: EchoHub.Core.Services.ImageToAsciiService.ImageToAsciiService() + fullName.vb: EchoHub.Core.Services.ImageToAsciiService.New() + nameWithType: ImageToAsciiService.ImageToAsciiService() + nameWithType.vb: ImageToAsciiService.New() +- uid: EchoHub.Core.Services.ImageToAsciiService.#ctor* + name: ImageToAsciiService + href: api/core/EchoHub.Core.Services.ImageToAsciiService.html#EchoHub_Core_Services_ImageToAsciiService__ctor_ + commentId: Overload:EchoHub.Core.Services.ImageToAsciiService.#ctor + name.vb: New + fullName: EchoHub.Core.Services.ImageToAsciiService.ImageToAsciiService + fullName.vb: EchoHub.Core.Services.ImageToAsciiService.New + nameWithType: ImageToAsciiService.ImageToAsciiService + nameWithType.vb: ImageToAsciiService.New +- uid: EchoHub.Core.Services.ImageToAsciiService.ConvertToAscii(System.IO.Stream,System.Int32,System.Int32) + name: ConvertToAscii(Stream, int, int) + href: api/core/EchoHub.Core.Services.ImageToAsciiService.html#EchoHub_Core_Services_ImageToAsciiService_ConvertToAscii_System_IO_Stream_System_Int32_System_Int32_ + commentId: M:EchoHub.Core.Services.ImageToAsciiService.ConvertToAscii(System.IO.Stream,System.Int32,System.Int32) + name.vb: ConvertToAscii(Stream, Integer, Integer) + fullName: EchoHub.Core.Services.ImageToAsciiService.ConvertToAscii(System.IO.Stream, int, int) + fullName.vb: EchoHub.Core.Services.ImageToAsciiService.ConvertToAscii(System.IO.Stream, Integer, Integer) + nameWithType: ImageToAsciiService.ConvertToAscii(Stream, int, int) + nameWithType.vb: ImageToAsciiService.ConvertToAscii(Stream, Integer, Integer) +- uid: EchoHub.Core.Services.ImageToAsciiService.ConvertToAscii* + name: ConvertToAscii + href: api/core/EchoHub.Core.Services.ImageToAsciiService.html#EchoHub_Core_Services_ImageToAsciiService_ConvertToAscii_ + commentId: Overload:EchoHub.Core.Services.ImageToAsciiService.ConvertToAscii + fullName: EchoHub.Core.Services.ImageToAsciiService.ConvertToAscii + nameWithType: ImageToAsciiService.ConvertToAscii +- uid: EchoHub.Core.Services.ImageToAsciiService.GetDimensions(System.String) + name: GetDimensions(string?) + href: api/core/EchoHub.Core.Services.ImageToAsciiService.html#EchoHub_Core_Services_ImageToAsciiService_GetDimensions_System_String_ + commentId: M:EchoHub.Core.Services.ImageToAsciiService.GetDimensions(System.String) + name.vb: GetDimensions(String) + fullName: EchoHub.Core.Services.ImageToAsciiService.GetDimensions(string?) + fullName.vb: EchoHub.Core.Services.ImageToAsciiService.GetDimensions(String) + nameWithType: ImageToAsciiService.GetDimensions(string?) + nameWithType.vb: ImageToAsciiService.GetDimensions(String) +- uid: EchoHub.Core.Services.ImageToAsciiService.GetDimensions* + name: GetDimensions + href: api/core/EchoHub.Core.Services.ImageToAsciiService.html#EchoHub_Core_Services_ImageToAsciiService_GetDimensions_ + commentId: Overload:EchoHub.Core.Services.ImageToAsciiService.GetDimensions + fullName: EchoHub.Core.Services.ImageToAsciiService.GetDimensions + nameWithType: ImageToAsciiService.GetDimensions - uid: EchoHub.Server.Auth name: EchoHub.Server.Auth href: api/server/EchoHub.Server.Auth.html @@ -14002,13 +16252,13 @@ references: commentId: T:EchoHub.Server.Controllers.ChannelsController fullName: EchoHub.Server.Controllers.ChannelsController nameWithType: ChannelsController -- uid: EchoHub.Server.Controllers.ChannelsController.#ctor(EchoHub.Core.Contracts.IChannelService,EchoHub.Server.Data.EchoHubDbContext,EchoHub.Server.Services.FileStorageService,EchoHub.Server.Services.ImageToAsciiService,System.Net.Http.IHttpClientFactory,EchoHub.Core.Contracts.IChatService,EchoHub.Core.Contracts.IMessageEncryptionService) +- uid: EchoHub.Server.Controllers.ChannelsController.#ctor(EchoHub.Core.Contracts.IChannelService,EchoHub.Server.Data.EchoHubDbContext,EchoHub.Server.Services.FileStorageService,EchoHub.Core.Services.ImageToAsciiService,System.Net.Http.IHttpClientFactory,EchoHub.Core.Contracts.IChatService,EchoHub.Core.Contracts.IMessageEncryptionService) name: ChannelsController(IChannelService, EchoHubDbContext, FileStorageService, ImageToAsciiService, IHttpClientFactory, IChatService, IMessageEncryptionService) - href: api/server/EchoHub.Server.Controllers.ChannelsController.html#EchoHub_Server_Controllers_ChannelsController__ctor_EchoHub_Core_Contracts_IChannelService_EchoHub_Server_Data_EchoHubDbContext_EchoHub_Server_Services_FileStorageService_EchoHub_Server_Services_ImageToAsciiService_System_Net_Http_IHttpClientFactory_EchoHub_Core_Contracts_IChatService_EchoHub_Core_Contracts_IMessageEncryptionService_ - commentId: M:EchoHub.Server.Controllers.ChannelsController.#ctor(EchoHub.Core.Contracts.IChannelService,EchoHub.Server.Data.EchoHubDbContext,EchoHub.Server.Services.FileStorageService,EchoHub.Server.Services.ImageToAsciiService,System.Net.Http.IHttpClientFactory,EchoHub.Core.Contracts.IChatService,EchoHub.Core.Contracts.IMessageEncryptionService) + href: api/server/EchoHub.Server.Controllers.ChannelsController.html#EchoHub_Server_Controllers_ChannelsController__ctor_EchoHub_Core_Contracts_IChannelService_EchoHub_Server_Data_EchoHubDbContext_EchoHub_Server_Services_FileStorageService_EchoHub_Core_Services_ImageToAsciiService_System_Net_Http_IHttpClientFactory_EchoHub_Core_Contracts_IChatService_EchoHub_Core_Contracts_IMessageEncryptionService_ + commentId: M:EchoHub.Server.Controllers.ChannelsController.#ctor(EchoHub.Core.Contracts.IChannelService,EchoHub.Server.Data.EchoHubDbContext,EchoHub.Server.Services.FileStorageService,EchoHub.Core.Services.ImageToAsciiService,System.Net.Http.IHttpClientFactory,EchoHub.Core.Contracts.IChatService,EchoHub.Core.Contracts.IMessageEncryptionService) name.vb: New(IChannelService, EchoHubDbContext, FileStorageService, ImageToAsciiService, IHttpClientFactory, IChatService, IMessageEncryptionService) - fullName: EchoHub.Server.Controllers.ChannelsController.ChannelsController(EchoHub.Core.Contracts.IChannelService, EchoHub.Server.Data.EchoHubDbContext, EchoHub.Server.Services.FileStorageService, EchoHub.Server.Services.ImageToAsciiService, System.Net.Http.IHttpClientFactory, EchoHub.Core.Contracts.IChatService, EchoHub.Core.Contracts.IMessageEncryptionService) - fullName.vb: EchoHub.Server.Controllers.ChannelsController.New(EchoHub.Core.Contracts.IChannelService, EchoHub.Server.Data.EchoHubDbContext, EchoHub.Server.Services.FileStorageService, EchoHub.Server.Services.ImageToAsciiService, System.Net.Http.IHttpClientFactory, EchoHub.Core.Contracts.IChatService, EchoHub.Core.Contracts.IMessageEncryptionService) + fullName: EchoHub.Server.Controllers.ChannelsController.ChannelsController(EchoHub.Core.Contracts.IChannelService, EchoHub.Server.Data.EchoHubDbContext, EchoHub.Server.Services.FileStorageService, EchoHub.Core.Services.ImageToAsciiService, System.Net.Http.IHttpClientFactory, EchoHub.Core.Contracts.IChatService, EchoHub.Core.Contracts.IMessageEncryptionService) + fullName.vb: EchoHub.Server.Controllers.ChannelsController.New(EchoHub.Core.Contracts.IChannelService, EchoHub.Server.Data.EchoHubDbContext, EchoHub.Server.Services.FileStorageService, EchoHub.Core.Services.ImageToAsciiService, System.Net.Http.IHttpClientFactory, EchoHub.Core.Contracts.IChatService, EchoHub.Core.Contracts.IMessageEncryptionService) nameWithType: ChannelsController.ChannelsController(IChannelService, EchoHubDbContext, FileStorageService, ImageToAsciiService, IHttpClientFactory, IChatService, IMessageEncryptionService) nameWithType.vb: ChannelsController.New(IChannelService, EchoHubDbContext, FileStorageService, ImageToAsciiService, IHttpClientFactory, IChatService, IMessageEncryptionService) - uid: EchoHub.Server.Controllers.ChannelsController.#ctor* @@ -14047,6 +16297,21 @@ references: commentId: Overload:EchoHub.Server.Controllers.ChannelsController.DeleteChannel fullName: EchoHub.Server.Controllers.ChannelsController.DeleteChannel nameWithType: ChannelsController.DeleteChannel +- uid: EchoHub.Server.Controllers.ChannelsController.GetChannelCrypto(System.String) + name: GetChannelCrypto(string) + href: api/server/EchoHub.Server.Controllers.ChannelsController.html#EchoHub_Server_Controllers_ChannelsController_GetChannelCrypto_System_String_ + commentId: M:EchoHub.Server.Controllers.ChannelsController.GetChannelCrypto(System.String) + name.vb: GetChannelCrypto(String) + fullName: EchoHub.Server.Controllers.ChannelsController.GetChannelCrypto(string) + fullName.vb: EchoHub.Server.Controllers.ChannelsController.GetChannelCrypto(String) + nameWithType: ChannelsController.GetChannelCrypto(string) + nameWithType.vb: ChannelsController.GetChannelCrypto(String) +- uid: EchoHub.Server.Controllers.ChannelsController.GetChannelCrypto* + name: GetChannelCrypto + href: api/server/EchoHub.Server.Controllers.ChannelsController.html#EchoHub_Server_Controllers_ChannelsController_GetChannelCrypto_ + commentId: Overload:EchoHub.Server.Controllers.ChannelsController.GetChannelCrypto + fullName: EchoHub.Server.Controllers.ChannelsController.GetChannelCrypto + nameWithType: ChannelsController.GetChannelCrypto - uid: EchoHub.Server.Controllers.ChannelsController.GetChannels(System.Int32,System.Int32) name: GetChannels(int, int) href: api/server/EchoHub.Server.Controllers.ChannelsController.html#EchoHub_Server_Controllers_ChannelsController_GetChannels_System_Int32_System_Int32_ @@ -14062,6 +16327,36 @@ references: commentId: Overload:EchoHub.Server.Controllers.ChannelsController.GetChannels fullName: EchoHub.Server.Controllers.ChannelsController.GetChannels nameWithType: ChannelsController.GetChannels +- uid: EchoHub.Server.Controllers.ChannelsController.RekeyChannel(System.String,EchoHub.Core.DTOs.RekeyChannelRequest) + name: RekeyChannel(string, RekeyChannelRequest) + href: api/server/EchoHub.Server.Controllers.ChannelsController.html#EchoHub_Server_Controllers_ChannelsController_RekeyChannel_System_String_EchoHub_Core_DTOs_RekeyChannelRequest_ + commentId: M:EchoHub.Server.Controllers.ChannelsController.RekeyChannel(System.String,EchoHub.Core.DTOs.RekeyChannelRequest) + name.vb: RekeyChannel(String, RekeyChannelRequest) + fullName: EchoHub.Server.Controllers.ChannelsController.RekeyChannel(string, EchoHub.Core.DTOs.RekeyChannelRequest) + fullName.vb: EchoHub.Server.Controllers.ChannelsController.RekeyChannel(String, EchoHub.Core.DTOs.RekeyChannelRequest) + nameWithType: ChannelsController.RekeyChannel(string, RekeyChannelRequest) + nameWithType.vb: ChannelsController.RekeyChannel(String, RekeyChannelRequest) +- uid: EchoHub.Server.Controllers.ChannelsController.RekeyChannel* + name: RekeyChannel + href: api/server/EchoHub.Server.Controllers.ChannelsController.html#EchoHub_Server_Controllers_ChannelsController_RekeyChannel_ + commentId: Overload:EchoHub.Server.Controllers.ChannelsController.RekeyChannel + fullName: EchoHub.Server.Controllers.ChannelsController.RekeyChannel + nameWithType: ChannelsController.RekeyChannel +- uid: EchoHub.Server.Controllers.ChannelsController.SendMessageWithAttachments(System.String,System.String) + name: SendMessageWithAttachments(string, string?) + href: api/server/EchoHub.Server.Controllers.ChannelsController.html#EchoHub_Server_Controllers_ChannelsController_SendMessageWithAttachments_System_String_System_String_ + commentId: M:EchoHub.Server.Controllers.ChannelsController.SendMessageWithAttachments(System.String,System.String) + name.vb: SendMessageWithAttachments(String, String) + fullName: EchoHub.Server.Controllers.ChannelsController.SendMessageWithAttachments(string, string?) + fullName.vb: EchoHub.Server.Controllers.ChannelsController.SendMessageWithAttachments(String, String) + nameWithType: ChannelsController.SendMessageWithAttachments(string, string?) + nameWithType.vb: ChannelsController.SendMessageWithAttachments(String, String) +- uid: EchoHub.Server.Controllers.ChannelsController.SendMessageWithAttachments* + name: SendMessageWithAttachments + href: api/server/EchoHub.Server.Controllers.ChannelsController.html#EchoHub_Server_Controllers_ChannelsController_SendMessageWithAttachments_ + commentId: Overload:EchoHub.Server.Controllers.ChannelsController.SendMessageWithAttachments + fullName: EchoHub.Server.Controllers.ChannelsController.SendMessageWithAttachments + nameWithType: ChannelsController.SendMessageWithAttachments - uid: EchoHub.Server.Controllers.ChannelsController.SendUrl(System.String,EchoHub.Core.DTOs.SendUrlRequest,System.String) name: SendUrl(string, SendUrlRequest, string?) href: api/server/EchoHub.Server.Controllers.ChannelsController.html#EchoHub_Server_Controllers_ChannelsController_SendUrl_System_String_EchoHub_Core_DTOs_SendUrlRequest_System_String_ @@ -14092,21 +16387,6 @@ references: commentId: Overload:EchoHub.Server.Controllers.ChannelsController.UpdateTopic fullName: EchoHub.Server.Controllers.ChannelsController.UpdateTopic nameWithType: ChannelsController.UpdateTopic -- uid: EchoHub.Server.Controllers.ChannelsController.Upload(System.String,System.String) - name: Upload(string, string?) - href: api/server/EchoHub.Server.Controllers.ChannelsController.html#EchoHub_Server_Controllers_ChannelsController_Upload_System_String_System_String_ - commentId: M:EchoHub.Server.Controllers.ChannelsController.Upload(System.String,System.String) - name.vb: Upload(String, String) - fullName: EchoHub.Server.Controllers.ChannelsController.Upload(string, string?) - fullName.vb: EchoHub.Server.Controllers.ChannelsController.Upload(String, String) - nameWithType: ChannelsController.Upload(string, string?) - nameWithType.vb: ChannelsController.Upload(String, String) -- uid: EchoHub.Server.Controllers.ChannelsController.Upload* - name: Upload - href: api/server/EchoHub.Server.Controllers.ChannelsController.html#EchoHub_Server_Controllers_ChannelsController_Upload_ - commentId: Overload:EchoHub.Server.Controllers.ChannelsController.Upload - fullName: EchoHub.Server.Controllers.ChannelsController.Upload - nameWithType: ChannelsController.Upload - uid: EchoHub.Server.Controllers.FilesController name: FilesController href: api/server/EchoHub.Server.Controllers.FilesController.html @@ -14152,15 +16432,15 @@ references: commentId: T:EchoHub.Server.Controllers.ModerationController fullName: EchoHub.Server.Controllers.ModerationController nameWithType: ModerationController -- uid: EchoHub.Server.Controllers.ModerationController.#ctor(EchoHub.Server.Data.EchoHubDbContext,EchoHub.Core.Contracts.IChatService,EchoHub.Server.Services.PresenceTracker,System.Collections.Generic.IEnumerable{EchoHub.Core.Contracts.IChatBroadcaster}) - name: ModerationController(EchoHubDbContext, IChatService, PresenceTracker, IEnumerable) - href: api/server/EchoHub.Server.Controllers.ModerationController.html#EchoHub_Server_Controllers_ModerationController__ctor_EchoHub_Server_Data_EchoHubDbContext_EchoHub_Core_Contracts_IChatService_EchoHub_Server_Services_PresenceTracker_System_Collections_Generic_IEnumerable_EchoHub_Core_Contracts_IChatBroadcaster__ - commentId: M:EchoHub.Server.Controllers.ModerationController.#ctor(EchoHub.Server.Data.EchoHubDbContext,EchoHub.Core.Contracts.IChatService,EchoHub.Server.Services.PresenceTracker,System.Collections.Generic.IEnumerable{EchoHub.Core.Contracts.IChatBroadcaster}) - name.vb: New(EchoHubDbContext, IChatService, PresenceTracker, IEnumerable(Of IChatBroadcaster)) - fullName: EchoHub.Server.Controllers.ModerationController.ModerationController(EchoHub.Server.Data.EchoHubDbContext, EchoHub.Core.Contracts.IChatService, EchoHub.Server.Services.PresenceTracker, System.Collections.Generic.IEnumerable) - fullName.vb: EchoHub.Server.Controllers.ModerationController.New(EchoHub.Server.Data.EchoHubDbContext, EchoHub.Core.Contracts.IChatService, EchoHub.Server.Services.PresenceTracker, System.Collections.Generic.IEnumerable(Of EchoHub.Core.Contracts.IChatBroadcaster)) - nameWithType: ModerationController.ModerationController(EchoHubDbContext, IChatService, PresenceTracker, IEnumerable) - nameWithType.vb: ModerationController.New(EchoHubDbContext, IChatService, PresenceTracker, IEnumerable(Of IChatBroadcaster)) +- uid: EchoHub.Server.Controllers.ModerationController.#ctor(EchoHub.Server.Data.EchoHubDbContext,EchoHub.Core.Contracts.IChatService,EchoHub.Server.Services.PresenceTracker,EchoHub.Server.Services.FileStorageService,System.Collections.Generic.IEnumerable{EchoHub.Core.Contracts.IChatBroadcaster}) + name: ModerationController(EchoHubDbContext, IChatService, PresenceTracker, FileStorageService, IEnumerable) + href: api/server/EchoHub.Server.Controllers.ModerationController.html#EchoHub_Server_Controllers_ModerationController__ctor_EchoHub_Server_Data_EchoHubDbContext_EchoHub_Core_Contracts_IChatService_EchoHub_Server_Services_PresenceTracker_EchoHub_Server_Services_FileStorageService_System_Collections_Generic_IEnumerable_EchoHub_Core_Contracts_IChatBroadcaster__ + commentId: M:EchoHub.Server.Controllers.ModerationController.#ctor(EchoHub.Server.Data.EchoHubDbContext,EchoHub.Core.Contracts.IChatService,EchoHub.Server.Services.PresenceTracker,EchoHub.Server.Services.FileStorageService,System.Collections.Generic.IEnumerable{EchoHub.Core.Contracts.IChatBroadcaster}) + name.vb: New(EchoHubDbContext, IChatService, PresenceTracker, FileStorageService, IEnumerable(Of IChatBroadcaster)) + fullName: EchoHub.Server.Controllers.ModerationController.ModerationController(EchoHub.Server.Data.EchoHubDbContext, EchoHub.Core.Contracts.IChatService, EchoHub.Server.Services.PresenceTracker, EchoHub.Server.Services.FileStorageService, System.Collections.Generic.IEnumerable) + fullName.vb: EchoHub.Server.Controllers.ModerationController.New(EchoHub.Server.Data.EchoHubDbContext, EchoHub.Core.Contracts.IChatService, EchoHub.Server.Services.PresenceTracker, EchoHub.Server.Services.FileStorageService, System.Collections.Generic.IEnumerable(Of EchoHub.Core.Contracts.IChatBroadcaster)) + nameWithType: ModerationController.ModerationController(EchoHubDbContext, IChatService, PresenceTracker, FileStorageService, IEnumerable) + nameWithType.vb: ModerationController.New(EchoHubDbContext, IChatService, PresenceTracker, FileStorageService, IEnumerable(Of IChatBroadcaster)) - uid: EchoHub.Server.Controllers.ModerationController.#ctor* name: ModerationController href: api/server/EchoHub.Server.Controllers.ModerationController.html#EchoHub_Server_Controllers_ModerationController__ctor_ @@ -14350,13 +16630,13 @@ references: commentId: T:EchoHub.Server.Controllers.UsersController fullName: EchoHub.Server.Controllers.UsersController nameWithType: UsersController -- uid: EchoHub.Server.Controllers.UsersController.#ctor(EchoHub.Core.Contracts.IUserService,EchoHub.Server.Services.ImageToAsciiService) +- uid: EchoHub.Server.Controllers.UsersController.#ctor(EchoHub.Core.Contracts.IUserService,EchoHub.Core.Services.ImageToAsciiService) name: UsersController(IUserService, ImageToAsciiService) - href: api/server/EchoHub.Server.Controllers.UsersController.html#EchoHub_Server_Controllers_UsersController__ctor_EchoHub_Core_Contracts_IUserService_EchoHub_Server_Services_ImageToAsciiService_ - commentId: M:EchoHub.Server.Controllers.UsersController.#ctor(EchoHub.Core.Contracts.IUserService,EchoHub.Server.Services.ImageToAsciiService) + href: api/server/EchoHub.Server.Controllers.UsersController.html#EchoHub_Server_Controllers_UsersController__ctor_EchoHub_Core_Contracts_IUserService_EchoHub_Core_Services_ImageToAsciiService_ + commentId: M:EchoHub.Server.Controllers.UsersController.#ctor(EchoHub.Core.Contracts.IUserService,EchoHub.Core.Services.ImageToAsciiService) name.vb: New(IUserService, ImageToAsciiService) - fullName: EchoHub.Server.Controllers.UsersController.UsersController(EchoHub.Core.Contracts.IUserService, EchoHub.Server.Services.ImageToAsciiService) - fullName.vb: EchoHub.Server.Controllers.UsersController.New(EchoHub.Core.Contracts.IUserService, EchoHub.Server.Services.ImageToAsciiService) + fullName: EchoHub.Server.Controllers.UsersController.UsersController(EchoHub.Core.Contracts.IUserService, EchoHub.Core.Services.ImageToAsciiService) + fullName.vb: EchoHub.Server.Controllers.UsersController.New(EchoHub.Core.Contracts.IUserService, EchoHub.Core.Services.ImageToAsciiService) nameWithType: UsersController.UsersController(IUserService, ImageToAsciiService) nameWithType.vb: UsersController.New(IUserService, ImageToAsciiService) - uid: EchoHub.Server.Controllers.UsersController.#ctor* @@ -14437,6 +16717,18 @@ references: fullName.vb: EchoHub.Server.Data.EchoHubDbContext.New nameWithType: EchoHubDbContext.EchoHubDbContext nameWithType.vb: EchoHubDbContext.New +- uid: EchoHub.Server.Data.EchoHubDbContext.Attachments + name: Attachments + href: api/server/EchoHub.Server.Data.EchoHubDbContext.html#EchoHub_Server_Data_EchoHubDbContext_Attachments + commentId: P:EchoHub.Server.Data.EchoHubDbContext.Attachments + fullName: EchoHub.Server.Data.EchoHubDbContext.Attachments + nameWithType: EchoHubDbContext.Attachments +- uid: EchoHub.Server.Data.EchoHubDbContext.Attachments* + name: Attachments + href: api/server/EchoHub.Server.Data.EchoHubDbContext.html#EchoHub_Server_Data_EchoHubDbContext_Attachments_ + commentId: Overload:EchoHub.Server.Data.EchoHubDbContext.Attachments + fullName: EchoHub.Server.Data.EchoHubDbContext.Attachments + nameWithType: EchoHubDbContext.Attachments - uid: EchoHub.Server.Data.EchoHubDbContext.ChannelMemberships name: ChannelMemberships href: api/server/EchoHub.Server.Data.EchoHubDbContext.html#EchoHub_Server_Data_EchoHubDbContext_ChannelMemberships @@ -14587,6 +16879,66 @@ references: commentId: Overload:EchoHub.Server.Data.Migrations.AddAttachmentFileSize.Up fullName: EchoHub.Server.Data.Migrations.AddAttachmentFileSize.Up nameWithType: AddAttachmentFileSize.Up +- uid: EchoHub.Server.Data.Migrations.AddChannelEncryptionEnvelope + name: AddChannelEncryptionEnvelope + href: api/server/EchoHub.Server.Data.Migrations.AddChannelEncryptionEnvelope.html + commentId: T:EchoHub.Server.Data.Migrations.AddChannelEncryptionEnvelope + fullName: EchoHub.Server.Data.Migrations.AddChannelEncryptionEnvelope + nameWithType: AddChannelEncryptionEnvelope +- uid: EchoHub.Server.Data.Migrations.AddChannelEncryptionEnvelope.#ctor + name: AddChannelEncryptionEnvelope() + href: api/server/EchoHub.Server.Data.Migrations.AddChannelEncryptionEnvelope.html#EchoHub_Server_Data_Migrations_AddChannelEncryptionEnvelope__ctor + commentId: M:EchoHub.Server.Data.Migrations.AddChannelEncryptionEnvelope.#ctor + name.vb: New() + fullName: EchoHub.Server.Data.Migrations.AddChannelEncryptionEnvelope.AddChannelEncryptionEnvelope() + fullName.vb: EchoHub.Server.Data.Migrations.AddChannelEncryptionEnvelope.New() + nameWithType: AddChannelEncryptionEnvelope.AddChannelEncryptionEnvelope() + nameWithType.vb: AddChannelEncryptionEnvelope.New() +- uid: EchoHub.Server.Data.Migrations.AddChannelEncryptionEnvelope.#ctor* + name: AddChannelEncryptionEnvelope + href: api/server/EchoHub.Server.Data.Migrations.AddChannelEncryptionEnvelope.html#EchoHub_Server_Data_Migrations_AddChannelEncryptionEnvelope__ctor_ + commentId: Overload:EchoHub.Server.Data.Migrations.AddChannelEncryptionEnvelope.#ctor + name.vb: New + fullName: EchoHub.Server.Data.Migrations.AddChannelEncryptionEnvelope.AddChannelEncryptionEnvelope + fullName.vb: EchoHub.Server.Data.Migrations.AddChannelEncryptionEnvelope.New + nameWithType: AddChannelEncryptionEnvelope.AddChannelEncryptionEnvelope + nameWithType.vb: AddChannelEncryptionEnvelope.New +- uid: EchoHub.Server.Data.Migrations.AddChannelEncryptionEnvelope.BuildTargetModel(Microsoft.EntityFrameworkCore.ModelBuilder) + name: BuildTargetModel(ModelBuilder) + href: api/server/EchoHub.Server.Data.Migrations.AddChannelEncryptionEnvelope.html#EchoHub_Server_Data_Migrations_AddChannelEncryptionEnvelope_BuildTargetModel_Microsoft_EntityFrameworkCore_ModelBuilder_ + commentId: M:EchoHub.Server.Data.Migrations.AddChannelEncryptionEnvelope.BuildTargetModel(Microsoft.EntityFrameworkCore.ModelBuilder) + fullName: EchoHub.Server.Data.Migrations.AddChannelEncryptionEnvelope.BuildTargetModel(Microsoft.EntityFrameworkCore.ModelBuilder) + nameWithType: AddChannelEncryptionEnvelope.BuildTargetModel(ModelBuilder) +- uid: EchoHub.Server.Data.Migrations.AddChannelEncryptionEnvelope.BuildTargetModel* + name: BuildTargetModel + href: api/server/EchoHub.Server.Data.Migrations.AddChannelEncryptionEnvelope.html#EchoHub_Server_Data_Migrations_AddChannelEncryptionEnvelope_BuildTargetModel_ + commentId: Overload:EchoHub.Server.Data.Migrations.AddChannelEncryptionEnvelope.BuildTargetModel + fullName: EchoHub.Server.Data.Migrations.AddChannelEncryptionEnvelope.BuildTargetModel + nameWithType: AddChannelEncryptionEnvelope.BuildTargetModel +- uid: EchoHub.Server.Data.Migrations.AddChannelEncryptionEnvelope.Down(Microsoft.EntityFrameworkCore.Migrations.MigrationBuilder) + name: Down(MigrationBuilder) + href: api/server/EchoHub.Server.Data.Migrations.AddChannelEncryptionEnvelope.html#EchoHub_Server_Data_Migrations_AddChannelEncryptionEnvelope_Down_Microsoft_EntityFrameworkCore_Migrations_MigrationBuilder_ + commentId: M:EchoHub.Server.Data.Migrations.AddChannelEncryptionEnvelope.Down(Microsoft.EntityFrameworkCore.Migrations.MigrationBuilder) + fullName: EchoHub.Server.Data.Migrations.AddChannelEncryptionEnvelope.Down(Microsoft.EntityFrameworkCore.Migrations.MigrationBuilder) + nameWithType: AddChannelEncryptionEnvelope.Down(MigrationBuilder) +- uid: EchoHub.Server.Data.Migrations.AddChannelEncryptionEnvelope.Down* + name: Down + href: api/server/EchoHub.Server.Data.Migrations.AddChannelEncryptionEnvelope.html#EchoHub_Server_Data_Migrations_AddChannelEncryptionEnvelope_Down_ + commentId: Overload:EchoHub.Server.Data.Migrations.AddChannelEncryptionEnvelope.Down + fullName: EchoHub.Server.Data.Migrations.AddChannelEncryptionEnvelope.Down + nameWithType: AddChannelEncryptionEnvelope.Down +- uid: EchoHub.Server.Data.Migrations.AddChannelEncryptionEnvelope.Up(Microsoft.EntityFrameworkCore.Migrations.MigrationBuilder) + name: Up(MigrationBuilder) + href: api/server/EchoHub.Server.Data.Migrations.AddChannelEncryptionEnvelope.html#EchoHub_Server_Data_Migrations_AddChannelEncryptionEnvelope_Up_Microsoft_EntityFrameworkCore_Migrations_MigrationBuilder_ + commentId: M:EchoHub.Server.Data.Migrations.AddChannelEncryptionEnvelope.Up(Microsoft.EntityFrameworkCore.Migrations.MigrationBuilder) + fullName: EchoHub.Server.Data.Migrations.AddChannelEncryptionEnvelope.Up(Microsoft.EntityFrameworkCore.Migrations.MigrationBuilder) + nameWithType: AddChannelEncryptionEnvelope.Up(MigrationBuilder) +- uid: EchoHub.Server.Data.Migrations.AddChannelEncryptionEnvelope.Up* + name: Up + href: api/server/EchoHub.Server.Data.Migrations.AddChannelEncryptionEnvelope.html#EchoHub_Server_Data_Migrations_AddChannelEncryptionEnvelope_Up_ + commentId: Overload:EchoHub.Server.Data.Migrations.AddChannelEncryptionEnvelope.Up + fullName: EchoHub.Server.Data.Migrations.AddChannelEncryptionEnvelope.Up + nameWithType: AddChannelEncryptionEnvelope.Up - uid: EchoHub.Server.Data.Migrations.AddChannelIsPublic name: AddChannelIsPublic href: api/server/EchoHub.Server.Data.Migrations.AddChannelIsPublic.html @@ -14707,6 +17059,66 @@ references: commentId: Overload:EchoHub.Server.Data.Migrations.AddChannelMembership.Up fullName: EchoHub.Server.Data.Migrations.AddChannelMembership.Up nameWithType: AddChannelMembership.Up +- uid: EchoHub.Server.Data.Migrations.AddChannelPasswordHash + name: AddChannelPasswordHash + href: api/server/EchoHub.Server.Data.Migrations.AddChannelPasswordHash.html + commentId: T:EchoHub.Server.Data.Migrations.AddChannelPasswordHash + fullName: EchoHub.Server.Data.Migrations.AddChannelPasswordHash + nameWithType: AddChannelPasswordHash +- uid: EchoHub.Server.Data.Migrations.AddChannelPasswordHash.#ctor + name: AddChannelPasswordHash() + href: api/server/EchoHub.Server.Data.Migrations.AddChannelPasswordHash.html#EchoHub_Server_Data_Migrations_AddChannelPasswordHash__ctor + commentId: M:EchoHub.Server.Data.Migrations.AddChannelPasswordHash.#ctor + name.vb: New() + fullName: EchoHub.Server.Data.Migrations.AddChannelPasswordHash.AddChannelPasswordHash() + fullName.vb: EchoHub.Server.Data.Migrations.AddChannelPasswordHash.New() + nameWithType: AddChannelPasswordHash.AddChannelPasswordHash() + nameWithType.vb: AddChannelPasswordHash.New() +- uid: EchoHub.Server.Data.Migrations.AddChannelPasswordHash.#ctor* + name: AddChannelPasswordHash + href: api/server/EchoHub.Server.Data.Migrations.AddChannelPasswordHash.html#EchoHub_Server_Data_Migrations_AddChannelPasswordHash__ctor_ + commentId: Overload:EchoHub.Server.Data.Migrations.AddChannelPasswordHash.#ctor + name.vb: New + fullName: EchoHub.Server.Data.Migrations.AddChannelPasswordHash.AddChannelPasswordHash + fullName.vb: EchoHub.Server.Data.Migrations.AddChannelPasswordHash.New + nameWithType: AddChannelPasswordHash.AddChannelPasswordHash + nameWithType.vb: AddChannelPasswordHash.New +- uid: EchoHub.Server.Data.Migrations.AddChannelPasswordHash.BuildTargetModel(Microsoft.EntityFrameworkCore.ModelBuilder) + name: BuildTargetModel(ModelBuilder) + href: api/server/EchoHub.Server.Data.Migrations.AddChannelPasswordHash.html#EchoHub_Server_Data_Migrations_AddChannelPasswordHash_BuildTargetModel_Microsoft_EntityFrameworkCore_ModelBuilder_ + commentId: M:EchoHub.Server.Data.Migrations.AddChannelPasswordHash.BuildTargetModel(Microsoft.EntityFrameworkCore.ModelBuilder) + fullName: EchoHub.Server.Data.Migrations.AddChannelPasswordHash.BuildTargetModel(Microsoft.EntityFrameworkCore.ModelBuilder) + nameWithType: AddChannelPasswordHash.BuildTargetModel(ModelBuilder) +- uid: EchoHub.Server.Data.Migrations.AddChannelPasswordHash.BuildTargetModel* + name: BuildTargetModel + href: api/server/EchoHub.Server.Data.Migrations.AddChannelPasswordHash.html#EchoHub_Server_Data_Migrations_AddChannelPasswordHash_BuildTargetModel_ + commentId: Overload:EchoHub.Server.Data.Migrations.AddChannelPasswordHash.BuildTargetModel + fullName: EchoHub.Server.Data.Migrations.AddChannelPasswordHash.BuildTargetModel + nameWithType: AddChannelPasswordHash.BuildTargetModel +- uid: EchoHub.Server.Data.Migrations.AddChannelPasswordHash.Down(Microsoft.EntityFrameworkCore.Migrations.MigrationBuilder) + name: Down(MigrationBuilder) + href: api/server/EchoHub.Server.Data.Migrations.AddChannelPasswordHash.html#EchoHub_Server_Data_Migrations_AddChannelPasswordHash_Down_Microsoft_EntityFrameworkCore_Migrations_MigrationBuilder_ + commentId: M:EchoHub.Server.Data.Migrations.AddChannelPasswordHash.Down(Microsoft.EntityFrameworkCore.Migrations.MigrationBuilder) + fullName: EchoHub.Server.Data.Migrations.AddChannelPasswordHash.Down(Microsoft.EntityFrameworkCore.Migrations.MigrationBuilder) + nameWithType: AddChannelPasswordHash.Down(MigrationBuilder) +- uid: EchoHub.Server.Data.Migrations.AddChannelPasswordHash.Down* + name: Down + href: api/server/EchoHub.Server.Data.Migrations.AddChannelPasswordHash.html#EchoHub_Server_Data_Migrations_AddChannelPasswordHash_Down_ + commentId: Overload:EchoHub.Server.Data.Migrations.AddChannelPasswordHash.Down + fullName: EchoHub.Server.Data.Migrations.AddChannelPasswordHash.Down + nameWithType: AddChannelPasswordHash.Down +- uid: EchoHub.Server.Data.Migrations.AddChannelPasswordHash.Up(Microsoft.EntityFrameworkCore.Migrations.MigrationBuilder) + name: Up(MigrationBuilder) + href: api/server/EchoHub.Server.Data.Migrations.AddChannelPasswordHash.html#EchoHub_Server_Data_Migrations_AddChannelPasswordHash_Up_Microsoft_EntityFrameworkCore_Migrations_MigrationBuilder_ + commentId: M:EchoHub.Server.Data.Migrations.AddChannelPasswordHash.Up(Microsoft.EntityFrameworkCore.Migrations.MigrationBuilder) + fullName: EchoHub.Server.Data.Migrations.AddChannelPasswordHash.Up(Microsoft.EntityFrameworkCore.Migrations.MigrationBuilder) + nameWithType: AddChannelPasswordHash.Up(MigrationBuilder) +- uid: EchoHub.Server.Data.Migrations.AddChannelPasswordHash.Up* + name: Up + href: api/server/EchoHub.Server.Data.Migrations.AddChannelPasswordHash.html#EchoHub_Server_Data_Migrations_AddChannelPasswordHash_Up_ + commentId: Overload:EchoHub.Server.Data.Migrations.AddChannelPasswordHash.Up + fullName: EchoHub.Server.Data.Migrations.AddChannelPasswordHash.Up + nameWithType: AddChannelPasswordHash.Up - uid: EchoHub.Server.Data.Migrations.AddEncryptionSupport name: AddEncryptionSupport href: api/server/EchoHub.Server.Data.Migrations.AddEncryptionSupport.html @@ -14767,6 +17179,66 @@ references: commentId: Overload:EchoHub.Server.Data.Migrations.AddEncryptionSupport.Up fullName: EchoHub.Server.Data.Migrations.AddEncryptionSupport.Up nameWithType: AddEncryptionSupport.Up +- uid: EchoHub.Server.Data.Migrations.AddMessageAttachments + name: AddMessageAttachments + href: api/server/EchoHub.Server.Data.Migrations.AddMessageAttachments.html + commentId: T:EchoHub.Server.Data.Migrations.AddMessageAttachments + fullName: EchoHub.Server.Data.Migrations.AddMessageAttachments + nameWithType: AddMessageAttachments +- uid: EchoHub.Server.Data.Migrations.AddMessageAttachments.#ctor + name: AddMessageAttachments() + href: api/server/EchoHub.Server.Data.Migrations.AddMessageAttachments.html#EchoHub_Server_Data_Migrations_AddMessageAttachments__ctor + commentId: M:EchoHub.Server.Data.Migrations.AddMessageAttachments.#ctor + name.vb: New() + fullName: EchoHub.Server.Data.Migrations.AddMessageAttachments.AddMessageAttachments() + fullName.vb: EchoHub.Server.Data.Migrations.AddMessageAttachments.New() + nameWithType: AddMessageAttachments.AddMessageAttachments() + nameWithType.vb: AddMessageAttachments.New() +- uid: EchoHub.Server.Data.Migrations.AddMessageAttachments.#ctor* + name: AddMessageAttachments + href: api/server/EchoHub.Server.Data.Migrations.AddMessageAttachments.html#EchoHub_Server_Data_Migrations_AddMessageAttachments__ctor_ + commentId: Overload:EchoHub.Server.Data.Migrations.AddMessageAttachments.#ctor + name.vb: New + fullName: EchoHub.Server.Data.Migrations.AddMessageAttachments.AddMessageAttachments + fullName.vb: EchoHub.Server.Data.Migrations.AddMessageAttachments.New + nameWithType: AddMessageAttachments.AddMessageAttachments + nameWithType.vb: AddMessageAttachments.New +- uid: EchoHub.Server.Data.Migrations.AddMessageAttachments.BuildTargetModel(Microsoft.EntityFrameworkCore.ModelBuilder) + name: BuildTargetModel(ModelBuilder) + href: api/server/EchoHub.Server.Data.Migrations.AddMessageAttachments.html#EchoHub_Server_Data_Migrations_AddMessageAttachments_BuildTargetModel_Microsoft_EntityFrameworkCore_ModelBuilder_ + commentId: M:EchoHub.Server.Data.Migrations.AddMessageAttachments.BuildTargetModel(Microsoft.EntityFrameworkCore.ModelBuilder) + fullName: EchoHub.Server.Data.Migrations.AddMessageAttachments.BuildTargetModel(Microsoft.EntityFrameworkCore.ModelBuilder) + nameWithType: AddMessageAttachments.BuildTargetModel(ModelBuilder) +- uid: EchoHub.Server.Data.Migrations.AddMessageAttachments.BuildTargetModel* + name: BuildTargetModel + href: api/server/EchoHub.Server.Data.Migrations.AddMessageAttachments.html#EchoHub_Server_Data_Migrations_AddMessageAttachments_BuildTargetModel_ + commentId: Overload:EchoHub.Server.Data.Migrations.AddMessageAttachments.BuildTargetModel + fullName: EchoHub.Server.Data.Migrations.AddMessageAttachments.BuildTargetModel + nameWithType: AddMessageAttachments.BuildTargetModel +- uid: EchoHub.Server.Data.Migrations.AddMessageAttachments.Down(Microsoft.EntityFrameworkCore.Migrations.MigrationBuilder) + name: Down(MigrationBuilder) + href: api/server/EchoHub.Server.Data.Migrations.AddMessageAttachments.html#EchoHub_Server_Data_Migrations_AddMessageAttachments_Down_Microsoft_EntityFrameworkCore_Migrations_MigrationBuilder_ + commentId: M:EchoHub.Server.Data.Migrations.AddMessageAttachments.Down(Microsoft.EntityFrameworkCore.Migrations.MigrationBuilder) + fullName: EchoHub.Server.Data.Migrations.AddMessageAttachments.Down(Microsoft.EntityFrameworkCore.Migrations.MigrationBuilder) + nameWithType: AddMessageAttachments.Down(MigrationBuilder) +- uid: EchoHub.Server.Data.Migrations.AddMessageAttachments.Down* + name: Down + href: api/server/EchoHub.Server.Data.Migrations.AddMessageAttachments.html#EchoHub_Server_Data_Migrations_AddMessageAttachments_Down_ + commentId: Overload:EchoHub.Server.Data.Migrations.AddMessageAttachments.Down + fullName: EchoHub.Server.Data.Migrations.AddMessageAttachments.Down + nameWithType: AddMessageAttachments.Down +- uid: EchoHub.Server.Data.Migrations.AddMessageAttachments.Up(Microsoft.EntityFrameworkCore.Migrations.MigrationBuilder) + name: Up(MigrationBuilder) + href: api/server/EchoHub.Server.Data.Migrations.AddMessageAttachments.html#EchoHub_Server_Data_Migrations_AddMessageAttachments_Up_Microsoft_EntityFrameworkCore_Migrations_MigrationBuilder_ + commentId: M:EchoHub.Server.Data.Migrations.AddMessageAttachments.Up(Microsoft.EntityFrameworkCore.Migrations.MigrationBuilder) + fullName: EchoHub.Server.Data.Migrations.AddMessageAttachments.Up(Microsoft.EntityFrameworkCore.Migrations.MigrationBuilder) + nameWithType: AddMessageAttachments.Up(MigrationBuilder) +- uid: EchoHub.Server.Data.Migrations.AddMessageAttachments.Up* + name: Up + href: api/server/EchoHub.Server.Data.Migrations.AddMessageAttachments.html#EchoHub_Server_Data_Migrations_AddMessageAttachments_Up_ + commentId: Overload:EchoHub.Server.Data.Migrations.AddMessageAttachments.Up + fullName: EchoHub.Server.Data.Migrations.AddMessageAttachments.Up + nameWithType: AddMessageAttachments.Up - uid: EchoHub.Server.Data.Migrations.AddMessageEmbed name: AddMessageEmbed href: api/server/EchoHub.Server.Data.Migrations.AddMessageEmbed.html @@ -14959,15 +17431,15 @@ references: commentId: T:EchoHub.Server.Hubs.ChatHub fullName: EchoHub.Server.Hubs.ChatHub nameWithType: ChatHub -- uid: EchoHub.Server.Hubs.ChatHub.#ctor(EchoHub.Core.Contracts.IChatService,Microsoft.Extensions.Logging.ILogger{EchoHub.Server.Hubs.ChatHub}) - name: ChatHub(IChatService, ILogger) - href: api/server/EchoHub.Server.Hubs.ChatHub.html#EchoHub_Server_Hubs_ChatHub__ctor_EchoHub_Core_Contracts_IChatService_Microsoft_Extensions_Logging_ILogger_EchoHub_Server_Hubs_ChatHub__ - commentId: M:EchoHub.Server.Hubs.ChatHub.#ctor(EchoHub.Core.Contracts.IChatService,Microsoft.Extensions.Logging.ILogger{EchoHub.Server.Hubs.ChatHub}) - name.vb: New(IChatService, ILogger(Of ChatHub)) - fullName: EchoHub.Server.Hubs.ChatHub.ChatHub(EchoHub.Core.Contracts.IChatService, Microsoft.Extensions.Logging.ILogger) - fullName.vb: EchoHub.Server.Hubs.ChatHub.New(EchoHub.Core.Contracts.IChatService, Microsoft.Extensions.Logging.ILogger(Of EchoHub.Server.Hubs.ChatHub)) - nameWithType: ChatHub.ChatHub(IChatService, ILogger) - nameWithType.vb: ChatHub.New(IChatService, ILogger(Of ChatHub)) +- uid: EchoHub.Server.Hubs.ChatHub.#ctor(EchoHub.Core.Contracts.IChatService,EchoHub.Core.Contracts.IChannelService,Microsoft.Extensions.Logging.ILogger{EchoHub.Server.Hubs.ChatHub}) + name: ChatHub(IChatService, IChannelService, ILogger) + href: api/server/EchoHub.Server.Hubs.ChatHub.html#EchoHub_Server_Hubs_ChatHub__ctor_EchoHub_Core_Contracts_IChatService_EchoHub_Core_Contracts_IChannelService_Microsoft_Extensions_Logging_ILogger_EchoHub_Server_Hubs_ChatHub__ + commentId: M:EchoHub.Server.Hubs.ChatHub.#ctor(EchoHub.Core.Contracts.IChatService,EchoHub.Core.Contracts.IChannelService,Microsoft.Extensions.Logging.ILogger{EchoHub.Server.Hubs.ChatHub}) + name.vb: New(IChatService, IChannelService, ILogger(Of ChatHub)) + fullName: EchoHub.Server.Hubs.ChatHub.ChatHub(EchoHub.Core.Contracts.IChatService, EchoHub.Core.Contracts.IChannelService, Microsoft.Extensions.Logging.ILogger) + fullName.vb: EchoHub.Server.Hubs.ChatHub.New(EchoHub.Core.Contracts.IChatService, EchoHub.Core.Contracts.IChannelService, Microsoft.Extensions.Logging.ILogger(Of EchoHub.Server.Hubs.ChatHub)) + nameWithType: ChatHub.ChatHub(IChatService, IChannelService, ILogger) + nameWithType.vb: ChatHub.New(IChatService, IChannelService, ILogger(Of ChatHub)) - uid: EchoHub.Server.Hubs.ChatHub.#ctor* name: ChatHub href: api/server/EchoHub.Server.Hubs.ChatHub.html#EchoHub_Server_Hubs_ChatHub__ctor_ @@ -15007,15 +17479,15 @@ references: commentId: Overload:EchoHub.Server.Hubs.ChatHub.GetOnlineUsers fullName: EchoHub.Server.Hubs.ChatHub.GetOnlineUsers nameWithType: ChatHub.GetOnlineUsers -- uid: EchoHub.Server.Hubs.ChatHub.JoinChannel(System.String) - name: JoinChannel(string) - href: api/server/EchoHub.Server.Hubs.ChatHub.html#EchoHub_Server_Hubs_ChatHub_JoinChannel_System_String_ - commentId: M:EchoHub.Server.Hubs.ChatHub.JoinChannel(System.String) - name.vb: JoinChannel(String) - fullName: EchoHub.Server.Hubs.ChatHub.JoinChannel(string) - fullName.vb: EchoHub.Server.Hubs.ChatHub.JoinChannel(String) - nameWithType: ChatHub.JoinChannel(string) - nameWithType.vb: ChatHub.JoinChannel(String) +- uid: EchoHub.Server.Hubs.ChatHub.JoinChannel(System.String,System.String) + name: JoinChannel(string, string?) + href: api/server/EchoHub.Server.Hubs.ChatHub.html#EchoHub_Server_Hubs_ChatHub_JoinChannel_System_String_System_String_ + commentId: M:EchoHub.Server.Hubs.ChatHub.JoinChannel(System.String,System.String) + name.vb: JoinChannel(String, String) + fullName: EchoHub.Server.Hubs.ChatHub.JoinChannel(string, string?) + fullName.vb: EchoHub.Server.Hubs.ChatHub.JoinChannel(String, String) + nameWithType: ChatHub.JoinChannel(string, string?) + nameWithType.vb: ChatHub.JoinChannel(String, String) - uid: EchoHub.Server.Hubs.ChatHub.JoinChannel* name: JoinChannel href: api/server/EchoHub.Server.Hubs.ChatHub.html#EchoHub_Server_Hubs_ChatHub_JoinChannel_ @@ -15859,6 +18331,12 @@ references: commentId: F:EchoHub.Server.Irc.IrcNumericReply.ERR_ALREADYREGISTERED fullName: EchoHub.Server.Irc.IrcNumericReply.ERR_ALREADYREGISTERED nameWithType: IrcNumericReply.ERR_ALREADYREGISTERED +- uid: EchoHub.Server.Irc.IrcNumericReply.ERR_BADCHANNELKEY + name: ERR_BADCHANNELKEY + href: api/server-irc/EchoHub.Server.Irc.IrcNumericReply.html#EchoHub_Server_Irc_IrcNumericReply_ERR_BADCHANNELKEY + commentId: F:EchoHub.Server.Irc.IrcNumericReply.ERR_BADCHANNELKEY + fullName: EchoHub.Server.Irc.IrcNumericReply.ERR_BADCHANNELKEY + nameWithType: IrcNumericReply.ERR_BADCHANNELKEY - uid: EchoHub.Server.Irc.IrcNumericReply.ERR_CANNOTSENDTOCHAN name: ERR_CANNOTSENDTOCHAN href: api/server-irc/EchoHub.Server.Irc.IrcNumericReply.html#EchoHub_Server_Irc_IrcNumericReply_ERR_CANNOTSENDTOCHAN @@ -15877,6 +18355,12 @@ references: commentId: F:EchoHub.Server.Irc.IrcNumericReply.ERR_ERRONEUSNICKNAME fullName: EchoHub.Server.Irc.IrcNumericReply.ERR_ERRONEUSNICKNAME nameWithType: IrcNumericReply.ERR_ERRONEUSNICKNAME +- uid: EchoHub.Server.Irc.IrcNumericReply.ERR_KEYSET + name: ERR_KEYSET + href: api/server-irc/EchoHub.Server.Irc.IrcNumericReply.html#EchoHub_Server_Irc_IrcNumericReply_ERR_KEYSET + commentId: F:EchoHub.Server.Irc.IrcNumericReply.ERR_KEYSET + fullName: EchoHub.Server.Irc.IrcNumericReply.ERR_KEYSET + nameWithType: IrcNumericReply.ERR_KEYSET - uid: EchoHub.Server.Irc.IrcNumericReply.ERR_NEEDMOREPARAMS name: ERR_NEEDMOREPARAMS href: api/server-irc/EchoHub.Server.Irc.IrcNumericReply.html#EchoHub_Server_Irc_IrcNumericReply_ERR_NEEDMOREPARAMS @@ -15943,6 +18427,12 @@ references: commentId: F:EchoHub.Server.Irc.IrcNumericReply.ERR_UNKNOWNCOMMAND fullName: EchoHub.Server.Irc.IrcNumericReply.ERR_UNKNOWNCOMMAND nameWithType: IrcNumericReply.ERR_UNKNOWNCOMMAND +- uid: EchoHub.Server.Irc.IrcNumericReply.ERR_UNKNOWNMODE + name: ERR_UNKNOWNMODE + href: api/server-irc/EchoHub.Server.Irc.IrcNumericReply.html#EchoHub_Server_Irc_IrcNumericReply_ERR_UNKNOWNMODE + commentId: F:EchoHub.Server.Irc.IrcNumericReply.ERR_UNKNOWNMODE + fullName: EchoHub.Server.Irc.IrcNumericReply.ERR_UNKNOWNMODE + nameWithType: IrcNumericReply.ERR_UNKNOWNMODE - uid: EchoHub.Server.Irc.IrcNumericReply.RPL_AWAY name: RPL_AWAY href: api/server-irc/EchoHub.Server.Irc.IrcNumericReply.html#EchoHub_Server_Irc_IrcNumericReply_RPL_AWAY @@ -15961,6 +18451,12 @@ references: commentId: F:EchoHub.Server.Irc.IrcNumericReply.RPL_CREATED fullName: EchoHub.Server.Irc.IrcNumericReply.RPL_CREATED nameWithType: IrcNumericReply.RPL_CREATED +- uid: EchoHub.Server.Irc.IrcNumericReply.RPL_ENDOFBANLIST + name: RPL_ENDOFBANLIST + href: api/server-irc/EchoHub.Server.Irc.IrcNumericReply.html#EchoHub_Server_Irc_IrcNumericReply_RPL_ENDOFBANLIST + commentId: F:EchoHub.Server.Irc.IrcNumericReply.RPL_ENDOFBANLIST + fullName: EchoHub.Server.Irc.IrcNumericReply.RPL_ENDOFBANLIST + nameWithType: IrcNumericReply.RPL_ENDOFBANLIST - uid: EchoHub.Server.Irc.IrcNumericReply.RPL_ENDOFMOTD name: RPL_ENDOFMOTD href: api/server-irc/EchoHub.Server.Irc.IrcNumericReply.html#EchoHub_Server_Irc_IrcNumericReply_RPL_ENDOFMOTD @@ -16285,15 +18781,15 @@ references: fullName.vb: EchoHub.Server.Services.ChannelService.New nameWithType: ChannelService.ChannelService nameWithType.vb: ChannelService.New -- uid: EchoHub.Server.Services.ChannelService.CreateChannelAsync(System.Guid,System.String,System.String,System.Boolean) - name: CreateChannelAsync(Guid, string, string?, bool) - href: api/server/EchoHub.Server.Services.ChannelService.html#EchoHub_Server_Services_ChannelService_CreateChannelAsync_System_Guid_System_String_System_String_System_Boolean_ - commentId: M:EchoHub.Server.Services.ChannelService.CreateChannelAsync(System.Guid,System.String,System.String,System.Boolean) - name.vb: CreateChannelAsync(Guid, String, String, Boolean) - fullName: EchoHub.Server.Services.ChannelService.CreateChannelAsync(System.Guid, string, string?, bool) - fullName.vb: EchoHub.Server.Services.ChannelService.CreateChannelAsync(System.Guid, String, String, Boolean) - nameWithType: ChannelService.CreateChannelAsync(Guid, string, string?, bool) - nameWithType.vb: ChannelService.CreateChannelAsync(Guid, String, String, Boolean) +- uid: EchoHub.Server.Services.ChannelService.CreateChannelAsync(System.Guid,System.String,System.String,System.Boolean,System.String,System.String,System.String) + name: CreateChannelAsync(Guid, string, string?, bool, string?, string?, string?) + href: api/server/EchoHub.Server.Services.ChannelService.html#EchoHub_Server_Services_ChannelService_CreateChannelAsync_System_Guid_System_String_System_String_System_Boolean_System_String_System_String_System_String_ + commentId: M:EchoHub.Server.Services.ChannelService.CreateChannelAsync(System.Guid,System.String,System.String,System.Boolean,System.String,System.String,System.String) + name.vb: CreateChannelAsync(Guid, String, String, Boolean, String, String, String) + fullName: EchoHub.Server.Services.ChannelService.CreateChannelAsync(System.Guid, string, string?, bool, string?, string?, string?) + fullName.vb: EchoHub.Server.Services.ChannelService.CreateChannelAsync(System.Guid, String, String, Boolean, String, String, String) + nameWithType: ChannelService.CreateChannelAsync(Guid, string, string?, bool, string?, string?, string?) + nameWithType.vb: ChannelService.CreateChannelAsync(Guid, String, String, Boolean, String, String, String) - uid: EchoHub.Server.Services.ChannelService.CreateChannelAsync* name: CreateChannelAsync href: api/server/EchoHub.Server.Services.ChannelService.html#EchoHub_Server_Services_ChannelService_CreateChannelAsync_ @@ -16315,15 +18811,15 @@ references: commentId: Overload:EchoHub.Server.Services.ChannelService.DeleteChannelAsync fullName: EchoHub.Server.Services.ChannelService.DeleteChannelAsync nameWithType: ChannelService.DeleteChannelAsync -- uid: EchoHub.Server.Services.ChannelService.EnsureChannelMembershipAsync(System.Guid,System.String) - name: EnsureChannelMembershipAsync(Guid, string) - href: api/server/EchoHub.Server.Services.ChannelService.html#EchoHub_Server_Services_ChannelService_EnsureChannelMembershipAsync_System_Guid_System_String_ - commentId: M:EchoHub.Server.Services.ChannelService.EnsureChannelMembershipAsync(System.Guid,System.String) - name.vb: EnsureChannelMembershipAsync(Guid, String) - fullName: EchoHub.Server.Services.ChannelService.EnsureChannelMembershipAsync(System.Guid, string) - fullName.vb: EchoHub.Server.Services.ChannelService.EnsureChannelMembershipAsync(System.Guid, String) - nameWithType: ChannelService.EnsureChannelMembershipAsync(Guid, string) - nameWithType.vb: ChannelService.EnsureChannelMembershipAsync(Guid, String) +- uid: EchoHub.Server.Services.ChannelService.EnsureChannelMembershipAsync(System.Guid,System.String,System.String) + name: EnsureChannelMembershipAsync(Guid, string, string?) + href: api/server/EchoHub.Server.Services.ChannelService.html#EchoHub_Server_Services_ChannelService_EnsureChannelMembershipAsync_System_Guid_System_String_System_String_ + commentId: M:EchoHub.Server.Services.ChannelService.EnsureChannelMembershipAsync(System.Guid,System.String,System.String) + name.vb: EnsureChannelMembershipAsync(Guid, String, String) + fullName: EchoHub.Server.Services.ChannelService.EnsureChannelMembershipAsync(System.Guid, string, string?) + fullName.vb: EchoHub.Server.Services.ChannelService.EnsureChannelMembershipAsync(System.Guid, String, String) + nameWithType: ChannelService.EnsureChannelMembershipAsync(Guid, string, string?) + nameWithType.vb: ChannelService.EnsureChannelMembershipAsync(Guid, String, String) - uid: EchoHub.Server.Services.ChannelService.EnsureChannelMembershipAsync* name: EnsureChannelMembershipAsync href: api/server/EchoHub.Server.Services.ChannelService.html#EchoHub_Server_Services_ChannelService_EnsureChannelMembershipAsync_ @@ -16345,6 +18841,36 @@ references: commentId: Overload:EchoHub.Server.Services.ChannelService.GetChannelByNameAsync fullName: EchoHub.Server.Services.ChannelService.GetChannelByNameAsync nameWithType: ChannelService.GetChannelByNameAsync +- uid: EchoHub.Server.Services.ChannelService.GetChannelCryptoAsync(System.String) + name: GetChannelCryptoAsync(string) + href: api/server/EchoHub.Server.Services.ChannelService.html#EchoHub_Server_Services_ChannelService_GetChannelCryptoAsync_System_String_ + commentId: M:EchoHub.Server.Services.ChannelService.GetChannelCryptoAsync(System.String) + name.vb: GetChannelCryptoAsync(String) + fullName: EchoHub.Server.Services.ChannelService.GetChannelCryptoAsync(string) + fullName.vb: EchoHub.Server.Services.ChannelService.GetChannelCryptoAsync(String) + nameWithType: ChannelService.GetChannelCryptoAsync(string) + nameWithType.vb: ChannelService.GetChannelCryptoAsync(String) +- uid: EchoHub.Server.Services.ChannelService.GetChannelCryptoAsync* + name: GetChannelCryptoAsync + href: api/server/EchoHub.Server.Services.ChannelService.html#EchoHub_Server_Services_ChannelService_GetChannelCryptoAsync_ + commentId: Overload:EchoHub.Server.Services.ChannelService.GetChannelCryptoAsync + fullName: EchoHub.Server.Services.ChannelService.GetChannelCryptoAsync + nameWithType: ChannelService.GetChannelCryptoAsync +- uid: EchoHub.Server.Services.ChannelService.GetChannelKeyEnvelopeAsync(System.String) + name: GetChannelKeyEnvelopeAsync(string) + href: api/server/EchoHub.Server.Services.ChannelService.html#EchoHub_Server_Services_ChannelService_GetChannelKeyEnvelopeAsync_System_String_ + commentId: M:EchoHub.Server.Services.ChannelService.GetChannelKeyEnvelopeAsync(System.String) + name.vb: GetChannelKeyEnvelopeAsync(String) + fullName: EchoHub.Server.Services.ChannelService.GetChannelKeyEnvelopeAsync(string) + fullName.vb: EchoHub.Server.Services.ChannelService.GetChannelKeyEnvelopeAsync(String) + nameWithType: ChannelService.GetChannelKeyEnvelopeAsync(string) + nameWithType.vb: ChannelService.GetChannelKeyEnvelopeAsync(String) +- uid: EchoHub.Server.Services.ChannelService.GetChannelKeyEnvelopeAsync* + name: GetChannelKeyEnvelopeAsync + href: api/server/EchoHub.Server.Services.ChannelService.html#EchoHub_Server_Services_ChannelService_GetChannelKeyEnvelopeAsync_ + commentId: Overload:EchoHub.Server.Services.ChannelService.GetChannelKeyEnvelopeAsync + fullName: EchoHub.Server.Services.ChannelService.GetChannelKeyEnvelopeAsync + nameWithType: ChannelService.GetChannelKeyEnvelopeAsync - uid: EchoHub.Server.Services.ChannelService.GetChannelListAsync name: GetChannelListAsync() href: api/server/EchoHub.Server.Services.ChannelService.html#EchoHub_Server_Services_ChannelService_GetChannelListAsync @@ -16387,6 +18913,36 @@ references: commentId: Overload:EchoHub.Server.Services.ChannelService.GetChannelsAsync fullName: EchoHub.Server.Services.ChannelService.GetChannelsAsync nameWithType: ChannelService.GetChannelsAsync +- uid: EchoHub.Server.Services.ChannelService.RekeyChannelAsync(System.Guid,System.String,System.String,System.String,System.String,System.String) + name: RekeyChannelAsync(Guid, string, string, string, string, string) + href: api/server/EchoHub.Server.Services.ChannelService.html#EchoHub_Server_Services_ChannelService_RekeyChannelAsync_System_Guid_System_String_System_String_System_String_System_String_System_String_ + commentId: M:EchoHub.Server.Services.ChannelService.RekeyChannelAsync(System.Guid,System.String,System.String,System.String,System.String,System.String) + name.vb: RekeyChannelAsync(Guid, String, String, String, String, String) + fullName: EchoHub.Server.Services.ChannelService.RekeyChannelAsync(System.Guid, string, string, string, string, string) + fullName.vb: EchoHub.Server.Services.ChannelService.RekeyChannelAsync(System.Guid, String, String, String, String, String) + nameWithType: ChannelService.RekeyChannelAsync(Guid, string, string, string, string, string) + nameWithType.vb: ChannelService.RekeyChannelAsync(Guid, String, String, String, String, String) +- uid: EchoHub.Server.Services.ChannelService.RekeyChannelAsync* + name: RekeyChannelAsync + href: api/server/EchoHub.Server.Services.ChannelService.html#EchoHub_Server_Services_ChannelService_RekeyChannelAsync_ + commentId: Overload:EchoHub.Server.Services.ChannelService.RekeyChannelAsync + fullName: EchoHub.Server.Services.ChannelService.RekeyChannelAsync + nameWithType: ChannelService.RekeyChannelAsync +- uid: EchoHub.Server.Services.ChannelService.SetChannelPasswordAsync(System.Guid,System.String,System.String) + name: SetChannelPasswordAsync(Guid, string, string?) + href: api/server/EchoHub.Server.Services.ChannelService.html#EchoHub_Server_Services_ChannelService_SetChannelPasswordAsync_System_Guid_System_String_System_String_ + commentId: M:EchoHub.Server.Services.ChannelService.SetChannelPasswordAsync(System.Guid,System.String,System.String) + name.vb: SetChannelPasswordAsync(Guid, String, String) + fullName: EchoHub.Server.Services.ChannelService.SetChannelPasswordAsync(System.Guid, string, string?) + fullName.vb: EchoHub.Server.Services.ChannelService.SetChannelPasswordAsync(System.Guid, String, String) + nameWithType: ChannelService.SetChannelPasswordAsync(Guid, string, string?) + nameWithType.vb: ChannelService.SetChannelPasswordAsync(Guid, String, String) +- uid: EchoHub.Server.Services.ChannelService.SetChannelPasswordAsync* + name: SetChannelPasswordAsync + href: api/server/EchoHub.Server.Services.ChannelService.html#EchoHub_Server_Services_ChannelService_SetChannelPasswordAsync_ + commentId: Overload:EchoHub.Server.Services.ChannelService.SetChannelPasswordAsync + fullName: EchoHub.Server.Services.ChannelService.SetChannelPasswordAsync + nameWithType: ChannelService.SetChannelPasswordAsync - uid: EchoHub.Server.Services.ChannelService.UpdateTopicAsync(System.Guid,System.String,System.String) name: UpdateTopicAsync(Guid, string, string?) href: api/server/EchoHub.Server.Services.ChannelService.html#EchoHub_Server_Services_ChannelService_UpdateTopicAsync_System_Guid_System_String_System_String_ @@ -16408,15 +18964,15 @@ references: commentId: T:EchoHub.Server.Services.ChatService fullName: EchoHub.Server.Services.ChatService nameWithType: ChatService -- uid: EchoHub.Server.Services.ChatService.#ctor(Microsoft.Extensions.DependencyInjection.IServiceScopeFactory,EchoHub.Server.Services.PresenceTracker,System.Collections.Generic.IEnumerable{EchoHub.Core.Contracts.IChatBroadcaster},EchoHub.Server.Services.LinkEmbedService,EchoHub.Core.Contracts.IMessageEncryptionService,EchoHub.Core.Contracts.IChannelService,Microsoft.Extensions.Logging.ILogger{EchoHub.Server.Services.ChatService}) - name: ChatService(IServiceScopeFactory, PresenceTracker, IEnumerable, LinkEmbedService, IMessageEncryptionService, IChannelService, ILogger) - href: api/server/EchoHub.Server.Services.ChatService.html#EchoHub_Server_Services_ChatService__ctor_Microsoft_Extensions_DependencyInjection_IServiceScopeFactory_EchoHub_Server_Services_PresenceTracker_System_Collections_Generic_IEnumerable_EchoHub_Core_Contracts_IChatBroadcaster__EchoHub_Server_Services_LinkEmbedService_EchoHub_Core_Contracts_IMessageEncryptionService_EchoHub_Core_Contracts_IChannelService_Microsoft_Extensions_Logging_ILogger_EchoHub_Server_Services_ChatService__ - commentId: M:EchoHub.Server.Services.ChatService.#ctor(Microsoft.Extensions.DependencyInjection.IServiceScopeFactory,EchoHub.Server.Services.PresenceTracker,System.Collections.Generic.IEnumerable{EchoHub.Core.Contracts.IChatBroadcaster},EchoHub.Server.Services.LinkEmbedService,EchoHub.Core.Contracts.IMessageEncryptionService,EchoHub.Core.Contracts.IChannelService,Microsoft.Extensions.Logging.ILogger{EchoHub.Server.Services.ChatService}) - name.vb: New(IServiceScopeFactory, PresenceTracker, IEnumerable(Of IChatBroadcaster), LinkEmbedService, IMessageEncryptionService, IChannelService, ILogger(Of ChatService)) - fullName: EchoHub.Server.Services.ChatService.ChatService(Microsoft.Extensions.DependencyInjection.IServiceScopeFactory, EchoHub.Server.Services.PresenceTracker, System.Collections.Generic.IEnumerable, EchoHub.Server.Services.LinkEmbedService, EchoHub.Core.Contracts.IMessageEncryptionService, EchoHub.Core.Contracts.IChannelService, Microsoft.Extensions.Logging.ILogger) - fullName.vb: EchoHub.Server.Services.ChatService.New(Microsoft.Extensions.DependencyInjection.IServiceScopeFactory, EchoHub.Server.Services.PresenceTracker, System.Collections.Generic.IEnumerable(Of EchoHub.Core.Contracts.IChatBroadcaster), EchoHub.Server.Services.LinkEmbedService, EchoHub.Core.Contracts.IMessageEncryptionService, EchoHub.Core.Contracts.IChannelService, Microsoft.Extensions.Logging.ILogger(Of EchoHub.Server.Services.ChatService)) - nameWithType: ChatService.ChatService(IServiceScopeFactory, PresenceTracker, IEnumerable, LinkEmbedService, IMessageEncryptionService, IChannelService, ILogger) - nameWithType.vb: ChatService.New(IServiceScopeFactory, PresenceTracker, IEnumerable(Of IChatBroadcaster), LinkEmbedService, IMessageEncryptionService, IChannelService, ILogger(Of ChatService)) +- uid: EchoHub.Server.Services.ChatService.#ctor(Microsoft.Extensions.DependencyInjection.IServiceScopeFactory,EchoHub.Server.Services.PresenceTracker,System.Collections.Generic.IEnumerable{EchoHub.Core.Contracts.IChatBroadcaster},EchoHub.Server.Services.LinkEmbedService,EchoHub.Core.Contracts.IMessageEncryptionService,EchoHub.Core.Contracts.IChannelService,EchoHub.Server.Services.FileStorageService,Microsoft.Extensions.Logging.ILogger{EchoHub.Server.Services.ChatService}) + name: ChatService(IServiceScopeFactory, PresenceTracker, IEnumerable, LinkEmbedService, IMessageEncryptionService, IChannelService, FileStorageService, ILogger) + href: api/server/EchoHub.Server.Services.ChatService.html#EchoHub_Server_Services_ChatService__ctor_Microsoft_Extensions_DependencyInjection_IServiceScopeFactory_EchoHub_Server_Services_PresenceTracker_System_Collections_Generic_IEnumerable_EchoHub_Core_Contracts_IChatBroadcaster__EchoHub_Server_Services_LinkEmbedService_EchoHub_Core_Contracts_IMessageEncryptionService_EchoHub_Core_Contracts_IChannelService_EchoHub_Server_Services_FileStorageService_Microsoft_Extensions_Logging_ILogger_EchoHub_Server_Services_ChatService__ + commentId: M:EchoHub.Server.Services.ChatService.#ctor(Microsoft.Extensions.DependencyInjection.IServiceScopeFactory,EchoHub.Server.Services.PresenceTracker,System.Collections.Generic.IEnumerable{EchoHub.Core.Contracts.IChatBroadcaster},EchoHub.Server.Services.LinkEmbedService,EchoHub.Core.Contracts.IMessageEncryptionService,EchoHub.Core.Contracts.IChannelService,EchoHub.Server.Services.FileStorageService,Microsoft.Extensions.Logging.ILogger{EchoHub.Server.Services.ChatService}) + name.vb: New(IServiceScopeFactory, PresenceTracker, IEnumerable(Of IChatBroadcaster), LinkEmbedService, IMessageEncryptionService, IChannelService, FileStorageService, ILogger(Of ChatService)) + fullName: EchoHub.Server.Services.ChatService.ChatService(Microsoft.Extensions.DependencyInjection.IServiceScopeFactory, EchoHub.Server.Services.PresenceTracker, System.Collections.Generic.IEnumerable, EchoHub.Server.Services.LinkEmbedService, EchoHub.Core.Contracts.IMessageEncryptionService, EchoHub.Core.Contracts.IChannelService, EchoHub.Server.Services.FileStorageService, Microsoft.Extensions.Logging.ILogger) + fullName.vb: EchoHub.Server.Services.ChatService.New(Microsoft.Extensions.DependencyInjection.IServiceScopeFactory, EchoHub.Server.Services.PresenceTracker, System.Collections.Generic.IEnumerable(Of EchoHub.Core.Contracts.IChatBroadcaster), EchoHub.Server.Services.LinkEmbedService, EchoHub.Core.Contracts.IMessageEncryptionService, EchoHub.Core.Contracts.IChannelService, EchoHub.Server.Services.FileStorageService, Microsoft.Extensions.Logging.ILogger(Of EchoHub.Server.Services.ChatService)) + nameWithType: ChatService.ChatService(IServiceScopeFactory, PresenceTracker, IEnumerable, LinkEmbedService, IMessageEncryptionService, IChannelService, FileStorageService, ILogger) + nameWithType.vb: ChatService.New(IServiceScopeFactory, PresenceTracker, IEnumerable(Of IChatBroadcaster), LinkEmbedService, IMessageEncryptionService, IChannelService, FileStorageService, ILogger(Of ChatService)) - uid: EchoHub.Server.Services.ChatService.#ctor* name: ChatService href: api/server/EchoHub.Server.Services.ChatService.html#EchoHub_Server_Services_ChatService__ctor_ @@ -16501,15 +19057,15 @@ references: commentId: Overload:EchoHub.Server.Services.ChatService.GetOnlineUsersAsync fullName: EchoHub.Server.Services.ChatService.GetOnlineUsersAsync nameWithType: ChatService.GetOnlineUsersAsync -- uid: EchoHub.Server.Services.ChatService.JoinChannelAsync(System.String,System.Guid,System.String,System.String) - name: JoinChannelAsync(string, Guid, string, string) - href: api/server/EchoHub.Server.Services.ChatService.html#EchoHub_Server_Services_ChatService_JoinChannelAsync_System_String_System_Guid_System_String_System_String_ - commentId: M:EchoHub.Server.Services.ChatService.JoinChannelAsync(System.String,System.Guid,System.String,System.String) - name.vb: JoinChannelAsync(String, Guid, String, String) - fullName: EchoHub.Server.Services.ChatService.JoinChannelAsync(string, System.Guid, string, string) - fullName.vb: EchoHub.Server.Services.ChatService.JoinChannelAsync(String, System.Guid, String, String) - nameWithType: ChatService.JoinChannelAsync(string, Guid, string, string) - nameWithType.vb: ChatService.JoinChannelAsync(String, Guid, String, String) +- uid: EchoHub.Server.Services.ChatService.JoinChannelAsync(System.String,System.Guid,System.String,System.String,System.String) + name: JoinChannelAsync(string, Guid, string, string, string?) + href: api/server/EchoHub.Server.Services.ChatService.html#EchoHub_Server_Services_ChatService_JoinChannelAsync_System_String_System_Guid_System_String_System_String_System_String_ + commentId: M:EchoHub.Server.Services.ChatService.JoinChannelAsync(System.String,System.Guid,System.String,System.String,System.String) + name.vb: JoinChannelAsync(String, Guid, String, String, String) + fullName: EchoHub.Server.Services.ChatService.JoinChannelAsync(string, System.Guid, string, string, string?) + fullName.vb: EchoHub.Server.Services.ChatService.JoinChannelAsync(String, System.Guid, String, String, String) + nameWithType: ChatService.JoinChannelAsync(string, Guid, string, string, string?) + nameWithType.vb: ChatService.JoinChannelAsync(String, Guid, String, String, String) - uid: EchoHub.Server.Services.ChatService.JoinChannelAsync* name: JoinChannelAsync href: api/server/EchoHub.Server.Services.ChatService.html#EchoHub_Server_Services_ChatService_JoinChannelAsync_ @@ -16807,6 +19363,18 @@ references: commentId: Overload:EchoHub.Server.Services.FileStorageService.GetFilePath fullName: EchoHub.Server.Services.FileStorageService.GetFilePath nameWithType: FileStorageService.GetFilePath +- uid: EchoHub.Server.Services.FileStorageService.GetStoredFileIds + name: GetStoredFileIds() + href: api/server/EchoHub.Server.Services.FileStorageService.html#EchoHub_Server_Services_FileStorageService_GetStoredFileIds + commentId: M:EchoHub.Server.Services.FileStorageService.GetStoredFileIds + fullName: EchoHub.Server.Services.FileStorageService.GetStoredFileIds() + nameWithType: FileStorageService.GetStoredFileIds() +- uid: EchoHub.Server.Services.FileStorageService.GetStoredFileIds* + name: GetStoredFileIds + href: api/server/EchoHub.Server.Services.FileStorageService.html#EchoHub_Server_Services_FileStorageService_GetStoredFileIds_ + commentId: Overload:EchoHub.Server.Services.FileStorageService.GetStoredFileIds + fullName: EchoHub.Server.Services.FileStorageService.GetStoredFileIds + nameWithType: FileStorageService.GetStoredFileIds - uid: EchoHub.Server.Services.FileStorageService.SaveFileAsync(System.IO.Stream,System.String) name: SaveFileAsync(Stream, string) href: api/server/EchoHub.Server.Services.FileStorageService.html#EchoHub_Server_Services_FileStorageService_SaveFileAsync_System_IO_Stream_System_String_ @@ -16822,93 +19390,6 @@ references: commentId: Overload:EchoHub.Server.Services.FileStorageService.SaveFileAsync fullName: EchoHub.Server.Services.FileStorageService.SaveFileAsync nameWithType: FileStorageService.SaveFileAsync -- uid: EchoHub.Server.Services.FileValidationHelper - name: FileValidationHelper - href: api/server/EchoHub.Server.Services.FileValidationHelper.html - commentId: T:EchoHub.Server.Services.FileValidationHelper - fullName: EchoHub.Server.Services.FileValidationHelper - nameWithType: FileValidationHelper -- uid: EchoHub.Server.Services.FileValidationHelper.IsAudioFile(System.String) - name: IsAudioFile(string) - href: api/server/EchoHub.Server.Services.FileValidationHelper.html#EchoHub_Server_Services_FileValidationHelper_IsAudioFile_System_String_ - commentId: M:EchoHub.Server.Services.FileValidationHelper.IsAudioFile(System.String) - name.vb: IsAudioFile(String) - fullName: EchoHub.Server.Services.FileValidationHelper.IsAudioFile(string) - fullName.vb: EchoHub.Server.Services.FileValidationHelper.IsAudioFile(String) - nameWithType: FileValidationHelper.IsAudioFile(string) - nameWithType.vb: FileValidationHelper.IsAudioFile(String) -- uid: EchoHub.Server.Services.FileValidationHelper.IsAudioFile* - name: IsAudioFile - href: api/server/EchoHub.Server.Services.FileValidationHelper.html#EchoHub_Server_Services_FileValidationHelper_IsAudioFile_ - commentId: Overload:EchoHub.Server.Services.FileValidationHelper.IsAudioFile - fullName: EchoHub.Server.Services.FileValidationHelper.IsAudioFile - nameWithType: FileValidationHelper.IsAudioFile -- uid: EchoHub.Server.Services.FileValidationHelper.IsValidImage(System.IO.Stream) - name: IsValidImage(Stream) - href: api/server/EchoHub.Server.Services.FileValidationHelper.html#EchoHub_Server_Services_FileValidationHelper_IsValidImage_System_IO_Stream_ - commentId: M:EchoHub.Server.Services.FileValidationHelper.IsValidImage(System.IO.Stream) - fullName: EchoHub.Server.Services.FileValidationHelper.IsValidImage(System.IO.Stream) - nameWithType: FileValidationHelper.IsValidImage(Stream) -- uid: EchoHub.Server.Services.FileValidationHelper.IsValidImage* - name: IsValidImage - href: api/server/EchoHub.Server.Services.FileValidationHelper.html#EchoHub_Server_Services_FileValidationHelper_IsValidImage_ - commentId: Overload:EchoHub.Server.Services.FileValidationHelper.IsValidImage - fullName: EchoHub.Server.Services.FileValidationHelper.IsValidImage - nameWithType: FileValidationHelper.IsValidImage -- uid: EchoHub.Server.Services.ImageToAsciiService - name: ImageToAsciiService - href: api/server/EchoHub.Server.Services.ImageToAsciiService.html - commentId: T:EchoHub.Server.Services.ImageToAsciiService - fullName: EchoHub.Server.Services.ImageToAsciiService - nameWithType: ImageToAsciiService -- uid: EchoHub.Server.Services.ImageToAsciiService.#ctor - name: ImageToAsciiService() - href: api/server/EchoHub.Server.Services.ImageToAsciiService.html#EchoHub_Server_Services_ImageToAsciiService__ctor - commentId: M:EchoHub.Server.Services.ImageToAsciiService.#ctor - name.vb: New() - fullName: EchoHub.Server.Services.ImageToAsciiService.ImageToAsciiService() - fullName.vb: EchoHub.Server.Services.ImageToAsciiService.New() - nameWithType: ImageToAsciiService.ImageToAsciiService() - nameWithType.vb: ImageToAsciiService.New() -- uid: EchoHub.Server.Services.ImageToAsciiService.#ctor* - name: ImageToAsciiService - href: api/server/EchoHub.Server.Services.ImageToAsciiService.html#EchoHub_Server_Services_ImageToAsciiService__ctor_ - commentId: Overload:EchoHub.Server.Services.ImageToAsciiService.#ctor - name.vb: New - fullName: EchoHub.Server.Services.ImageToAsciiService.ImageToAsciiService - fullName.vb: EchoHub.Server.Services.ImageToAsciiService.New - nameWithType: ImageToAsciiService.ImageToAsciiService - nameWithType.vb: ImageToAsciiService.New -- uid: EchoHub.Server.Services.ImageToAsciiService.ConvertToAscii(System.IO.Stream,System.Int32,System.Int32) - name: ConvertToAscii(Stream, int, int) - href: api/server/EchoHub.Server.Services.ImageToAsciiService.html#EchoHub_Server_Services_ImageToAsciiService_ConvertToAscii_System_IO_Stream_System_Int32_System_Int32_ - commentId: M:EchoHub.Server.Services.ImageToAsciiService.ConvertToAscii(System.IO.Stream,System.Int32,System.Int32) - name.vb: ConvertToAscii(Stream, Integer, Integer) - fullName: EchoHub.Server.Services.ImageToAsciiService.ConvertToAscii(System.IO.Stream, int, int) - fullName.vb: EchoHub.Server.Services.ImageToAsciiService.ConvertToAscii(System.IO.Stream, Integer, Integer) - nameWithType: ImageToAsciiService.ConvertToAscii(Stream, int, int) - nameWithType.vb: ImageToAsciiService.ConvertToAscii(Stream, Integer, Integer) -- uid: EchoHub.Server.Services.ImageToAsciiService.ConvertToAscii* - name: ConvertToAscii - href: api/server/EchoHub.Server.Services.ImageToAsciiService.html#EchoHub_Server_Services_ImageToAsciiService_ConvertToAscii_ - commentId: Overload:EchoHub.Server.Services.ImageToAsciiService.ConvertToAscii - fullName: EchoHub.Server.Services.ImageToAsciiService.ConvertToAscii - nameWithType: ImageToAsciiService.ConvertToAscii -- uid: EchoHub.Server.Services.ImageToAsciiService.GetDimensions(System.String) - name: GetDimensions(string?) - href: api/server/EchoHub.Server.Services.ImageToAsciiService.html#EchoHub_Server_Services_ImageToAsciiService_GetDimensions_System_String_ - commentId: M:EchoHub.Server.Services.ImageToAsciiService.GetDimensions(System.String) - name.vb: GetDimensions(String) - fullName: EchoHub.Server.Services.ImageToAsciiService.GetDimensions(string?) - fullName.vb: EchoHub.Server.Services.ImageToAsciiService.GetDimensions(String) - nameWithType: ImageToAsciiService.GetDimensions(string?) - nameWithType.vb: ImageToAsciiService.GetDimensions(String) -- uid: EchoHub.Server.Services.ImageToAsciiService.GetDimensions* - name: GetDimensions - href: api/server/EchoHub.Server.Services.ImageToAsciiService.html#EchoHub_Server_Services_ImageToAsciiService_GetDimensions_ - commentId: Overload:EchoHub.Server.Services.ImageToAsciiService.GetDimensions - fullName: EchoHub.Server.Services.ImageToAsciiService.GetDimensions - nameWithType: ImageToAsciiService.GetDimensions - uid: EchoHub.Server.Services.LinkEmbedService name: LinkEmbedService href: api/server/EchoHub.Server.Services.LinkEmbedService.html