From a6bf50c56781724093cc8461b5d6469dec8bfed7 Mon Sep 17 00:00:00 2001 From: HueByte Date: Fri, 17 Jul 2026 19:09:56 +0000 Subject: [PATCH] deploy: 0c2e8eae8780c50a818660e33c2c6ff4f2b964eb --- ...choHub.Client.Commands.CommandHandler.html | 219 +- .../EchoHub.Client.Services.ApiClient.html | 182 +- ...Hub.Client.Services.EchoHubConnection.html | 38 +- ...hoHub.Client.UI.Chat.AttachmentAction.html | 154 + ...b.Client.UI.Chat.AttachmentActionSpan.html | 554 +++ .../EchoHub.Client.UI.Chat.ChatLine.html | 67 + api/client/EchoHub.Client.UI.Chat.html | 16 + ...Client.UI.Dialogs.ConnectDialogResult.html | 82 +- ...ient.UI.ListSources.ChannelListSource.html | 8 +- api/client/EchoHub.Client.UI.MainWindow.html | 166 +- ...Hub.Core.Constants.MessageConventions.html | 322 ++ api/core/EchoHub.Core.Constants.html | 8 + ...choHub.Core.Contracts.IChannelService.html | 38 + ...hoHub.Core.Contracts.IChatBroadcaster.html | 51 +- .../EchoHub.Core.Contracts.IChatService.html | 46 +- ...EchoHub.Core.Contracts.IEchoHubClient.html | 36 + .../EchoHub.Core.Contracts.IUserService.html | 8 +- api/core/EchoHub.Core.DTOs.ChannelDto.html | 47 +- ...EchoHub.Core.DTOs.CreateInviteRequest.html | 625 +++ ...choHub.Core.DTOs.DeleteAccountRequest.html | 592 +++ ...hoHub.Core.DTOs.ExportedAttachmentDto.html | 765 ++++ .../EchoHub.Core.DTOs.ExportedMessageDto.html | 730 ++++ api/core/EchoHub.Core.DTOs.InviteDto.html | 765 ++++ api/core/EchoHub.Core.DTOs.MessageDto.html | 47 +- .../EchoHub.Core.DTOs.RegisterRequest.html | 47 +- api/core/EchoHub.Core.DTOs.ReplyRefDto.html | 668 +++ .../EchoHub.Core.DTOs.ServerStatusDto.html | 47 +- .../EchoHub.Core.DTOs.UserDataExportDto.html | 734 ++++ api/core/EchoHub.Core.DTOs.html | 35 + api/core/EchoHub.Core.Models.Channel.html | 31 + api/core/EchoHub.Core.Models.InviteCode.html | 461 ++ api/core/EchoHub.Core.Models.Message.html | 32 + api/core/EchoHub.Core.Models.html | 6 + ...oHub.Core.Services.AsciiBannerService.html | 256 ++ api/core/EchoHub.Core.Services.html | 7 + .../EchoHub.Server.Irc.IrcBroadcaster.html | 51 +- ...choHub.Server.Irc.IrcMessageFormatter.html | 91 +- .../EchoHub.Server.Irc.IrcOptions.html | 34 + ...hoHub.Server.Config.ServerLogsOptions.html | 469 ++ .../EchoHub.Server.Config.SpamOptions.html | 564 +++ api/server/EchoHub.Server.Config.html | 14 + ...ub.Server.Controllers.FilesController.html | 7 +- ....Server.Controllers.InvitesController.html | 330 ++ ...ub.Server.Controllers.UsersController.html | 132 +- api/server/EchoHub.Server.Controllers.html | 6 + .../EchoHub.Server.Data.EchoHubDbContext.html | 31 + ...er.Data.Migrations.AddChannelIsSystem.html | 306 ++ ....Data.Migrations.AddInvitesAndReplies.html | 306 ++ .../EchoHub.Server.Data.Migrations.html | 8 + api/server/EchoHub.Server.Hubs.ChatHub.html | 8 +- ...choHub.Server.Services.ChannelService.html | 48 +- .../EchoHub.Server.Services.ChatService.html | 56 +- ...r.Services.ServerLogs.LogBacklogEntry.html | 629 +++ ...Services.ServerLogs.ServerLogsService.html | 465 ++ ...er.Services.ServerLogs.ServerLogsSink.html | 289 ++ ...es.ServerLogs.ServerLogsStreamService.html | 306 ++ .../EchoHub.Server.Services.ServerLogs.html | 154 + ...ub.Server.Services.SignalRBroadcaster.html | 51 +- .../EchoHub.Server.Services.SpamGuard.html | 379 ++ .../EchoHub.Server.Services.SpamVerdict.html | 586 +++ ...hoHub.Server.Services.SpamVerdictKind.html | 157 + .../EchoHub.Server.Services.UserService.html | 52 +- api/server/EchoHub.Server.Services.html | 23 + api/toc.html | 79 + api/toc.json | 2 +- articles/configuration.html | 147 +- changelog/index.html | 1 + changelog/toc.html | 3 + changelog/toc.json | 2 +- changelog/v0.2.15.html | 192 + index.json | 210 +- manifest.json | 360 ++ xrefmap.yml | 3882 +++++++++++++++-- 73 files changed, 17893 insertions(+), 427 deletions(-) create mode 100644 api/client/EchoHub.Client.UI.Chat.AttachmentAction.html create mode 100644 api/client/EchoHub.Client.UI.Chat.AttachmentActionSpan.html create mode 100644 api/core/EchoHub.Core.Constants.MessageConventions.html create mode 100644 api/core/EchoHub.Core.DTOs.CreateInviteRequest.html create mode 100644 api/core/EchoHub.Core.DTOs.DeleteAccountRequest.html create mode 100644 api/core/EchoHub.Core.DTOs.ExportedAttachmentDto.html create mode 100644 api/core/EchoHub.Core.DTOs.ExportedMessageDto.html create mode 100644 api/core/EchoHub.Core.DTOs.InviteDto.html create mode 100644 api/core/EchoHub.Core.DTOs.ReplyRefDto.html create mode 100644 api/core/EchoHub.Core.DTOs.UserDataExportDto.html create mode 100644 api/core/EchoHub.Core.Models.InviteCode.html create mode 100644 api/core/EchoHub.Core.Services.AsciiBannerService.html create mode 100644 api/server/EchoHub.Server.Config.ServerLogsOptions.html create mode 100644 api/server/EchoHub.Server.Config.SpamOptions.html create mode 100644 api/server/EchoHub.Server.Controllers.InvitesController.html create mode 100644 api/server/EchoHub.Server.Data.Migrations.AddChannelIsSystem.html create mode 100644 api/server/EchoHub.Server.Data.Migrations.AddInvitesAndReplies.html create mode 100644 api/server/EchoHub.Server.Services.ServerLogs.LogBacklogEntry.html create mode 100644 api/server/EchoHub.Server.Services.ServerLogs.ServerLogsService.html create mode 100644 api/server/EchoHub.Server.Services.ServerLogs.ServerLogsSink.html create mode 100644 api/server/EchoHub.Server.Services.ServerLogs.ServerLogsStreamService.html create mode 100644 api/server/EchoHub.Server.Services.ServerLogs.html create mode 100644 api/server/EchoHub.Server.Services.SpamGuard.html create mode 100644 api/server/EchoHub.Server.Services.SpamVerdict.html create mode 100644 api/server/EchoHub.Server.Services.SpamVerdictKind.html create mode 100644 changelog/v0.2.15.html diff --git a/api/client/EchoHub.Client.Commands.CommandHandler.html b/api/client/EchoHub.Client.Commands.CommandHandler.html index 0c1c5b7..55e77bb 100644 --- a/api/client/EchoHub.Client.Commands.CommandHandler.html +++ b/api/client/EchoHub.Client.Commands.CommandHandler.html @@ -379,6 +379,96 @@ Class CommandHandler + OnCreateInvite + + + +
+
+ +
+
public event Func<int?, int?, Task>? OnCreateInvite
+
+ + + + + + +

Event Type

+
+
Func<int?, int?, Task>
+
+
+ + + + + + + + +

+ OnDeleteAccount + +

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

Event Type

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

+ OnExportData + +

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

Event Type

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

OnHelp @@ -499,6 +589,36 @@ Class CommandHandler + OnListInvites + +

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

Event Type

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

OnListUsers @@ -679,6 +799,36 @@ Class CommandHandler + OnRevokeInvite + +

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

Event Type

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

OnRoomInfo @@ -709,6 +859,66 @@ Class CommandHandler + OnSendAction + +

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

Event Type

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

+ OnSendBanner + +

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

Event Type

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

OnSendFile @@ -894,11 +1104,14 @@ Class CommandHandler

-
+

Status update. A null status means "keep the current status"; a null message means +"keep the current message" and an empty message means "clear it". The orchestrator +resolves both against the session state.

+
-
public event Func<UserStatus, string?, Task>? OnSetStatus
+
public event Func<UserStatus?, string?, Task>? OnSetStatus
@@ -908,7 +1121,7 @@ Class CommandHandler Event Type
-
Func<UserStatus, string, Task>
+
Func<UserStatus?, string, Task>
diff --git a/api/client/EchoHub.Client.Services.ApiClient.html b/api/client/EchoHub.Client.Services.ApiClient.html index 6285e97..e0232c0 100644 --- a/api/client/EchoHub.Client.Services.ApiClient.html +++ b/api/client/EchoHub.Client.Services.ApiClient.html @@ -409,6 +409,44 @@ Class ApiClient + +

+ CreateInviteAsync(int?, int?) + +

+ +
+
+ +
+
public Task<InviteDto?> CreateInviteAsync(int? maxUses = null, int? expiresInHours = null)
+
+ +

Parameters

+
+
maxUses int?
+
+
expiresInHours int?
+
+
+ +

Returns

+
+
Task<InviteDto>
+
+
+ + + + + + + + + + +

@@ -481,6 +519,43 @@ Class ApiClient + +

+ DeleteMyAccountAsync(string) + +

+ +

Deletes the caller's account. The password re-confirms intent.

+
+
+ +
+
public Task DeleteMyAccountAsync(string password)
+
+ +

Parameters

+
+
password string
+
+
+ +

Returns

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

@@ -545,6 +620,38 @@ Class ApiClient + +

+ ExportMyDataAsync() + +

+ +

Downloads the caller's full data export as raw JSON text.

+
+
+ +
+
public Task<string> ExportMyDataAsync()
+
+ + +

Returns

+
+
Task<string>
+
+
+ + + + + + + + + + +

@@ -683,6 +790,37 @@ size, created date, room id) for the /meta command. Returns null if + + +

+ GetInvitesAsync() + +

+ +
+
+ +
+
public Task<List<InviteDto>> GetInvitesAsync()
+
+ + +

Returns

+
+
Task<List<InviteDto>>
+
+
+ + + + + + + + + + +

@@ -1035,8 +1173,8 @@ Used by EchoHubConnection for SignalR token provider.

-

- RegisterAsync(string, string, string?) +

+ RegisterAsync(string, string, string?, string?)

@@ -1044,7 +1182,7 @@ Used by EchoHubConnection for SignalR token provider.

-
public Task<LoginResponse> RegisterAsync(string username, string password, string? displayName = null)
+
public Task<LoginResponse> RegisterAsync(string username, string password, string? displayName = null, string? inviteCode = null)

Parameters

@@ -1055,6 +1193,8 @@ Used by EchoHubConnection for SignalR token provider.

displayName string
+
inviteCode string
+

Returns

@@ -1111,6 +1251,42 @@ Used by EchoHubConnection for SignalR token provider.

+ + +

+ RevokeInviteAsync(string) + +

+ +
+
+ +
+
public Task RevokeInviteAsync(string code)
+
+ +

Parameters

+
+
code string
+
+
+ +

Returns

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

diff --git a/api/client/EchoHub.Client.Services.EchoHubConnection.html b/api/client/EchoHub.Client.Services.EchoHubConnection.html index b25f25f..de6e1f3 100644 --- a/api/client/EchoHub.Client.Services.EchoHubConnection.html +++ b/api/client/EchoHub.Client.Services.EchoHubConnection.html @@ -510,8 +510,8 @@ Class EchoHubConnection -

- SendMessageAsync(string, string) +

+ SendMessageAsync(string, string, Guid?)

@@ -519,7 +519,7 @@ Class EchoHubConnection
-
public Task SendMessageAsync(string channelName, string content)
+
public Task SendMessageAsync(string channelName, string content, Guid? replyToMessageId = null)

Parameters

@@ -528,6 +528,8 @@ Class EchoHubConnection
string
+
replyToMessageId Guid?
+

Returns

@@ -589,6 +591,36 @@ Class EchoHubConnection + OnChannelDeleted + + + +
+
+ +
+
public event Action<string>? OnChannelDeleted
+
+ + + + + + +

Event Type

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

OnChannelNuked diff --git a/api/client/EchoHub.Client.UI.Chat.AttachmentAction.html b/api/client/EchoHub.Client.UI.Chat.AttachmentAction.html new file mode 100644 index 0000000..13f7302 --- /dev/null +++ b/api/client/EchoHub.Client.UI.Chat.AttachmentAction.html @@ -0,0 +1,154 @@ + + + + + Enum AttachmentAction | EchoHub Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+
Table of Contents
+ +
+
+ +
+
+
+ +
+
+ + + +
+ +
+ + + + +

