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

+Class BackupInfo +

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

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
+
+
+ + + + + + + + + + + + +
+ + + + +
+ +
+ +
+
+ +
+ + + + diff --git a/api/client/EchoHub.Client.Services.EchoHubConnection.html b/api/client/EchoHub.Client.Services.EchoHubConnection.html index eb5a036..c815024 100644 --- a/api/client/EchoHub.Client.Services.EchoHubConnection.html +++ b/api/client/EchoHub.Client.Services.EchoHubConnection.html @@ -828,7 +828,7 @@ Class EchoHubConnection
-
public event Action<string, string>? OnUserJoined
+
public event Action<string, string, UserPresenceDto?>? OnUserJoined
@@ -838,7 +838,7 @@ Class EchoHubConnection
Event Type
-
Action<string, string>
+
Action<string, string, UserPresenceDto>
diff --git a/api/client/EchoHub.Client.Services.PathSetup.html b/api/client/EchoHub.Client.Services.PathSetup.html new file mode 100644 index 0000000..9c9e222 --- /dev/null +++ b/api/client/EchoHub.Client.Services.PathSetup.html @@ -0,0 +1,211 @@ + + + + + Class PathSetup | EchoHub Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+
Table of Contents
+ +
+
+ +
+
+
+ +
+
+ + + +
+ +
+ + + +

+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
+
+ +
PathSetup
+
+
+ + + +
+
Inherited Members
+
+ + + + + + + +
+ + + + + + +

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()
+
+ + + + + + + + + + + + + + +
+ + + + +
+ +
+ +
+
+ +
+ + + + diff --git a/api/client/EchoHub.Client.Services.UpdateBackupService.html b/api/client/EchoHub.Client.Services.UpdateBackupService.html new file mode 100644 index 0000000..41171d2 --- /dev/null +++ b/api/client/EchoHub.Client.Services.UpdateBackupService.html @@ -0,0 +1,365 @@ + + + + + Class UpdateBackupService | EchoHub Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+
Table of Contents
+ +
+
+ +
+
+
+ +
+
+ + + +
+ +
+ + + +

+Class UpdateBackupService +

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

Manages pre-update backups and rollback restoration for the auto-updater. +Backup location: ~/.echohub/update-backup/

+
+
+ +
+
public static class UpdateBackupService
+
+ + + + +
+
Inheritance
+
+ +
UpdateBackupService
+
+
+ + + +
+
Inherited Members
+
+ + + + + + + +
+ + + + + + +

Properties +

+ + + + +

+ IsPostUpdate + +

+ +

True if a backup exists from a recent update (set at startup).

+
+
+ +
+
public static bool IsPostUpdate { get; set; }
+
+ + + + + +

Property Value

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

Methods +

+ + + + +

+ BackupExists() + +

+ +

Returns true if a valid backup exists (both ZIP and metadata file present).

+
+
+ +
+
public static bool BackupExists()
+
+ + +

Returns

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

+ CreateBackup() + +

+ +

Creates a ZIP backup of the current app directory before an update. +Deletes any previous backup first. Uses fastest compression for speed.

+
+
+ +
+
public static void CreateBackup()
+
+ + + + + + + + + + + + + + + +

+ DeleteBackup() + +

+ +

Deletes the backup directory and all contents.

+
+
+ +
+
public static void DeleteBackup()
+
+ + + + + + + + + + + + + + + +

+ GetBackupInfo() + +

+ +

Reads backup metadata. Returns null if no backup exists or metadata is unreadable.

+
+
+ +
+
public static BackupInfo? GetBackupInfo()
+
+ + +

Returns

+
+
BackupInfo
+
+
+ + + + + + + + + + + + + +

+ RestoreBackup() + +

+ +

Restores the backup ZIP to the app directory, then restarts the process. +This method does not return — it calls Environment.Exit(0).

+
+
+ +
+
public static void RestoreBackup()
+
+ + + + + + + + + + + + + + +
+ + + + +
+ +
+ +
+
+ +
+ + + + diff --git a/api/client/EchoHub.Client.Services.UpdateChecker.html b/api/client/EchoHub.Client.Services.UpdateChecker.html index 5169f4a..8882de2 100644 --- a/api/client/EchoHub.Client.Services.UpdateChecker.html +++ b/api/client/EchoHub.Client.Services.UpdateChecker.html @@ -225,6 +225,37 @@ Class UpdateChecker + + +

+ CheckNowAsync() + +

+ +
+
+ +
+
public Task CheckNowAsync()
+
+ + +

Returns

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

diff --git a/api/client/EchoHub.Client.Services.html b/api/client/EchoHub.Client.Services.html index 1eb2720..667ef8f 100644 --- a/api/client/EchoHub.Client.Services.html +++ b/api/client/EchoHub.Client.Services.html @@ -108,6 +108,10 @@ 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 @@ -122,6 +126,18 @@ so messages are encrypted end-to-end between client and server.

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
diff --git a/api/client/EchoHub.Client.UI.Chat.ChatColors.html b/api/client/EchoHub.Client.UI.Chat.ChatColors.html index 7a72c6f..e23b079 100644 --- a/api/client/EchoHub.Client.UI.Chat.ChatColors.html +++ b/api/client/EchoHub.Client.UI.Chat.ChatColors.html @@ -184,6 +184,36 @@ Class ChatColors + ChannelRefAttr + +

+ +
+
+ +
+
public static readonly Attribute ChannelRefAttr
+
+ + + + +

Field Value

+
+
Attribute
+
+
+ + + + + + + + + +

EmbedBorderAttr @@ -464,8 +494,8 @@ Class ChatColors

-

Split text around @mentions, giving each @word the MentionTextAttr accent color. -Non-mention text uses the provided default color.

+

Split text around @mentions and #channels, giving each the appropriate accent color. +Non-special text uses the provided default color.

diff --git a/api/client/EchoHub.Client.UI.Chat.ChatLine.html b/api/client/EchoHub.Client.UI.Chat.ChatLine.html index 36475a0..3b7dcd4 100644 --- a/api/client/EchoHub.Client.UI.Chat.ChatLine.html +++ b/api/client/EchoHub.Client.UI.Chat.ChatLine.html @@ -278,6 +278,38 @@ Class ChatLine + +

+ ContinuationIndent + +

+ +

Number of spaces to prepend on continuation lines when this line is word-wrapped.

+
+
+ +
+
public int ContinuationIndent { get; set; }
+
+ + + + + +

Property Value

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

@@ -371,6 +403,37 @@ Class ChatLine + +

+ SenderUsername + +

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

Property Value

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

diff --git a/api/client/EchoHub.Client.UI.ListSources.UserListSource.html b/api/client/EchoHub.Client.UI.ListSources.UserListSource.html index e486b7e..d58ed90 100644 --- a/api/client/EchoHub.Client.UI.ListSources.UserListSource.html +++ b/api/client/EchoHub.Client.UI.ListSources.UserListSource.html @@ -313,6 +313,42 @@ Class UserListSource + +

+ GetUsername(int) + +

+ +
+
+ +
+
public string? GetUsername(int index)
+
+ +

Parameters

+
+
index int
+
+
+ +

Returns

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

@@ -458,8 +494,8 @@ Class UserListSource -

- Update(List<(string Text, Attribute? NameColor)>) +

+ Update(List<(string Text, Attribute? NameColor, string Username)>)

@@ -467,12 +503,12 @@ Class UserListSource
-
public void Update(List<(string Text, Attribute? NameColor)> users)
+
public void Update(List<(string Text, Attribute? NameColor, string Username)> users)

Parameters

-
users List<(string Text, Attribute? NameColor)>
+
users List<(string Text, Attribute? NameColor, string Username)>
diff --git a/api/client/EchoHub.Client.UI.MainWindow.html b/api/client/EchoHub.Client.UI.MainWindow.html index 4f2f6ec..b6399f7 100644 --- a/api/client/EchoHub.Client.UI.MainWindow.html +++ b/api/client/EchoHub.Client.UI.MainWindow.html @@ -1367,6 +1367,37 @@ Call after theme changes to refresh colors.

+

+ OnChannelJoinRequested + +

+ +

Fired when the user activates a #channel reference in a message. Parameter is the channel name.

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

Event Type

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

OnChannelSelected @@ -1398,6 +1429,37 @@ Call after theme changes to refresh colors.

+

+ OnCheckForUpdatesRequested + +

+ +

Fired when the user requests to check for updates.

+
+
+ +
+
public event Action? OnCheckForUpdatesRequested
+
+ + + + + + +

Event Type

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

OnConnectRequested @@ -1646,6 +1708,37 @@ Call after theme changes to refresh colors.

+

+ OnRollbackRequested + +

+ +

Fired when the user requests to rollback to the previous version.

+
+
+ +
+
public event Action? OnRollbackRequested
+
+ + + + + + +

Event Type

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

OnSavedServersRequested @@ -1739,6 +1832,37 @@ Call after theme changes to refresh colors.

+

+ OnUserProfileRequested + +

+ +

Fired when the user activates a username (in userlist or message). Parameter is the username.

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

Event Type

+
+
Action<string>
+
+
+ + + + + + + +
diff --git a/api/core/EchoHub.Core.Contracts.IChatBroadcaster.html b/api/core/EchoHub.Core.Contracts.IChatBroadcaster.html index 7e0cefc..eb087c0 100644 --- a/api/core/EchoHub.Core.Contracts.IChatBroadcaster.html +++ b/api/core/EchoHub.Core.Contracts.IChatBroadcaster.html @@ -386,8 +386,8 @@ Interface IChatBroadcaster -

- SendUserJoinedAsync(string, string, string?) +

+ SendUserJoinedAsync(string, string, UserPresenceDto?, string?)

@@ -395,7 +395,7 @@ Interface IChatBroadcaster
-
Task SendUserJoinedAsync(string channelName, string username, string? excludeConnectionId = null)
+
Task SendUserJoinedAsync(string channelName, string username, UserPresenceDto? presence, string? excludeConnectionId = null)

Parameters

@@ -404,6 +404,8 @@ Interface IChatBroadcaster
string
+
presence UserPresenceDto
+
excludeConnectionId string
diff --git a/api/core/EchoHub.Core.Contracts.IChatService.html b/api/core/EchoHub.Core.Contracts.IChatService.html index f54281a..26097cf 100644 --- a/api/core/EchoHub.Core.Contracts.IChatService.html +++ b/api/core/EchoHub.Core.Contracts.IChatService.html @@ -120,44 +120,6 @@ Interface IChatService - -

- AuthenticateUserAsync(string, string) - -

- -
-
- -
-
Task<(Guid UserId, string Username)?> AuthenticateUserAsync(string username, string password)
-
- -

Parameters

-
-
username string
-
-
password string
-
-
- -

Returns

-
-
Task<(Guid UserId, string Username)?>
-
-
- - - - - - - - - - -

@@ -344,42 +306,6 @@ Interface IChatService - -

- GetUserProfileAsync(string) - -

- -
-
- -
-
Task<UserProfileDto?> GetUserProfileAsync(string username)
-
- -

Parameters

-
-
username string
-
-
- -

Returns

-
-
Task<UserProfileDto>
-
-
- - - - - - - - - - -

diff --git a/api/core/EchoHub.Core.Contracts.IEchoHubClient.html b/api/core/EchoHub.Core.Contracts.IEchoHubClient.html index b75cef0..06bc4c9 100644 --- a/api/core/EchoHub.Core.Contracts.IEchoHubClient.html +++ b/api/core/EchoHub.Core.Contracts.IEchoHubClient.html @@ -379,8 +379,8 @@ Interface IEchoHubClient -

- UserJoined(string, string) +

+ UserJoined(string, string, UserPresenceDto?)

@@ -388,7 +388,7 @@ Interface IEchoHubClient
-
Task UserJoined(string channelName, string username)
+
Task UserJoined(string channelName, string username, UserPresenceDto? presence)

Parameters

@@ -397,6 +397,8 @@ Interface IEchoHubClient
string
+
presence UserPresenceDto
+

Returns

diff --git a/api/core/EchoHub.Core.Contracts.IUserService.html b/api/core/EchoHub.Core.Contracts.IUserService.html new file mode 100644 index 0000000..d826386 --- /dev/null +++ b/api/core/EchoHub.Core.Contracts.IUserService.html @@ -0,0 +1,378 @@ + + + + + Interface IUserService | EchoHub Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+
Table of Contents
+ +
+
+ +
+
+
+ +
+
+ + + +
+ +
+ + + +

+Interface IUserService +

+ +
+
Namespace
EchoHub.Core.Contracts
+
Assembly
EchoHub.Core.dll
+
+ +
+
+ +
+
public interface IUserService
+
+ + + + + + + + + + + + + +

Methods +

+ + + + +

+ AuthenticateUserAsync(string, string) + +

+ +
+
+ +
+
Task<UserOperationResult> AuthenticateUserAsync(string username, string password)
+
+ +

Parameters

+
+
username string
+
+
password string
+
+
+ +

Returns

+
+
Task<UserOperationResult>
+
+
+ + + + + + + + + + + + + +

+ GetUserByIdAsync(Guid) + +

+ +
+
+ +
+
Task<UserProfileDto?> GetUserByIdAsync(Guid userId)
+
+ +

Parameters

+
+
userId Guid
+
+
+ +

Returns

+
+
Task<UserProfileDto>
+
+
+ + + + + + + + + + + + + +

+ GetUserProfileAsync(string) + +

+ +
+
+ +
+
Task<UserProfileDto?> GetUserProfileAsync(string username)
+
+ +

Parameters

+
+
username string
+
+
+ +

Returns

+
+
Task<UserProfileDto>
+
+
+ + + + + + + + + + + + + +

+ RegisterUserAsync(string, string, string?) + +

+ +
+
+ +
+
Task<UserOperationResult> RegisterUserAsync(string username, string password, string? displayName = null)
+
+ +

Parameters

+
+
username string
+
+
password string
+
+
displayName string
+
+
+ +

Returns

+
+
Task<UserOperationResult>
+
+
+ + + + + + + + + + + + + +

+ SetAvatarAsync(Guid, string) + +

+ +
+
+ +
+
Task<UserOperationResult> SetAvatarAsync(Guid userId, string asciiArt)
+
+ +

Parameters

+
+
userId Guid
+
+
asciiArt string
+
+
+ +

Returns

+
+
Task<UserOperationResult>
+
+
+ + + + + + + + + + + + + +

+ UpdateProfileAsync(Guid, string?, string?, string?) + +

+ +
+
+ +
+
Task<UserOperationResult> UpdateProfileAsync(Guid userId, string? displayName, string? bio, string? nicknameColor)
+
+ +

Parameters

+
+
userId Guid
+
+
displayName string
+
+
bio string
+
+
nicknameColor string
+
+
+ +

Returns

+
+
Task<UserOperationResult>
+
+
+ + + + + + + + + + + + +
+ + + + +
+ +
+ +
+
+ +
+ + + + diff --git a/api/core/EchoHub.Core.Contracts.html b/api/core/EchoHub.Core.Contracts.html index 6faecde..11008fc 100644 --- a/api/core/EchoHub.Core.Contracts.html +++ b/api/core/EchoHub.Core.Contracts.html @@ -122,6 +122,10 @@ Interfaces
IMessageEncryptionService
+
+
IUserService
+
+
diff --git a/api/core/EchoHub.Core.DTOs.EmbedDto.html b/api/core/EchoHub.Core.DTOs.EmbedDto.html index 4ba3d03..36f4fcb 100644 --- a/api/core/EchoHub.Core.DTOs.EmbedDto.html +++ b/api/core/EchoHub.Core.DTOs.EmbedDto.html @@ -182,8 +182,8 @@ Class EmbedDto -

- EmbedDto(string?, string?, string?, string?, string) +

+ EmbedDto(string?, string?, string?, string?, string, string?)

@@ -191,7 +191,7 @@ Class EmbedDto
-
public EmbedDto(string? SiteName, string? Title, string? Description, string? ImageAscii, string Url)
+
public EmbedDto(string? SiteName, string? Title, string? Description, string? ImageAscii, string Url, string? ThemeColor = null)

Parameters

@@ -206,6 +206,8 @@ Class EmbedDto
Url string
+
ThemeColor string
+
@@ -347,6 +349,37 @@ Class EmbedDto + +

+ ThemeColor + +

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

Property Value

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

@@ -415,8 +448,8 @@ Class EmbedDto -

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

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

@@ -424,7 +457,7 @@ Class EmbedDto
-
public void Deconstruct(out string? SiteName, out string? Title, out string? Description, out string? ImageAscii, out string Url)
+
public void Deconstruct(out string? SiteName, out string? Title, out string? Description, out string? ImageAscii, out string Url, out string? ThemeColor)

Parameters

@@ -439,6 +472,8 @@ Class EmbedDto
Url string
+
ThemeColor string
+
diff --git a/api/core/EchoHub.Core.DTOs.JoinChannelResult.html b/api/core/EchoHub.Core.DTOs.JoinChannelResult.html new file mode 100644 index 0000000..c61a3e6 --- /dev/null +++ b/api/core/EchoHub.Core.DTOs.JoinChannelResult.html @@ -0,0 +1,660 @@ + + + + + Class JoinChannelResult | EchoHub Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+
Table of Contents
+ +
+
+ +
+
+
+ +
+
+ + + +
+ +
+ + + +

+Class JoinChannelResult +

+ +
+
Namespace
EchoHub.Core.DTOs
+
Assembly
EchoHub.Core.dll
+
+ +
+
+ +
+
public record JoinChannelResult : IEquatable<JoinChannelResult>
+
+ + + + +
+
Inheritance
+
+ +
JoinChannelResult
+
+
+ +
+
Implements
+
+ +
+
+ + +
+
Inherited Members
+
+ + + + +
+ + + + + + +

Constructors +

+ + + + +

+ JoinChannelResult(JoinChannelResult) + +

+ +
+
+ +
+
protected JoinChannelResult(JoinChannelResult original)
+
+ +

Parameters

+
+
original JoinChannelResult
+
+
+ + + + + + + + + + + + + + +

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

+ +
+
+ +
+
public JoinChannelResult(bool Success, List<MessageDto> History, string? Error = null)
+
+ +

Parameters

+
+
Success bool
+
+
History List<MessageDto>
+
+
Error string
+
+
+ + + + + + + + + + + + +

Properties +

+ + + + +

+ EqualityContract + +

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

Property Value

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

+ Error + +

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

Property Value

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

+ History + +

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

Property Value

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

+ Success + +

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

Property Value

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

Methods +

+ + + + +

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

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

Parameters

+
+
Success bool
+
+
History List<MessageDto>
+
+
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
+
+
+ + + + + + + + + + + + +
+ + + + +
+ +
+ +
+
+ +
+ + + + diff --git a/api/core/EchoHub.Core.DTOs.UserError.html b/api/core/EchoHub.Core.DTOs.UserError.html new file mode 100644 index 0000000..b99e184 --- /dev/null +++ b/api/core/EchoHub.Core.DTOs.UserError.html @@ -0,0 +1,162 @@ + + + + + Enum UserError | EchoHub Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+
Table of Contents
+ +
+
+ +
+
+
+ +
+
+ + + +
+ +
+ + + + +

+Enum UserError +

+ +
+
Namespace
EchoHub.Core.DTOs
+
Assembly
EchoHub.Core.dll
+
+ +
+
+ +
+
public enum UserError
+
+ + + + + + + + + +

Fields +

+
+
AlreadyExists = 1
+ +
+
Banned = 4
+ +
+
InvalidCredentials = 3
+ +
+
NotFound = 2
+ +
+
ValidationFailed = 0
+ +
+
+ + + +
+ + + + +
+ +
+ +
+
+ +
+ + + + diff --git a/api/core/EchoHub.Core.DTOs.UserOperationResult.html b/api/core/EchoHub.Core.DTOs.UserOperationResult.html new file mode 100644 index 0000000..8245026 --- /dev/null +++ b/api/core/EchoHub.Core.DTOs.UserOperationResult.html @@ -0,0 +1,765 @@ + + + + + Class UserOperationResult | EchoHub Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+
Table of Contents
+ +
+
+ +
+
+
+ +
+
+ + + +
+ +
+ + + +

+Class UserOperationResult +

+ +
+
Namespace
EchoHub.Core.DTOs
+
Assembly
EchoHub.Core.dll
+
+ +
+
+ +
+
public record UserOperationResult : IEquatable<UserOperationResult>
+
+ + + + +
+
Inheritance
+
+ +
UserOperationResult
+
+
+ +
+
Implements
+
+ +
+
+ + +
+
Inherited Members
+
+ + + + +
+ + + + + + +

Constructors +

+ + + + +

+ UserOperationResult(UserOperationResult) + +

+ +
+
+ +
+
protected UserOperationResult(UserOperationResult original)
+
+ +

Parameters

+
+
original UserOperationResult
+
+
+ + + + + + + + + + + + + + +

+ UserOperationResult(UserProfileDto?, UserError?, string?) + +

+ +
+
+ +
+
public UserOperationResult(UserProfileDto? User, UserError? Error, string? ErrorMessage)
+
+ +

Parameters

+
+
User UserProfileDto
+
+
Error UserError?
+
+
ErrorMessage string
+
+
+ + + + + + + + + + + + +

Properties +

+ + + + +

+ EqualityContract + +

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

Property Value

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

+ Error + +

+ +
+
+ +
+
public UserError? Error { get; init; }
+
+ + + + + +

Property Value

+
+
UserError?
+
+
+ + + + + + + + + + +

+ ErrorMessage + +

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

Property Value

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

+ IsSuccess + +

+ +
+
+ +
+
public bool IsSuccess { get; }
+
+ + + + + +

Property Value

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

+ User + +

+ +
+
+ +
+
public UserProfileDto? User { get; init; }
+
+ + + + + +

Property Value

+
+
UserProfileDto
+
+
+ + + + + + + + +

Methods +

+ + + + +

+ Deconstruct(out UserProfileDto?, out UserError?, out string?) + +

+ +
+
+ +
+
public void Deconstruct(out UserProfileDto? User, out UserError? Error, out string? ErrorMessage)
+
+ +

Parameters

+
+
User UserProfileDto
+
+
Error UserError?
+
+
ErrorMessage string
+
+
+ + + + + + + + + + + + + + +

+ Equals(UserOperationResult?) + +

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

Parameters

+
+
other UserOperationResult
+
+
+ +

Returns

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

+ Equals(object?) + +

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

Parameters

+
+
obj object
+
+
+ +

Returns

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

+ Fail(UserError, string) + +

+ +
+
+ +
+
public static UserOperationResult Fail(UserError error, string message)
+
+ +

Parameters

+
+
error UserError
+
+
message string
+
+
+ +

Returns

+
+
UserOperationResult
+
+
+ + + + + + + + + + + + + +

+ GetHashCode() + +

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

Returns

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

+ PrintMembers(StringBuilder) + +

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

Parameters

+
+
builder StringBuilder
+
+
+ +

Returns

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

+ Success(UserProfileDto) + +

+ +
+
+ +
+
public static UserOperationResult Success(UserProfileDto user)
+
+ +

Parameters

+
+
user UserProfileDto
+
+
+ +

Returns

+
+
UserOperationResult
+
+
+ + + + + + + + + + + + + +

+ ToString() + +

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

Returns

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

Operators +

+ + + + +

+ operator ==(UserOperationResult?, UserOperationResult?) + +

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

Parameters

+
+
left UserOperationResult
+
+
right UserOperationResult
+
+
+ +

Returns

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

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

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

Parameters

+
+
left UserOperationResult
+
+
right UserOperationResult
+
+
+ +

Returns

+
+
bool
+
+
+ + + + + + + + + + + + +
+ + + + +
+ +
+ +
+
+ +
+ + + + diff --git a/api/core/EchoHub.Core.DTOs.html b/api/core/EchoHub.Core.DTOs.html index bf0a45c..dded302 100644 --- a/api/core/EchoHub.Core.DTOs.html +++ b/api/core/EchoHub.Core.DTOs.html @@ -138,6 +138,10 @@ Classes
ErrorResponse
+
+
JoinChannelResult
+
+
KickRequest
@@ -198,6 +202,10 @@ Classes
UserDto
+
+
UserOperationResult
+
+
UserPresenceDto
@@ -213,6 +221,10 @@ Enums
ChannelError
+
+
UserError
+
+
diff --git a/api/server-irc/EchoHub.Server.Irc.IrcBroadcaster.html b/api/server-irc/EchoHub.Server.Irc.IrcBroadcaster.html index 49eaf3a..0af861f 100644 --- a/api/server-irc/EchoHub.Server.Irc.IrcBroadcaster.html +++ b/api/server-irc/EchoHub.Server.Irc.IrcBroadcaster.html @@ -461,8 +461,8 @@ Class IrcBroadcaster -

- SendUserJoinedAsync(string, string, string?) +

+ SendUserJoinedAsync(string, string, UserPresenceDto?, string?)

@@ -470,7 +470,7 @@ Class IrcBroadcaster
-
public Task SendUserJoinedAsync(string channelName, string username, string? excludeConnectionId = null)
+
public Task SendUserJoinedAsync(string channelName, string username, UserPresenceDto? presence, string? excludeConnectionId = null)

Parameters

@@ -479,6 +479,8 @@ Class IrcBroadcaster
string
+
presence UserPresenceDto
+
excludeConnectionId string
diff --git a/api/server-irc/EchoHub.Server.Irc.IrcCommandHandler.html b/api/server-irc/EchoHub.Server.Irc.IrcCommandHandler.html index 959b05c..d405ab1 100644 --- a/api/server-irc/EchoHub.Server.Irc.IrcCommandHandler.html +++ b/api/server-irc/EchoHub.Server.Irc.IrcCommandHandler.html @@ -151,8 +151,8 @@ Class IrcCommandHandler -

- IrcCommandHandler(IrcClientConnection, IrcOptions, IChatService, IChannelService, IMessageEncryptionService, ILogger) +

+ IrcCommandHandler(IrcClientConnection, IrcOptions, IChatService, IUserService, IChannelService, IMessageEncryptionService, ILogger)

@@ -160,7 +160,7 @@ Class IrcCommandHandler
-
public IrcCommandHandler(IrcClientConnection conn, IrcOptions options, IChatService chatService, IChannelService channelService, IMessageEncryptionService encryption, ILogger logger)
+
public IrcCommandHandler(IrcClientConnection conn, IrcOptions options, IChatService chatService, IUserService userService, IChannelService channelService, IMessageEncryptionService encryption, ILogger logger)

Parameters

@@ -171,6 +171,8 @@ Class IrcCommandHandler
IChatService
+
userService IUserService
+
channelService IChannelService
encryption IMessageEncryptionService
diff --git a/api/server/EchoHub.Server.Auth.JwtTokenService.html b/api/server/EchoHub.Server.Auth.JwtTokenService.html index c3a3cdd..5bc0abf 100644 --- a/api/server/EchoHub.Server.Auth.JwtTokenService.html +++ b/api/server/EchoHub.Server.Auth.JwtTokenService.html @@ -221,6 +221,42 @@ Class JwtTokenService + +

+ GenerateAccessToken(UserProfileDto) + +

+ +
+
+ +
+
public (string Token, DateTimeOffset ExpiresAt) GenerateAccessToken(UserProfileDto profile)
+
+ +

Parameters

+
+
profile UserProfileDto
+
+
+ +

Returns

+
+
(string Token, DateTimeOffset ExpiresAt)
+
+
+ + + + + + + + + + +

diff --git a/api/server/EchoHub.Server.Controllers.AuthController.html b/api/server/EchoHub.Server.Controllers.AuthController.html index 3871529..a8acfc1 100644 --- a/api/server/EchoHub.Server.Controllers.AuthController.html +++ b/api/server/EchoHub.Server.Controllers.AuthController.html @@ -158,8 +158,8 @@ public class AuthController : ControllerBase -

- AuthController(EchoHubDbContext, JwtTokenService) +

+ AuthController(EchoHubDbContext, JwtTokenService, IUserService)

@@ -167,7 +167,7 @@ public class AuthController : ControllerBase
-
public AuthController(EchoHubDbContext db, JwtTokenService jwt)
+
public AuthController(EchoHubDbContext db, JwtTokenService jwt, IUserService userService)

Parameters

@@ -176,6 +176,8 @@ public class AuthController : ControllerBase
jwt JwtTokenService
+
userService IUserService
+
diff --git a/api/server/EchoHub.Server.Controllers.UsersController.html b/api/server/EchoHub.Server.Controllers.UsersController.html index 5d79602..0f546db 100644 --- a/api/server/EchoHub.Server.Controllers.UsersController.html +++ b/api/server/EchoHub.Server.Controllers.UsersController.html @@ -159,8 +159,8 @@ public class UsersController : ControllerBase -

- UsersController(EchoHubDbContext, ImageToAsciiService) +

+ UsersController(IUserService, ImageToAsciiService)

@@ -168,12 +168,12 @@ public class UsersController : ControllerBase
-
public UsersController(EchoHubDbContext db, ImageToAsciiService asciiService)
+
public UsersController(IUserService userService, ImageToAsciiService asciiService)

Parameters

-
db EchoHubDbContext
+
userService IUserService
asciiService ImageToAsciiService
diff --git a/api/server/EchoHub.Server.Hubs.ChatHub.html b/api/server/EchoHub.Server.Hubs.ChatHub.html index 06c360f..f991638 100644 --- a/api/server/EchoHub.Server.Hubs.ChatHub.html +++ b/api/server/EchoHub.Server.Hubs.ChatHub.html @@ -283,7 +283,7 @@ public class ChatHub : Hub<IEchoHubClient>, IDisposable
-
public Task<List<MessageDto>> JoinChannel(string channelName)
+
public Task<JoinChannelResult> JoinChannel(string channelName)

Parameters

@@ -294,7 +294,7 @@ public class ChatHub : Hub<IEchoHubClient>, IDisposable

Returns

-
Task<List<MessageDto>>
+
Task<JoinChannelResult>
diff --git a/api/server/EchoHub.Server.Services.ChatService.html b/api/server/EchoHub.Server.Services.ChatService.html index d3a5659..e14fe38 100644 --- a/api/server/EchoHub.Server.Services.ChatService.html +++ b/api/server/EchoHub.Server.Services.ChatService.html @@ -205,44 +205,6 @@ Class ChatService - - -

- AuthenticateUserAsync(string, string) - -

- -
-
- -
-
public Task<(Guid UserId, string Username)?> AuthenticateUserAsync(string username, string password)
-
- -

Parameters

-
-
username string
-
-
password string
-
-
- -

Returns

-
-
Task<(Guid UserId, string Username)?>
-
-
- - - - - - - - - - -

@@ -429,42 +391,6 @@ Class ChatService - -

- GetUserProfileAsync(string) - -

- -
-
- -
-
public Task<UserProfileDto?> GetUserProfileAsync(string username)
-
- -

Parameters

-
-
username string
-
-
- -

Returns

-
-
Task<UserProfileDto>
-
-
- - - - - - - - - - -

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

+Class MuteExpirationService +

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

Background service that periodically unmutes users whose timed mute has expired.

+
+
+ +
+
public sealed class MuteExpirationService : BackgroundService, IDisposable
+
+ + + + +
+
Inheritance
+
+ +
BackgroundService
+
MuteExpirationService
+
+
+ +
+
Implements
+
+ +
+
+ + +
+
Inherited Members
+
+ + + + + + +
+ + + + + + +

Constructors +

+ + + + +

+ MuteExpirationService(IServiceScopeFactory, ILogger<MuteExpirationService>) + +

+ +
+
+ +
+
public MuteExpirationService(IServiceScopeFactory scopeFactory, ILogger<MuteExpirationService> logger)
+
+ +

Parameters

+
+
scopeFactory IServiceScopeFactory
+
+
logger ILogger<MuteExpirationService>
+
+
+ + + + + + + + + + + + +

Methods +

+ + + + +

+ ExecuteAsync(CancellationToken) + +

+ +
+
+ +
+
protected override Task ExecuteAsync(CancellationToken stoppingToken)
+
+ +

Parameters

+
+
stoppingToken CancellationToken
+
+
+ +

Returns

+
+
Task
+
+
+ + + + + + + + + + + + +
+ + + + +
+ +
+ +
+
+ +
+ + + + diff --git a/api/server/EchoHub.Server.Services.SignalRBroadcaster.html b/api/server/EchoHub.Server.Services.SignalRBroadcaster.html index 5845cfc..b534454 100644 --- a/api/server/EchoHub.Server.Services.SignalRBroadcaster.html +++ b/api/server/EchoHub.Server.Services.SignalRBroadcaster.html @@ -461,8 +461,8 @@ Class SignalRBroadcaster -

- SendUserJoinedAsync(string, string, string?) +

+ SendUserJoinedAsync(string, string, UserPresenceDto?, string?)

@@ -470,7 +470,7 @@ Class SignalRBroadcaster
-
public Task SendUserJoinedAsync(string channelName, string username, string? excludeConnectionId = null)
+
public Task SendUserJoinedAsync(string channelName, string username, UserPresenceDto? presence, string? excludeConnectionId = null)

Parameters

@@ -479,6 +479,8 @@ Class SignalRBroadcaster
string
+
presence UserPresenceDto
+
excludeConnectionId string
diff --git a/api/server/EchoHub.Server.Services.UserService.html b/api/server/EchoHub.Server.Services.UserService.html new file mode 100644 index 0000000..af69c74 --- /dev/null +++ b/api/server/EchoHub.Server.Services.UserService.html @@ -0,0 +1,451 @@ + + + + + Class UserService | EchoHub Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+
Table of Contents
+ +
+
+ +
+
+
+ +
+
+ + + +
+ +
+ + + +

+Class UserService +

+ +
+
Namespace
EchoHub.Server.Services
+
Assembly
EchoHub.Server.dll
+
+ +
+
+ +
+
public class UserService : IUserService
+
+ + + + +
+
Inheritance
+
+ +
UserService
+
+
+ +
+
Implements
+
+ +
+
+ + +
+
Inherited Members
+
+ + + + + + + +
+ + + + + + +

Constructors +

+ + + + +

+ UserService(IServiceScopeFactory) + +

+ +
+
+ +
+
public UserService(IServiceScopeFactory scopeFactory)
+
+ +

Parameters

+
+
scopeFactory IServiceScopeFactory
+
+
+ + + + + + + + + + + + +

Methods +

+ + + + +

+ AuthenticateUserAsync(string, string) + +

+ +
+
+ +
+
public Task<UserOperationResult> AuthenticateUserAsync(string username, string password)
+
+ +

Parameters

+
+
username string
+
+
password string
+
+
+ +

Returns

+
+
Task<UserOperationResult>
+
+
+ + + + + + + + + + + + + +

+ GetUserByIdAsync(Guid) + +

+ +
+
+ +
+
public Task<UserProfileDto?> GetUserByIdAsync(Guid userId)
+
+ +

Parameters

+
+
userId Guid
+
+
+ +

Returns

+
+
Task<UserProfileDto>
+
+
+ + + + + + + + + + + + + +

+ GetUserProfileAsync(string) + +

+ +
+
+ +
+
public Task<UserProfileDto?> GetUserProfileAsync(string username)
+
+ +

Parameters

+
+
username string
+
+
+ +

Returns

+
+
Task<UserProfileDto>
+
+
+ + + + + + + + + + + + + +

+ RegisterUserAsync(string, string, string?) + +

+ +
+
+ +
+
public Task<UserOperationResult> RegisterUserAsync(string username, string password, string? displayName = null)
+
+ +

Parameters

+
+
username string
+
+
password string
+
+
displayName string
+
+
+ +

Returns

+
+
Task<UserOperationResult>
+
+
+ + + + + + + + + + + + + +

+ SetAvatarAsync(Guid, string) + +

+ +
+
+ +
+
public Task<UserOperationResult> SetAvatarAsync(Guid userId, string asciiArt)
+
+ +

Parameters

+
+
userId Guid
+
+
asciiArt string
+
+
+ +

Returns

+
+
Task<UserOperationResult>
+
+
+ + + + + + + + + + + + + +

+ UpdateProfileAsync(Guid, string?, string?, string?) + +

+ +
+
+ +
+
public Task<UserOperationResult> UpdateProfileAsync(Guid userId, string? displayName, string? bio, string? nicknameColor)
+
+ +

Parameters

+
+
userId Guid
+
+
displayName string
+
+
bio string
+
+
nicknameColor string
+
+
+ +

Returns

+
+
Task<UserOperationResult>
+
+
+ + + + + + + + + + + + +
+ + + + +
+ +
+ +
+
+ +
+ + + + diff --git a/api/server/EchoHub.Server.Services.html b/api/server/EchoHub.Server.Services.html index 705ced3..b6123c8 100644 --- a/api/server/EchoHub.Server.Services.html +++ b/api/server/EchoHub.Server.Services.html @@ -126,6 +126,11 @@ Classes
MessageEncryptionService
+
+
MuteExpirationService
+

Background service that periodically unmutes users whose timed mute has expired.

+
+
PresenceTracker
@@ -138,6 +143,10 @@ Classes
SignalRBroadcaster
+
+
UserService
+
+
diff --git a/api/toc.html b/api/toc.html index f5cfdf8..a6b6e07 100644 --- a/api/toc.html +++ b/api/toc.html @@ -81,6 +81,9 @@
  • AudioPlaybackService
  • +
  • + BackupInfo +
  • ClientEncryptionService
  • @@ -90,6 +93,12 @@
  • NotificationSoundService
  • +
  • + PathSetup +
  • +
  • + UpdateBackupService +
  • UpdateChecker
  • @@ -275,6 +284,9 @@
  • IMessageEncryptionService
  • +
  • + IUserService +
  • @@ -318,6 +330,9 @@
  • ErrorResponse
  • +
  • + JoinChannelResult +
  • KickRequest
  • @@ -363,6 +378,12 @@
  • UserDto
  • +
  • + UserError +
  • +
  • + UserOperationResult +
  • UserPresenceDto
  • @@ -538,6 +559,9 @@
  • MessageEncryptionService
  • +
  • + MuteExpirationService +
  • PresenceTracker
  • @@ -547,6 +571,9 @@
  • SignalRBroadcaster
  • +
  • + UserService +
  • diff --git a/api/toc.json b/api/toc.json index 7037d6b..0ed170a 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":"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":"UpdateChecker","href":"client/EchoHub.Client.Services.UpdateChecker.html","topicHref":"client/EchoHub.Client.Services.UpdateChecker.html","topicUid":"EchoHub.Client.Services.UpdateChecker","type":"Class"}]},{"name":"EchoHub.Client.Themes","href":"client/EchoHub.Client.Themes.html","topicHref":"client/EchoHub.Client.Themes.html","topicUid":"EchoHub.Client.Themes","type":"Namespace","items":[{"name":"Theme","href":"client/EchoHub.Client.Themes.Theme.html","topicHref":"client/EchoHub.Client.Themes.Theme.html","topicUid":"EchoHub.Client.Themes.Theme","type":"Class"},{"name":"ThemeColors","href":"client/EchoHub.Client.Themes.ThemeColors.html","topicHref":"client/EchoHub.Client.Themes.ThemeColors.html","topicUid":"EchoHub.Client.Themes.ThemeColors","type":"Class"},{"name":"ThemeManager","href":"client/EchoHub.Client.Themes.ThemeManager.html","topicHref":"client/EchoHub.Client.Themes.ThemeManager.html","topicUid":"EchoHub.Client.Themes.ThemeManager","type":"Class"}]},{"name":"EchoHub.Client.UI","href":"client/EchoHub.Client.UI.html","topicHref":"client/EchoHub.Client.UI.html","topicUid":"EchoHub.Client.UI","type":"Namespace","items":[{"name":"MainWindow","href":"client/EchoHub.Client.UI.MainWindow.html","topicHref":"client/EchoHub.Client.UI.MainWindow.html","topicUid":"EchoHub.Client.UI.MainWindow","type":"Class"}]},{"name":"EchoHub.Client.UI.Chat","href":"client/EchoHub.Client.UI.Chat.html","topicHref":"client/EchoHub.Client.UI.Chat.html","topicUid":"EchoHub.Client.UI.Chat","type":"Namespace","items":[{"name":"ChatColors","href":"client/EchoHub.Client.UI.Chat.ChatColors.html","topicHref":"client/EchoHub.Client.UI.Chat.ChatColors.html","topicUid":"EchoHub.Client.UI.Chat.ChatColors","type":"Class"},{"name":"ChatLine","href":"client/EchoHub.Client.UI.Chat.ChatLine.html","topicHref":"client/EchoHub.Client.UI.Chat.ChatLine.html","topicUid":"EchoHub.Client.UI.Chat.ChatLine","type":"Class"},{"name":"ChatListSource","href":"client/EchoHub.Client.UI.Chat.ChatListSource.html","topicHref":"client/EchoHub.Client.UI.Chat.ChatListSource.html","topicUid":"EchoHub.Client.UI.Chat.ChatListSource","type":"Class"},{"name":"ChatMessageManager","href":"client/EchoHub.Client.UI.Chat.ChatMessageManager.html","topicHref":"client/EchoHub.Client.UI.Chat.ChatMessageManager.html","topicUid":"EchoHub.Client.UI.Chat.ChatMessageManager","type":"Class"},{"name":"ChatSegment","href":"client/EchoHub.Client.UI.Chat.ChatSegment.html","topicHref":"client/EchoHub.Client.UI.Chat.ChatSegment.html","topicUid":"EchoHub.Client.UI.Chat.ChatSegment","type":"Class"}]},{"name":"EchoHub.Client.UI.Dialogs","href":"client/EchoHub.Client.UI.Dialogs.html","topicHref":"client/EchoHub.Client.UI.Dialogs.html","topicUid":"EchoHub.Client.UI.Dialogs","type":"Namespace","items":[{"name":"AudioPlayerDialog","href":"client/EchoHub.Client.UI.Dialogs.AudioPlayerDialog.html","topicHref":"client/EchoHub.Client.UI.Dialogs.AudioPlayerDialog.html","topicUid":"EchoHub.Client.UI.Dialogs.AudioPlayerDialog","type":"Class"},{"name":"ConnectDialog","href":"client/EchoHub.Client.UI.Dialogs.ConnectDialog.html","topicHref":"client/EchoHub.Client.UI.Dialogs.ConnectDialog.html","topicUid":"EchoHub.Client.UI.Dialogs.ConnectDialog","type":"Class"},{"name":"ConnectDialogResult","href":"client/EchoHub.Client.UI.Dialogs.ConnectDialogResult.html","topicHref":"client/EchoHub.Client.UI.Dialogs.ConnectDialogResult.html","topicUid":"EchoHub.Client.UI.Dialogs.ConnectDialogResult","type":"Class"},{"name":"CreateChannelDialog","href":"client/EchoHub.Client.UI.Dialogs.CreateChannelDialog.html","topicHref":"client/EchoHub.Client.UI.Dialogs.CreateChannelDialog.html","topicUid":"EchoHub.Client.UI.Dialogs.CreateChannelDialog","type":"Class"},{"name":"CreateChannelResult","href":"client/EchoHub.Client.UI.Dialogs.CreateChannelResult.html","topicHref":"client/EchoHub.Client.UI.Dialogs.CreateChannelResult.html","topicUid":"EchoHub.Client.UI.Dialogs.CreateChannelResult","type":"Class"},{"name":"ProfileAction","href":"client/EchoHub.Client.UI.Dialogs.ProfileAction.html","topicHref":"client/EchoHub.Client.UI.Dialogs.ProfileAction.html","topicUid":"EchoHub.Client.UI.Dialogs.ProfileAction","type":"Enum"},{"name":"ProfileEditDialog","href":"client/EchoHub.Client.UI.Dialogs.ProfileEditDialog.html","topicHref":"client/EchoHub.Client.UI.Dialogs.ProfileEditDialog.html","topicUid":"EchoHub.Client.UI.Dialogs.ProfileEditDialog","type":"Class"},{"name":"ProfileEditResult","href":"client/EchoHub.Client.UI.Dialogs.ProfileEditResult.html","topicHref":"client/EchoHub.Client.UI.Dialogs.ProfileEditResult.html","topicUid":"EchoHub.Client.UI.Dialogs.ProfileEditResult","type":"Class"},{"name":"ProfileViewDialog","href":"client/EchoHub.Client.UI.Dialogs.ProfileViewDialog.html","topicHref":"client/EchoHub.Client.UI.Dialogs.ProfileViewDialog.html","topicUid":"EchoHub.Client.UI.Dialogs.ProfileViewDialog","type":"Class"},{"name":"StatusDialog","href":"client/EchoHub.Client.UI.Dialogs.StatusDialog.html","topicHref":"client/EchoHub.Client.UI.Dialogs.StatusDialog.html","topicUid":"EchoHub.Client.UI.Dialogs.StatusDialog","type":"Class"},{"name":"StatusDialogResult","href":"client/EchoHub.Client.UI.Dialogs.StatusDialogResult.html","topicHref":"client/EchoHub.Client.UI.Dialogs.StatusDialogResult.html","topicUid":"EchoHub.Client.UI.Dialogs.StatusDialogResult","type":"Class"},{"name":"UpdateConfirmDialog","href":"client/EchoHub.Client.UI.Dialogs.UpdateConfirmDialog.html","topicHref":"client/EchoHub.Client.UI.Dialogs.UpdateConfirmDialog.html","topicUid":"EchoHub.Client.UI.Dialogs.UpdateConfirmDialog","type":"Class"},{"name":"UpdateProgressDialog","href":"client/EchoHub.Client.UI.Dialogs.UpdateProgressDialog.html","topicHref":"client/EchoHub.Client.UI.Dialogs.UpdateProgressDialog.html","topicUid":"EchoHub.Client.UI.Dialogs.UpdateProgressDialog","type":"Class"}]},{"name":"EchoHub.Client.UI.Helpers","href":"client/EchoHub.Client.UI.Helpers.html","topicHref":"client/EchoHub.Client.UI.Helpers.html","topicUid":"EchoHub.Client.UI.Helpers","type":"Namespace","items":[{"name":"EmojiHelper","href":"client/EchoHub.Client.UI.Helpers.EmojiHelper.html","topicHref":"client/EchoHub.Client.UI.Helpers.EmojiHelper.html","topicUid":"EchoHub.Client.UI.Helpers.EmojiHelper","type":"Class"},{"name":"HexColorHelper","href":"client/EchoHub.Client.UI.Helpers.HexColorHelper.html","topicHref":"client/EchoHub.Client.UI.Helpers.HexColorHelper.html","topicUid":"EchoHub.Client.UI.Helpers.HexColorHelper","type":"Class"}]},{"name":"EchoHub.Client.UI.ListSources","href":"client/EchoHub.Client.UI.ListSources.html","topicHref":"client/EchoHub.Client.UI.ListSources.html","topicUid":"EchoHub.Client.UI.ListSources","type":"Namespace","items":[{"name":"ChannelListSource","href":"client/EchoHub.Client.UI.ListSources.ChannelListSource.html","topicHref":"client/EchoHub.Client.UI.ListSources.ChannelListSource.html","topicUid":"EchoHub.Client.UI.ListSources.ChannelListSource","type":"Class"},{"name":"UserListSource","href":"client/EchoHub.Client.UI.ListSources.UserListSource.html","topicHref":"client/EchoHub.Client.UI.ListSources.UserListSource.html","topicUid":"EchoHub.Client.UI.ListSources.UserListSource","type":"Class"}]}]},{"name":"Articles","includedFrom":"~/api/client-articles/toc.yml","items":[{"name":"Overview","href":"client-articles/index.html","topicHref":"client-articles/index.html"}]}]},{"name":"Core","items":[{"name":"API Reference","includedFrom":"~/_api_meta/core/toc.yml","items":[{"name":"EchoHub.Core.Constants","href":"core/EchoHub.Core.Constants.html","topicHref":"core/EchoHub.Core.Constants.html","topicUid":"EchoHub.Core.Constants","type":"Namespace","items":[{"name":"HubConstants","href":"core/EchoHub.Core.Constants.HubConstants.html","topicHref":"core/EchoHub.Core.Constants.HubConstants.html","topicUid":"EchoHub.Core.Constants.HubConstants","type":"Class"},{"name":"ValidationConstants","href":"core/EchoHub.Core.Constants.ValidationConstants.html","topicHref":"core/EchoHub.Core.Constants.ValidationConstants.html","topicUid":"EchoHub.Core.Constants.ValidationConstants","type":"Class"}]},{"name":"EchoHub.Core.Contracts","href":"core/EchoHub.Core.Contracts.html","topicHref":"core/EchoHub.Core.Contracts.html","topicUid":"EchoHub.Core.Contracts","type":"Namespace","items":[{"name":"ChannelListItem","href":"core/EchoHub.Core.Contracts.ChannelListItem.html","topicHref":"core/EchoHub.Core.Contracts.ChannelListItem.html","topicUid":"EchoHub.Core.Contracts.ChannelListItem","type":"Class"},{"name":"IChannelService","href":"core/EchoHub.Core.Contracts.IChannelService.html","topicHref":"core/EchoHub.Core.Contracts.IChannelService.html","topicUid":"EchoHub.Core.Contracts.IChannelService","type":"Interface"},{"name":"IChatBroadcaster","href":"core/EchoHub.Core.Contracts.IChatBroadcaster.html","topicHref":"core/EchoHub.Core.Contracts.IChatBroadcaster.html","topicUid":"EchoHub.Core.Contracts.IChatBroadcaster","type":"Interface"},{"name":"IChatService","href":"core/EchoHub.Core.Contracts.IChatService.html","topicHref":"core/EchoHub.Core.Contracts.IChatService.html","topicUid":"EchoHub.Core.Contracts.IChatService","type":"Interface"},{"name":"IEchoHubClient","href":"core/EchoHub.Core.Contracts.IEchoHubClient.html","topicHref":"core/EchoHub.Core.Contracts.IEchoHubClient.html","topicUid":"EchoHub.Core.Contracts.IEchoHubClient","type":"Interface"},{"name":"IMessageEncryptionService","href":"core/EchoHub.Core.Contracts.IMessageEncryptionService.html","topicHref":"core/EchoHub.Core.Contracts.IMessageEncryptionService.html","topicUid":"EchoHub.Core.Contracts.IMessageEncryptionService","type":"Interface"}]},{"name":"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":"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":"UserPresenceDto","href":"core/EchoHub.Core.DTOs.UserPresenceDto.html","topicHref":"core/EchoHub.Core.DTOs.UserPresenceDto.html","topicUid":"EchoHub.Core.DTOs.UserPresenceDto","type":"Class"},{"name":"UserProfileDto","href":"core/EchoHub.Core.DTOs.UserProfileDto.html","topicHref":"core/EchoHub.Core.DTOs.UserProfileDto.html","topicUid":"EchoHub.Core.DTOs.UserProfileDto","type":"Class"}]},{"name":"EchoHub.Core.Models","href":"core/EchoHub.Core.Models.html","topicHref":"core/EchoHub.Core.Models.html","topicUid":"EchoHub.Core.Models","type":"Namespace","items":[{"name":"Channel","href":"core/EchoHub.Core.Models.Channel.html","topicHref":"core/EchoHub.Core.Models.Channel.html","topicUid":"EchoHub.Core.Models.Channel","type":"Class"},{"name":"ChannelMembership","href":"core/EchoHub.Core.Models.ChannelMembership.html","topicHref":"core/EchoHub.Core.Models.ChannelMembership.html","topicUid":"EchoHub.Core.Models.ChannelMembership","type":"Class"},{"name":"Message","href":"core/EchoHub.Core.Models.Message.html","topicHref":"core/EchoHub.Core.Models.Message.html","topicUid":"EchoHub.Core.Models.Message","type":"Class"},{"name":"MessageType","href":"core/EchoHub.Core.Models.MessageType.html","topicHref":"core/EchoHub.Core.Models.MessageType.html","topicUid":"EchoHub.Core.Models.MessageType","type":"Enum"},{"name":"RefreshToken","href":"core/EchoHub.Core.Models.RefreshToken.html","topicHref":"core/EchoHub.Core.Models.RefreshToken.html","topicUid":"EchoHub.Core.Models.RefreshToken","type":"Class"},{"name":"ServerRole","href":"core/EchoHub.Core.Models.ServerRole.html","topicHref":"core/EchoHub.Core.Models.ServerRole.html","topicUid":"EchoHub.Core.Models.ServerRole","type":"Enum"},{"name":"User","href":"core/EchoHub.Core.Models.User.html","topicHref":"core/EchoHub.Core.Models.User.html","topicUid":"EchoHub.Core.Models.User","type":"Class"},{"name":"UserStatus","href":"core/EchoHub.Core.Models.UserStatus.html","topicHref":"core/EchoHub.Core.Models.UserStatus.html","topicUid":"EchoHub.Core.Models.UserStatus","type":"Enum"}]}]},{"name":"Articles","includedFrom":"~/api/core-articles/toc.yml","items":[{"name":"Overview","href":"core-articles/index.html","topicHref":"core-articles/index.html"}]}]},{"name":"Server","items":[{"name":"API Reference","includedFrom":"~/_api_meta/server/toc.yml","items":[{"name":"EchoHub.Server.Auth","href":"server/EchoHub.Server.Auth.html","topicHref":"server/EchoHub.Server.Auth.html","topicUid":"EchoHub.Server.Auth","type":"Namespace","items":[{"name":"JwtTokenService","href":"server/EchoHub.Server.Auth.JwtTokenService.html","topicHref":"server/EchoHub.Server.Auth.JwtTokenService.html","topicUid":"EchoHub.Server.Auth.JwtTokenService","type":"Class"}]},{"name":"EchoHub.Server.Controllers","href":"server/EchoHub.Server.Controllers.html","topicHref":"server/EchoHub.Server.Controllers.html","topicUid":"EchoHub.Server.Controllers","type":"Namespace","items":[{"name":"AuthController","href":"server/EchoHub.Server.Controllers.AuthController.html","topicHref":"server/EchoHub.Server.Controllers.AuthController.html","topicUid":"EchoHub.Server.Controllers.AuthController","type":"Class"},{"name":"ChannelsController","href":"server/EchoHub.Server.Controllers.ChannelsController.html","topicHref":"server/EchoHub.Server.Controllers.ChannelsController.html","topicUid":"EchoHub.Server.Controllers.ChannelsController","type":"Class"},{"name":"FilesController","href":"server/EchoHub.Server.Controllers.FilesController.html","topicHref":"server/EchoHub.Server.Controllers.FilesController.html","topicUid":"EchoHub.Server.Controllers.FilesController","type":"Class"},{"name":"ModerationController","href":"server/EchoHub.Server.Controllers.ModerationController.html","topicHref":"server/EchoHub.Server.Controllers.ModerationController.html","topicUid":"EchoHub.Server.Controllers.ModerationController","type":"Class"},{"name":"ServerController","href":"server/EchoHub.Server.Controllers.ServerController.html","topicHref":"server/EchoHub.Server.Controllers.ServerController.html","topicUid":"EchoHub.Server.Controllers.ServerController","type":"Class"},{"name":"UsersController","href":"server/EchoHub.Server.Controllers.UsersController.html","topicHref":"server/EchoHub.Server.Controllers.UsersController.html","topicUid":"EchoHub.Server.Controllers.UsersController","type":"Class"}]},{"name":"EchoHub.Server.Data","href":"server/EchoHub.Server.Data.html","topicHref":"server/EchoHub.Server.Data.html","topicUid":"EchoHub.Server.Data","type":"Namespace","items":[{"name":"EchoHubDbContext","href":"server/EchoHub.Server.Data.EchoHubDbContext.html","topicHref":"server/EchoHub.Server.Data.EchoHubDbContext.html","topicUid":"EchoHub.Server.Data.EchoHubDbContext","type":"Class"}]},{"name":"EchoHub.Server.Data.Migrations","href":"server/EchoHub.Server.Data.Migrations.html","topicHref":"server/EchoHub.Server.Data.Migrations.html","topicUid":"EchoHub.Server.Data.Migrations","type":"Namespace","items":[{"name":"AddAttachmentFileSize","href":"server/EchoHub.Server.Data.Migrations.AddAttachmentFileSize.html","topicHref":"server/EchoHub.Server.Data.Migrations.AddAttachmentFileSize.html","topicUid":"EchoHub.Server.Data.Migrations.AddAttachmentFileSize","type":"Class"},{"name":"AddChannelIsPublic","href":"server/EchoHub.Server.Data.Migrations.AddChannelIsPublic.html","topicHref":"server/EchoHub.Server.Data.Migrations.AddChannelIsPublic.html","topicUid":"EchoHub.Server.Data.Migrations.AddChannelIsPublic","type":"Class"},{"name":"AddChannelMembership","href":"server/EchoHub.Server.Data.Migrations.AddChannelMembership.html","topicHref":"server/EchoHub.Server.Data.Migrations.AddChannelMembership.html","topicUid":"EchoHub.Server.Data.Migrations.AddChannelMembership","type":"Class"},{"name":"AddEncryptionSupport","href":"server/EchoHub.Server.Data.Migrations.AddEncryptionSupport.html","topicHref":"server/EchoHub.Server.Data.Migrations.AddEncryptionSupport.html","topicUid":"EchoHub.Server.Data.Migrations.AddEncryptionSupport","type":"Class"},{"name":"AddMessageEmbed","href":"server/EchoHub.Server.Data.Migrations.AddMessageEmbed.html","topicHref":"server/EchoHub.Server.Data.Migrations.AddMessageEmbed.html","topicUid":"EchoHub.Server.Data.Migrations.AddMessageEmbed","type":"Class"},{"name":"AddModerationRoles","href":"server/EchoHub.Server.Data.Migrations.AddModerationRoles.html","topicHref":"server/EchoHub.Server.Data.Migrations.AddModerationRoles.html","topicUid":"EchoHub.Server.Data.Migrations.AddModerationRoles","type":"Class"},{"name":"InitialCreate","href":"server/EchoHub.Server.Data.Migrations.InitialCreate.html","topicHref":"server/EchoHub.Server.Data.Migrations.InitialCreate.html","topicUid":"EchoHub.Server.Data.Migrations.InitialCreate","type":"Class"}]},{"name":"EchoHub.Server.Hubs","href":"server/EchoHub.Server.Hubs.html","topicHref":"server/EchoHub.Server.Hubs.html","topicUid":"EchoHub.Server.Hubs","type":"Namespace","items":[{"name":"ChatHub","href":"server/EchoHub.Server.Hubs.ChatHub.html","topicHref":"server/EchoHub.Server.Hubs.ChatHub.html","topicUid":"EchoHub.Server.Hubs.ChatHub","type":"Class"}]},{"name":"EchoHub.Server.Services","href":"server/EchoHub.Server.Services.html","topicHref":"server/EchoHub.Server.Services.html","topicUid":"EchoHub.Server.Services","type":"Namespace","items":[{"name":"ChannelService","href":"server/EchoHub.Server.Services.ChannelService.html","topicHref":"server/EchoHub.Server.Services.ChannelService.html","topicUid":"EchoHub.Server.Services.ChannelService","type":"Class"},{"name":"ChatService","href":"server/EchoHub.Server.Services.ChatService.html","topicHref":"server/EchoHub.Server.Services.ChatService.html","topicUid":"EchoHub.Server.Services.ChatService","type":"Class"},{"name":"FileCleanupService","href":"server/EchoHub.Server.Services.FileCleanupService.html","topicHref":"server/EchoHub.Server.Services.FileCleanupService.html","topicUid":"EchoHub.Server.Services.FileCleanupService","type":"Class"},{"name":"FileStorageService","href":"server/EchoHub.Server.Services.FileStorageService.html","topicHref":"server/EchoHub.Server.Services.FileStorageService.html","topicUid":"EchoHub.Server.Services.FileStorageService","type":"Class"},{"name":"FileValidationHelper","href":"server/EchoHub.Server.Services.FileValidationHelper.html","topicHref":"server/EchoHub.Server.Services.FileValidationHelper.html","topicUid":"EchoHub.Server.Services.FileValidationHelper","type":"Class"},{"name":"ImageToAsciiService","href":"server/EchoHub.Server.Services.ImageToAsciiService.html","topicHref":"server/EchoHub.Server.Services.ImageToAsciiService.html","topicUid":"EchoHub.Server.Services.ImageToAsciiService","type":"Class"},{"name":"LinkEmbedService","href":"server/EchoHub.Server.Services.LinkEmbedService.html","topicHref":"server/EchoHub.Server.Services.LinkEmbedService.html","topicUid":"EchoHub.Server.Services.LinkEmbedService","type":"Class"},{"name":"MessageEncryptionService","href":"server/EchoHub.Server.Services.MessageEncryptionService.html","topicHref":"server/EchoHub.Server.Services.MessageEncryptionService.html","topicUid":"EchoHub.Server.Services.MessageEncryptionService","type":"Class"},{"name":"PresenceTracker","href":"server/EchoHub.Server.Services.PresenceTracker.html","topicHref":"server/EchoHub.Server.Services.PresenceTracker.html","topicUid":"EchoHub.Server.Services.PresenceTracker","type":"Class"},{"name":"ServerDirectoryService","href":"server/EchoHub.Server.Services.ServerDirectoryService.html","topicHref":"server/EchoHub.Server.Services.ServerDirectoryService.html","topicUid":"EchoHub.Server.Services.ServerDirectoryService","type":"Class"},{"name":"SignalRBroadcaster","href":"server/EchoHub.Server.Services.SignalRBroadcaster.html","topicHref":"server/EchoHub.Server.Services.SignalRBroadcaster.html","topicUid":"EchoHub.Server.Services.SignalRBroadcaster","type":"Class"}]},{"name":"EchoHub.Server.Setup","href":"server/EchoHub.Server.Setup.html","topicHref":"server/EchoHub.Server.Setup.html","topicUid":"EchoHub.Server.Setup","type":"Namespace","items":[{"name":"DataMigrationService","href":"server/EchoHub.Server.Setup.DataMigrationService.html","topicHref":"server/EchoHub.Server.Setup.DataMigrationService.html","topicUid":"EchoHub.Server.Setup.DataMigrationService","type":"Class"},{"name":"DatabaseSetup","href":"server/EchoHub.Server.Setup.DatabaseSetup.html","topicHref":"server/EchoHub.Server.Setup.DatabaseSetup.html","topicUid":"EchoHub.Server.Setup.DatabaseSetup","type":"Class"},{"name":"FirstRunSetup","href":"server/EchoHub.Server.Setup.FirstRunSetup.html","topicHref":"server/EchoHub.Server.Setup.FirstRunSetup.html","topicUid":"EchoHub.Server.Setup.FirstRunSetup","type":"Class"}]}]},{"name":"Articles","includedFrom":"~/api/server-articles/toc.yml","items":[{"name":"Overview","href":"server-articles/index.html","topicHref":"server-articles/index.html"}]}]},{"name":"Server.Irc","items":[{"name":"API Reference","includedFrom":"~/_api_meta/server-irc/toc.yml","items":[{"name":"EchoHub.Server.Irc","href":"server-irc/EchoHub.Server.Irc.html","topicHref":"server-irc/EchoHub.Server.Irc.html","topicUid":"EchoHub.Server.Irc","type":"Namespace","items":[{"name":"IrcBroadcaster","href":"server-irc/EchoHub.Server.Irc.IrcBroadcaster.html","topicHref":"server-irc/EchoHub.Server.Irc.IrcBroadcaster.html","topicUid":"EchoHub.Server.Irc.IrcBroadcaster","type":"Class"},{"name":"IrcClientConnection","href":"server-irc/EchoHub.Server.Irc.IrcClientConnection.html","topicHref":"server-irc/EchoHub.Server.Irc.IrcClientConnection.html","topicUid":"EchoHub.Server.Irc.IrcClientConnection","type":"Class"},{"name":"IrcCommandHandler","href":"server-irc/EchoHub.Server.Irc.IrcCommandHandler.html","topicHref":"server-irc/EchoHub.Server.Irc.IrcCommandHandler.html","topicUid":"EchoHub.Server.Irc.IrcCommandHandler","type":"Class"},{"name":"IrcGatewayService","href":"server-irc/EchoHub.Server.Irc.IrcGatewayService.html","topicHref":"server-irc/EchoHub.Server.Irc.IrcGatewayService.html","topicUid":"EchoHub.Server.Irc.IrcGatewayService","type":"Class"},{"name":"IrcMessage","href":"server-irc/EchoHub.Server.Irc.IrcMessage.html","topicHref":"server-irc/EchoHub.Server.Irc.IrcMessage.html","topicUid":"EchoHub.Server.Irc.IrcMessage","type":"Class"},{"name":"IrcMessageFormatter","href":"server-irc/EchoHub.Server.Irc.IrcMessageFormatter.html","topicHref":"server-irc/EchoHub.Server.Irc.IrcMessageFormatter.html","topicUid":"EchoHub.Server.Irc.IrcMessageFormatter","type":"Class"},{"name":"IrcNumericReply","href":"server-irc/EchoHub.Server.Irc.IrcNumericReply.html","topicHref":"server-irc/EchoHub.Server.Irc.IrcNumericReply.html","topicUid":"EchoHub.Server.Irc.IrcNumericReply","type":"Class"},{"name":"IrcOptions","href":"server-irc/EchoHub.Server.Irc.IrcOptions.html","topicHref":"server-irc/EchoHub.Server.Irc.IrcOptions.html","topicUid":"EchoHub.Server.Irc.IrcOptions","type":"Class"},{"name":"IrcServiceExtensions","href":"server-irc/EchoHub.Server.Irc.IrcServiceExtensions.html","topicHref":"server-irc/EchoHub.Server.Irc.IrcServiceExtensions.html","topicUid":"EchoHub.Server.Irc.IrcServiceExtensions","type":"Class"}]}]}]}]} +{"items":[{"name":"Client","items":[{"name":"API Reference","includedFrom":"~/_api_meta/client/toc.yml","items":[{"name":"EchoHub.Client","href":"client/EchoHub.Client.html","topicHref":"client/EchoHub.Client.html","topicUid":"EchoHub.Client","type":"Namespace","items":[{"name":"AppOrchestrator","href":"client/EchoHub.Client.AppOrchestrator.html","topicHref":"client/EchoHub.Client.AppOrchestrator.html","topicUid":"EchoHub.Client.AppOrchestrator","type":"Class"}]},{"name":"EchoHub.Client.Commands","href":"client/EchoHub.Client.Commands.html","topicHref":"client/EchoHub.Client.Commands.html","topicUid":"EchoHub.Client.Commands","type":"Namespace","items":[{"name":"CommandHandler","href":"client/EchoHub.Client.Commands.CommandHandler.html","topicHref":"client/EchoHub.Client.Commands.CommandHandler.html","topicUid":"EchoHub.Client.Commands.CommandHandler","type":"Class"},{"name":"CommandResult","href":"client/EchoHub.Client.Commands.CommandResult.html","topicHref":"client/EchoHub.Client.Commands.CommandResult.html","topicUid":"EchoHub.Client.Commands.CommandResult","type":"Class"}]},{"name":"EchoHub.Client.Config","href":"client/EchoHub.Client.Config.html","topicHref":"client/EchoHub.Client.Config.html","topicUid":"EchoHub.Client.Config","type":"Namespace","items":[{"name":"AccountPreset","href":"client/EchoHub.Client.Config.AccountPreset.html","topicHref":"client/EchoHub.Client.Config.AccountPreset.html","topicUid":"EchoHub.Client.Config.AccountPreset","type":"Class"},{"name":"ClientConfig","href":"client/EchoHub.Client.Config.ClientConfig.html","topicHref":"client/EchoHub.Client.Config.ClientConfig.html","topicUid":"EchoHub.Client.Config.ClientConfig","type":"Class"},{"name":"ConfigManager","href":"client/EchoHub.Client.Config.ConfigManager.html","topicHref":"client/EchoHub.Client.Config.ConfigManager.html","topicUid":"EchoHub.Client.Config.ConfigManager","type":"Class"},{"name":"NotificationConfig","href":"client/EchoHub.Client.Config.NotificationConfig.html","topicHref":"client/EchoHub.Client.Config.NotificationConfig.html","topicUid":"EchoHub.Client.Config.NotificationConfig","type":"Class"},{"name":"SavedServer","href":"client/EchoHub.Client.Config.SavedServer.html","topicHref":"client/EchoHub.Client.Config.SavedServer.html","topicUid":"EchoHub.Client.Config.SavedServer","type":"Class"}]},{"name":"EchoHub.Client.Services","href":"client/EchoHub.Client.Services.html","topicHref":"client/EchoHub.Client.Services.html","topicUid":"EchoHub.Client.Services","type":"Namespace","items":[{"name":"ApiClient","href":"client/EchoHub.Client.Services.ApiClient.html","topicHref":"client/EchoHub.Client.Services.ApiClient.html","topicUid":"EchoHub.Client.Services.ApiClient","type":"Class"},{"name":"AsyncRunner","href":"client/EchoHub.Client.Services.AsyncRunner.html","topicHref":"client/EchoHub.Client.Services.AsyncRunner.html","topicUid":"EchoHub.Client.Services.AsyncRunner","type":"Class"},{"name":"AudioPlaybackService","href":"client/EchoHub.Client.Services.AudioPlaybackService.html","topicHref":"client/EchoHub.Client.Services.AudioPlaybackService.html","topicUid":"EchoHub.Client.Services.AudioPlaybackService","type":"Class"},{"name":"BackupInfo","href":"client/EchoHub.Client.Services.BackupInfo.html","topicHref":"client/EchoHub.Client.Services.BackupInfo.html","topicUid":"EchoHub.Client.Services.BackupInfo","type":"Class"},{"name":"ClientEncryptionService","href":"client/EchoHub.Client.Services.ClientEncryptionService.html","topicHref":"client/EchoHub.Client.Services.ClientEncryptionService.html","topicUid":"EchoHub.Client.Services.ClientEncryptionService","type":"Class"},{"name":"EchoHubConnection","href":"client/EchoHub.Client.Services.EchoHubConnection.html","topicHref":"client/EchoHub.Client.Services.EchoHubConnection.html","topicUid":"EchoHub.Client.Services.EchoHubConnection","type":"Class"},{"name":"NotificationSoundService","href":"client/EchoHub.Client.Services.NotificationSoundService.html","topicHref":"client/EchoHub.Client.Services.NotificationSoundService.html","topicUid":"EchoHub.Client.Services.NotificationSoundService","type":"Class"},{"name":"PathSetup","href":"client/EchoHub.Client.Services.PathSetup.html","topicHref":"client/EchoHub.Client.Services.PathSetup.html","topicUid":"EchoHub.Client.Services.PathSetup","type":"Class"},{"name":"UpdateBackupService","href":"client/EchoHub.Client.Services.UpdateBackupService.html","topicHref":"client/EchoHub.Client.Services.UpdateBackupService.html","topicUid":"EchoHub.Client.Services.UpdateBackupService","type":"Class"},{"name":"UpdateChecker","href":"client/EchoHub.Client.Services.UpdateChecker.html","topicHref":"client/EchoHub.Client.Services.UpdateChecker.html","topicUid":"EchoHub.Client.Services.UpdateChecker","type":"Class"}]},{"name":"EchoHub.Client.Themes","href":"client/EchoHub.Client.Themes.html","topicHref":"client/EchoHub.Client.Themes.html","topicUid":"EchoHub.Client.Themes","type":"Namespace","items":[{"name":"Theme","href":"client/EchoHub.Client.Themes.Theme.html","topicHref":"client/EchoHub.Client.Themes.Theme.html","topicUid":"EchoHub.Client.Themes.Theme","type":"Class"},{"name":"ThemeColors","href":"client/EchoHub.Client.Themes.ThemeColors.html","topicHref":"client/EchoHub.Client.Themes.ThemeColors.html","topicUid":"EchoHub.Client.Themes.ThemeColors","type":"Class"},{"name":"ThemeManager","href":"client/EchoHub.Client.Themes.ThemeManager.html","topicHref":"client/EchoHub.Client.Themes.ThemeManager.html","topicUid":"EchoHub.Client.Themes.ThemeManager","type":"Class"}]},{"name":"EchoHub.Client.UI","href":"client/EchoHub.Client.UI.html","topicHref":"client/EchoHub.Client.UI.html","topicUid":"EchoHub.Client.UI","type":"Namespace","items":[{"name":"MainWindow","href":"client/EchoHub.Client.UI.MainWindow.html","topicHref":"client/EchoHub.Client.UI.MainWindow.html","topicUid":"EchoHub.Client.UI.MainWindow","type":"Class"}]},{"name":"EchoHub.Client.UI.Chat","href":"client/EchoHub.Client.UI.Chat.html","topicHref":"client/EchoHub.Client.UI.Chat.html","topicUid":"EchoHub.Client.UI.Chat","type":"Namespace","items":[{"name":"ChatColors","href":"client/EchoHub.Client.UI.Chat.ChatColors.html","topicHref":"client/EchoHub.Client.UI.Chat.ChatColors.html","topicUid":"EchoHub.Client.UI.Chat.ChatColors","type":"Class"},{"name":"ChatLine","href":"client/EchoHub.Client.UI.Chat.ChatLine.html","topicHref":"client/EchoHub.Client.UI.Chat.ChatLine.html","topicUid":"EchoHub.Client.UI.Chat.ChatLine","type":"Class"},{"name":"ChatListSource","href":"client/EchoHub.Client.UI.Chat.ChatListSource.html","topicHref":"client/EchoHub.Client.UI.Chat.ChatListSource.html","topicUid":"EchoHub.Client.UI.Chat.ChatListSource","type":"Class"},{"name":"ChatMessageManager","href":"client/EchoHub.Client.UI.Chat.ChatMessageManager.html","topicHref":"client/EchoHub.Client.UI.Chat.ChatMessageManager.html","topicUid":"EchoHub.Client.UI.Chat.ChatMessageManager","type":"Class"},{"name":"ChatSegment","href":"client/EchoHub.Client.UI.Chat.ChatSegment.html","topicHref":"client/EchoHub.Client.UI.Chat.ChatSegment.html","topicUid":"EchoHub.Client.UI.Chat.ChatSegment","type":"Class"}]},{"name":"EchoHub.Client.UI.Dialogs","href":"client/EchoHub.Client.UI.Dialogs.html","topicHref":"client/EchoHub.Client.UI.Dialogs.html","topicUid":"EchoHub.Client.UI.Dialogs","type":"Namespace","items":[{"name":"AudioPlayerDialog","href":"client/EchoHub.Client.UI.Dialogs.AudioPlayerDialog.html","topicHref":"client/EchoHub.Client.UI.Dialogs.AudioPlayerDialog.html","topicUid":"EchoHub.Client.UI.Dialogs.AudioPlayerDialog","type":"Class"},{"name":"ConnectDialog","href":"client/EchoHub.Client.UI.Dialogs.ConnectDialog.html","topicHref":"client/EchoHub.Client.UI.Dialogs.ConnectDialog.html","topicUid":"EchoHub.Client.UI.Dialogs.ConnectDialog","type":"Class"},{"name":"ConnectDialogResult","href":"client/EchoHub.Client.UI.Dialogs.ConnectDialogResult.html","topicHref":"client/EchoHub.Client.UI.Dialogs.ConnectDialogResult.html","topicUid":"EchoHub.Client.UI.Dialogs.ConnectDialogResult","type":"Class"},{"name":"CreateChannelDialog","href":"client/EchoHub.Client.UI.Dialogs.CreateChannelDialog.html","topicHref":"client/EchoHub.Client.UI.Dialogs.CreateChannelDialog.html","topicUid":"EchoHub.Client.UI.Dialogs.CreateChannelDialog","type":"Class"},{"name":"CreateChannelResult","href":"client/EchoHub.Client.UI.Dialogs.CreateChannelResult.html","topicHref":"client/EchoHub.Client.UI.Dialogs.CreateChannelResult.html","topicUid":"EchoHub.Client.UI.Dialogs.CreateChannelResult","type":"Class"},{"name":"ProfileAction","href":"client/EchoHub.Client.UI.Dialogs.ProfileAction.html","topicHref":"client/EchoHub.Client.UI.Dialogs.ProfileAction.html","topicUid":"EchoHub.Client.UI.Dialogs.ProfileAction","type":"Enum"},{"name":"ProfileEditDialog","href":"client/EchoHub.Client.UI.Dialogs.ProfileEditDialog.html","topicHref":"client/EchoHub.Client.UI.Dialogs.ProfileEditDialog.html","topicUid":"EchoHub.Client.UI.Dialogs.ProfileEditDialog","type":"Class"},{"name":"ProfileEditResult","href":"client/EchoHub.Client.UI.Dialogs.ProfileEditResult.html","topicHref":"client/EchoHub.Client.UI.Dialogs.ProfileEditResult.html","topicUid":"EchoHub.Client.UI.Dialogs.ProfileEditResult","type":"Class"},{"name":"ProfileViewDialog","href":"client/EchoHub.Client.UI.Dialogs.ProfileViewDialog.html","topicHref":"client/EchoHub.Client.UI.Dialogs.ProfileViewDialog.html","topicUid":"EchoHub.Client.UI.Dialogs.ProfileViewDialog","type":"Class"},{"name":"StatusDialog","href":"client/EchoHub.Client.UI.Dialogs.StatusDialog.html","topicHref":"client/EchoHub.Client.UI.Dialogs.StatusDialog.html","topicUid":"EchoHub.Client.UI.Dialogs.StatusDialog","type":"Class"},{"name":"StatusDialogResult","href":"client/EchoHub.Client.UI.Dialogs.StatusDialogResult.html","topicHref":"client/EchoHub.Client.UI.Dialogs.StatusDialogResult.html","topicUid":"EchoHub.Client.UI.Dialogs.StatusDialogResult","type":"Class"},{"name":"UpdateConfirmDialog","href":"client/EchoHub.Client.UI.Dialogs.UpdateConfirmDialog.html","topicHref":"client/EchoHub.Client.UI.Dialogs.UpdateConfirmDialog.html","topicUid":"EchoHub.Client.UI.Dialogs.UpdateConfirmDialog","type":"Class"},{"name":"UpdateProgressDialog","href":"client/EchoHub.Client.UI.Dialogs.UpdateProgressDialog.html","topicHref":"client/EchoHub.Client.UI.Dialogs.UpdateProgressDialog.html","topicUid":"EchoHub.Client.UI.Dialogs.UpdateProgressDialog","type":"Class"}]},{"name":"EchoHub.Client.UI.Helpers","href":"client/EchoHub.Client.UI.Helpers.html","topicHref":"client/EchoHub.Client.UI.Helpers.html","topicUid":"EchoHub.Client.UI.Helpers","type":"Namespace","items":[{"name":"EmojiHelper","href":"client/EchoHub.Client.UI.Helpers.EmojiHelper.html","topicHref":"client/EchoHub.Client.UI.Helpers.EmojiHelper.html","topicUid":"EchoHub.Client.UI.Helpers.EmojiHelper","type":"Class"},{"name":"HexColorHelper","href":"client/EchoHub.Client.UI.Helpers.HexColorHelper.html","topicHref":"client/EchoHub.Client.UI.Helpers.HexColorHelper.html","topicUid":"EchoHub.Client.UI.Helpers.HexColorHelper","type":"Class"}]},{"name":"EchoHub.Client.UI.ListSources","href":"client/EchoHub.Client.UI.ListSources.html","topicHref":"client/EchoHub.Client.UI.ListSources.html","topicUid":"EchoHub.Client.UI.ListSources","type":"Namespace","items":[{"name":"ChannelListSource","href":"client/EchoHub.Client.UI.ListSources.ChannelListSource.html","topicHref":"client/EchoHub.Client.UI.ListSources.ChannelListSource.html","topicUid":"EchoHub.Client.UI.ListSources.ChannelListSource","type":"Class"},{"name":"UserListSource","href":"client/EchoHub.Client.UI.ListSources.UserListSource.html","topicHref":"client/EchoHub.Client.UI.ListSources.UserListSource.html","topicUid":"EchoHub.Client.UI.ListSources.UserListSource","type":"Class"}]}]},{"name":"Articles","includedFrom":"~/api/client-articles/toc.yml","items":[{"name":"Overview","href":"client-articles/index.html","topicHref":"client-articles/index.html"}]}]},{"name":"Core","items":[{"name":"API Reference","includedFrom":"~/_api_meta/core/toc.yml","items":[{"name":"EchoHub.Core.Constants","href":"core/EchoHub.Core.Constants.html","topicHref":"core/EchoHub.Core.Constants.html","topicUid":"EchoHub.Core.Constants","type":"Namespace","items":[{"name":"HubConstants","href":"core/EchoHub.Core.Constants.HubConstants.html","topicHref":"core/EchoHub.Core.Constants.HubConstants.html","topicUid":"EchoHub.Core.Constants.HubConstants","type":"Class"},{"name":"ValidationConstants","href":"core/EchoHub.Core.Constants.ValidationConstants.html","topicHref":"core/EchoHub.Core.Constants.ValidationConstants.html","topicUid":"EchoHub.Core.Constants.ValidationConstants","type":"Class"}]},{"name":"EchoHub.Core.Contracts","href":"core/EchoHub.Core.Contracts.html","topicHref":"core/EchoHub.Core.Contracts.html","topicUid":"EchoHub.Core.Contracts","type":"Namespace","items":[{"name":"ChannelListItem","href":"core/EchoHub.Core.Contracts.ChannelListItem.html","topicHref":"core/EchoHub.Core.Contracts.ChannelListItem.html","topicUid":"EchoHub.Core.Contracts.ChannelListItem","type":"Class"},{"name":"IChannelService","href":"core/EchoHub.Core.Contracts.IChannelService.html","topicHref":"core/EchoHub.Core.Contracts.IChannelService.html","topicUid":"EchoHub.Core.Contracts.IChannelService","type":"Interface"},{"name":"IChatBroadcaster","href":"core/EchoHub.Core.Contracts.IChatBroadcaster.html","topicHref":"core/EchoHub.Core.Contracts.IChatBroadcaster.html","topicUid":"EchoHub.Core.Contracts.IChatBroadcaster","type":"Interface"},{"name":"IChatService","href":"core/EchoHub.Core.Contracts.IChatService.html","topicHref":"core/EchoHub.Core.Contracts.IChatService.html","topicUid":"EchoHub.Core.Contracts.IChatService","type":"Interface"},{"name":"IEchoHubClient","href":"core/EchoHub.Core.Contracts.IEchoHubClient.html","topicHref":"core/EchoHub.Core.Contracts.IEchoHubClient.html","topicUid":"EchoHub.Core.Contracts.IEchoHubClient","type":"Interface"},{"name":"IMessageEncryptionService","href":"core/EchoHub.Core.Contracts.IMessageEncryptionService.html","topicHref":"core/EchoHub.Core.Contracts.IMessageEncryptionService.html","topicUid":"EchoHub.Core.Contracts.IMessageEncryptionService","type":"Interface"},{"name":"IUserService","href":"core/EchoHub.Core.Contracts.IUserService.html","topicHref":"core/EchoHub.Core.Contracts.IUserService.html","topicUid":"EchoHub.Core.Contracts.IUserService","type":"Interface"}]},{"name":"EchoHub.Core.DTOs","href":"core/EchoHub.Core.DTOs.html","topicHref":"core/EchoHub.Core.DTOs.html","topicUid":"EchoHub.Core.DTOs","type":"Namespace","items":[{"name":"ApiResponse","href":"core/EchoHub.Core.DTOs.ApiResponse.html","topicHref":"core/EchoHub.Core.DTOs.ApiResponse.html","topicUid":"EchoHub.Core.DTOs.ApiResponse","type":"Class"},{"name":"ApiResponse","href":"core/EchoHub.Core.DTOs.ApiResponse-1.html","topicHref":"core/EchoHub.Core.DTOs.ApiResponse-1.html","topicUid":"EchoHub.Core.DTOs.ApiResponse`1","type":"Class"},{"name":"AssignRoleRequest","href":"core/EchoHub.Core.DTOs.AssignRoleRequest.html","topicHref":"core/EchoHub.Core.DTOs.AssignRoleRequest.html","topicUid":"EchoHub.Core.DTOs.AssignRoleRequest","type":"Class"},{"name":"AvatarUploadResponse","href":"core/EchoHub.Core.DTOs.AvatarUploadResponse.html","topicHref":"core/EchoHub.Core.DTOs.AvatarUploadResponse.html","topicUid":"EchoHub.Core.DTOs.AvatarUploadResponse","type":"Class"},{"name":"BanRequest","href":"core/EchoHub.Core.DTOs.BanRequest.html","topicHref":"core/EchoHub.Core.DTOs.BanRequest.html","topicUid":"EchoHub.Core.DTOs.BanRequest","type":"Class"},{"name":"ChannelDto","href":"core/EchoHub.Core.DTOs.ChannelDto.html","topicHref":"core/EchoHub.Core.DTOs.ChannelDto.html","topicUid":"EchoHub.Core.DTOs.ChannelDto","type":"Class"},{"name":"ChannelError","href":"core/EchoHub.Core.DTOs.ChannelError.html","topicHref":"core/EchoHub.Core.DTOs.ChannelError.html","topicUid":"EchoHub.Core.DTOs.ChannelError","type":"Enum"},{"name":"ChannelOperationResult","href":"core/EchoHub.Core.DTOs.ChannelOperationResult.html","topicHref":"core/EchoHub.Core.DTOs.ChannelOperationResult.html","topicUid":"EchoHub.Core.DTOs.ChannelOperationResult","type":"Class"},{"name":"CreateChannelRequest","href":"core/EchoHub.Core.DTOs.CreateChannelRequest.html","topicHref":"core/EchoHub.Core.DTOs.CreateChannelRequest.html","topicUid":"EchoHub.Core.DTOs.CreateChannelRequest","type":"Class"},{"name":"EmbedDto","href":"core/EchoHub.Core.DTOs.EmbedDto.html","topicHref":"core/EchoHub.Core.DTOs.EmbedDto.html","topicUid":"EchoHub.Core.DTOs.EmbedDto","type":"Class"},{"name":"EncryptionKeyResponse","href":"core/EchoHub.Core.DTOs.EncryptionKeyResponse.html","topicHref":"core/EchoHub.Core.DTOs.EncryptionKeyResponse.html","topicUid":"EchoHub.Core.DTOs.EncryptionKeyResponse","type":"Class"},{"name":"ErrorResponse","href":"core/EchoHub.Core.DTOs.ErrorResponse.html","topicHref":"core/EchoHub.Core.DTOs.ErrorResponse.html","topicUid":"EchoHub.Core.DTOs.ErrorResponse","type":"Class"},{"name":"JoinChannelResult","href":"core/EchoHub.Core.DTOs.JoinChannelResult.html","topicHref":"core/EchoHub.Core.DTOs.JoinChannelResult.html","topicUid":"EchoHub.Core.DTOs.JoinChannelResult","type":"Class"},{"name":"KickRequest","href":"core/EchoHub.Core.DTOs.KickRequest.html","topicHref":"core/EchoHub.Core.DTOs.KickRequest.html","topicUid":"EchoHub.Core.DTOs.KickRequest","type":"Class"},{"name":"LoginRequest","href":"core/EchoHub.Core.DTOs.LoginRequest.html","topicHref":"core/EchoHub.Core.DTOs.LoginRequest.html","topicUid":"EchoHub.Core.DTOs.LoginRequest","type":"Class"},{"name":"LoginResponse","href":"core/EchoHub.Core.DTOs.LoginResponse.html","topicHref":"core/EchoHub.Core.DTOs.LoginResponse.html","topicUid":"EchoHub.Core.DTOs.LoginResponse","type":"Class"},{"name":"MessageDto","href":"core/EchoHub.Core.DTOs.MessageDto.html","topicHref":"core/EchoHub.Core.DTOs.MessageDto.html","topicUid":"EchoHub.Core.DTOs.MessageDto","type":"Class"},{"name":"MuteRequest","href":"core/EchoHub.Core.DTOs.MuteRequest.html","topicHref":"core/EchoHub.Core.DTOs.MuteRequest.html","topicUid":"EchoHub.Core.DTOs.MuteRequest","type":"Class"},{"name":"PaginatedResponse","href":"core/EchoHub.Core.DTOs.PaginatedResponse-1.html","topicHref":"core/EchoHub.Core.DTOs.PaginatedResponse-1.html","topicUid":"EchoHub.Core.DTOs.PaginatedResponse`1","type":"Class"},{"name":"RefreshRequest","href":"core/EchoHub.Core.DTOs.RefreshRequest.html","topicHref":"core/EchoHub.Core.DTOs.RefreshRequest.html","topicUid":"EchoHub.Core.DTOs.RefreshRequest","type":"Class"},{"name":"RegisterRequest","href":"core/EchoHub.Core.DTOs.RegisterRequest.html","topicHref":"core/EchoHub.Core.DTOs.RegisterRequest.html","topicUid":"EchoHub.Core.DTOs.RegisterRequest","type":"Class"},{"name":"SendMessageRequest","href":"core/EchoHub.Core.DTOs.SendMessageRequest.html","topicHref":"core/EchoHub.Core.DTOs.SendMessageRequest.html","topicUid":"EchoHub.Core.DTOs.SendMessageRequest","type":"Class"},{"name":"SendUrlRequest","href":"core/EchoHub.Core.DTOs.SendUrlRequest.html","topicHref":"core/EchoHub.Core.DTOs.SendUrlRequest.html","topicUid":"EchoHub.Core.DTOs.SendUrlRequest","type":"Class"},{"name":"ServerStatusDto","href":"core/EchoHub.Core.DTOs.ServerStatusDto.html","topicHref":"core/EchoHub.Core.DTOs.ServerStatusDto.html","topicUid":"EchoHub.Core.DTOs.ServerStatusDto","type":"Class"},{"name":"UpdateProfileRequest","href":"core/EchoHub.Core.DTOs.UpdateProfileRequest.html","topicHref":"core/EchoHub.Core.DTOs.UpdateProfileRequest.html","topicUid":"EchoHub.Core.DTOs.UpdateProfileRequest","type":"Class"},{"name":"UpdateStatusRequest","href":"core/EchoHub.Core.DTOs.UpdateStatusRequest.html","topicHref":"core/EchoHub.Core.DTOs.UpdateStatusRequest.html","topicUid":"EchoHub.Core.DTOs.UpdateStatusRequest","type":"Class"},{"name":"UpdateTopicRequest","href":"core/EchoHub.Core.DTOs.UpdateTopicRequest.html","topicHref":"core/EchoHub.Core.DTOs.UpdateTopicRequest.html","topicUid":"EchoHub.Core.DTOs.UpdateTopicRequest","type":"Class"},{"name":"UserDto","href":"core/EchoHub.Core.DTOs.UserDto.html","topicHref":"core/EchoHub.Core.DTOs.UserDto.html","topicUid":"EchoHub.Core.DTOs.UserDto","type":"Class"},{"name":"UserError","href":"core/EchoHub.Core.DTOs.UserError.html","topicHref":"core/EchoHub.Core.DTOs.UserError.html","topicUid":"EchoHub.Core.DTOs.UserError","type":"Enum"},{"name":"UserOperationResult","href":"core/EchoHub.Core.DTOs.UserOperationResult.html","topicHref":"core/EchoHub.Core.DTOs.UserOperationResult.html","topicUid":"EchoHub.Core.DTOs.UserOperationResult","type":"Class"},{"name":"UserPresenceDto","href":"core/EchoHub.Core.DTOs.UserPresenceDto.html","topicHref":"core/EchoHub.Core.DTOs.UserPresenceDto.html","topicUid":"EchoHub.Core.DTOs.UserPresenceDto","type":"Class"},{"name":"UserProfileDto","href":"core/EchoHub.Core.DTOs.UserProfileDto.html","topicHref":"core/EchoHub.Core.DTOs.UserProfileDto.html","topicUid":"EchoHub.Core.DTOs.UserProfileDto","type":"Class"}]},{"name":"EchoHub.Core.Models","href":"core/EchoHub.Core.Models.html","topicHref":"core/EchoHub.Core.Models.html","topicUid":"EchoHub.Core.Models","type":"Namespace","items":[{"name":"Channel","href":"core/EchoHub.Core.Models.Channel.html","topicHref":"core/EchoHub.Core.Models.Channel.html","topicUid":"EchoHub.Core.Models.Channel","type":"Class"},{"name":"ChannelMembership","href":"core/EchoHub.Core.Models.ChannelMembership.html","topicHref":"core/EchoHub.Core.Models.ChannelMembership.html","topicUid":"EchoHub.Core.Models.ChannelMembership","type":"Class"},{"name":"Message","href":"core/EchoHub.Core.Models.Message.html","topicHref":"core/EchoHub.Core.Models.Message.html","topicUid":"EchoHub.Core.Models.Message","type":"Class"},{"name":"MessageType","href":"core/EchoHub.Core.Models.MessageType.html","topicHref":"core/EchoHub.Core.Models.MessageType.html","topicUid":"EchoHub.Core.Models.MessageType","type":"Enum"},{"name":"RefreshToken","href":"core/EchoHub.Core.Models.RefreshToken.html","topicHref":"core/EchoHub.Core.Models.RefreshToken.html","topicUid":"EchoHub.Core.Models.RefreshToken","type":"Class"},{"name":"ServerRole","href":"core/EchoHub.Core.Models.ServerRole.html","topicHref":"core/EchoHub.Core.Models.ServerRole.html","topicUid":"EchoHub.Core.Models.ServerRole","type":"Enum"},{"name":"User","href":"core/EchoHub.Core.Models.User.html","topicHref":"core/EchoHub.Core.Models.User.html","topicUid":"EchoHub.Core.Models.User","type":"Class"},{"name":"UserStatus","href":"core/EchoHub.Core.Models.UserStatus.html","topicHref":"core/EchoHub.Core.Models.UserStatus.html","topicUid":"EchoHub.Core.Models.UserStatus","type":"Enum"}]}]},{"name":"Articles","includedFrom":"~/api/core-articles/toc.yml","items":[{"name":"Overview","href":"core-articles/index.html","topicHref":"core-articles/index.html"}]}]},{"name":"Server","items":[{"name":"API Reference","includedFrom":"~/_api_meta/server/toc.yml","items":[{"name":"EchoHub.Server.Auth","href":"server/EchoHub.Server.Auth.html","topicHref":"server/EchoHub.Server.Auth.html","topicUid":"EchoHub.Server.Auth","type":"Namespace","items":[{"name":"JwtTokenService","href":"server/EchoHub.Server.Auth.JwtTokenService.html","topicHref":"server/EchoHub.Server.Auth.JwtTokenService.html","topicUid":"EchoHub.Server.Auth.JwtTokenService","type":"Class"}]},{"name":"EchoHub.Server.Controllers","href":"server/EchoHub.Server.Controllers.html","topicHref":"server/EchoHub.Server.Controllers.html","topicUid":"EchoHub.Server.Controllers","type":"Namespace","items":[{"name":"AuthController","href":"server/EchoHub.Server.Controllers.AuthController.html","topicHref":"server/EchoHub.Server.Controllers.AuthController.html","topicUid":"EchoHub.Server.Controllers.AuthController","type":"Class"},{"name":"ChannelsController","href":"server/EchoHub.Server.Controllers.ChannelsController.html","topicHref":"server/EchoHub.Server.Controllers.ChannelsController.html","topicUid":"EchoHub.Server.Controllers.ChannelsController","type":"Class"},{"name":"FilesController","href":"server/EchoHub.Server.Controllers.FilesController.html","topicHref":"server/EchoHub.Server.Controllers.FilesController.html","topicUid":"EchoHub.Server.Controllers.FilesController","type":"Class"},{"name":"ModerationController","href":"server/EchoHub.Server.Controllers.ModerationController.html","topicHref":"server/EchoHub.Server.Controllers.ModerationController.html","topicUid":"EchoHub.Server.Controllers.ModerationController","type":"Class"},{"name":"ServerController","href":"server/EchoHub.Server.Controllers.ServerController.html","topicHref":"server/EchoHub.Server.Controllers.ServerController.html","topicUid":"EchoHub.Server.Controllers.ServerController","type":"Class"},{"name":"UsersController","href":"server/EchoHub.Server.Controllers.UsersController.html","topicHref":"server/EchoHub.Server.Controllers.UsersController.html","topicUid":"EchoHub.Server.Controllers.UsersController","type":"Class"}]},{"name":"EchoHub.Server.Data","href":"server/EchoHub.Server.Data.html","topicHref":"server/EchoHub.Server.Data.html","topicUid":"EchoHub.Server.Data","type":"Namespace","items":[{"name":"EchoHubDbContext","href":"server/EchoHub.Server.Data.EchoHubDbContext.html","topicHref":"server/EchoHub.Server.Data.EchoHubDbContext.html","topicUid":"EchoHub.Server.Data.EchoHubDbContext","type":"Class"}]},{"name":"EchoHub.Server.Data.Migrations","href":"server/EchoHub.Server.Data.Migrations.html","topicHref":"server/EchoHub.Server.Data.Migrations.html","topicUid":"EchoHub.Server.Data.Migrations","type":"Namespace","items":[{"name":"AddAttachmentFileSize","href":"server/EchoHub.Server.Data.Migrations.AddAttachmentFileSize.html","topicHref":"server/EchoHub.Server.Data.Migrations.AddAttachmentFileSize.html","topicUid":"EchoHub.Server.Data.Migrations.AddAttachmentFileSize","type":"Class"},{"name":"AddChannelIsPublic","href":"server/EchoHub.Server.Data.Migrations.AddChannelIsPublic.html","topicHref":"server/EchoHub.Server.Data.Migrations.AddChannelIsPublic.html","topicUid":"EchoHub.Server.Data.Migrations.AddChannelIsPublic","type":"Class"},{"name":"AddChannelMembership","href":"server/EchoHub.Server.Data.Migrations.AddChannelMembership.html","topicHref":"server/EchoHub.Server.Data.Migrations.AddChannelMembership.html","topicUid":"EchoHub.Server.Data.Migrations.AddChannelMembership","type":"Class"},{"name":"AddEncryptionSupport","href":"server/EchoHub.Server.Data.Migrations.AddEncryptionSupport.html","topicHref":"server/EchoHub.Server.Data.Migrations.AddEncryptionSupport.html","topicUid":"EchoHub.Server.Data.Migrations.AddEncryptionSupport","type":"Class"},{"name":"AddMessageEmbed","href":"server/EchoHub.Server.Data.Migrations.AddMessageEmbed.html","topicHref":"server/EchoHub.Server.Data.Migrations.AddMessageEmbed.html","topicUid":"EchoHub.Server.Data.Migrations.AddMessageEmbed","type":"Class"},{"name":"AddModerationRoles","href":"server/EchoHub.Server.Data.Migrations.AddModerationRoles.html","topicHref":"server/EchoHub.Server.Data.Migrations.AddModerationRoles.html","topicUid":"EchoHub.Server.Data.Migrations.AddModerationRoles","type":"Class"},{"name":"InitialCreate","href":"server/EchoHub.Server.Data.Migrations.InitialCreate.html","topicHref":"server/EchoHub.Server.Data.Migrations.InitialCreate.html","topicUid":"EchoHub.Server.Data.Migrations.InitialCreate","type":"Class"}]},{"name":"EchoHub.Server.Hubs","href":"server/EchoHub.Server.Hubs.html","topicHref":"server/EchoHub.Server.Hubs.html","topicUid":"EchoHub.Server.Hubs","type":"Namespace","items":[{"name":"ChatHub","href":"server/EchoHub.Server.Hubs.ChatHub.html","topicHref":"server/EchoHub.Server.Hubs.ChatHub.html","topicUid":"EchoHub.Server.Hubs.ChatHub","type":"Class"}]},{"name":"EchoHub.Server.Services","href":"server/EchoHub.Server.Services.html","topicHref":"server/EchoHub.Server.Services.html","topicUid":"EchoHub.Server.Services","type":"Namespace","items":[{"name":"ChannelService","href":"server/EchoHub.Server.Services.ChannelService.html","topicHref":"server/EchoHub.Server.Services.ChannelService.html","topicUid":"EchoHub.Server.Services.ChannelService","type":"Class"},{"name":"ChatService","href":"server/EchoHub.Server.Services.ChatService.html","topicHref":"server/EchoHub.Server.Services.ChatService.html","topicUid":"EchoHub.Server.Services.ChatService","type":"Class"},{"name":"FileCleanupService","href":"server/EchoHub.Server.Services.FileCleanupService.html","topicHref":"server/EchoHub.Server.Services.FileCleanupService.html","topicUid":"EchoHub.Server.Services.FileCleanupService","type":"Class"},{"name":"FileStorageService","href":"server/EchoHub.Server.Services.FileStorageService.html","topicHref":"server/EchoHub.Server.Services.FileStorageService.html","topicUid":"EchoHub.Server.Services.FileStorageService","type":"Class"},{"name":"FileValidationHelper","href":"server/EchoHub.Server.Services.FileValidationHelper.html","topicHref":"server/EchoHub.Server.Services.FileValidationHelper.html","topicUid":"EchoHub.Server.Services.FileValidationHelper","type":"Class"},{"name":"ImageToAsciiService","href":"server/EchoHub.Server.Services.ImageToAsciiService.html","topicHref":"server/EchoHub.Server.Services.ImageToAsciiService.html","topicUid":"EchoHub.Server.Services.ImageToAsciiService","type":"Class"},{"name":"LinkEmbedService","href":"server/EchoHub.Server.Services.LinkEmbedService.html","topicHref":"server/EchoHub.Server.Services.LinkEmbedService.html","topicUid":"EchoHub.Server.Services.LinkEmbedService","type":"Class"},{"name":"MessageEncryptionService","href":"server/EchoHub.Server.Services.MessageEncryptionService.html","topicHref":"server/EchoHub.Server.Services.MessageEncryptionService.html","topicUid":"EchoHub.Server.Services.MessageEncryptionService","type":"Class"},{"name":"MuteExpirationService","href":"server/EchoHub.Server.Services.MuteExpirationService.html","topicHref":"server/EchoHub.Server.Services.MuteExpirationService.html","topicUid":"EchoHub.Server.Services.MuteExpirationService","type":"Class"},{"name":"PresenceTracker","href":"server/EchoHub.Server.Services.PresenceTracker.html","topicHref":"server/EchoHub.Server.Services.PresenceTracker.html","topicUid":"EchoHub.Server.Services.PresenceTracker","type":"Class"},{"name":"ServerDirectoryService","href":"server/EchoHub.Server.Services.ServerDirectoryService.html","topicHref":"server/EchoHub.Server.Services.ServerDirectoryService.html","topicUid":"EchoHub.Server.Services.ServerDirectoryService","type":"Class"},{"name":"SignalRBroadcaster","href":"server/EchoHub.Server.Services.SignalRBroadcaster.html","topicHref":"server/EchoHub.Server.Services.SignalRBroadcaster.html","topicUid":"EchoHub.Server.Services.SignalRBroadcaster","type":"Class"},{"name":"UserService","href":"server/EchoHub.Server.Services.UserService.html","topicHref":"server/EchoHub.Server.Services.UserService.html","topicUid":"EchoHub.Server.Services.UserService","type":"Class"}]},{"name":"EchoHub.Server.Setup","href":"server/EchoHub.Server.Setup.html","topicHref":"server/EchoHub.Server.Setup.html","topicUid":"EchoHub.Server.Setup","type":"Namespace","items":[{"name":"DataMigrationService","href":"server/EchoHub.Server.Setup.DataMigrationService.html","topicHref":"server/EchoHub.Server.Setup.DataMigrationService.html","topicUid":"EchoHub.Server.Setup.DataMigrationService","type":"Class"},{"name":"DatabaseSetup","href":"server/EchoHub.Server.Setup.DatabaseSetup.html","topicHref":"server/EchoHub.Server.Setup.DatabaseSetup.html","topicUid":"EchoHub.Server.Setup.DatabaseSetup","type":"Class"},{"name":"FirstRunSetup","href":"server/EchoHub.Server.Setup.FirstRunSetup.html","topicHref":"server/EchoHub.Server.Setup.FirstRunSetup.html","topicUid":"EchoHub.Server.Setup.FirstRunSetup","type":"Class"}]}]},{"name":"Articles","includedFrom":"~/api/server-articles/toc.yml","items":[{"name":"Overview","href":"server-articles/index.html","topicHref":"server-articles/index.html"}]}]},{"name":"Server.Irc","items":[{"name":"API Reference","includedFrom":"~/_api_meta/server-irc/toc.yml","items":[{"name":"EchoHub.Server.Irc","href":"server-irc/EchoHub.Server.Irc.html","topicHref":"server-irc/EchoHub.Server.Irc.html","topicUid":"EchoHub.Server.Irc","type":"Namespace","items":[{"name":"IrcBroadcaster","href":"server-irc/EchoHub.Server.Irc.IrcBroadcaster.html","topicHref":"server-irc/EchoHub.Server.Irc.IrcBroadcaster.html","topicUid":"EchoHub.Server.Irc.IrcBroadcaster","type":"Class"},{"name":"IrcClientConnection","href":"server-irc/EchoHub.Server.Irc.IrcClientConnection.html","topicHref":"server-irc/EchoHub.Server.Irc.IrcClientConnection.html","topicUid":"EchoHub.Server.Irc.IrcClientConnection","type":"Class"},{"name":"IrcCommandHandler","href":"server-irc/EchoHub.Server.Irc.IrcCommandHandler.html","topicHref":"server-irc/EchoHub.Server.Irc.IrcCommandHandler.html","topicUid":"EchoHub.Server.Irc.IrcCommandHandler","type":"Class"},{"name":"IrcGatewayService","href":"server-irc/EchoHub.Server.Irc.IrcGatewayService.html","topicHref":"server-irc/EchoHub.Server.Irc.IrcGatewayService.html","topicUid":"EchoHub.Server.Irc.IrcGatewayService","type":"Class"},{"name":"IrcMessage","href":"server-irc/EchoHub.Server.Irc.IrcMessage.html","topicHref":"server-irc/EchoHub.Server.Irc.IrcMessage.html","topicUid":"EchoHub.Server.Irc.IrcMessage","type":"Class"},{"name":"IrcMessageFormatter","href":"server-irc/EchoHub.Server.Irc.IrcMessageFormatter.html","topicHref":"server-irc/EchoHub.Server.Irc.IrcMessageFormatter.html","topicUid":"EchoHub.Server.Irc.IrcMessageFormatter","type":"Class"},{"name":"IrcNumericReply","href":"server-irc/EchoHub.Server.Irc.IrcNumericReply.html","topicHref":"server-irc/EchoHub.Server.Irc.IrcNumericReply.html","topicUid":"EchoHub.Server.Irc.IrcNumericReply","type":"Class"},{"name":"IrcOptions","href":"server-irc/EchoHub.Server.Irc.IrcOptions.html","topicHref":"server-irc/EchoHub.Server.Irc.IrcOptions.html","topicUid":"EchoHub.Server.Irc.IrcOptions","type":"Class"},{"name":"IrcServiceExtensions","href":"server-irc/EchoHub.Server.Irc.IrcServiceExtensions.html","topicHref":"server-irc/EchoHub.Server.Irc.IrcServiceExtensions.html","topicUid":"EchoHub.Server.Irc.IrcServiceExtensions","type":"Class"}]}]}]}]} diff --git a/articles/docker.html b/articles/docker.html new file mode 100644 index 0000000..e828efe --- /dev/null +++ b/articles/docker.html @@ -0,0 +1,279 @@ + + + + + Docker | EchoHub Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + +
    +
    +
    +
    +
    Table of Contents
    + +
    +
    + +
    +
    +
    + +
    +
    + + + +
    + +
    +

    Docker

    + +

    Quick Start

    +
    cp .env.example .env        # create your config
    +docker compose up -d         # start the server
    +
    +

    On first run the server automatically generates JWT and encryption keys, creates the database, and seeds a #general channel. Connect with the EchoHub client to http://localhost:5000.

    +

    Using a Pre-built Image

    +

    Instead of building locally, you can pull from GHCR. In docker-compose.yml, replace the build block:

    +
    services:
    +  echohub-server:
    +    image: ghcr.io/huebyte/echohub-server:latest
    +    # build:
    +    #   context: ./src
    +    #   dockerfile: EchoHub.Server/Dockerfile
    +
    +

    Configuration

    +

    All settings are configured through the .env file. These are ASP.NET Core environment variables that override appsettings.json.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    VariableDefaultDescription
    Server__NameMy EchoHub ServerDisplay name for your server
    Server__DescriptionA self-hosted EchoHub chat serverServer description
    Server__PublicServerfalseList on the public directory
    Server__PublicHost(empty)Public address for the directory listing
    Server__Admins__0(empty)Admin username (use __1, __2 for more)
    Jwt__Secret(auto-generated)JWT signing key. Auto-generated on first run
    Encryption__Key(auto-generated)AES encryption key. Auto-generated on first run
    Encryption__EncryptDatabasefalseEncrypt message content in the database
    Storage__CleanupIntervalHours1How often to clean expired uploads
    Storage__RetentionDays30Days to keep uploaded files
    Irc__EnabledfalseEnable the IRC gateway
    Irc__Port6667IRC plain-text port
    Irc__TlsEnabledfalseEnable IRC over TLS
    Irc__TlsPort6697IRC TLS port
    Irc__ServerNameechohubIRC server name shown to clients
    Irc__MotdWelcome to EchoHub IRC Gateway!Message of the day
    Serilog__MinimumLevel__DefaultInformationLog level (Debug, Warning, etc.)
    +

    Persistent Data

    +

    All server state lives in a single Docker volume mounted at /app/data:

    +
    /app/data/
    +├── appsettings.json   # generated config with JWT/encryption keys
    +├── echohub.db         # SQLite database
    +├── uploads/           # uploaded files and avatars
    +└── logs/              # rolling log files (14-day retention)
    +
    +

    Backup

    +
    # stop the server to ensure a consistent snapshot
    +docker compose stop
    +# copy the data volume to a local directory
    +docker cp echohub-server:/app/data ./backup
    +docker compose start
    +
    +

    IRC Gateway

    +

    To enable IRC, set these in your .env:

    +
    Irc__Enabled=true
    +
    +

    Then uncomment the port in docker-compose.yml:

    +
    ports:
    +  - "5000:5000"
    +  - "6697:6697"   # IRC (TLS encrypted, preferred)
    +
    +

    For TLS, also set:

    +
    Irc__TlsEnabled=true
    +Irc__TlsCertPath=/app/data/cert.pfx
    +Irc__TlsCertPassword=your_password
    +
    +

    Mount your certificate into the data volume or bind-mount it directly.

    +

    IRC users must have an existing EchoHub account. See Getting Started for client connection examples.

    +

    Updating

    +
    # if using pre-built images
    +docker compose pull
    +docker compose up -d
    +
    +# if building locally
    +docker compose build
    +docker compose up -d
    +
    +

    Data persists across updates since it lives in the named volume.

    +

    Troubleshooting

    +

    Port already in use -- Another process is using port 5000. Change the host port in docker-compose.yml:

    +
    ports:
    +  - "8080:5000"   # access via http://localhost:8080
    +
    +

    Permission denied on volume -- The container runs as a non-root echohub user (UID 999). If using bind mounts instead of named volumes, ensure the directory is writable.

    +

    View logs -- Check the container output:

    +
    docker compose logs -f echohub-server
    +
    +

    File-based logs are also available inside the volume at /app/data/logs/.

    + +
    + + + + + +
    + +
    + +
    +
    + +
    + + + + diff --git a/articles/getting-started.html b/articles/getting-started.html index 6d4827c..40e8254 100644 --- a/articles/getting-started.html +++ b/articles/getting-started.html @@ -87,24 +87,39 @@

    Getting Started

    -

    Prerequisites

    - -

    Or grab a self-contained binary from Releases -- no runtime needed.

    -

    Run the Server

    +

    Install the Client

    +

    Windows (Chocolatey)

    +
    choco install echohub
    +
    +

    Linux / macOS

    +
    curl -sSfL https://raw.githubusercontent.com/HueByte/EchoHub/master/scripts/install.sh | sh
    +
    +

    To install a specific version or to a custom directory:

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

    Manual Download

    +

    Grab a self-contained binary from Releases -- no runtime needed.

    +

    Host a Server

    +

    Docker

    +

    The quickest way to host a server:

    +
    cp .env.example .env
    +docker compose up -d
    +
    +

    See the Docker guide for configuration, pre-built images, and more.

    +

    From Source

    dotnet run --project src/EchoHub.Server
     
    +

    Requires .NET 10 SDK.

    On first run, the server automatically:

    1. Creates appsettings.json from the example config
    2. Generates a secure JWT secret
    3. Creates the SQLite database with a #general channel
    -

    Run the Client

    -
    dotnet run --project src/EchoHub.Client
    -
    -

    Connect to a server, register an account, and start chatting.

    +

    Usage

    +

    After installing the client, run echohub (or dotnet run --project src/EchoHub.Client from source). +Connect to a server, register an account, and start chatting.

    Connect via IRC

    Enable the IRC gateway in the server's appsettings.json:

    {
    diff --git a/articles/toc.html b/articles/toc.html
    index 24ef3fa..d2400b7 100644
    --- a/articles/toc.html
    +++ b/articles/toc.html
    @@ -15,6 +15,9 @@
                     
  • Getting Started
  • +
  • + Docker +
  • Architecture
  • diff --git a/articles/toc.json b/articles/toc.json index 627b95f..692ba07 100644 --- a/articles/toc.json +++ b/articles/toc.json @@ -1,2 +1,2 @@ -{"items":[{"name":"Getting Started","href":"getting-started.html","topicHref":"getting-started.html"},{"name":"Architecture","href":"architecture.html","topicHref":"architecture.html"},{"name":"Encryption","href":"encryption.html","topicHref":"encryption.html"},{"name":"Notification Sounds","href":"notification-sounds.html","topicHref":"notification-sounds.html"}]} +{"items":[{"name":"Getting Started","href":"getting-started.html","topicHref":"getting-started.html"},{"name":"Docker","href":"docker.html","topicHref":"docker.html"},{"name":"Architecture","href":"architecture.html","topicHref":"architecture.html"},{"name":"Encryption","href":"encryption.html","topicHref":"encryption.html"},{"name":"Notification Sounds","href":"notification-sounds.html","topicHref":"notification-sounds.html"}]} diff --git a/changelog/index.html b/changelog/index.html index 4415596..fd7a532 100644 --- a/changelog/index.html +++ b/changelog/index.html @@ -90,6 +90,9 @@

    Release history for EchoHub.

    Releases

      +
    • 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
    • diff --git a/changelog/toc.html b/changelog/toc.html index 6c84ad0..49cb2d7 100644 --- a/changelog/toc.html +++ b/changelog/toc.html @@ -15,6 +15,9 @@
    • Overview
    • +
    • + v0.2.8 +
    • v0.2.7
    • diff --git a/changelog/toc.json b/changelog/toc.json index ecad7e9..f4caac3 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.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.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.8.html b/changelog/v0.2.8.html new file mode 100644 index 0000000..6210ff1 --- /dev/null +++ b/changelog/v0.2.8.html @@ -0,0 +1,172 @@ + + + + + v0.2.8 | EchoHub Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + +
      + +
      +
      +
      +
      +
      Table of Contents
      + +
      +
      + +
      +
      +
      + +
      +
      + + + +
      + +
      +

      v0.2.8

      + +

      Bug Fixes

      +
        +
      • Fix memory leak — HttpResponseMessage objects never disposed in ApiClient, leaking TCP connections and content buffers on every API call (especially on failed connection attempts)
      • +
      • Fix 401 retry leak — AuthenticatedGetAsync/AuthenticatedRequestAsync leaked the original response when retrying after token refresh
      • +
      • Fix connection failure cleanup — ConnectionManager.ConnectAsync now properly disposes ApiClient and EchoHubConnection on any failure path (previously only cleaned up on saved-token auth failures)
      • +
      • Fix IRC gateway sending UTF-8 BOM on first message, breaking CAP negotiation and SASL auth for all clients
      • +
      • Handle AUTHENTICATE * (SASL abort) instead of crashing on invalid base64
      • +
      • Fix userlist not refreshing when creating a new channel — now fetches online users after channel creation
      • +
      • Fix unmute timer not working — add MuteExpirationService background job that proactively unmutes users when their timed mute expires (previously only checked on message send)
      • +
      • Fix missing space between mod/admin role icon and username in the userlist
      • +
      • Fix invisible users still visible in the userlist — GetOnlineUsersAsync now filters invisible users; server skips UserJoined broadcast for invisible users
      • +
      • Fix invisible→online transition — user reappears in cached userlist when switching from invisible back to a visible status
      • +
      • Fix thread safety — _channelUsers presence cache now protected by Lock to prevent races between SignalR events and background fetches
      • +
      • Fix @mention regex matching email addresses and #channel regex matching hex colors / issue numbers — both now use lookbehind and letter-requirement guards
      • +
      • Fix ParseThemeColor accepting non-hex characters — now validates [0-9a-fA-F] digits
      • +
      • Fix ghost channel when trying to join a channel that doesn't exist
      • +
      +

      New Features

      +
        +
      • Add Docker support for EchoHub.Server — docker compose up -d for easy self-hosting with persistent volume for database, uploads, and logs
      • +
      • IRC account creation — connecting with a new username auto-registers the account (PASS and SASL PLAIN)
      • +
      • Auto-updater rollback — pre-update backup created automatically before each update; restore via File > Rollback menu or --rollback CLI flag
      • +
      • Update failure recovery — if an update fails mid-extraction, offers to restore from the backup immediately
      • +
      • Defensive Unix permission check — verify execute permission on startup after auto-update (defense-in-depth)
      • +
      • Clickable usernames — press Enter on a username in the userlist or message sender to view their profile
      • +
      • Clickable @mentions — press Enter on a message containing @username to open that user's profile
      • +
      • Clickable #channels — press Enter on a message containing #channel to join/switch to that channel; #channel references are now highlighted in chat
      • +
      • Embed theme colors — embed vertical border line now uses the source site's theme-color meta tag when available
      • +
      • Stateful userlist — user presence is cached per channel and updated incrementally via SignalR events instead of re-fetching the full list on every join/leave/status change
      • +
      +

      Security

      +
        +
      • Restrict file auto-open — only safe file types (video, PDF, text) are opened with the system default app; all other files are downloaded to temp without executing (prevents script execution via .bat, .exe, etc.)
      • +
      +

      Refactoring

      +
        +
      • Extract IUserService/UserService — consolidate user registration, authentication, and profile management into a dedicated service, eliminating duplicated logic between AuthController and ChatService
      • +
      • IRC gateway now checks ban status during authentication (previously skipped)
      • +
      • EchoHubSpace directory updates — server now only sends user count when it actually changes instead of every 30 seconds
      • +
      • ChatHub.JoinChannel now returns JoinChannelResult instead of List<MessageDto> to allow for better error handling
      • +
      +

      Distribution

      +
        +
      • Add Chocolatey package — choco install echohub for Windows users, auto-published from CI on each release
      • +
      • Add Linux/macOS install script — curl -sSfL .../install.sh | sh with automatic OS/arch detection
      • +
      +

      Documentation

      +
        +
      • Add Flows section — Mermaid sequence diagrams documenting all major request/event flows (auth, connection, messaging, channels, moderation, file upload, link embeds, server directory) with inline code references
      • +
      +

      CI

      +
        +
      • Add Docker workflow — builds and pushes multi-arch (amd64/arm64) server image to GHCR on release
      • +
      • Add linux-arm64 builds to release pipeline — server and client binaries for ARM Linux (Raspberry Pi, cloud ARM instances)
      • +
      • Automate Chocolatey package publishing in release workflow (checksum calculation, pack, push)
      • +
      + +
      + + + + + +
      + +
      + +
      +
      + +
      + + + + diff --git a/flows/authentication.html b/flows/authentication.html new file mode 100644 index 0000000..83a6e5b --- /dev/null +++ b/flows/authentication.html @@ -0,0 +1,352 @@ + + + + + Authentication | EchoHub Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + +
      + +
      +
      +
      +
      +
      Table of Contents
      + +
      +
      + +
      +
      +
      + +
      +
      + + + +
      + +
      +

      Authentication

      + +

      User Registration

      +

      A new user creates an account on a server. The client sends credentials via REST, +the server hashes the password, issues JWT tokens, and the client stores the +refresh token for "Remember Me" sessions.

      +
      sequenceDiagram
      +    participant UI as ConnectDialog
      +    participant AO as AppOrchestrator
      +    participant CM as ConnectionManager
      +    participant API as ApiClient
      +    participant Auth as AuthController
      +    participant US as UserService
      +    participant JWT as JwtTokenService
      +    participant DB as SQLite
      +
      +    UI->>AO: ConnectDialogResult(IsRegister: true)
      +    AO->>CM: ConnectAsync(dialogResult)
      +    CM->>API: RegisterAsync(username, password)
      +    API->>Auth: POST /api/auth/register
      +    Auth->>US: RegisterUserAsync(username, password, displayName)
      +    US->>US: Validate (regex, length, uniqueness)
      +    US->>DB: INSERT User (BCrypt hash)
      +    US-->>Auth: UserOperationResult.Success
      +    Auth->>JWT: GenerateAccessToken(user)
      +    JWT-->>Auth: (token, expiresAt) [15 min]
      +    Auth->>JWT: GenerateRefreshToken()
      +    JWT-->>Auth: Base64 random (64 bytes)
      +    Auth->>DB: INSERT RefreshToken (SHA256 hash)
      +    Auth-->>API: LoginResponse
      +    API->>API: SetTokens() — store in memory + set Bearer header
      +    API-->>CM: LoginResponse
      +    CM->>CM: Wire OnTokensRefreshed for config persistence
      +    CM->>CM: Continue to connection setup (see Connection Flow)
      +
      +

      Code references:

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      StepFileLocation
      Dialog UIsrc/EchoHub.Client/UI/Dialogs/ConnectDialog.csLines 251-268 (register handler)
      Orchestrator entrysrc/EchoHub.Client/AppOrchestrator.csLines 550-592 (HandleConnect)
      ConnectionManager authsrc/EchoHub.Client/Services/ConnectionManager.csLines 74-76 (register branch)
      ApiClient registersrc/EchoHub.Client/Services/ApiClient.csLines 32-43 (RegisterAsync)
      AuthController registersrc/EchoHub.Server/Controllers/AuthController.csLines 28-49
      UserService registersrc/EchoHub.Server/Services/UserService.csLines 20-59 (RegisterUserAsync)
      JWT generationsrc/EchoHub.Server/Auth/JwtTokenService.csLines 30-53 (access), 80-86 (refresh)
      Token persistencesrc/EchoHub.Client/AppOrchestrator.csLines 1039-1053 (SaveServerToConfig)
      +
      +

      User Login

      +

      Returning user authenticates with username/password or a saved refresh token.

      +
      sequenceDiagram
      +    participant UI as ConnectDialog
      +    participant CM as ConnectionManager
      +    participant API as ApiClient
      +    participant Auth as AuthController
      +    participant US as UserService
      +    participant DB as SQLite
      +
      +    alt Saved refresh token (Remember Me)
      +        UI->>CM: ConnectDialogResult(SavedRefreshToken: "...")
      +        CM->>API: LoginWithRefreshTokenAsync()
      +        API->>Auth: POST /api/auth/refresh
      +        Auth->>DB: Lookup token by SHA256 hash
      +        Auth->>DB: Revoke old token, issue new pair
      +        Auth-->>API: LoginResponse (rotated tokens)
      +    else Username + Password
      +        UI->>CM: ConnectDialogResult(IsRegister: false)
      +        CM->>API: LoginAsync(username, password)
      +        API->>Auth: POST /api/auth/login
      +        Auth->>US: AuthenticateUserAsync(username, password)
      +        US->>DB: Fetch user, BCrypt.Verify(password, hash)
      +        US->>DB: Update LastSeenAt
      +        US-->>Auth: UserOperationResult.Success
      +        Auth-->>API: LoginResponse
      +    end
      +    API->>API: SetTokens()
      +
      +

      Code references:

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      StepFileLocation
      Login button handlersrc/EchoHub.Client/UI/Dialogs/ConnectDialog.csLines 214-249
      Saved token branchsrc/EchoHub.Client/Services/ConnectionManager.csLines 69-71
      Password branchsrc/EchoHub.Client/Services/ConnectionManager.csLines 78-80
      ApiClient loginsrc/EchoHub.Client/Services/ApiClient.csLines 45-56 (LoginAsync)
      AuthController loginsrc/EchoHub.Server/Controllers/AuthController.csLines 51-72
      AuthController refreshsrc/EchoHub.Server/Controllers/AuthController.csLines 74-108
      UserService authenticatesrc/EchoHub.Server/Services/UserService.csLines 61-83
      +
      +

      Token Refresh

      +

      Access tokens expire after 15 minutes. The client auto-refreshes transparently +before requests and on 401 responses. Refresh tokens are rotated on each use.

      +
      sequenceDiagram
      +    participant SR as SignalR / HTTP Request
      +    participant API as ApiClient
      +    participant Auth as AuthController
      +    participant DB as SQLite
      +    participant Config as config.json
      +
      +    SR->>API: GetValidTokenAsync() or HTTP 401
      +    API->>API: Token expires within 60s?
      +    alt Proactive refresh (SignalR token provider)
      +        API->>Auth: POST /api/auth/refresh (old refresh token)
      +    else Reactive refresh (HTTP 401 retry)
      +        API->>Auth: POST /api/auth/refresh (old refresh token)
      +    end
      +    Auth->>DB: Lookup by SHA256 hash
      +    Auth->>DB: Revoke old refresh token
      +    Auth->>DB: INSERT new RefreshToken
      +    Auth-->>API: LoginResponse (new token pair)
      +    API->>API: SetTokens() — update Bearer header
      +    API-->>API: Fire OnTokensRefreshed event
      +    API-->>Config: Persist new refresh token (if Remember Me)
      +    API->>SR: Retry original request with new token
      +
      +

      Code references:

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      StepFileLocation
      Proactive checksrc/EchoHub.Client/Services/ApiClient.csLines 110-129 (GetValidTokenAsync)
      Reactive 401 retry (GET)src/EchoHub.Client/Services/ApiClient.csLines 338-358 (AuthenticatedGetAsync)
      Reactive 401 retry (POST/PUT/DELETE)src/EchoHub.Client/Services/ApiClient.csLines 364-384 (AuthenticatedRequestAsync)
      Refresh HTTP callsrc/EchoHub.Client/Services/ApiClient.csLines 58-71 (RefreshTokenAsync)
      SignalR token providersrc/EchoHub.Client/Services/EchoHubConnection.csLine 37 (AccessTokenProvider)
      Server-side rotationsrc/EchoHub.Server/Controllers/AuthController.csLines 74-108
      Token persistence callbacksrc/EchoHub.Client/Services/ConnectionManager.csLines 253-264
      + +
      + + + + + +
      + +
      + +
      +
      + +
      + + + + diff --git a/flows/channels.html b/flows/channels.html new file mode 100644 index 0000000..d785f37 --- /dev/null +++ b/flows/channels.html @@ -0,0 +1,344 @@ + + + + + Channels | EchoHub Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + +
      + +
      +
      +
      +
      +
      Table of Contents
      + +
      +
      + +
      +
      +
      + +
      +
      + + + +
      + +
      +

      Channels

      + +

      Channel Creation

      +

      Channels are created via the REST API. Public channels are broadcast to all +connected clients.

      +
      sequenceDiagram
      +    participant Client as Client (TUI/API)
      +    participant CC as ChannelsController
      +    participant ChS as ChannelService
      +    participant CS as ChatService
      +    participant DB as SQLite
      +    participant SRB as SignalRBroadcaster
      +    participant IRCB as IrcBroadcaster
      +
      +    Client->>CC: POST /api/channels {name, topic, isPublic}
      +    CC->>ChS: CreateChannelAsync(creatorId, name, topic, isPublic)
      +    ChS->>ChS: Normalize name (lowercase, trim)
      +    ChS->>ChS: Validate format (2-100 chars, regex)
      +    ChS->>DB: Check duplicate
      +    ChS->>DB: INSERT Channel + ChannelMembership (creator auto-added)
      +    ChS-->>CC: ChannelDto
      +
      +    alt Channel is public
      +        CC->>CS: BroadcastChannelUpdatedAsync(channel)
      +        CS->>SRB: SendChannelUpdatedAsync(channelDto)
      +        SRB->>SRB: Notify all SignalR clients
      +        CS->>IRCB: SendChannelUpdatedAsync(channelDto)
      +    end
      +
      +    CC-->>Client: 201 Created (ChannelDto)
      +
      +

      Code references:

      + + + + + + + + + + + + + + + + + + + + + + + + + +
      StepFileLocation
      Controller endpointsrc/EchoHub.Server/Controllers/ChannelsController.csLines 60-76
      Channel service createsrc/EchoHub.Server/Services/ChannelService.csLines 50-90
      Broadcast updatedsrc/EchoHub.Server/Services/ChatService.csLines 308-309
      +
      +

      Channel Deletion

      +

      Only the channel creator (or admin) can delete a channel. The default channel +is protected.

      +
      sequenceDiagram
      +    participant Client as Client
      +    participant CC as ChannelsController
      +    participant ChS as ChannelService
      +    participant DB as SQLite
      +
      +    Client->>CC: DELETE /api/channels/{channel}
      +    CC->>ChS: DeleteChannelAsync(channelName, callerId)
      +    ChS->>ChS: Reject if default channel
      +    ChS->>DB: Lookup channel
      +    ChS->>ChS: Verify caller is creator or admin
      +    ChS->>DB: DELETE Channel (cascade: messages, memberships)
      +    ChS-->>CC: Success
      +    CC-->>Client: 204 No Content
      +
      +

      Code references:

      + + + + + + + + + + + + + + + + + + + + +
      StepFileLocation
      Controller endpointsrc/EchoHub.Server/Controllers/ChannelsController.csLines 94-106
      Channel service deletesrc/EchoHub.Server/Services/ChannelService.csLines 119-144
      +
      +

      Joining a Channel

      +

      Both SignalR and IRC clients join channels through ChatService. The presence +tracker determines if this is a genuinely new join (vs. a second connection) and +broadcasts accordingly.

      +
      sequenceDiagram
      +    participant Client as Client (SignalR or IRC)
      +    participant Entry as ChatHub / IrcCommandHandler
      +    participant CS as ChatService
      +    participant ChS as ChannelService
      +    participant PT as PresenceTracker
      +    participant DB as SQLite
      +    participant SRB as SignalRBroadcaster
      +    participant IRCB as IrcBroadcaster
      +
      +    Client->>Entry: JoinChannel / JOIN #channel
      +    Entry->>CS: JoinChannelAsync(connectionId, userId, username, channel)
      +    CS->>ChS: EnsureChannelMembershipAsync(userId, channel)
      +    ChS->>DB: INSERT ChannelMembership (if not exists)
      +
      +    CS->>PT: JoinChannel(username, channel)
      +    PT-->>CS: isNewJoin?
      +
      +    alt First connection in this channel
      +        CS->>DB: Fetch UserPresenceDto
      +        CS->>CS: BroadcastToAllAsync(SendUserJoinedAsync)
      +        par
      +            CS->>SRB: SendUserJoinedAsync(channel, user, excludeConn)
      +        and
      +            CS->>IRCB: SendUserJoinedAsync(channel, user)
      +        end
      +    end
      +
      +    CS->>DB: Fetch message history
      +    CS-->>Entry: (history, error)
      +    Entry-->>Client: History messages
      +
      +

      Code references:

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      StepFileLocation
      SignalR hub joinsrc/EchoHub.Server/Hubs/ChatHub.csLines 59-81
      IRC joinsrc/EchoHub.Server.Irc/IrcCommandHandler.csLines 361-414
      ChatService joinsrc/EchoHub.Server/Services/ChatService.csLines 96-135
      Presence joinsrc/EchoHub.Server/Services/PresenceTracker.csLines 58-70
      SignalR broadcastsrc/EchoHub.Server/Services/SignalRBroadcaster.csLines 26-32
      IRC broadcastsrc/EchoHub.Server.Irc/IrcBroadcaster.csLines 34-41
      +
      +

      Leaving a Channel

      +
      sequenceDiagram
      +    participant Client as Client
      +    participant Entry as ChatHub / IrcCommandHandler
      +    participant CS as ChatService
      +    participant PT as PresenceTracker
      +    participant SRB as SignalRBroadcaster
      +    participant IRCB as IrcBroadcaster
      +
      +    Client->>Entry: LeaveChannel / PART #channel
      +    Entry->>CS: LeaveChannelAsync(connectionId, username, channel)
      +    CS->>PT: LeaveChannel(username, channel)
      +    CS->>CS: BroadcastToAllAsync(SendUserLeftAsync)
      +    par
      +        CS->>SRB: SendUserLeftAsync(channel, username)
      +    and
      +        CS->>IRCB: SendUserLeftAsync(channel, username)
      +    end
      +
      +

      Code references:

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      StepFileLocation
      SignalR hub leavesrc/EchoHub.Server/Hubs/ChatHub.csLines 83-96
      IRC partsrc/EchoHub.Server.Irc/IrcCommandHandler.csLines 416-435
      ChatService leavesrc/EchoHub.Server/Services/ChatService.csLines 137-143
      Presence leavesrc/EchoHub.Server/Services/PresenceTracker.csLines 72-81
      + +
      + + + + + +
      + +
      + +
      +
      + +
      + + + + diff --git a/flows/connection.html b/flows/connection.html new file mode 100644 index 0000000..22cdd2e --- /dev/null +++ b/flows/connection.html @@ -0,0 +1,348 @@ + + + + + Connection | EchoHub Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + +
      + +
      +
      +
      +
      +
      Table of Contents
      + +
      +
      + +
      +
      +
      + +
      +
      + + + +
      + +
      +

      Connection

      + +

      SignalR Client Connection

      +

      After authentication, the TUI client establishes a SignalR WebSocket, registers +event handlers, joins the default channel, and loads history.

      +
      sequenceDiagram
      +    participant CM as ConnectionManager
      +    participant EHC as EchoHubConnection
      +    participant Hub as ChatHub
      +    participant CS as ChatService
      +    participant PT as PresenceTracker
      +    participant DB as SQLite
      +
      +    CM->>CM: Fetch encryption key (GET /api/server/encryption-key)
      +    CM->>EHC: new EchoHubConnection(apiClient, encryption)
      +    EHC->>EHC: Build HubConnection (URL + JWT token provider + auto-reconnect)
      +    EHC->>EHC: RegisterHandlers() — wire ReceiveMessage, UserJoined, etc.
      +    EHC->>Hub: ConnectAsync() → WebSocket handshake
      +    Hub->>CS: UserConnectedAsync(connectionId, userId, username)
      +    CS->>PT: UserConnected(connectionId, userId, username)
      +    CS->>DB: Update user: Status=Online, LastSeenAt=now
      +    CM->>CM: Fetch channel list (GET /api/channels)
      +    CM->>EHC: JoinChannelAsync("general")
      +    EHC->>Hub: InvokeAsync("JoinChannel", "general")
      +    Hub->>CS: JoinChannelAsync(connectionId, userId, username, "general")
      +    CS->>DB: EnsureChannelMembership
      +    CS->>PT: JoinChannel(username, "general")
      +    CS->>CS: BroadcastToAllAsync → UserJoined
      +    CS->>DB: Fetch message history
      +    Hub-->>EHC: List<MessageDto> (encrypted)
      +    EHC-->>CM: Decrypted history
      +
      +

      Code references:

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      StepFileLocation
      Connection orchestrationsrc/EchoHub.Client/Services/ConnectionManager.csLines 58-140 (ConnectAsync)
      EchoHubConnection setupsrc/EchoHub.Client/Services/EchoHubConnection.csLines 29-62 (constructor)
      Handler registrationsrc/EchoHub.Client/Services/EchoHubConnection.csLines 64-122 (RegisterHandlers)
      Hub OnConnectedsrc/EchoHub.Server/Hubs/ChatHub.csLines 31-43
      ChatService connectedsrc/EchoHub.Server/Services/ChatService.csLines 41-57
      PresenceTracker connectsrc/EchoHub.Server/Services/PresenceTracker.csLines 13-29
      Join channel (hub)src/EchoHub.Server/Hubs/ChatHub.csLines 59-81
      Join channel (service)src/EchoHub.Server/Services/ChatService.csLines 96-135
      +
      +

      IRC Client Connection

      +

      IRC clients connect via TCP, authenticate with PASS/NICK/USER or SASL PLAIN, +and auto-join channels. New usernames are auto-registered.

      +
      sequenceDiagram
      +    participant IRC as IRC Client
      +    participant GW as IrcGatewayService
      +    participant CH as IrcCommandHandler
      +    participant US as UserService
      +    participant CS as ChatService
      +    participant PT as PresenceTracker
      +
      +    IRC->>GW: TCP connect (:6667 or :6697 TLS)
      +    GW->>GW: Accept + create IrcClientConnection
      +    GW->>CH: new IrcCommandHandler(connection, services)
      +    GW->>CH: RunAsync() — start read loop
      +
      +    alt SASL PLAIN
      +        IRC->>CH: CAP REQ :sasl
      +        CH-->>IRC: CAP ACK :sasl
      +        IRC->>CH: AUTHENTICATE PLAIN
      +        CH-->>IRC: AUTHENTICATE +
      +        IRC->>CH: AUTHENTICATE <base64(\0user\0pass)>
      +        CH->>US: AuthenticateUserAsync(user, pass)
      +        alt Auth fails → auto-register
      +            CH->>US: RegisterUserAsync(user, pass)
      +        end
      +        CH-->>IRC: 903 :SASL authentication successful
      +    else PASS/NICK/USER
      +        IRC->>CH: PASS <password>
      +        IRC->>CH: NICK <nickname>
      +        IRC->>CH: USER <username> 0 * :<realname>
      +        CH->>US: AuthenticateUserAsync(nick, pass)
      +        alt Auth fails → auto-register
      +            CH->>US: RegisterUserAsync(nick, pass)
      +        end
      +    end
      +
      +    CH->>CS: UserConnectedAsync(irc-{guid}, userId, username)
      +    CS->>PT: UserConnected(irc-{guid}, userId, username)
      +    CH-->>IRC: 001-004 RPL_WELCOME burst + MOTD
      +
      +    Note over IRC,CH: Client is now ready for JOIN/PART/PRIVMSG
      +
      +

      Code references:

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      StepFileLocation
      TCP listenersrc/EchoHub.Server.Irc/IrcGatewayService.csLines 45-90 (ExecuteAsync)
      Client handlersrc/EchoHub.Server.Irc/IrcGatewayService.csLines 92-154 (HandleClientAsync)
      Command read loopsrc/EchoHub.Server.Irc/IrcCommandHandler.csLines 40-98 (RunAsync)
      SASL authsrc/EchoHub.Server.Irc/IrcCommandHandler.csLines 136-207 (HandleAuthenticateAsync)
      PASS/NICK/USERsrc/EchoHub.Server.Irc/IrcCommandHandler.csLines 209-267
      Registration completionsrc/EchoHub.Server.Irc/IrcCommandHandler.csLines 268-315 (TryCompleteRegistrationAsync)
      Cleanup on disconnectsrc/EchoHub.Server.Irc/IrcGatewayService.csLines 136-153
      +
      +

      User Disconnect & Presence

      +

      When a client disconnects, the presence tracker determines if the user has any +remaining connections. If not, status is set to Invisible and all channels are +notified.

      +
      sequenceDiagram
      +    participant Client as Client
      +    participant Entry as ChatHub / IrcGatewayService
      +    participant CS as ChatService
      +    participant PT as PresenceTracker
      +    participant DB as SQLite
      +    participant SRB as SignalRBroadcaster
      +
      +    Client->>Entry: Disconnect / TCP close
      +    Entry->>CS: UserDisconnectedAsync(connectionId)
      +    CS->>PT: Get username + channels (before removal)
      +    CS->>PT: UserDisconnected(connectionId)
      +    PT->>PT: Remove connection from tracking
      +
      +    alt No remaining connections for user
      +        CS->>DB: Update user: Status=Invisible, LastSeenAt=now
      +        loop For each channel user was in
      +            CS->>CS: BroadcastToAllAsync(SendUserStatusChangedAsync)
      +            CS->>SRB: Notify channel members
      +        end
      +    end
      +
      +

      Code references:

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      StepFileLocation
      SignalR disconnectsrc/EchoHub.Server/Hubs/ChatHub.csLines 45-57
      IRC cleanupsrc/EchoHub.Server.Irc/IrcGatewayService.csLines 136-153
      ChatService disconnectsrc/EchoHub.Server/Services/ChatService.csLines 59-94
      Presence disconnectsrc/EchoHub.Server/Services/PresenceTracker.csLines 31-53
      + +
      + + + + + +
      + +
      + +
      +
      + +
      + + + + diff --git a/flows/flows.html b/flows/flows.html new file mode 100644 index 0000000..ec89f75 --- /dev/null +++ b/flows/flows.html @@ -0,0 +1,117 @@ + + + + + Flows | EchoHub Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + +
      + +
      +
      +
      +
      +
      Table of Contents
      + +
      +
      + +
      +
      +
      + +
      +
      + + + +
      + +
      +

      Flows

      + +

      This section documents the major request/event flows in EchoHub, showing how data moves between the TUI client, IRC client, server, and database. Each diagram includes code references so you can jump straight to the implementation.

      + +
      + + + + + +
      + +
      + +
      +
      + +
      + + + + diff --git a/flows/media.html b/flows/media.html new file mode 100644 index 0000000..abf2a0b --- /dev/null +++ b/flows/media.html @@ -0,0 +1,296 @@ + + + + + Media & Services | EchoHub Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + +
      + +
      +
      +
      +
      +
      Table of Contents
      + +
      +
      + +
      +
      +
      + +
      +
      + + + +
      + +
      +

      Media & Services

      + +

      File Upload

      +

      Files are uploaded via REST, validated by magic bytes, stored with GUID filenames, +and broadcast as a message with a download link.

      +
      sequenceDiagram
      +    participant Client as Client
      +    participant CC as ChannelsController
      +    participant FV as FileValidationHelper
      +    participant FS as FileStorageService
      +    participant CS as ChatService
      +    participant DB as SQLite
      +
      +    Client->>CC: POST /api/channels/{channel}/upload (multipart)
      +    CC->>CC: Check file size limits
      +    CC->>FV: IsValidImage(stream) — magic byte check
      +    FV->>FV: Read header: JPEG(FFD8FF) / PNG(89504E47) / GIF / WebP(RIFF+WEBP)
      +    FV-->>CC: true/false
      +    CC->>FS: SaveFileAsync(stream, extension)
      +    FS->>FS: Generate GUID filename, write to uploads/
      +    FS-->>CC: fileId (GUID)
      +    CC->>CC: Determine MessageType (Image/Audio/File)
      +    CC->>CS: SendMessageAsync (with file URL + optional ASCII art)
      +    CS->>DB: INSERT Message
      +    CS->>CS: BroadcastToAllAsync → fan out to clients
      +
      +

      Code references:

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      StepFileLocation
      Upload endpointsrc/EchoHub.Server/Controllers/ChannelsController.csLines 108-200
      File validationsrc/EchoHub.Server/Services/FileValidationHelper.csLines 15-82
      File storagesrc/EchoHub.Server/Services/FileStorageService.csLines 1-47
      File downloadsrc/EchoHub.Server/Controllers/FilesController.csLines 22-53
      +
      + +

      When a message contains URLs, the server fetches OpenGraph metadata for preview +embeds.

      +
      sequenceDiagram
      +    participant CS as ChatService
      +    participant LE as LinkEmbedService
      +    participant Web as External Website
      +
      +    CS->>LE: TryGetEmbedsAsync(messageContent)
      +    LE->>LE: Extract URLs via regex
      +    LE->>LE: Filter: max URLs per message, skip duplicates
      +
      +    loop For each URL
      +        LE->>LE: Validate: http(s) only, block private IPs
      +        LE->>Web: GET URL (timeout + size limit)
      +        Web-->>LE: HTML response
      +        LE->>LE: Parse og:title, og:description, og:site_name
      +        LE->>LE: Parse theme-color meta tag
      +        LE->>LE: Fallback to <title> if no og:title
      +    end
      +
      +    LE-->>CS: List<EmbedDto> (or null)
      +    Note over CS: Attached to MessageDto before broadcast
      +
      +

      Code references:

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      StepFileLocation
      Entry pointsrc/EchoHub.Server/Services/LinkEmbedService.csLines 28-51 (TryGetEmbedsAsync)
      URL extractionsrc/EchoHub.Server/Services/LinkEmbedService.csLines 145-160
      Private IP blockingsrc/EchoHub.Server/Services/LinkEmbedService.csLines 162-181
      OG tag parsingsrc/EchoHub.Server/Services/LinkEmbedService.csLines 187-210
      Theme color parsingsrc/EchoHub.Server/Services/LinkEmbedService.csLines 117-143
      ChatService integrationsrc/EchoHub.Server/Services/ChatService.csLines 194-201
      +
      +

      Server Directory Registration

      +

      Public servers register with the EchoHubSpace directory for discoverability.

      +
      sequenceDiagram
      +    participant SDS as ServerDirectoryService
      +    participant Dir as EchoHubSpace Directory
      +    participant PT as PresenceTracker
      +
      +    SDS->>SDS: Check Server:PublicServer config
      +    SDS->>Dir: SignalR connect (echohub.voidcube.cloud/hubs/servers)
      +    SDS->>Dir: RegisterServer(name, description, host, userCount)
      +    Dir-->>SDS: Registered
      +
      +    loop Every 30 seconds
      +        SDS->>PT: Get online user count
      +        alt Count changed
      +            SDS->>Dir: UpdateUserCount(count)
      +        end
      +    end
      +
      +    Dir->>SDS: Ping
      +    SDS->>Dir: Heartbeat
      +
      +    Note over SDS,Dir: Exponential backoff on disconnect (2s → 30s max)
      +
      +

      Code references:

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      StepFileLocation
      Service lifecyclesrc/EchoHub.Server/Services/ServerDirectoryService.csLines 29-122
      Registrationsrc/EchoHub.Server/Services/ServerDirectoryService.csLines 195-212
      User count pollingsrc/EchoHub.Server/Services/ServerDirectoryService.csLines 154-187
      Reconnection backoffsrc/EchoHub.Server/Services/ServerDirectoryService.csLines 77-82, 191
      + +
      + + + + + +
      + +
      + +
      +
      + +
      + + + + diff --git a/flows/messaging.html b/flows/messaging.html new file mode 100644 index 0000000..38a2d43 --- /dev/null +++ b/flows/messaging.html @@ -0,0 +1,513 @@ + + + + + Messaging | EchoHub Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + +
      + +
      +
      +
      +
      +
      Table of Contents
      + +
      +
      + +
      +
      +
      + +
      +
      + + + +
      + +
      +

      Messaging

      + +

      Sending a Message (SignalR)

      +

      A message typed in the TUI travels through encryption, the SignalR hub, +ChatService validation, database storage, and fan-out to both SignalR and IRC +clients.

      +
      sequenceDiagram
      +    participant UI as MainWindow (TUI)
      +    participant AO as AppOrchestrator
      +    participant EHC as EchoHubConnection
      +    participant Hub as ChatHub
      +    participant CS as ChatService
      +    participant LE as LinkEmbedService
      +    participant DB as SQLite
      +    participant SRB as SignalRBroadcaster
      +    participant IRCB as IrcBroadcaster
      +    participant Clients as Other Clients
      +
      +    UI->>AO: OnMessageSubmitted(channel, text)
      +    AO->>AO: IsCommand(text)? → No
      +    AO->>EHC: SendMessageAsync(channel, text)
      +    EHC->>EHC: Encrypt(text) → ciphertext
      +    EHC->>Hub: InvokeAsync("SendMessage", channel, ciphertext)
      +    Hub->>CS: SendMessageAsync(userId, username, channel, ciphertext)
      +    CS->>CS: Decrypt(ciphertext) → plaintext
      +    CS->>CS: Validate (length, newlines, channel exists)
      +    CS->>DB: Check mute status
      +    CS->>LE: TryGetEmbedsAsync(plaintext)
      +    LE->>LE: Extract URLs, fetch OG tags
      +    LE-->>CS: List<EmbedDto> (or null)
      +    CS->>DB: INSERT Message (encrypted at rest)
      +    CS->>CS: Re-encrypt plaintext for transport
      +    CS->>CS: Build MessageDto with embeds
      +
      +    par Fan-out to all broadcasters
      +        CS->>SRB: SendMessageToChannelAsync(channel, dto)
      +        SRB->>Clients: HubContext.Group(channel).ReceiveMessage(dto)
      +    and
      +        CS->>IRCB: SendMessageToChannelAsync(channel, dto)
      +        IRCB->>IRCB: Decrypt → format as PRIVMSG lines
      +        IRCB->>Clients: Send to each IRC conn (skip sender)
      +    end
      +
      +

      Code references:

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      StepFileLocation
      Input handlersrc/EchoHub.Client/UI/MainWindow.csLines 428-449 (OnInputKeyDown)
      Orchestrator dispatchsrc/EchoHub.Client/AppOrchestrator.csLines 631-661 (HandleMessageSubmitted)
      Client encrypt + sendsrc/EchoHub.Client/Services/EchoHubConnection.csLines 148-153 (SendMessageAsync)
      Hub receivesrc/EchoHub.Server/Hubs/ChatHub.csLines 98-111 (SendMessage)
      ChatService processsrc/EchoHub.Server/Services/ChatService.csLines 145-241 (SendMessageAsync)
      Mute checksrc/EchoHub.Server/Services/ChatService.csLines 177-190
      Link embedssrc/EchoHub.Server/Services/LinkEmbedService.csLines 28-51 (TryGetEmbedsAsync)
      DB insertsrc/EchoHub.Server/Services/ChatService.csLines 208-221
      Broadcast fan-outsrc/EchoHub.Server/Services/ChatService.csLines 311-324 (BroadcastToAllAsync)
      SignalR broadcastsrc/EchoHub.Server/Services/SignalRBroadcaster.csLines 23-24
      IRC broadcastsrc/EchoHub.Server.Irc/IrcBroadcaster.csLines 17-32
      +
      +

      Sending a Message (IRC)

      +

      Messages from IRC clients follow the same ChatService path but enter as +plaintext (no app-layer encryption).

      +
      sequenceDiagram
      +    participant IRC as IRC Client
      +    participant CH as IrcCommandHandler
      +    participant CS as ChatService
      +    participant DB as SQLite
      +    participant SRB as SignalRBroadcaster
      +    participant IRCB as IrcBroadcaster
      +
      +    IRC->>CH: PRIVMSG #channel :Hello world
      +    CH->>CH: Parse target + content
      +    CH->>CH: IrcToEchoHubChannel("#channel") → "channel"
      +    CH->>CS: SendMessageAsync(userId, username, "channel", "Hello world")
      +    CS->>CS: Decrypt("Hello world") → passthrough (no $ENC$ prefix)
      +    CS->>CS: Validate, check mute, fetch embeds
      +    CS->>DB: INSERT Message
      +    CS->>CS: Encrypt plaintext for SignalR transport
      +
      +    par Fan-out
      +        CS->>SRB: SendMessageToChannelAsync (encrypted for SignalR)
      +    and
      +        CS->>IRCB: SendMessageToChannelAsync (decrypt → PRIVMSG)
      +        IRCB->>IRCB: Skip sender (IRC echo suppression)
      +    end
      +
      +

      Code references:

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      StepFileLocation
      PRIVMSG handlersrc/EchoHub.Server.Irc/IrcCommandHandler.csLines 437-469
      Channel name conversionsrc/EchoHub.Server.Irc/IrcCommandHandler.csLine 680 (IrcToEchoHubChannel)
      ChatService (shared path)src/EchoHub.Server/Services/ChatService.csLines 145-241
      IRC echo suppressionsrc/EchoHub.Server.Irc/IrcBroadcaster.csLines 25-26
      +
      +

      Receiving a Message (TUI Client)

      +

      When a message arrives via SignalR, the client decrypts it, adds it to the chat +view, and optionally plays a notification sound for @mentions.

      +
      sequenceDiagram
      +    participant SRB as SignalRBroadcaster
      +    participant EHC as EchoHubConnection
      +    participant AO as AppOrchestrator
      +    participant MM as ChatMessageManager
      +    participant UI as MainWindow
      +
      +    SRB->>EHC: ReceiveMessage(MessageDto)
      +    EHC->>EHC: Decrypt(message.Content)
      +    EHC-->>AO: OnMessageReceived(decrypted dto)
      +    AO->>AO: InvokeUI (thread-safe)
      +    AO->>MM: AddMessage(message)
      +    MM->>UI: Render in chat ListView
      +    alt Message contains @username
      +        AO->>AO: PlayAsync() notification sound
      +    end
      +
      +

      Code references:

      + + + + + + + + + + + + + + + + + + + + + + + + + +
      StepFileLocation
      SignalR handlersrc/EchoHub.Client/Services/EchoHubConnection.csLines 64-71
      Orchestrator receivesrc/EchoHub.Client/AppOrchestrator.csLines 372-383
      @mention detectionsrc/EchoHub.Client/AppOrchestrator.csLines 378-382
      +
      +

      Command Execution

      +

      Slash commands (/status, /nick, /kick, etc.) are parsed client-side and +dispatched to appropriate handlers, which call REST APIs or SignalR methods.

      +
      sequenceDiagram
      +    participant UI as MainWindow
      +    participant AO as AppOrchestrator
      +    participant CMD as CommandHandler
      +    participant API as ApiClient
      +    participant EHC as EchoHubConnection
      +    participant Server as Server (API/Hub)
      +
      +    UI->>AO: OnMessageSubmitted(channel, "/kick baduser")
      +    AO->>CMD: IsCommand("/kick baduser")? → true
      +    AO->>CMD: HandleAsync("/kick baduser")
      +    CMD->>CMD: Parse → command="kick", args="baduser"
      +
      +    alt API command (kick, ban, mute, nick, etc.)
      +        CMD-->>AO: Fire OnKickRequested("baduser")
      +        AO->>API: KickUserAsync("baduser")
      +        API->>Server: POST /api/moderation/kick/baduser
      +    else Hub command (status, join, leave, etc.)
      +        CMD-->>AO: Fire OnSetStatus / OnJoinChannel / etc.
      +        AO->>EHC: UpdateStatusAsync() / JoinChannelAsync() / etc.
      +        EHC->>Server: SignalR Invoke
      +    else Local command (theme, help, quit)
      +        CMD-->>AO: Fire OnThemeChanged / etc.
      +        AO->>UI: Apply locally (no server call)
      +    end
      +
      +    AO->>UI: AddSystemMessage(result)
      +
      +

      Available commands:

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      CommandTypeHandler
      /status <status> [message]HubUpdateStatusAsync
      /nick <name>APIUpdateProfileAsync
      /color <hex>APIUpdateProfileAsync
      /join <channel>HubJoinChannelAsync
      /leaveHubLeaveChannelAsync
      /topic <text>APIUpdateChannelTopicAsync
      /kick <user>APIPOST /api/moderation/kick/{user}
      /ban <user>APIPOST /api/moderation/ban/{user}
      /unban <user>APIPOST /api/moderation/unban/{user}
      /mute <user> [mins]APIPOST /api/moderation/mute/{user}
      /unmute <user>APIPOST /api/moderation/unmute/{user}
      /role <user> <role>APIPUT /api/moderation/role/{user}
      /nukeAPIDELETE /api/channels/{channel}/messages
      /send <file>APIPOST /api/channels/{channel}/upload
      /profile [user]LocalShow profile dialog
      /avatarAPIPOST /api/users/avatar
      /theme <name>LocalThemeManager.SetTheme()
      /serversAPIGET /api/serverdir/servers
      /usersLocalShow userlist
      /helpLocalShow help text
      /quitLocalExit application
      +

      Code references:

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      StepFileLocation
      Command detectionsrc/EchoHub.Client/AppOrchestrator.csLines 639-655
      Command dispatchsrc/EchoHub.Client/Commands/CommandHandler.csLines 34-69 (HandleAsync)
      Command handlers wiredsrc/EchoHub.Client/AppOrchestrator.csLines 97-117
      Individual handlerssrc/EchoHub.Client/AppOrchestrator.csLines 122-350
      + +
      + + + + + +
      + +
      + +
      +
      + +
      + + + + diff --git a/flows/moderation.html b/flows/moderation.html new file mode 100644 index 0000000..39dc3a9 --- /dev/null +++ b/flows/moderation.html @@ -0,0 +1,196 @@ + + + + + Moderation | EchoHub Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + +
      + +
      +
      +
      +
      +
      Table of Contents
      + +
      +
      + +
      +
      +
      + +
      +
      + + + +
      + +
      +

      Moderation

      + +

      Kick / Ban / Mute

      +

      Moderators and admins can kick, ban, or mute users via REST API or slash commands. +These actions force-disconnect the target and broadcast the event.

      +
      sequenceDiagram
      +    participant Mod as Moderator
      +    participant MC as ModerationController
      +    participant CS as ChatService
      +    participant PT as PresenceTracker
      +    participant DB as SQLite
      +    participant SRB as SignalRBroadcaster
      +    participant IRCB as IrcBroadcaster
      +
      +    Mod->>MC: POST /api/moderation/kick/{user}
      +
      +    alt Kick
      +        MC->>CS: Get user's channels
      +        MC->>CS: BroadcastToAllAsync(SendUserKickedAsync)
      +        MC->>CS: ForceDisconnectAndCleanupAsync(user)
      +    else Ban
      +        MC->>DB: Set user.IsBanned = true
      +        MC->>CS: BroadcastToAllAsync(SendUserBannedAsync)
      +        MC->>CS: ForceDisconnectAndCleanupAsync(user)
      +    else Mute
      +        MC->>DB: Set user.IsMuted = true, MutedUntil = now + duration
      +        Note over DB: MuteExpirationService auto-unmutes when timer expires
      +    end
      +
      +    CS->>PT: ForceRemoveUser(username)
      +    PT->>PT: Remove from all connections + channels
      +    CS->>SRB: ForceDisconnectUserAsync(connectionIds, reason)
      +    CS->>IRCB: ForceDisconnectUserAsync(connectionIds, reason)
      +    CS->>DB: Set Status=Invisible, LastSeenAt=now
      +
      +

      Code references:

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      StepFileLocation
      Kick endpointsrc/EchoHub.Server/Controllers/ModerationController.csLines 62-87
      Ban endpointsrc/EchoHub.Server/Controllers/ModerationController.csLines 89-112
      Mute endpointsrc/EchoHub.Server/Controllers/ModerationController.csLines 130-151
      Force disconnectsrc/EchoHub.Server/Controllers/ModerationController.csLines 232-256
      Mute expirationsrc/EchoHub.Server/Services/MuteExpirationService.csLines 22-62
      Mute enforcementsrc/EchoHub.Server/Services/ChatService.csLines 177-190
      Presence force removesrc/EchoHub.Server/Services/PresenceTracker.csLines 161-178
      + +
      + + + + + +
      + +
      + +
      +
      + +
      + + + + diff --git a/flows/toc.html b/flows/toc.html new file mode 100644 index 0000000..9d5901c --- /dev/null +++ b/flows/toc.html @@ -0,0 +1,37 @@ + +
      +
      +
      +
      + + + +
      +
      +
      +
      + + +
      +
      +
      +
      diff --git a/flows/toc.json b/flows/toc.json new file mode 100644 index 0000000..572e26a --- /dev/null +++ b/flows/toc.json @@ -0,0 +1,2 @@ + +{"items":[{"name":"Authentication","href":"authentication.html","topicHref":"authentication.html"},{"name":"Connection","href":"connection.html","topicHref":"connection.html"},{"name":"Messaging","href":"messaging.html","topicHref":"messaging.html"},{"name":"Channels","href":"channels.html","topicHref":"channels.html"},{"name":"Moderation","href":"moderation.html","topicHref":"moderation.html"},{"name":"Media & Services","href":"media.html","topicHref":"media.html"}]} diff --git a/index.json b/index.json index c60eb2b..4454635 100644 --- a/index.json +++ b/index.json @@ -69,6 +69,11 @@ "title": "Class AudioPlaybackService | EchoHub Documentation", "summary": "Class AudioPlaybackService Namespace EchoHub.Client.Services Assembly EchoHub.Client.dll public class AudioPlaybackService Inheritance object AudioPlaybackService Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors AudioPlaybackService() public AudioPlaybackService() Properties IsPaused public bool IsPaused { get; } Property Value bool IsPlaying public bool IsPlaying { get; } Property Value bool Methods PauseAsync() public Task PauseAsync() Returns Task PlayAsync(string) public Task PlayAsync(string filePath) Parameters filePath string Returns Task ResumeAsync() public Task ResumeAsync() Returns Task SetVolumeAsync(byte) public Task SetVolumeAsync(byte volume) Parameters volume byte Returns Task StopAsync() public Task StopAsync() Returns Task Events PlaybackFinished public event EventHandler? PlaybackFinished Event Type EventHandler" }, + "api/client/EchoHub.Client.Services.BackupInfo.html": { + "href": "api/client/EchoHub.Client.Services.BackupInfo.html", + "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.ClientEncryptionService.html": { "href": "api/client/EchoHub.Client.Services.ClientEncryptionService.html", "title": "Class ClientEncryptionService | EchoHub Documentation", @@ -77,22 +82,32 @@ "api/client/EchoHub.Client.Services.EchoHubConnection.html": { "href": "api/client/EchoHub.Client.Services.EchoHubConnection.html", "title": "Class EchoHubConnection | EchoHub Documentation", - "summary": "Class EchoHubConnection Namespace EchoHub.Client.Services Assembly EchoHub.Client.dll public sealed class EchoHubConnection : IAsyncDisposable Inheritance object EchoHubConnection Implements IAsyncDisposable Inherited Members object.GetType() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors EchoHubConnection(string, ApiClient, ClientEncryptionService) public EchoHubConnection(string serverUrl, ApiClient apiClient, ClientEncryptionService encryption) Parameters serverUrl string apiClient ApiClient encryption ClientEncryptionService Properties IsConnected public bool IsConnected { get; } Property Value bool Methods ConnectAsync() public Task ConnectAsync() Returns Task DisconnectAsync() public Task DisconnectAsync() Returns Task DisposeAsync() public ValueTask DisposeAsync() Returns ValueTask GetHistoryAsync(string, int) public Task> GetHistoryAsync(string channelName, int count = 100) Parameters channelName string count int Returns Task> GetOnlineUsersAsync(string) public Task> GetOnlineUsersAsync(string channelName) Parameters channelName string Returns Task> JoinChannelAsync(string) public Task> JoinChannelAsync(string channelName) Parameters channelName string Returns Task> LeaveChannelAsync(string) public Task LeaveChannelAsync(string channelName) Parameters channelName string Returns Task SendMessageAsync(string, string) public Task SendMessageAsync(string channelName, string content) Parameters channelName string content string Returns Task UpdateStatusAsync(UserStatus, string?) public Task UpdateStatusAsync(UserStatus status, string? statusMessage = null) Parameters status UserStatus statusMessage string Returns Task Events OnChannelNuked public event Action? OnChannelNuked Event Type Action OnChannelUpdated public event Action? OnChannelUpdated Event Type Action OnConnectionStateChanged public event Action? OnConnectionStateChanged Event Type Action OnError public event Action? OnError Event Type Action OnForceDisconnect public event Action? OnForceDisconnect Event Type Action OnMessageDeleted public event Action? OnMessageDeleted Event Type Action OnMessageReceived public event Action? OnMessageReceived Event Type Action OnReconnected public event Action? OnReconnected Event Type Action OnUserBanned public event Action? OnUserBanned Event Type Action OnUserJoined public event Action? OnUserJoined Event Type Action OnUserKicked public event Action? OnUserKicked Event Type Action OnUserLeft public event Action? OnUserLeft Event Type Action OnUserStatusChanged public event Action? OnUserStatusChanged Event Type Action" + "summary": "Class EchoHubConnection Namespace EchoHub.Client.Services Assembly EchoHub.Client.dll public sealed class EchoHubConnection : IAsyncDisposable Inheritance object EchoHubConnection Implements IAsyncDisposable Inherited Members object.GetType() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors EchoHubConnection(string, ApiClient, ClientEncryptionService) public EchoHubConnection(string serverUrl, ApiClient apiClient, ClientEncryptionService encryption) Parameters serverUrl string apiClient ApiClient encryption ClientEncryptionService Properties IsConnected public bool IsConnected { get; } Property Value bool Methods ConnectAsync() public Task ConnectAsync() Returns Task DisconnectAsync() public Task DisconnectAsync() Returns Task DisposeAsync() public ValueTask DisposeAsync() Returns ValueTask GetHistoryAsync(string, int) public Task> GetHistoryAsync(string channelName, int count = 100) Parameters channelName string count int Returns Task> GetOnlineUsersAsync(string) public Task> GetOnlineUsersAsync(string channelName) Parameters channelName string Returns Task> JoinChannelAsync(string) public Task> JoinChannelAsync(string channelName) Parameters channelName string Returns Task> LeaveChannelAsync(string) public Task LeaveChannelAsync(string channelName) Parameters channelName string Returns Task SendMessageAsync(string, string) public Task SendMessageAsync(string channelName, string content) Parameters channelName string content string Returns Task UpdateStatusAsync(UserStatus, string?) public Task UpdateStatusAsync(UserStatus status, string? statusMessage = null) Parameters status UserStatus statusMessage string Returns Task Events OnChannelNuked public event Action? OnChannelNuked Event Type Action OnChannelUpdated public event Action? OnChannelUpdated Event Type Action OnConnectionStateChanged public event Action? OnConnectionStateChanged Event Type Action OnError public event Action? OnError Event Type Action OnForceDisconnect public event Action? OnForceDisconnect Event Type Action OnMessageDeleted public event Action? OnMessageDeleted Event Type Action OnMessageReceived public event Action? OnMessageReceived Event Type Action OnReconnected public event Action? OnReconnected Event Type Action OnUserBanned public event Action? OnUserBanned Event Type Action OnUserJoined public event Action? OnUserJoined Event Type Action OnUserKicked public event Action? OnUserKicked Event Type Action OnUserLeft public event Action? OnUserLeft Event Type Action OnUserStatusChanged public event Action? OnUserStatusChanged Event Type Action" }, "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.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.UpdateBackupService.html": { + "href": "api/client/EchoHub.Client.Services.UpdateBackupService.html", + "title": "Class UpdateBackupService | EchoHub Documentation", + "summary": "Class UpdateBackupService Namespace EchoHub.Client.Services Assembly EchoHub.Client.dll Manages pre-update backups and rollback restoration for the auto-updater. Backup location: ~/.echohub/update-backup/ public static class UpdateBackupService Inheritance object UpdateBackupService Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Properties IsPostUpdate True if a backup exists from a recent update (set at startup). public static bool IsPostUpdate { get; set; } Property Value bool Methods BackupExists() Returns true if a valid backup exists (both ZIP and metadata file present). public static bool BackupExists() Returns bool CreateBackup() Creates a ZIP backup of the current app directory before an update. Deletes any previous backup first. Uses fastest compression for speed. public static void CreateBackup() DeleteBackup() Deletes the backup directory and all contents. public static void DeleteBackup() GetBackupInfo() Reads backup metadata. Returns null if no backup exists or metadata is unreadable. public static BackupInfo? GetBackupInfo() Returns BackupInfo RestoreBackup() Restores the backup ZIP to the app directory, then restarts the process. This method does not return — it calls Environment.Exit(0). public static void RestoreBackup()" + }, "api/client/EchoHub.Client.Services.UpdateChecker.html": { "href": "api/client/EchoHub.Client.Services.UpdateChecker.html", "title": "Class UpdateChecker | EchoHub Documentation", - "summary": "Class UpdateChecker Namespace EchoHub.Client.Services Assembly EchoHub.Client.dll public sealed class UpdateChecker : IDisposable Inheritance object UpdateChecker Implements IDisposable Inherited Members object.GetType() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors UpdateChecker(IApplication) public UpdateChecker(IApplication app) Parameters app IApplication Properties CurrentVersion public static string CurrentVersion { get; } Property Value string Methods Dispose() public void Dispose() Start() public void Start()" + "summary": "Class UpdateChecker Namespace EchoHub.Client.Services Assembly EchoHub.Client.dll public sealed class UpdateChecker : IDisposable Inheritance object UpdateChecker Implements IDisposable Inherited Members object.GetType() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors UpdateChecker(IApplication) public UpdateChecker(IApplication app) Parameters app IApplication Properties CurrentVersion public static string CurrentVersion { get; } Property Value string Methods CheckNowAsync() public Task CheckNowAsync() Returns Task Dispose() public void Dispose() Start() public void Start()" }, "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 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 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 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" }, "api/client/EchoHub.Client.Themes.Theme.html": { "href": "api/client/EchoHub.Client.Themes.Theme.html", @@ -117,12 +132,12 @@ "api/client/EchoHub.Client.UI.Chat.ChatColors.html": { "href": "api/client/EchoHub.Client.UI.Chat.ChatColors.html", "title": "Class ChatColors | EchoHub Documentation", - "summary": "Class ChatColors Namespace EchoHub.Client.UI.Chat Assembly EchoHub.Client.dll Shared color attributes for chat rendering (timestamps, system messages). public static class ChatColors Inheritance object ChatColors Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Fields AudioAttr public static readonly Attribute AudioAttr Field Value Attribute EmbedBorderAttr public static readonly Attribute EmbedBorderAttr Field Value Attribute EmbedDescAttr public static readonly Attribute EmbedDescAttr Field Value Attribute EmbedTitleAttr public static readonly Attribute EmbedTitleAttr Field Value Attribute EmbedUrlAttr public static readonly Attribute EmbedUrlAttr Field Value Attribute FileAttr public static readonly Attribute FileAttr Field Value Attribute MentionHighlightAttr public static readonly Attribute MentionHighlightAttr Field Value Attribute MentionTextAttr public static readonly Attribute MentionTextAttr Field Value Attribute SystemAttr public static readonly Attribute SystemAttr Field Value Attribute TimestampAttr public static readonly Attribute TimestampAttr Field Value Attribute Methods SplitMentions(string, Attribute?) Split text around @mentions, giving each @word the MentionTextAttr accent color. Non-mention text uses the provided default color. public static List SplitMentions(string text, Attribute? defaultColor = null) Parameters text string defaultColor Attribute? Returns List" + "summary": "Class ChatColors Namespace EchoHub.Client.UI.Chat Assembly EchoHub.Client.dll Shared color attributes for chat rendering (timestamps, system messages). public static class ChatColors Inheritance object ChatColors Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Fields AudioAttr public static readonly Attribute AudioAttr Field Value Attribute ChannelRefAttr public static readonly Attribute ChannelRefAttr Field Value Attribute EmbedBorderAttr public static readonly Attribute EmbedBorderAttr Field Value Attribute EmbedDescAttr public static readonly Attribute EmbedDescAttr Field Value Attribute EmbedTitleAttr public static readonly Attribute EmbedTitleAttr Field Value Attribute EmbedUrlAttr public static readonly Attribute EmbedUrlAttr Field Value Attribute FileAttr public static readonly Attribute FileAttr Field Value Attribute MentionHighlightAttr public static readonly Attribute MentionHighlightAttr Field Value Attribute MentionTextAttr public static readonly Attribute MentionTextAttr Field Value Attribute SystemAttr public static readonly Attribute SystemAttr Field Value Attribute TimestampAttr public static readonly Attribute TimestampAttr Field Value Attribute Methods SplitMentions(string, Attribute?) Split text around @mentions and #channels, giving each the appropriate accent color. Non-special text uses the provided default color. public static List SplitMentions(string text, Attribute? defaultColor = null) Parameters text string defaultColor Attribute? Returns List" }, "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 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 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 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" }, "api/client/EchoHub.Client.UI.Chat.ChatListSource.html": { "href": "api/client/EchoHub.Client.UI.Chat.ChatListSource.html", @@ -237,7 +252,7 @@ "api/client/EchoHub.Client.UI.ListSources.UserListSource.html": { "href": "api/client/EchoHub.Client.UI.ListSources.UserListSource.html", "title": "Class UserListSource | EchoHub Documentation", - "summary": "Class UserListSource Namespace EchoHub.Client.UI.ListSources Assembly EchoHub.Client.dll Custom list data source for the online users panel with per-user nickname colors. public class UserListSource : IListDataSource, IDisposable Inheritance object UserListSource 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 UserListSource() public UserListSource() 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<(string Text, Attribute? NameColor)>) public void Update(List<(string Text, Attribute? NameColor)> users) Parameters users List<(string Text, Attribute? NameColor)> Events CollectionChanged public event NotifyCollectionChangedEventHandler? CollectionChanged Event Type NotifyCollectionChangedEventHandler" + "summary": "Class UserListSource Namespace EchoHub.Client.UI.ListSources Assembly EchoHub.Client.dll Custom list data source for the online users panel with per-user nickname colors. public class UserListSource : IListDataSource, IDisposable Inheritance object UserListSource 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 UserListSource() public UserListSource() 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() GetUsername(int) public string? GetUsername(int index) Parameters index int Returns string 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<(string Text, Attribute? NameColor, string Username)>) public void Update(List<(string Text, Attribute? NameColor, string Username)> users) Parameters users List<(string Text, Attribute? NameColor, string Username)> Events CollectionChanged public event NotifyCollectionChangedEventHandler? CollectionChanged Event Type NotifyCollectionChangedEventHandler" }, "api/client/EchoHub.Client.UI.ListSources.html": { "href": "api/client/EchoHub.Client.UI.ListSources.html", @@ -247,7 +262,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[], IInputBinding) View.InvokeCommand(Command, IInputBinding) 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.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.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.HandlingHotKey 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 OnChannelSelected Fired when the user selects a channel. Parameter is the channel name. public event Action? OnChannelSelected Event Type Action OnConnectRequested Fired when the user requests to connect via the menu. public event Action? OnConnectRequested Event Type Action OnCreateChannelRequested Fired when the user requests to create a new channel. public event Action? OnCreateChannelRequested Event Type Action OnDeleteChannelRequested Fired when the user requests to delete the current channel. public event Action? OnDeleteChannelRequested Event Type Action OnDisconnectRequested Fired when the user requests to disconnect via the menu. public event Action? OnDisconnectRequested Event Type Action OnFileDownloadRequested Fired when the user activates (Enter/click) a file message. Parameters: attachmentUrl, fileName. public event Action? OnFileDownloadRequested Event Type Action OnLogoutRequested Fired when the user requests to logout (disconnect + revoke session). public event Action? OnLogoutRequested Event Type Action OnMessageSubmitted Fired when the user presses Enter in the input field. Parameters: channel name, message content. public event Action? OnMessageSubmitted Event Type Action OnProfileRequested Fired when the user requests to open their profile panel. public event Action? OnProfileRequested Event Type Action OnSavedServersRequested Fired when the user requests to view saved servers. public event Action? OnSavedServersRequested Event Type Action OnStatusRequested Fired when the user requests to set their status. public event Action? OnStatusRequested Event Type Action OnThemeSelected Fired when the user selects a theme from the menu. Parameter is the theme name. public event Action? OnThemeSelected Event Type Action" + "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[], IInputBinding) View.InvokeCommand(Command, IInputBinding) 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.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.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.HandlingHotKey View.ContentSizeChanging View.ContentSizeChanged View.ViewportChanged View.Disposing View.Initialized View.EnabledChanged View.VisibleChanging View.VisibleChanged View.TitleChanging View.TitleChanged View.GettingAttributeForRole View.ClearingViewport View.ClearedViewport View.DrawingText View.DrewText View.DrawingContent View.DrawingSubViews View.DrawComplete View.SchemeNameChanging View.SchemeNameChanged View.GettingScheme View.SchemeChanging View.SchemeChanged View.SuperViewChanging View.SuperViewChanged View.SubViewAdded View.SubViewRemoved View.Removed View.HotKeyChanged View.KeyDown View.KeyDownNotHandled View.FrameChanged View.HeightChanging View.HeightChanged View.WidthChanging View.WidthChanged View.SubViewLayout View.SubViewsLaidOut View.AdvancingFocus View.CanFocusChanged View.FocusedChanged View.HasFocusChanging View.HasFocusChanged View.TextChanged object.GetType() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors MainWindow(IApplication, ChatMessageManager) public MainWindow(IApplication app, ChatMessageManager messageManager) Parameters app IApplication messageManager ChatMessageManager Properties CurrentChannel Get the current channel name. public string CurrentChannel { get; } Property Value string Methods ApplyColorSchemes() Applies the currently registered color schemes to all views. Call after theme changes to refresh colors. public void ApplyColorSchemes() ClearAll() Clear all messages and channels (used on disconnect). public void ClearAll() EnsureChannelInList(string, bool?) Ensure a channel exists in the left panel list (used for private channels joined via /join). public void EnsureChannelInList(string channelName, bool? isPublic = null) Parameters channelName string isPublic bool? FocusInput() Focus the input field for typing. public void FocusInput() GetChannelNames() Get all channel names that have message buffers (for broadcasting status changes). public IReadOnlyList GetChannelNames() Returns IReadOnlyList RefreshMenuBar() Rebuilds and replaces the menu bar (e.g., after theme list changes). public void RefreshMenuBar() RemoveChannel(string) Remove a channel from the left panel list. public void RemoveChannel(string channelName) Parameters channelName string SetChannelTopic(string, string?) Update the topic for a specific channel. public void SetChannelTopic(string channelName, string? topic) Parameters channelName string topic string SetChannels(List) Set the list of available channels, storing topics, and refresh the channel list view. public void SetChannels(List channels) Parameters channels List SetCurrentUser(string) Set the current user name (delegates to message manager for @mention detection). public void SetCurrentUser(string username) Parameters username string ShowError(string) Show an error message to the user. public void ShowError(string message) Parameters message string SwitchToChannel(string) Switch the chat view to the given channel, resetting its unread count and updating the topic bar. public void SwitchToChannel(string channelName) Parameters channelName string ToggleUsersPanel() Toggle the online users panel visibility (F2). public void ToggleUsersPanel() UpdateOnlineUsers(List) Update the online users list display. public void UpdateOnlineUsers(List users) Parameters users List UpdateStatusBar(string) Update the connection status displayed in the status bar. public void UpdateStatusBar(string status) Parameters status string Events OnAudioPlayRequested Fired when the user activates (Enter/click) an audio message. Parameters: attachmentUrl, fileName. public event Action? OnAudioPlayRequested Event Type Action OnChannelJoinRequested Fired when the user activates a #channel reference in a message. Parameter is the channel name. public event Action? OnChannelJoinRequested Event Type Action OnChannelSelected Fired when the user selects a channel. Parameter is the channel name. public event Action? OnChannelSelected Event Type Action OnCheckForUpdatesRequested Fired when the user requests to check for updates. public event Action? OnCheckForUpdatesRequested Event Type Action OnConnectRequested Fired when the user requests to connect via the menu. public event Action? OnConnectRequested Event Type Action OnCreateChannelRequested Fired when the user requests to create a new channel. public event Action? OnCreateChannelRequested Event Type Action OnDeleteChannelRequested Fired when the user requests to delete the current channel. public event Action? OnDeleteChannelRequested Event Type Action OnDisconnectRequested Fired when the user requests to disconnect via the menu. public event Action? OnDisconnectRequested Event Type Action OnFileDownloadRequested Fired when the user activates (Enter/click) a file message. Parameters: attachmentUrl, fileName. public event Action? OnFileDownloadRequested Event Type Action OnLogoutRequested Fired when the user requests to logout (disconnect + revoke session). public event Action? OnLogoutRequested Event Type Action OnMessageSubmitted Fired when the user presses Enter in the input field. Parameters: channel name, message content. public event Action? OnMessageSubmitted Event Type Action OnProfileRequested Fired when the user requests to open their profile panel. public event Action? OnProfileRequested Event Type Action OnRollbackRequested Fired when the user requests to rollback to the previous version. public event Action? OnRollbackRequested Event Type Action OnSavedServersRequested Fired when the user requests to view saved servers. public event Action? OnSavedServersRequested Event Type Action OnStatusRequested Fired when the user requests to set their status. public event Action? OnStatusRequested Event Type Action OnThemeSelected Fired when the user selects a theme from the menu. Parameter is the theme name. public event Action? OnThemeSelected Event Type Action OnUserProfileRequested Fired when the user activates a username (in userlist or message). Parameter is the username. public event Action? OnUserProfileRequested Event Type Action" }, "api/client/EchoHub.Client.UI.html": { "href": "api/client/EchoHub.Client.UI.html", @@ -292,27 +307,32 @@ "api/core/EchoHub.Core.Contracts.IChatBroadcaster.html": { "href": "api/core/EchoHub.Core.Contracts.IChatBroadcaster.html", "title": "Interface IChatBroadcaster | EchoHub Documentation", - "summary": "Interface IChatBroadcaster Namespace EchoHub.Core.Contracts Assembly EchoHub.Core.dll public interface IChatBroadcaster Methods ForceDisconnectUserAsync(List, string) Task ForceDisconnectUserAsync(List connectionIds, string reason) Parameters connectionIds List reason string Returns Task SendChannelNukedAsync(string) Task SendChannelNukedAsync(string channelName) Parameters channelName string Returns Task SendChannelUpdatedAsync(ChannelDto, string?) Task SendChannelUpdatedAsync(ChannelDto channel, string? channelName = null) Parameters channel ChannelDto channelName string Returns Task SendErrorAsync(string, string) Task SendErrorAsync(string connectionId, string message) Parameters connectionId string message string Returns Task SendMessageDeletedAsync(string, Guid) Task SendMessageDeletedAsync(string channelName, Guid messageId) Parameters channelName string messageId Guid Returns Task SendMessageToChannelAsync(string, MessageDto) Task SendMessageToChannelAsync(string channelName, MessageDto message) Parameters channelName string message MessageDto Returns Task SendUserBannedAsync(string, string?) Task SendUserBannedAsync(string username, string? reason) Parameters username string reason string Returns Task SendUserJoinedAsync(string, string, string?) Task SendUserJoinedAsync(string channelName, string username, string? excludeConnectionId = null) Parameters channelName string username string excludeConnectionId string Returns Task SendUserKickedAsync(string, string, string?) Task SendUserKickedAsync(string channelName, string username, string? reason) Parameters channelName string username string reason string Returns Task SendUserLeftAsync(string, string) Task SendUserLeftAsync(string channelName, string username) Parameters channelName string username string Returns Task SendUserStatusChangedAsync(List, UserPresenceDto) Task SendUserStatusChangedAsync(List channelNames, UserPresenceDto presence) Parameters channelNames List presence UserPresenceDto Returns Task" + "summary": "Interface IChatBroadcaster Namespace EchoHub.Core.Contracts Assembly EchoHub.Core.dll public interface IChatBroadcaster Methods ForceDisconnectUserAsync(List, string) Task ForceDisconnectUserAsync(List connectionIds, string reason) Parameters connectionIds List reason string Returns Task SendChannelNukedAsync(string) Task SendChannelNukedAsync(string channelName) Parameters channelName string Returns Task SendChannelUpdatedAsync(ChannelDto, string?) Task SendChannelUpdatedAsync(ChannelDto channel, string? channelName = null) Parameters channel ChannelDto channelName string Returns Task SendErrorAsync(string, string) Task SendErrorAsync(string connectionId, string message) Parameters connectionId string message string Returns Task SendMessageDeletedAsync(string, Guid) Task SendMessageDeletedAsync(string channelName, Guid messageId) Parameters channelName string messageId Guid Returns Task SendMessageToChannelAsync(string, MessageDto) Task SendMessageToChannelAsync(string channelName, MessageDto message) Parameters channelName string message MessageDto Returns Task SendUserBannedAsync(string, string?) Task SendUserBannedAsync(string username, string? reason) Parameters username string reason string Returns Task SendUserJoinedAsync(string, string, UserPresenceDto?, string?) Task SendUserJoinedAsync(string channelName, string username, UserPresenceDto? presence, string? excludeConnectionId = null) Parameters channelName string username string presence UserPresenceDto excludeConnectionId string Returns Task SendUserKickedAsync(string, string, string?) Task SendUserKickedAsync(string channelName, string username, string? reason) Parameters channelName string username string reason string Returns Task SendUserLeftAsync(string, string) Task SendUserLeftAsync(string channelName, string username) Parameters channelName string username string Returns Task SendUserStatusChangedAsync(List, UserPresenceDto) Task SendUserStatusChangedAsync(List channelNames, UserPresenceDto presence) Parameters channelNames List presence UserPresenceDto Returns Task" }, "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 AuthenticateUserAsync(string, string) Task<(Guid UserId, string Username)?> AuthenticateUserAsync(string username, string password) Parameters username string password string Returns Task<(Guid UserId, string Username)?> BroadcastChannelUpdatedAsync(ChannelDto, string?) Task BroadcastChannelUpdatedAsync(ChannelDto channel, string? channelName = null) Parameters channel ChannelDto channelName string Returns Task BroadcastMessageAsync(string, MessageDto) Task BroadcastMessageAsync(string channelName, MessageDto message) Parameters channelName string message MessageDto Returns Task GetChannelHistoryAsync(string, int) Task> GetChannelHistoryAsync(string channelName, int count) Parameters channelName string count int Returns Task> GetChannelsForUserAsync(string) Task> GetChannelsForUserAsync(string username) Parameters username string Returns Task> GetOnlineUsersAsync(string) Task> GetOnlineUsersAsync(string channelName) Parameters channelName string Returns Task> GetUserProfileAsync(string) Task GetUserProfileAsync(string username) Parameters username 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) Task> GetChannelHistoryAsync(string channelName, int count) Parameters channelName string count int Returns Task> GetChannelsForUserAsync(string) Task> GetChannelsForUserAsync(string username) Parameters username string Returns Task> GetOnlineUsersAsync(string) Task> GetOnlineUsersAsync(string channelName) Parameters channelName string Returns Task> JoinChannelAsync(string, Guid, string, string) Task<(List History, string? Error)> JoinChannelAsync(string connectionId, Guid userId, string username, string channelName) Parameters connectionId string userId Guid username string channelName string Returns Task<(List History, string Error)> LeaveChannelAsync(string, string, string) Task LeaveChannelAsync(string connectionId, string username, string channelName) Parameters connectionId string username string channelName string Returns Task SendMessageAsync(Guid, string, string, string) Task SendMessageAsync(Guid userId, string username, string channelName, string content) Parameters userId Guid username string channelName string content string Returns Task UpdateStatusAsync(Guid, string, UserStatus, string?) Task UpdateStatusAsync(Guid userId, string username, UserStatus status, string? statusMessage) Parameters userId Guid username string status UserStatus statusMessage string Returns Task UserConnectedAsync(string, Guid, string) Task UserConnectedAsync(string connectionId, Guid userId, string username) Parameters connectionId string userId Guid username string Returns Task UserDisconnectedAsync(string) Task UserDisconnectedAsync(string connectionId) Parameters connectionId string Returns Task" }, "api/core/EchoHub.Core.Contracts.IEchoHubClient.html": { "href": "api/core/EchoHub.Core.Contracts.IEchoHubClient.html", "title": "Interface IEchoHubClient | EchoHub Documentation", - "summary": "Interface IEchoHubClient Namespace EchoHub.Core.Contracts Assembly EchoHub.Core.dll Methods the server can invoke on connected clients. public interface IEchoHubClient Methods ChannelNuked(string) Task ChannelNuked(string channelName) Parameters channelName string Returns Task ChannelUpdated(ChannelDto) Task ChannelUpdated(ChannelDto channel) Parameters channel ChannelDto Returns Task Error(string) Task Error(string message) Parameters message string Returns Task ForceDisconnect(string) Task ForceDisconnect(string reason) Parameters reason string Returns Task MessageDeleted(string, Guid) Task MessageDeleted(string channelName, Guid messageId) Parameters channelName string messageId Guid Returns Task ReceiveMessage(MessageDto) Task ReceiveMessage(MessageDto message) Parameters message MessageDto Returns Task UserBanned(string, string?) Task UserBanned(string username, string? reason) Parameters username string reason string Returns Task UserJoined(string, string) Task UserJoined(string channelName, string username) Parameters channelName string username string Returns Task UserKicked(string, string, string?) Task UserKicked(string channelName, string username, string? reason) Parameters channelName string username string reason string Returns Task UserLeft(string, string) Task UserLeft(string channelName, string username) Parameters channelName string username string Returns Task UserStatusChanged(UserPresenceDto) Task UserStatusChanged(UserPresenceDto presence) Parameters presence UserPresenceDto Returns Task" + "summary": "Interface IEchoHubClient Namespace EchoHub.Core.Contracts Assembly EchoHub.Core.dll Methods the server can invoke on connected clients. public interface IEchoHubClient Methods ChannelNuked(string) Task ChannelNuked(string channelName) Parameters channelName string Returns Task ChannelUpdated(ChannelDto) Task ChannelUpdated(ChannelDto channel) Parameters channel ChannelDto Returns Task Error(string) Task Error(string message) Parameters message string Returns Task ForceDisconnect(string) Task ForceDisconnect(string reason) Parameters reason string Returns Task MessageDeleted(string, Guid) Task MessageDeleted(string channelName, Guid messageId) Parameters channelName string messageId Guid Returns Task ReceiveMessage(MessageDto) Task ReceiveMessage(MessageDto message) Parameters message MessageDto Returns Task UserBanned(string, string?) Task UserBanned(string username, string? reason) Parameters username string reason string Returns Task UserJoined(string, string, UserPresenceDto?) Task UserJoined(string channelName, string username, UserPresenceDto? presence) Parameters channelName string username string presence UserPresenceDto Returns Task UserKicked(string, string, string?) Task UserKicked(string channelName, string username, string? reason) Parameters channelName string username string reason string Returns Task UserLeft(string, string) Task UserLeft(string channelName, string username) Parameters channelName string username string Returns Task UserStatusChanged(UserPresenceDto) Task UserStatusChanged(UserPresenceDto presence) Parameters presence UserPresenceDto Returns Task" }, "api/core/EchoHub.Core.Contracts.IMessageEncryptionService.html": { "href": "api/core/EchoHub.Core.Contracts.IMessageEncryptionService.html", "title": "Interface IMessageEncryptionService | EchoHub Documentation", "summary": "Interface IMessageEncryptionService Namespace EchoHub.Core.Contracts Assembly EchoHub.Core.dll public interface IMessageEncryptionService Properties EncryptDatabaseEnabled Whether database content should be encrypted at rest (server setting). bool EncryptDatabaseEnabled { get; } Property Value bool Methods Decrypt(string) string Decrypt(string content) Parameters content string Returns string DecryptNullable(string?) string? DecryptNullable(string? value) Parameters value string Returns string Encrypt(string) string Encrypt(string plaintext) Parameters plaintext string Returns string EncryptNullable(string?) string? EncryptNullable(string? value) Parameters value string Returns string" }, + "api/core/EchoHub.Core.Contracts.IUserService.html": { + "href": "api/core/EchoHub.Core.Contracts.IUserService.html", + "title": "Interface IUserService | EchoHub Documentation", + "summary": "Interface IUserService Namespace EchoHub.Core.Contracts Assembly EchoHub.Core.dll public interface IUserService Methods AuthenticateUserAsync(string, string) Task AuthenticateUserAsync(string username, string password) Parameters username string password string Returns Task GetUserByIdAsync(Guid) Task GetUserByIdAsync(Guid userId) Parameters userId Guid Returns Task GetUserProfileAsync(string) Task GetUserProfileAsync(string username) Parameters username string Returns Task RegisterUserAsync(string, string, string?) Task RegisterUserAsync(string username, string password, string? displayName = null) Parameters username string password string displayName string Returns Task SetAvatarAsync(Guid, string) Task SetAvatarAsync(Guid userId, string asciiArt) Parameters userId Guid asciiArt string Returns Task UpdateProfileAsync(Guid, string?, string?, string?) Task UpdateProfileAsync(Guid userId, string? displayName, string? bio, string? nicknameColor) Parameters userId Guid displayName string bio string nicknameColor string Returns Task" + }, "api/core/EchoHub.Core.Contracts.html": { "href": "api/core/EchoHub.Core.Contracts.html", "title": "Namespace EchoHub.Core.Contracts | EchoHub Documentation", - "summary": "Namespace EchoHub.Core.Contracts Classes ChannelListItem Interfaces IChannelService IChatBroadcaster IChatService IEchoHubClient Methods the server can invoke on connected clients. IMessageEncryptionService" + "summary": "Namespace EchoHub.Core.Contracts Classes ChannelListItem Interfaces IChannelService IChatBroadcaster IChatService IEchoHubClient Methods the server can invoke on connected clients. IMessageEncryptionService IUserService" }, "api/core/EchoHub.Core.DTOs.ApiResponse-1.html": { "href": "api/core/EchoHub.Core.DTOs.ApiResponse-1.html", @@ -362,7 +382,7 @@ "api/core/EchoHub.Core.DTOs.EmbedDto.html": { "href": "api/core/EchoHub.Core.DTOs.EmbedDto.html", "title": "Class EmbedDto | EchoHub Documentation", - "summary": "Class EmbedDto Namespace EchoHub.Core.DTOs Assembly EchoHub.Core.dll public record EmbedDto : IEquatable Inheritance object EmbedDto Implements IEquatable Inherited Members object.GetType() object.MemberwiseClone() object.Equals(object, object) object.ReferenceEquals(object, object) Constructors EmbedDto(EmbedDto) protected EmbedDto(EmbedDto original) Parameters original EmbedDto EmbedDto(string?, string?, string?, string?, string) public EmbedDto(string? SiteName, string? Title, string? Description, string? ImageAscii, string Url) Parameters SiteName string Title string Description string ImageAscii string Url string Properties Description public string? Description { get; init; } Property Value string EqualityContract protected virtual Type EqualityContract { get; } Property Value Type ImageAscii public string? ImageAscii { get; init; } Property Value string SiteName public string? SiteName { get; init; } Property Value string Title public string? Title { get; init; } Property Value string Url public string Url { get; init; } Property Value string Methods Deconstruct(out string?, out string?, out string?, out string?, out string) public void Deconstruct(out string? SiteName, out string? Title, out string? Description, out string? ImageAscii, out string Url) Parameters SiteName string Title string Description string ImageAscii string Url string Equals(EmbedDto?) public virtual bool Equals(EmbedDto? other) Parameters other EmbedDto 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 ==(EmbedDto?, EmbedDto?) public static bool operator ==(EmbedDto? left, EmbedDto? right) Parameters left EmbedDto right EmbedDto Returns bool operator !=(EmbedDto?, EmbedDto?) public static bool operator !=(EmbedDto? left, EmbedDto? right) Parameters left EmbedDto right EmbedDto Returns bool" + "summary": "Class EmbedDto Namespace EchoHub.Core.DTOs Assembly EchoHub.Core.dll public record EmbedDto : IEquatable Inheritance object EmbedDto Implements IEquatable Inherited Members object.GetType() object.MemberwiseClone() object.Equals(object, object) object.ReferenceEquals(object, object) Constructors EmbedDto(EmbedDto) protected EmbedDto(EmbedDto original) Parameters original EmbedDto EmbedDto(string?, string?, string?, string?, string, string?) public EmbedDto(string? SiteName, string? Title, string? Description, string? ImageAscii, string Url, string? ThemeColor = null) Parameters SiteName string Title string Description string ImageAscii string Url string ThemeColor string Properties Description public string? Description { get; init; } Property Value string EqualityContract protected virtual Type EqualityContract { get; } Property Value Type ImageAscii public string? ImageAscii { get; init; } Property Value string SiteName public string? SiteName { get; init; } Property Value string ThemeColor public string? ThemeColor { get; init; } Property Value string Title public string? Title { get; init; } Property Value string Url public string Url { get; init; } Property Value string Methods Deconstruct(out string?, out string?, out string?, out string?, out string, out string?) public void Deconstruct(out string? SiteName, out string? Title, out string? Description, out string? ImageAscii, out string Url, out string? ThemeColor) Parameters SiteName string Title string Description string ImageAscii string Url string ThemeColor string Equals(EmbedDto?) public virtual bool Equals(EmbedDto? other) Parameters other EmbedDto 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 ==(EmbedDto?, EmbedDto?) public static bool operator ==(EmbedDto? left, EmbedDto? right) Parameters left EmbedDto right EmbedDto Returns bool operator !=(EmbedDto?, EmbedDto?) public static bool operator !=(EmbedDto? left, EmbedDto? right) Parameters left EmbedDto right EmbedDto Returns bool" }, "api/core/EchoHub.Core.DTOs.EncryptionKeyResponse.html": { "href": "api/core/EchoHub.Core.DTOs.EncryptionKeyResponse.html", @@ -374,6 +394,11 @@ "title": "Class ErrorResponse | EchoHub Documentation", "summary": "Class ErrorResponse Namespace EchoHub.Core.DTOs Assembly EchoHub.Core.dll public record ErrorResponse : IEquatable Inheritance object ErrorResponse Implements IEquatable Inherited Members object.GetType() object.MemberwiseClone() object.Equals(object, object) object.ReferenceEquals(object, object) Constructors ErrorResponse(ErrorResponse) protected ErrorResponse(ErrorResponse original) Parameters original ErrorResponse ErrorResponse(string, string?) public ErrorResponse(string Error, string? Detail = null) Parameters Error string Detail string Properties Detail public string? Detail { get; init; } Property Value string EqualityContract protected virtual Type EqualityContract { get; } Property Value Type Error public string Error { get; init; } Property Value string Methods Deconstruct(out string, out string?) public void Deconstruct(out string Error, out string? Detail) Parameters Error string Detail string Equals(ErrorResponse?) public virtual bool Equals(ErrorResponse? other) Parameters other ErrorResponse 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 ==(ErrorResponse?, ErrorResponse?) public static bool operator ==(ErrorResponse? left, ErrorResponse? right) Parameters left ErrorResponse right ErrorResponse Returns bool operator !=(ErrorResponse?, ErrorResponse?) public static bool operator !=(ErrorResponse? left, ErrorResponse? right) Parameters left ErrorResponse right ErrorResponse Returns bool" }, + "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" + }, "api/core/EchoHub.Core.DTOs.KickRequest.html": { "href": "api/core/EchoHub.Core.DTOs.KickRequest.html", "title": "Class KickRequest | EchoHub Documentation", @@ -449,6 +474,16 @@ "title": "Class UserDto | EchoHub Documentation", "summary": "Class UserDto Namespace EchoHub.Core.DTOs Assembly EchoHub.Core.dll public record UserDto : IEquatable Inheritance object UserDto Implements IEquatable Inherited Members object.GetType() object.MemberwiseClone() object.Equals(object, object) object.ReferenceEquals(object, object) Constructors UserDto(UserDto) protected UserDto(UserDto original) Parameters original UserDto UserDto(Guid, string, string?, string?, UserStatus, DateTimeOffset) public UserDto(Guid Id, string Username, string? DisplayName, string? NicknameColor, UserStatus Status, DateTimeOffset LastSeenAt) Parameters Id Guid Username string DisplayName string NicknameColor string Status UserStatus LastSeenAt DateTimeOffset Properties DisplayName public string? DisplayName { get; init; } Property Value string EqualityContract protected virtual Type EqualityContract { get; } Property Value Type Id public Guid Id { get; init; } Property Value Guid LastSeenAt public DateTimeOffset LastSeenAt { get; init; } Property Value DateTimeOffset NicknameColor public string? NicknameColor { get; init; } Property Value string Status public UserStatus Status { get; init; } Property Value UserStatus Username public string Username { get; init; } Property Value string Methods Deconstruct(out Guid, out string, out string?, out string?, out UserStatus, out DateTimeOffset) public void Deconstruct(out Guid Id, out string Username, out string? DisplayName, out string? NicknameColor, out UserStatus Status, out DateTimeOffset LastSeenAt) Parameters Id Guid Username string DisplayName string NicknameColor string Status UserStatus LastSeenAt DateTimeOffset Equals(UserDto?) public virtual bool Equals(UserDto? other) Parameters other UserDto 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 ==(UserDto?, UserDto?) public static bool operator ==(UserDto? left, UserDto? right) Parameters left UserDto right UserDto Returns bool operator !=(UserDto?, UserDto?) public static bool operator !=(UserDto? left, UserDto? right) Parameters left UserDto right UserDto Returns bool" }, + "api/core/EchoHub.Core.DTOs.UserError.html": { + "href": "api/core/EchoHub.Core.DTOs.UserError.html", + "title": "Enum UserError | EchoHub Documentation", + "summary": "Enum UserError Namespace EchoHub.Core.DTOs Assembly EchoHub.Core.dll public enum UserError Fields AlreadyExists = 1 Banned = 4 InvalidCredentials = 3 NotFound = 2 ValidationFailed = 0" + }, + "api/core/EchoHub.Core.DTOs.UserOperationResult.html": { + "href": "api/core/EchoHub.Core.DTOs.UserOperationResult.html", + "title": "Class UserOperationResult | EchoHub Documentation", + "summary": "Class UserOperationResult Namespace EchoHub.Core.DTOs Assembly EchoHub.Core.dll public record UserOperationResult : IEquatable Inheritance object UserOperationResult Implements IEquatable Inherited Members object.GetType() object.MemberwiseClone() object.Equals(object, object) object.ReferenceEquals(object, object) Constructors UserOperationResult(UserOperationResult) protected UserOperationResult(UserOperationResult original) Parameters original UserOperationResult UserOperationResult(UserProfileDto?, UserError?, string?) public UserOperationResult(UserProfileDto? User, UserError? Error, string? ErrorMessage) Parameters User UserProfileDto Error UserError? ErrorMessage string Properties EqualityContract protected virtual Type EqualityContract { get; } Property Value Type Error public UserError? Error { get; init; } Property Value UserError? ErrorMessage public string? ErrorMessage { get; init; } Property Value string IsSuccess public bool IsSuccess { get; } Property Value bool User public UserProfileDto? User { get; init; } Property Value UserProfileDto Methods Deconstruct(out UserProfileDto?, out UserError?, out string?) public void Deconstruct(out UserProfileDto? User, out UserError? Error, out string? ErrorMessage) Parameters User UserProfileDto Error UserError? ErrorMessage string Equals(UserOperationResult?) public virtual bool Equals(UserOperationResult? other) Parameters other UserOperationResult Returns bool Equals(object?) public override bool Equals(object? obj) Parameters obj object Returns bool Fail(UserError, string) public static UserOperationResult Fail(UserError error, string message) Parameters error UserError message string Returns UserOperationResult GetHashCode() public override int GetHashCode() Returns int PrintMembers(StringBuilder) protected virtual bool PrintMembers(StringBuilder builder) Parameters builder StringBuilder Returns bool Success(UserProfileDto) public static UserOperationResult Success(UserProfileDto user) Parameters user UserProfileDto Returns UserOperationResult ToString() public override string ToString() Returns string Operators operator ==(UserOperationResult?, UserOperationResult?) public static bool operator ==(UserOperationResult? left, UserOperationResult? right) Parameters left UserOperationResult right UserOperationResult Returns bool operator !=(UserOperationResult?, UserOperationResult?) public static bool operator !=(UserOperationResult? left, UserOperationResult? right) Parameters left UserOperationResult right UserOperationResult Returns bool" + }, "api/core/EchoHub.Core.DTOs.UserPresenceDto.html": { "href": "api/core/EchoHub.Core.DTOs.UserPresenceDto.html", "title": "Class UserPresenceDto | EchoHub Documentation", @@ -462,7 +497,7 @@ "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 KickRequest LoginRequest LoginResponse MessageDto MuteRequest PaginatedResponse RefreshRequest RegisterRequest SendMessageRequest SendUrlRequest ServerStatusDto UpdateProfileRequest UpdateStatusRequest UpdateTopicRequest UserDto UserPresenceDto UserProfileDto Enums ChannelError" + "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" }, "api/core/EchoHub.Core.Models.Channel.html": { "href": "api/core/EchoHub.Core.Models.Channel.html", @@ -522,7 +557,7 @@ "api/server-irc/EchoHub.Server.Irc.IrcBroadcaster.html": { "href": "api/server-irc/EchoHub.Server.Irc.IrcBroadcaster.html", "title": "Class IrcBroadcaster | EchoHub Documentation", - "summary": "Class IrcBroadcaster Namespace EchoHub.Server.Irc Assembly EchoHub.Server.Irc.dll public class IrcBroadcaster : IChatBroadcaster Inheritance object IrcBroadcaster Implements IChatBroadcaster Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors IrcBroadcaster(IrcGatewayService, IMessageEncryptionService) public IrcBroadcaster(IrcGatewayService gateway, IMessageEncryptionService encryption) Parameters gateway IrcGatewayService encryption IMessageEncryptionService Methods ForceDisconnectUserAsync(List, string) public Task ForceDisconnectUserAsync(List connectionIds, string reason) Parameters connectionIds List reason string Returns Task SendChannelNukedAsync(string) public Task SendChannelNukedAsync(string channelName) Parameters channelName string Returns Task SendChannelUpdatedAsync(ChannelDto, string?) public Task SendChannelUpdatedAsync(ChannelDto channel, string? channelName = null) Parameters channel ChannelDto channelName string Returns Task SendErrorAsync(string, string) public Task SendErrorAsync(string connectionId, string message) Parameters connectionId string message string Returns Task SendMessageDeletedAsync(string, Guid) public Task SendMessageDeletedAsync(string channelName, Guid messageId) Parameters channelName string messageId Guid Returns Task SendMessageToChannelAsync(string, MessageDto) public Task SendMessageToChannelAsync(string channelName, MessageDto message) Parameters channelName string message MessageDto Returns Task SendUserBannedAsync(string, string?) public Task SendUserBannedAsync(string username, string? reason) Parameters username string reason string Returns Task SendUserJoinedAsync(string, string, string?) public Task SendUserJoinedAsync(string channelName, string username, string? excludeConnectionId = null) Parameters channelName string username string excludeConnectionId string Returns Task SendUserKickedAsync(string, string, string?) public Task SendUserKickedAsync(string channelName, string username, string? reason) Parameters channelName string username string reason string Returns Task SendUserLeftAsync(string, string) public Task SendUserLeftAsync(string channelName, string username) Parameters channelName string username string Returns Task SendUserStatusChangedAsync(List, UserPresenceDto) public Task SendUserStatusChangedAsync(List channelNames, UserPresenceDto presence) Parameters channelNames List presence UserPresenceDto Returns Task" + "summary": "Class IrcBroadcaster Namespace EchoHub.Server.Irc Assembly EchoHub.Server.Irc.dll public class IrcBroadcaster : IChatBroadcaster Inheritance object IrcBroadcaster Implements IChatBroadcaster Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors IrcBroadcaster(IrcGatewayService, IMessageEncryptionService) public IrcBroadcaster(IrcGatewayService gateway, IMessageEncryptionService encryption) Parameters gateway IrcGatewayService encryption IMessageEncryptionService Methods ForceDisconnectUserAsync(List, string) public Task ForceDisconnectUserAsync(List connectionIds, string reason) Parameters connectionIds List reason string Returns Task SendChannelNukedAsync(string) public Task SendChannelNukedAsync(string channelName) Parameters channelName string Returns Task SendChannelUpdatedAsync(ChannelDto, string?) public Task SendChannelUpdatedAsync(ChannelDto channel, string? channelName = null) Parameters channel ChannelDto channelName string Returns Task SendErrorAsync(string, string) public Task SendErrorAsync(string connectionId, string message) Parameters connectionId string message string Returns Task SendMessageDeletedAsync(string, Guid) public Task SendMessageDeletedAsync(string channelName, Guid messageId) Parameters channelName string messageId Guid Returns Task SendMessageToChannelAsync(string, MessageDto) public Task SendMessageToChannelAsync(string channelName, MessageDto message) Parameters channelName string message MessageDto Returns Task SendUserBannedAsync(string, string?) public Task SendUserBannedAsync(string username, string? reason) Parameters username string reason string Returns Task SendUserJoinedAsync(string, string, UserPresenceDto?, string?) public Task SendUserJoinedAsync(string channelName, string username, UserPresenceDto? presence, string? excludeConnectionId = null) Parameters channelName string username string presence UserPresenceDto excludeConnectionId string Returns Task SendUserKickedAsync(string, string, string?) public Task SendUserKickedAsync(string channelName, string username, string? reason) Parameters channelName string username string reason string Returns Task SendUserLeftAsync(string, string) public Task SendUserLeftAsync(string channelName, string username) Parameters channelName string username string Returns Task SendUserStatusChangedAsync(List, UserPresenceDto) public Task SendUserStatusChangedAsync(List channelNames, UserPresenceDto presence) Parameters channelNames List presence UserPresenceDto Returns Task" }, "api/server-irc/EchoHub.Server.Irc.IrcClientConnection.html": { "href": "api/server-irc/EchoHub.Server.Irc.IrcClientConnection.html", @@ -532,7 +567,7 @@ "api/server-irc/EchoHub.Server.Irc.IrcCommandHandler.html": { "href": "api/server-irc/EchoHub.Server.Irc.IrcCommandHandler.html", "title": "Class IrcCommandHandler | EchoHub Documentation", - "summary": "Class IrcCommandHandler Namespace EchoHub.Server.Irc Assembly EchoHub.Server.Irc.dll public sealed class IrcCommandHandler Inheritance object IrcCommandHandler Inherited Members object.GetType() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors IrcCommandHandler(IrcClientConnection, IrcOptions, IChatService, IChannelService, IMessageEncryptionService, ILogger) public IrcCommandHandler(IrcClientConnection conn, IrcOptions options, IChatService chatService, IChannelService channelService, IMessageEncryptionService encryption, ILogger logger) Parameters conn IrcClientConnection options IrcOptions chatService IChatService channelService IChannelService encryption IMessageEncryptionService logger ILogger Methods RunAsync(CancellationToken) public Task RunAsync(CancellationToken ct) Parameters ct CancellationToken Returns Task" + "summary": "Class IrcCommandHandler Namespace EchoHub.Server.Irc Assembly EchoHub.Server.Irc.dll public sealed class IrcCommandHandler Inheritance object IrcCommandHandler Inherited Members object.GetType() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors IrcCommandHandler(IrcClientConnection, IrcOptions, IChatService, IUserService, IChannelService, IMessageEncryptionService, ILogger) public IrcCommandHandler(IrcClientConnection conn, IrcOptions options, IChatService chatService, IUserService userService, IChannelService channelService, IMessageEncryptionService encryption, ILogger logger) Parameters conn IrcClientConnection options IrcOptions chatService IChatService userService IUserService channelService IChannelService encryption IMessageEncryptionService logger ILogger Methods RunAsync(CancellationToken) public Task RunAsync(CancellationToken ct) Parameters ct CancellationToken Returns Task" }, "api/server-irc/EchoHub.Server.Irc.IrcGatewayService.html": { "href": "api/server-irc/EchoHub.Server.Irc.IrcGatewayService.html", @@ -572,7 +607,7 @@ "api/server/EchoHub.Server.Auth.JwtTokenService.html": { "href": "api/server/EchoHub.Server.Auth.JwtTokenService.html", "title": "Class JwtTokenService | EchoHub Documentation", - "summary": "Class JwtTokenService Namespace EchoHub.Server.Auth Assembly EchoHub.Server.dll public class JwtTokenService Inheritance object JwtTokenService Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors JwtTokenService(IConfiguration) public JwtTokenService(IConfiguration configuration) Parameters configuration IConfiguration Fields RefreshTokenLifetime public static readonly TimeSpan RefreshTokenLifetime Field Value TimeSpan Methods GenerateAccessToken(User) public (string Token, DateTimeOffset ExpiresAt) GenerateAccessToken(User user) Parameters user User Returns (string Token, DateTimeOffset ExpiresAt) GenerateRefreshToken() public static string GenerateRefreshToken() Returns string HashToken(string) public static string HashToken(string token) Parameters token string Returns string" + "summary": "Class JwtTokenService Namespace EchoHub.Server.Auth Assembly EchoHub.Server.dll public class JwtTokenService Inheritance object JwtTokenService Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors JwtTokenService(IConfiguration) public JwtTokenService(IConfiguration configuration) Parameters configuration IConfiguration Fields RefreshTokenLifetime public static readonly TimeSpan RefreshTokenLifetime Field Value TimeSpan Methods GenerateAccessToken(UserProfileDto) public (string Token, DateTimeOffset ExpiresAt) GenerateAccessToken(UserProfileDto profile) Parameters profile UserProfileDto Returns (string Token, DateTimeOffset ExpiresAt) GenerateAccessToken(User) public (string Token, DateTimeOffset ExpiresAt) GenerateAccessToken(User user) Parameters user User Returns (string Token, DateTimeOffset ExpiresAt) GenerateRefreshToken() public static string GenerateRefreshToken() Returns string HashToken(string) public static string HashToken(string token) Parameters token string Returns string" }, "api/server/EchoHub.Server.Auth.html": { "href": "api/server/EchoHub.Server.Auth.html", @@ -582,7 +617,7 @@ "api/server/EchoHub.Server.Controllers.AuthController.html": { "href": "api/server/EchoHub.Server.Controllers.AuthController.html", "title": "Class AuthController | EchoHub Documentation", - "summary": "Class AuthController Namespace EchoHub.Server.Controllers Assembly EchoHub.Server.dll [ApiController] [Route(\"api/auth\")] [EnableRateLimiting(\"auth\")] public class AuthController : ControllerBase Inheritance object ControllerBase AuthController Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors AuthController(EchoHubDbContext, JwtTokenService) public AuthController(EchoHubDbContext db, JwtTokenService jwt) Parameters db EchoHubDbContext jwt JwtTokenService Methods Login(LoginRequest) [HttpPost(\"login\")] public Task Login(LoginRequest request) Parameters request LoginRequest Returns Task Logout(RefreshRequest) [HttpPost(\"logout\")] public Task Logout(RefreshRequest request) Parameters request RefreshRequest Returns Task Refresh(RefreshRequest) [HttpPost(\"refresh\")] public Task Refresh(RefreshRequest request) Parameters request RefreshRequest Returns Task Register(RegisterRequest) [HttpPost(\"register\")] public Task Register(RegisterRequest request) Parameters request RegisterRequest Returns Task" + "summary": "Class AuthController Namespace EchoHub.Server.Controllers Assembly EchoHub.Server.dll [ApiController] [Route(\"api/auth\")] [EnableRateLimiting(\"auth\")] public class AuthController : ControllerBase Inheritance object ControllerBase AuthController Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors AuthController(EchoHubDbContext, JwtTokenService, IUserService) public AuthController(EchoHubDbContext db, JwtTokenService jwt, IUserService userService) Parameters db EchoHubDbContext jwt JwtTokenService userService IUserService Methods Login(LoginRequest) [HttpPost(\"login\")] public Task Login(LoginRequest request) Parameters request LoginRequest Returns Task Logout(RefreshRequest) [HttpPost(\"logout\")] public Task Logout(RefreshRequest request) Parameters request RefreshRequest Returns Task Refresh(RefreshRequest) [HttpPost(\"refresh\")] public Task Refresh(RefreshRequest request) Parameters request RefreshRequest Returns Task Register(RegisterRequest) [HttpPost(\"register\")] public Task Register(RegisterRequest request) Parameters request RegisterRequest Returns Task" }, "api/server/EchoHub.Server.Controllers.ChannelsController.html": { "href": "api/server/EchoHub.Server.Controllers.ChannelsController.html", @@ -607,7 +642,7 @@ "api/server/EchoHub.Server.Controllers.UsersController.html": { "href": "api/server/EchoHub.Server.Controllers.UsersController.html", "title": "Class UsersController | EchoHub Documentation", - "summary": "Class UsersController Namespace EchoHub.Server.Controllers Assembly EchoHub.Server.dll [ApiController] [Route(\"api/users\")] [Authorize] [EnableRateLimiting(\"general\")] public class UsersController : ControllerBase Inheritance object ControllerBase UsersController Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors UsersController(EchoHubDbContext, ImageToAsciiService) public UsersController(EchoHubDbContext db, ImageToAsciiService asciiService) Parameters db EchoHubDbContext asciiService ImageToAsciiService Methods GetProfile(string) [HttpGet(\"{username}/profile\")] public Task GetProfile(string username) Parameters username string Returns Task UpdateProfile(UpdateProfileRequest) [HttpPut(\"profile\")] public Task UpdateProfile(UpdateProfileRequest request) Parameters request UpdateProfileRequest Returns Task UploadAvatar() [HttpPost(\"avatar\")] [EnableRateLimiting(\"upload\")] public Task UploadAvatar() Returns Task" + "summary": "Class UsersController Namespace EchoHub.Server.Controllers Assembly EchoHub.Server.dll [ApiController] [Route(\"api/users\")] [Authorize] [EnableRateLimiting(\"general\")] public class UsersController : ControllerBase Inheritance object ControllerBase UsersController Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors UsersController(IUserService, ImageToAsciiService) public UsersController(IUserService userService, ImageToAsciiService asciiService) Parameters userService IUserService asciiService ImageToAsciiService Methods GetProfile(string) [HttpGet(\"{username}/profile\")] public Task GetProfile(string username) Parameters username string Returns Task UpdateProfile(UpdateProfileRequest) [HttpPut(\"profile\")] public Task UpdateProfile(UpdateProfileRequest request) Parameters request UpdateProfileRequest Returns Task UploadAvatar() [HttpPost(\"avatar\")] [EnableRateLimiting(\"upload\")] public Task UploadAvatar() Returns Task" }, "api/server/EchoHub.Server.Controllers.html": { "href": "api/server/EchoHub.Server.Controllers.html", @@ -667,7 +702,7 @@ "api/server/EchoHub.Server.Hubs.ChatHub.html": { "href": "api/server/EchoHub.Server.Hubs.ChatHub.html", "title": "Class ChatHub | EchoHub Documentation", - "summary": "Class ChatHub Namespace EchoHub.Server.Hubs Assembly EchoHub.Server.dll [Authorize] public class ChatHub : Hub, IDisposable Inheritance object Hub Hub ChatHub Implements IDisposable Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors ChatHub(IChatService, ILogger) public ChatHub(IChatService chatService, ILogger logger) Parameters chatService IChatService logger ILogger Methods GetChannelHistory(string, int) public Task> GetChannelHistory(string channelName, int count = 100) Parameters channelName string count int Returns Task> GetOnlineUsers(string) public Task> GetOnlineUsers(string channelName) Parameters channelName string Returns Task> JoinChannel(string) public Task> JoinChannel(string channelName) Parameters channelName string Returns Task> LeaveChannel(string) public Task LeaveChannel(string channelName) Parameters channelName string Returns Task OnConnectedAsync() public override Task OnConnectedAsync() Returns Task OnDisconnectedAsync(Exception?) public override Task OnDisconnectedAsync(Exception? exception) Parameters exception Exception Returns Task SendMessage(string, string) public Task SendMessage(string channelName, string content) Parameters channelName string content string Returns Task UpdateStatus(UserStatus, string?) public Task UpdateStatus(UserStatus status, string? statusMessage) Parameters status UserStatus statusMessage string Returns Task" + "summary": "Class ChatHub Namespace EchoHub.Server.Hubs Assembly EchoHub.Server.dll [Authorize] public class ChatHub : Hub, IDisposable Inheritance object Hub Hub ChatHub Implements IDisposable Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors ChatHub(IChatService, ILogger) public ChatHub(IChatService chatService, ILogger logger) Parameters chatService IChatService logger ILogger Methods GetChannelHistory(string, int) public Task> GetChannelHistory(string channelName, int count = 100) Parameters channelName string count int Returns Task> GetOnlineUsers(string) public Task> GetOnlineUsers(string channelName) Parameters channelName string Returns Task> JoinChannel(string) public Task JoinChannel(string channelName) Parameters channelName string Returns Task LeaveChannel(string) public Task LeaveChannel(string channelName) Parameters channelName string Returns Task OnConnectedAsync() public override Task OnConnectedAsync() Returns Task OnDisconnectedAsync(Exception?) public override Task OnDisconnectedAsync(Exception? exception) Parameters exception Exception Returns Task SendMessage(string, string) public Task SendMessage(string channelName, string content) Parameters channelName string content string Returns Task UpdateStatus(UserStatus, string?) public Task UpdateStatus(UserStatus status, string? statusMessage) Parameters status UserStatus statusMessage string Returns Task" }, "api/server/EchoHub.Server.Hubs.html": { "href": "api/server/EchoHub.Server.Hubs.html", @@ -682,7 +717,7 @@ "api/server/EchoHub.Server.Services.ChatService.html": { "href": "api/server/EchoHub.Server.Services.ChatService.html", "title": "Class ChatService | EchoHub Documentation", - "summary": "Class ChatService Namespace EchoHub.Server.Services Assembly EchoHub.Server.dll public class ChatService : IChatService Inheritance object ChatService Implements IChatService Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors ChatService(IServiceScopeFactory, PresenceTracker, IEnumerable, LinkEmbedService, IMessageEncryptionService, IChannelService, ILogger) public ChatService(IServiceScopeFactory scopeFactory, PresenceTracker presenceTracker, IEnumerable broadcasters, LinkEmbedService embedService, IMessageEncryptionService encryption, IChannelService channelService, ILogger logger) Parameters scopeFactory IServiceScopeFactory presenceTracker PresenceTracker broadcasters IEnumerable embedService LinkEmbedService encryption IMessageEncryptionService channelService IChannelService logger ILogger Methods AuthenticateUserAsync(string, string) public Task<(Guid UserId, string Username)?> AuthenticateUserAsync(string username, string password) Parameters username string password string Returns Task<(Guid UserId, string Username)?> BroadcastChannelUpdatedAsync(ChannelDto, string?) public Task BroadcastChannelUpdatedAsync(ChannelDto channel, string? channelName = null) Parameters channel ChannelDto channelName string Returns Task BroadcastMessageAsync(string, MessageDto) public Task BroadcastMessageAsync(string channelName, MessageDto message) Parameters channelName string message MessageDto Returns Task GetChannelHistoryAsync(string, int) public Task> GetChannelHistoryAsync(string channelName, int count) Parameters channelName string count int Returns Task> GetChannelsForUserAsync(string) public Task> GetChannelsForUserAsync(string username) Parameters username string Returns Task> GetOnlineUsersAsync(string) public Task> GetOnlineUsersAsync(string channelName) Parameters channelName string Returns Task> GetUserProfileAsync(string) public Task GetUserProfileAsync(string username) Parameters username string Returns Task JoinChannelAsync(string, Guid, string, string) public Task<(List History, string? Error)> JoinChannelAsync(string connectionId, Guid userId, string username, string channelName) Parameters connectionId string userId Guid username string channelName string Returns Task<(List History, string Error)> LeaveChannelAsync(string, string, string) public Task LeaveChannelAsync(string connectionId, string username, string channelName) Parameters connectionId string username string channelName string Returns Task SendMessageAsync(Guid, string, string, string) public Task SendMessageAsync(Guid userId, string username, string channelName, string content) Parameters userId Guid username string channelName string content string Returns Task UpdateStatusAsync(Guid, string, UserStatus, string?) public Task UpdateStatusAsync(Guid userId, string username, UserStatus status, string? statusMessage) Parameters userId Guid username string status UserStatus statusMessage string Returns Task UserConnectedAsync(string, Guid, string) public Task UserConnectedAsync(string connectionId, Guid userId, string username) Parameters connectionId string userId Guid username string Returns Task UserDisconnectedAsync(string) public Task UserDisconnectedAsync(string connectionId) Parameters connectionId string Returns Task" + "summary": "Class ChatService Namespace EchoHub.Server.Services Assembly EchoHub.Server.dll public class ChatService : IChatService Inheritance object ChatService Implements IChatService Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors ChatService(IServiceScopeFactory, PresenceTracker, IEnumerable, LinkEmbedService, IMessageEncryptionService, IChannelService, ILogger) public ChatService(IServiceScopeFactory scopeFactory, PresenceTracker presenceTracker, IEnumerable broadcasters, LinkEmbedService embedService, IMessageEncryptionService encryption, IChannelService channelService, ILogger logger) Parameters scopeFactory IServiceScopeFactory presenceTracker PresenceTracker broadcasters IEnumerable embedService LinkEmbedService encryption IMessageEncryptionService channelService IChannelService logger ILogger Methods BroadcastChannelUpdatedAsync(ChannelDto, string?) public Task BroadcastChannelUpdatedAsync(ChannelDto channel, string? channelName = null) Parameters channel ChannelDto channelName string Returns Task BroadcastMessageAsync(string, MessageDto) public Task BroadcastMessageAsync(string channelName, MessageDto message) Parameters channelName string message MessageDto Returns Task GetChannelHistoryAsync(string, int) public Task> GetChannelHistoryAsync(string channelName, int count) Parameters channelName string count int Returns Task> GetChannelsForUserAsync(string) public Task> GetChannelsForUserAsync(string username) Parameters username string Returns Task> GetOnlineUsersAsync(string) public Task> GetOnlineUsersAsync(string channelName) Parameters channelName string Returns Task> JoinChannelAsync(string, Guid, string, string) public Task<(List History, string? Error)> JoinChannelAsync(string connectionId, Guid userId, string username, string channelName) Parameters connectionId string userId Guid username string channelName string Returns Task<(List History, string Error)> LeaveChannelAsync(string, string, string) public Task LeaveChannelAsync(string connectionId, string username, string channelName) Parameters connectionId string username string channelName string Returns Task SendMessageAsync(Guid, string, string, string) public Task SendMessageAsync(Guid userId, string username, string channelName, string content) Parameters userId Guid username string channelName string content string Returns Task UpdateStatusAsync(Guid, string, UserStatus, string?) public Task UpdateStatusAsync(Guid userId, string username, UserStatus status, string? statusMessage) Parameters userId Guid username string status UserStatus statusMessage string Returns Task UserConnectedAsync(string, Guid, string) public Task UserConnectedAsync(string connectionId, Guid userId, string username) Parameters connectionId string userId Guid username string Returns Task UserDisconnectedAsync(string) public Task UserDisconnectedAsync(string connectionId) Parameters connectionId string Returns Task" }, "api/server/EchoHub.Server.Services.FileCleanupService.html": { "href": "api/server/EchoHub.Server.Services.FileCleanupService.html", @@ -714,6 +749,11 @@ "title": "Class MessageEncryptionService | EchoHub Documentation", "summary": "Class MessageEncryptionService Namespace EchoHub.Server.Services Assembly EchoHub.Server.dll public class MessageEncryptionService : IMessageEncryptionService Inheritance object MessageEncryptionService Implements IMessageEncryptionService Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors MessageEncryptionService(IConfiguration, ILogger) public MessageEncryptionService(IConfiguration configuration, ILogger logger) Parameters configuration IConfiguration logger ILogger Properties EncryptDatabaseEnabled Whether database content should be encrypted at rest (server setting). public bool EncryptDatabaseEnabled { 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" }, + "api/server/EchoHub.Server.Services.MuteExpirationService.html": { + "href": "api/server/EchoHub.Server.Services.MuteExpirationService.html", + "title": "Class MuteExpirationService | EchoHub Documentation", + "summary": "Class MuteExpirationService Namespace EchoHub.Server.Services Assembly EchoHub.Server.dll Background service that periodically unmutes users whose timed mute has expired. public sealed class MuteExpirationService : BackgroundService, IDisposable Inheritance object BackgroundService MuteExpirationService Implements IDisposable Inherited Members object.GetType() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors MuteExpirationService(IServiceScopeFactory, ILogger) public MuteExpirationService(IServiceScopeFactory scopeFactory, ILogger logger) Parameters scopeFactory IServiceScopeFactory logger ILogger Methods ExecuteAsync(CancellationToken) protected override Task ExecuteAsync(CancellationToken stoppingToken) Parameters stoppingToken CancellationToken Returns Task" + }, "api/server/EchoHub.Server.Services.PresenceTracker.html": { "href": "api/server/EchoHub.Server.Services.PresenceTracker.html", "title": "Class PresenceTracker | EchoHub Documentation", @@ -727,12 +767,17 @@ "api/server/EchoHub.Server.Services.SignalRBroadcaster.html": { "href": "api/server/EchoHub.Server.Services.SignalRBroadcaster.html", "title": "Class SignalRBroadcaster | EchoHub Documentation", - "summary": "Class SignalRBroadcaster Namespace EchoHub.Server.Services Assembly EchoHub.Server.dll public class SignalRBroadcaster : IChatBroadcaster Inheritance object SignalRBroadcaster Implements IChatBroadcaster Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors SignalRBroadcaster(IServiceProvider, PresenceTracker) public SignalRBroadcaster(IServiceProvider serviceProvider, PresenceTracker presenceTracker) Parameters serviceProvider IServiceProvider presenceTracker PresenceTracker Methods ForceDisconnectUserAsync(List, string) public Task ForceDisconnectUserAsync(List connectionIds, string reason) Parameters connectionIds List reason string Returns Task SendChannelNukedAsync(string) public Task SendChannelNukedAsync(string channelName) Parameters channelName string Returns Task SendChannelUpdatedAsync(ChannelDto, string?) public Task SendChannelUpdatedAsync(ChannelDto channel, string? channelName = null) Parameters channel ChannelDto channelName string Returns Task SendErrorAsync(string, string) public Task SendErrorAsync(string connectionId, string message) Parameters connectionId string message string Returns Task SendMessageDeletedAsync(string, Guid) public Task SendMessageDeletedAsync(string channelName, Guid messageId) Parameters channelName string messageId Guid Returns Task SendMessageToChannelAsync(string, MessageDto) public Task SendMessageToChannelAsync(string channelName, MessageDto message) Parameters channelName string message MessageDto Returns Task SendUserBannedAsync(string, string?) public Task SendUserBannedAsync(string username, string? reason) Parameters username string reason string Returns Task SendUserJoinedAsync(string, string, string?) public Task SendUserJoinedAsync(string channelName, string username, string? excludeConnectionId = null) Parameters channelName string username string excludeConnectionId string Returns Task SendUserKickedAsync(string, string, string?) public Task SendUserKickedAsync(string channelName, string username, string? reason) Parameters channelName string username string reason string Returns Task SendUserLeftAsync(string, string) public Task SendUserLeftAsync(string channelName, string username) Parameters channelName string username string Returns Task SendUserStatusChangedAsync(List, UserPresenceDto) public Task SendUserStatusChangedAsync(List channelNames, UserPresenceDto presence) Parameters channelNames List presence UserPresenceDto Returns Task" + "summary": "Class SignalRBroadcaster Namespace EchoHub.Server.Services Assembly EchoHub.Server.dll public class SignalRBroadcaster : IChatBroadcaster Inheritance object SignalRBroadcaster Implements IChatBroadcaster Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors SignalRBroadcaster(IServiceProvider, PresenceTracker) public SignalRBroadcaster(IServiceProvider serviceProvider, PresenceTracker presenceTracker) Parameters serviceProvider IServiceProvider presenceTracker PresenceTracker Methods ForceDisconnectUserAsync(List, string) public Task ForceDisconnectUserAsync(List connectionIds, string reason) Parameters connectionIds List reason string Returns Task SendChannelNukedAsync(string) public Task SendChannelNukedAsync(string channelName) Parameters channelName string Returns Task SendChannelUpdatedAsync(ChannelDto, string?) public Task SendChannelUpdatedAsync(ChannelDto channel, string? channelName = null) Parameters channel ChannelDto channelName string Returns Task SendErrorAsync(string, string) public Task SendErrorAsync(string connectionId, string message) Parameters connectionId string message string Returns Task SendMessageDeletedAsync(string, Guid) public Task SendMessageDeletedAsync(string channelName, Guid messageId) Parameters channelName string messageId Guid Returns Task SendMessageToChannelAsync(string, MessageDto) public Task SendMessageToChannelAsync(string channelName, MessageDto message) Parameters channelName string message MessageDto Returns Task SendUserBannedAsync(string, string?) public Task SendUserBannedAsync(string username, string? reason) Parameters username string reason string Returns Task SendUserJoinedAsync(string, string, UserPresenceDto?, string?) public Task SendUserJoinedAsync(string channelName, string username, UserPresenceDto? presence, string? excludeConnectionId = null) Parameters channelName string username string presence UserPresenceDto excludeConnectionId string Returns Task SendUserKickedAsync(string, string, string?) public Task SendUserKickedAsync(string channelName, string username, string? reason) Parameters channelName string username string reason string Returns Task SendUserLeftAsync(string, string) public Task SendUserLeftAsync(string channelName, string username) Parameters channelName string username string Returns Task SendUserStatusChangedAsync(List, UserPresenceDto) public Task SendUserStatusChangedAsync(List channelNames, UserPresenceDto presence) Parameters channelNames List presence UserPresenceDto Returns Task" + }, + "api/server/EchoHub.Server.Services.UserService.html": { + "href": "api/server/EchoHub.Server.Services.UserService.html", + "title": "Class UserService | EchoHub Documentation", + "summary": "Class UserService Namespace EchoHub.Server.Services Assembly EchoHub.Server.dll public class UserService : IUserService Inheritance object UserService Implements IUserService Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors UserService(IServiceScopeFactory) public UserService(IServiceScopeFactory scopeFactory) Parameters scopeFactory IServiceScopeFactory Methods AuthenticateUserAsync(string, string) public Task AuthenticateUserAsync(string username, string password) Parameters username string password string Returns Task GetUserByIdAsync(Guid) public Task GetUserByIdAsync(Guid userId) Parameters userId Guid Returns Task GetUserProfileAsync(string) public Task GetUserProfileAsync(string username) Parameters username string Returns Task RegisterUserAsync(string, string, string?) public Task RegisterUserAsync(string username, string password, string? displayName = null) Parameters username string password string displayName string Returns Task SetAvatarAsync(Guid, string) public Task SetAvatarAsync(Guid userId, string asciiArt) Parameters userId Guid asciiArt string Returns Task UpdateProfileAsync(Guid, string?, string?, string?) public Task UpdateProfileAsync(Guid userId, string? displayName, string? bio, string? nicknameColor) Parameters userId Guid displayName string bio string nicknameColor string Returns Task" }, "api/server/EchoHub.Server.Services.html": { "href": "api/server/EchoHub.Server.Services.html", "title": "Namespace EchoHub.Server.Services | EchoHub Documentation", - "summary": "Namespace EchoHub.Server.Services Classes ChannelService ChatService FileCleanupService FileStorageService FileValidationHelper ImageToAsciiService LinkEmbedService MessageEncryptionService PresenceTracker ServerDirectoryService SignalRBroadcaster" + "summary": "Namespace EchoHub.Server.Services Classes ChannelService ChatService FileCleanupService FileStorageService FileValidationHelper ImageToAsciiService LinkEmbedService MessageEncryptionService MuteExpirationService Background service that periodically unmutes users whose timed mute has expired. PresenceTracker ServerDirectoryService SignalRBroadcaster UserService" }, "api/server/EchoHub.Server.Setup.DataMigrationService.html": { "href": "api/server/EchoHub.Server.Setup.DataMigrationService.html", @@ -759,6 +804,11 @@ "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." }, + "articles/docker.html": { + "href": "articles/docker.html", + "title": "Docker | EchoHub Documentation", + "summary": "Docker Quick Start cp .env.example .env # create your config docker compose up -d # start the server On first run the server automatically generates JWT and encryption keys, creates the database, and seeds a #general channel. Connect with the EchoHub client to http://localhost:5000. Using a Pre-built Image Instead of building locally, you can pull from GHCR. In docker-compose.yml, replace the build block: services: echohub-server: image: ghcr.io/huebyte/echohub-server:latest # build: # context: ./src # dockerfile: EchoHub.Server/Dockerfile Configuration All settings are configured through the .env file. These are ASP.NET Core environment variables that override appsettings.json. Variable Default Description Server__Name My EchoHub Server Display name for your server Server__Description A self-hosted EchoHub chat server Server description Server__PublicServer false List on the public directory Server__PublicHost (empty) Public address for the directory listing Server__Admins__0 (empty) Admin username (use __1, __2 for more) Jwt__Secret (auto-generated) JWT signing key. Auto-generated on first run Encryption__Key (auto-generated) AES encryption key. Auto-generated on first run Encryption__EncryptDatabase false Encrypt message content in the database Storage__CleanupIntervalHours 1 How often to clean expired uploads Storage__RetentionDays 30 Days to keep uploaded files Irc__Enabled false Enable the IRC gateway Irc__Port 6667 IRC plain-text port Irc__TlsEnabled false Enable IRC over TLS Irc__TlsPort 6697 IRC TLS port Irc__ServerName echohub IRC server name shown to clients Irc__Motd Welcome to EchoHub IRC Gateway! Message of the day Serilog__MinimumLevel__Default Information Log level (Debug, Warning, etc.) Persistent Data All server state lives in a single Docker volume mounted at /app/data: /app/data/ ├── appsettings.json # generated config with JWT/encryption keys ├── echohub.db # SQLite database ├── uploads/ # uploaded files and avatars └── logs/ # rolling log files (14-day retention) Backup # stop the server to ensure a consistent snapshot docker compose stop # copy the data volume to a local directory docker cp echohub-server:/app/data ./backup docker compose start IRC Gateway To enable IRC, set these in your .env: Irc__Enabled=true Then uncomment the port in docker-compose.yml: ports: - \"5000:5000\" - \"6697:6697\" # IRC (TLS encrypted, preferred) For TLS, also set: Irc__TlsEnabled=true Irc__TlsCertPath=/app/data/cert.pfx Irc__TlsCertPassword=your_password Mount your certificate into the data volume or bind-mount it directly. IRC users must have an existing EchoHub account. See Getting Started for client connection examples. Updating # if using pre-built images docker compose pull docker compose up -d # if building locally docker compose build docker compose up -d Data persists across updates since it lives in the named volume. Troubleshooting Port already in use -- Another process is using port 5000. Change the host port in docker-compose.yml: ports: - \"8080:5000\" # access via http://localhost:8080 Permission denied on volume -- The container runs as a non-root echohub user (UID 999). If using bind mounts instead of named volumes, ensure the directory is writable. View logs -- Check the container output: docker compose logs -f echohub-server File-based logs are also available inside the volume at /app/data/logs/." + }, "articles/encryption.html": { "href": "articles/encryption.html", "title": "Message Encryption | EchoHub Documentation", @@ -767,7 +817,7 @@ "articles/getting-started.html": { "href": "articles/getting-started.html", "title": "Getting Started | EchoHub Documentation", - "summary": "Getting Started Prerequisites .NET 10 SDK Or grab a self-contained binary from Releases -- no runtime needed. Run the Server dotnet run --project src/EchoHub.Server On first run, the server automatically: Creates appsettings.json from the example config Generates a secure JWT secret Creates the SQLite database with a #general channel Run the Client dotnet run --project src/EchoHub.Client Connect to a server, register an account, and start chatting. Connect via IRC Enable the IRC gateway in the server's appsettings.json: { \"Irc\": { \"Enabled\": true, \"Port\": 6667 } } Then connect with any standard IRC client: irssi -c localhost -p 6667 -w -n IRC users must have an existing EchoHub account. Authentication works via PASS/NICK/USER or SASL PLAIN. Messages flow bidirectionally between IRC and TUI clients. For TLS, set TlsEnabled: true, TlsPort: 6697, and provide a PKCS#12 certificate path. See the Architecture page for details on how the IRC gateway integrates with the chat service. Configuration Server configuration is in appsettings.json (auto-generated on first run). See the example config for all available options. To list your server on the public directory, set Server:PublicServer to true and Server:PublicHost to your server's public address. Build from Source dotnet build src/EchoHub.slnx" + "summary": "Getting Started Install the Client Windows (Chocolatey) choco install echohub Linux / macOS curl -sSfL https://raw.githubusercontent.com/HueByte/EchoHub/master/scripts/install.sh | sh To install a specific version or to a custom directory: curl -sSfL .../install.sh | sh -s -- --version 0.2.8 curl -sSfL .../install.sh | sh -s -- --install-dir /opt/echohub Manual Download Grab a self-contained binary from Releases -- no runtime needed. Host a Server Docker The quickest way to host a server: cp .env.example .env docker compose up -d See the Docker guide for configuration, pre-built images, and more. From Source dotnet run --project src/EchoHub.Server Requires .NET 10 SDK. On first run, the server automatically: Creates appsettings.json from the example config Generates a secure JWT secret Creates the SQLite database with a #general channel Usage After installing the client, run echohub (or dotnet run --project src/EchoHub.Client from source). Connect to a server, register an account, and start chatting. Connect via IRC Enable the IRC gateway in the server's appsettings.json: { \"Irc\": { \"Enabled\": true, \"Port\": 6667 } } Then connect with any standard IRC client: irssi -c localhost -p 6667 -w -n IRC users must have an existing EchoHub account. Authentication works via PASS/NICK/USER or SASL PLAIN. Messages flow bidirectionally between IRC and TUI clients. For TLS, set TlsEnabled: true, TlsPort: 6697, and provide a PKCS#12 certificate path. See the Architecture page for details on how the IRC gateway integrates with the chat service. Configuration Server configuration is in appsettings.json (auto-generated on first run). See the example config for all available options. To list your server on the public directory, set Server:PublicServer to true and Server:PublicHost to your server's public address. Build from Source dotnet build src/EchoHub.slnx" }, "articles/notification-sounds.html": { "href": "articles/notification-sounds.html", @@ -777,7 +827,7 @@ "changelog/index.html": { "href": "changelog/index.html", "title": "Changelog | EchoHub Documentation", - "summary": "Changelog Release history for EchoHub. Releases 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.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", @@ -829,9 +879,54 @@ "title": "v0.2.7 | EchoHub Documentation", "summary": "v0.2.7 Bug Fixes Fix user list empty on initial connect — FetchAndUpdateOnlineUsers was called before InvokeUI set the current channel, causing an early return Infrastructure Switch Terminal.Gui from local fork submodule back to NuGet package (2.0.0-develop.5039) — transparent color PR merged upstream Remove Terminal.Gui submodule, .gitmodules, and root nuget.config workaround Remove rm -f submodule nuget.config steps and submodules: recursive from all 3 CI workflows (ci, docs, release) Remove --exclude src/Terminal.Gui/ from format check" }, + "changelog/v0.2.8.html": { + "href": "changelog/v0.2.8.html", + "title": "v0.2.8 | EchoHub Documentation", + "summary": "v0.2.8 Bug Fixes Fix memory leak — HttpResponseMessage objects never disposed in ApiClient, leaking TCP connections and content buffers on every API call (especially on failed connection attempts) Fix 401 retry leak — AuthenticatedGetAsync/AuthenticatedRequestAsync leaked the original response when retrying after token refresh Fix connection failure cleanup — ConnectionManager.ConnectAsync now properly disposes ApiClient and EchoHubConnection on any failure path (previously only cleaned up on saved-token auth failures) Fix IRC gateway sending UTF-8 BOM on first message, breaking CAP negotiation and SASL auth for all clients Handle AUTHENTICATE * (SASL abort) instead of crashing on invalid base64 Fix userlist not refreshing when creating a new channel — now fetches online users after channel creation Fix unmute timer not working — add MuteExpirationService background job that proactively unmutes users when their timed mute expires (previously only checked on message send) Fix missing space between mod/admin role icon and username in the userlist Fix invisible users still visible in the userlist — GetOnlineUsersAsync now filters invisible users; server skips UserJoined broadcast for invisible users Fix invisible→online transition — user reappears in cached userlist when switching from invisible back to a visible status Fix thread safety — _channelUsers presence cache now protected by Lock to prevent races between SignalR events and background fetches Fix @mention regex matching email addresses and #channel regex matching hex colors / issue numbers — both now use lookbehind and letter-requirement guards Fix ParseThemeColor accepting non-hex characters — now validates [0-9a-fA-F] digits Fix ghost channel when trying to join a channel that doesn't exist New Features Add Docker support for EchoHub.Server — docker compose up -d for easy self-hosting with persistent volume for database, uploads, and logs IRC account creation — connecting with a new username auto-registers the account (PASS and SASL PLAIN) Auto-updater rollback — pre-update backup created automatically before each update; restore via File > Rollback menu or --rollback CLI flag Update failure recovery — if an update fails mid-extraction, offers to restore from the backup immediately Defensive Unix permission check — verify execute permission on startup after auto-update (defense-in-depth) Clickable usernames — press Enter on a username in the userlist or message sender to view their profile Clickable @mentions — press Enter on a message containing @username to open that user's profile Clickable #channels — press Enter on a message containing #channel to join/switch to that channel; #channel references are now highlighted in chat Embed theme colors — embed vertical border line now uses the source site's theme-color meta tag when available Stateful userlist — user presence is cached per channel and updated incrementally via SignalR events instead of re-fetching the full list on every join/leave/status change Security Restrict file auto-open — only safe file types (video, PDF, text) are opened with the system default app; all other files are downloaded to temp without executing (prevents script execution via .bat, .exe, etc.) Refactoring Extract IUserService/UserService — consolidate user registration, authentication, and profile management into a dedicated service, eliminating duplicated logic between AuthController and ChatService IRC gateway now checks ban status during authentication (previously skipped) EchoHubSpace directory updates — server now only sends user count when it actually changes instead of every 30 seconds ChatHub.JoinChannel now returns JoinChannelResult instead of List to allow for better error handling Distribution Add Chocolatey package — choco install echohub for Windows users, auto-published from CI on each release Add Linux/macOS install script — curl -sSfL .../install.sh | sh with automatic OS/arch detection Documentation Add Flows section — Mermaid sequence diagrams documenting all major request/event flows (auth, connection, messaging, channels, moderation, file upload, link embeds, server directory) with inline code references CI Add Docker workflow — builds and pushes multi-arch (amd64/arm64) server image to GHCR on release Add linux-arm64 builds to release pipeline — server and client binaries for ARM Linux (Raspberry Pi, cloud ARM instances) Automate Chocolatey package publishing in release workflow (checksum calculation, pack, push)" + }, + "flows/authentication.html": { + "href": "flows/authentication.html", + "title": "Authentication | EchoHub Documentation", + "summary": "Authentication User Registration A new user creates an account on a server. The client sends credentials via REST, the server hashes the password, issues JWT tokens, and the client stores the refresh token for \"Remember Me\" sessions. sequenceDiagram participant UI as ConnectDialog participant AO as AppOrchestrator participant CM as ConnectionManager participant API as ApiClient participant Auth as AuthController participant US as UserService participant JWT as JwtTokenService participant DB as SQLite UI->>AO: ConnectDialogResult(IsRegister: true) AO->>CM: ConnectAsync(dialogResult) CM->>API: RegisterAsync(username, password) API->>Auth: POST /api/auth/register Auth->>US: RegisterUserAsync(username, password, displayName) US->>US: Validate (regex, length, uniqueness) US->>DB: INSERT User (BCrypt hash) US-->>Auth: UserOperationResult.Success Auth->>JWT: GenerateAccessToken(user) JWT-->>Auth: (token, expiresAt) [15 min] Auth->>JWT: GenerateRefreshToken() JWT-->>Auth: Base64 random (64 bytes) Auth->>DB: INSERT RefreshToken (SHA256 hash) Auth-->>API: LoginResponse API->>API: SetTokens() — store in memory + set Bearer header API-->>CM: LoginResponse CM->>CM: Wire OnTokensRefreshed for config persistence CM->>CM: Continue to connection setup (see Connection Flow) Code references: Step File Location Dialog UI src/EchoHub.Client/UI/Dialogs/ConnectDialog.cs Lines 251-268 (register handler) Orchestrator entry src/EchoHub.Client/AppOrchestrator.cs Lines 550-592 (HandleConnect) ConnectionManager auth src/EchoHub.Client/Services/ConnectionManager.cs Lines 74-76 (register branch) ApiClient register src/EchoHub.Client/Services/ApiClient.cs Lines 32-43 (RegisterAsync) AuthController register src/EchoHub.Server/Controllers/AuthController.cs Lines 28-49 UserService register src/EchoHub.Server/Services/UserService.cs Lines 20-59 (RegisterUserAsync) JWT generation src/EchoHub.Server/Auth/JwtTokenService.cs Lines 30-53 (access), 80-86 (refresh) Token persistence src/EchoHub.Client/AppOrchestrator.cs Lines 1039-1053 (SaveServerToConfig) User Login Returning user authenticates with username/password or a saved refresh token. sequenceDiagram participant UI as ConnectDialog participant CM as ConnectionManager participant API as ApiClient participant Auth as AuthController participant US as UserService participant DB as SQLite alt Saved refresh token (Remember Me) UI->>CM: ConnectDialogResult(SavedRefreshToken: \"...\") CM->>API: LoginWithRefreshTokenAsync() API->>Auth: POST /api/auth/refresh Auth->>DB: Lookup token by SHA256 hash Auth->>DB: Revoke old token, issue new pair Auth-->>API: LoginResponse (rotated tokens) else Username + Password UI->>CM: ConnectDialogResult(IsRegister: false) CM->>API: LoginAsync(username, password) API->>Auth: POST /api/auth/login Auth->>US: AuthenticateUserAsync(username, password) US->>DB: Fetch user, BCrypt.Verify(password, hash) US->>DB: Update LastSeenAt US-->>Auth: UserOperationResult.Success Auth-->>API: LoginResponse end API->>API: SetTokens() Code references: Step File Location Login button handler src/EchoHub.Client/UI/Dialogs/ConnectDialog.cs Lines 214-249 Saved token branch src/EchoHub.Client/Services/ConnectionManager.cs Lines 69-71 Password branch src/EchoHub.Client/Services/ConnectionManager.cs Lines 78-80 ApiClient login src/EchoHub.Client/Services/ApiClient.cs Lines 45-56 (LoginAsync) AuthController login src/EchoHub.Server/Controllers/AuthController.cs Lines 51-72 AuthController refresh src/EchoHub.Server/Controllers/AuthController.cs Lines 74-108 UserService authenticate src/EchoHub.Server/Services/UserService.cs Lines 61-83 Token Refresh Access tokens expire after 15 minutes. The client auto-refreshes transparently before requests and on 401 responses. Refresh tokens are rotated on each use. sequenceDiagram participant SR as SignalR / HTTP Request participant API as ApiClient participant Auth as AuthController participant DB as SQLite participant Config as config.json SR->>API: GetValidTokenAsync() or HTTP 401 API->>API: Token expires within 60s? alt Proactive refresh (SignalR token provider) API->>Auth: POST /api/auth/refresh (old refresh token) else Reactive refresh (HTTP 401 retry) API->>Auth: POST /api/auth/refresh (old refresh token) end Auth->>DB: Lookup by SHA256 hash Auth->>DB: Revoke old refresh token Auth->>DB: INSERT new RefreshToken Auth-->>API: LoginResponse (new token pair) API->>API: SetTokens() — update Bearer header API-->>API: Fire OnTokensRefreshed event API-->>Config: Persist new refresh token (if Remember Me) API->>SR: Retry original request with new token Code references: Step File Location Proactive check src/EchoHub.Client/Services/ApiClient.cs Lines 110-129 (GetValidTokenAsync) Reactive 401 retry (GET) src/EchoHub.Client/Services/ApiClient.cs Lines 338-358 (AuthenticatedGetAsync) Reactive 401 retry (POST/PUT/DELETE) src/EchoHub.Client/Services/ApiClient.cs Lines 364-384 (AuthenticatedRequestAsync) Refresh HTTP call src/EchoHub.Client/Services/ApiClient.cs Lines 58-71 (RefreshTokenAsync) SignalR token provider src/EchoHub.Client/Services/EchoHubConnection.cs Line 37 (AccessTokenProvider) Server-side rotation src/EchoHub.Server/Controllers/AuthController.cs Lines 74-108 Token persistence callback src/EchoHub.Client/Services/ConnectionManager.cs Lines 253-264" + }, + "flows/channels.html": { + "href": "flows/channels.html", + "title": "Channels | EchoHub Documentation", + "summary": "Channels Channel Creation Channels are created via the REST API. Public channels are broadcast to all connected clients. sequenceDiagram participant Client as Client (TUI/API) participant CC as ChannelsController participant ChS as ChannelService participant CS as ChatService participant DB as SQLite participant SRB as SignalRBroadcaster participant IRCB as IrcBroadcaster Client->>CC: POST /api/channels {name, topic, isPublic} CC->>ChS: CreateChannelAsync(creatorId, name, topic, isPublic) ChS->>ChS: Normalize name (lowercase, trim) ChS->>ChS: Validate format (2-100 chars, regex) ChS->>DB: Check duplicate ChS->>DB: INSERT Channel + ChannelMembership (creator auto-added) ChS-->>CC: ChannelDto alt Channel is public CC->>CS: BroadcastChannelUpdatedAsync(channel) CS->>SRB: SendChannelUpdatedAsync(channelDto) SRB->>SRB: Notify all SignalR clients CS->>IRCB: SendChannelUpdatedAsync(channelDto) end CC-->>Client: 201 Created (ChannelDto) Code references: Step File Location Controller endpoint src/EchoHub.Server/Controllers/ChannelsController.cs Lines 60-76 Channel service create src/EchoHub.Server/Services/ChannelService.cs Lines 50-90 Broadcast updated src/EchoHub.Server/Services/ChatService.cs Lines 308-309 Channel Deletion Only the channel creator (or admin) can delete a channel. The default channel is protected. sequenceDiagram participant Client as Client participant CC as ChannelsController participant ChS as ChannelService participant DB as SQLite Client->>CC: DELETE /api/channels/{channel} CC->>ChS: DeleteChannelAsync(channelName, callerId) ChS->>ChS: Reject if default channel ChS->>DB: Lookup channel ChS->>ChS: Verify caller is creator or admin ChS->>DB: DELETE Channel (cascade: messages, memberships) ChS-->>CC: Success CC-->>Client: 204 No Content Code references: Step File Location Controller endpoint src/EchoHub.Server/Controllers/ChannelsController.cs Lines 94-106 Channel service delete src/EchoHub.Server/Services/ChannelService.cs Lines 119-144 Joining a Channel Both SignalR and IRC clients join channels through ChatService. The presence tracker determines if this is a genuinely new join (vs. a second connection) and broadcasts accordingly. sequenceDiagram participant Client as Client (SignalR or IRC) participant Entry as ChatHub / IrcCommandHandler participant CS as ChatService participant ChS as ChannelService participant PT as PresenceTracker participant DB as SQLite participant SRB as SignalRBroadcaster participant IRCB as IrcBroadcaster Client->>Entry: JoinChannel / JOIN #channel Entry->>CS: JoinChannelAsync(connectionId, userId, username, channel) CS->>ChS: EnsureChannelMembershipAsync(userId, channel) ChS->>DB: INSERT ChannelMembership (if not exists) CS->>PT: JoinChannel(username, channel) PT-->>CS: isNewJoin? alt First connection in this channel CS->>DB: Fetch UserPresenceDto CS->>CS: BroadcastToAllAsync(SendUserJoinedAsync) par CS->>SRB: SendUserJoinedAsync(channel, user, excludeConn) and CS->>IRCB: SendUserJoinedAsync(channel, user) end end CS->>DB: Fetch message history CS-->>Entry: (history, error) Entry-->>Client: History messages Code references: Step File Location SignalR hub join src/EchoHub.Server/Hubs/ChatHub.cs Lines 59-81 IRC join src/EchoHub.Server.Irc/IrcCommandHandler.cs Lines 361-414 ChatService join src/EchoHub.Server/Services/ChatService.cs Lines 96-135 Presence join src/EchoHub.Server/Services/PresenceTracker.cs Lines 58-70 SignalR broadcast src/EchoHub.Server/Services/SignalRBroadcaster.cs Lines 26-32 IRC broadcast src/EchoHub.Server.Irc/IrcBroadcaster.cs Lines 34-41 Leaving a Channel sequenceDiagram participant Client as Client participant Entry as ChatHub / IrcCommandHandler participant CS as ChatService participant PT as PresenceTracker participant SRB as SignalRBroadcaster participant IRCB as IrcBroadcaster Client->>Entry: LeaveChannel / PART #channel Entry->>CS: LeaveChannelAsync(connectionId, username, channel) CS->>PT: LeaveChannel(username, channel) CS->>CS: BroadcastToAllAsync(SendUserLeftAsync) par CS->>SRB: SendUserLeftAsync(channel, username) and CS->>IRCB: SendUserLeftAsync(channel, username) end Code references: Step File Location SignalR hub leave src/EchoHub.Server/Hubs/ChatHub.cs Lines 83-96 IRC part src/EchoHub.Server.Irc/IrcCommandHandler.cs Lines 416-435 ChatService leave src/EchoHub.Server/Services/ChatService.cs Lines 137-143 Presence leave src/EchoHub.Server/Services/PresenceTracker.cs Lines 72-81" + }, + "flows/connection.html": { + "href": "flows/connection.html", + "title": "Connection | EchoHub Documentation", + "summary": "Connection SignalR Client Connection After authentication, the TUI client establishes a SignalR WebSocket, registers event handlers, joins the default channel, and loads history. sequenceDiagram participant CM as ConnectionManager participant EHC as EchoHubConnection participant Hub as ChatHub participant CS as ChatService participant PT as PresenceTracker participant DB as SQLite CM->>CM: Fetch encryption key (GET /api/server/encryption-key) CM->>EHC: new EchoHubConnection(apiClient, encryption) EHC->>EHC: Build HubConnection (URL + JWT token provider + auto-reconnect) EHC->>EHC: RegisterHandlers() — wire ReceiveMessage, UserJoined, etc. EHC->>Hub: ConnectAsync() → WebSocket handshake Hub->>CS: UserConnectedAsync(connectionId, userId, username) CS->>PT: UserConnected(connectionId, userId, username) CS->>DB: Update user: Status=Online, LastSeenAt=now CM->>CM: Fetch channel list (GET /api/channels) CM->>EHC: JoinChannelAsync(\"general\") EHC->>Hub: InvokeAsync(\"JoinChannel\", \"general\") Hub->>CS: JoinChannelAsync(connectionId, userId, username, \"general\") CS->>DB: EnsureChannelMembership CS->>PT: JoinChannel(username, \"general\") CS->>CS: BroadcastToAllAsync → UserJoined CS->>DB: Fetch message history Hub-->>EHC: List (encrypted) EHC-->>CM: Decrypted history Code references: Step File Location Connection orchestration src/EchoHub.Client/Services/ConnectionManager.cs Lines 58-140 (ConnectAsync) EchoHubConnection setup src/EchoHub.Client/Services/EchoHubConnection.cs Lines 29-62 (constructor) Handler registration src/EchoHub.Client/Services/EchoHubConnection.cs Lines 64-122 (RegisterHandlers) Hub OnConnected src/EchoHub.Server/Hubs/ChatHub.cs Lines 31-43 ChatService connected src/EchoHub.Server/Services/ChatService.cs Lines 41-57 PresenceTracker connect src/EchoHub.Server/Services/PresenceTracker.cs Lines 13-29 Join channel (hub) src/EchoHub.Server/Hubs/ChatHub.cs Lines 59-81 Join channel (service) src/EchoHub.Server/Services/ChatService.cs Lines 96-135 IRC Client Connection IRC clients connect via TCP, authenticate with PASS/NICK/USER or SASL PLAIN, and auto-join channels. New usernames are auto-registered. sequenceDiagram participant IRC as IRC Client participant GW as IrcGatewayService participant CH as IrcCommandHandler participant US as UserService participant CS as ChatService participant PT as PresenceTracker IRC->>GW: TCP connect (:6667 or :6697 TLS) GW->>GW: Accept + create IrcClientConnection GW->>CH: new IrcCommandHandler(connection, services) GW->>CH: RunAsync() — start read loop alt SASL PLAIN IRC->>CH: CAP REQ :sasl CH-->>IRC: CAP ACK :sasl IRC->>CH: AUTHENTICATE PLAIN CH-->>IRC: AUTHENTICATE + IRC->>CH: AUTHENTICATE CH->>US: AuthenticateUserAsync(user, pass) alt Auth fails → auto-register CH->>US: RegisterUserAsync(user, pass) end CH-->>IRC: 903 :SASL authentication successful else PASS/NICK/USER IRC->>CH: PASS IRC->>CH: NICK IRC->>CH: USER 0 * : CH->>US: AuthenticateUserAsync(nick, pass) alt Auth fails → auto-register CH->>US: RegisterUserAsync(nick, pass) end end CH->>CS: UserConnectedAsync(irc-{guid}, userId, username) CS->>PT: UserConnected(irc-{guid}, userId, username) CH-->>IRC: 001-004 RPL_WELCOME burst + MOTD Note over IRC,CH: Client is now ready for JOIN/PART/PRIVMSG Code references: Step File Location TCP listener src/EchoHub.Server.Irc/IrcGatewayService.cs Lines 45-90 (ExecuteAsync) Client handler src/EchoHub.Server.Irc/IrcGatewayService.cs Lines 92-154 (HandleClientAsync) Command read loop src/EchoHub.Server.Irc/IrcCommandHandler.cs Lines 40-98 (RunAsync) SASL auth src/EchoHub.Server.Irc/IrcCommandHandler.cs Lines 136-207 (HandleAuthenticateAsync) PASS/NICK/USER src/EchoHub.Server.Irc/IrcCommandHandler.cs Lines 209-267 Registration completion src/EchoHub.Server.Irc/IrcCommandHandler.cs Lines 268-315 (TryCompleteRegistrationAsync) Cleanup on disconnect src/EchoHub.Server.Irc/IrcGatewayService.cs Lines 136-153 User Disconnect & Presence When a client disconnects, the presence tracker determines if the user has any remaining connections. If not, status is set to Invisible and all channels are notified. sequenceDiagram participant Client as Client participant Entry as ChatHub / IrcGatewayService participant CS as ChatService participant PT as PresenceTracker participant DB as SQLite participant SRB as SignalRBroadcaster Client->>Entry: Disconnect / TCP close Entry->>CS: UserDisconnectedAsync(connectionId) CS->>PT: Get username + channels (before removal) CS->>PT: UserDisconnected(connectionId) PT->>PT: Remove connection from tracking alt No remaining connections for user CS->>DB: Update user: Status=Invisible, LastSeenAt=now loop For each channel user was in CS->>CS: BroadcastToAllAsync(SendUserStatusChangedAsync) CS->>SRB: Notify channel members end end Code references: Step File Location SignalR disconnect src/EchoHub.Server/Hubs/ChatHub.cs Lines 45-57 IRC cleanup src/EchoHub.Server.Irc/IrcGatewayService.cs Lines 136-153 ChatService disconnect src/EchoHub.Server/Services/ChatService.cs Lines 59-94 Presence disconnect src/EchoHub.Server/Services/PresenceTracker.cs Lines 31-53" + }, + "flows/flows.html": { + "href": "flows/flows.html", + "title": "Flows | EchoHub Documentation", + "summary": "Flows This section documents the major request/event flows in EchoHub, showing how data moves between the TUI client, IRC client, server, and database. Each diagram includes code references so you can jump straight to the implementation." + }, + "flows/media.html": { + "href": "flows/media.html", + "title": "Media & Services | EchoHub Documentation", + "summary": "Media & Services File Upload Files are uploaded via REST, validated by magic bytes, stored with GUID filenames, and broadcast as a message with a download link. sequenceDiagram participant Client as Client participant CC as ChannelsController participant FV as FileValidationHelper participant FS as FileStorageService participant CS as ChatService participant DB as SQLite Client->>CC: POST /api/channels/{channel}/upload (multipart) CC->>CC: Check file size limits CC->>FV: IsValidImage(stream) — magic byte check FV->>FV: Read header: JPEG(FFD8FF) / PNG(89504E47) / GIF / WebP(RIFF+WEBP) FV-->>CC: true/false CC->>FS: SaveFileAsync(stream, extension) FS->>FS: Generate GUID filename, write to uploads/ FS-->>CC: fileId (GUID) CC->>CC: Determine MessageType (Image/Audio/File) CC->>CS: SendMessageAsync (with file URL + optional ASCII art) CS->>DB: INSERT Message CS->>CS: BroadcastToAllAsync → fan out to clients Code references: Step File Location Upload endpoint src/EchoHub.Server/Controllers/ChannelsController.cs Lines 108-200 File validation src/EchoHub.Server/Services/FileValidationHelper.cs Lines 15-82 File storage src/EchoHub.Server/Services/FileStorageService.cs Lines 1-47 File download src/EchoHub.Server/Controllers/FilesController.cs Lines 22-53 Link Embed Resolution When a message contains URLs, the server fetches OpenGraph metadata for preview embeds. sequenceDiagram participant CS as ChatService participant LE as LinkEmbedService participant Web as External Website CS->>LE: TryGetEmbedsAsync(messageContent) LE->>LE: Extract URLs via regex LE->>LE: Filter: max URLs per message, skip duplicates loop For each URL LE->>LE: Validate: http(s) only, block private IPs LE->>Web: GET URL (timeout + size limit) Web-->>LE: HTML response LE->>LE: Parse og:title, og:description, og:site_name LE->>LE: Parse theme-color meta tag LE->>LE: Fallback to if no og:title end LE-->>CS: List<EmbedDto> (or null) Note over CS: Attached to MessageDto before broadcast Code references: Step File Location Entry point src/EchoHub.Server/Services/LinkEmbedService.cs Lines 28-51 (TryGetEmbedsAsync) URL extraction src/EchoHub.Server/Services/LinkEmbedService.cs Lines 145-160 Private IP blocking src/EchoHub.Server/Services/LinkEmbedService.cs Lines 162-181 OG tag parsing src/EchoHub.Server/Services/LinkEmbedService.cs Lines 187-210 Theme color parsing src/EchoHub.Server/Services/LinkEmbedService.cs Lines 117-143 ChatService integration src/EchoHub.Server/Services/ChatService.cs Lines 194-201 Server Directory Registration Public servers register with the EchoHubSpace directory for discoverability. sequenceDiagram participant SDS as ServerDirectoryService participant Dir as EchoHubSpace Directory participant PT as PresenceTracker SDS->>SDS: Check Server:PublicServer config SDS->>Dir: SignalR connect (echohub.voidcube.cloud/hubs/servers) SDS->>Dir: RegisterServer(name, description, host, userCount) Dir-->>SDS: Registered loop Every 30 seconds SDS->>PT: Get online user count alt Count changed SDS->>Dir: UpdateUserCount(count) end end Dir->>SDS: Ping SDS->>Dir: Heartbeat Note over SDS,Dir: Exponential backoff on disconnect (2s → 30s max) Code references: Step File Location Service lifecycle src/EchoHub.Server/Services/ServerDirectoryService.cs Lines 29-122 Registration src/EchoHub.Server/Services/ServerDirectoryService.cs Lines 195-212 User count polling src/EchoHub.Server/Services/ServerDirectoryService.cs Lines 154-187 Reconnection backoff src/EchoHub.Server/Services/ServerDirectoryService.cs Lines 77-82, 191" + }, + "flows/messaging.html": { + "href": "flows/messaging.html", + "title": "Messaging | EchoHub Documentation", + "summary": "Messaging Sending a Message (SignalR) A message typed in the TUI travels through encryption, the SignalR hub, ChatService validation, database storage, and fan-out to both SignalR and IRC clients. sequenceDiagram participant UI as MainWindow (TUI) participant AO as AppOrchestrator participant EHC as EchoHubConnection participant Hub as ChatHub participant CS as ChatService participant LE as LinkEmbedService participant DB as SQLite participant SRB as SignalRBroadcaster participant IRCB as IrcBroadcaster participant Clients as Other Clients UI->>AO: OnMessageSubmitted(channel, text) AO->>AO: IsCommand(text)? → No AO->>EHC: SendMessageAsync(channel, text) EHC->>EHC: Encrypt(text) → ciphertext EHC->>Hub: InvokeAsync(\"SendMessage\", channel, ciphertext) Hub->>CS: SendMessageAsync(userId, username, channel, ciphertext) CS->>CS: Decrypt(ciphertext) → plaintext CS->>CS: Validate (length, newlines, channel exists) CS->>DB: Check mute status CS->>LE: TryGetEmbedsAsync(plaintext) LE->>LE: Extract URLs, fetch OG tags LE-->>CS: List<EmbedDto> (or null) CS->>DB: INSERT Message (encrypted at rest) CS->>CS: Re-encrypt plaintext for transport CS->>CS: Build MessageDto with embeds par Fan-out to all broadcasters CS->>SRB: SendMessageToChannelAsync(channel, dto) SRB->>Clients: HubContext.Group(channel).ReceiveMessage(dto) and CS->>IRCB: SendMessageToChannelAsync(channel, dto) IRCB->>IRCB: Decrypt → format as PRIVMSG lines IRCB->>Clients: Send to each IRC conn (skip sender) end Code references: Step File Location Input handler src/EchoHub.Client/UI/MainWindow.cs Lines 428-449 (OnInputKeyDown) Orchestrator dispatch src/EchoHub.Client/AppOrchestrator.cs Lines 631-661 (HandleMessageSubmitted) Client encrypt + send src/EchoHub.Client/Services/EchoHubConnection.cs Lines 148-153 (SendMessageAsync) Hub receive src/EchoHub.Server/Hubs/ChatHub.cs Lines 98-111 (SendMessage) ChatService process src/EchoHub.Server/Services/ChatService.cs Lines 145-241 (SendMessageAsync) Mute check src/EchoHub.Server/Services/ChatService.cs Lines 177-190 Link embeds src/EchoHub.Server/Services/LinkEmbedService.cs Lines 28-51 (TryGetEmbedsAsync) DB insert src/EchoHub.Server/Services/ChatService.cs Lines 208-221 Broadcast fan-out src/EchoHub.Server/Services/ChatService.cs Lines 311-324 (BroadcastToAllAsync) SignalR broadcast src/EchoHub.Server/Services/SignalRBroadcaster.cs Lines 23-24 IRC broadcast src/EchoHub.Server.Irc/IrcBroadcaster.cs Lines 17-32 Sending a Message (IRC) Messages from IRC clients follow the same ChatService path but enter as plaintext (no app-layer encryption). sequenceDiagram participant IRC as IRC Client participant CH as IrcCommandHandler participant CS as ChatService participant DB as SQLite participant SRB as SignalRBroadcaster participant IRCB as IrcBroadcaster IRC->>CH: PRIVMSG #channel :Hello world CH->>CH: Parse target + content CH->>CH: IrcToEchoHubChannel(\"#channel\") → \"channel\" CH->>CS: SendMessageAsync(userId, username, \"channel\", \"Hello world\") CS->>CS: Decrypt(\"Hello world\") → passthrough (no $ENC$ prefix) CS->>CS: Validate, check mute, fetch embeds CS->>DB: INSERT Message CS->>CS: Encrypt plaintext for SignalR transport par Fan-out CS->>SRB: SendMessageToChannelAsync (encrypted for SignalR) and CS->>IRCB: SendMessageToChannelAsync (decrypt → PRIVMSG) IRCB->>IRCB: Skip sender (IRC echo suppression) end Code references: Step File Location PRIVMSG handler src/EchoHub.Server.Irc/IrcCommandHandler.cs Lines 437-469 Channel name conversion src/EchoHub.Server.Irc/IrcCommandHandler.cs Line 680 (IrcToEchoHubChannel) ChatService (shared path) src/EchoHub.Server/Services/ChatService.cs Lines 145-241 IRC echo suppression src/EchoHub.Server.Irc/IrcBroadcaster.cs Lines 25-26 Receiving a Message (TUI Client) When a message arrives via SignalR, the client decrypts it, adds it to the chat view, and optionally plays a notification sound for @mentions. sequenceDiagram participant SRB as SignalRBroadcaster participant EHC as EchoHubConnection participant AO as AppOrchestrator participant MM as ChatMessageManager participant UI as MainWindow SRB->>EHC: ReceiveMessage(MessageDto) EHC->>EHC: Decrypt(message.Content) EHC-->>AO: OnMessageReceived(decrypted dto) AO->>AO: InvokeUI (thread-safe) AO->>MM: AddMessage(message) MM->>UI: Render in chat ListView alt Message contains @username AO->>AO: PlayAsync() notification sound end Code references: Step File Location SignalR handler src/EchoHub.Client/Services/EchoHubConnection.cs Lines 64-71 Orchestrator receive src/EchoHub.Client/AppOrchestrator.cs Lines 372-383 @mention detection src/EchoHub.Client/AppOrchestrator.cs Lines 378-382 Command Execution Slash commands (/status, /nick, /kick, etc.) are parsed client-side and dispatched to appropriate handlers, which call REST APIs or SignalR methods. sequenceDiagram participant UI as MainWindow participant AO as AppOrchestrator participant CMD as CommandHandler participant API as ApiClient participant EHC as EchoHubConnection participant Server as Server (API/Hub) UI->>AO: OnMessageSubmitted(channel, \"/kick baduser\") AO->>CMD: IsCommand(\"/kick baduser\")? → true AO->>CMD: HandleAsync(\"/kick baduser\") CMD->>CMD: Parse → command=\"kick\", args=\"baduser\" alt API command (kick, ban, mute, nick, etc.) CMD-->>AO: Fire OnKickRequested(\"baduser\") AO->>API: KickUserAsync(\"baduser\") API->>Server: POST /api/moderation/kick/baduser else Hub command (status, join, leave, etc.) CMD-->>AO: Fire OnSetStatus / OnJoinChannel / etc. AO->>EHC: UpdateStatusAsync() / JoinChannelAsync() / etc. EHC->>Server: SignalR Invoke else Local command (theme, help, quit) CMD-->>AO: Fire OnThemeChanged / etc. AO->>UI: Apply locally (no server call) end AO->>UI: AddSystemMessage(result) Available commands: Command Type Handler /status <status> [message] Hub UpdateStatusAsync /nick <name> API UpdateProfileAsync /color <hex> API UpdateProfileAsync /join <channel> Hub JoinChannelAsync /leave Hub LeaveChannelAsync /topic <text> API UpdateChannelTopicAsync /kick <user> API POST /api/moderation/kick/{user} /ban <user> API POST /api/moderation/ban/{user} /unban <user> API POST /api/moderation/unban/{user} /mute <user> [mins] API POST /api/moderation/mute/{user} /unmute <user> API POST /api/moderation/unmute/{user} /role <user> <role> API PUT /api/moderation/role/{user} /nuke API DELETE /api/channels/{channel}/messages /send <file> API POST /api/channels/{channel}/upload /profile [user] Local Show profile dialog /avatar API POST /api/users/avatar /theme <name> Local ThemeManager.SetTheme() /servers API GET /api/serverdir/servers /users Local Show userlist /help Local Show help text /quit Local Exit application Code references: Step File Location Command detection src/EchoHub.Client/AppOrchestrator.cs Lines 639-655 Command dispatch src/EchoHub.Client/Commands/CommandHandler.cs Lines 34-69 (HandleAsync) Command handlers wired src/EchoHub.Client/AppOrchestrator.cs Lines 97-117 Individual handlers src/EchoHub.Client/AppOrchestrator.cs Lines 122-350" + }, + "flows/moderation.html": { + "href": "flows/moderation.html", + "title": "Moderation | EchoHub Documentation", + "summary": "Moderation Kick / Ban / Mute Moderators and admins can kick, ban, or mute users via REST API or slash commands. These actions force-disconnect the target and broadcast the event. sequenceDiagram participant Mod as Moderator participant MC as ModerationController participant CS as ChatService participant PT as PresenceTracker participant DB as SQLite participant SRB as SignalRBroadcaster participant IRCB as IrcBroadcaster Mod->>MC: POST /api/moderation/kick/{user} alt Kick MC->>CS: Get user's channels MC->>CS: BroadcastToAllAsync(SendUserKickedAsync) MC->>CS: ForceDisconnectAndCleanupAsync(user) else Ban MC->>DB: Set user.IsBanned = true MC->>CS: BroadcastToAllAsync(SendUserBannedAsync) MC->>CS: ForceDisconnectAndCleanupAsync(user) else Mute MC->>DB: Set user.IsMuted = true, MutedUntil = now + duration Note over DB: MuteExpirationService auto-unmutes when timer expires end CS->>PT: ForceRemoveUser(username) PT->>PT: Remove from all connections + channels CS->>SRB: ForceDisconnectUserAsync(connectionIds, reason) CS->>IRCB: ForceDisconnectUserAsync(connectionIds, reason) CS->>DB: Set Status=Invisible, LastSeenAt=now Code references: Step File Location Kick endpoint src/EchoHub.Server/Controllers/ModerationController.cs Lines 62-87 Ban endpoint src/EchoHub.Server/Controllers/ModerationController.cs Lines 89-112 Mute endpoint src/EchoHub.Server/Controllers/ModerationController.cs Lines 130-151 Force disconnect src/EchoHub.Server/Controllers/ModerationController.cs Lines 232-256 Mute expiration src/EchoHub.Server/Services/MuteExpirationService.cs Lines 22-62 Mute enforcement src/EchoHub.Server/Services/ChatService.cs Lines 177-190 Presence force remove src/EchoHub.Server/Services/PresenceTracker.cs Lines 161-178" + }, "index.html": { "href": "index.html", "title": "EchoHub Documentation | EchoHub Documentation", "summary": "EchoHub Documentation Welcome to the EchoHub documentation. EchoHub is a decentralized, IRC-style chat platform. Self-hosted, terminal-first, with a built-in IRC gateway so native IRC clients can connect alongside the TUI client. Website: echohub.voidcube.cloud | Public Servers: Server Directory Quick Links Getting Started - Set up and run EchoHub Architecture - System design and IRC gateway API Reference - Generated C# API documentation Changelog - Release history" + }, + "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 [ ] when users clicks public -> private -> public checkbox in the channel creation, it ends up creating the channel on 3rd check switch [ ] add keyboard only controls | at least for most important parts and the rest might be accessible with: (down) [ ] add search bar / search modal – that will allow users to instantly navigate to room / focus on app element & etc [ ] Actually smart data management – cache messages, lazy load messages on scroll (currently hardcoded 100msgs fetched + new ones) [x] Another thing would be stateful userlist – basically fetch once and listen for userlist updates [x] Send to EchohubSpace only state changes, currently we send user count periodically, instead of updating it on update [x] space between mod|admin \"icon\" and username" } } \ No newline at end of file diff --git a/manifest.json b/manifest.json index 94e246c..66e45a5 100644 --- a/manifest.json +++ b/manifest.json @@ -192,6 +192,20 @@ "Title": "EchoHub.Client.Services.AudioPlaybackService", "Summary": null }, + { + "type": "ManagedReference", + "source_relative_path": "_api_meta/client/EchoHub.Client.Services.BackupInfo.yml", + "output": { + ".html": { + "relative_path": "api/client/EchoHub.Client.Services.BackupInfo.html" + } + }, + "version": "", + "Uid": null, + "IsMRef": true, + "Title": "EchoHub.Client.Services.BackupInfo", + "Summary": null + }, { "type": "ManagedReference", "source_relative_path": "_api_meta/client/EchoHub.Client.Services.ClientEncryptionService.yml", @@ -234,6 +248,34 @@ "Title": "EchoHub.Client.Services.NotificationSoundService", "Summary": null }, + { + "type": "ManagedReference", + "source_relative_path": "_api_meta/client/EchoHub.Client.Services.PathSetup.yml", + "output": { + ".html": { + "relative_path": "api/client/EchoHub.Client.Services.PathSetup.html" + } + }, + "version": "", + "Uid": null, + "IsMRef": true, + "Title": "EchoHub.Client.Services.PathSetup", + "Summary": "<p sourcefile=\"_api_meta/client/EchoHub.Client.Services.PathSetup.yml\" sourcestartlinenumber=\"1\">Ensures the application's directory is on the system PATH so users\ncan run 'echohub' from any terminal session.</p>\n" + }, + { + "type": "ManagedReference", + "source_relative_path": "_api_meta/client/EchoHub.Client.Services.UpdateBackupService.yml", + "output": { + ".html": { + "relative_path": "api/client/EchoHub.Client.Services.UpdateBackupService.html" + } + }, + "version": "", + "Uid": null, + "IsMRef": true, + "Title": "EchoHub.Client.Services.UpdateBackupService", + "Summary": "<p sourcefile=\"_api_meta/client/EchoHub.Client.Services.UpdateBackupService.yml\" sourcestartlinenumber=\"1\">Manages pre-update backups and rollback restoration for the auto-updater.\nBackup location: ~/.echohub/update-backup/</p>\n" + }, { "type": "ManagedReference", "source_relative_path": "_api_meta/client/EchoHub.Client.Services.UpdateChecker.yml", @@ -850,6 +892,20 @@ "Title": "EchoHub.Core.Contracts.IMessageEncryptionService", "Summary": null }, + { + "type": "ManagedReference", + "source_relative_path": "_api_meta/core/EchoHub.Core.Contracts.IUserService.yml", + "output": { + ".html": { + "relative_path": "api/core/EchoHub.Core.Contracts.IUserService.html" + } + }, + "version": "", + "Uid": null, + "IsMRef": true, + "Title": "EchoHub.Core.Contracts.IUserService", + "Summary": null + }, { "type": "ManagedReference", "source_relative_path": "_api_meta/core/EchoHub.Core.Contracts.yml", @@ -1032,6 +1088,20 @@ "Title": "EchoHub.Core.DTOs.ErrorResponse", "Summary": null }, + { + "type": "ManagedReference", + "source_relative_path": "_api_meta/core/EchoHub.Core.DTOs.JoinChannelResult.yml", + "output": { + ".html": { + "relative_path": "api/core/EchoHub.Core.DTOs.JoinChannelResult.html" + } + }, + "version": "", + "Uid": null, + "IsMRef": true, + "Title": "EchoHub.Core.DTOs.JoinChannelResult", + "Summary": null + }, { "type": "ManagedReference", "source_relative_path": "_api_meta/core/EchoHub.Core.DTOs.KickRequest.yml", @@ -1242,6 +1312,34 @@ "Title": "EchoHub.Core.DTOs.UserDto", "Summary": null }, + { + "type": "ManagedReference", + "source_relative_path": "_api_meta/core/EchoHub.Core.DTOs.UserError.yml", + "output": { + ".html": { + "relative_path": "api/core/EchoHub.Core.DTOs.UserError.html" + } + }, + "version": "", + "Uid": null, + "IsMRef": true, + "Title": "EchoHub.Core.DTOs.UserError", + "Summary": null + }, + { + "type": "ManagedReference", + "source_relative_path": "_api_meta/core/EchoHub.Core.DTOs.UserOperationResult.yml", + "output": { + ".html": { + "relative_path": "api/core/EchoHub.Core.DTOs.UserOperationResult.html" + } + }, + "version": "", + "Uid": null, + "IsMRef": true, + "Title": "EchoHub.Core.DTOs.UserOperationResult", + "Summary": null + }, { "type": "ManagedReference", "source_relative_path": "_api_meta/core/EchoHub.Core.DTOs.UserPresenceDto.yml", @@ -1956,6 +2054,20 @@ "Title": "EchoHub.Server.Services.MessageEncryptionService", "Summary": null }, + { + "type": "ManagedReference", + "source_relative_path": "_api_meta/server/EchoHub.Server.Services.MuteExpirationService.yml", + "output": { + ".html": { + "relative_path": "api/server/EchoHub.Server.Services.MuteExpirationService.html" + } + }, + "version": "", + "Uid": null, + "IsMRef": true, + "Title": "EchoHub.Server.Services.MuteExpirationService", + "Summary": "<p sourcefile=\"_api_meta/server/EchoHub.Server.Services.MuteExpirationService.yml\" sourcestartlinenumber=\"1\">Background service that periodically unmutes users whose timed mute has expired.</p>\n" + }, { "type": "ManagedReference", "source_relative_path": "_api_meta/server/EchoHub.Server.Services.PresenceTracker.yml", @@ -1998,6 +2110,20 @@ "Title": "EchoHub.Server.Services.SignalRBroadcaster", "Summary": null }, + { + "type": "ManagedReference", + "source_relative_path": "_api_meta/server/EchoHub.Server.Services.UserService.yml", + "output": { + ".html": { + "relative_path": "api/server/EchoHub.Server.Services.UserService.html" + } + }, + "version": "", + "Uid": null, + "IsMRef": true, + "Title": "EchoHub.Server.Services.UserService", + "Summary": null + }, { "type": "ManagedReference", "source_relative_path": "_api_meta/server/EchoHub.Server.Services.yml", @@ -2170,6 +2296,16 @@ }, "version": "" }, + { + "type": "Conceptual", + "source_relative_path": "articles/docker.md", + "output": { + ".html": { + "relative_path": "articles/docker.html" + } + }, + "version": "" + }, { "type": "Conceptual", "source_relative_path": "articles/encryption.md", @@ -2336,6 +2472,99 @@ }, "version": "" }, + { + "type": "Conceptual", + "source_relative_path": "changelog/v0.2.8.md", + "output": { + ".html": { + "relative_path": "changelog/v0.2.8.html" + } + }, + "version": "" + }, + { + "type": "Conceptual", + "source_relative_path": "flows/authentication.md", + "output": { + ".html": { + "relative_path": "flows/authentication.html" + } + }, + "version": "" + }, + { + "type": "Conceptual", + "source_relative_path": "flows/channels.md", + "output": { + ".html": { + "relative_path": "flows/channels.html" + } + }, + "version": "" + }, + { + "type": "Conceptual", + "source_relative_path": "flows/connection.md", + "output": { + ".html": { + "relative_path": "flows/connection.html" + } + }, + "version": "" + }, + { + "type": "Conceptual", + "source_relative_path": "flows/flows.md", + "output": { + ".html": { + "relative_path": "flows/flows.html" + } + }, + "version": "" + }, + { + "type": "Conceptual", + "source_relative_path": "flows/media.md", + "output": { + ".html": { + "relative_path": "flows/media.html" + } + }, + "version": "" + }, + { + "type": "Conceptual", + "source_relative_path": "flows/messaging.md", + "output": { + ".html": { + "relative_path": "flows/messaging.html" + } + }, + "version": "" + }, + { + "type": "Conceptual", + "source_relative_path": "flows/moderation.md", + "output": { + ".html": { + "relative_path": "flows/moderation.html" + } + }, + "version": "" + }, + { + "type": "Toc", + "source_relative_path": "flows/toc.yml", + "output": { + ".html": { + "relative_path": "flows/toc.html" + }, + ".json": { + "relative_path": "flows/toc.json" + } + }, + "version": "" + }, { "type": "Resource", "source_relative_path": "images/hue_icon.svg", @@ -2368,6 +2597,16 @@ } }, "version": "" + }, + { + "type": "Conceptual", + "source_relative_path": "todo.md", + "output": { + ".html": { + "relative_path": "todo.html" + } + }, + "version": "" } ], "groups": [ diff --git a/toc.html b/toc.html index 0a79dfe..03ec397 100644 --- a/toc.html +++ b/toc.html @@ -15,6 +15,9 @@ <li> <a href="articles/getting-started.html" name="articles/toc.html" title="Articles">Articles</a> </li> + <li> + <a href="flows/flows.html" name="flows/toc.html" title="Flows">Flows</a> + </li> <li> <a href="changelog/index.html" name="changelog/toc.html" title="Changelog">Changelog</a> </li> diff --git a/toc.json b/toc.json index bd21e00..3076821 100644 --- a/toc.json +++ b/toc.json @@ -1,2 +1,2 @@ -{"items":[{"name":"Articles","href":"articles/getting-started.html","tocHref":"articles/toc.html","topicHref":"articles/getting-started.html","homepage":"articles/getting-started.html"},{"name":"Changelog","href":"changelog/index.html","tocHref":"changelog/toc.html","topicHref":"changelog/index.html","homepage":"changelog/index.html"},{"name":"API","href":"api/index.html","tocHref":"api/toc.html","topicHref":"api/index.html","homepage":"api/index.html"}]} +{"items":[{"name":"Articles","href":"articles/getting-started.html","tocHref":"articles/toc.html","topicHref":"articles/getting-started.html","homepage":"articles/getting-started.html"},{"name":"Flows","href":"flows/flows.html","tocHref":"flows/toc.html","topicHref":"flows/flows.html","homepage":"flows/flows.html"},{"name":"Changelog","href":"changelog/index.html","tocHref":"changelog/toc.html","topicHref":"changelog/index.html","homepage":"changelog/index.html"},{"name":"API","href":"api/index.html","tocHref":"api/toc.html","topicHref":"api/index.html","homepage":"api/index.html"}]} diff --git a/todo.html b/todo.html new file mode 100644 index 0000000..967f203 --- /dev/null +++ b/todo.html @@ -0,0 +1,132 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8"> + <title>TODO | EchoHub Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + +
      + +
      + +
      +
      + + +
      + +
      +

      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 + +
      • +
      • [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
        • +
        +
      • +
      • [ ] when users clicks public -> private -> public checkbox in the channel creation, it ends up creating the channel on 3rd check switch
      • +
      • [ ] add keyboard only controls | at least for most important parts and the rest might be accessible with: (down)
      • +
      • [ ] add search bar / search modal – that will allow users to instantly navigate to room / focus on app element & etc
      • +
      • [ ] Actually smart data management – cache messages, lazy load messages on scroll (currently hardcoded 100msgs fetched + new ones)
      • +
      • [x] Another thing would be stateful userlist – basically fetch once and listen for userlist updates
      • +
      • [x] Send to EchohubSpace only state changes, currently we send user count periodically, instead of updating it on update
      • +
      • [x] space between mod|admin "icon" and username
      • +
      + +
      + + + + + +
      + +
      + +
      +
      + +
      + + + + diff --git a/xrefmap.yml b/xrefmap.yml index af0ca6a..e67484d 100644 --- a/xrefmap.yml +++ b/xrefmap.yml @@ -1381,6 +1381,198 @@ references: commentId: Overload:EchoHub.Client.Services.AudioPlaybackService.StopAsync fullName: EchoHub.Client.Services.AudioPlaybackService.StopAsync nameWithType: AudioPlaybackService.StopAsync +- uid: EchoHub.Client.Services.BackupInfo + name: BackupInfo + href: api/client/EchoHub.Client.Services.BackupInfo.html + commentId: T:EchoHub.Client.Services.BackupInfo + fullName: EchoHub.Client.Services.BackupInfo + nameWithType: BackupInfo +- uid: EchoHub.Client.Services.BackupInfo.#ctor(EchoHub.Client.Services.BackupInfo) + name: BackupInfo(BackupInfo) + href: api/client/EchoHub.Client.Services.BackupInfo.html#EchoHub_Client_Services_BackupInfo__ctor_EchoHub_Client_Services_BackupInfo_ + commentId: M:EchoHub.Client.Services.BackupInfo.#ctor(EchoHub.Client.Services.BackupInfo) + name.vb: New(BackupInfo) + fullName: EchoHub.Client.Services.BackupInfo.BackupInfo(EchoHub.Client.Services.BackupInfo) + fullName.vb: EchoHub.Client.Services.BackupInfo.New(EchoHub.Client.Services.BackupInfo) + nameWithType: BackupInfo.BackupInfo(BackupInfo) + nameWithType.vb: BackupInfo.New(BackupInfo) +- uid: EchoHub.Client.Services.BackupInfo.#ctor(System.String,System.String,System.DateTimeOffset) + name: BackupInfo(string, string, DateTimeOffset) + href: api/client/EchoHub.Client.Services.BackupInfo.html#EchoHub_Client_Services_BackupInfo__ctor_System_String_System_String_System_DateTimeOffset_ + commentId: M:EchoHub.Client.Services.BackupInfo.#ctor(System.String,System.String,System.DateTimeOffset) + name.vb: New(String, String, DateTimeOffset) + fullName: EchoHub.Client.Services.BackupInfo.BackupInfo(string, string, System.DateTimeOffset) + fullName.vb: EchoHub.Client.Services.BackupInfo.New(String, String, System.DateTimeOffset) + nameWithType: BackupInfo.BackupInfo(string, string, DateTimeOffset) + nameWithType.vb: BackupInfo.New(String, String, DateTimeOffset) +- uid: EchoHub.Client.Services.BackupInfo.#ctor* + name: BackupInfo + href: api/client/EchoHub.Client.Services.BackupInfo.html#EchoHub_Client_Services_BackupInfo__ctor_ + commentId: Overload:EchoHub.Client.Services.BackupInfo.#ctor + name.vb: New + fullName: EchoHub.Client.Services.BackupInfo.BackupInfo + fullName.vb: EchoHub.Client.Services.BackupInfo.New + nameWithType: BackupInfo.BackupInfo + nameWithType.vb: BackupInfo.New +- uid: EchoHub.Client.Services.BackupInfo.AppDirectory + name: AppDirectory + href: api/client/EchoHub.Client.Services.BackupInfo.html#EchoHub_Client_Services_BackupInfo_AppDirectory + commentId: P:EchoHub.Client.Services.BackupInfo.AppDirectory + fullName: EchoHub.Client.Services.BackupInfo.AppDirectory + nameWithType: BackupInfo.AppDirectory +- uid: EchoHub.Client.Services.BackupInfo.AppDirectory* + name: AppDirectory + href: api/client/EchoHub.Client.Services.BackupInfo.html#EchoHub_Client_Services_BackupInfo_AppDirectory_ + commentId: Overload:EchoHub.Client.Services.BackupInfo.AppDirectory + fullName: EchoHub.Client.Services.BackupInfo.AppDirectory + nameWithType: BackupInfo.AppDirectory +- uid: EchoHub.Client.Services.BackupInfo.CreatedAt + name: CreatedAt + href: api/client/EchoHub.Client.Services.BackupInfo.html#EchoHub_Client_Services_BackupInfo_CreatedAt + commentId: P:EchoHub.Client.Services.BackupInfo.CreatedAt + fullName: EchoHub.Client.Services.BackupInfo.CreatedAt + nameWithType: BackupInfo.CreatedAt +- uid: EchoHub.Client.Services.BackupInfo.CreatedAt* + name: CreatedAt + href: api/client/EchoHub.Client.Services.BackupInfo.html#EchoHub_Client_Services_BackupInfo_CreatedAt_ + commentId: Overload:EchoHub.Client.Services.BackupInfo.CreatedAt + fullName: EchoHub.Client.Services.BackupInfo.CreatedAt + nameWithType: BackupInfo.CreatedAt +- uid: EchoHub.Client.Services.BackupInfo.Deconstruct(System.String@,System.String@,System.DateTimeOffset@) + name: Deconstruct(out string, out string, out DateTimeOffset) + href: api/client/EchoHub.Client.Services.BackupInfo.html#EchoHub_Client_Services_BackupInfo_Deconstruct_System_String__System_String__System_DateTimeOffset__ + commentId: M:EchoHub.Client.Services.BackupInfo.Deconstruct(System.String@,System.String@,System.DateTimeOffset@) + name.vb: Deconstruct(String, String, DateTimeOffset) + fullName: EchoHub.Client.Services.BackupInfo.Deconstruct(out string, out string, out System.DateTimeOffset) + fullName.vb: EchoHub.Client.Services.BackupInfo.Deconstruct(String, String, System.DateTimeOffset) + nameWithType: BackupInfo.Deconstruct(out string, out string, out DateTimeOffset) + nameWithType.vb: BackupInfo.Deconstruct(String, String, DateTimeOffset) +- uid: EchoHub.Client.Services.BackupInfo.Deconstruct* + name: Deconstruct + href: api/client/EchoHub.Client.Services.BackupInfo.html#EchoHub_Client_Services_BackupInfo_Deconstruct_ + commentId: Overload:EchoHub.Client.Services.BackupInfo.Deconstruct + fullName: EchoHub.Client.Services.BackupInfo.Deconstruct + nameWithType: BackupInfo.Deconstruct +- uid: EchoHub.Client.Services.BackupInfo.EqualityContract + name: EqualityContract + href: api/client/EchoHub.Client.Services.BackupInfo.html#EchoHub_Client_Services_BackupInfo_EqualityContract + commentId: P:EchoHub.Client.Services.BackupInfo.EqualityContract + fullName: EchoHub.Client.Services.BackupInfo.EqualityContract + nameWithType: BackupInfo.EqualityContract +- uid: EchoHub.Client.Services.BackupInfo.EqualityContract* + name: EqualityContract + href: api/client/EchoHub.Client.Services.BackupInfo.html#EchoHub_Client_Services_BackupInfo_EqualityContract_ + commentId: Overload:EchoHub.Client.Services.BackupInfo.EqualityContract + fullName: EchoHub.Client.Services.BackupInfo.EqualityContract + nameWithType: BackupInfo.EqualityContract +- uid: EchoHub.Client.Services.BackupInfo.Equals(EchoHub.Client.Services.BackupInfo) + name: Equals(BackupInfo?) + href: api/client/EchoHub.Client.Services.BackupInfo.html#EchoHub_Client_Services_BackupInfo_Equals_EchoHub_Client_Services_BackupInfo_ + commentId: M:EchoHub.Client.Services.BackupInfo.Equals(EchoHub.Client.Services.BackupInfo) + name.vb: Equals(BackupInfo) + fullName: EchoHub.Client.Services.BackupInfo.Equals(EchoHub.Client.Services.BackupInfo?) + fullName.vb: EchoHub.Client.Services.BackupInfo.Equals(EchoHub.Client.Services.BackupInfo) + nameWithType: BackupInfo.Equals(BackupInfo?) + nameWithType.vb: BackupInfo.Equals(BackupInfo) +- uid: EchoHub.Client.Services.BackupInfo.Equals(System.Object) + name: Equals(object?) + href: api/client/EchoHub.Client.Services.BackupInfo.html#EchoHub_Client_Services_BackupInfo_Equals_System_Object_ + commentId: M:EchoHub.Client.Services.BackupInfo.Equals(System.Object) + name.vb: Equals(Object) + fullName: EchoHub.Client.Services.BackupInfo.Equals(object?) + fullName.vb: EchoHub.Client.Services.BackupInfo.Equals(Object) + nameWithType: BackupInfo.Equals(object?) + nameWithType.vb: BackupInfo.Equals(Object) +- uid: EchoHub.Client.Services.BackupInfo.Equals* + name: Equals + href: api/client/EchoHub.Client.Services.BackupInfo.html#EchoHub_Client_Services_BackupInfo_Equals_ + commentId: Overload:EchoHub.Client.Services.BackupInfo.Equals + fullName: EchoHub.Client.Services.BackupInfo.Equals + nameWithType: BackupInfo.Equals +- uid: EchoHub.Client.Services.BackupInfo.GetHashCode + name: GetHashCode() + href: api/client/EchoHub.Client.Services.BackupInfo.html#EchoHub_Client_Services_BackupInfo_GetHashCode + commentId: M:EchoHub.Client.Services.BackupInfo.GetHashCode + fullName: EchoHub.Client.Services.BackupInfo.GetHashCode() + nameWithType: BackupInfo.GetHashCode() +- uid: EchoHub.Client.Services.BackupInfo.GetHashCode* + name: GetHashCode + href: api/client/EchoHub.Client.Services.BackupInfo.html#EchoHub_Client_Services_BackupInfo_GetHashCode_ + commentId: Overload:EchoHub.Client.Services.BackupInfo.GetHashCode + fullName: EchoHub.Client.Services.BackupInfo.GetHashCode + nameWithType: BackupInfo.GetHashCode +- uid: EchoHub.Client.Services.BackupInfo.PrintMembers(System.Text.StringBuilder) + name: PrintMembers(StringBuilder) + href: api/client/EchoHub.Client.Services.BackupInfo.html#EchoHub_Client_Services_BackupInfo_PrintMembers_System_Text_StringBuilder_ + commentId: M:EchoHub.Client.Services.BackupInfo.PrintMembers(System.Text.StringBuilder) + fullName: EchoHub.Client.Services.BackupInfo.PrintMembers(System.Text.StringBuilder) + nameWithType: BackupInfo.PrintMembers(StringBuilder) +- uid: EchoHub.Client.Services.BackupInfo.PrintMembers* + name: PrintMembers + href: api/client/EchoHub.Client.Services.BackupInfo.html#EchoHub_Client_Services_BackupInfo_PrintMembers_ + commentId: Overload:EchoHub.Client.Services.BackupInfo.PrintMembers + fullName: EchoHub.Client.Services.BackupInfo.PrintMembers + nameWithType: BackupInfo.PrintMembers +- uid: EchoHub.Client.Services.BackupInfo.ToString + name: ToString() + href: api/client/EchoHub.Client.Services.BackupInfo.html#EchoHub_Client_Services_BackupInfo_ToString + commentId: M:EchoHub.Client.Services.BackupInfo.ToString + fullName: EchoHub.Client.Services.BackupInfo.ToString() + nameWithType: BackupInfo.ToString() +- uid: EchoHub.Client.Services.BackupInfo.ToString* + name: ToString + href: api/client/EchoHub.Client.Services.BackupInfo.html#EchoHub_Client_Services_BackupInfo_ToString_ + commentId: Overload:EchoHub.Client.Services.BackupInfo.ToString + fullName: EchoHub.Client.Services.BackupInfo.ToString + nameWithType: BackupInfo.ToString +- uid: EchoHub.Client.Services.BackupInfo.Version + name: Version + href: api/client/EchoHub.Client.Services.BackupInfo.html#EchoHub_Client_Services_BackupInfo_Version + commentId: P:EchoHub.Client.Services.BackupInfo.Version + fullName: EchoHub.Client.Services.BackupInfo.Version + nameWithType: BackupInfo.Version +- uid: EchoHub.Client.Services.BackupInfo.Version* + name: Version + href: api/client/EchoHub.Client.Services.BackupInfo.html#EchoHub_Client_Services_BackupInfo_Version_ + commentId: Overload:EchoHub.Client.Services.BackupInfo.Version + fullName: EchoHub.Client.Services.BackupInfo.Version + nameWithType: BackupInfo.Version +- uid: EchoHub.Client.Services.BackupInfo.op_Equality(EchoHub.Client.Services.BackupInfo,EchoHub.Client.Services.BackupInfo) + name: operator ==(BackupInfo?, BackupInfo?) + href: api/client/EchoHub.Client.Services.BackupInfo.html#EchoHub_Client_Services_BackupInfo_op_Equality_EchoHub_Client_Services_BackupInfo_EchoHub_Client_Services_BackupInfo_ + commentId: M:EchoHub.Client.Services.BackupInfo.op_Equality(EchoHub.Client.Services.BackupInfo,EchoHub.Client.Services.BackupInfo) + name.vb: =(BackupInfo, BackupInfo) + fullName: EchoHub.Client.Services.BackupInfo.operator ==(EchoHub.Client.Services.BackupInfo?, EchoHub.Client.Services.BackupInfo?) + fullName.vb: EchoHub.Client.Services.BackupInfo.=(EchoHub.Client.Services.BackupInfo, EchoHub.Client.Services.BackupInfo) + nameWithType: BackupInfo.operator ==(BackupInfo?, BackupInfo?) + nameWithType.vb: BackupInfo.=(BackupInfo, BackupInfo) +- uid: EchoHub.Client.Services.BackupInfo.op_Equality* + name: operator == + href: api/client/EchoHub.Client.Services.BackupInfo.html#EchoHub_Client_Services_BackupInfo_op_Equality_ + commentId: Overload:EchoHub.Client.Services.BackupInfo.op_Equality + name.vb: = + fullName: EchoHub.Client.Services.BackupInfo.operator == + fullName.vb: EchoHub.Client.Services.BackupInfo.= + nameWithType: BackupInfo.operator == + nameWithType.vb: BackupInfo.= +- uid: EchoHub.Client.Services.BackupInfo.op_Inequality(EchoHub.Client.Services.BackupInfo,EchoHub.Client.Services.BackupInfo) + name: operator !=(BackupInfo?, BackupInfo?) + href: api/client/EchoHub.Client.Services.BackupInfo.html#EchoHub_Client_Services_BackupInfo_op_Inequality_EchoHub_Client_Services_BackupInfo_EchoHub_Client_Services_BackupInfo_ + commentId: M:EchoHub.Client.Services.BackupInfo.op_Inequality(EchoHub.Client.Services.BackupInfo,EchoHub.Client.Services.BackupInfo) + name.vb: <>(BackupInfo, BackupInfo) + fullName: EchoHub.Client.Services.BackupInfo.operator !=(EchoHub.Client.Services.BackupInfo?, EchoHub.Client.Services.BackupInfo?) + fullName.vb: EchoHub.Client.Services.BackupInfo.<>(EchoHub.Client.Services.BackupInfo, EchoHub.Client.Services.BackupInfo) + nameWithType: BackupInfo.operator !=(BackupInfo?, BackupInfo?) + nameWithType.vb: BackupInfo.<>(BackupInfo, BackupInfo) +- uid: EchoHub.Client.Services.BackupInfo.op_Inequality* + name: operator != + href: api/client/EchoHub.Client.Services.BackupInfo.html#EchoHub_Client_Services_BackupInfo_op_Inequality_ + commentId: Overload:EchoHub.Client.Services.BackupInfo.op_Inequality + name.vb: <> + fullName: EchoHub.Client.Services.BackupInfo.operator != + fullName.vb: EchoHub.Client.Services.BackupInfo.<> + nameWithType: BackupInfo.operator != + nameWithType.vb: BackupInfo.<> - uid: EchoHub.Client.Services.ClientEncryptionService name: ClientEncryptionService href: api/client/EchoHub.Client.Services.ClientEncryptionService.html @@ -1822,6 +2014,102 @@ references: commentId: Overload:EchoHub.Client.Services.NotificationSoundService.SetVolume fullName: EchoHub.Client.Services.NotificationSoundService.SetVolume nameWithType: NotificationSoundService.SetVolume +- uid: EchoHub.Client.Services.PathSetup + name: PathSetup + href: api/client/EchoHub.Client.Services.PathSetup.html + commentId: T:EchoHub.Client.Services.PathSetup + fullName: EchoHub.Client.Services.PathSetup + nameWithType: PathSetup +- uid: EchoHub.Client.Services.PathSetup.EnsureOnPath + name: EnsureOnPath() + href: api/client/EchoHub.Client.Services.PathSetup.html#EchoHub_Client_Services_PathSetup_EnsureOnPath + commentId: M:EchoHub.Client.Services.PathSetup.EnsureOnPath + fullName: EchoHub.Client.Services.PathSetup.EnsureOnPath() + nameWithType: PathSetup.EnsureOnPath() +- uid: EchoHub.Client.Services.PathSetup.EnsureOnPath* + name: EnsureOnPath + href: api/client/EchoHub.Client.Services.PathSetup.html#EchoHub_Client_Services_PathSetup_EnsureOnPath_ + commentId: Overload:EchoHub.Client.Services.PathSetup.EnsureOnPath + fullName: EchoHub.Client.Services.PathSetup.EnsureOnPath + nameWithType: PathSetup.EnsureOnPath +- uid: EchoHub.Client.Services.UpdateBackupService + name: UpdateBackupService + href: api/client/EchoHub.Client.Services.UpdateBackupService.html + commentId: T:EchoHub.Client.Services.UpdateBackupService + fullName: EchoHub.Client.Services.UpdateBackupService + nameWithType: UpdateBackupService +- uid: EchoHub.Client.Services.UpdateBackupService.BackupExists + name: BackupExists() + href: api/client/EchoHub.Client.Services.UpdateBackupService.html#EchoHub_Client_Services_UpdateBackupService_BackupExists + commentId: M:EchoHub.Client.Services.UpdateBackupService.BackupExists + fullName: EchoHub.Client.Services.UpdateBackupService.BackupExists() + nameWithType: UpdateBackupService.BackupExists() +- uid: EchoHub.Client.Services.UpdateBackupService.BackupExists* + name: BackupExists + href: api/client/EchoHub.Client.Services.UpdateBackupService.html#EchoHub_Client_Services_UpdateBackupService_BackupExists_ + commentId: Overload:EchoHub.Client.Services.UpdateBackupService.BackupExists + fullName: EchoHub.Client.Services.UpdateBackupService.BackupExists + nameWithType: UpdateBackupService.BackupExists +- uid: EchoHub.Client.Services.UpdateBackupService.CreateBackup + name: CreateBackup() + href: api/client/EchoHub.Client.Services.UpdateBackupService.html#EchoHub_Client_Services_UpdateBackupService_CreateBackup + commentId: M:EchoHub.Client.Services.UpdateBackupService.CreateBackup + fullName: EchoHub.Client.Services.UpdateBackupService.CreateBackup() + nameWithType: UpdateBackupService.CreateBackup() +- uid: EchoHub.Client.Services.UpdateBackupService.CreateBackup* + name: CreateBackup + href: api/client/EchoHub.Client.Services.UpdateBackupService.html#EchoHub_Client_Services_UpdateBackupService_CreateBackup_ + commentId: Overload:EchoHub.Client.Services.UpdateBackupService.CreateBackup + fullName: EchoHub.Client.Services.UpdateBackupService.CreateBackup + nameWithType: UpdateBackupService.CreateBackup +- uid: EchoHub.Client.Services.UpdateBackupService.DeleteBackup + name: DeleteBackup() + href: api/client/EchoHub.Client.Services.UpdateBackupService.html#EchoHub_Client_Services_UpdateBackupService_DeleteBackup + commentId: M:EchoHub.Client.Services.UpdateBackupService.DeleteBackup + fullName: EchoHub.Client.Services.UpdateBackupService.DeleteBackup() + nameWithType: UpdateBackupService.DeleteBackup() +- uid: EchoHub.Client.Services.UpdateBackupService.DeleteBackup* + name: DeleteBackup + href: api/client/EchoHub.Client.Services.UpdateBackupService.html#EchoHub_Client_Services_UpdateBackupService_DeleteBackup_ + commentId: Overload:EchoHub.Client.Services.UpdateBackupService.DeleteBackup + fullName: EchoHub.Client.Services.UpdateBackupService.DeleteBackup + nameWithType: UpdateBackupService.DeleteBackup +- uid: EchoHub.Client.Services.UpdateBackupService.GetBackupInfo + name: GetBackupInfo() + href: api/client/EchoHub.Client.Services.UpdateBackupService.html#EchoHub_Client_Services_UpdateBackupService_GetBackupInfo + commentId: M:EchoHub.Client.Services.UpdateBackupService.GetBackupInfo + fullName: EchoHub.Client.Services.UpdateBackupService.GetBackupInfo() + nameWithType: UpdateBackupService.GetBackupInfo() +- uid: EchoHub.Client.Services.UpdateBackupService.GetBackupInfo* + name: GetBackupInfo + href: api/client/EchoHub.Client.Services.UpdateBackupService.html#EchoHub_Client_Services_UpdateBackupService_GetBackupInfo_ + commentId: Overload:EchoHub.Client.Services.UpdateBackupService.GetBackupInfo + fullName: EchoHub.Client.Services.UpdateBackupService.GetBackupInfo + nameWithType: UpdateBackupService.GetBackupInfo +- uid: EchoHub.Client.Services.UpdateBackupService.IsPostUpdate + name: IsPostUpdate + href: api/client/EchoHub.Client.Services.UpdateBackupService.html#EchoHub_Client_Services_UpdateBackupService_IsPostUpdate + commentId: P:EchoHub.Client.Services.UpdateBackupService.IsPostUpdate + fullName: EchoHub.Client.Services.UpdateBackupService.IsPostUpdate + nameWithType: UpdateBackupService.IsPostUpdate +- uid: EchoHub.Client.Services.UpdateBackupService.IsPostUpdate* + name: IsPostUpdate + href: api/client/EchoHub.Client.Services.UpdateBackupService.html#EchoHub_Client_Services_UpdateBackupService_IsPostUpdate_ + commentId: Overload:EchoHub.Client.Services.UpdateBackupService.IsPostUpdate + fullName: EchoHub.Client.Services.UpdateBackupService.IsPostUpdate + nameWithType: UpdateBackupService.IsPostUpdate +- uid: EchoHub.Client.Services.UpdateBackupService.RestoreBackup + name: RestoreBackup() + href: api/client/EchoHub.Client.Services.UpdateBackupService.html#EchoHub_Client_Services_UpdateBackupService_RestoreBackup + commentId: M:EchoHub.Client.Services.UpdateBackupService.RestoreBackup + fullName: EchoHub.Client.Services.UpdateBackupService.RestoreBackup() + nameWithType: UpdateBackupService.RestoreBackup() +- uid: EchoHub.Client.Services.UpdateBackupService.RestoreBackup* + name: RestoreBackup + href: api/client/EchoHub.Client.Services.UpdateBackupService.html#EchoHub_Client_Services_UpdateBackupService_RestoreBackup_ + commentId: Overload:EchoHub.Client.Services.UpdateBackupService.RestoreBackup + fullName: EchoHub.Client.Services.UpdateBackupService.RestoreBackup + nameWithType: UpdateBackupService.RestoreBackup - uid: EchoHub.Client.Services.UpdateChecker name: UpdateChecker href: api/client/EchoHub.Client.Services.UpdateChecker.html @@ -1846,6 +2134,18 @@ references: fullName.vb: EchoHub.Client.Services.UpdateChecker.New nameWithType: UpdateChecker.UpdateChecker nameWithType.vb: UpdateChecker.New +- uid: EchoHub.Client.Services.UpdateChecker.CheckNowAsync + name: CheckNowAsync() + href: api/client/EchoHub.Client.Services.UpdateChecker.html#EchoHub_Client_Services_UpdateChecker_CheckNowAsync + commentId: M:EchoHub.Client.Services.UpdateChecker.CheckNowAsync + fullName: EchoHub.Client.Services.UpdateChecker.CheckNowAsync() + nameWithType: UpdateChecker.CheckNowAsync() +- uid: EchoHub.Client.Services.UpdateChecker.CheckNowAsync* + name: CheckNowAsync + href: api/client/EchoHub.Client.Services.UpdateChecker.html#EchoHub_Client_Services_UpdateChecker_CheckNowAsync_ + commentId: Overload:EchoHub.Client.Services.UpdateChecker.CheckNowAsync + fullName: EchoHub.Client.Services.UpdateChecker.CheckNowAsync + nameWithType: UpdateChecker.CheckNowAsync - uid: EchoHub.Client.Services.UpdateChecker.CurrentVersion name: CurrentVersion href: api/client/EchoHub.Client.Services.UpdateChecker.html#EchoHub_Client_Services_UpdateChecker_CurrentVersion @@ -2125,6 +2425,12 @@ references: commentId: F:EchoHub.Client.UI.Chat.ChatColors.AudioAttr fullName: EchoHub.Client.UI.Chat.ChatColors.AudioAttr nameWithType: ChatColors.AudioAttr +- uid: EchoHub.Client.UI.Chat.ChatColors.ChannelRefAttr + name: ChannelRefAttr + href: api/client/EchoHub.Client.UI.Chat.ChatColors.html#EchoHub_Client_UI_Chat_ChatColors_ChannelRefAttr + commentId: F:EchoHub.Client.UI.Chat.ChatColors.ChannelRefAttr + fullName: EchoHub.Client.UI.Chat.ChatColors.ChannelRefAttr + nameWithType: ChatColors.ChannelRefAttr - uid: EchoHub.Client.UI.Chat.ChatColors.EmbedBorderAttr name: EmbedBorderAttr href: api/client/EchoHub.Client.UI.Chat.ChatColors.html#EchoHub_Client_UI_Chat_ChatColors_EmbedBorderAttr @@ -2251,6 +2557,18 @@ references: commentId: Overload:EchoHub.Client.UI.Chat.ChatLine.AttachmentUrl fullName: EchoHub.Client.UI.Chat.ChatLine.AttachmentUrl nameWithType: ChatLine.AttachmentUrl +- uid: EchoHub.Client.UI.Chat.ChatLine.ContinuationIndent + name: ContinuationIndent + href: api/client/EchoHub.Client.UI.Chat.ChatLine.html#EchoHub_Client_UI_Chat_ChatLine_ContinuationIndent + commentId: P:EchoHub.Client.UI.Chat.ChatLine.ContinuationIndent + fullName: EchoHub.Client.UI.Chat.ChatLine.ContinuationIndent + nameWithType: ChatLine.ContinuationIndent +- uid: EchoHub.Client.UI.Chat.ChatLine.ContinuationIndent* + name: ContinuationIndent + href: api/client/EchoHub.Client.UI.Chat.ChatLine.html#EchoHub_Client_UI_Chat_ChatLine_ContinuationIndent_ + commentId: Overload:EchoHub.Client.UI.Chat.ChatLine.ContinuationIndent + fullName: EchoHub.Client.UI.Chat.ChatLine.ContinuationIndent + nameWithType: ChatLine.ContinuationIndent - uid: EchoHub.Client.UI.Chat.ChatLine.FromColoredText(System.String,System.Nullable{Terminal.Gui.Drawing.Attribute}) name: FromColoredText(string, Attribute?) href: api/client/EchoHub.Client.UI.Chat.ChatLine.html#EchoHub_Client_UI_Chat_ChatLine_FromColoredText_System_String_System_Nullable_Terminal_Gui_Drawing_Attribute__ @@ -2317,6 +2635,18 @@ references: commentId: Overload:EchoHub.Client.UI.Chat.ChatLine.Segments fullName: EchoHub.Client.UI.Chat.ChatLine.Segments nameWithType: ChatLine.Segments +- uid: EchoHub.Client.UI.Chat.ChatLine.SenderUsername + name: SenderUsername + href: api/client/EchoHub.Client.UI.Chat.ChatLine.html#EchoHub_Client_UI_Chat_ChatLine_SenderUsername + commentId: P:EchoHub.Client.UI.Chat.ChatLine.SenderUsername + fullName: EchoHub.Client.UI.Chat.ChatLine.SenderUsername + nameWithType: ChatLine.SenderUsername +- uid: EchoHub.Client.UI.Chat.ChatLine.SenderUsername* + name: SenderUsername + href: api/client/EchoHub.Client.UI.Chat.ChatLine.html#EchoHub_Client_UI_Chat_ChatLine_SenderUsername_ + commentId: Overload:EchoHub.Client.UI.Chat.ChatLine.SenderUsername + fullName: EchoHub.Client.UI.Chat.ChatLine.SenderUsername + nameWithType: ChatLine.SenderUsername - uid: EchoHub.Client.UI.Chat.ChatLine.StripColorTags(System.String) name: StripColorTags(string) href: api/client/EchoHub.Client.UI.Chat.ChatLine.html#EchoHub_Client_UI_Chat_ChatLine_StripColorTags_System_String_ @@ -4474,6 +4804,21 @@ references: commentId: Overload:EchoHub.Client.UI.ListSources.UserListSource.Dispose fullName: EchoHub.Client.UI.ListSources.UserListSource.Dispose nameWithType: UserListSource.Dispose +- uid: EchoHub.Client.UI.ListSources.UserListSource.GetUsername(System.Int32) + name: GetUsername(int) + href: api/client/EchoHub.Client.UI.ListSources.UserListSource.html#EchoHub_Client_UI_ListSources_UserListSource_GetUsername_System_Int32_ + commentId: M:EchoHub.Client.UI.ListSources.UserListSource.GetUsername(System.Int32) + name.vb: GetUsername(Integer) + fullName: EchoHub.Client.UI.ListSources.UserListSource.GetUsername(int) + fullName.vb: EchoHub.Client.UI.ListSources.UserListSource.GetUsername(Integer) + nameWithType: UserListSource.GetUsername(int) + nameWithType.vb: UserListSource.GetUsername(Integer) +- uid: EchoHub.Client.UI.ListSources.UserListSource.GetUsername* + name: GetUsername + href: api/client/EchoHub.Client.UI.ListSources.UserListSource.html#EchoHub_Client_UI_ListSources_UserListSource_GetUsername_ + commentId: Overload:EchoHub.Client.UI.ListSources.UserListSource.GetUsername + fullName: EchoHub.Client.UI.ListSources.UserListSource.GetUsername + nameWithType: UserListSource.GetUsername - uid: EchoHub.Client.UI.ListSources.UserListSource.IsMarked(System.Int32) name: IsMarked(int) href: api/client/EchoHub.Client.UI.ListSources.UserListSource.html#EchoHub_Client_UI_ListSources_UserListSource_IsMarked_System_Int32_ @@ -4555,15 +4900,15 @@ references: commentId: Overload:EchoHub.Client.UI.ListSources.UserListSource.ToList fullName: EchoHub.Client.UI.ListSources.UserListSource.ToList nameWithType: UserListSource.ToList -- uid: EchoHub.Client.UI.ListSources.UserListSource.Update(System.Collections.Generic.List{System.ValueTuple{System.String,System.Nullable{Terminal.Gui.Drawing.Attribute}}}) - name: Update(List<(string Text, Attribute? NameColor)>) - href: api/client/EchoHub.Client.UI.ListSources.UserListSource.html#EchoHub_Client_UI_ListSources_UserListSource_Update_System_Collections_Generic_List_System_ValueTuple_System_String_System_Nullable_Terminal_Gui_Drawing_Attribute____ - commentId: M:EchoHub.Client.UI.ListSources.UserListSource.Update(System.Collections.Generic.List{System.ValueTuple{System.String,System.Nullable{Terminal.Gui.Drawing.Attribute}}}) - name.vb: Update(List(Of (Text As String, NameColor As Attribute?))) - fullName: EchoHub.Client.UI.ListSources.UserListSource.Update(System.Collections.Generic.List<(string Text, Terminal.Gui.Drawing.Attribute? NameColor)>) - fullName.vb: EchoHub.Client.UI.ListSources.UserListSource.Update(System.Collections.Generic.List(Of (Text As String, NameColor As Terminal.Gui.Drawing.Attribute?))) - nameWithType: UserListSource.Update(List<(string Text, Attribute? NameColor)>) - nameWithType.vb: UserListSource.Update(List(Of (Text As String, NameColor As Attribute?))) +- uid: EchoHub.Client.UI.ListSources.UserListSource.Update(System.Collections.Generic.List{System.ValueTuple{System.String,System.Nullable{Terminal.Gui.Drawing.Attribute},System.String}}) + name: Update(List<(string Text, Attribute? NameColor, string Username)>) + href: api/client/EchoHub.Client.UI.ListSources.UserListSource.html#EchoHub_Client_UI_ListSources_UserListSource_Update_System_Collections_Generic_List_System_ValueTuple_System_String_System_Nullable_Terminal_Gui_Drawing_Attribute__System_String___ + commentId: M:EchoHub.Client.UI.ListSources.UserListSource.Update(System.Collections.Generic.List{System.ValueTuple{System.String,System.Nullable{Terminal.Gui.Drawing.Attribute},System.String}}) + name.vb: Update(List(Of (Text As String, NameColor As Attribute?, Username As String))) + fullName: EchoHub.Client.UI.ListSources.UserListSource.Update(System.Collections.Generic.List<(string Text, Terminal.Gui.Drawing.Attribute? NameColor, string Username)>) + fullName.vb: EchoHub.Client.UI.ListSources.UserListSource.Update(System.Collections.Generic.List(Of (Text As String, NameColor As Terminal.Gui.Drawing.Attribute?, Username As String))) + nameWithType: UserListSource.Update(List<(string Text, Attribute? NameColor, string Username)>) + nameWithType.vb: UserListSource.Update(List(Of (Text As String, NameColor As Attribute?, Username As String))) - uid: EchoHub.Client.UI.ListSources.UserListSource.Update* name: Update href: api/client/EchoHub.Client.UI.ListSources.UserListSource.html#EchoHub_Client_UI_ListSources_UserListSource_Update_ @@ -4675,12 +5020,24 @@ references: commentId: E:EchoHub.Client.UI.MainWindow.OnAudioPlayRequested fullName: EchoHub.Client.UI.MainWindow.OnAudioPlayRequested nameWithType: MainWindow.OnAudioPlayRequested +- uid: EchoHub.Client.UI.MainWindow.OnChannelJoinRequested + name: OnChannelJoinRequested + href: api/client/EchoHub.Client.UI.MainWindow.html#EchoHub_Client_UI_MainWindow_OnChannelJoinRequested + commentId: E:EchoHub.Client.UI.MainWindow.OnChannelJoinRequested + fullName: EchoHub.Client.UI.MainWindow.OnChannelJoinRequested + nameWithType: MainWindow.OnChannelJoinRequested - uid: EchoHub.Client.UI.MainWindow.OnChannelSelected name: OnChannelSelected href: api/client/EchoHub.Client.UI.MainWindow.html#EchoHub_Client_UI_MainWindow_OnChannelSelected commentId: E:EchoHub.Client.UI.MainWindow.OnChannelSelected fullName: EchoHub.Client.UI.MainWindow.OnChannelSelected nameWithType: MainWindow.OnChannelSelected +- uid: EchoHub.Client.UI.MainWindow.OnCheckForUpdatesRequested + name: OnCheckForUpdatesRequested + href: api/client/EchoHub.Client.UI.MainWindow.html#EchoHub_Client_UI_MainWindow_OnCheckForUpdatesRequested + commentId: E:EchoHub.Client.UI.MainWindow.OnCheckForUpdatesRequested + fullName: EchoHub.Client.UI.MainWindow.OnCheckForUpdatesRequested + nameWithType: MainWindow.OnCheckForUpdatesRequested - uid: EchoHub.Client.UI.MainWindow.OnConnectRequested name: OnConnectRequested href: api/client/EchoHub.Client.UI.MainWindow.html#EchoHub_Client_UI_MainWindow_OnConnectRequested @@ -4729,6 +5086,12 @@ references: commentId: E:EchoHub.Client.UI.MainWindow.OnProfileRequested fullName: EchoHub.Client.UI.MainWindow.OnProfileRequested nameWithType: MainWindow.OnProfileRequested +- uid: EchoHub.Client.UI.MainWindow.OnRollbackRequested + name: OnRollbackRequested + href: api/client/EchoHub.Client.UI.MainWindow.html#EchoHub_Client_UI_MainWindow_OnRollbackRequested + commentId: E:EchoHub.Client.UI.MainWindow.OnRollbackRequested + fullName: EchoHub.Client.UI.MainWindow.OnRollbackRequested + nameWithType: MainWindow.OnRollbackRequested - uid: EchoHub.Client.UI.MainWindow.OnSavedServersRequested name: OnSavedServersRequested href: api/client/EchoHub.Client.UI.MainWindow.html#EchoHub_Client_UI_MainWindow_OnSavedServersRequested @@ -4747,6 +5110,12 @@ references: commentId: E:EchoHub.Client.UI.MainWindow.OnThemeSelected fullName: EchoHub.Client.UI.MainWindow.OnThemeSelected nameWithType: MainWindow.OnThemeSelected +- uid: EchoHub.Client.UI.MainWindow.OnUserProfileRequested + name: OnUserProfileRequested + href: api/client/EchoHub.Client.UI.MainWindow.html#EchoHub_Client_UI_MainWindow_OnUserProfileRequested + commentId: E:EchoHub.Client.UI.MainWindow.OnUserProfileRequested + fullName: EchoHub.Client.UI.MainWindow.OnUserProfileRequested + nameWithType: MainWindow.OnUserProfileRequested - uid: EchoHub.Client.UI.MainWindow.RefreshMenuBar name: RefreshMenuBar() href: api/client/EchoHub.Client.UI.MainWindow.html#EchoHub_Client_UI_MainWindow_RefreshMenuBar @@ -5533,15 +5902,15 @@ references: commentId: Overload:EchoHub.Core.Contracts.IChatBroadcaster.SendUserBannedAsync fullName: EchoHub.Core.Contracts.IChatBroadcaster.SendUserBannedAsync nameWithType: IChatBroadcaster.SendUserBannedAsync -- uid: EchoHub.Core.Contracts.IChatBroadcaster.SendUserJoinedAsync(System.String,System.String,System.String) - name: SendUserJoinedAsync(string, string, string?) - href: api/core/EchoHub.Core.Contracts.IChatBroadcaster.html#EchoHub_Core_Contracts_IChatBroadcaster_SendUserJoinedAsync_System_String_System_String_System_String_ - commentId: M:EchoHub.Core.Contracts.IChatBroadcaster.SendUserJoinedAsync(System.String,System.String,System.String) - name.vb: SendUserJoinedAsync(String, String, String) - fullName: EchoHub.Core.Contracts.IChatBroadcaster.SendUserJoinedAsync(string, string, string?) - fullName.vb: EchoHub.Core.Contracts.IChatBroadcaster.SendUserJoinedAsync(String, String, String) - nameWithType: IChatBroadcaster.SendUserJoinedAsync(string, string, string?) - nameWithType.vb: IChatBroadcaster.SendUserJoinedAsync(String, String, String) +- uid: EchoHub.Core.Contracts.IChatBroadcaster.SendUserJoinedAsync(System.String,System.String,EchoHub.Core.DTOs.UserPresenceDto,System.String) + name: SendUserJoinedAsync(string, string, UserPresenceDto?, string?) + href: api/core/EchoHub.Core.Contracts.IChatBroadcaster.html#EchoHub_Core_Contracts_IChatBroadcaster_SendUserJoinedAsync_System_String_System_String_EchoHub_Core_DTOs_UserPresenceDto_System_String_ + commentId: M:EchoHub.Core.Contracts.IChatBroadcaster.SendUserJoinedAsync(System.String,System.String,EchoHub.Core.DTOs.UserPresenceDto,System.String) + name.vb: SendUserJoinedAsync(String, String, UserPresenceDto, String) + fullName: EchoHub.Core.Contracts.IChatBroadcaster.SendUserJoinedAsync(string, string, EchoHub.Core.DTOs.UserPresenceDto?, string?) + fullName.vb: EchoHub.Core.Contracts.IChatBroadcaster.SendUserJoinedAsync(String, String, EchoHub.Core.DTOs.UserPresenceDto, String) + nameWithType: IChatBroadcaster.SendUserJoinedAsync(string, string, UserPresenceDto?, string?) + nameWithType.vb: IChatBroadcaster.SendUserJoinedAsync(String, String, UserPresenceDto, String) - uid: EchoHub.Core.Contracts.IChatBroadcaster.SendUserJoinedAsync* name: SendUserJoinedAsync href: api/core/EchoHub.Core.Contracts.IChatBroadcaster.html#EchoHub_Core_Contracts_IChatBroadcaster_SendUserJoinedAsync_ @@ -5599,21 +5968,6 @@ references: commentId: T:EchoHub.Core.Contracts.IChatService fullName: EchoHub.Core.Contracts.IChatService nameWithType: IChatService -- uid: EchoHub.Core.Contracts.IChatService.AuthenticateUserAsync(System.String,System.String) - name: AuthenticateUserAsync(string, string) - href: api/core/EchoHub.Core.Contracts.IChatService.html#EchoHub_Core_Contracts_IChatService_AuthenticateUserAsync_System_String_System_String_ - commentId: M:EchoHub.Core.Contracts.IChatService.AuthenticateUserAsync(System.String,System.String) - name.vb: AuthenticateUserAsync(String, String) - fullName: EchoHub.Core.Contracts.IChatService.AuthenticateUserAsync(string, string) - fullName.vb: EchoHub.Core.Contracts.IChatService.AuthenticateUserAsync(String, String) - nameWithType: IChatService.AuthenticateUserAsync(string, string) - nameWithType.vb: IChatService.AuthenticateUserAsync(String, String) -- uid: EchoHub.Core.Contracts.IChatService.AuthenticateUserAsync* - name: AuthenticateUserAsync - href: api/core/EchoHub.Core.Contracts.IChatService.html#EchoHub_Core_Contracts_IChatService_AuthenticateUserAsync_ - commentId: Overload:EchoHub.Core.Contracts.IChatService.AuthenticateUserAsync - fullName: EchoHub.Core.Contracts.IChatService.AuthenticateUserAsync - nameWithType: IChatService.AuthenticateUserAsync - uid: EchoHub.Core.Contracts.IChatService.BroadcastChannelUpdatedAsync(EchoHub.Core.DTOs.ChannelDto,System.String) name: BroadcastChannelUpdatedAsync(ChannelDto, string?) href: api/core/EchoHub.Core.Contracts.IChatService.html#EchoHub_Core_Contracts_IChatService_BroadcastChannelUpdatedAsync_EchoHub_Core_DTOs_ChannelDto_System_String_ @@ -5689,21 +6043,6 @@ references: commentId: Overload:EchoHub.Core.Contracts.IChatService.GetOnlineUsersAsync fullName: EchoHub.Core.Contracts.IChatService.GetOnlineUsersAsync nameWithType: IChatService.GetOnlineUsersAsync -- uid: EchoHub.Core.Contracts.IChatService.GetUserProfileAsync(System.String) - name: GetUserProfileAsync(string) - href: api/core/EchoHub.Core.Contracts.IChatService.html#EchoHub_Core_Contracts_IChatService_GetUserProfileAsync_System_String_ - commentId: M:EchoHub.Core.Contracts.IChatService.GetUserProfileAsync(System.String) - name.vb: GetUserProfileAsync(String) - fullName: EchoHub.Core.Contracts.IChatService.GetUserProfileAsync(string) - fullName.vb: EchoHub.Core.Contracts.IChatService.GetUserProfileAsync(String) - nameWithType: IChatService.GetUserProfileAsync(string) - nameWithType.vb: IChatService.GetUserProfileAsync(String) -- uid: EchoHub.Core.Contracts.IChatService.GetUserProfileAsync* - name: GetUserProfileAsync - href: api/core/EchoHub.Core.Contracts.IChatService.html#EchoHub_Core_Contracts_IChatService_GetUserProfileAsync_ - commentId: Overload:EchoHub.Core.Contracts.IChatService.GetUserProfileAsync - fullName: EchoHub.Core.Contracts.IChatService.GetUserProfileAsync - nameWithType: IChatService.GetUserProfileAsync - 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_ @@ -5899,15 +6238,15 @@ references: commentId: Overload:EchoHub.Core.Contracts.IEchoHubClient.UserBanned fullName: EchoHub.Core.Contracts.IEchoHubClient.UserBanned nameWithType: IEchoHubClient.UserBanned -- uid: EchoHub.Core.Contracts.IEchoHubClient.UserJoined(System.String,System.String) - name: UserJoined(string, string) - href: api/core/EchoHub.Core.Contracts.IEchoHubClient.html#EchoHub_Core_Contracts_IEchoHubClient_UserJoined_System_String_System_String_ - commentId: M:EchoHub.Core.Contracts.IEchoHubClient.UserJoined(System.String,System.String) - name.vb: UserJoined(String, String) - fullName: EchoHub.Core.Contracts.IEchoHubClient.UserJoined(string, string) - fullName.vb: EchoHub.Core.Contracts.IEchoHubClient.UserJoined(String, String) - nameWithType: IEchoHubClient.UserJoined(string, string) - nameWithType.vb: IEchoHubClient.UserJoined(String, String) +- uid: EchoHub.Core.Contracts.IEchoHubClient.UserJoined(System.String,System.String,EchoHub.Core.DTOs.UserPresenceDto) + name: UserJoined(string, string, UserPresenceDto?) + href: api/core/EchoHub.Core.Contracts.IEchoHubClient.html#EchoHub_Core_Contracts_IEchoHubClient_UserJoined_System_String_System_String_EchoHub_Core_DTOs_UserPresenceDto_ + commentId: M:EchoHub.Core.Contracts.IEchoHubClient.UserJoined(System.String,System.String,EchoHub.Core.DTOs.UserPresenceDto) + name.vb: UserJoined(String, String, UserPresenceDto) + fullName: EchoHub.Core.Contracts.IEchoHubClient.UserJoined(string, string, EchoHub.Core.DTOs.UserPresenceDto?) + fullName.vb: EchoHub.Core.Contracts.IEchoHubClient.UserJoined(String, String, EchoHub.Core.DTOs.UserPresenceDto) + nameWithType: IEchoHubClient.UserJoined(string, string, UserPresenceDto?) + nameWithType.vb: IEchoHubClient.UserJoined(String, String, UserPresenceDto) - uid: EchoHub.Core.Contracts.IEchoHubClient.UserJoined* name: UserJoined href: api/core/EchoHub.Core.Contracts.IEchoHubClient.html#EchoHub_Core_Contracts_IEchoHubClient_UserJoined_ @@ -6034,6 +6373,99 @@ references: commentId: Overload:EchoHub.Core.Contracts.IMessageEncryptionService.EncryptNullable fullName: EchoHub.Core.Contracts.IMessageEncryptionService.EncryptNullable nameWithType: IMessageEncryptionService.EncryptNullable +- uid: EchoHub.Core.Contracts.IUserService + name: IUserService + href: api/core/EchoHub.Core.Contracts.IUserService.html + commentId: T:EchoHub.Core.Contracts.IUserService + fullName: EchoHub.Core.Contracts.IUserService + nameWithType: IUserService +- uid: EchoHub.Core.Contracts.IUserService.AuthenticateUserAsync(System.String,System.String) + name: AuthenticateUserAsync(string, string) + href: api/core/EchoHub.Core.Contracts.IUserService.html#EchoHub_Core_Contracts_IUserService_AuthenticateUserAsync_System_String_System_String_ + commentId: M:EchoHub.Core.Contracts.IUserService.AuthenticateUserAsync(System.String,System.String) + name.vb: AuthenticateUserAsync(String, String) + fullName: EchoHub.Core.Contracts.IUserService.AuthenticateUserAsync(string, string) + fullName.vb: EchoHub.Core.Contracts.IUserService.AuthenticateUserAsync(String, String) + nameWithType: IUserService.AuthenticateUserAsync(string, string) + nameWithType.vb: IUserService.AuthenticateUserAsync(String, String) +- uid: EchoHub.Core.Contracts.IUserService.AuthenticateUserAsync* + name: AuthenticateUserAsync + href: api/core/EchoHub.Core.Contracts.IUserService.html#EchoHub_Core_Contracts_IUserService_AuthenticateUserAsync_ + commentId: Overload:EchoHub.Core.Contracts.IUserService.AuthenticateUserAsync + fullName: EchoHub.Core.Contracts.IUserService.AuthenticateUserAsync + nameWithType: IUserService.AuthenticateUserAsync +- uid: EchoHub.Core.Contracts.IUserService.GetUserByIdAsync(System.Guid) + name: GetUserByIdAsync(Guid) + href: api/core/EchoHub.Core.Contracts.IUserService.html#EchoHub_Core_Contracts_IUserService_GetUserByIdAsync_System_Guid_ + commentId: M:EchoHub.Core.Contracts.IUserService.GetUserByIdAsync(System.Guid) + fullName: EchoHub.Core.Contracts.IUserService.GetUserByIdAsync(System.Guid) + nameWithType: IUserService.GetUserByIdAsync(Guid) +- uid: EchoHub.Core.Contracts.IUserService.GetUserByIdAsync* + name: GetUserByIdAsync + href: api/core/EchoHub.Core.Contracts.IUserService.html#EchoHub_Core_Contracts_IUserService_GetUserByIdAsync_ + commentId: Overload:EchoHub.Core.Contracts.IUserService.GetUserByIdAsync + fullName: EchoHub.Core.Contracts.IUserService.GetUserByIdAsync + nameWithType: IUserService.GetUserByIdAsync +- uid: EchoHub.Core.Contracts.IUserService.GetUserProfileAsync(System.String) + name: GetUserProfileAsync(string) + href: api/core/EchoHub.Core.Contracts.IUserService.html#EchoHub_Core_Contracts_IUserService_GetUserProfileAsync_System_String_ + commentId: M:EchoHub.Core.Contracts.IUserService.GetUserProfileAsync(System.String) + name.vb: GetUserProfileAsync(String) + fullName: EchoHub.Core.Contracts.IUserService.GetUserProfileAsync(string) + fullName.vb: EchoHub.Core.Contracts.IUserService.GetUserProfileAsync(String) + nameWithType: IUserService.GetUserProfileAsync(string) + nameWithType.vb: IUserService.GetUserProfileAsync(String) +- uid: EchoHub.Core.Contracts.IUserService.GetUserProfileAsync* + name: GetUserProfileAsync + href: api/core/EchoHub.Core.Contracts.IUserService.html#EchoHub_Core_Contracts_IUserService_GetUserProfileAsync_ + commentId: Overload:EchoHub.Core.Contracts.IUserService.GetUserProfileAsync + fullName: EchoHub.Core.Contracts.IUserService.GetUserProfileAsync + nameWithType: IUserService.GetUserProfileAsync +- uid: EchoHub.Core.Contracts.IUserService.RegisterUserAsync(System.String,System.String,System.String) + name: RegisterUserAsync(string, string, string?) + href: api/core/EchoHub.Core.Contracts.IUserService.html#EchoHub_Core_Contracts_IUserService_RegisterUserAsync_System_String_System_String_System_String_ + commentId: M:EchoHub.Core.Contracts.IUserService.RegisterUserAsync(System.String,System.String,System.String) + name.vb: RegisterUserAsync(String, String, String) + fullName: EchoHub.Core.Contracts.IUserService.RegisterUserAsync(string, string, string?) + fullName.vb: EchoHub.Core.Contracts.IUserService.RegisterUserAsync(String, String, String) + nameWithType: IUserService.RegisterUserAsync(string, string, string?) + nameWithType.vb: IUserService.RegisterUserAsync(String, String, String) +- uid: EchoHub.Core.Contracts.IUserService.RegisterUserAsync* + name: RegisterUserAsync + href: api/core/EchoHub.Core.Contracts.IUserService.html#EchoHub_Core_Contracts_IUserService_RegisterUserAsync_ + commentId: Overload:EchoHub.Core.Contracts.IUserService.RegisterUserAsync + fullName: EchoHub.Core.Contracts.IUserService.RegisterUserAsync + nameWithType: IUserService.RegisterUserAsync +- uid: EchoHub.Core.Contracts.IUserService.SetAvatarAsync(System.Guid,System.String) + name: SetAvatarAsync(Guid, string) + href: api/core/EchoHub.Core.Contracts.IUserService.html#EchoHub_Core_Contracts_IUserService_SetAvatarAsync_System_Guid_System_String_ + commentId: M:EchoHub.Core.Contracts.IUserService.SetAvatarAsync(System.Guid,System.String) + name.vb: SetAvatarAsync(Guid, String) + fullName: EchoHub.Core.Contracts.IUserService.SetAvatarAsync(System.Guid, string) + fullName.vb: EchoHub.Core.Contracts.IUserService.SetAvatarAsync(System.Guid, String) + nameWithType: IUserService.SetAvatarAsync(Guid, string) + nameWithType.vb: IUserService.SetAvatarAsync(Guid, String) +- uid: EchoHub.Core.Contracts.IUserService.SetAvatarAsync* + name: SetAvatarAsync + href: api/core/EchoHub.Core.Contracts.IUserService.html#EchoHub_Core_Contracts_IUserService_SetAvatarAsync_ + commentId: Overload:EchoHub.Core.Contracts.IUserService.SetAvatarAsync + fullName: EchoHub.Core.Contracts.IUserService.SetAvatarAsync + nameWithType: IUserService.SetAvatarAsync +- uid: EchoHub.Core.Contracts.IUserService.UpdateProfileAsync(System.Guid,System.String,System.String,System.String) + name: UpdateProfileAsync(Guid, string?, string?, string?) + href: api/core/EchoHub.Core.Contracts.IUserService.html#EchoHub_Core_Contracts_IUserService_UpdateProfileAsync_System_Guid_System_String_System_String_System_String_ + commentId: M:EchoHub.Core.Contracts.IUserService.UpdateProfileAsync(System.Guid,System.String,System.String,System.String) + name.vb: UpdateProfileAsync(Guid, String, String, String) + fullName: EchoHub.Core.Contracts.IUserService.UpdateProfileAsync(System.Guid, string?, string?, string?) + fullName.vb: EchoHub.Core.Contracts.IUserService.UpdateProfileAsync(System.Guid, String, String, String) + nameWithType: IUserService.UpdateProfileAsync(Guid, string?, string?, string?) + nameWithType.vb: IUserService.UpdateProfileAsync(Guid, String, String, String) +- uid: EchoHub.Core.Contracts.IUserService.UpdateProfileAsync* + name: UpdateProfileAsync + href: api/core/EchoHub.Core.Contracts.IUserService.html#EchoHub_Core_Contracts_IUserService_UpdateProfileAsync_ + commentId: Overload:EchoHub.Core.Contracts.IUserService.UpdateProfileAsync + fullName: EchoHub.Core.Contracts.IUserService.UpdateProfileAsync + nameWithType: IUserService.UpdateProfileAsync - uid: EchoHub.Core.DTOs name: EchoHub.Core.DTOs href: api/core/EchoHub.Core.DTOs.html @@ -7693,15 +8125,15 @@ references: fullName.vb: EchoHub.Core.DTOs.EmbedDto.New(EchoHub.Core.DTOs.EmbedDto) nameWithType: EmbedDto.EmbedDto(EmbedDto) nameWithType.vb: EmbedDto.New(EmbedDto) -- uid: EchoHub.Core.DTOs.EmbedDto.#ctor(System.String,System.String,System.String,System.String,System.String) - name: EmbedDto(string?, string?, string?, string?, string) - href: api/core/EchoHub.Core.DTOs.EmbedDto.html#EchoHub_Core_DTOs_EmbedDto__ctor_System_String_System_String_System_String_System_String_System_String_ - commentId: M:EchoHub.Core.DTOs.EmbedDto.#ctor(System.String,System.String,System.String,System.String,System.String) - name.vb: New(String, String, String, String, String) - fullName: EchoHub.Core.DTOs.EmbedDto.EmbedDto(string?, string?, string?, string?, string) - fullName.vb: EchoHub.Core.DTOs.EmbedDto.New(String, String, String, String, String) - nameWithType: EmbedDto.EmbedDto(string?, string?, string?, string?, string) - nameWithType.vb: EmbedDto.New(String, String, String, String, String) +- uid: EchoHub.Core.DTOs.EmbedDto.#ctor(System.String,System.String,System.String,System.String,System.String,System.String) + name: EmbedDto(string?, string?, string?, string?, string, string?) + href: api/core/EchoHub.Core.DTOs.EmbedDto.html#EchoHub_Core_DTOs_EmbedDto__ctor_System_String_System_String_System_String_System_String_System_String_System_String_ + commentId: M:EchoHub.Core.DTOs.EmbedDto.#ctor(System.String,System.String,System.String,System.String,System.String,System.String) + name.vb: New(String, String, String, String, String, String) + fullName: EchoHub.Core.DTOs.EmbedDto.EmbedDto(string?, string?, string?, string?, string, string?) + fullName.vb: EchoHub.Core.DTOs.EmbedDto.New(String, String, String, String, String, String) + nameWithType: EmbedDto.EmbedDto(string?, string?, string?, string?, string, string?) + nameWithType.vb: EmbedDto.New(String, String, String, String, String, String) - uid: EchoHub.Core.DTOs.EmbedDto.#ctor* name: EmbedDto href: api/core/EchoHub.Core.DTOs.EmbedDto.html#EchoHub_Core_DTOs_EmbedDto__ctor_ @@ -7711,15 +8143,15 @@ references: fullName.vb: EchoHub.Core.DTOs.EmbedDto.New nameWithType: EmbedDto.EmbedDto nameWithType.vb: EmbedDto.New -- uid: EchoHub.Core.DTOs.EmbedDto.Deconstruct(System.String@,System.String@,System.String@,System.String@,System.String@) - name: Deconstruct(out string?, out string?, out string?, out string?, out string) - href: api/core/EchoHub.Core.DTOs.EmbedDto.html#EchoHub_Core_DTOs_EmbedDto_Deconstruct_System_String__System_String__System_String__System_String__System_String__ - commentId: M:EchoHub.Core.DTOs.EmbedDto.Deconstruct(System.String@,System.String@,System.String@,System.String@,System.String@) - name.vb: Deconstruct(String, String, String, String, String) - fullName: EchoHub.Core.DTOs.EmbedDto.Deconstruct(out string?, out string?, out string?, out string?, out string) - fullName.vb: EchoHub.Core.DTOs.EmbedDto.Deconstruct(String, String, String, String, String) - nameWithType: EmbedDto.Deconstruct(out string?, out string?, out string?, out string?, out string) - nameWithType.vb: EmbedDto.Deconstruct(String, String, String, String, String) +- uid: EchoHub.Core.DTOs.EmbedDto.Deconstruct(System.String@,System.String@,System.String@,System.String@,System.String@,System.String@) + name: Deconstruct(out string?, out string?, out string?, out string?, out string, out string?) + href: api/core/EchoHub.Core.DTOs.EmbedDto.html#EchoHub_Core_DTOs_EmbedDto_Deconstruct_System_String__System_String__System_String__System_String__System_String__System_String__ + commentId: M:EchoHub.Core.DTOs.EmbedDto.Deconstruct(System.String@,System.String@,System.String@,System.String@,System.String@,System.String@) + name.vb: Deconstruct(String, String, String, String, String, String) + fullName: EchoHub.Core.DTOs.EmbedDto.Deconstruct(out string?, out string?, out string?, out string?, out string, out string?) + fullName.vb: EchoHub.Core.DTOs.EmbedDto.Deconstruct(String, String, String, String, String, String) + nameWithType: EmbedDto.Deconstruct(out string?, out string?, out string?, out string?, out string, out string?) + nameWithType.vb: EmbedDto.Deconstruct(String, String, String, String, String, String) - uid: EchoHub.Core.DTOs.EmbedDto.Deconstruct* name: Deconstruct href: api/core/EchoHub.Core.DTOs.EmbedDto.html#EchoHub_Core_DTOs_EmbedDto_Deconstruct_ @@ -7822,6 +8254,18 @@ references: commentId: Overload:EchoHub.Core.DTOs.EmbedDto.SiteName fullName: EchoHub.Core.DTOs.EmbedDto.SiteName nameWithType: EmbedDto.SiteName +- uid: EchoHub.Core.DTOs.EmbedDto.ThemeColor + name: ThemeColor + href: api/core/EchoHub.Core.DTOs.EmbedDto.html#EchoHub_Core_DTOs_EmbedDto_ThemeColor + commentId: P:EchoHub.Core.DTOs.EmbedDto.ThemeColor + fullName: EchoHub.Core.DTOs.EmbedDto.ThemeColor + nameWithType: EmbedDto.ThemeColor +- uid: EchoHub.Core.DTOs.EmbedDto.ThemeColor* + name: ThemeColor + href: api/core/EchoHub.Core.DTOs.EmbedDto.html#EchoHub_Core_DTOs_EmbedDto_ThemeColor_ + commentId: Overload:EchoHub.Core.DTOs.EmbedDto.ThemeColor + fullName: EchoHub.Core.DTOs.EmbedDto.ThemeColor + nameWithType: EmbedDto.ThemeColor - uid: EchoHub.Core.DTOs.EmbedDto.Title name: Title href: api/core/EchoHub.Core.DTOs.EmbedDto.html#EchoHub_Core_DTOs_EmbedDto_Title @@ -8242,6 +8686,198 @@ references: fullName.vb: EchoHub.Core.DTOs.ErrorResponse.<> nameWithType: ErrorResponse.operator != nameWithType.vb: ErrorResponse.<> +- uid: EchoHub.Core.DTOs.JoinChannelResult + name: JoinChannelResult + href: api/core/EchoHub.Core.DTOs.JoinChannelResult.html + commentId: T:EchoHub.Core.DTOs.JoinChannelResult + fullName: EchoHub.Core.DTOs.JoinChannelResult + nameWithType: JoinChannelResult +- uid: EchoHub.Core.DTOs.JoinChannelResult.#ctor(EchoHub.Core.DTOs.JoinChannelResult) + name: JoinChannelResult(JoinChannelResult) + href: api/core/EchoHub.Core.DTOs.JoinChannelResult.html#EchoHub_Core_DTOs_JoinChannelResult__ctor_EchoHub_Core_DTOs_JoinChannelResult_ + commentId: M:EchoHub.Core.DTOs.JoinChannelResult.#ctor(EchoHub.Core.DTOs.JoinChannelResult) + name.vb: New(JoinChannelResult) + fullName: EchoHub.Core.DTOs.JoinChannelResult.JoinChannelResult(EchoHub.Core.DTOs.JoinChannelResult) + 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* + name: JoinChannelResult + href: api/core/EchoHub.Core.DTOs.JoinChannelResult.html#EchoHub_Core_DTOs_JoinChannelResult__ctor_ + commentId: Overload:EchoHub.Core.DTOs.JoinChannelResult.#ctor + name.vb: New + fullName: EchoHub.Core.DTOs.JoinChannelResult.JoinChannelResult + 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* + 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.EqualityContract + name: EqualityContract + href: api/core/EchoHub.Core.DTOs.JoinChannelResult.html#EchoHub_Core_DTOs_JoinChannelResult_EqualityContract + commentId: P:EchoHub.Core.DTOs.JoinChannelResult.EqualityContract + fullName: EchoHub.Core.DTOs.JoinChannelResult.EqualityContract + nameWithType: JoinChannelResult.EqualityContract +- uid: EchoHub.Core.DTOs.JoinChannelResult.EqualityContract* + name: EqualityContract + href: api/core/EchoHub.Core.DTOs.JoinChannelResult.html#EchoHub_Core_DTOs_JoinChannelResult_EqualityContract_ + commentId: Overload:EchoHub.Core.DTOs.JoinChannelResult.EqualityContract + fullName: EchoHub.Core.DTOs.JoinChannelResult.EqualityContract + nameWithType: JoinChannelResult.EqualityContract +- uid: EchoHub.Core.DTOs.JoinChannelResult.Equals(EchoHub.Core.DTOs.JoinChannelResult) + name: Equals(JoinChannelResult?) + href: api/core/EchoHub.Core.DTOs.JoinChannelResult.html#EchoHub_Core_DTOs_JoinChannelResult_Equals_EchoHub_Core_DTOs_JoinChannelResult_ + commentId: M:EchoHub.Core.DTOs.JoinChannelResult.Equals(EchoHub.Core.DTOs.JoinChannelResult) + name.vb: Equals(JoinChannelResult) + fullName: EchoHub.Core.DTOs.JoinChannelResult.Equals(EchoHub.Core.DTOs.JoinChannelResult?) + fullName.vb: EchoHub.Core.DTOs.JoinChannelResult.Equals(EchoHub.Core.DTOs.JoinChannelResult) + nameWithType: JoinChannelResult.Equals(JoinChannelResult?) + nameWithType.vb: JoinChannelResult.Equals(JoinChannelResult) +- uid: EchoHub.Core.DTOs.JoinChannelResult.Equals(System.Object) + name: Equals(object?) + href: api/core/EchoHub.Core.DTOs.JoinChannelResult.html#EchoHub_Core_DTOs_JoinChannelResult_Equals_System_Object_ + commentId: M:EchoHub.Core.DTOs.JoinChannelResult.Equals(System.Object) + name.vb: Equals(Object) + fullName: EchoHub.Core.DTOs.JoinChannelResult.Equals(object?) + fullName.vb: EchoHub.Core.DTOs.JoinChannelResult.Equals(Object) + nameWithType: JoinChannelResult.Equals(object?) + nameWithType.vb: JoinChannelResult.Equals(Object) +- uid: EchoHub.Core.DTOs.JoinChannelResult.Equals* + name: Equals + href: api/core/EchoHub.Core.DTOs.JoinChannelResult.html#EchoHub_Core_DTOs_JoinChannelResult_Equals_ + commentId: Overload:EchoHub.Core.DTOs.JoinChannelResult.Equals + fullName: EchoHub.Core.DTOs.JoinChannelResult.Equals + nameWithType: JoinChannelResult.Equals +- uid: EchoHub.Core.DTOs.JoinChannelResult.Error + name: Error + href: api/core/EchoHub.Core.DTOs.JoinChannelResult.html#EchoHub_Core_DTOs_JoinChannelResult_Error + commentId: P:EchoHub.Core.DTOs.JoinChannelResult.Error + fullName: EchoHub.Core.DTOs.JoinChannelResult.Error + nameWithType: JoinChannelResult.Error +- uid: EchoHub.Core.DTOs.JoinChannelResult.Error* + name: Error + href: api/core/EchoHub.Core.DTOs.JoinChannelResult.html#EchoHub_Core_DTOs_JoinChannelResult_Error_ + commentId: Overload:EchoHub.Core.DTOs.JoinChannelResult.Error + fullName: EchoHub.Core.DTOs.JoinChannelResult.Error + nameWithType: JoinChannelResult.Error +- uid: EchoHub.Core.DTOs.JoinChannelResult.GetHashCode + name: GetHashCode() + href: api/core/EchoHub.Core.DTOs.JoinChannelResult.html#EchoHub_Core_DTOs_JoinChannelResult_GetHashCode + commentId: M:EchoHub.Core.DTOs.JoinChannelResult.GetHashCode + fullName: EchoHub.Core.DTOs.JoinChannelResult.GetHashCode() + nameWithType: JoinChannelResult.GetHashCode() +- uid: EchoHub.Core.DTOs.JoinChannelResult.GetHashCode* + name: GetHashCode + href: api/core/EchoHub.Core.DTOs.JoinChannelResult.html#EchoHub_Core_DTOs_JoinChannelResult_GetHashCode_ + commentId: Overload:EchoHub.Core.DTOs.JoinChannelResult.GetHashCode + fullName: EchoHub.Core.DTOs.JoinChannelResult.GetHashCode + nameWithType: JoinChannelResult.GetHashCode +- uid: EchoHub.Core.DTOs.JoinChannelResult.History + name: History + href: api/core/EchoHub.Core.DTOs.JoinChannelResult.html#EchoHub_Core_DTOs_JoinChannelResult_History + commentId: P:EchoHub.Core.DTOs.JoinChannelResult.History + fullName: EchoHub.Core.DTOs.JoinChannelResult.History + nameWithType: JoinChannelResult.History +- uid: EchoHub.Core.DTOs.JoinChannelResult.History* + name: History + href: api/core/EchoHub.Core.DTOs.JoinChannelResult.html#EchoHub_Core_DTOs_JoinChannelResult_History_ + commentId: Overload:EchoHub.Core.DTOs.JoinChannelResult.History + fullName: EchoHub.Core.DTOs.JoinChannelResult.History + nameWithType: JoinChannelResult.History +- 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_ + commentId: M:EchoHub.Core.DTOs.JoinChannelResult.PrintMembers(System.Text.StringBuilder) + fullName: EchoHub.Core.DTOs.JoinChannelResult.PrintMembers(System.Text.StringBuilder) + nameWithType: JoinChannelResult.PrintMembers(StringBuilder) +- uid: EchoHub.Core.DTOs.JoinChannelResult.PrintMembers* + name: PrintMembers + href: api/core/EchoHub.Core.DTOs.JoinChannelResult.html#EchoHub_Core_DTOs_JoinChannelResult_PrintMembers_ + commentId: Overload:EchoHub.Core.DTOs.JoinChannelResult.PrintMembers + fullName: EchoHub.Core.DTOs.JoinChannelResult.PrintMembers + nameWithType: JoinChannelResult.PrintMembers +- uid: EchoHub.Core.DTOs.JoinChannelResult.Success + name: Success + href: api/core/EchoHub.Core.DTOs.JoinChannelResult.html#EchoHub_Core_DTOs_JoinChannelResult_Success + commentId: P:EchoHub.Core.DTOs.JoinChannelResult.Success + fullName: EchoHub.Core.DTOs.JoinChannelResult.Success + nameWithType: JoinChannelResult.Success +- uid: EchoHub.Core.DTOs.JoinChannelResult.Success* + name: Success + href: api/core/EchoHub.Core.DTOs.JoinChannelResult.html#EchoHub_Core_DTOs_JoinChannelResult_Success_ + commentId: Overload:EchoHub.Core.DTOs.JoinChannelResult.Success + fullName: EchoHub.Core.DTOs.JoinChannelResult.Success + nameWithType: JoinChannelResult.Success +- uid: EchoHub.Core.DTOs.JoinChannelResult.ToString + name: ToString() + href: api/core/EchoHub.Core.DTOs.JoinChannelResult.html#EchoHub_Core_DTOs_JoinChannelResult_ToString + commentId: M:EchoHub.Core.DTOs.JoinChannelResult.ToString + fullName: EchoHub.Core.DTOs.JoinChannelResult.ToString() + nameWithType: JoinChannelResult.ToString() +- uid: EchoHub.Core.DTOs.JoinChannelResult.ToString* + name: ToString + href: api/core/EchoHub.Core.DTOs.JoinChannelResult.html#EchoHub_Core_DTOs_JoinChannelResult_ToString_ + commentId: Overload:EchoHub.Core.DTOs.JoinChannelResult.ToString + fullName: EchoHub.Core.DTOs.JoinChannelResult.ToString + nameWithType: JoinChannelResult.ToString +- 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_ + commentId: M:EchoHub.Core.DTOs.JoinChannelResult.op_Equality(EchoHub.Core.DTOs.JoinChannelResult,EchoHub.Core.DTOs.JoinChannelResult) + name.vb: =(JoinChannelResult, JoinChannelResult) + fullName: EchoHub.Core.DTOs.JoinChannelResult.operator ==(EchoHub.Core.DTOs.JoinChannelResult?, EchoHub.Core.DTOs.JoinChannelResult?) + fullName.vb: EchoHub.Core.DTOs.JoinChannelResult.=(EchoHub.Core.DTOs.JoinChannelResult, EchoHub.Core.DTOs.JoinChannelResult) + nameWithType: JoinChannelResult.operator ==(JoinChannelResult?, JoinChannelResult?) + nameWithType.vb: JoinChannelResult.=(JoinChannelResult, JoinChannelResult) +- uid: EchoHub.Core.DTOs.JoinChannelResult.op_Equality* + name: operator == + href: api/core/EchoHub.Core.DTOs.JoinChannelResult.html#EchoHub_Core_DTOs_JoinChannelResult_op_Equality_ + commentId: Overload:EchoHub.Core.DTOs.JoinChannelResult.op_Equality + name.vb: = + fullName: EchoHub.Core.DTOs.JoinChannelResult.operator == + fullName.vb: EchoHub.Core.DTOs.JoinChannelResult.= + nameWithType: JoinChannelResult.operator == + nameWithType.vb: JoinChannelResult.= +- uid: EchoHub.Core.DTOs.JoinChannelResult.op_Inequality(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_Inequality_EchoHub_Core_DTOs_JoinChannelResult_EchoHub_Core_DTOs_JoinChannelResult_ + commentId: M:EchoHub.Core.DTOs.JoinChannelResult.op_Inequality(EchoHub.Core.DTOs.JoinChannelResult,EchoHub.Core.DTOs.JoinChannelResult) + name.vb: <>(JoinChannelResult, JoinChannelResult) + fullName: EchoHub.Core.DTOs.JoinChannelResult.operator !=(EchoHub.Core.DTOs.JoinChannelResult?, EchoHub.Core.DTOs.JoinChannelResult?) + fullName.vb: EchoHub.Core.DTOs.JoinChannelResult.<>(EchoHub.Core.DTOs.JoinChannelResult, EchoHub.Core.DTOs.JoinChannelResult) + nameWithType: JoinChannelResult.operator !=(JoinChannelResult?, JoinChannelResult?) + nameWithType.vb: JoinChannelResult.<>(JoinChannelResult, JoinChannelResult) +- uid: EchoHub.Core.DTOs.JoinChannelResult.op_Inequality* + name: operator != + href: api/core/EchoHub.Core.DTOs.JoinChannelResult.html#EchoHub_Core_DTOs_JoinChannelResult_op_Inequality_ + commentId: Overload:EchoHub.Core.DTOs.JoinChannelResult.op_Inequality + name.vb: <> + fullName: EchoHub.Core.DTOs.JoinChannelResult.operator != + fullName.vb: EchoHub.Core.DTOs.JoinChannelResult.<> + nameWithType: JoinChannelResult.operator != + nameWithType.vb: JoinChannelResult.<> - uid: EchoHub.Core.DTOs.KickRequest name: KickRequest href: api/core/EchoHub.Core.DTOs.KickRequest.html @@ -11209,6 +11845,273 @@ references: fullName.vb: EchoHub.Core.DTOs.UserDto.<> nameWithType: UserDto.operator != nameWithType.vb: UserDto.<> +- uid: EchoHub.Core.DTOs.UserError + name: UserError + href: api/core/EchoHub.Core.DTOs.UserError.html + commentId: T:EchoHub.Core.DTOs.UserError + fullName: EchoHub.Core.DTOs.UserError + nameWithType: UserError +- uid: EchoHub.Core.DTOs.UserError.AlreadyExists + name: AlreadyExists + href: api/core/EchoHub.Core.DTOs.UserError.html#EchoHub_Core_DTOs_UserError_AlreadyExists + commentId: F:EchoHub.Core.DTOs.UserError.AlreadyExists + fullName: EchoHub.Core.DTOs.UserError.AlreadyExists + nameWithType: UserError.AlreadyExists +- uid: EchoHub.Core.DTOs.UserError.Banned + name: Banned + href: api/core/EchoHub.Core.DTOs.UserError.html#EchoHub_Core_DTOs_UserError_Banned + commentId: F:EchoHub.Core.DTOs.UserError.Banned + fullName: EchoHub.Core.DTOs.UserError.Banned + nameWithType: UserError.Banned +- uid: EchoHub.Core.DTOs.UserError.InvalidCredentials + name: InvalidCredentials + href: api/core/EchoHub.Core.DTOs.UserError.html#EchoHub_Core_DTOs_UserError_InvalidCredentials + commentId: F:EchoHub.Core.DTOs.UserError.InvalidCredentials + fullName: EchoHub.Core.DTOs.UserError.InvalidCredentials + nameWithType: UserError.InvalidCredentials +- uid: EchoHub.Core.DTOs.UserError.NotFound + name: NotFound + href: api/core/EchoHub.Core.DTOs.UserError.html#EchoHub_Core_DTOs_UserError_NotFound + commentId: F:EchoHub.Core.DTOs.UserError.NotFound + fullName: EchoHub.Core.DTOs.UserError.NotFound + nameWithType: UserError.NotFound +- uid: EchoHub.Core.DTOs.UserError.ValidationFailed + name: ValidationFailed + href: api/core/EchoHub.Core.DTOs.UserError.html#EchoHub_Core_DTOs_UserError_ValidationFailed + commentId: F:EchoHub.Core.DTOs.UserError.ValidationFailed + fullName: EchoHub.Core.DTOs.UserError.ValidationFailed + nameWithType: UserError.ValidationFailed +- uid: EchoHub.Core.DTOs.UserOperationResult + name: UserOperationResult + href: api/core/EchoHub.Core.DTOs.UserOperationResult.html + commentId: T:EchoHub.Core.DTOs.UserOperationResult + fullName: EchoHub.Core.DTOs.UserOperationResult + nameWithType: UserOperationResult +- uid: EchoHub.Core.DTOs.UserOperationResult.#ctor(EchoHub.Core.DTOs.UserOperationResult) + name: UserOperationResult(UserOperationResult) + href: api/core/EchoHub.Core.DTOs.UserOperationResult.html#EchoHub_Core_DTOs_UserOperationResult__ctor_EchoHub_Core_DTOs_UserOperationResult_ + commentId: M:EchoHub.Core.DTOs.UserOperationResult.#ctor(EchoHub.Core.DTOs.UserOperationResult) + name.vb: New(UserOperationResult) + fullName: EchoHub.Core.DTOs.UserOperationResult.UserOperationResult(EchoHub.Core.DTOs.UserOperationResult) + fullName.vb: EchoHub.Core.DTOs.UserOperationResult.New(EchoHub.Core.DTOs.UserOperationResult) + nameWithType: UserOperationResult.UserOperationResult(UserOperationResult) + nameWithType.vb: UserOperationResult.New(UserOperationResult) +- uid: EchoHub.Core.DTOs.UserOperationResult.#ctor(EchoHub.Core.DTOs.UserProfileDto,System.Nullable{EchoHub.Core.DTOs.UserError},System.String) + name: UserOperationResult(UserProfileDto?, UserError?, string?) + href: api/core/EchoHub.Core.DTOs.UserOperationResult.html#EchoHub_Core_DTOs_UserOperationResult__ctor_EchoHub_Core_DTOs_UserProfileDto_System_Nullable_EchoHub_Core_DTOs_UserError__System_String_ + commentId: M:EchoHub.Core.DTOs.UserOperationResult.#ctor(EchoHub.Core.DTOs.UserProfileDto,System.Nullable{EchoHub.Core.DTOs.UserError},System.String) + name.vb: New(UserProfileDto, UserError?, String) + fullName: EchoHub.Core.DTOs.UserOperationResult.UserOperationResult(EchoHub.Core.DTOs.UserProfileDto?, EchoHub.Core.DTOs.UserError?, string?) + fullName.vb: EchoHub.Core.DTOs.UserOperationResult.New(EchoHub.Core.DTOs.UserProfileDto, EchoHub.Core.DTOs.UserError?, String) + nameWithType: UserOperationResult.UserOperationResult(UserProfileDto?, UserError?, string?) + nameWithType.vb: UserOperationResult.New(UserProfileDto, UserError?, String) +- uid: EchoHub.Core.DTOs.UserOperationResult.#ctor* + name: UserOperationResult + href: api/core/EchoHub.Core.DTOs.UserOperationResult.html#EchoHub_Core_DTOs_UserOperationResult__ctor_ + commentId: Overload:EchoHub.Core.DTOs.UserOperationResult.#ctor + name.vb: New + fullName: EchoHub.Core.DTOs.UserOperationResult.UserOperationResult + fullName.vb: EchoHub.Core.DTOs.UserOperationResult.New + nameWithType: UserOperationResult.UserOperationResult + nameWithType.vb: UserOperationResult.New +- uid: EchoHub.Core.DTOs.UserOperationResult.Deconstruct(EchoHub.Core.DTOs.UserProfileDto@,System.Nullable{EchoHub.Core.DTOs.UserError}@,System.String@) + name: Deconstruct(out UserProfileDto?, out UserError?, out string?) + href: api/core/EchoHub.Core.DTOs.UserOperationResult.html#EchoHub_Core_DTOs_UserOperationResult_Deconstruct_EchoHub_Core_DTOs_UserProfileDto__System_Nullable_EchoHub_Core_DTOs_UserError___System_String__ + commentId: M:EchoHub.Core.DTOs.UserOperationResult.Deconstruct(EchoHub.Core.DTOs.UserProfileDto@,System.Nullable{EchoHub.Core.DTOs.UserError}@,System.String@) + name.vb: Deconstruct(UserProfileDto, UserError?, String) + fullName: EchoHub.Core.DTOs.UserOperationResult.Deconstruct(out EchoHub.Core.DTOs.UserProfileDto?, out EchoHub.Core.DTOs.UserError?, out string?) + fullName.vb: EchoHub.Core.DTOs.UserOperationResult.Deconstruct(EchoHub.Core.DTOs.UserProfileDto, EchoHub.Core.DTOs.UserError?, String) + nameWithType: UserOperationResult.Deconstruct(out UserProfileDto?, out UserError?, out string?) + nameWithType.vb: UserOperationResult.Deconstruct(UserProfileDto, UserError?, String) +- uid: EchoHub.Core.DTOs.UserOperationResult.Deconstruct* + name: Deconstruct + href: api/core/EchoHub.Core.DTOs.UserOperationResult.html#EchoHub_Core_DTOs_UserOperationResult_Deconstruct_ + commentId: Overload:EchoHub.Core.DTOs.UserOperationResult.Deconstruct + fullName: EchoHub.Core.DTOs.UserOperationResult.Deconstruct + nameWithType: UserOperationResult.Deconstruct +- uid: EchoHub.Core.DTOs.UserOperationResult.EqualityContract + name: EqualityContract + href: api/core/EchoHub.Core.DTOs.UserOperationResult.html#EchoHub_Core_DTOs_UserOperationResult_EqualityContract + commentId: P:EchoHub.Core.DTOs.UserOperationResult.EqualityContract + fullName: EchoHub.Core.DTOs.UserOperationResult.EqualityContract + nameWithType: UserOperationResult.EqualityContract +- uid: EchoHub.Core.DTOs.UserOperationResult.EqualityContract* + name: EqualityContract + href: api/core/EchoHub.Core.DTOs.UserOperationResult.html#EchoHub_Core_DTOs_UserOperationResult_EqualityContract_ + commentId: Overload:EchoHub.Core.DTOs.UserOperationResult.EqualityContract + fullName: EchoHub.Core.DTOs.UserOperationResult.EqualityContract + nameWithType: UserOperationResult.EqualityContract +- uid: EchoHub.Core.DTOs.UserOperationResult.Equals(EchoHub.Core.DTOs.UserOperationResult) + name: Equals(UserOperationResult?) + href: api/core/EchoHub.Core.DTOs.UserOperationResult.html#EchoHub_Core_DTOs_UserOperationResult_Equals_EchoHub_Core_DTOs_UserOperationResult_ + commentId: M:EchoHub.Core.DTOs.UserOperationResult.Equals(EchoHub.Core.DTOs.UserOperationResult) + name.vb: Equals(UserOperationResult) + fullName: EchoHub.Core.DTOs.UserOperationResult.Equals(EchoHub.Core.DTOs.UserOperationResult?) + fullName.vb: EchoHub.Core.DTOs.UserOperationResult.Equals(EchoHub.Core.DTOs.UserOperationResult) + nameWithType: UserOperationResult.Equals(UserOperationResult?) + nameWithType.vb: UserOperationResult.Equals(UserOperationResult) +- uid: EchoHub.Core.DTOs.UserOperationResult.Equals(System.Object) + name: Equals(object?) + href: api/core/EchoHub.Core.DTOs.UserOperationResult.html#EchoHub_Core_DTOs_UserOperationResult_Equals_System_Object_ + commentId: M:EchoHub.Core.DTOs.UserOperationResult.Equals(System.Object) + name.vb: Equals(Object) + fullName: EchoHub.Core.DTOs.UserOperationResult.Equals(object?) + fullName.vb: EchoHub.Core.DTOs.UserOperationResult.Equals(Object) + nameWithType: UserOperationResult.Equals(object?) + nameWithType.vb: UserOperationResult.Equals(Object) +- uid: EchoHub.Core.DTOs.UserOperationResult.Equals* + name: Equals + href: api/core/EchoHub.Core.DTOs.UserOperationResult.html#EchoHub_Core_DTOs_UserOperationResult_Equals_ + commentId: Overload:EchoHub.Core.DTOs.UserOperationResult.Equals + fullName: EchoHub.Core.DTOs.UserOperationResult.Equals + nameWithType: UserOperationResult.Equals +- uid: EchoHub.Core.DTOs.UserOperationResult.Error + name: Error + href: api/core/EchoHub.Core.DTOs.UserOperationResult.html#EchoHub_Core_DTOs_UserOperationResult_Error + commentId: P:EchoHub.Core.DTOs.UserOperationResult.Error + fullName: EchoHub.Core.DTOs.UserOperationResult.Error + nameWithType: UserOperationResult.Error +- uid: EchoHub.Core.DTOs.UserOperationResult.Error* + name: Error + href: api/core/EchoHub.Core.DTOs.UserOperationResult.html#EchoHub_Core_DTOs_UserOperationResult_Error_ + commentId: Overload:EchoHub.Core.DTOs.UserOperationResult.Error + fullName: EchoHub.Core.DTOs.UserOperationResult.Error + nameWithType: UserOperationResult.Error +- uid: EchoHub.Core.DTOs.UserOperationResult.ErrorMessage + name: ErrorMessage + href: api/core/EchoHub.Core.DTOs.UserOperationResult.html#EchoHub_Core_DTOs_UserOperationResult_ErrorMessage + commentId: P:EchoHub.Core.DTOs.UserOperationResult.ErrorMessage + fullName: EchoHub.Core.DTOs.UserOperationResult.ErrorMessage + nameWithType: UserOperationResult.ErrorMessage +- uid: EchoHub.Core.DTOs.UserOperationResult.ErrorMessage* + name: ErrorMessage + href: api/core/EchoHub.Core.DTOs.UserOperationResult.html#EchoHub_Core_DTOs_UserOperationResult_ErrorMessage_ + commentId: Overload:EchoHub.Core.DTOs.UserOperationResult.ErrorMessage + fullName: EchoHub.Core.DTOs.UserOperationResult.ErrorMessage + nameWithType: UserOperationResult.ErrorMessage +- uid: EchoHub.Core.DTOs.UserOperationResult.Fail(EchoHub.Core.DTOs.UserError,System.String) + name: Fail(UserError, string) + href: api/core/EchoHub.Core.DTOs.UserOperationResult.html#EchoHub_Core_DTOs_UserOperationResult_Fail_EchoHub_Core_DTOs_UserError_System_String_ + commentId: M:EchoHub.Core.DTOs.UserOperationResult.Fail(EchoHub.Core.DTOs.UserError,System.String) + name.vb: Fail(UserError, String) + fullName: EchoHub.Core.DTOs.UserOperationResult.Fail(EchoHub.Core.DTOs.UserError, string) + fullName.vb: EchoHub.Core.DTOs.UserOperationResult.Fail(EchoHub.Core.DTOs.UserError, String) + nameWithType: UserOperationResult.Fail(UserError, string) + nameWithType.vb: UserOperationResult.Fail(UserError, String) +- uid: EchoHub.Core.DTOs.UserOperationResult.Fail* + name: Fail + href: api/core/EchoHub.Core.DTOs.UserOperationResult.html#EchoHub_Core_DTOs_UserOperationResult_Fail_ + commentId: Overload:EchoHub.Core.DTOs.UserOperationResult.Fail + fullName: EchoHub.Core.DTOs.UserOperationResult.Fail + nameWithType: UserOperationResult.Fail +- uid: EchoHub.Core.DTOs.UserOperationResult.GetHashCode + name: GetHashCode() + href: api/core/EchoHub.Core.DTOs.UserOperationResult.html#EchoHub_Core_DTOs_UserOperationResult_GetHashCode + commentId: M:EchoHub.Core.DTOs.UserOperationResult.GetHashCode + fullName: EchoHub.Core.DTOs.UserOperationResult.GetHashCode() + nameWithType: UserOperationResult.GetHashCode() +- uid: EchoHub.Core.DTOs.UserOperationResult.GetHashCode* + name: GetHashCode + href: api/core/EchoHub.Core.DTOs.UserOperationResult.html#EchoHub_Core_DTOs_UserOperationResult_GetHashCode_ + commentId: Overload:EchoHub.Core.DTOs.UserOperationResult.GetHashCode + fullName: EchoHub.Core.DTOs.UserOperationResult.GetHashCode + nameWithType: UserOperationResult.GetHashCode +- uid: EchoHub.Core.DTOs.UserOperationResult.IsSuccess + name: IsSuccess + href: api/core/EchoHub.Core.DTOs.UserOperationResult.html#EchoHub_Core_DTOs_UserOperationResult_IsSuccess + commentId: P:EchoHub.Core.DTOs.UserOperationResult.IsSuccess + fullName: EchoHub.Core.DTOs.UserOperationResult.IsSuccess + nameWithType: UserOperationResult.IsSuccess +- uid: EchoHub.Core.DTOs.UserOperationResult.IsSuccess* + name: IsSuccess + href: api/core/EchoHub.Core.DTOs.UserOperationResult.html#EchoHub_Core_DTOs_UserOperationResult_IsSuccess_ + commentId: Overload:EchoHub.Core.DTOs.UserOperationResult.IsSuccess + fullName: EchoHub.Core.DTOs.UserOperationResult.IsSuccess + nameWithType: UserOperationResult.IsSuccess +- uid: EchoHub.Core.DTOs.UserOperationResult.PrintMembers(System.Text.StringBuilder) + name: PrintMembers(StringBuilder) + href: api/core/EchoHub.Core.DTOs.UserOperationResult.html#EchoHub_Core_DTOs_UserOperationResult_PrintMembers_System_Text_StringBuilder_ + commentId: M:EchoHub.Core.DTOs.UserOperationResult.PrintMembers(System.Text.StringBuilder) + fullName: EchoHub.Core.DTOs.UserOperationResult.PrintMembers(System.Text.StringBuilder) + nameWithType: UserOperationResult.PrintMembers(StringBuilder) +- uid: EchoHub.Core.DTOs.UserOperationResult.PrintMembers* + name: PrintMembers + href: api/core/EchoHub.Core.DTOs.UserOperationResult.html#EchoHub_Core_DTOs_UserOperationResult_PrintMembers_ + commentId: Overload:EchoHub.Core.DTOs.UserOperationResult.PrintMembers + fullName: EchoHub.Core.DTOs.UserOperationResult.PrintMembers + nameWithType: UserOperationResult.PrintMembers +- uid: EchoHub.Core.DTOs.UserOperationResult.Success(EchoHub.Core.DTOs.UserProfileDto) + name: Success(UserProfileDto) + href: api/core/EchoHub.Core.DTOs.UserOperationResult.html#EchoHub_Core_DTOs_UserOperationResult_Success_EchoHub_Core_DTOs_UserProfileDto_ + commentId: M:EchoHub.Core.DTOs.UserOperationResult.Success(EchoHub.Core.DTOs.UserProfileDto) + fullName: EchoHub.Core.DTOs.UserOperationResult.Success(EchoHub.Core.DTOs.UserProfileDto) + nameWithType: UserOperationResult.Success(UserProfileDto) +- uid: EchoHub.Core.DTOs.UserOperationResult.Success* + name: Success + href: api/core/EchoHub.Core.DTOs.UserOperationResult.html#EchoHub_Core_DTOs_UserOperationResult_Success_ + commentId: Overload:EchoHub.Core.DTOs.UserOperationResult.Success + fullName: EchoHub.Core.DTOs.UserOperationResult.Success + nameWithType: UserOperationResult.Success +- uid: EchoHub.Core.DTOs.UserOperationResult.ToString + name: ToString() + href: api/core/EchoHub.Core.DTOs.UserOperationResult.html#EchoHub_Core_DTOs_UserOperationResult_ToString + commentId: M:EchoHub.Core.DTOs.UserOperationResult.ToString + fullName: EchoHub.Core.DTOs.UserOperationResult.ToString() + nameWithType: UserOperationResult.ToString() +- uid: EchoHub.Core.DTOs.UserOperationResult.ToString* + name: ToString + href: api/core/EchoHub.Core.DTOs.UserOperationResult.html#EchoHub_Core_DTOs_UserOperationResult_ToString_ + commentId: Overload:EchoHub.Core.DTOs.UserOperationResult.ToString + fullName: EchoHub.Core.DTOs.UserOperationResult.ToString + nameWithType: UserOperationResult.ToString +- uid: EchoHub.Core.DTOs.UserOperationResult.User + name: User + href: api/core/EchoHub.Core.DTOs.UserOperationResult.html#EchoHub_Core_DTOs_UserOperationResult_User + commentId: P:EchoHub.Core.DTOs.UserOperationResult.User + fullName: EchoHub.Core.DTOs.UserOperationResult.User + nameWithType: UserOperationResult.User +- uid: EchoHub.Core.DTOs.UserOperationResult.User* + name: User + href: api/core/EchoHub.Core.DTOs.UserOperationResult.html#EchoHub_Core_DTOs_UserOperationResult_User_ + commentId: Overload:EchoHub.Core.DTOs.UserOperationResult.User + fullName: EchoHub.Core.DTOs.UserOperationResult.User + nameWithType: UserOperationResult.User +- uid: EchoHub.Core.DTOs.UserOperationResult.op_Equality(EchoHub.Core.DTOs.UserOperationResult,EchoHub.Core.DTOs.UserOperationResult) + name: operator ==(UserOperationResult?, UserOperationResult?) + href: api/core/EchoHub.Core.DTOs.UserOperationResult.html#EchoHub_Core_DTOs_UserOperationResult_op_Equality_EchoHub_Core_DTOs_UserOperationResult_EchoHub_Core_DTOs_UserOperationResult_ + commentId: M:EchoHub.Core.DTOs.UserOperationResult.op_Equality(EchoHub.Core.DTOs.UserOperationResult,EchoHub.Core.DTOs.UserOperationResult) + name.vb: =(UserOperationResult, UserOperationResult) + fullName: EchoHub.Core.DTOs.UserOperationResult.operator ==(EchoHub.Core.DTOs.UserOperationResult?, EchoHub.Core.DTOs.UserOperationResult?) + fullName.vb: EchoHub.Core.DTOs.UserOperationResult.=(EchoHub.Core.DTOs.UserOperationResult, EchoHub.Core.DTOs.UserOperationResult) + nameWithType: UserOperationResult.operator ==(UserOperationResult?, UserOperationResult?) + nameWithType.vb: UserOperationResult.=(UserOperationResult, UserOperationResult) +- uid: EchoHub.Core.DTOs.UserOperationResult.op_Equality* + name: operator == + href: api/core/EchoHub.Core.DTOs.UserOperationResult.html#EchoHub_Core_DTOs_UserOperationResult_op_Equality_ + commentId: Overload:EchoHub.Core.DTOs.UserOperationResult.op_Equality + name.vb: = + fullName: EchoHub.Core.DTOs.UserOperationResult.operator == + fullName.vb: EchoHub.Core.DTOs.UserOperationResult.= + nameWithType: UserOperationResult.operator == + nameWithType.vb: UserOperationResult.= +- uid: EchoHub.Core.DTOs.UserOperationResult.op_Inequality(EchoHub.Core.DTOs.UserOperationResult,EchoHub.Core.DTOs.UserOperationResult) + name: operator !=(UserOperationResult?, UserOperationResult?) + href: api/core/EchoHub.Core.DTOs.UserOperationResult.html#EchoHub_Core_DTOs_UserOperationResult_op_Inequality_EchoHub_Core_DTOs_UserOperationResult_EchoHub_Core_DTOs_UserOperationResult_ + commentId: M:EchoHub.Core.DTOs.UserOperationResult.op_Inequality(EchoHub.Core.DTOs.UserOperationResult,EchoHub.Core.DTOs.UserOperationResult) + name.vb: <>(UserOperationResult, UserOperationResult) + fullName: EchoHub.Core.DTOs.UserOperationResult.operator !=(EchoHub.Core.DTOs.UserOperationResult?, EchoHub.Core.DTOs.UserOperationResult?) + fullName.vb: EchoHub.Core.DTOs.UserOperationResult.<>(EchoHub.Core.DTOs.UserOperationResult, EchoHub.Core.DTOs.UserOperationResult) + nameWithType: UserOperationResult.operator !=(UserOperationResult?, UserOperationResult?) + nameWithType.vb: UserOperationResult.<>(UserOperationResult, UserOperationResult) +- uid: EchoHub.Core.DTOs.UserOperationResult.op_Inequality* + name: operator != + href: api/core/EchoHub.Core.DTOs.UserOperationResult.html#EchoHub_Core_DTOs_UserOperationResult_op_Inequality_ + commentId: Overload:EchoHub.Core.DTOs.UserOperationResult.op_Inequality + name.vb: <> + fullName: EchoHub.Core.DTOs.UserOperationResult.operator != + fullName.vb: EchoHub.Core.DTOs.UserOperationResult.<> + nameWithType: UserOperationResult.operator != + nameWithType.vb: UserOperationResult.<> - uid: EchoHub.Core.DTOs.UserPresenceDto name: UserPresenceDto href: api/core/EchoHub.Core.DTOs.UserPresenceDto.html @@ -12535,6 +13438,12 @@ references: fullName.vb: EchoHub.Server.Auth.JwtTokenService.New nameWithType: JwtTokenService.JwtTokenService nameWithType.vb: JwtTokenService.New +- uid: EchoHub.Server.Auth.JwtTokenService.GenerateAccessToken(EchoHub.Core.DTOs.UserProfileDto) + name: GenerateAccessToken(UserProfileDto) + href: api/server/EchoHub.Server.Auth.JwtTokenService.html#EchoHub_Server_Auth_JwtTokenService_GenerateAccessToken_EchoHub_Core_DTOs_UserProfileDto_ + commentId: M:EchoHub.Server.Auth.JwtTokenService.GenerateAccessToken(EchoHub.Core.DTOs.UserProfileDto) + fullName: EchoHub.Server.Auth.JwtTokenService.GenerateAccessToken(EchoHub.Core.DTOs.UserProfileDto) + nameWithType: JwtTokenService.GenerateAccessToken(UserProfileDto) - uid: EchoHub.Server.Auth.JwtTokenService.GenerateAccessToken(EchoHub.Core.Models.User) name: GenerateAccessToken(User) href: api/server/EchoHub.Server.Auth.JwtTokenService.html#EchoHub_Server_Auth_JwtTokenService_GenerateAccessToken_EchoHub_Core_Models_User_ @@ -12592,15 +13501,15 @@ references: commentId: T:EchoHub.Server.Controllers.AuthController fullName: EchoHub.Server.Controllers.AuthController nameWithType: AuthController -- uid: EchoHub.Server.Controllers.AuthController.#ctor(EchoHub.Server.Data.EchoHubDbContext,EchoHub.Server.Auth.JwtTokenService) - name: AuthController(EchoHubDbContext, JwtTokenService) - href: api/server/EchoHub.Server.Controllers.AuthController.html#EchoHub_Server_Controllers_AuthController__ctor_EchoHub_Server_Data_EchoHubDbContext_EchoHub_Server_Auth_JwtTokenService_ - commentId: M:EchoHub.Server.Controllers.AuthController.#ctor(EchoHub.Server.Data.EchoHubDbContext,EchoHub.Server.Auth.JwtTokenService) - name.vb: New(EchoHubDbContext, JwtTokenService) - fullName: EchoHub.Server.Controllers.AuthController.AuthController(EchoHub.Server.Data.EchoHubDbContext, EchoHub.Server.Auth.JwtTokenService) - fullName.vb: EchoHub.Server.Controllers.AuthController.New(EchoHub.Server.Data.EchoHubDbContext, EchoHub.Server.Auth.JwtTokenService) - nameWithType: AuthController.AuthController(EchoHubDbContext, JwtTokenService) - nameWithType.vb: AuthController.New(EchoHubDbContext, JwtTokenService) +- uid: EchoHub.Server.Controllers.AuthController.#ctor(EchoHub.Server.Data.EchoHubDbContext,EchoHub.Server.Auth.JwtTokenService,EchoHub.Core.Contracts.IUserService) + name: AuthController(EchoHubDbContext, JwtTokenService, IUserService) + href: api/server/EchoHub.Server.Controllers.AuthController.html#EchoHub_Server_Controllers_AuthController__ctor_EchoHub_Server_Data_EchoHubDbContext_EchoHub_Server_Auth_JwtTokenService_EchoHub_Core_Contracts_IUserService_ + commentId: M:EchoHub.Server.Controllers.AuthController.#ctor(EchoHub.Server.Data.EchoHubDbContext,EchoHub.Server.Auth.JwtTokenService,EchoHub.Core.Contracts.IUserService) + name.vb: New(EchoHubDbContext, JwtTokenService, IUserService) + fullName: EchoHub.Server.Controllers.AuthController.AuthController(EchoHub.Server.Data.EchoHubDbContext, EchoHub.Server.Auth.JwtTokenService, EchoHub.Core.Contracts.IUserService) + fullName.vb: EchoHub.Server.Controllers.AuthController.New(EchoHub.Server.Data.EchoHubDbContext, EchoHub.Server.Auth.JwtTokenService, EchoHub.Core.Contracts.IUserService) + nameWithType: AuthController.AuthController(EchoHubDbContext, JwtTokenService, IUserService) + nameWithType.vb: AuthController.New(EchoHubDbContext, JwtTokenService, IUserService) - uid: EchoHub.Server.Controllers.AuthController.#ctor* name: AuthController href: api/server/EchoHub.Server.Controllers.AuthController.html#EchoHub_Server_Controllers_AuthController__ctor_ @@ -13000,15 +13909,15 @@ references: commentId: T:EchoHub.Server.Controllers.UsersController fullName: EchoHub.Server.Controllers.UsersController nameWithType: UsersController -- uid: EchoHub.Server.Controllers.UsersController.#ctor(EchoHub.Server.Data.EchoHubDbContext,EchoHub.Server.Services.ImageToAsciiService) - name: UsersController(EchoHubDbContext, ImageToAsciiService) - href: api/server/EchoHub.Server.Controllers.UsersController.html#EchoHub_Server_Controllers_UsersController__ctor_EchoHub_Server_Data_EchoHubDbContext_EchoHub_Server_Services_ImageToAsciiService_ - commentId: M:EchoHub.Server.Controllers.UsersController.#ctor(EchoHub.Server.Data.EchoHubDbContext,EchoHub.Server.Services.ImageToAsciiService) - name.vb: New(EchoHubDbContext, ImageToAsciiService) - fullName: EchoHub.Server.Controllers.UsersController.UsersController(EchoHub.Server.Data.EchoHubDbContext, EchoHub.Server.Services.ImageToAsciiService) - fullName.vb: EchoHub.Server.Controllers.UsersController.New(EchoHub.Server.Data.EchoHubDbContext, EchoHub.Server.Services.ImageToAsciiService) - nameWithType: UsersController.UsersController(EchoHubDbContext, ImageToAsciiService) - nameWithType.vb: UsersController.New(EchoHubDbContext, ImageToAsciiService) +- uid: EchoHub.Server.Controllers.UsersController.#ctor(EchoHub.Core.Contracts.IUserService,EchoHub.Server.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) + 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) + nameWithType: UsersController.UsersController(IUserService, ImageToAsciiService) + nameWithType.vb: UsersController.New(IUserService, ImageToAsciiService) - uid: EchoHub.Server.Controllers.UsersController.#ctor* name: UsersController href: api/server/EchoHub.Server.Controllers.UsersController.html#EchoHub_Server_Controllers_UsersController__ctor_ @@ -13879,15 +14788,15 @@ references: commentId: Overload:EchoHub.Server.Irc.IrcBroadcaster.SendUserBannedAsync fullName: EchoHub.Server.Irc.IrcBroadcaster.SendUserBannedAsync nameWithType: IrcBroadcaster.SendUserBannedAsync -- uid: EchoHub.Server.Irc.IrcBroadcaster.SendUserJoinedAsync(System.String,System.String,System.String) - name: SendUserJoinedAsync(string, string, string?) - href: api/server-irc/EchoHub.Server.Irc.IrcBroadcaster.html#EchoHub_Server_Irc_IrcBroadcaster_SendUserJoinedAsync_System_String_System_String_System_String_ - commentId: M:EchoHub.Server.Irc.IrcBroadcaster.SendUserJoinedAsync(System.String,System.String,System.String) - name.vb: SendUserJoinedAsync(String, String, String) - fullName: EchoHub.Server.Irc.IrcBroadcaster.SendUserJoinedAsync(string, string, string?) - fullName.vb: EchoHub.Server.Irc.IrcBroadcaster.SendUserJoinedAsync(String, String, String) - nameWithType: IrcBroadcaster.SendUserJoinedAsync(string, string, string?) - nameWithType.vb: IrcBroadcaster.SendUserJoinedAsync(String, String, String) +- uid: EchoHub.Server.Irc.IrcBroadcaster.SendUserJoinedAsync(System.String,System.String,EchoHub.Core.DTOs.UserPresenceDto,System.String) + name: SendUserJoinedAsync(string, string, UserPresenceDto?, string?) + href: api/server-irc/EchoHub.Server.Irc.IrcBroadcaster.html#EchoHub_Server_Irc_IrcBroadcaster_SendUserJoinedAsync_System_String_System_String_EchoHub_Core_DTOs_UserPresenceDto_System_String_ + commentId: M:EchoHub.Server.Irc.IrcBroadcaster.SendUserJoinedAsync(System.String,System.String,EchoHub.Core.DTOs.UserPresenceDto,System.String) + name.vb: SendUserJoinedAsync(String, String, UserPresenceDto, String) + fullName: EchoHub.Server.Irc.IrcBroadcaster.SendUserJoinedAsync(string, string, EchoHub.Core.DTOs.UserPresenceDto?, string?) + fullName.vb: EchoHub.Server.Irc.IrcBroadcaster.SendUserJoinedAsync(String, String, EchoHub.Core.DTOs.UserPresenceDto, String) + nameWithType: IrcBroadcaster.SendUserJoinedAsync(string, string, UserPresenceDto?, string?) + nameWithType.vb: IrcBroadcaster.SendUserJoinedAsync(String, String, UserPresenceDto, String) - uid: EchoHub.Server.Irc.IrcBroadcaster.SendUserJoinedAsync* name: SendUserJoinedAsync href: api/server-irc/EchoHub.Server.Irc.IrcBroadcaster.html#EchoHub_Server_Irc_IrcBroadcaster_SendUserJoinedAsync_ @@ -14233,15 +15142,15 @@ references: commentId: T:EchoHub.Server.Irc.IrcCommandHandler fullName: EchoHub.Server.Irc.IrcCommandHandler nameWithType: IrcCommandHandler -- uid: EchoHub.Server.Irc.IrcCommandHandler.#ctor(EchoHub.Server.Irc.IrcClientConnection,EchoHub.Server.Irc.IrcOptions,EchoHub.Core.Contracts.IChatService,EchoHub.Core.Contracts.IChannelService,EchoHub.Core.Contracts.IMessageEncryptionService,Microsoft.Extensions.Logging.ILogger) - name: IrcCommandHandler(IrcClientConnection, IrcOptions, IChatService, IChannelService, IMessageEncryptionService, ILogger) - href: api/server-irc/EchoHub.Server.Irc.IrcCommandHandler.html#EchoHub_Server_Irc_IrcCommandHandler__ctor_EchoHub_Server_Irc_IrcClientConnection_EchoHub_Server_Irc_IrcOptions_EchoHub_Core_Contracts_IChatService_EchoHub_Core_Contracts_IChannelService_EchoHub_Core_Contracts_IMessageEncryptionService_Microsoft_Extensions_Logging_ILogger_ - commentId: M:EchoHub.Server.Irc.IrcCommandHandler.#ctor(EchoHub.Server.Irc.IrcClientConnection,EchoHub.Server.Irc.IrcOptions,EchoHub.Core.Contracts.IChatService,EchoHub.Core.Contracts.IChannelService,EchoHub.Core.Contracts.IMessageEncryptionService,Microsoft.Extensions.Logging.ILogger) - name.vb: New(IrcClientConnection, IrcOptions, IChatService, IChannelService, IMessageEncryptionService, ILogger) - fullName: EchoHub.Server.Irc.IrcCommandHandler.IrcCommandHandler(EchoHub.Server.Irc.IrcClientConnection, EchoHub.Server.Irc.IrcOptions, EchoHub.Core.Contracts.IChatService, EchoHub.Core.Contracts.IChannelService, EchoHub.Core.Contracts.IMessageEncryptionService, Microsoft.Extensions.Logging.ILogger) - fullName.vb: EchoHub.Server.Irc.IrcCommandHandler.New(EchoHub.Server.Irc.IrcClientConnection, EchoHub.Server.Irc.IrcOptions, EchoHub.Core.Contracts.IChatService, EchoHub.Core.Contracts.IChannelService, EchoHub.Core.Contracts.IMessageEncryptionService, Microsoft.Extensions.Logging.ILogger) - nameWithType: IrcCommandHandler.IrcCommandHandler(IrcClientConnection, IrcOptions, IChatService, IChannelService, IMessageEncryptionService, ILogger) - nameWithType.vb: IrcCommandHandler.New(IrcClientConnection, IrcOptions, IChatService, IChannelService, IMessageEncryptionService, ILogger) +- uid: EchoHub.Server.Irc.IrcCommandHandler.#ctor(EchoHub.Server.Irc.IrcClientConnection,EchoHub.Server.Irc.IrcOptions,EchoHub.Core.Contracts.IChatService,EchoHub.Core.Contracts.IUserService,EchoHub.Core.Contracts.IChannelService,EchoHub.Core.Contracts.IMessageEncryptionService,Microsoft.Extensions.Logging.ILogger) + name: IrcCommandHandler(IrcClientConnection, IrcOptions, IChatService, IUserService, IChannelService, IMessageEncryptionService, ILogger) + href: api/server-irc/EchoHub.Server.Irc.IrcCommandHandler.html#EchoHub_Server_Irc_IrcCommandHandler__ctor_EchoHub_Server_Irc_IrcClientConnection_EchoHub_Server_Irc_IrcOptions_EchoHub_Core_Contracts_IChatService_EchoHub_Core_Contracts_IUserService_EchoHub_Core_Contracts_IChannelService_EchoHub_Core_Contracts_IMessageEncryptionService_Microsoft_Extensions_Logging_ILogger_ + commentId: M:EchoHub.Server.Irc.IrcCommandHandler.#ctor(EchoHub.Server.Irc.IrcClientConnection,EchoHub.Server.Irc.IrcOptions,EchoHub.Core.Contracts.IChatService,EchoHub.Core.Contracts.IUserService,EchoHub.Core.Contracts.IChannelService,EchoHub.Core.Contracts.IMessageEncryptionService,Microsoft.Extensions.Logging.ILogger) + name.vb: New(IrcClientConnection, IrcOptions, IChatService, IUserService, IChannelService, IMessageEncryptionService, ILogger) + fullName: EchoHub.Server.Irc.IrcCommandHandler.IrcCommandHandler(EchoHub.Server.Irc.IrcClientConnection, EchoHub.Server.Irc.IrcOptions, EchoHub.Core.Contracts.IChatService, EchoHub.Core.Contracts.IUserService, EchoHub.Core.Contracts.IChannelService, EchoHub.Core.Contracts.IMessageEncryptionService, Microsoft.Extensions.Logging.ILogger) + fullName.vb: EchoHub.Server.Irc.IrcCommandHandler.New(EchoHub.Server.Irc.IrcClientConnection, EchoHub.Server.Irc.IrcOptions, EchoHub.Core.Contracts.IChatService, EchoHub.Core.Contracts.IUserService, EchoHub.Core.Contracts.IChannelService, EchoHub.Core.Contracts.IMessageEncryptionService, Microsoft.Extensions.Logging.ILogger) + nameWithType: IrcCommandHandler.IrcCommandHandler(IrcClientConnection, IrcOptions, IChatService, IUserService, IChannelService, IMessageEncryptionService, ILogger) + nameWithType.vb: IrcCommandHandler.New(IrcClientConnection, IrcOptions, IChatService, IUserService, IChannelService, IMessageEncryptionService, ILogger) - uid: EchoHub.Server.Irc.IrcCommandHandler.#ctor* name: IrcCommandHandler href: api/server-irc/EchoHub.Server.Irc.IrcCommandHandler.html#EchoHub_Server_Irc_IrcCommandHandler__ctor_ @@ -15076,21 +15985,6 @@ references: fullName.vb: EchoHub.Server.Services.ChatService.New nameWithType: ChatService.ChatService nameWithType.vb: ChatService.New -- uid: EchoHub.Server.Services.ChatService.AuthenticateUserAsync(System.String,System.String) - name: AuthenticateUserAsync(string, string) - href: api/server/EchoHub.Server.Services.ChatService.html#EchoHub_Server_Services_ChatService_AuthenticateUserAsync_System_String_System_String_ - commentId: M:EchoHub.Server.Services.ChatService.AuthenticateUserAsync(System.String,System.String) - name.vb: AuthenticateUserAsync(String, String) - fullName: EchoHub.Server.Services.ChatService.AuthenticateUserAsync(string, string) - fullName.vb: EchoHub.Server.Services.ChatService.AuthenticateUserAsync(String, String) - nameWithType: ChatService.AuthenticateUserAsync(string, string) - nameWithType.vb: ChatService.AuthenticateUserAsync(String, String) -- uid: EchoHub.Server.Services.ChatService.AuthenticateUserAsync* - name: AuthenticateUserAsync - href: api/server/EchoHub.Server.Services.ChatService.html#EchoHub_Server_Services_ChatService_AuthenticateUserAsync_ - commentId: Overload:EchoHub.Server.Services.ChatService.AuthenticateUserAsync - fullName: EchoHub.Server.Services.ChatService.AuthenticateUserAsync - nameWithType: ChatService.AuthenticateUserAsync - uid: EchoHub.Server.Services.ChatService.BroadcastChannelUpdatedAsync(EchoHub.Core.DTOs.ChannelDto,System.String) name: BroadcastChannelUpdatedAsync(ChannelDto, string?) href: api/server/EchoHub.Server.Services.ChatService.html#EchoHub_Server_Services_ChatService_BroadcastChannelUpdatedAsync_EchoHub_Core_DTOs_ChannelDto_System_String_ @@ -15166,21 +16060,6 @@ references: commentId: Overload:EchoHub.Server.Services.ChatService.GetOnlineUsersAsync fullName: EchoHub.Server.Services.ChatService.GetOnlineUsersAsync nameWithType: ChatService.GetOnlineUsersAsync -- uid: EchoHub.Server.Services.ChatService.GetUserProfileAsync(System.String) - name: GetUserProfileAsync(string) - href: api/server/EchoHub.Server.Services.ChatService.html#EchoHub_Server_Services_ChatService_GetUserProfileAsync_System_String_ - commentId: M:EchoHub.Server.Services.ChatService.GetUserProfileAsync(System.String) - name.vb: GetUserProfileAsync(String) - fullName: EchoHub.Server.Services.ChatService.GetUserProfileAsync(string) - fullName.vb: EchoHub.Server.Services.ChatService.GetUserProfileAsync(String) - nameWithType: ChatService.GetUserProfileAsync(string) - nameWithType.vb: ChatService.GetUserProfileAsync(String) -- uid: EchoHub.Server.Services.ChatService.GetUserProfileAsync* - name: GetUserProfileAsync - href: api/server/EchoHub.Server.Services.ChatService.html#EchoHub_Server_Services_ChatService_GetUserProfileAsync_ - commentId: Overload:EchoHub.Server.Services.ChatService.GetUserProfileAsync - fullName: EchoHub.Server.Services.ChatService.GetUserProfileAsync - nameWithType: ChatService.GetUserProfileAsync - 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_ @@ -15598,6 +16477,42 @@ references: commentId: Overload:EchoHub.Server.Services.MessageEncryptionService.EncryptNullable fullName: EchoHub.Server.Services.MessageEncryptionService.EncryptNullable nameWithType: MessageEncryptionService.EncryptNullable +- uid: EchoHub.Server.Services.MuteExpirationService + name: MuteExpirationService + href: api/server/EchoHub.Server.Services.MuteExpirationService.html + commentId: T:EchoHub.Server.Services.MuteExpirationService + fullName: EchoHub.Server.Services.MuteExpirationService + nameWithType: MuteExpirationService +- uid: EchoHub.Server.Services.MuteExpirationService.#ctor(Microsoft.Extensions.DependencyInjection.IServiceScopeFactory,Microsoft.Extensions.Logging.ILogger{EchoHub.Server.Services.MuteExpirationService}) + name: MuteExpirationService(IServiceScopeFactory, ILogger) + href: api/server/EchoHub.Server.Services.MuteExpirationService.html#EchoHub_Server_Services_MuteExpirationService__ctor_Microsoft_Extensions_DependencyInjection_IServiceScopeFactory_Microsoft_Extensions_Logging_ILogger_EchoHub_Server_Services_MuteExpirationService__ + commentId: M:EchoHub.Server.Services.MuteExpirationService.#ctor(Microsoft.Extensions.DependencyInjection.IServiceScopeFactory,Microsoft.Extensions.Logging.ILogger{EchoHub.Server.Services.MuteExpirationService}) + name.vb: New(IServiceScopeFactory, ILogger(Of MuteExpirationService)) + fullName: EchoHub.Server.Services.MuteExpirationService.MuteExpirationService(Microsoft.Extensions.DependencyInjection.IServiceScopeFactory, Microsoft.Extensions.Logging.ILogger) + fullName.vb: EchoHub.Server.Services.MuteExpirationService.New(Microsoft.Extensions.DependencyInjection.IServiceScopeFactory, Microsoft.Extensions.Logging.ILogger(Of EchoHub.Server.Services.MuteExpirationService)) + nameWithType: MuteExpirationService.MuteExpirationService(IServiceScopeFactory, ILogger) + nameWithType.vb: MuteExpirationService.New(IServiceScopeFactory, ILogger(Of MuteExpirationService)) +- uid: EchoHub.Server.Services.MuteExpirationService.#ctor* + name: MuteExpirationService + href: api/server/EchoHub.Server.Services.MuteExpirationService.html#EchoHub_Server_Services_MuteExpirationService__ctor_ + commentId: Overload:EchoHub.Server.Services.MuteExpirationService.#ctor + name.vb: New + fullName: EchoHub.Server.Services.MuteExpirationService.MuteExpirationService + fullName.vb: EchoHub.Server.Services.MuteExpirationService.New + nameWithType: MuteExpirationService.MuteExpirationService + nameWithType.vb: MuteExpirationService.New +- uid: EchoHub.Server.Services.MuteExpirationService.ExecuteAsync(System.Threading.CancellationToken) + name: ExecuteAsync(CancellationToken) + href: api/server/EchoHub.Server.Services.MuteExpirationService.html#EchoHub_Server_Services_MuteExpirationService_ExecuteAsync_System_Threading_CancellationToken_ + commentId: M:EchoHub.Server.Services.MuteExpirationService.ExecuteAsync(System.Threading.CancellationToken) + fullName: EchoHub.Server.Services.MuteExpirationService.ExecuteAsync(System.Threading.CancellationToken) + nameWithType: MuteExpirationService.ExecuteAsync(CancellationToken) +- uid: EchoHub.Server.Services.MuteExpirationService.ExecuteAsync* + name: ExecuteAsync + href: api/server/EchoHub.Server.Services.MuteExpirationService.html#EchoHub_Server_Services_MuteExpirationService_ExecuteAsync_ + commentId: Overload:EchoHub.Server.Services.MuteExpirationService.ExecuteAsync + fullName: EchoHub.Server.Services.MuteExpirationService.ExecuteAsync + nameWithType: MuteExpirationService.ExecuteAsync - uid: EchoHub.Server.Services.PresenceTracker name: PresenceTracker href: api/server/EchoHub.Server.Services.PresenceTracker.html @@ -15961,15 +16876,15 @@ references: commentId: Overload:EchoHub.Server.Services.SignalRBroadcaster.SendUserBannedAsync fullName: EchoHub.Server.Services.SignalRBroadcaster.SendUserBannedAsync nameWithType: SignalRBroadcaster.SendUserBannedAsync -- uid: EchoHub.Server.Services.SignalRBroadcaster.SendUserJoinedAsync(System.String,System.String,System.String) - name: SendUserJoinedAsync(string, string, string?) - href: api/server/EchoHub.Server.Services.SignalRBroadcaster.html#EchoHub_Server_Services_SignalRBroadcaster_SendUserJoinedAsync_System_String_System_String_System_String_ - commentId: M:EchoHub.Server.Services.SignalRBroadcaster.SendUserJoinedAsync(System.String,System.String,System.String) - name.vb: SendUserJoinedAsync(String, String, String) - fullName: EchoHub.Server.Services.SignalRBroadcaster.SendUserJoinedAsync(string, string, string?) - fullName.vb: EchoHub.Server.Services.SignalRBroadcaster.SendUserJoinedAsync(String, String, String) - nameWithType: SignalRBroadcaster.SendUserJoinedAsync(string, string, string?) - nameWithType.vb: SignalRBroadcaster.SendUserJoinedAsync(String, String, String) +- uid: EchoHub.Server.Services.SignalRBroadcaster.SendUserJoinedAsync(System.String,System.String,EchoHub.Core.DTOs.UserPresenceDto,System.String) + name: SendUserJoinedAsync(string, string, UserPresenceDto?, string?) + href: api/server/EchoHub.Server.Services.SignalRBroadcaster.html#EchoHub_Server_Services_SignalRBroadcaster_SendUserJoinedAsync_System_String_System_String_EchoHub_Core_DTOs_UserPresenceDto_System_String_ + commentId: M:EchoHub.Server.Services.SignalRBroadcaster.SendUserJoinedAsync(System.String,System.String,EchoHub.Core.DTOs.UserPresenceDto,System.String) + name.vb: SendUserJoinedAsync(String, String, UserPresenceDto, String) + fullName: EchoHub.Server.Services.SignalRBroadcaster.SendUserJoinedAsync(string, string, EchoHub.Core.DTOs.UserPresenceDto?, string?) + fullName.vb: EchoHub.Server.Services.SignalRBroadcaster.SendUserJoinedAsync(String, String, EchoHub.Core.DTOs.UserPresenceDto, String) + nameWithType: SignalRBroadcaster.SendUserJoinedAsync(string, string, UserPresenceDto?, string?) + nameWithType.vb: SignalRBroadcaster.SendUserJoinedAsync(String, String, UserPresenceDto, String) - uid: EchoHub.Server.Services.SignalRBroadcaster.SendUserJoinedAsync* name: SendUserJoinedAsync href: api/server/EchoHub.Server.Services.SignalRBroadcaster.html#EchoHub_Server_Services_SignalRBroadcaster_SendUserJoinedAsync_ @@ -16021,6 +16936,117 @@ references: commentId: Overload:EchoHub.Server.Services.SignalRBroadcaster.SendUserStatusChangedAsync fullName: EchoHub.Server.Services.SignalRBroadcaster.SendUserStatusChangedAsync nameWithType: SignalRBroadcaster.SendUserStatusChangedAsync +- uid: EchoHub.Server.Services.UserService + name: UserService + href: api/server/EchoHub.Server.Services.UserService.html + commentId: T:EchoHub.Server.Services.UserService + fullName: EchoHub.Server.Services.UserService + nameWithType: UserService +- uid: EchoHub.Server.Services.UserService.#ctor(Microsoft.Extensions.DependencyInjection.IServiceScopeFactory) + name: UserService(IServiceScopeFactory) + href: api/server/EchoHub.Server.Services.UserService.html#EchoHub_Server_Services_UserService__ctor_Microsoft_Extensions_DependencyInjection_IServiceScopeFactory_ + commentId: M:EchoHub.Server.Services.UserService.#ctor(Microsoft.Extensions.DependencyInjection.IServiceScopeFactory) + name.vb: New(IServiceScopeFactory) + fullName: EchoHub.Server.Services.UserService.UserService(Microsoft.Extensions.DependencyInjection.IServiceScopeFactory) + fullName.vb: EchoHub.Server.Services.UserService.New(Microsoft.Extensions.DependencyInjection.IServiceScopeFactory) + nameWithType: UserService.UserService(IServiceScopeFactory) + nameWithType.vb: UserService.New(IServiceScopeFactory) +- uid: EchoHub.Server.Services.UserService.#ctor* + name: UserService + href: api/server/EchoHub.Server.Services.UserService.html#EchoHub_Server_Services_UserService__ctor_ + commentId: Overload:EchoHub.Server.Services.UserService.#ctor + name.vb: New + fullName: EchoHub.Server.Services.UserService.UserService + fullName.vb: EchoHub.Server.Services.UserService.New + nameWithType: UserService.UserService + nameWithType.vb: UserService.New +- uid: EchoHub.Server.Services.UserService.AuthenticateUserAsync(System.String,System.String) + name: AuthenticateUserAsync(string, string) + href: api/server/EchoHub.Server.Services.UserService.html#EchoHub_Server_Services_UserService_AuthenticateUserAsync_System_String_System_String_ + commentId: M:EchoHub.Server.Services.UserService.AuthenticateUserAsync(System.String,System.String) + name.vb: AuthenticateUserAsync(String, String) + fullName: EchoHub.Server.Services.UserService.AuthenticateUserAsync(string, string) + fullName.vb: EchoHub.Server.Services.UserService.AuthenticateUserAsync(String, String) + nameWithType: UserService.AuthenticateUserAsync(string, string) + nameWithType.vb: UserService.AuthenticateUserAsync(String, String) +- uid: EchoHub.Server.Services.UserService.AuthenticateUserAsync* + name: AuthenticateUserAsync + href: api/server/EchoHub.Server.Services.UserService.html#EchoHub_Server_Services_UserService_AuthenticateUserAsync_ + commentId: Overload:EchoHub.Server.Services.UserService.AuthenticateUserAsync + fullName: EchoHub.Server.Services.UserService.AuthenticateUserAsync + nameWithType: UserService.AuthenticateUserAsync +- uid: EchoHub.Server.Services.UserService.GetUserByIdAsync(System.Guid) + name: GetUserByIdAsync(Guid) + href: api/server/EchoHub.Server.Services.UserService.html#EchoHub_Server_Services_UserService_GetUserByIdAsync_System_Guid_ + commentId: M:EchoHub.Server.Services.UserService.GetUserByIdAsync(System.Guid) + fullName: EchoHub.Server.Services.UserService.GetUserByIdAsync(System.Guid) + nameWithType: UserService.GetUserByIdAsync(Guid) +- uid: EchoHub.Server.Services.UserService.GetUserByIdAsync* + name: GetUserByIdAsync + href: api/server/EchoHub.Server.Services.UserService.html#EchoHub_Server_Services_UserService_GetUserByIdAsync_ + commentId: Overload:EchoHub.Server.Services.UserService.GetUserByIdAsync + fullName: EchoHub.Server.Services.UserService.GetUserByIdAsync + nameWithType: UserService.GetUserByIdAsync +- uid: EchoHub.Server.Services.UserService.GetUserProfileAsync(System.String) + name: GetUserProfileAsync(string) + href: api/server/EchoHub.Server.Services.UserService.html#EchoHub_Server_Services_UserService_GetUserProfileAsync_System_String_ + commentId: M:EchoHub.Server.Services.UserService.GetUserProfileAsync(System.String) + name.vb: GetUserProfileAsync(String) + fullName: EchoHub.Server.Services.UserService.GetUserProfileAsync(string) + fullName.vb: EchoHub.Server.Services.UserService.GetUserProfileAsync(String) + nameWithType: UserService.GetUserProfileAsync(string) + nameWithType.vb: UserService.GetUserProfileAsync(String) +- uid: EchoHub.Server.Services.UserService.GetUserProfileAsync* + name: GetUserProfileAsync + href: api/server/EchoHub.Server.Services.UserService.html#EchoHub_Server_Services_UserService_GetUserProfileAsync_ + commentId: Overload:EchoHub.Server.Services.UserService.GetUserProfileAsync + fullName: EchoHub.Server.Services.UserService.GetUserProfileAsync + nameWithType: UserService.GetUserProfileAsync +- uid: EchoHub.Server.Services.UserService.RegisterUserAsync(System.String,System.String,System.String) + name: RegisterUserAsync(string, string, string?) + href: api/server/EchoHub.Server.Services.UserService.html#EchoHub_Server_Services_UserService_RegisterUserAsync_System_String_System_String_System_String_ + commentId: M:EchoHub.Server.Services.UserService.RegisterUserAsync(System.String,System.String,System.String) + name.vb: RegisterUserAsync(String, String, String) + fullName: EchoHub.Server.Services.UserService.RegisterUserAsync(string, string, string?) + fullName.vb: EchoHub.Server.Services.UserService.RegisterUserAsync(String, String, String) + nameWithType: UserService.RegisterUserAsync(string, string, string?) + nameWithType.vb: UserService.RegisterUserAsync(String, String, String) +- uid: EchoHub.Server.Services.UserService.RegisterUserAsync* + name: RegisterUserAsync + href: api/server/EchoHub.Server.Services.UserService.html#EchoHub_Server_Services_UserService_RegisterUserAsync_ + commentId: Overload:EchoHub.Server.Services.UserService.RegisterUserAsync + fullName: EchoHub.Server.Services.UserService.RegisterUserAsync + nameWithType: UserService.RegisterUserAsync +- uid: EchoHub.Server.Services.UserService.SetAvatarAsync(System.Guid,System.String) + name: SetAvatarAsync(Guid, string) + href: api/server/EchoHub.Server.Services.UserService.html#EchoHub_Server_Services_UserService_SetAvatarAsync_System_Guid_System_String_ + commentId: M:EchoHub.Server.Services.UserService.SetAvatarAsync(System.Guid,System.String) + name.vb: SetAvatarAsync(Guid, String) + fullName: EchoHub.Server.Services.UserService.SetAvatarAsync(System.Guid, string) + fullName.vb: EchoHub.Server.Services.UserService.SetAvatarAsync(System.Guid, String) + nameWithType: UserService.SetAvatarAsync(Guid, string) + nameWithType.vb: UserService.SetAvatarAsync(Guid, String) +- uid: EchoHub.Server.Services.UserService.SetAvatarAsync* + name: SetAvatarAsync + href: api/server/EchoHub.Server.Services.UserService.html#EchoHub_Server_Services_UserService_SetAvatarAsync_ + commentId: Overload:EchoHub.Server.Services.UserService.SetAvatarAsync + fullName: EchoHub.Server.Services.UserService.SetAvatarAsync + nameWithType: UserService.SetAvatarAsync +- uid: EchoHub.Server.Services.UserService.UpdateProfileAsync(System.Guid,System.String,System.String,System.String) + name: UpdateProfileAsync(Guid, string?, string?, string?) + href: api/server/EchoHub.Server.Services.UserService.html#EchoHub_Server_Services_UserService_UpdateProfileAsync_System_Guid_System_String_System_String_System_String_ + commentId: M:EchoHub.Server.Services.UserService.UpdateProfileAsync(System.Guid,System.String,System.String,System.String) + name.vb: UpdateProfileAsync(Guid, String, String, String) + fullName: EchoHub.Server.Services.UserService.UpdateProfileAsync(System.Guid, string?, string?, string?) + fullName.vb: EchoHub.Server.Services.UserService.UpdateProfileAsync(System.Guid, String, String, String) + nameWithType: UserService.UpdateProfileAsync(Guid, string?, string?, string?) + nameWithType.vb: UserService.UpdateProfileAsync(Guid, String, String, String) +- uid: EchoHub.Server.Services.UserService.UpdateProfileAsync* + name: UpdateProfileAsync + href: api/server/EchoHub.Server.Services.UserService.html#EchoHub_Server_Services_UserService_UpdateProfileAsync_ + commentId: Overload:EchoHub.Server.Services.UserService.UpdateProfileAsync + fullName: EchoHub.Server.Services.UserService.UpdateProfileAsync + nameWithType: UserService.UpdateProfileAsync - uid: EchoHub.Server.Setup name: EchoHub.Server.Setup href: api/server/EchoHub.Server.Setup.html