+Enum AttachmentAction +

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

An action a click on an attachment line can trigger.

+
+
+ +
+
public enum AttachmentAction
+
+ + + + + + + + + +

Fields +

+
+
OpenImage = 0
+ +
+
SaveImage = 1
+ +
+
+ + + +
+ + + + +
+ +
+ +
+
+ +
+ + + + diff --git a/api/client/EchoHub.Client.UI.Chat.AttachmentActionSpan.html b/api/client/EchoHub.Client.UI.Chat.AttachmentActionSpan.html new file mode 100644 index 0000000..8219c1d --- /dev/null +++ b/api/client/EchoHub.Client.UI.Chat.AttachmentActionSpan.html @@ -0,0 +1,554 @@ + + + + + Struct AttachmentActionSpan | EchoHub Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+
Table of Contents
+ +
+
+ +
+
+
+ +
+
+ + + +
+ +
+ + + +

+Struct AttachmentActionSpan +

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

Inclusive column range on a chat line that triggers an attachment action when clicked.

+
+
+ +
+
public readonly struct AttachmentActionSpan : IEquatable<AttachmentActionSpan>
+
+ + + + + +
+
Implements
+
+ +
+
+ + +
+
Inherited Members
+
+ + + +
+ + + + + + +

Constructors +

+ + + + +

+ AttachmentActionSpan(int, int, AttachmentAction) + +

+ +

Inclusive column range on a chat line that triggers an attachment action when clicked.

+
+
+ +
+
public AttachmentActionSpan(int StartCol, int EndCol, AttachmentAction Action)
+
+ +

Parameters

+
+
StartCol int
+
+
EndCol int
+
+
Action AttachmentAction
+
+
+ + + + + + + + + + + + +

Properties +

+ + + + +

+ Action + +

+ +
+
+ +
+
public AttachmentAction Action { get; init; }
+
+ + + + + +

Property Value

+
+
AttachmentAction
+
+
+ + + + + + + + + + +

+ EndCol + +

+ +
+
+ +
+
public int EndCol { get; init; }
+
+ + + + + +

Property Value

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

+ StartCol + +

+ +
+
+ +
+
public int StartCol { get; init; }
+
+ + + + + +

Property Value

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

Methods +

+ + + + +

+ Deconstruct(out int, out int, out AttachmentAction) + +

+ +
+
+ +
+
public void Deconstruct(out int StartCol, out int EndCol, out AttachmentAction Action)
+
+ +

Parameters

+
+
StartCol int
+
+
EndCol int
+
+
Action AttachmentAction
+
+
+ + + + + + + + + + + + + + +

+ Equals(AttachmentActionSpan) + +

+ +
+
+ +
+
public bool Equals(AttachmentActionSpan other)
+
+ +

Parameters

+
+
other AttachmentActionSpan
+
+
+ +

Returns

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

+ Equals(object) + +

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

Parameters

+
+
obj object
+
+
+ +

Returns

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

+ GetHashCode() + +

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

Returns

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

+ ToString() + +

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

Returns

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

Operators +

+ + + + +

+ operator ==(AttachmentActionSpan, AttachmentActionSpan) + +

+ +
+
+ +
+
public static bool operator ==(AttachmentActionSpan left, AttachmentActionSpan right)
+
+ +

Parameters

+
+
left AttachmentActionSpan
+
+
right AttachmentActionSpan
+
+
+ +

Returns

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

+ operator !=(AttachmentActionSpan, AttachmentActionSpan) + +

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

Parameters

+
+
left AttachmentActionSpan
+
+
right AttachmentActionSpan
+
+
+ +

Returns

+
+
bool
+
+
+ + + + + + + + + + + + +
+ + + + +
+ +
+ +
+
+ +
+ + + + diff --git a/api/client/EchoHub.Client.UI.Chat.ChatLine.html b/api/client/EchoHub.Client.UI.Chat.ChatLine.html index 4892807..b8d0793 100644 --- a/api/client/EchoHub.Client.UI.Chat.ChatLine.html +++ b/api/client/EchoHub.Client.UI.Chat.ChatLine.html @@ -216,6 +216,40 @@ Class ChatLine + + +

+ ActionSpans + +

+ +

Clickable sub-line targets (e.g. the "[open]" and "[save original]" brackets under an +image). Columns are relative to the unwrapped line, so only the first wrapped line +keeps them. Null means the whole line uses the kind's default action.

+
+
+ +
+
public List<AttachmentActionSpan>? ActionSpans { get; set; }
+
+ + + + + +

Property Value

+
+
List<AttachmentActionSpan>
+
+
+ + + + + + + +

@@ -438,6 +472,39 @@ precedence over + +

+ JumpToMessageId + +

+ +

Set on a reply's quote line: activating the line jumps to this message +if it is in the loaded history.

+
+
+ +
+
public Guid? JumpToMessageId { get; set; }
+
+ + + + + +

Property Value

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

diff --git a/api/client/EchoHub.Client.UI.Chat.html b/api/client/EchoHub.Client.UI.Chat.html index 354aabd..d445584 100644 --- a/api/client/EchoHub.Client.UI.Chat.html +++ b/api/client/EchoHub.Client.UI.Chat.html @@ -121,6 +121,22 @@ so the UI layer can refresh.

A colored text segment within a chat line.

+

+Structs +

+
+
AttachmentActionSpan
+

Inclusive column range on a chat line that triggers an attachment action when clicked.

+
+
+

+Enums +

+
+
AttachmentAction
+

An action a click on an attachment line can trigger.

+
+
diff --git a/api/client/EchoHub.Client.UI.Dialogs.ConnectDialogResult.html b/api/client/EchoHub.Client.UI.Dialogs.ConnectDialogResult.html index db84606..853a359 100644 --- a/api/client/EchoHub.Client.UI.Dialogs.ConnectDialogResult.html +++ b/api/client/EchoHub.Client.UI.Dialogs.ConnectDialogResult.html @@ -183,8 +183,8 @@ Class ConnectDialogResult -

- ConnectDialogResult(string, string, string, bool, bool, string?) +

+ ConnectDialogResult(string, string, string, bool, bool, string?, string?, string?)

@@ -193,7 +193,7 @@ Class ConnectDialogResult
-
public ConnectDialogResult(string ServerUrl, string Username, string Password, bool IsRegister, bool RememberMe, string? SavedRefreshToken)
+
public ConnectDialogResult(string ServerUrl, string Username, string Password, bool IsRegister, bool RememberMe, string? SavedRefreshToken, string? DisplayName = null, string? InviteCode = null)

Parameters

@@ -210,6 +210,10 @@ Class ConnectDialogResult
string
+
DisplayName string
+
+
InviteCode string
+
@@ -227,6 +231,37 @@ Class ConnectDialogResult + +

+ DisplayName + +

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

Property Value

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

@@ -258,6 +293,37 @@ Class ConnectDialogResult + +

+ InviteCode + +

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

Property Value

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

@@ -450,8 +516,8 @@ Class ConnectDialogResult -

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

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

@@ -459,7 +525,7 @@ Class ConnectDialogResult
-
public void Deconstruct(out string ServerUrl, out string Username, out string Password, out bool IsRegister, out bool RememberMe, out string? SavedRefreshToken)
+
public void Deconstruct(out string ServerUrl, out string Username, out string Password, out bool IsRegister, out bool RememberMe, out string? SavedRefreshToken, out string? DisplayName, out string? InviteCode)

Parameters

@@ -476,6 +542,10 @@ Class ConnectDialogResult
string
+
DisplayName string
+
+
InviteCode string
+
diff --git a/api/client/EchoHub.Client.UI.ListSources.ChannelListSource.html b/api/client/EchoHub.Client.UI.ListSources.ChannelListSource.html index 11a9463..7f73ed1 100644 --- a/api/client/EchoHub.Client.UI.ListSources.ChannelListSource.html +++ b/api/client/EchoHub.Client.UI.ListSources.ChannelListSource.html @@ -459,8 +459,8 @@ Active channel gets a > indicator, unread channels are bright with a count ba -

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

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

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

Parameters

@@ -485,6 +485,8 @@ Active channel gets a > indicator, unread channels are bright with a count ba
privateChannels IReadOnlySet<string>
+
systemChannels IReadOnlySet<string>
+
diff --git a/api/client/EchoHub.Client.UI.MainWindow.html b/api/client/EchoHub.Client.UI.MainWindow.html index f5992f1..9236d39 100644 --- a/api/client/EchoHub.Client.UI.MainWindow.html +++ b/api/client/EchoHub.Client.UI.MainWindow.html @@ -882,6 +882,37 @@ Class MainWindow + +

+ HasPendingReplyIndicator + +

+ +
+
+ +
+
public bool HasPendingReplyIndicator { get; }
+
+ + + + + +

Property Value

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

Methods

@@ -943,8 +974,8 @@ Call after theme changes to refresh colors.

-

- EnsureChannelInList(string, bool?, bool?) +

+ EnsureChannelInList(string, bool?, bool?, bool?)

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

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

Parameters

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

isProtected bool?
+
isSystem bool?
+
@@ -1193,6 +1226,38 @@ Call after theme changes to refresh colors.

+ + +

+ SetReplyingTo(string?) + +

+ +

Shows/clears the "replying to" strip on the input frame's title. Pass null to clear.

+
+
+ +
+
public void SetReplyingTo(string? label)
+
+ +

Parameters

+
+
label string
+
+
+ + + + + + + + + + + +

@@ -1730,6 +1795,38 @@ Parameters: channel name, absolute paths of existing files.

+

+ OnImageOpenRequested + +

+ +

Fired when the user activates an image's "[open]" action to view it without saving. +Parameters: attachmentUrl, fileName.

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

Event Type

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

OnImagePasted @@ -1917,6 +2014,69 @@ screenshot tool). Parameters: channel name, PNG-encoded image bytes.

+

+ OnReplyCancelRequested + +

+ +

Fired when the user cancels a pending reply (Esc in the input field).

+
+
+ +
+
public event Action? OnReplyCancelRequested
+
+ + + + + + +

Event Type

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

+ OnReplyRequested + +

+ +

Fired when the user picks "Reply" on a message. Parameters: message id, sender username, +a short plain-text snippet for the reply strip.

+
+
+ +
+
public event Action<Guid, string, string>? OnReplyRequested
+
+ + + + + + +

Event Type

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

OnRollbackRequested diff --git a/api/core/EchoHub.Core.Constants.MessageConventions.html b/api/core/EchoHub.Core.Constants.MessageConventions.html new file mode 100644 index 0000000..c96562e --- /dev/null +++ b/api/core/EchoHub.Core.Constants.MessageConventions.html @@ -0,0 +1,322 @@ + + + + + Class MessageConventions | EchoHub Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+
Table of Contents
+ +
+
+ +
+
+
+ +
+
+ + + +
+ +
+ + + +

+Class MessageConventions +

+ +
+
Namespace
EchoHub.Core.Constants
+
Assembly
EchoHub.Core.dll
+
+ +

Cross-protocol message conventions. Action messages (/me) use the IRC CTCP ACTION +wire format 0x01 + "ACTION " + text + 0x01 as the stored content, so IRC clients +interoperate natively (irssi's /me arrives in exactly this shape) and the TUI renders +"* nick text". In end-to-end encrypted rooms the marker encrypts along with the text.

+
+
+ +
+
public static class MessageConventions
+
+ + + + +
+
Inheritance
+
+ +
MessageConventions
+
+
+ + + +
+
Inherited Members
+
+ + + + + + + +
+ + + + + + +

Fields +

+ + + +

+ ActionPrefix + +

+ +
+
+ +
+
public const string ActionPrefix = "\u0001ACTION "
+
+ + + + +

Field Value

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

+ ActionSuffix + +

+ +
+
+ +
+
public const string ActionSuffix = "\u0001"
+
+ + + + +

Field Value

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

Methods +

+ + + + +

+ FormatAction(string) + +

+ +
+
+ +
+
public static string FormatAction(string text)
+
+ +

Parameters

+
+
text string
+
+
+ +

Returns

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

+ TryParseAction(string, out string?) + +

+ +
+
+ +
+
public static bool TryParseAction(string content, out string? actionText)
+
+ +

Parameters

+
+
content string
+
+
actionText string
+
+
+ +

Returns

+
+
bool
+
+
+ + + + + + + + + + + + +
+ + + + +
+ +
+ +
+
+ +
+ + + + diff --git a/api/core/EchoHub.Core.Constants.html b/api/core/EchoHub.Core.Constants.html index b78ecc8..2f12e38 100644 --- a/api/core/EchoHub.Core.Constants.html +++ b/api/core/EchoHub.Core.Constants.html @@ -98,6 +98,14 @@ Classes
HubConstants
+
+
MessageConventions
+

Cross-protocol message conventions. Action messages (/me) use the IRC CTCP ACTION +wire format 0x01 + "ACTION " + text + 0x01 as the stored content, so IRC clients +interoperate natively (irssi's /me arrives in exactly this shape) and the TUI renders +"* nick text". In end-to-end encrypted rooms the marker encrypts along with the text.

+
+
ValidationConstants
diff --git a/api/core/EchoHub.Core.Contracts.IChannelService.html b/api/core/EchoHub.Core.Contracts.IChannelService.html index c529e2e..3b8d36b 100644 --- a/api/core/EchoHub.Core.Contracts.IChannelService.html +++ b/api/core/EchoHub.Core.Contracts.IChannelService.html @@ -246,6 +246,44 @@ Interface IChannelService + +

+ EnsureSystemChannelAsync(string, string?) + +

+ +
+
+ +
+
Task<ChannelDto> EnsureSystemChannelAsync(string channelName, string? topic = null)
+
+ +

Parameters

+
+
channelName string
+
+
topic string
+
+
+ +

Returns

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

diff --git a/api/core/EchoHub.Core.Contracts.IChatBroadcaster.html b/api/core/EchoHub.Core.Contracts.IChatBroadcaster.html index 2ee6028..3748329 100644 --- a/api/core/EchoHub.Core.Contracts.IChatBroadcaster.html +++ b/api/core/EchoHub.Core.Contracts.IChatBroadcaster.html @@ -158,6 +158,42 @@ Interface IChatBroadcaster + +

+ SendChannelDeletedAsync(string) + +

+ +
+
+ +
+
Task SendChannelDeletedAsync(string channelName)
+
+ +

Parameters

+
+
channelName string
+
+
+ +

Returns

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

@@ -310,16 +346,21 @@ Interface IChatBroadcaster -

- SendMessageToChannelAsync(string, MessageDto) +

+ SendMessageToChannelAsync(string, MessageDto, string?)

-
+

Broadcast a chat message to a channel. excludeConnectionId is the +connection the message originated from (IRC convention: never echo a message back to +the connection that sent it — its client already displayed it locally). Other +connections of the same user (e.g. an IRC session alongside a TUI session) still +receive the message.

+
-
Task SendMessageToChannelAsync(string channelName, MessageDto message)
+
Task SendMessageToChannelAsync(string channelName, MessageDto message, string? excludeConnectionId = null)

Parameters

@@ -328,6 +369,8 @@ Interface IChatBroadcaster MessageDto
+
excludeConnectionId string
+

Returns

diff --git a/api/core/EchoHub.Core.Contracts.IChatService.html b/api/core/EchoHub.Core.Contracts.IChatService.html index 3798d96..b753e17 100644 --- a/api/core/EchoHub.Core.Contracts.IChatService.html +++ b/api/core/EchoHub.Core.Contracts.IChatService.html @@ -120,6 +120,42 @@ Interface IChatService + +

+ BroadcastChannelDeletedAsync(string) + +

+ +
+
+ +
+
Task BroadcastChannelDeletedAsync(string channelName)
+
+ +

Parameters

+
+
channelName string
+
+
+ +

Returns

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

@@ -394,8 +430,8 @@ Interface IChatService -

- SendMessageAsync(Guid, string, string, string) +

+ SendMessageAsync(Guid, string, string, string, string?, Guid?)

@@ -403,7 +439,7 @@ Interface IChatService
-
Task<string?> SendMessageAsync(Guid userId, string username, string channelName, string content)
+
Task<string?> SendMessageAsync(Guid userId, string username, string channelName, string content, string? originConnectionId = null, Guid? replyToMessageId = null)

Parameters

@@ -416,6 +452,10 @@ Interface IChatService
string
+
originConnectionId string
+
+
replyToMessageId Guid?
+

Returns

diff --git a/api/core/EchoHub.Core.Contracts.IEchoHubClient.html b/api/core/EchoHub.Core.Contracts.IEchoHubClient.html index d2bd040..b4117aa 100644 --- a/api/core/EchoHub.Core.Contracts.IEchoHubClient.html +++ b/api/core/EchoHub.Core.Contracts.IEchoHubClient.html @@ -121,6 +121,42 @@ Interface IEchoHubClient + +

+ ChannelDeleted(string) + +

+ +
+
+ +
+
Task ChannelDeleted(string channelName)
+
+ +

Parameters

+
+
channelName string
+
+
+ +

Returns

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

diff --git a/api/core/EchoHub.Core.Contracts.IUserService.html b/api/core/EchoHub.Core.Contracts.IUserService.html index b75b1e0..1a93a17 100644 --- a/api/core/EchoHub.Core.Contracts.IUserService.html +++ b/api/core/EchoHub.Core.Contracts.IUserService.html @@ -232,8 +232,8 @@ Interface IUserService -

- RegisterUserAsync(string, string, string?) +

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

@@ -241,7 +241,7 @@ Interface IUserService
-
Task<UserOperationResult> RegisterUserAsync(string username, string password, string? displayName = null)
+
Task<UserOperationResult> RegisterUserAsync(string username, string password, string? displayName = null, string? inviteCode = null)

Parameters

@@ -252,6 +252,8 @@ Interface IUserService
string
+
inviteCode string
+

Returns

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

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

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

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

Parameters

@@ -212,6 +212,8 @@ Class ChannelDto
IsEncrypted bool
+
IsSystem bool
+
@@ -415,6 +417,37 @@ Class ChannelDto + +

+ IsSystem + +

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

Property Value

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

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

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

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

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

Parameters

@@ -544,6 +577,8 @@ Class ChannelDto
IsEncrypted bool
+
IsSystem bool
+
diff --git a/api/core/EchoHub.Core.DTOs.CreateInviteRequest.html b/api/core/EchoHub.Core.DTOs.CreateInviteRequest.html new file mode 100644 index 0000000..07cfec9 --- /dev/null +++ b/api/core/EchoHub.Core.DTOs.CreateInviteRequest.html @@ -0,0 +1,625 @@ + + + + + Class CreateInviteRequest | EchoHub Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+
Table of Contents
+ +
+
+ +
+
+
+ +
+
+ + + +
+ +
+ + + +

+Class CreateInviteRequest +

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

Constructors +

+ + + + +

+ CreateInviteRequest(CreateInviteRequest) + +

+ +
+
+ +
+
protected CreateInviteRequest(CreateInviteRequest original)
+
+ +

Parameters

+
+
original CreateInviteRequest
+
+
+ + + + + + + + + + + + + + +

+ CreateInviteRequest(int?, int?) + +

+ +
+
+ +
+
public CreateInviteRequest(int? MaxUses = null, int? ExpiresInHours = null)
+
+ +

Parameters

+
+
MaxUses int?
+
+
ExpiresInHours int?
+
+
+ + + + + + + + + + + + +

Properties +

+ + + + +

+ EqualityContract + +

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

Property Value

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

+ ExpiresInHours + +

+ +
+
+ +
+
public int? ExpiresInHours { get; init; }
+
+ + + + + +

Property Value

+
+
int?
+
+
+ + + + + + + + + + +

+ MaxUses + +

+ +
+
+ +
+
public int? MaxUses { get; init; }
+
+ + + + + +

Property Value

+
+
int?
+
+
+ + + + + + + + +

Methods +

+ + + + +

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

+ +
+
+ +
+
public void Deconstruct(out int? MaxUses, out int? ExpiresInHours)
+
+ +

Parameters

+
+
MaxUses int?
+
+
ExpiresInHours int?
+
+
+ + + + + + + + + + + + + + +

+ Equals(CreateInviteRequest?) + +

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

Parameters

+
+
other CreateInviteRequest
+
+
+ +

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

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

Parameters

+
+
left CreateInviteRequest
+
+
right CreateInviteRequest
+
+
+ +

Returns

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

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

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

Parameters

+
+
left CreateInviteRequest
+
+
right CreateInviteRequest
+
+
+ +

Returns

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

+Class DeleteAccountRequest +

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

Password re-confirmation for destructive self-service account actions.

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

Constructors +

+ + + + +

+ DeleteAccountRequest(DeleteAccountRequest) + +

+ +
+
+ +
+
protected DeleteAccountRequest(DeleteAccountRequest original)
+
+ +

Parameters

+
+
original DeleteAccountRequest
+
+
+ + + + + + + + + + + + + + +

+ DeleteAccountRequest(string) + +

+ +

Password re-confirmation for destructive self-service account actions.

+
+
+ +
+
public DeleteAccountRequest(string Password)
+
+ +

Parameters

+
+
Password string
+
+
+ + + + + + + + + + + + +

Properties +

+ + + + +

+ EqualityContract + +

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

Property Value

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

+ Password + +

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

Property Value

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

Methods +

+ + + + +

+ Deconstruct(out string) + +

+ +
+
+ +
+
public void Deconstruct(out string Password)
+
+ +

Parameters

+
+
Password string
+
+
+ + + + + + + + + + + + + + +

+ Equals(DeleteAccountRequest?) + +

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

Parameters

+
+
other DeleteAccountRequest
+
+
+ +

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

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

Parameters

+
+
left DeleteAccountRequest
+
+
right DeleteAccountRequest
+
+
+ +

Returns

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

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

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

Parameters

+
+
left DeleteAccountRequest
+
+
right DeleteAccountRequest
+
+
+ +

Returns

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

+Class ExportedAttachmentDto +

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

Constructors +

+ + + + +

+ ExportedAttachmentDto(ExportedAttachmentDto) + +

+ +
+
+ +
+
protected ExportedAttachmentDto(ExportedAttachmentDto original)
+
+ +

Parameters

+
+
original ExportedAttachmentDto
+
+
+ + + + + + + + + + + + + + +

+ ExportedAttachmentDto(string, string, long, string, string, DateTimeOffset) + +

+ +
+
+ +
+
public ExportedAttachmentDto(string FileName, string Url, long FileSize, string Kind, string ChannelName, DateTimeOffset SentAt)
+
+ +

Parameters

+
+
FileName string
+
+
Url string
+
+
FileSize long
+
+
Kind string
+
+
ChannelName string
+
+
SentAt DateTimeOffset
+
+
+ + + + + + + + + + + + +

Properties +

+ + + + +

+ ChannelName + +

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

Property Value

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

+ EqualityContract + +

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

Property Value

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

+ FileName + +

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

Property Value

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

+ FileSize + +

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

Property Value

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

+ Kind + +

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

Property Value

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

+ SentAt + +

+ +
+
+ +
+
public DateTimeOffset SentAt { get; init; }
+
+ + + + + +

Property Value

+
+
DateTimeOffset
+
+
+ + + + + + + + + + +

+ Url + +

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

Property Value

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

Methods +

+ + + + +

+ Deconstruct(out string, out string, out long, out string, out string, out DateTimeOffset) + +

+ +
+
+ +
+
public void Deconstruct(out string FileName, out string Url, out long FileSize, out string Kind, out string ChannelName, out DateTimeOffset SentAt)
+
+ +

Parameters

+
+
FileName string
+
+
Url string
+
+
FileSize long
+
+
Kind string
+
+
ChannelName string
+
+
SentAt DateTimeOffset
+
+
+ + + + + + + + + + + + + + +

+ Equals(ExportedAttachmentDto?) + +

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

Parameters

+
+
other ExportedAttachmentDto
+
+
+ +

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

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

Parameters

+
+
left ExportedAttachmentDto
+
+
right ExportedAttachmentDto
+
+
+ +

Returns

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

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

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

Parameters

+
+
left ExportedAttachmentDto
+
+
right ExportedAttachmentDto
+
+
+ +

Returns

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

+Class ExportedMessageDto +

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

Constructors +

+ + + + +

+ ExportedMessageDto(ExportedMessageDto) + +

+ +
+
+ +
+
protected ExportedMessageDto(ExportedMessageDto original)
+
+ +

Parameters

+
+
original ExportedMessageDto
+
+
+ + + + + + + + + + + + + + +

+ ExportedMessageDto(Guid, string, DateTimeOffset, string, Guid?) + +

+ +
+
+ +
+
public ExportedMessageDto(Guid Id, string ChannelName, DateTimeOffset SentAt, string Content, Guid? ReplyToMessageId)
+
+ +

Parameters

+
+
Id Guid
+
+
ChannelName string
+
+
SentAt DateTimeOffset
+
+
Content string
+
+
ReplyToMessageId Guid?
+
+
+ + + + + + + + + + + + +

Properties +

+ + + + +

+ ChannelName + +

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

Property Value

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

+ Content + +

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

Property Value

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

+ EqualityContract + +

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

Property Value

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

+ Id + +

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

Property Value

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

+ ReplyToMessageId + +

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

Property Value

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

+ SentAt + +

+ +
+
+ +
+
public DateTimeOffset SentAt { get; init; }
+
+ + + + + +

Property Value

+
+
DateTimeOffset
+
+
+ + + + + + + + +

Methods +

+ + + + +

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

+ +
+
+ +
+
public void Deconstruct(out Guid Id, out string ChannelName, out DateTimeOffset SentAt, out string Content, out Guid? ReplyToMessageId)
+
+ +

Parameters

+
+
Id Guid
+
+
ChannelName string
+
+
SentAt DateTimeOffset
+
+
Content string
+
+
ReplyToMessageId Guid?
+
+
+ + + + + + + + + + + + + + +

+ Equals(ExportedMessageDto?) + +

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

Parameters

+
+
other ExportedMessageDto
+
+
+ +

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

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

Parameters

+
+
left ExportedMessageDto
+
+
right ExportedMessageDto
+
+
+ +

Returns

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

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

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

Parameters

+
+
left ExportedMessageDto
+
+
right ExportedMessageDto
+
+
+ +

Returns

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

+Class InviteDto +

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

Constructors +

+ + + + +

+ InviteDto(InviteDto) + +

+ +
+
+ +
+
protected InviteDto(InviteDto original)
+
+ +

Parameters

+
+
original InviteDto
+
+
+ + + + + + + + + + + + + + +

+ InviteDto(string, string, DateTimeOffset, DateTimeOffset?, int, int) + +

+ +
+
+ +
+
public InviteDto(string Code, string CreatedByUsername, DateTimeOffset CreatedAt, DateTimeOffset? ExpiresAt, int MaxUses, int UseCount)
+
+ +

Parameters

+
+
Code string
+
+
CreatedByUsername string
+
+
CreatedAt DateTimeOffset
+
+
ExpiresAt DateTimeOffset?
+
+
MaxUses int
+
+
UseCount int
+
+
+ + + + + + + + + + + + +

Properties +

+ + + + +

+ Code + +

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

Property Value

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

+ CreatedAt + +

+ +
+
+ +
+
public DateTimeOffset CreatedAt { get; init; }
+
+ + + + + +

Property Value

+
+
DateTimeOffset
+
+
+ + + + + + + + + + +

+ CreatedByUsername + +

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

Property Value

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

+ EqualityContract + +

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

Property Value

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

+ ExpiresAt + +

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

Property Value

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

+ MaxUses + +

+ +
+
+ +
+
public int MaxUses { get; init; }
+
+ + + + + +

Property Value

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

+ UseCount + +

+ +
+
+ +
+
public int UseCount { get; init; }
+
+ + + + + +

Property Value

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

Methods +

+ + + + +

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

+ +
+
+ +
+
public void Deconstruct(out string Code, out string CreatedByUsername, out DateTimeOffset CreatedAt, out DateTimeOffset? ExpiresAt, out int MaxUses, out int UseCount)
+
+ +

Parameters

+
+
Code string
+
+
CreatedByUsername string
+
+
CreatedAt DateTimeOffset
+
+
ExpiresAt DateTimeOffset?
+
+
MaxUses int
+
+
UseCount int
+
+
+ + + + + + + + + + + + + + +

+ Equals(InviteDto?) + +

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

Parameters

+
+
other InviteDto
+
+
+ +

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

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

Parameters

+
+
left InviteDto
+
+
right InviteDto
+
+
+ +

Returns

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

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

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

Parameters

+
+
left InviteDto
+
+
right InviteDto
+
+
+ +

Returns

+
+
bool
+
+
+ + + + + + + + + + + + +
+ + + + +
+ +
+ +
+
+ +
+ + + + diff --git a/api/core/EchoHub.Core.DTOs.MessageDto.html b/api/core/EchoHub.Core.DTOs.MessageDto.html index 7e19819..d3f78cf 100644 --- a/api/core/EchoHub.Core.DTOs.MessageDto.html +++ b/api/core/EchoHub.Core.DTOs.MessageDto.html @@ -182,8 +182,8 @@ Class MessageDto -

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

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

@@ -191,7 +191,7 @@ Class MessageDto
-
public MessageDto(Guid Id, string Content, string SenderUsername, string? SenderNicknameColor, string ChannelName, DateTimeOffset SentAt, List<AttachmentDto>? Attachments = null, List<EmbedDto>? Embeds = null, string? SenderDisplayName = null)
+
public MessageDto(Guid Id, string Content, string SenderUsername, string? SenderNicknameColor, string ChannelName, DateTimeOffset SentAt, List<AttachmentDto>? Attachments = null, List<EmbedDto>? Embeds = null, string? SenderDisplayName = null, ReplyRefDto? ReplyTo = null)

Parameters

@@ -214,6 +214,8 @@ Class MessageDto
SenderDisplayName string
+
ReplyTo ReplyRefDto
+
@@ -417,6 +419,37 @@ Class MessageDto + +

+ ReplyTo + +

+ +
+
+ +
+
public ReplyRefDto? ReplyTo { get; init; }
+
+ + + + + +

Property Value

+
+
ReplyRefDto
+
+
+ + + + + + + +

@@ -547,8 +580,8 @@ Class MessageDto -

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

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

@@ -556,7 +589,7 @@ Class MessageDto
-
public void Deconstruct(out Guid Id, out string Content, out string SenderUsername, out string? SenderNicknameColor, out string ChannelName, out DateTimeOffset SentAt, out List<AttachmentDto>? Attachments, out List<EmbedDto>? Embeds, out string? SenderDisplayName)
+
public void Deconstruct(out Guid Id, out string Content, out string SenderUsername, out string? SenderNicknameColor, out string ChannelName, out DateTimeOffset SentAt, out List<AttachmentDto>? Attachments, out List<EmbedDto>? Embeds, out string? SenderDisplayName, out ReplyRefDto? ReplyTo)

Parameters

@@ -579,6 +612,8 @@ Class MessageDto
SenderDisplayName string
+
ReplyTo ReplyRefDto
+
diff --git a/api/core/EchoHub.Core.DTOs.RegisterRequest.html b/api/core/EchoHub.Core.DTOs.RegisterRequest.html index b3dbbb5..08242ba 100644 --- a/api/core/EchoHub.Core.DTOs.RegisterRequest.html +++ b/api/core/EchoHub.Core.DTOs.RegisterRequest.html @@ -182,8 +182,8 @@ Class RegisterRequest -

- RegisterRequest(string, string, string?) +

+ RegisterRequest(string, string, string?, string?)

@@ -191,7 +191,7 @@ Class RegisterRequest
-
public RegisterRequest(string Username, string Password, string? DisplayName = null)
+
public RegisterRequest(string Username, string Password, string? DisplayName = null, string? InviteCode = null)

Parameters

@@ -202,6 +202,8 @@ Class RegisterRequest
string
+
InviteCode string
+
@@ -281,6 +283,37 @@ Class RegisterRequest + +

+ InviteCode + +

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

Property Value

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

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

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

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

@@ -358,7 +391,7 @@ Class RegisterRequest
-
public void Deconstruct(out string Username, out string Password, out string? DisplayName)
+
public void Deconstruct(out string Username, out string Password, out string? DisplayName, out string? InviteCode)

Parameters

@@ -369,6 +402,8 @@ Class RegisterRequest
string
+
InviteCode string
+
diff --git a/api/core/EchoHub.Core.DTOs.ReplyRefDto.html b/api/core/EchoHub.Core.DTOs.ReplyRefDto.html new file mode 100644 index 0000000..60d999a --- /dev/null +++ b/api/core/EchoHub.Core.DTOs.ReplyRefDto.html @@ -0,0 +1,668 @@ + + + + + Class ReplyRefDto | EchoHub Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+
Table of Contents
+ +
+
+ +
+
+
+ +
+
+ + + +
+ +
+ + + +

+Class ReplyRefDto +

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

Reference to the message a reply targets. Content is treated exactly like +message content on the wire: transport-encrypted, and for end-to-end encrypted rooms it is +room ciphertext the client must decrypt (the server truncates only plaintext snippets). +Null on a MessageDto when the original message no longer exists.

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

Constructors +

+ + + + +

+ ReplyRefDto(ReplyRefDto) + +

+ +
+
+ +
+
protected ReplyRefDto(ReplyRefDto original)
+
+ +

Parameters

+
+
original ReplyRefDto
+
+
+ + + + + + + + + + + + + + +

+ ReplyRefDto(Guid, string, string) + +

+ +

Reference to the message a reply targets. Content is treated exactly like +message content on the wire: transport-encrypted, and for end-to-end encrypted rooms it is +room ciphertext the client must decrypt (the server truncates only plaintext snippets). +Null on a MessageDto when the original message no longer exists.

+
+
+ +
+
public ReplyRefDto(Guid MessageId, string SenderUsername, string Content)
+
+ +

Parameters

+
+
MessageId Guid
+
+
SenderUsername string
+
+
Content string
+
+
+ + + + + + + + + + + + +

Properties +

+ + + + +

+ Content + +

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

Property Value

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

+ EqualityContract + +

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

Property Value

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

+ MessageId + +

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

Property Value

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

+ SenderUsername + +

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

Property Value

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

Methods +

+ + + + +

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

+ +
+
+ +
+
public void Deconstruct(out Guid MessageId, out string SenderUsername, out string Content)
+
+ +

Parameters

+
+
MessageId Guid
+
+
SenderUsername string
+
+
Content string
+
+
+ + + + + + + + + + + + + + +

+ Equals(ReplyRefDto?) + +

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

Parameters

+
+
other ReplyRefDto
+
+
+ +

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

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

Parameters

+
+
left ReplyRefDto
+
+
right ReplyRefDto
+
+
+ +

Returns

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

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

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

Parameters

+
+
left ReplyRefDto
+
+
right ReplyRefDto
+
+
+ +

Returns

+
+
bool
+
+
+ + + + + + + + + + + + +
+ + + + +
+ +
+ +
+
+ +
+ + + + diff --git a/api/core/EchoHub.Core.DTOs.ServerStatusDto.html b/api/core/EchoHub.Core.DTOs.ServerStatusDto.html index 5a5608c..cc7c636 100644 --- a/api/core/EchoHub.Core.DTOs.ServerStatusDto.html +++ b/api/core/EchoHub.Core.DTOs.ServerStatusDto.html @@ -182,8 +182,8 @@ Class ServerStatusDto -

- ServerStatusDto(string, string?, int, int) +

+ ServerStatusDto(string, string?, int, int, string)

@@ -191,7 +191,7 @@ Class ServerStatusDto
-
public ServerStatusDto(string Name, string? Description, int OnlineUsers, int TotalChannels)
+
public ServerStatusDto(string Name, string? Description, int OnlineUsers, int TotalChannels, string RegistrationMode = "open")

Parameters

@@ -204,6 +204,8 @@ Class ServerStatusDto
int
+
RegistrationMode string
+
@@ -345,6 +347,37 @@ Class ServerStatusDto + +

+ RegistrationMode + +

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

Property Value

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

@@ -382,8 +415,8 @@ Class ServerStatusDto -

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

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

@@ -391,7 +424,7 @@ Class ServerStatusDto
-
public void Deconstruct(out string Name, out string? Description, out int OnlineUsers, out int TotalChannels)
+
public void Deconstruct(out string Name, out string? Description, out int OnlineUsers, out int TotalChannels, out string RegistrationMode)

Parameters

@@ -404,6 +437,8 @@ Class ServerStatusDto
int
+
RegistrationMode string
+
diff --git a/api/core/EchoHub.Core.DTOs.UserDataExportDto.html b/api/core/EchoHub.Core.DTOs.UserDataExportDto.html new file mode 100644 index 0000000..8d0589a --- /dev/null +++ b/api/core/EchoHub.Core.DTOs.UserDataExportDto.html @@ -0,0 +1,734 @@ + + + + + Class UserDataExportDto | EchoHub Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+
Table of Contents
+ +
+
+ +
+
+
+ +
+
+ + + +
+ +
+ + + +

+Class UserDataExportDto +

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

Everything the server holds about a user, as stored. For end-to-end encrypted rooms the +message content in here is room ciphertext — the server cannot include plaintext it never had.

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

Constructors +

+ + + + +

+ UserDataExportDto(UserDataExportDto) + +

+ +
+
+ +
+
protected UserDataExportDto(UserDataExportDto original)
+
+ +

Parameters

+
+
original UserDataExportDto
+
+
+ + + + + + + + + + + + + + +

+ UserDataExportDto(DateTimeOffset, string, UserProfileDto, List<ExportedMessageDto>, List<ExportedAttachmentDto>) + +

+ +

Everything the server holds about a user, as stored. For end-to-end encrypted rooms the +message content in here is room ciphertext — the server cannot include plaintext it never had.

+
+
+ +
+
public UserDataExportDto(DateTimeOffset ExportedAt, string ServerName, UserProfileDto Profile, List<ExportedMessageDto> Messages, List<ExportedAttachmentDto> Attachments)
+
+ +

Parameters

+
+
ExportedAt DateTimeOffset
+
+
ServerName string
+
+
Profile UserProfileDto
+
+
Messages List<ExportedMessageDto>
+
+
Attachments List<ExportedAttachmentDto>
+
+
+ + + + + + + + + + + + +

Properties +

+ + + + +

+ Attachments + +

+ +
+
+ +
+
public List<ExportedAttachmentDto> Attachments { get; init; }
+
+ + + + + +

Property Value

+
+
List<ExportedAttachmentDto>
+
+
+ + + + + + + + + + +

+ EqualityContract + +

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

Property Value

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

+ ExportedAt + +

+ +
+
+ +
+
public DateTimeOffset ExportedAt { get; init; }
+
+ + + + + +

Property Value

+
+
DateTimeOffset
+
+
+ + + + + + + + + + +

+ Messages + +

+ +
+
+ +
+
public List<ExportedMessageDto> Messages { get; init; }
+
+ + + + + +

Property Value

+
+
List<ExportedMessageDto>
+
+
+ + + + + + + + + + +

+ Profile + +

+ +
+
+ +
+
public UserProfileDto Profile { get; init; }
+
+ + + + + +

Property Value

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

+ ServerName + +

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

Property Value

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

Methods +

+ + + + +

+ Deconstruct(out DateTimeOffset, out string, out UserProfileDto, out List<ExportedMessageDto>, out List<ExportedAttachmentDto>) + +

+ +
+
+ +
+
public void Deconstruct(out DateTimeOffset ExportedAt, out string ServerName, out UserProfileDto Profile, out List<ExportedMessageDto> Messages, out List<ExportedAttachmentDto> Attachments)
+
+ +

Parameters

+
+
ExportedAt DateTimeOffset
+
+
ServerName string
+
+
Profile UserProfileDto
+
+
Messages List<ExportedMessageDto>
+
+
Attachments List<ExportedAttachmentDto>
+
+
+ + + + + + + + + + + + + + +

+ Equals(UserDataExportDto?) + +

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

Parameters

+
+
other UserDataExportDto
+
+
+ +

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

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

Parameters

+
+
left UserDataExportDto
+
+
right UserDataExportDto
+
+
+ +

Returns

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

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

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

Parameters

+
+
left UserDataExportDto
+
+
right UserDataExportDto
+
+
+ +

Returns

+
+
bool
+
+
+ + + + + + + + + + + + +
+ + + + +
+ +
+ +
+
+ +
+ + + + diff --git a/api/core/EchoHub.Core.DTOs.html b/api/core/EchoHub.Core.DTOs.html index 4692b85..b31235c 100644 --- a/api/core/EchoHub.Core.DTOs.html +++ b/api/core/EchoHub.Core.DTOs.html @@ -147,6 +147,15 @@ attachment blob sizes plus message text length, so it is an estimate, not an exa
CreateChannelRequest
+
+
CreateInviteRequest
+
+
+
+
DeleteAccountRequest
+

Password re-confirmation for destructive self-service account actions.

+
+
EmbedDto
@@ -159,6 +168,18 @@ attachment blob sizes plus message text length, so it is an estimate, not an exa
ErrorResponse
+
+
ExportedAttachmentDto
+
+
+
+
ExportedMessageDto
+
+
+
+
InviteDto
+
+
JoinChannelResult
@@ -199,6 +220,14 @@ attachment blob sizes plus message text length, so it is an estimate, not an exa
RekeyChannelRequest

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

+
+
+
+
ReplyRefDto
+

Reference to the message a reply targets. Content is treated exactly like +message content on the wire: transport-encrypted, and for end-to-end encrypted rooms it is +room ciphertext the client must decrypt (the server truncates only plaintext snippets). +Null on a MessageDto when the original message no longer exists.

@@ -225,6 +254,12 @@ passphrase (old auth key), then supplies the re-wrapped room key under the new o
UpdateTopicRequest
+
+
UserDataExportDto
+

Everything the server holds about a user, as stored. For end-to-end encrypted rooms the +message content in here is room ciphertext — the server cannot include plaintext it never had.

+
+
UserDto
diff --git a/api/core/EchoHub.Core.Models.Channel.html b/api/core/EchoHub.Core.Models.Channel.html index cf670c5..e847557 100644 --- a/api/core/EchoHub.Core.Models.Channel.html +++ b/api/core/EchoHub.Core.Models.Channel.html @@ -337,6 +337,37 @@ Class Channel + +

+ IsSystem + +

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

Property Value

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

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

+Class InviteCode +

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

A registration invite code. When the server runs with Server:Registration = "invite", +new accounts (REST and IRC alike) require a valid, unexpired, not-fully-used code.

+
+
+ +
+
public class InviteCode
+
+ + + + +
+
Inheritance
+
+ +
InviteCode
+
+
+ + + +
+
Inherited Members
+
+ + + + + + + +
+ + + + + + +

Constructors +

+ + + + +

+ InviteCode() + +

+ +
+
+ +
+
public InviteCode()
+
+ + + + + + + + + + + + + +

Properties +

+ + + + +

+ Code + +

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

Property Value

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

+ CreatedAt + +

+ +
+
+ +
+
public DateTimeOffset CreatedAt { get; set; }
+
+ + + + + +

Property Value

+
+
DateTimeOffset
+
+
+ + + + + + + + + + +

+ CreatedByUserId + +

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

Property Value

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

+ CreatedByUsername + +

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

Property Value

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

+ ExpiresAt + +

+ +

Null means the code never expires.

+
+
+ +
+
public DateTimeOffset? ExpiresAt { get; set; }
+
+ + + + + +

Property Value

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

+ Id + +

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

Property Value

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

+ MaxUses + +

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

Property Value

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

+ UseCount + +

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

Property Value

+
+
int
+
+
+ + + + + + + + + +
+ + + + +
+ +
+ +
+
+ +
+ + + + diff --git a/api/core/EchoHub.Core.Models.Message.html b/api/core/EchoHub.Core.Models.Message.html index 603ae2d..9e7e46b 100644 --- a/api/core/EchoHub.Core.Models.Message.html +++ b/api/core/EchoHub.Core.Models.Message.html @@ -463,6 +463,38 @@ Class Message + +

+ ReplyToMessageId + +

+ +

Message this one replies to, if any. The target may since have been deleted.

+
+
+ +
+
public Guid? ReplyToMessageId { get; set; }
+
+ + + + + +

Property Value

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

diff --git a/api/core/EchoHub.Core.Models.html b/api/core/EchoHub.Core.Models.html index cbca0c7..ff32b58 100644 --- a/api/core/EchoHub.Core.Models.html +++ b/api/core/EchoHub.Core.Models.html @@ -108,6 +108,12 @@ zero or more attachments alongside its text content (Discord-style).

ChannelMembership

+
+
InviteCode
+

A registration invite code. When the server runs with Server:Registration = "invite", +new accounts (REST and IRC alike) require a valid, unexpired, not-fully-used code.

+
+
Message
diff --git a/api/core/EchoHub.Core.Services.AsciiBannerService.html b/api/core/EchoHub.Core.Services.AsciiBannerService.html new file mode 100644 index 0000000..bfac3af --- /dev/null +++ b/api/core/EchoHub.Core.Services.AsciiBannerService.html @@ -0,0 +1,256 @@ + + + + + Class AsciiBannerService | EchoHub Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+
Table of Contents
+ +
+
+ +
+
+
+ +
+
+ + + +
+ +
+ + + +

+Class AsciiBannerService +

+ +
+
Namespace
EchoHub.Core.Services
+
Assembly
EchoHub.Core.dll
+
+ +

Renders short text as a 5-row block-character banner (the /banner command). +Entirely local — a hand-rolled figlet-style font, no dependencies, no network. +Output is plain message content, so it travels (and encrypts) like any other text.

+
+
+ +
+
public static class AsciiBannerService
+
+ + + + +
+
Inheritance
+
+ +
AsciiBannerService
+
+
+ + + +
+
Inherited Members
+
+ + + + + + + +
+ + + + + + +

Fields +

+ + + +

+ MaxInputLength + +

+ +
+
+ +
+
public const int MaxInputLength = 20
+
+ + + + +

Field Value

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

Methods +

+ + + + +

+ Render(string) + +

+ +

Renders text as banner lines joined with '\n'. +Returns null when the input is empty or contains no renderable characters. +Characters outside the font (letters, digits, and basic punctuation) are skipped.

+
+
+ +
+
public static string? Render(string text)
+
+ +

Parameters

+
+
text string
+
+
+ +

Returns

+
+
string
+
+
+ + + + + + + + + + + + +
+ + + + +
+ +
+ +
+
+ +
+ + + + diff --git a/api/core/EchoHub.Core.Services.html b/api/core/EchoHub.Core.Services.html index d55fffa..dfa4acc 100644 --- a/api/core/EchoHub.Core.Services.html +++ b/api/core/EchoHub.Core.Services.html @@ -94,6 +94,13 @@

Classes

+
+
AsciiBannerService
+

Renders short text as a 5-row block-character banner (the /banner command). +Entirely local — a hand-rolled figlet-style font, no dependencies, no network. +Output is plain message content, so it travels (and encrypts) like any other text.

+
+
FileValidationHelper
diff --git a/api/server-irc/EchoHub.Server.Irc.IrcBroadcaster.html b/api/server-irc/EchoHub.Server.Irc.IrcBroadcaster.html index 1170558..70151fd 100644 --- a/api/server-irc/EchoHub.Server.Irc.IrcBroadcaster.html +++ b/api/server-irc/EchoHub.Server.Irc.IrcBroadcaster.html @@ -233,6 +233,42 @@ Class IrcBroadcaster + +

+ SendChannelDeletedAsync(string) + +

+ +
+
+ +
+
public Task SendChannelDeletedAsync(string channelName)
+
+ +

Parameters

+
+
channelName string
+
+
+ +

Returns

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

@@ -385,16 +421,21 @@ Class IrcBroadcaster -

- SendMessageToChannelAsync(string, MessageDto) +

+ SendMessageToChannelAsync(string, MessageDto, string?)

-
+

Broadcast a chat message to a channel. excludeConnectionId is the +connection the message originated from (IRC convention: never echo a message back to +the connection that sent it — its client already displayed it locally). Other +connections of the same user (e.g. an IRC session alongside a TUI session) still +receive the message.

+
-
public Task SendMessageToChannelAsync(string channelName, MessageDto message)
+
public Task SendMessageToChannelAsync(string channelName, MessageDto message, string? excludeConnectionId = null)

Parameters

@@ -403,6 +444,8 @@ Class IrcBroadcaster MessageDto
+
excludeConnectionId string
+

Returns

diff --git a/api/server-irc/EchoHub.Server.Irc.IrcMessageFormatter.html b/api/server-irc/EchoHub.Server.Irc.IrcMessageFormatter.html index 9985f63..5469eaf 100644 --- a/api/server-irc/EchoHub.Server.Irc.IrcMessageFormatter.html +++ b/api/server-irc/EchoHub.Server.Irc.IrcMessageFormatter.html @@ -152,63 +152,30 @@ Class IrcMessageFormatter - -

- ColorTagsToAnsi(string) - -

- -

Convert printable color tags ({F:RRGGBB}, {B:RRGGBB}, {X}) to ANSI escape codes for IRC clients. -Also passes through content that already uses ANSI codes unchanged.

-
-
- -
-
public static string ColorTagsToAnsi(string text)
-
- -

Parameters

-
-
text string
-
-
- -

Returns

-
-
string
-
-
- - - - - - - - - - - -

- FormatMessage(MessageDto) +

+ FormatMessage(MessageDto, string?)

-

Format a MessageDto as one or more IRC PRIVMSG lines.

+

Format a MessageDto as one or more IRC PRIVMSG lines. +Attachments are rendered as single link lines \u2014 the widely-supported IRC convention +(clients auto-preview or open plain http(s) URLs) \u2014 never as terminal color art. +publicBaseUrl makes the links absolute so any IRC client can open them.

-
public static List<string> FormatMessage(MessageDto message)
+
public static List<string> FormatMessage(MessageDto message, string? publicBaseUrl = null)

Parameters

message MessageDto
+
publicBaseUrl string
+

Returns

@@ -266,6 +233,46 @@ Also passes through content that already uses ANSI codes unchanged.

+ + +

+ ToAbsoluteUrl(string, string?) + +

+ +

Joins a relative attachment path onto the configured public base URL. +Already-absolute URLs and unset base URLs pass through unchanged.

+
+
+ +
+
public static string ToAbsoluteUrl(string url, string? publicBaseUrl)
+
+ +

Parameters

+
+
url string
+
+
publicBaseUrl string
+
+
+ +

Returns

+
+
string
+
+
+ + + + + + + + + + + diff --git a/api/server-irc/EchoHub.Server.Irc.IrcOptions.html b/api/server-irc/EchoHub.Server.Irc.IrcOptions.html index 2911ec2..1fbf235 100644 --- a/api/server-irc/EchoHub.Server.Irc.IrcOptions.html +++ b/api/server-irc/EchoHub.Server.Irc.IrcOptions.html @@ -306,6 +306,40 @@ Class IrcOptions + +

+ PublicBaseUrl + +

+ +

Public HTTP(S) base of this EchoHub server (e.g. "https://chat.example.com"), +used to turn relative attachment URLs into absolute links IRC clients can open. +When unset, attachment lines fall back to the relative path.

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

Property Value

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

diff --git a/api/server/EchoHub.Server.Config.ServerLogsOptions.html b/api/server/EchoHub.Server.Config.ServerLogsOptions.html new file mode 100644 index 0000000..0d23d24 --- /dev/null +++ b/api/server/EchoHub.Server.Config.ServerLogsOptions.html @@ -0,0 +1,469 @@ + + + + + Class ServerLogsOptions | EchoHub Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+
Table of Contents
+ +
+
+ +
+
+
+ +
+
+ + + +
+ +
+ + + +

+Class ServerLogsOptions +

+ +
+
Namespace
EchoHub.Server.Config
+
Assembly
EchoHub.Server.dll
+
+ +

Live server-log room settings, bound from the "ServerLogs" config section (env override: +ServerLogs__Enabled etc.). When enabled, a read-only system channel is auto-created +and log events are streamed to it live — log lines are never stored as messages in the +database; the rolling Serilog log files remain the only persistence.

+
+
+ +
+
public sealed class ServerLogsOptions
+
+ + + + +
+
Inheritance
+
+ +
ServerLogsOptions
+
+
+ + + +
+
Inherited Members
+
+ + + + + + +
+ + + + + + +

Constructors +

+ + + + +

+ ServerLogsOptions() + +

+ +
+
+ +
+
public ServerLogsOptions()
+
+ + + + + + + + + + + + + +

Properties +

+ + + + +

+ BacklogLines + +

+ +

How many recent log entries are replayed from the log file when someone opens the room.

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

Property Value

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

+ Enabled + +

+ +

Master switch for the live log room.

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

Property Value

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

+ LogDirectory + +

+ +

Directory holding the rolling log files. Must match the Serilog file sink's path.

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

Property Value

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

+ LogFilePattern + +

+ +

Filename glob for the rolling log files inside LogDirectory.

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

Property Value

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

+ MinLevel + +

+ +

Minimum level of log events streamed to the room (Verbose/Debug/Information/Warning/ +Error/Fatal). Only affects the room — file and console sinks keep their own levels.

+
+
+ +
+
public LogEventLevel MinLevel { get; set; }
+
+ + + + + +

Property Value

+
+
LogEventLevel
+
+
+ + + + + + + + + + +

+ MinRole + +

+ +

Minimum server role allowed to see and join the log room (Member/Mod/Admin/Owner).

+
+
+ +
+
public ServerRole MinRole { get; set; }
+
+ + + + + +

Property Value

+
+
ServerRole
+
+
+ + + + + + + + + + +

+ NormalizedRoomName + +

+ +

Channel names are stored lowercased; compare against this form.

+
+
+ +
+
public string NormalizedRoomName { get; }
+
+ + + + + +

Property Value

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

+ RoomName + +

+ +

Name of the auto-created system channel. Must satisfy the normal channel-name rules; +the name is reserved — users cannot create a channel with it.

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

Property Value

+
+
string
+
+
+ + + + + + + + + +
+ + + + +
+ +
+ +
+
+ +
+ + + + diff --git a/api/server/EchoHub.Server.Config.SpamOptions.html b/api/server/EchoHub.Server.Config.SpamOptions.html new file mode 100644 index 0000000..a68de6d --- /dev/null +++ b/api/server/EchoHub.Server.Config.SpamOptions.html @@ -0,0 +1,564 @@ + + + + + Class SpamOptions | EchoHub Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+
Table of Contents
+ +
+
+ +
+
+
+ +
+
+ + + +
+ +
+ + + +

+Class SpamOptions +

+ +
+
Namespace
EchoHub.Server.Config
+
Assembly
EchoHub.Server.dll
+
+ +

Anti-spam thresholds, bound from the "Spam" config section. Defaults are lenient enough +that a fast typist never trips them; Mods and above are always exempt.

+
+
+ +
+
public sealed class SpamOptions
+
+ + + + +
+
Inheritance
+
+ +
SpamOptions
+
+
+ + + +
+
Inherited Members
+
+ + + + + + +
+ + + + + + +

Constructors +

+ + + + +

+ SpamOptions() + +

+ +
+
+ +
+
public SpamOptions()
+
+ + + + + + + + + + + + + +

Properties +

+ + + + +

+ AutoMuteMinutes + +

+ +

Auto-mute duration once a user accumulates ViolationThreshold rejected +sends within ViolationWindowMinutes. 0 disables auto-mute (rejections +still apply). The mute uses the normal timed-mute machinery, so moderators see it +and MuteExpirationService lifts it.

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

Property Value

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

+ ChannelCreateWindowMinutes + +

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

Property Value

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

+ Enabled + +

+ +

Master switch for all spam protection.

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

Property Value

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

+ JoinWindowSeconds + +

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

Property Value

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

+ MaxChannelCreatesPerWindow + +

+ +

Max channel creations per ChannelCreateWindowMinutes window.

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

Property Value

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

+ MaxDuplicateMessages + +

+ +

How many identical messages in a row are tolerated; the next one is rejected. +(End-to-end encrypted rooms are naturally exempt — identical plaintext produces +different ciphertext per message, so repeats never look identical to the server.)

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

Property Value

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

+ MaxJoinsPerWindow + +

+ +

Max first-time channel joins per JoinWindowSeconds window. Joins of +channels the user already belongs to (reconnect/auto-join) never count, but a brand-new +user's first connect joins every public channel at once — keep this above your public +channel count.

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

Property Value

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

+ MaxMessagesPerWindow + +

+ +

Max messages a user may send per WindowSeconds window.

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

Property Value

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

+ ViolationThreshold + +

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

Property Value

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

+ ViolationWindowMinutes + +

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

Property Value

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

+ WindowSeconds + +

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

Property Value

+
+
int
+
+
+ + + + + + + + + +
+ + + + +
+ +
+ +
+
+ +
+ + + + diff --git a/api/server/EchoHub.Server.Config.html b/api/server/EchoHub.Server.Config.html index 544abc8..43a58c7 100644 --- a/api/server/EchoHub.Server.Config.html +++ b/api/server/EchoHub.Server.Config.html @@ -94,6 +94,20 @@

Classes

+
+
ServerLogsOptions
+

Live server-log room settings, bound from the "ServerLogs" config section (env override: +ServerLogs__Enabled etc.). When enabled, a read-only system channel is auto-created +and log events are streamed to it live — log lines are never stored as messages in the +database; the rolling Serilog log files remain the only persistence.

+
+
+
+
SpamOptions
+

Anti-spam thresholds, bound from the "Spam" config section. Defaults are lenient enough +that a fast typist never trips them; Mods and above are always exempt.

+
+
UploadLimits

Admin-configurable upload limits, bound from the Uploads configuration section. diff --git a/api/server/EchoHub.Server.Controllers.FilesController.html b/api/server/EchoHub.Server.Controllers.FilesController.html index 9632f2f..7981eef 100644 --- a/api/server/EchoHub.Server.Controllers.FilesController.html +++ b/api/server/EchoHub.Server.Controllers.FilesController.html @@ -199,11 +199,16 @@ public class FilesController : ControllerBase -

+

Serves an uploaded file. Anonymous by design: the unguessable GUID in the URL is the +access token (Discord-CDN-style capability URL), so attachment links can be opened +directly in a browser and shared to IRC clients. E2E-encrypted room blobs are +ciphertext at rest, so anonymous access reveals nothing for those channels.

+
[HttpGet("{fileId}")]
+[AllowAnonymous]
 public IActionResult GetFile(string fileId)
diff --git a/api/server/EchoHub.Server.Controllers.InvitesController.html b/api/server/EchoHub.Server.Controllers.InvitesController.html new file mode 100644 index 0000000..39a1a1d --- /dev/null +++ b/api/server/EchoHub.Server.Controllers.InvitesController.html @@ -0,0 +1,330 @@ + + + + + Class InvitesController | EchoHub Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+
Table of Contents
+ +
+
+ +
+
+
+ +
+
+ + + +
+ +
+ + + +

+Class InvitesController +

+ +
+
Namespace
EchoHub.Server.Controllers
+
Assembly
EchoHub.Server.dll
+
+ +

Invite-code management for invite-gated registration (Admin+ only). +Codes live in this server's own database — there is no central service.

+
+
+ +
+
[ApiController]
+[Route("api/invites")]
+[Authorize]
+[EnableRateLimiting("general")]
+public class InvitesController : ControllerBase
+
+ + + + +
+
Inheritance
+
+ +
ControllerBase
+
InvitesController
+
+
+ + + +
+
Inherited Members
+
+ + + + + + + +
+ + + + + + +

Constructors +

+ + + + +

+ InvitesController(EchoHubDbContext, ILogger<InvitesController>) + +

+ +
+
+ +
+
public InvitesController(EchoHubDbContext db, ILogger<InvitesController> logger)
+
+ +

Parameters

+
+
db EchoHubDbContext
+
+
logger ILogger<InvitesController>
+
+
+ + + + + + + + + + + + +

Methods +

+ + + + +

+ Create(CreateInviteRequest) + +

+ +
+
+ +
+
[HttpPost]
+public Task<IActionResult> Create(CreateInviteRequest request)
+
+ +

Parameters

+
+
request CreateInviteRequest
+
+
+ +

Returns

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

+ List() + +

+ +
+
+ +
+
[HttpGet]
+public Task<IActionResult> List()
+
+ + +

Returns

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

+ Revoke(string) + +

+ +
+
+ +
+
[HttpDelete("{code}")]
+public Task<IActionResult> Revoke(string code)
+
+ +

Parameters

+
+
code string
+
+
+ +

Returns

+
+
Task<IActionResult>
+
+
+ + + + + + + + + + + + +
+ + + + +
+ +
+ +
+
+ +
+ + + + diff --git a/api/server/EchoHub.Server.Controllers.UsersController.html b/api/server/EchoHub.Server.Controllers.UsersController.html index 59588f2..3c79626 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(IUserService, ImageToAsciiService, UploadLimits) +

+ UsersController(IUserService, ImageToAsciiService, UploadLimits, EchoHubDbContext, IMessageEncryptionService, FileStorageService, PresenceTracker, IEnumerable<IChatBroadcaster>, IConfiguration, ILogger<UsersController>)

@@ -168,7 +168,7 @@ public class UsersController : ControllerBase
-
public UsersController(IUserService userService, ImageToAsciiService asciiService, UploadLimits uploadLimits)
+
public UsersController(IUserService userService, ImageToAsciiService asciiService, UploadLimits uploadLimits, EchoHubDbContext db, IMessageEncryptionService encryption, FileStorageService fileStorage, PresenceTracker presenceTracker, IEnumerable<IChatBroadcaster> broadcasters, IConfiguration config, ILogger<UsersController> logger)

Parameters

@@ -179,6 +179,20 @@ public class UsersController : ControllerBase
uploadLimits UploadLimits
+
db EchoHubDbContext
+
+
encryption IMessageEncryptionService
+
+
fileStorage FileStorageService
+
+
presenceTracker PresenceTracker
+
+
broadcasters IEnumerable<IChatBroadcaster>
+
+
config IConfiguration
+
+
logger ILogger<UsersController>
+
@@ -192,10 +206,122 @@ public class UsersController : ControllerBase +

Fields +

+ + + +

+ DeletedUserName + +

+ +

Username tombstoned messages are re-attributed to after account deletion. +Reserved — UserService refuses to register it.

+
+
+ +
+
public const string DeletedUserName = "deleted-user"
+
+ + + + +

Field Value

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

Methods

+ + +

+ DeleteMyAccount(DeleteAccountRequest) + +

+ +

Self-service account deletion (password re-confirmed). Removes the account, its refresh +tokens and memberships (FK cascade), and every attachment blob the user uploaded. +Their messages are kept but tombstoned to DeletedUserName — deleting them +outright would silently gut other people's conversations.

+
+
+ +
+
[HttpDelete("me")]
+public Task<IActionResult> DeleteMyAccount(DeleteAccountRequest request)
+
+ +

Parameters

+
+
request DeleteAccountRequest
+
+
+ +

Returns

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

+ ExportMyData() + +

+ +

Everything the server stores about the caller, as stored: profile, their messages +(end-to-end encrypted room content stays ciphertext — the server never had plaintext), +and metadata of their uploaded attachments. "You own the data" made demonstrable.

+
+
+ +
+
[HttpGet("me/export")]
+public Task<IActionResult> ExportMyData()
+
+ + +

Returns

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

diff --git a/api/server/EchoHub.Server.Controllers.html b/api/server/EchoHub.Server.Controllers.html index 1014062..9d56689 100644 --- a/api/server/EchoHub.Server.Controllers.html +++ b/api/server/EchoHub.Server.Controllers.html @@ -106,6 +106,12 @@ Classes
FilesController

+
+
InvitesController
+

Invite-code management for invite-gated registration (Admin+ only). +Codes live in this server's own database — there is no central service.

+
+
ModerationController
diff --git a/api/server/EchoHub.Server.Data.EchoHubDbContext.html b/api/server/EchoHub.Server.Data.EchoHubDbContext.html index 864b879..76af44e 100644 --- a/api/server/EchoHub.Server.Data.EchoHubDbContext.html +++ b/api/server/EchoHub.Server.Data.EchoHubDbContext.html @@ -288,6 +288,37 @@ Class EchoHubDbContext + +

+ InviteCodes + +

+ +
+
+ +
+
public DbSet<InviteCode> InviteCodes { get; }
+
+ + + + + +

Property Value

+
+
DbSet<InviteCode>
+
+
+ + + + + + + +

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

+Class AddChannelIsSystem +

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

Constructors +

+ + + + +

+ AddChannelIsSystem() + +

+ +
+
+ +
+
public AddChannelIsSystem()
+
+ + + + + + + + + + + + + +

Methods +

+ + + + +

+ BuildTargetModel(ModelBuilder) + +

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

Parameters

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

+ Down(MigrationBuilder) + +

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

Parameters

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

+ Up(MigrationBuilder) + +

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

Parameters

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

+Class AddInvitesAndReplies +

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

Constructors +

+ + + + +

+ AddInvitesAndReplies() + +

+ +
+
+ +
+
public AddInvitesAndReplies()
+
+ + + + + + + + + + + + + +

Methods +

+ + + + +

+ BuildTargetModel(ModelBuilder) + +

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

Parameters

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

+ Down(MigrationBuilder) + +

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

Parameters

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

+ Up(MigrationBuilder) + +

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

Parameters

+
+
migrationBuilder MigrationBuilder
+
+
+ + + + + + + + + + + + + +
+ + + + +
+ +
+ +
+
+ +
+ + + + diff --git a/api/server/EchoHub.Server.Data.Migrations.html b/api/server/EchoHub.Server.Data.Migrations.html index 2eba51f..2abd41b 100644 --- a/api/server/EchoHub.Server.Data.Migrations.html +++ b/api/server/EchoHub.Server.Data.Migrations.html @@ -106,6 +106,10 @@ Classes
AddChannelIsPublic

+
+
AddChannelIsSystem
+
+
AddChannelMembership
@@ -118,6 +122,10 @@ Classes
AddEncryptionSupport
+
+
AddInvitesAndReplies
+
+
AddMessageAttachments
diff --git a/api/server/EchoHub.Server.Hubs.ChatHub.html b/api/server/EchoHub.Server.Hubs.ChatHub.html index 4b06a16..d1d2774 100644 --- a/api/server/EchoHub.Server.Hubs.ChatHub.html +++ b/api/server/EchoHub.Server.Hubs.ChatHub.html @@ -419,8 +419,8 @@ public class ChatHub : Hub<IEchoHubClient>, IDisposable -

- SendMessage(string, string) +

+ SendMessage(string, string, Guid?)

@@ -428,7 +428,7 @@ public class ChatHub : Hub<IEchoHubClient>, IDisposable
-
public Task SendMessage(string channelName, string content)
+
public Task SendMessage(string channelName, string content, Guid? replyToMessageId = null)

Parameters

@@ -437,6 +437,8 @@ public class ChatHub : Hub<IEchoHubClient>, IDisposable
content string
+
replyToMessageId Guid?
+

Returns

diff --git a/api/server/EchoHub.Server.Services.ChannelService.html b/api/server/EchoHub.Server.Services.ChannelService.html index f9768dc..520a863 100644 --- a/api/server/EchoHub.Server.Services.ChannelService.html +++ b/api/server/EchoHub.Server.Services.ChannelService.html @@ -160,8 +160,8 @@ Class ChannelService -

- ChannelService(IServiceScopeFactory, PresenceTracker, ILogger<ChannelService>) +

+ ChannelService(IServiceScopeFactory, PresenceTracker, SpamGuard, ServerLogsService, ILogger<ChannelService>)

@@ -169,7 +169,7 @@ Class ChannelService
-
public ChannelService(IServiceScopeFactory scopeFactory, PresenceTracker presenceTracker, ILogger<ChannelService> logger)
+
public ChannelService(IServiceScopeFactory scopeFactory, PresenceTracker presenceTracker, SpamGuard spamGuard, ServerLogsService serverLogs, ILogger<ChannelService> logger)

Parameters

@@ -178,6 +178,10 @@ Class ChannelService
PresenceTracker
+
spamGuard SpamGuard
+
+
serverLogs ServerLogsService
+
logger ILogger<ChannelService>
@@ -323,6 +327,44 @@ Class ChannelService + +

+ EnsureSystemChannelAsync(string, string?) + +

+ +
+
+ +
+
public Task<ChannelDto> EnsureSystemChannelAsync(string channelName, string? topic = null)
+
+ +

Parameters

+
+
channelName string
+
+
topic string
+
+
+ +

Returns

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

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

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

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

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

Parameters

@@ -188,6 +188,10 @@ Class ChatService
fileStorage FileStorageService
+
spamGuard SpamGuard
+
+
serverLogs ServerLogsService
+
logger ILogger<ChatService>
@@ -207,6 +211,42 @@ Class ChatService + + +

+ BroadcastChannelDeletedAsync(string) + +

+ +
+
+ +
+
public Task BroadcastChannelDeletedAsync(string channelName)
+
+ +

Parameters

+
+
channelName string
+
+
+ +

Returns

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

@@ -481,8 +521,8 @@ Class ChatService -

- SendMessageAsync(Guid, string, string, string) +

+ SendMessageAsync(Guid, string, string, string, string?, Guid?)

@@ -490,7 +530,7 @@ Class ChatService
-
public Task<string?> SendMessageAsync(Guid userId, string username, string channelName, string content)
+
public Task<string?> SendMessageAsync(Guid userId, string username, string channelName, string content, string? originConnectionId = null, Guid? replyToMessageId = null)

Parameters

@@ -503,6 +543,10 @@ Class ChatService
content string
+
originConnectionId string
+
+
replyToMessageId Guid?
+

Returns

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

+Class LogBacklogEntry +

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

A backlog entry read from the log file: one timestamped log line plus any continuation +lines (exception stack traces) that followed it.

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

Constructors +

+ + + + +

+ LogBacklogEntry(LogBacklogEntry) + +

+ +
+
+ +
+
protected LogBacklogEntry(LogBacklogEntry original)
+
+ +

Parameters

+
+
original LogBacklogEntry
+
+
+ + + + + + + + + + + + + + +

+ LogBacklogEntry(DateTimeOffset, string) + +

+ +

A backlog entry read from the log file: one timestamped log line plus any continuation +lines (exception stack traces) that followed it.

+
+
+ +
+
public LogBacklogEntry(DateTimeOffset Timestamp, string Content)
+
+ +

Parameters

+
+
Timestamp DateTimeOffset
+
+
Content string
+
+
+ + + + + + + + + + + + +

Properties +

+ + + + +

+ Content + +

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

Property Value

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

+ EqualityContract + +

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

Property Value

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

+ Timestamp + +

+ +
+
+ +
+
public DateTimeOffset Timestamp { get; init; }
+
+ + + + + +

Property Value

+
+
DateTimeOffset
+
+
+ + + + + + + + +

Methods +

+ + + + +

+ Deconstruct(out DateTimeOffset, out string) + +

+ +
+
+ +
+
public void Deconstruct(out DateTimeOffset Timestamp, out string Content)
+
+ +

Parameters

+
+
Timestamp DateTimeOffset
+
+
Content string
+
+
+ + + + + + + + + + + + + + +

+ Equals(LogBacklogEntry?) + +

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

Parameters

+
+
other LogBacklogEntry
+
+
+ +

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

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

Parameters

+
+
left LogBacklogEntry
+
+
right LogBacklogEntry
+
+
+ +

Returns

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

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

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

Parameters

+
+
left LogBacklogEntry
+
+
right LogBacklogEntry
+
+
+ +

Returns

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

+Class ServerLogsService +

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

Shared logic for the live log room: room identity, the role gate, and reading the backlog +tail from the current rolling log file. The file stays the only persistence — log lines +are never stored as messages.

+
+
+ +
+
public sealed class ServerLogsService
+
+ + + + +
+
Inheritance
+
+ +
ServerLogsService
+
+
+ + + +
+
Inherited Members
+
+ + + + + + +
+ + + + + + +

Constructors +

+ + + + +

+ ServerLogsService(ServerLogsOptions) + +

+ +
+
+ +
+
public ServerLogsService(ServerLogsOptions options)
+
+ +

Parameters

+
+
options ServerLogsOptions
+
+
+ + + + + + + + + + + + +

Fields +

+ + + +

+ RoomTopic + +

+ +
+
+ +
+
public const string RoomTopic = "Live server logs — read-only"
+
+ + + + +

Field Value

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

+ SenderName + +

+ +

Username shown as the sender of streamed log messages.

+
+
+ +
+
public const string SenderName = "server"
+
+ + + + +

Field Value

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

Properties +

+ + + + +

+ Options + +

+ +
+
+ +
+
public ServerLogsOptions Options { get; }
+
+ + + + + +

Property Value

+
+
ServerLogsOptions
+
+
+ + + + + + + + +

Methods +

+ + + + +

+ CanView(ServerRole) + +

+ +

Whether a user with this role may see and join the log room.

+
+
+ +
+
public bool CanView(ServerRole role)
+
+ +

Parameters

+
+
role ServerRole
+
+
+ +

Returns

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

+ GroupIntoEntries(IReadOnlyList<string>, bool, int) + +

+ +

Groups raw file lines into entries by their timestamp prefix. Public for tests.

+
+
+ +
+
public static IReadOnlyList<LogBacklogEntry> GroupIntoEntries(IReadOnlyList<string> lines, bool skipLeadingContinuations, int maxEntries)
+
+ +

Parameters

+
+
lines IReadOnlyList<string>
+
+
skipLeadingContinuations bool
+
+
maxEntries int
+
+
+ +

Returns

+
+
IReadOnlyList<LogBacklogEntry>
+
+
+ + + + + + + + + + + + + +

+ IsLogsChannel(string) + +

+ +

Whether the given channel is the (enabled) live log room.

+
+
+ +
+
public bool IsLogsChannel(string channelName)
+
+ +

Parameters

+
+
channelName string
+
+
+ +

Returns

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

+ ReadBacklog() + +

+ +

Reads the last BacklogLines entries from the newest +log file. A line starting with a timestamp begins a new entry; continuation lines +(stack traces) stay attached to the entry above them. Best-effort: any I/O problem +yields an empty backlog rather than failing the join.

+
+
+ +
+
public IReadOnlyList<LogBacklogEntry> ReadBacklog()
+
+ + +

Returns

+
+
IReadOnlyList<LogBacklogEntry>
+
+
+ + + + + + + + + + + + +
+ + + + +
+ +
+ +
+
+ +
+ + + + diff --git a/api/server/EchoHub.Server.Services.ServerLogs.ServerLogsSink.html b/api/server/EchoHub.Server.Services.ServerLogs.ServerLogsSink.html new file mode 100644 index 0000000..6883ba4 --- /dev/null +++ b/api/server/EchoHub.Server.Services.ServerLogs.ServerLogsSink.html @@ -0,0 +1,289 @@ + + + + + Class ServerLogsSink | EchoHub Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+
Table of Contents
+ +
+
+ +
+
+
+ +
+
+ + + +
+ +
+ + + +

+Class ServerLogsSink +

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

Serilog sink feeding the live log room. Events are queued in a bounded drop-oldest buffer +and consumed by ServerLogsStreamService; nothing is written to the database. +Events emitted by the streaming pipeline itself (the stream service and SignalR transport +internals) are dropped here so a broadcast that logs — e.g. a transport warning on a dead +connection — can never enter a log → broadcast → log feedback loop.

+
+
+ +
+
public sealed class ServerLogsSink : ILogEventSink
+
+ + + + +
+
Inheritance
+
+ +
ServerLogsSink
+
+
+ +
+
Implements
+
+
ILogEventSink
+
+
+ + +
+
Inherited Members
+
+ + + + + + +
+ + + + + + +

Constructors +

+ + + + +

+ ServerLogsSink(ServerLogsOptions) + +

+ +
+
+ +
+
public ServerLogsSink(ServerLogsOptions options)
+
+ +

Parameters

+
+
options ServerLogsOptions
+
+
+ + + + + + + + + + + + +

Properties +

+ + + + +

+ Reader + +

+ +
+
+ +
+
public ChannelReader<LogEvent> Reader { get; }
+
+ + + + + +

Property Value

+
+
ChannelReader<LogEvent>
+
+
+ + + + + + + + +

Methods +

+ + + + +

+ Emit(LogEvent) + +

+ +
+
+ +
+
public void Emit(LogEvent logEvent)
+
+ +

Parameters

+
+
logEvent LogEvent
+
+
+ + + + + + + + + + + + + +
+ + + + +
+ +
+ +
+
+ +
+ + + + diff --git a/api/server/EchoHub.Server.Services.ServerLogs.ServerLogsStreamService.html b/api/server/EchoHub.Server.Services.ServerLogs.ServerLogsStreamService.html new file mode 100644 index 0000000..a4f294d --- /dev/null +++ b/api/server/EchoHub.Server.Services.ServerLogs.ServerLogsStreamService.html @@ -0,0 +1,306 @@ + + + + + Class ServerLogsStreamService | EchoHub Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+
Table of Contents
+ +
+
+ +
+
+
+ +
+
+ + + +
+ +
+ + + +

+Class ServerLogsStreamService +

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

Streams queued log events to the live log room as ephemeral messages: SignalR only (the +IRC gateway never sees them) and no database rows. Ensures the room exists before +streaming, recreating it on the fly if it was deleted.

+

This class must never log from its streaming path — its namespace is excluded by +ServerLogsSink as a second line of defense, but the primary rule is simply +not to log per event, otherwise every streamed line would spawn another.

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

Constructors +

+ + + + +

+ ServerLogsStreamService(ServerLogsSink, ServerLogsOptions, IChannelService, IMessageEncryptionService, IServiceProvider) + +

+ +
+
+ +
+
public ServerLogsStreamService(ServerLogsSink sink, ServerLogsOptions options, IChannelService channelService, IMessageEncryptionService encryption, IServiceProvider serviceProvider)
+
+ +

Parameters

+
+
sink ServerLogsSink
+
+
options ServerLogsOptions
+
+
channelService IChannelService
+
+
encryption IMessageEncryptionService
+
+
serviceProvider IServiceProvider
+
+
+ + + + + + + + + + + + +

Methods +

+ + + + +

+ ExecuteAsync(CancellationToken) + +

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

Parameters

+
+
stoppingToken CancellationToken
+
+
+ +

Returns

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

+ Format(LogEvent) + +

+ +

Formats an event like the file sink's template, minus the timestamp (clients render their own). Public for tests.

+
+
+ +
+
public static string Format(LogEvent logEvent)
+
+ +

Parameters

+
+
logEvent LogEvent
+
+
+ +

Returns

+
+
string
+
+
+ + + + + + + + + + + + +
+ + + + +
+ +
+ +
+
+ +
+ + + + diff --git a/api/server/EchoHub.Server.Services.ServerLogs.html b/api/server/EchoHub.Server.Services.ServerLogs.html new file mode 100644 index 0000000..f7fae8e --- /dev/null +++ b/api/server/EchoHub.Server.Services.ServerLogs.html @@ -0,0 +1,154 @@ + + + + + Namespace EchoHub.Server.Services.ServerLogs | EchoHub Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+
Table of Contents
+ +
+
+ +
+
+
+ +
+
+ + + +
+ +
+ +

Namespace EchoHub.Server.Services.ServerLogs

+
+
+
+ +

+Classes +

+
+
LogBacklogEntry
+

A backlog entry read from the log file: one timestamped log line plus any continuation +lines (exception stack traces) that followed it.

+
+
+
+
ServerLogsService
+

Shared logic for the live log room: room identity, the role gate, and reading the backlog +tail from the current rolling log file. The file stays the only persistence — log lines +are never stored as messages.

+
+
+
+
ServerLogsSink
+

Serilog sink feeding the live log room. Events are queued in a bounded drop-oldest buffer +and consumed by ServerLogsStreamService; nothing is written to the database. +Events emitted by the streaming pipeline itself (the stream service and SignalR transport +internals) are dropped here so a broadcast that logs — e.g. a transport warning on a dead +connection — can never enter a log → broadcast → log feedback loop.

+
+
+
+
ServerLogsStreamService
+

Streams queued log events to the live log room as ephemeral messages: SignalR only (the +IRC gateway never sees them) and no database rows. Ensures the room exists before +streaming, recreating it on the fly if it was deleted.

+

This class must never log from its streaming path — its namespace is excluded by +ServerLogsSink as a second line of defense, but the primary rule is simply +not to log per event, otherwise every streamed line would spawn another.

+
+
+ + +
+ +
+
+ + +
+ +
+ +
+
+ +
+ + + + diff --git a/api/server/EchoHub.Server.Services.SignalRBroadcaster.html b/api/server/EchoHub.Server.Services.SignalRBroadcaster.html index d642735..eb57462 100644 --- a/api/server/EchoHub.Server.Services.SignalRBroadcaster.html +++ b/api/server/EchoHub.Server.Services.SignalRBroadcaster.html @@ -233,6 +233,42 @@ Class SignalRBroadcaster + +

+ SendChannelDeletedAsync(string) + +

+ +
+
+ +
+
public Task SendChannelDeletedAsync(string channelName)
+
+ +

Parameters

+
+
channelName string
+
+
+ +

Returns

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

@@ -385,16 +421,21 @@ Class SignalRBroadcaster -

- SendMessageToChannelAsync(string, MessageDto) +

+ SendMessageToChannelAsync(string, MessageDto, string?)

-
+

Broadcast a chat message to a channel. excludeConnectionId is the +connection the message originated from (IRC convention: never echo a message back to +the connection that sent it — its client already displayed it locally). Other +connections of the same user (e.g. an IRC session alongside a TUI session) still +receive the message.

+
-
public Task SendMessageToChannelAsync(string channelName, MessageDto message)
+
public Task SendMessageToChannelAsync(string channelName, MessageDto message, string? excludeConnectionId = null)

Parameters

@@ -403,6 +444,8 @@ Class SignalRBroadcaster MessageDto
+
excludeConnectionId string
+

Returns

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

+Class SpamGuard +

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

In-memory, per-user spam protection consulted from ChatService (messages, +joins) and ChannelService (channel creation), so every ingress protocol — +SignalR and IRC alike — shares the same limits. State is per-process and never persisted; +auto-mutes land in the normal mute store. Operates only on content the server already +stores (for end-to-end encrypted rooms that is ciphertext) — nothing is decrypted.

+
+
+ +
+
public sealed class SpamGuard
+
+ + + + +
+
Inheritance
+
+ +
SpamGuard
+
+
+ + + +
+
Inherited Members
+
+ + + + + + +
+ + + + + + +

Constructors +

+ + + + +

+ SpamGuard(SpamOptions) + +

+ +
+
+ +
+
public SpamGuard(SpamOptions options)
+
+ +

Parameters

+
+
options SpamOptions
+
+
+ + + + + + + + + + + + +

Properties +

+ + + + +

+ Enabled + +

+ +
+
+ +
+
public bool Enabled { get; }
+
+ + + + + +

Property Value

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

Methods +

+ + + + +

+ CheckChannelCreate(Guid, ServerRole, DateTimeOffset?) + +

+ +

Checks a channel creation. Rejections count as violations but never auto-mute.

+
+
+ +
+
public SpamVerdict CheckChannelCreate(Guid userId, ServerRole role, DateTimeOffset? nowOverride = null)
+
+ +

Parameters

+
+
userId Guid
+
+
role ServerRole
+
+
nowOverride DateTimeOffset?
+
+
+ +

Returns

+
+
SpamVerdict
+
+
+ + + + + + + + + + + + + +

+ CheckJoin(Guid, ServerRole, DateTimeOffset?) + +

+ +

Checks a channel join. Rejections count as violations but never auto-mute.

+
+
+ +
+
public SpamVerdict CheckJoin(Guid userId, ServerRole role, DateTimeOffset? nowOverride = null)
+
+ +

Parameters

+
+
userId Guid
+
+
role ServerRole
+
+
nowOverride DateTimeOffset?
+
+
+ +

Returns

+
+
SpamVerdict
+
+
+ + + + + + + + + + + + + +

+ CheckMessage(Guid, ServerRole, string, DateTimeOffset?) + +

+ +

Checks a message send. Rejections count as violations; enough violations inside the +violation window escalate to AutoMute (evaluated only on +rejected messages, so a clean message never mutes anyone).

+
+
+ +
+
public SpamVerdict CheckMessage(Guid userId, ServerRole role, string content, DateTimeOffset? nowOverride = null)
+
+ +

Parameters

+
+
userId Guid
+
+
role ServerRole
+
+
content string
+
+
nowOverride DateTimeOffset?
+
+
+ +

Returns

+
+
SpamVerdict
+
+
+ + + + + + + + + + + + +
+ + + + +
+ +
+ +
+
+ +
+ + + + diff --git a/api/server/EchoHub.Server.Services.SpamVerdict.html b/api/server/EchoHub.Server.Services.SpamVerdict.html new file mode 100644 index 0000000..f963a64 --- /dev/null +++ b/api/server/EchoHub.Server.Services.SpamVerdict.html @@ -0,0 +1,586 @@ + + + + + Struct SpamVerdict | EchoHub Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+
Table of Contents
+ +
+
+ +
+
+
+ +
+
+ + + +
+ +
+ + + +

+Struct SpamVerdict +

+ +
+
Namespace
EchoHub.Server.Services
+
Assembly
EchoHub.Server.dll
+
+ +
+
+ +
+
public readonly struct SpamVerdict : IEquatable<SpamVerdict>
+
+ + + + + +
+
Implements
+
+ +
+
+ + +
+
Inherited Members
+
+ + + +
+ + + + + + +

Constructors +

+ + + + +

+ SpamVerdict(SpamVerdictKind, string?, TimeSpan) + +

+ +
+
+ +
+
public SpamVerdict(SpamVerdictKind Kind, string? Reason = null, TimeSpan MuteDuration = default)
+
+ +

Parameters

+
+
Kind SpamVerdictKind
+
+
Reason string
+
+
MuteDuration TimeSpan
+
+
+ + + + + + + + + + + + +

Fields +

+ + + +

+ Allowed + +

+ +
+
+ +
+
public static readonly SpamVerdict Allowed
+
+ + + + +

Field Value

+
+
SpamVerdict
+
+
+ + + + + + + + + +

Properties +

+ + + + +

+ Kind + +

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

Property Value

+
+
SpamVerdictKind
+
+
+ + + + + + + + + + +

+ MuteDuration + +

+ +
+
+ +
+
public TimeSpan MuteDuration { get; init; }
+
+ + + + + +

Property Value

+
+
TimeSpan
+
+
+ + + + + + + + + + +

+ Reason + +

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

Property Value

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

Methods +

+ + + + +

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

+ +
+
+ +
+
public void Deconstruct(out SpamVerdictKind Kind, out string? Reason, out TimeSpan MuteDuration)
+
+ +

Parameters

+
+
Kind SpamVerdictKind
+
+
Reason string
+
+
MuteDuration TimeSpan
+
+
+ + + + + + + + + + + + + + +

+ Equals(SpamVerdict) + +

+ +
+
+ +
+
public bool Equals(SpamVerdict other)
+
+ +

Parameters

+
+
other SpamVerdict
+
+
+ +

Returns

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

+ Equals(object) + +

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

Parameters

+
+
obj object
+
+
+ +

Returns

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

+ GetHashCode() + +

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

Returns

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

+ ToString() + +

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

Returns

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

Operators +

+ + + + +

+ operator ==(SpamVerdict, SpamVerdict) + +

+ +
+
+ +
+
public static bool operator ==(SpamVerdict left, SpamVerdict right)
+
+ +

Parameters

+
+
left SpamVerdict
+
+
right SpamVerdict
+
+
+ +

Returns

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

+ operator !=(SpamVerdict, SpamVerdict) + +

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

Parameters

+
+
left SpamVerdict
+
+
right SpamVerdict
+
+
+ +

Returns

+
+
bool
+
+
+ + + + + + + + + + + + +
+ + + + +
+ +
+ +
+
+ +
+ + + + diff --git a/api/server/EchoHub.Server.Services.SpamVerdictKind.html b/api/server/EchoHub.Server.Services.SpamVerdictKind.html new file mode 100644 index 0000000..b95e9e3 --- /dev/null +++ b/api/server/EchoHub.Server.Services.SpamVerdictKind.html @@ -0,0 +1,157 @@ + + + + + Enum SpamVerdictKind | EchoHub Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+
Table of Contents
+ +
+
+ +
+
+
+ +
+
+ + + +
+ +
+ + + + +

+Enum SpamVerdictKind +

+ +
+
Namespace
EchoHub.Server.Services
+
Assembly
EchoHub.Server.dll
+
+ +
+
+ +
+
public enum SpamVerdictKind
+
+ + + + + + + + + +

Fields +

+
+
Allowed = 0
+ +
+
AutoMute = 2
+ +

The user crossed the violation threshold — the caller should apply a timed mute.

+
+
Rejected = 1
+ +
+
+ + + +
+ + + + +
+ +
+ +
+
+ +
+ + + + diff --git a/api/server/EchoHub.Server.Services.UserService.html b/api/server/EchoHub.Server.Services.UserService.html index 29ac265..78c6e1c 100644 --- a/api/server/EchoHub.Server.Services.UserService.html +++ b/api/server/EchoHub.Server.Services.UserService.html @@ -160,8 +160,8 @@ Class UserService -

- UserService(IServiceScopeFactory) +

+ UserService(IServiceScopeFactory, IConfiguration)

@@ -169,13 +169,15 @@ Class UserService
-
public UserService(IServiceScopeFactory scopeFactory)
+
public UserService(IServiceScopeFactory scopeFactory, IConfiguration configuration)

Parameters

scopeFactory IServiceScopeFactory
+
configuration IConfiguration
+
@@ -189,6 +191,42 @@ Class UserService
Properties + + + + + +

+ RegistrationMode + +

+ +

Registration mode from config: "open" (default), "invite", or "closed".

+
+
+ +
+
public string RegistrationMode { get; }
+
+ + + + + +

Property Value

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

Methods

@@ -305,8 +343,8 @@ Class UserService -

- RegisterUserAsync(string, string, string?) +

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

@@ -314,7 +352,7 @@ Class UserService
-
public Task<UserOperationResult> RegisterUserAsync(string username, string password, string? displayName = null)
+
public Task<UserOperationResult> RegisterUserAsync(string username, string password, string? displayName = null, string? inviteCode = null)

Parameters

@@ -325,6 +363,8 @@ Class UserService
displayName string
+
inviteCode string
+

Returns

diff --git a/api/server/EchoHub.Server.Services.html b/api/server/EchoHub.Server.Services.html index 709663f..f8986d2 100644 --- a/api/server/EchoHub.Server.Services.html +++ b/api/server/EchoHub.Server.Services.html @@ -147,10 +147,33 @@ status (success/failure code, conflicting hosts) for operator-facing endpoints.<
SignalRBroadcaster
+
+
SpamGuard
+

In-memory, per-user spam protection consulted from ChatService (messages, +joins) and ChannelService (channel creation), so every ingress protocol — +SignalR and IRC alike — shares the same limits. State is per-process and never persisted; +auto-mutes land in the normal mute store. Operates only on content the server already +stores (for end-to-end encrypted rooms that is ciphertext) — nothing is decrypted.

+
+
UserService
+

+Structs +

+
+
SpamVerdict
+
+
+

+Enums +

+
+
SpamVerdictKind
+
+
diff --git a/api/toc.html b/api/toc.html index 9797825..e12dd5f 100644 --- a/api/toc.html +++ b/api/toc.html @@ -168,6 +168,12 @@ EchoHub.Client.UI.Chat