Getting Started
-Prerequisites
-
-Or grab a self-contained binary from Releases -- no runtime needed.
-Run the Server
+Install the Client
+Windows (Chocolatey)
+choco install echohub
+
+Linux / macOS
+curl -sSfL https://raw.githubusercontent.com/HueByte/EchoHub/master/scripts/install.sh | sh
+
+To install a specific version or to a custom directory:
+curl -sSfL .../install.sh | sh -s -- --version 0.2.8
+curl -sSfL .../install.sh | sh -s -- --install-dir /opt/echohub
+
+Manual Download
+Grab a self-contained binary from Releases -- no runtime needed.
+Host a Server
+Docker
+The quickest way to host a server:
+cp .env.example .env
+docker compose up -d
+
+See the Docker guide for configuration, pre-built images, and more.
+From Source
dotnet run --project src/EchoHub.Server
+Requires .NET 10 SDK .
On first run, the server automatically:
Creates appsettings.json from the example config
Generates a secure JWT secret
Creates the SQLite database with a #general channel
-Run the Client
-dotnet run --project src/EchoHub.Client
-
-Connect to a server, register an account, and start chatting.
+Usage
+After installing the client, run echohub (or dotnet run --project src/EchoHub.Client from source).
+Connect to a server, register an account, and start chatting.
Connect via IRC
Enable the IRC gateway in the server's appsettings.json:
{
diff --git a/articles/toc.html b/articles/toc.html
index 24ef3fa..d2400b7 100644
--- a/articles/toc.html
+++ b/articles/toc.html
@@ -15,6 +15,9 @@
Getting Started
+
+ Docker
+
Architecture
diff --git a/articles/toc.json b/articles/toc.json
index 627b95f..692ba07 100644
--- a/articles/toc.json
+++ b/articles/toc.json
@@ -1,2 +1,2 @@
-{"items":[{"name":"Getting Started","href":"getting-started.html","topicHref":"getting-started.html"},{"name":"Architecture","href":"architecture.html","topicHref":"architecture.html"},{"name":"Encryption","href":"encryption.html","topicHref":"encryption.html"},{"name":"Notification Sounds","href":"notification-sounds.html","topicHref":"notification-sounds.html"}]}
+{"items":[{"name":"Getting Started","href":"getting-started.html","topicHref":"getting-started.html"},{"name":"Docker","href":"docker.html","topicHref":"docker.html"},{"name":"Architecture","href":"architecture.html","topicHref":"architecture.html"},{"name":"Encryption","href":"encryption.html","topicHref":"encryption.html"},{"name":"Notification Sounds","href":"notification-sounds.html","topicHref":"notification-sounds.html"}]}
diff --git a/changelog/index.html b/changelog/index.html
index 4415596..fd7a532 100644
--- a/changelog/index.html
+++ b/changelog/index.html
@@ -90,6 +90,9 @@
Release history for EchoHub.
Releases
+v0.2.8 - Docker Support, IRC Account Creation & BOM Fix
+v0.2.7 - User List Fix & Terminal.Gui NuGet Migration
+v0.2.6 - Major Refactoring & Code Organization
v0.2.5 - Session Persistence, Auto-Updates, Audio & Transparent Theme
v0.2.4 - E2E Message Encryption
v0.2.3 - Moderation, Embeds & UI Overhaul
diff --git a/changelog/toc.html b/changelog/toc.html
index 6c84ad0..49cb2d7 100644
--- a/changelog/toc.html
+++ b/changelog/toc.html
@@ -15,6 +15,9 @@
Overview
+
+ v0.2.8
+
v0.2.7
diff --git a/changelog/toc.json b/changelog/toc.json
index ecad7e9..f4caac3 100644
--- a/changelog/toc.json
+++ b/changelog/toc.json
@@ -1,2 +1,2 @@
-{"items":[{"name":"Overview","href":"index.html","topicHref":"index.html"},{"name":"v0.2.7","href":"v0.2.7.html","topicHref":"v0.2.7.html"},{"name":"v0.2.6","href":"v0.2.6.html","topicHref":"v0.2.6.html"},{"name":"v0.2.5","href":"v0.2.5.html","topicHref":"v0.2.5.html"},{"name":"v0.2.4","href":"v0.2.4.html","topicHref":"v0.2.4.html"},{"name":"v0.2.3","href":"v0.2.3.html","topicHref":"v0.2.3.html"},{"name":"v0.2.2","href":"v0.2.2.html","topicHref":"v0.2.2.html"},{"name":"v0.2.1","href":"v0.2.1.html","topicHref":"v0.2.1.html"},{"name":"v0.2.0","href":"v0.2.0.html","topicHref":"v0.2.0.html"},{"name":"v0.1.1","href":"v0.1.1.html","topicHref":"v0.1.1.html"},{"name":"v0.1.0","href":"v0.1.0.html","topicHref":"v0.1.0.html"}]}
+{"items":[{"name":"Overview","href":"index.html","topicHref":"index.html"},{"name":"v0.2.8","href":"v0.2.8.html","topicHref":"v0.2.8.html"},{"name":"v0.2.7","href":"v0.2.7.html","topicHref":"v0.2.7.html"},{"name":"v0.2.6","href":"v0.2.6.html","topicHref":"v0.2.6.html"},{"name":"v0.2.5","href":"v0.2.5.html","topicHref":"v0.2.5.html"},{"name":"v0.2.4","href":"v0.2.4.html","topicHref":"v0.2.4.html"},{"name":"v0.2.3","href":"v0.2.3.html","topicHref":"v0.2.3.html"},{"name":"v0.2.2","href":"v0.2.2.html","topicHref":"v0.2.2.html"},{"name":"v0.2.1","href":"v0.2.1.html","topicHref":"v0.2.1.html"},{"name":"v0.2.0","href":"v0.2.0.html","topicHref":"v0.2.0.html"},{"name":"v0.1.1","href":"v0.1.1.html","topicHref":"v0.1.1.html"},{"name":"v0.1.0","href":"v0.1.0.html","topicHref":"v0.1.0.html"}]}
diff --git a/changelog/v0.2.8.html b/changelog/v0.2.8.html
new file mode 100644
index 0000000..6210ff1
--- /dev/null
+++ b/changelog/v0.2.8.html
@@ -0,0 +1,172 @@
+
+
+
+
+ v0.2.8 | EchoHub Documentation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+v0.2.8
+
+Bug Fixes
+
+Fix memory leak — HttpResponseMessage objects never disposed in ApiClient, leaking TCP connections and content buffers on every API call (especially on failed connection attempts)
+Fix 401 retry leak — AuthenticatedGetAsync/AuthenticatedRequestAsync leaked the original response when retrying after token refresh
+Fix connection failure cleanup — ConnectionManager.ConnectAsync now properly disposes ApiClient and EchoHubConnection on any failure path (previously only cleaned up on saved-token auth failures)
+Fix IRC gateway sending UTF-8 BOM on first message, breaking CAP negotiation and SASL auth for all clients
+Handle AUTHENTICATE * (SASL abort) instead of crashing on invalid base64
+Fix userlist not refreshing when creating a new channel — now fetches online users after channel creation
+Fix unmute timer not working — add MuteExpirationService background job that proactively unmutes users when their timed mute expires (previously only checked on message send)
+Fix missing space between mod/admin role icon and username in the userlist
+Fix invisible users still visible in the userlist — GetOnlineUsersAsync now filters invisible users; server skips UserJoined broadcast for invisible users
+Fix invisible→online transition — user reappears in cached userlist when switching from invisible back to a visible status
+Fix thread safety — _channelUsers presence cache now protected by Lock to prevent races between SignalR events and background fetches
+Fix @mention regex matching email addresses and #channel regex matching hex colors / issue numbers — both now use lookbehind and letter-requirement guards
+Fix ParseThemeColor accepting non-hex characters — now validates [0-9a-fA-F] digits
+Fix ghost channel when trying to join a channel that doesn't exist
+
+New Features
+
+Add Docker support for EchoHub.Server — docker compose up -d for easy self-hosting with persistent volume for database, uploads, and logs
+IRC account creation — connecting with a new username auto-registers the account (PASS and SASL PLAIN)
+Auto-updater rollback — pre-update backup created automatically before each update; restore via File > Rollback menu or --rollback CLI flag
+Update failure recovery — if an update fails mid-extraction, offers to restore from the backup immediately
+Defensive Unix permission check — verify execute permission on startup after auto-update (defense-in-depth)
+Clickable usernames — press Enter on a username in the userlist or message sender to view their profile
+Clickable @mentions — press Enter on a message containing @username to open that user's profile
+Clickable #channels — press Enter on a message containing #channel to join/switch to that channel; #channel references are now highlighted in chat
+Embed theme colors — embed vertical border line now uses the source site's theme-color meta tag when available
+Stateful userlist — user presence is cached per channel and updated incrementally via SignalR events instead of re-fetching the full list on every join/leave/status change
+
+Security
+
+Restrict file auto-open — only safe file types (video, PDF, text) are opened with the system default app; all other files are downloaded to temp without executing (prevents script execution via .bat, .exe, etc.)
+
+Refactoring
+
+Extract IUserService/UserService — consolidate user registration, authentication, and profile management into a dedicated service, eliminating duplicated logic between AuthController and ChatService
+IRC gateway now checks ban status during authentication (previously skipped)
+EchoHubSpace directory updates — server now only sends user count when it actually changes instead of every 30 seconds
+ChatHub.JoinChannel now returns JoinChannelResult instead of List<MessageDto> to allow for better error handling
+
+Distribution
+
+Add Chocolatey package — choco install echohub for Windows users, auto-published from CI on each release
+Add Linux/macOS install script — curl -sSfL .../install.sh | sh with automatic OS/arch detection
+
+Documentation
+
+Add Flows section — Mermaid sequence diagrams documenting all major request/event flows (auth, connection, messaging, channels, moderation, file upload, link embeds, server directory) with inline code references
+
+CI
+
+Add Docker workflow — builds and pushes multi-arch (amd64/arm64) server image to GHCR on release
+Add linux-arm64 builds to release pipeline — server and client binaries for ARM Linux (Raspberry Pi, cloud ARM instances)
+Automate Chocolatey package publishing in release workflow (checksum calculation, pack, push)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/flows/authentication.html b/flows/authentication.html
new file mode 100644
index 0000000..83a6e5b
--- /dev/null
+++ b/flows/authentication.html
@@ -0,0 +1,352 @@
+
+
+
+
+ Authentication | EchoHub Documentation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Authentication
+
+User Registration
+A new user creates an account on a server. The client sends credentials via REST,
+the server hashes the password, issues JWT tokens, and the client stores the
+refresh token for "Remember Me" sessions.
+sequenceDiagram
+ participant UI as ConnectDialog
+ participant AO as AppOrchestrator
+ participant CM as ConnectionManager
+ participant API as ApiClient
+ participant Auth as AuthController
+ participant US as UserService
+ participant JWT as JwtTokenService
+ participant DB as SQLite
+
+ UI->>AO: ConnectDialogResult(IsRegister: true)
+ AO->>CM: ConnectAsync(dialogResult)
+ CM->>API: RegisterAsync(username, password)
+ API->>Auth: POST /api/auth/register
+ Auth->>US: RegisterUserAsync(username, password, displayName)
+ US->>US: Validate (regex, length, uniqueness)
+ US->>DB: INSERT User (BCrypt hash)
+ US-->>Auth: UserOperationResult.Success
+ Auth->>JWT: GenerateAccessToken(user)
+ JWT-->>Auth: (token, expiresAt) [15 min]
+ Auth->>JWT: GenerateRefreshToken()
+ JWT-->>Auth: Base64 random (64 bytes)
+ Auth->>DB: INSERT RefreshToken (SHA256 hash)
+ Auth-->>API: LoginResponse
+ API->>API: SetTokens() — store in memory + set Bearer header
+ API-->>CM: LoginResponse
+ CM->>CM: Wire OnTokensRefreshed for config persistence
+ CM->>CM: Continue to connection setup (see Connection Flow)
+
+Code references:
+
+
+
+Step
+File
+Location
+
+
+
+
+Dialog UI
+src/EchoHub.Client/UI/Dialogs/ConnectDialog.cs
+Lines 251-268 (register handler)
+
+
+Orchestrator entry
+src/EchoHub.Client/AppOrchestrator.cs
+Lines 550-592 (HandleConnect)
+
+
+ConnectionManager auth
+src/EchoHub.Client/Services/ConnectionManager.cs
+Lines 74-76 (register branch)
+
+
+ApiClient register
+src/EchoHub.Client/Services/ApiClient.cs
+Lines 32-43 (RegisterAsync)
+
+
+AuthController register
+src/EchoHub.Server/Controllers/AuthController.cs
+Lines 28-49
+
+
+UserService register
+src/EchoHub.Server/Services/UserService.cs
+Lines 20-59 (RegisterUserAsync)
+
+
+JWT generation
+src/EchoHub.Server/Auth/JwtTokenService.cs
+Lines 30-53 (access), 80-86 (refresh)
+
+
+Token persistence
+src/EchoHub.Client/AppOrchestrator.cs
+Lines 1039-1053 (SaveServerToConfig)
+
+
+
+
+User Login
+Returning user authenticates with username/password or a saved refresh token.
+sequenceDiagram
+ participant UI as ConnectDialog
+ participant CM as ConnectionManager
+ participant API as ApiClient
+ participant Auth as AuthController
+ participant US as UserService
+ participant DB as SQLite
+
+ alt Saved refresh token (Remember Me)
+ UI->>CM: ConnectDialogResult(SavedRefreshToken: "...")
+ CM->>API: LoginWithRefreshTokenAsync()
+ API->>Auth: POST /api/auth/refresh
+ Auth->>DB: Lookup token by SHA256 hash
+ Auth->>DB: Revoke old token, issue new pair
+ Auth-->>API: LoginResponse (rotated tokens)
+ else Username + Password
+ UI->>CM: ConnectDialogResult(IsRegister: false)
+ CM->>API: LoginAsync(username, password)
+ API->>Auth: POST /api/auth/login
+ Auth->>US: AuthenticateUserAsync(username, password)
+ US->>DB: Fetch user, BCrypt.Verify(password, hash)
+ US->>DB: Update LastSeenAt
+ US-->>Auth: UserOperationResult.Success
+ Auth-->>API: LoginResponse
+ end
+ API->>API: SetTokens()
+
+Code references:
+
+
+
+Step
+File
+Location
+
+
+
+
+Login button handler
+src/EchoHub.Client/UI/Dialogs/ConnectDialog.cs
+Lines 214-249
+
+
+Saved token branch
+src/EchoHub.Client/Services/ConnectionManager.cs
+Lines 69-71
+
+
+Password branch
+src/EchoHub.Client/Services/ConnectionManager.cs
+Lines 78-80
+
+
+ApiClient login
+src/EchoHub.Client/Services/ApiClient.cs
+Lines 45-56 (LoginAsync)
+
+
+AuthController login
+src/EchoHub.Server/Controllers/AuthController.cs
+Lines 51-72
+
+
+AuthController refresh
+src/EchoHub.Server/Controllers/AuthController.cs
+Lines 74-108
+
+
+UserService authenticate
+src/EchoHub.Server/Services/UserService.cs
+Lines 61-83
+
+
+
+
+Token Refresh
+Access tokens expire after 15 minutes. The client auto-refreshes transparently
+before requests and on 401 responses. Refresh tokens are rotated on each use.
+sequenceDiagram
+ participant SR as SignalR / HTTP Request
+ participant API as ApiClient
+ participant Auth as AuthController
+ participant DB as SQLite
+ participant Config as config.json
+
+ SR->>API: GetValidTokenAsync() or HTTP 401
+ API->>API: Token expires within 60s?
+ alt Proactive refresh (SignalR token provider)
+ API->>Auth: POST /api/auth/refresh (old refresh token)
+ else Reactive refresh (HTTP 401 retry)
+ API->>Auth: POST /api/auth/refresh (old refresh token)
+ end
+ Auth->>DB: Lookup by SHA256 hash
+ Auth->>DB: Revoke old refresh token
+ Auth->>DB: INSERT new RefreshToken
+ Auth-->>API: LoginResponse (new token pair)
+ API->>API: SetTokens() — update Bearer header
+ API-->>API: Fire OnTokensRefreshed event
+ API-->>Config: Persist new refresh token (if Remember Me)
+ API->>SR: Retry original request with new token
+
+Code references:
+
+
+
+Step
+File
+Location
+
+
+
+
+Proactive check
+src/EchoHub.Client/Services/ApiClient.cs
+Lines 110-129 (GetValidTokenAsync)
+
+
+Reactive 401 retry (GET)
+src/EchoHub.Client/Services/ApiClient.cs
+Lines 338-358 (AuthenticatedGetAsync)
+
+
+Reactive 401 retry (POST/PUT/DELETE)
+src/EchoHub.Client/Services/ApiClient.cs
+Lines 364-384 (AuthenticatedRequestAsync)
+
+
+Refresh HTTP call
+src/EchoHub.Client/Services/ApiClient.cs
+Lines 58-71 (RefreshTokenAsync)
+
+
+SignalR token provider
+src/EchoHub.Client/Services/EchoHubConnection.cs
+Line 37 (AccessTokenProvider)
+
+
+Server-side rotation
+src/EchoHub.Server/Controllers/AuthController.cs
+Lines 74-108
+
+
+Token persistence callback
+src/EchoHub.Client/Services/ConnectionManager.cs
+Lines 253-264
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/flows/channels.html b/flows/channels.html
new file mode 100644
index 0000000..d785f37
--- /dev/null
+++ b/flows/channels.html
@@ -0,0 +1,344 @@
+
+
+
+
+ Channels | EchoHub Documentation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Channels
+
+Channel Creation
+Channels are created via the REST API. Public channels are broadcast to all
+connected clients.
+sequenceDiagram
+ participant Client as Client (TUI/API)
+ participant CC as ChannelsController
+ participant ChS as ChannelService
+ participant CS as ChatService
+ participant DB as SQLite
+ participant SRB as SignalRBroadcaster
+ participant IRCB as IrcBroadcaster
+
+ Client->>CC: POST /api/channels {name, topic, isPublic}
+ CC->>ChS: CreateChannelAsync(creatorId, name, topic, isPublic)
+ ChS->>ChS: Normalize name (lowercase, trim)
+ ChS->>ChS: Validate format (2-100 chars, regex)
+ ChS->>DB: Check duplicate
+ ChS->>DB: INSERT Channel + ChannelMembership (creator auto-added)
+ ChS-->>CC: ChannelDto
+
+ alt Channel is public
+ CC->>CS: BroadcastChannelUpdatedAsync(channel)
+ CS->>SRB: SendChannelUpdatedAsync(channelDto)
+ SRB->>SRB: Notify all SignalR clients
+ CS->>IRCB: SendChannelUpdatedAsync(channelDto)
+ end
+
+ CC-->>Client: 201 Created (ChannelDto)
+
+Code references:
+
+
+
+Step
+File
+Location
+
+
+
+
+Controller endpoint
+src/EchoHub.Server/Controllers/ChannelsController.cs
+Lines 60-76
+
+
+Channel service create
+src/EchoHub.Server/Services/ChannelService.cs
+Lines 50-90
+
+
+Broadcast updated
+src/EchoHub.Server/Services/ChatService.cs
+Lines 308-309
+
+
+
+
+Channel Deletion
+Only the channel creator (or admin) can delete a channel. The default channel
+is protected.
+sequenceDiagram
+ participant Client as Client
+ participant CC as ChannelsController
+ participant ChS as ChannelService
+ participant DB as SQLite
+
+ Client->>CC: DELETE /api/channels/{channel}
+ CC->>ChS: DeleteChannelAsync(channelName, callerId)
+ ChS->>ChS: Reject if default channel
+ ChS->>DB: Lookup channel
+ ChS->>ChS: Verify caller is creator or admin
+ ChS->>DB: DELETE Channel (cascade: messages, memberships)
+ ChS-->>CC: Success
+ CC-->>Client: 204 No Content
+
+Code references:
+
+
+
+Step
+File
+Location
+
+
+
+
+Controller endpoint
+src/EchoHub.Server/Controllers/ChannelsController.cs
+Lines 94-106
+
+
+Channel service delete
+src/EchoHub.Server/Services/ChannelService.cs
+Lines 119-144
+
+
+
+
+Joining a Channel
+Both SignalR and IRC clients join channels through ChatService. The presence
+tracker determines if this is a genuinely new join (vs. a second connection) and
+broadcasts accordingly.
+sequenceDiagram
+ participant Client as Client (SignalR or IRC)
+ participant Entry as ChatHub / IrcCommandHandler
+ participant CS as ChatService
+ participant ChS as ChannelService
+ participant PT as PresenceTracker
+ participant DB as SQLite
+ participant SRB as SignalRBroadcaster
+ participant IRCB as IrcBroadcaster
+
+ Client->>Entry: JoinChannel / JOIN #channel
+ Entry->>CS: JoinChannelAsync(connectionId, userId, username, channel)
+ CS->>ChS: EnsureChannelMembershipAsync(userId, channel)
+ ChS->>DB: INSERT ChannelMembership (if not exists)
+
+ CS->>PT: JoinChannel(username, channel)
+ PT-->>CS: isNewJoin?
+
+ alt First connection in this channel
+ CS->>DB: Fetch UserPresenceDto
+ CS->>CS: BroadcastToAllAsync(SendUserJoinedAsync)
+ par
+ CS->>SRB: SendUserJoinedAsync(channel, user, excludeConn)
+ and
+ CS->>IRCB: SendUserJoinedAsync(channel, user)
+ end
+ end
+
+ CS->>DB: Fetch message history
+ CS-->>Entry: (history, error)
+ Entry-->>Client: History messages
+
+Code references:
+
+
+
+Step
+File
+Location
+
+
+
+
+SignalR hub join
+src/EchoHub.Server/Hubs/ChatHub.cs
+Lines 59-81
+
+
+IRC join
+src/EchoHub.Server.Irc/IrcCommandHandler.cs
+Lines 361-414
+
+
+ChatService join
+src/EchoHub.Server/Services/ChatService.cs
+Lines 96-135
+
+
+Presence join
+src/EchoHub.Server/Services/PresenceTracker.cs
+Lines 58-70
+
+
+SignalR broadcast
+src/EchoHub.Server/Services/SignalRBroadcaster.cs
+Lines 26-32
+
+
+IRC broadcast
+src/EchoHub.Server.Irc/IrcBroadcaster.cs
+Lines 34-41
+
+
+
+
+Leaving a Channel
+sequenceDiagram
+ participant Client as Client
+ participant Entry as ChatHub / IrcCommandHandler
+ participant CS as ChatService
+ participant PT as PresenceTracker
+ participant SRB as SignalRBroadcaster
+ participant IRCB as IrcBroadcaster
+
+ Client->>Entry: LeaveChannel / PART #channel
+ Entry->>CS: LeaveChannelAsync(connectionId, username, channel)
+ CS->>PT: LeaveChannel(username, channel)
+ CS->>CS: BroadcastToAllAsync(SendUserLeftAsync)
+ par
+ CS->>SRB: SendUserLeftAsync(channel, username)
+ and
+ CS->>IRCB: SendUserLeftAsync(channel, username)
+ end
+
+Code references:
+
+
+
+Step
+File
+Location
+
+
+
+
+SignalR hub leave
+src/EchoHub.Server/Hubs/ChatHub.cs
+Lines 83-96
+
+
+IRC part
+src/EchoHub.Server.Irc/IrcCommandHandler.cs
+Lines 416-435
+
+
+ChatService leave
+src/EchoHub.Server/Services/ChatService.cs
+Lines 137-143
+
+
+Presence leave
+src/EchoHub.Server/Services/PresenceTracker.cs
+Lines 72-81
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/flows/connection.html b/flows/connection.html
new file mode 100644
index 0000000..22cdd2e
--- /dev/null
+++ b/flows/connection.html
@@ -0,0 +1,348 @@
+
+
+
+
+ Connection | EchoHub Documentation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Connection
+
+SignalR Client Connection
+After authentication, the TUI client establishes a SignalR WebSocket, registers
+event handlers, joins the default channel, and loads history.
+sequenceDiagram
+ participant CM as ConnectionManager
+ participant EHC as EchoHubConnection
+ participant Hub as ChatHub
+ participant CS as ChatService
+ participant PT as PresenceTracker
+ participant DB as SQLite
+
+ CM->>CM: Fetch encryption key (GET /api/server/encryption-key)
+ CM->>EHC: new EchoHubConnection(apiClient, encryption)
+ EHC->>EHC: Build HubConnection (URL + JWT token provider + auto-reconnect)
+ EHC->>EHC: RegisterHandlers() — wire ReceiveMessage, UserJoined, etc.
+ EHC->>Hub: ConnectAsync() → WebSocket handshake
+ Hub->>CS: UserConnectedAsync(connectionId, userId, username)
+ CS->>PT: UserConnected(connectionId, userId, username)
+ CS->>DB: Update user: Status=Online, LastSeenAt=now
+ CM->>CM: Fetch channel list (GET /api/channels)
+ CM->>EHC: JoinChannelAsync("general")
+ EHC->>Hub: InvokeAsync("JoinChannel", "general")
+ Hub->>CS: JoinChannelAsync(connectionId, userId, username, "general")
+ CS->>DB: EnsureChannelMembership
+ CS->>PT: JoinChannel(username, "general")
+ CS->>CS: BroadcastToAllAsync → UserJoined
+ CS->>DB: Fetch message history
+ Hub-->>EHC: List<MessageDto> (encrypted)
+ EHC-->>CM: Decrypted history
+
+Code references:
+
+
+
+Step
+File
+Location
+
+
+
+
+Connection orchestration
+src/EchoHub.Client/Services/ConnectionManager.cs
+Lines 58-140 (ConnectAsync)
+
+
+EchoHubConnection setup
+src/EchoHub.Client/Services/EchoHubConnection.cs
+Lines 29-62 (constructor)
+
+
+Handler registration
+src/EchoHub.Client/Services/EchoHubConnection.cs
+Lines 64-122 (RegisterHandlers)
+
+
+Hub OnConnected
+src/EchoHub.Server/Hubs/ChatHub.cs
+Lines 31-43
+
+
+ChatService connected
+src/EchoHub.Server/Services/ChatService.cs
+Lines 41-57
+
+
+PresenceTracker connect
+src/EchoHub.Server/Services/PresenceTracker.cs
+Lines 13-29
+
+
+Join channel (hub)
+src/EchoHub.Server/Hubs/ChatHub.cs
+Lines 59-81
+
+
+Join channel (service)
+src/EchoHub.Server/Services/ChatService.cs
+Lines 96-135
+
+
+
+
+IRC Client Connection
+IRC clients connect via TCP, authenticate with PASS/NICK/USER or SASL PLAIN,
+and auto-join channels. New usernames are auto-registered.
+sequenceDiagram
+ participant IRC as IRC Client
+ participant GW as IrcGatewayService
+ participant CH as IrcCommandHandler
+ participant US as UserService
+ participant CS as ChatService
+ participant PT as PresenceTracker
+
+ IRC->>GW: TCP connect (:6667 or :6697 TLS)
+ GW->>GW: Accept + create IrcClientConnection
+ GW->>CH: new IrcCommandHandler(connection, services)
+ GW->>CH: RunAsync() — start read loop
+
+ alt SASL PLAIN
+ IRC->>CH: CAP REQ :sasl
+ CH-->>IRC: CAP ACK :sasl
+ IRC->>CH: AUTHENTICATE PLAIN
+ CH-->>IRC: AUTHENTICATE +
+ IRC->>CH: AUTHENTICATE <base64(\0user\0pass)>
+ CH->>US: AuthenticateUserAsync(user, pass)
+ alt Auth fails → auto-register
+ CH->>US: RegisterUserAsync(user, pass)
+ end
+ CH-->>IRC: 903 :SASL authentication successful
+ else PASS/NICK/USER
+ IRC->>CH: PASS <password>
+ IRC->>CH: NICK <nickname>
+ IRC->>CH: USER <username> 0 * :<realname>
+ CH->>US: AuthenticateUserAsync(nick, pass)
+ alt Auth fails → auto-register
+ CH->>US: RegisterUserAsync(nick, pass)
+ end
+ end
+
+ CH->>CS: UserConnectedAsync(irc-{guid}, userId, username)
+ CS->>PT: UserConnected(irc-{guid}, userId, username)
+ CH-->>IRC: 001-004 RPL_WELCOME burst + MOTD
+
+ Note over IRC,CH: Client is now ready for JOIN/PART/PRIVMSG
+
+Code references:
+
+
+
+Step
+File
+Location
+
+
+
+
+TCP listener
+src/EchoHub.Server.Irc/IrcGatewayService.cs
+Lines 45-90 (ExecuteAsync)
+
+
+Client handler
+src/EchoHub.Server.Irc/IrcGatewayService.cs
+Lines 92-154 (HandleClientAsync)
+
+
+Command read loop
+src/EchoHub.Server.Irc/IrcCommandHandler.cs
+Lines 40-98 (RunAsync)
+
+
+SASL auth
+src/EchoHub.Server.Irc/IrcCommandHandler.cs
+Lines 136-207 (HandleAuthenticateAsync)
+
+
+PASS/NICK/USER
+src/EchoHub.Server.Irc/IrcCommandHandler.cs
+Lines 209-267
+
+
+Registration completion
+src/EchoHub.Server.Irc/IrcCommandHandler.cs
+Lines 268-315 (TryCompleteRegistrationAsync)
+
+
+Cleanup on disconnect
+src/EchoHub.Server.Irc/IrcGatewayService.cs
+Lines 136-153
+
+
+
+
+User Disconnect & Presence
+When a client disconnects, the presence tracker determines if the user has any
+remaining connections. If not, status is set to Invisible and all channels are
+notified.
+sequenceDiagram
+ participant Client as Client
+ participant Entry as ChatHub / IrcGatewayService
+ participant CS as ChatService
+ participant PT as PresenceTracker
+ participant DB as SQLite
+ participant SRB as SignalRBroadcaster
+
+ Client->>Entry: Disconnect / TCP close
+ Entry->>CS: UserDisconnectedAsync(connectionId)
+ CS->>PT: Get username + channels (before removal)
+ CS->>PT: UserDisconnected(connectionId)
+ PT->>PT: Remove connection from tracking
+
+ alt No remaining connections for user
+ CS->>DB: Update user: Status=Invisible, LastSeenAt=now
+ loop For each channel user was in
+ CS->>CS: BroadcastToAllAsync(SendUserStatusChangedAsync)
+ CS->>SRB: Notify channel members
+ end
+ end
+
+Code references:
+
+
+
+Step
+File
+Location
+
+
+
+
+SignalR disconnect
+src/EchoHub.Server/Hubs/ChatHub.cs
+Lines 45-57
+
+
+IRC cleanup
+src/EchoHub.Server.Irc/IrcGatewayService.cs
+Lines 136-153
+
+
+ChatService disconnect
+src/EchoHub.Server/Services/ChatService.cs
+Lines 59-94
+
+
+Presence disconnect
+src/EchoHub.Server/Services/PresenceTracker.cs
+Lines 31-53
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/flows/flows.html b/flows/flows.html
new file mode 100644
index 0000000..ec89f75
--- /dev/null
+++ b/flows/flows.html
@@ -0,0 +1,117 @@
+
+
+
+
+ Flows | EchoHub Documentation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Flows
+
+This section documents the major request/event flows in EchoHub, showing how data moves between the TUI client, IRC client, server, and database. Each diagram includes code references so you can jump straight to the implementation.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/flows/media.html b/flows/media.html
new file mode 100644
index 0000000..abf2a0b
--- /dev/null
+++ b/flows/media.html
@@ -0,0 +1,296 @@
+
+
+
+
+ Media & Services | EchoHub Documentation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+File Upload
+Files are uploaded via REST, validated by magic bytes, stored with GUID filenames,
+and broadcast as a message with a download link.
+sequenceDiagram
+ participant Client as Client
+ participant CC as ChannelsController
+ participant FV as FileValidationHelper
+ participant FS as FileStorageService
+ participant CS as ChatService
+ participant DB as SQLite
+
+ Client->>CC: POST /api/channels/{channel}/upload (multipart)
+ CC->>CC: Check file size limits
+ CC->>FV: IsValidImage(stream) — magic byte check
+ FV->>FV: Read header: JPEG(FFD8FF) / PNG(89504E47) / GIF / WebP(RIFF+WEBP)
+ FV-->>CC: true/false
+ CC->>FS: SaveFileAsync(stream, extension)
+ FS->>FS: Generate GUID filename, write to uploads/
+ FS-->>CC: fileId (GUID)
+ CC->>CC: Determine MessageType (Image/Audio/File)
+ CC->>CS: SendMessageAsync (with file URL + optional ASCII art)
+ CS->>DB: INSERT Message
+ CS->>CS: BroadcastToAllAsync → fan out to clients
+
+Code references:
+
+
+
+Step
+File
+Location
+
+
+
+
+Upload endpoint
+src/EchoHub.Server/Controllers/ChannelsController.cs
+Lines 108-200
+
+
+File validation
+src/EchoHub.Server/Services/FileValidationHelper.cs
+Lines 15-82
+
+
+File storage
+src/EchoHub.Server/Services/FileStorageService.cs
+Lines 1-47
+
+
+File download
+src/EchoHub.Server/Controllers/FilesController.cs
+Lines 22-53
+
+
+
+
+Link Embed Resolution
+When a message contains URLs, the server fetches OpenGraph metadata for preview
+embeds.
+sequenceDiagram
+ participant CS as ChatService
+ participant LE as LinkEmbedService
+ participant Web as External Website
+
+ CS->>LE: TryGetEmbedsAsync(messageContent)
+ LE->>LE: Extract URLs via regex
+ LE->>LE: Filter: max URLs per message, skip duplicates
+
+ loop For each URL
+ LE->>LE: Validate: http(s) only, block private IPs
+ LE->>Web: GET URL (timeout + size limit)
+ Web-->>LE: HTML response
+ LE->>LE: Parse og:title, og:description, og:site_name
+ LE->>LE: Parse theme-color meta tag
+ LE->>LE: Fallback to <title> if no og:title
+ end
+
+ LE-->>CS: List<EmbedDto> (or null)
+ Note over CS: Attached to MessageDto before broadcast
+
+Code references:
+
+
+
+Step
+File
+Location
+
+
+
+
+Entry point
+src/EchoHub.Server/Services/LinkEmbedService.cs
+Lines 28-51 (TryGetEmbedsAsync)
+
+
+URL extraction
+src/EchoHub.Server/Services/LinkEmbedService.cs
+Lines 145-160
+
+
+Private IP blocking
+src/EchoHub.Server/Services/LinkEmbedService.cs
+Lines 162-181
+
+
+OG tag parsing
+src/EchoHub.Server/Services/LinkEmbedService.cs
+Lines 187-210
+
+
+Theme color parsing
+src/EchoHub.Server/Services/LinkEmbedService.cs
+Lines 117-143
+
+
+ChatService integration
+src/EchoHub.Server/Services/ChatService.cs
+Lines 194-201
+
+
+
+
+Server Directory Registration
+Public servers register with the EchoHubSpace directory for discoverability.
+sequenceDiagram
+ participant SDS as ServerDirectoryService
+ participant Dir as EchoHubSpace Directory
+ participant PT as PresenceTracker
+
+ SDS->>SDS: Check Server:PublicServer config
+ SDS->>Dir: SignalR connect (echohub.voidcube.cloud/hubs/servers)
+ SDS->>Dir: RegisterServer(name, description, host, userCount)
+ Dir-->>SDS: Registered
+
+ loop Every 30 seconds
+ SDS->>PT: Get online user count
+ alt Count changed
+ SDS->>Dir: UpdateUserCount(count)
+ end
+ end
+
+ Dir->>SDS: Ping
+ SDS->>Dir: Heartbeat
+
+ Note over SDS,Dir: Exponential backoff on disconnect (2s → 30s max)
+
+Code references:
+
+
+
+Step
+File
+Location
+
+
+
+
+Service lifecycle
+src/EchoHub.Server/Services/ServerDirectoryService.cs
+Lines 29-122
+
+
+Registration
+src/EchoHub.Server/Services/ServerDirectoryService.cs
+Lines 195-212
+
+
+User count polling
+src/EchoHub.Server/Services/ServerDirectoryService.cs
+Lines 154-187
+
+
+Reconnection backoff
+src/EchoHub.Server/Services/ServerDirectoryService.cs
+Lines 77-82, 191
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/flows/messaging.html b/flows/messaging.html
new file mode 100644
index 0000000..38a2d43
--- /dev/null
+++ b/flows/messaging.html
@@ -0,0 +1,513 @@
+
+
+
+
+ Messaging | EchoHub Documentation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Messaging
+
+Sending a Message (SignalR)
+A message typed in the TUI travels through encryption, the SignalR hub,
+ChatService validation, database storage, and fan-out to both SignalR and IRC
+clients.
+sequenceDiagram
+ participant UI as MainWindow (TUI)
+ participant AO as AppOrchestrator
+ participant EHC as EchoHubConnection
+ participant Hub as ChatHub
+ participant CS as ChatService
+ participant LE as LinkEmbedService
+ participant DB as SQLite
+ participant SRB as SignalRBroadcaster
+ participant IRCB as IrcBroadcaster
+ participant Clients as Other Clients
+
+ UI->>AO: OnMessageSubmitted(channel, text)
+ AO->>AO: IsCommand(text)? → No
+ AO->>EHC: SendMessageAsync(channel, text)
+ EHC->>EHC: Encrypt(text) → ciphertext
+ EHC->>Hub: InvokeAsync("SendMessage", channel, ciphertext)
+ Hub->>CS: SendMessageAsync(userId, username, channel, ciphertext)
+ CS->>CS: Decrypt(ciphertext) → plaintext
+ CS->>CS: Validate (length, newlines, channel exists)
+ CS->>DB: Check mute status
+ CS->>LE: TryGetEmbedsAsync(plaintext)
+ LE->>LE: Extract URLs, fetch OG tags
+ LE-->>CS: List<EmbedDto> (or null)
+ CS->>DB: INSERT Message (encrypted at rest)
+ CS->>CS: Re-encrypt plaintext for transport
+ CS->>CS: Build MessageDto with embeds
+
+ par Fan-out to all broadcasters
+ CS->>SRB: SendMessageToChannelAsync(channel, dto)
+ SRB->>Clients: HubContext.Group(channel).ReceiveMessage(dto)
+ and
+ CS->>IRCB: SendMessageToChannelAsync(channel, dto)
+ IRCB->>IRCB: Decrypt → format as PRIVMSG lines
+ IRCB->>Clients: Send to each IRC conn (skip sender)
+ end
+
+Code references:
+
+
+
+Step
+File
+Location
+
+
+
+
+Input handler
+src/EchoHub.Client/UI/MainWindow.cs
+Lines 428-449 (OnInputKeyDown)
+
+
+Orchestrator dispatch
+src/EchoHub.Client/AppOrchestrator.cs
+Lines 631-661 (HandleMessageSubmitted)
+
+
+Client encrypt + send
+src/EchoHub.Client/Services/EchoHubConnection.cs
+Lines 148-153 (SendMessageAsync)
+
+
+Hub receive
+src/EchoHub.Server/Hubs/ChatHub.cs
+Lines 98-111 (SendMessage)
+
+
+ChatService process
+src/EchoHub.Server/Services/ChatService.cs
+Lines 145-241 (SendMessageAsync)
+
+
+Mute check
+src/EchoHub.Server/Services/ChatService.cs
+Lines 177-190
+
+
+Link embeds
+src/EchoHub.Server/Services/LinkEmbedService.cs
+Lines 28-51 (TryGetEmbedsAsync)
+
+
+DB insert
+src/EchoHub.Server/Services/ChatService.cs
+Lines 208-221
+
+
+Broadcast fan-out
+src/EchoHub.Server/Services/ChatService.cs
+Lines 311-324 (BroadcastToAllAsync)
+
+
+SignalR broadcast
+src/EchoHub.Server/Services/SignalRBroadcaster.cs
+Lines 23-24
+
+
+IRC broadcast
+src/EchoHub.Server.Irc/IrcBroadcaster.cs
+Lines 17-32
+
+
+
+
+Sending a Message (IRC)
+Messages from IRC clients follow the same ChatService path but enter as
+plaintext (no app-layer encryption).
+sequenceDiagram
+ participant IRC as IRC Client
+ participant CH as IrcCommandHandler
+ participant CS as ChatService
+ participant DB as SQLite
+ participant SRB as SignalRBroadcaster
+ participant IRCB as IrcBroadcaster
+
+ IRC->>CH: PRIVMSG #channel :Hello world
+ CH->>CH: Parse target + content
+ CH->>CH: IrcToEchoHubChannel("#channel") → "channel"
+ CH->>CS: SendMessageAsync(userId, username, "channel", "Hello world")
+ CS->>CS: Decrypt("Hello world") → passthrough (no $ENC$ prefix)
+ CS->>CS: Validate, check mute, fetch embeds
+ CS->>DB: INSERT Message
+ CS->>CS: Encrypt plaintext for SignalR transport
+
+ par Fan-out
+ CS->>SRB: SendMessageToChannelAsync (encrypted for SignalR)
+ and
+ CS->>IRCB: SendMessageToChannelAsync (decrypt → PRIVMSG)
+ IRCB->>IRCB: Skip sender (IRC echo suppression)
+ end
+
+Code references:
+
+
+
+Step
+File
+Location
+
+
+
+
+PRIVMSG handler
+src/EchoHub.Server.Irc/IrcCommandHandler.cs
+Lines 437-469
+
+
+Channel name conversion
+src/EchoHub.Server.Irc/IrcCommandHandler.cs
+Line 680 (IrcToEchoHubChannel)
+
+
+ChatService (shared path)
+src/EchoHub.Server/Services/ChatService.cs
+Lines 145-241
+
+
+IRC echo suppression
+src/EchoHub.Server.Irc/IrcBroadcaster.cs
+Lines 25-26
+
+
+
+
+Receiving a Message (TUI Client)
+When a message arrives via SignalR, the client decrypts it, adds it to the chat
+view, and optionally plays a notification sound for @mentions.
+sequenceDiagram
+ participant SRB as SignalRBroadcaster
+ participant EHC as EchoHubConnection
+ participant AO as AppOrchestrator
+ participant MM as ChatMessageManager
+ participant UI as MainWindow
+
+ SRB->>EHC: ReceiveMessage(MessageDto)
+ EHC->>EHC: Decrypt(message.Content)
+ EHC-->>AO: OnMessageReceived(decrypted dto)
+ AO->>AO: InvokeUI (thread-safe)
+ AO->>MM: AddMessage(message)
+ MM->>UI: Render in chat ListView
+ alt Message contains @username
+ AO->>AO: PlayAsync() notification sound
+ end
+
+Code references:
+
+
+
+Step
+File
+Location
+
+
+
+
+SignalR handler
+src/EchoHub.Client/Services/EchoHubConnection.cs
+Lines 64-71
+
+
+Orchestrator receive
+src/EchoHub.Client/AppOrchestrator.cs
+Lines 372-383
+
+
+@mention detection
+src/EchoHub.Client/AppOrchestrator.cs
+Lines 378-382
+
+
+
+
+Command Execution
+Slash commands (/status, /nick, /kick, etc.) are parsed client-side and
+dispatched to appropriate handlers, which call REST APIs or SignalR methods.
+sequenceDiagram
+ participant UI as MainWindow
+ participant AO as AppOrchestrator
+ participant CMD as CommandHandler
+ participant API as ApiClient
+ participant EHC as EchoHubConnection
+ participant Server as Server (API/Hub)
+
+ UI->>AO: OnMessageSubmitted(channel, "/kick baduser")
+ AO->>CMD: IsCommand("/kick baduser")? → true
+ AO->>CMD: HandleAsync("/kick baduser")
+ CMD->>CMD: Parse → command="kick", args="baduser"
+
+ alt API command (kick, ban, mute, nick, etc.)
+ CMD-->>AO: Fire OnKickRequested("baduser")
+ AO->>API: KickUserAsync("baduser")
+ API->>Server: POST /api/moderation/kick/baduser
+ else Hub command (status, join, leave, etc.)
+ CMD-->>AO: Fire OnSetStatus / OnJoinChannel / etc.
+ AO->>EHC: UpdateStatusAsync() / JoinChannelAsync() / etc.
+ EHC->>Server: SignalR Invoke
+ else Local command (theme, help, quit)
+ CMD-->>AO: Fire OnThemeChanged / etc.
+ AO->>UI: Apply locally (no server call)
+ end
+
+ AO->>UI: AddSystemMessage(result)
+
+Available commands:
+
+
+
+Command
+Type
+Handler
+
+
+
+
+/status <status> [message]
+Hub
+UpdateStatusAsync
+
+
+/nick <name>
+API
+UpdateProfileAsync
+
+
+/color <hex>
+API
+UpdateProfileAsync
+
+
+/join <channel>
+Hub
+JoinChannelAsync
+
+
+/leave
+Hub
+LeaveChannelAsync
+
+
+/topic <text>
+API
+UpdateChannelTopicAsync
+
+
+/kick <user>
+API
+POST /api/moderation/kick/{user}
+
+
+/ban <user>
+API
+POST /api/moderation/ban/{user}
+
+
+/unban <user>
+API
+POST /api/moderation/unban/{user}
+
+
+/mute <user> [mins]
+API
+POST /api/moderation/mute/{user}
+
+
+/unmute <user>
+API
+POST /api/moderation/unmute/{user}
+
+
+/role <user> <role>
+API
+PUT /api/moderation/role/{user}
+
+
+/nuke
+API
+DELETE /api/channels/{channel}/messages
+
+
+/send <file>
+API
+POST /api/channels/{channel}/upload
+
+
+/profile [user]
+Local
+Show profile dialog
+
+
+/avatar
+API
+POST /api/users/avatar
+
+
+/theme <name>
+Local
+ThemeManager.SetTheme()
+
+
+/servers
+API
+GET /api/serverdir/servers
+
+
+/users
+Local
+Show userlist
+
+
+/help
+Local
+Show help text
+
+
+/quit
+Local
+Exit application
+
+
+
+Code references:
+
+
+
+Step
+File
+Location
+
+
+
+
+Command detection
+src/EchoHub.Client/AppOrchestrator.cs
+Lines 639-655
+
+
+Command dispatch
+src/EchoHub.Client/Commands/CommandHandler.cs
+Lines 34-69 (HandleAsync)
+
+
+Command handlers wired
+src/EchoHub.Client/AppOrchestrator.cs
+Lines 97-117
+
+
+Individual handlers
+src/EchoHub.Client/AppOrchestrator.cs
+Lines 122-350
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/flows/moderation.html b/flows/moderation.html
new file mode 100644
index 0000000..39dc3a9
--- /dev/null
+++ b/flows/moderation.html
@@ -0,0 +1,196 @@
+
+
+
+
+ Moderation | EchoHub Documentation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Moderation
+
+Kick / Ban / Mute
+Moderators and admins can kick, ban, or mute users via REST API or slash commands.
+These actions force-disconnect the target and broadcast the event.
+sequenceDiagram
+ participant Mod as Moderator
+ participant MC as ModerationController
+ participant CS as ChatService
+ participant PT as PresenceTracker
+ participant DB as SQLite
+ participant SRB as SignalRBroadcaster
+ participant IRCB as IrcBroadcaster
+
+ Mod->>MC: POST /api/moderation/kick/{user}
+
+ alt Kick
+ MC->>CS: Get user's channels
+ MC->>CS: BroadcastToAllAsync(SendUserKickedAsync)
+ MC->>CS: ForceDisconnectAndCleanupAsync(user)
+ else Ban
+ MC->>DB: Set user.IsBanned = true
+ MC->>CS: BroadcastToAllAsync(SendUserBannedAsync)
+ MC->>CS: ForceDisconnectAndCleanupAsync(user)
+ else Mute
+ MC->>DB: Set user.IsMuted = true, MutedUntil = now + duration
+ Note over DB: MuteExpirationService auto-unmutes when timer expires
+ end
+
+ CS->>PT: ForceRemoveUser(username)
+ PT->>PT: Remove from all connections + channels
+ CS->>SRB: ForceDisconnectUserAsync(connectionIds, reason)
+ CS->>IRCB: ForceDisconnectUserAsync(connectionIds, reason)
+ CS->>DB: Set Status=Invisible, LastSeenAt=now
+
+Code references:
+
+
+
+Step
+File
+Location
+
+
+
+
+Kick endpoint
+src/EchoHub.Server/Controllers/ModerationController.cs
+Lines 62-87
+
+
+Ban endpoint
+src/EchoHub.Server/Controllers/ModerationController.cs
+Lines 89-112
+
+
+Mute endpoint
+src/EchoHub.Server/Controllers/ModerationController.cs
+Lines 130-151
+
+
+Force disconnect
+src/EchoHub.Server/Controllers/ModerationController.cs
+Lines 232-256
+
+
+Mute expiration
+src/EchoHub.Server/Services/MuteExpirationService.cs
+Lines 22-62
+
+
+Mute enforcement
+src/EchoHub.Server/Services/ChatService.cs
+Lines 177-190
+
+
+Presence force remove
+src/EchoHub.Server/Services/PresenceTracker.cs
+Lines 161-178
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/flows/toc.html b/flows/toc.html
new file mode 100644
index 0000000..9d5901c
--- /dev/null
+++ b/flows/toc.html
@@ -0,0 +1,37 @@
+
+
diff --git a/flows/toc.json b/flows/toc.json
new file mode 100644
index 0000000..572e26a
--- /dev/null
+++ b/flows/toc.json
@@ -0,0 +1,2 @@
+
+{"items":[{"name":"Authentication","href":"authentication.html","topicHref":"authentication.html"},{"name":"Connection","href":"connection.html","topicHref":"connection.html"},{"name":"Messaging","href":"messaging.html","topicHref":"messaging.html"},{"name":"Channels","href":"channels.html","topicHref":"channels.html"},{"name":"Moderation","href":"moderation.html","topicHref":"moderation.html"},{"name":"Media & Services","href":"media.html","topicHref":"media.html"}]}
diff --git a/index.json b/index.json
index c60eb2b..4454635 100644
--- a/index.json
+++ b/index.json
@@ -69,6 +69,11 @@
"title": "Class AudioPlaybackService | EchoHub Documentation",
"summary": "Class AudioPlaybackService Namespace EchoHub.Client.Services Assembly EchoHub.Client.dll public class AudioPlaybackService Inheritance object AudioPlaybackService Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors AudioPlaybackService() public AudioPlaybackService() Properties IsPaused public bool IsPaused { get; } Property Value bool IsPlaying public bool IsPlaying { get; } Property Value bool Methods PauseAsync() public Task PauseAsync() Returns Task PlayAsync(string) public Task PlayAsync(string filePath) Parameters filePath string Returns Task ResumeAsync() public Task ResumeAsync() Returns Task SetVolumeAsync(byte) public Task SetVolumeAsync(byte volume) Parameters volume byte Returns Task StopAsync() public Task StopAsync() Returns Task Events PlaybackFinished public event EventHandler? PlaybackFinished Event Type EventHandler"
},
+ "api/client/EchoHub.Client.Services.BackupInfo.html": {
+ "href": "api/client/EchoHub.Client.Services.BackupInfo.html",
+ "title": "Class BackupInfo | EchoHub Documentation",
+ "summary": "Class BackupInfo Namespace EchoHub.Client.Services Assembly EchoHub.Client.dll public record BackupInfo : IEquatable Inheritance object BackupInfo Implements IEquatable Inherited Members object.GetType() object.MemberwiseClone() object.Equals(object, object) object.ReferenceEquals(object, object) Constructors BackupInfo(BackupInfo) protected BackupInfo(BackupInfo original) Parameters original BackupInfo BackupInfo(string, string, DateTimeOffset) public BackupInfo(string Version, string AppDirectory, DateTimeOffset CreatedAt) Parameters Version string AppDirectory string CreatedAt DateTimeOffset Properties AppDirectory public string AppDirectory { get; init; } Property Value string CreatedAt public DateTimeOffset CreatedAt { get; init; } Property Value DateTimeOffset EqualityContract protected virtual Type EqualityContract { get; } Property Value Type Version public string Version { get; init; } Property Value string Methods Deconstruct(out string, out string, out DateTimeOffset) public void Deconstruct(out string Version, out string AppDirectory, out DateTimeOffset CreatedAt) Parameters Version string AppDirectory string CreatedAt DateTimeOffset Equals(BackupInfo?) public virtual bool Equals(BackupInfo? other) Parameters other BackupInfo Returns bool Equals(object?) public override bool Equals(object? obj) Parameters obj object Returns bool GetHashCode() public override int GetHashCode() Returns int PrintMembers(StringBuilder) protected virtual bool PrintMembers(StringBuilder builder) Parameters builder StringBuilder Returns bool ToString() public override string ToString() Returns string Operators operator ==(BackupInfo?, BackupInfo?) public static bool operator ==(BackupInfo? left, BackupInfo? right) Parameters left BackupInfo right BackupInfo Returns bool operator !=(BackupInfo?, BackupInfo?) public static bool operator !=(BackupInfo? left, BackupInfo? right) Parameters left BackupInfo right BackupInfo Returns bool"
+ },
"api/client/EchoHub.Client.Services.ClientEncryptionService.html": {
"href": "api/client/EchoHub.Client.Services.ClientEncryptionService.html",
"title": "Class ClientEncryptionService | EchoHub Documentation",
@@ -77,22 +82,32 @@
"api/client/EchoHub.Client.Services.EchoHubConnection.html": {
"href": "api/client/EchoHub.Client.Services.EchoHubConnection.html",
"title": "Class EchoHubConnection | EchoHub Documentation",
- "summary": "Class EchoHubConnection Namespace EchoHub.Client.Services Assembly EchoHub.Client.dll public sealed class EchoHubConnection : IAsyncDisposable Inheritance object EchoHubConnection Implements IAsyncDisposable Inherited Members object.GetType() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors EchoHubConnection(string, ApiClient, ClientEncryptionService) public EchoHubConnection(string serverUrl, ApiClient apiClient, ClientEncryptionService encryption) Parameters serverUrl string apiClient ApiClient encryption ClientEncryptionService Properties IsConnected public bool IsConnected { get; } Property Value bool Methods ConnectAsync() public Task ConnectAsync() Returns Task DisconnectAsync() public Task DisconnectAsync() Returns Task DisposeAsync() public ValueTask DisposeAsync() Returns ValueTask GetHistoryAsync(string, int) public Task> GetHistoryAsync(string channelName, int count = 100) Parameters channelName string count int Returns Task> GetOnlineUsersAsync(string) public Task> GetOnlineUsersAsync(string channelName) Parameters channelName string Returns Task> JoinChannelAsync(string) public Task> JoinChannelAsync(string channelName) Parameters channelName string Returns Task> LeaveChannelAsync(string) public Task LeaveChannelAsync(string channelName) Parameters channelName string Returns Task SendMessageAsync(string, string) public Task SendMessageAsync(string channelName, string content) Parameters channelName string content string Returns Task UpdateStatusAsync(UserStatus, string?) public Task UpdateStatusAsync(UserStatus status, string? statusMessage = null) Parameters status UserStatus statusMessage string Returns Task Events OnChannelNuked public event Action? OnChannelNuked Event Type Action OnChannelUpdated public event Action? OnChannelUpdated Event Type Action OnConnectionStateChanged public event Action? OnConnectionStateChanged Event Type Action OnError public event Action? OnError Event Type Action OnForceDisconnect public event Action? OnForceDisconnect Event Type Action OnMessageDeleted public event Action? OnMessageDeleted Event Type Action OnMessageReceived public event Action? OnMessageReceived Event Type Action OnReconnected public event Action? OnReconnected Event Type Action OnUserBanned public event Action? OnUserBanned Event Type Action OnUserJoined public event Action? OnUserJoined Event Type Action OnUserKicked public event Action? OnUserKicked Event Type Action OnUserLeft public event Action? OnUserLeft Event Type Action OnUserStatusChanged public event Action? OnUserStatusChanged Event Type Action"
+ "summary": "Class EchoHubConnection Namespace EchoHub.Client.Services Assembly EchoHub.Client.dll public sealed class EchoHubConnection : IAsyncDisposable Inheritance object EchoHubConnection Implements IAsyncDisposable Inherited Members object.GetType() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors EchoHubConnection(string, ApiClient, ClientEncryptionService) public EchoHubConnection(string serverUrl, ApiClient apiClient, ClientEncryptionService encryption) Parameters serverUrl string apiClient ApiClient encryption ClientEncryptionService Properties IsConnected public bool IsConnected { get; } Property Value bool Methods ConnectAsync() public Task ConnectAsync() Returns Task DisconnectAsync() public Task DisconnectAsync() Returns Task DisposeAsync() public ValueTask DisposeAsync() Returns ValueTask GetHistoryAsync(string, int) public Task> GetHistoryAsync(string channelName, int count = 100) Parameters channelName string count int Returns Task> GetOnlineUsersAsync(string) public Task> GetOnlineUsersAsync(string channelName) Parameters channelName string Returns Task> JoinChannelAsync(string) public Task> JoinChannelAsync(string channelName) Parameters channelName string Returns Task> LeaveChannelAsync(string) public Task LeaveChannelAsync(string channelName) Parameters channelName string Returns Task SendMessageAsync(string, string) public Task SendMessageAsync(string channelName, string content) Parameters channelName string content string Returns Task UpdateStatusAsync(UserStatus, string?) public Task UpdateStatusAsync(UserStatus status, string? statusMessage = null) Parameters status UserStatus statusMessage string Returns Task Events OnChannelNuked public event Action? OnChannelNuked Event Type Action OnChannelUpdated public event Action? OnChannelUpdated Event Type Action OnConnectionStateChanged public event Action? OnConnectionStateChanged Event Type Action OnError public event Action? OnError Event Type Action OnForceDisconnect public event Action? OnForceDisconnect Event Type Action OnMessageDeleted public event Action? OnMessageDeleted Event Type Action OnMessageReceived public event Action? OnMessageReceived Event Type Action OnReconnected public event Action? OnReconnected Event Type Action OnUserBanned public event Action? OnUserBanned Event Type Action OnUserJoined public event Action? OnUserJoined Event Type Action OnUserKicked public event Action? OnUserKicked Event Type Action OnUserLeft public event Action? OnUserLeft Event Type Action OnUserStatusChanged public event Action? OnUserStatusChanged Event Type Action"
},
"api/client/EchoHub.Client.Services.NotificationSoundService.html": {
"href": "api/client/EchoHub.Client.Services.NotificationSoundService.html",
"title": "Class NotificationSoundService | EchoHub Documentation",
"summary": "Class NotificationSoundService Namespace EchoHub.Client.Services Assembly EchoHub.Client.dll public class NotificationSoundService Inheritance object NotificationSoundService Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors NotificationSoundService(NotificationConfig) public NotificationSoundService(NotificationConfig config) Parameters config NotificationConfig Methods PlayAsync() public Task PlayAsync() Returns Task PlayTestAsync() Plays the notification sound regardless of the Enabled setting (for /test-sound). public Task PlayTestAsync() Returns Task SetEnabled(bool) public void SetEnabled(bool enabled) Parameters enabled bool SetVolume(byte) public void SetVolume(byte volume) Parameters volume byte"
},
+ "api/client/EchoHub.Client.Services.PathSetup.html": {
+ "href": "api/client/EchoHub.Client.Services.PathSetup.html",
+ "title": "Class PathSetup | EchoHub Documentation",
+ "summary": "Class PathSetup Namespace EchoHub.Client.Services Assembly EchoHub.Client.dll Ensures the application's directory is on the system PATH so users can run 'echohub' from any terminal session. public static class PathSetup Inheritance object PathSetup Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Methods EnsureOnPath() Checks if the app directory is on PATH; if not, adds it persistently. On Windows: modifies user-level PATH environment variable. On Linux/macOS: appends an export line to shell profile files. public static void EnsureOnPath()"
+ },
+ "api/client/EchoHub.Client.Services.UpdateBackupService.html": {
+ "href": "api/client/EchoHub.Client.Services.UpdateBackupService.html",
+ "title": "Class UpdateBackupService | EchoHub Documentation",
+ "summary": "Class UpdateBackupService Namespace EchoHub.Client.Services Assembly EchoHub.Client.dll Manages pre-update backups and rollback restoration for the auto-updater. Backup location: ~/.echohub/update-backup/ public static class UpdateBackupService Inheritance object UpdateBackupService Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Properties IsPostUpdate True if a backup exists from a recent update (set at startup). public static bool IsPostUpdate { get; set; } Property Value bool Methods BackupExists() Returns true if a valid backup exists (both ZIP and metadata file present). public static bool BackupExists() Returns bool CreateBackup() Creates a ZIP backup of the current app directory before an update. Deletes any previous backup first. Uses fastest compression for speed. public static void CreateBackup() DeleteBackup() Deletes the backup directory and all contents. public static void DeleteBackup() GetBackupInfo() Reads backup metadata. Returns null if no backup exists or metadata is unreadable. public static BackupInfo? GetBackupInfo() Returns BackupInfo RestoreBackup() Restores the backup ZIP to the app directory, then restarts the process. This method does not return — it calls Environment.Exit(0). public static void RestoreBackup()"
+ },
"api/client/EchoHub.Client.Services.UpdateChecker.html": {
"href": "api/client/EchoHub.Client.Services.UpdateChecker.html",
"title": "Class UpdateChecker | EchoHub Documentation",
- "summary": "Class UpdateChecker Namespace EchoHub.Client.Services Assembly EchoHub.Client.dll public sealed class UpdateChecker : IDisposable Inheritance object UpdateChecker Implements IDisposable Inherited Members object.GetType() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors UpdateChecker(IApplication) public UpdateChecker(IApplication app) Parameters app IApplication Properties CurrentVersion public static string CurrentVersion { get; } Property Value string Methods Dispose() public void Dispose() Start() public void Start()"
+ "summary": "Class UpdateChecker Namespace EchoHub.Client.Services Assembly EchoHub.Client.dll public sealed class UpdateChecker : IDisposable Inheritance object UpdateChecker Implements IDisposable Inherited Members object.GetType() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors UpdateChecker(IApplication) public UpdateChecker(IApplication app) Parameters app IApplication Properties CurrentVersion public static string CurrentVersion { get; } Property Value string Methods CheckNowAsync() public Task CheckNowAsync() Returns Task Dispose() public void Dispose() Start() public void Start()"
},
"api/client/EchoHub.Client.Services.html": {
"href": "api/client/EchoHub.Client.Services.html",
"title": "Namespace EchoHub.Client.Services | EchoHub Documentation",
- "summary": "Namespace EchoHub.Client.Services Classes ApiClient AsyncRunner Eliminates repeated Task.Run/try/catch/app.Invoke(ShowError) boilerplate. Runs async work on a background thread and routes exceptions to the UI. AudioPlaybackService ClientEncryptionService Client-side encryption service. Uses the same AES-256-GCM format as the server so messages are encrypted end-to-end between client and server. EchoHubConnection NotificationSoundService UpdateChecker"
+ "summary": "Namespace EchoHub.Client.Services Classes ApiClient AsyncRunner Eliminates repeated Task.Run/try/catch/app.Invoke(ShowError) boilerplate. Runs async work on a background thread and routes exceptions to the UI. AudioPlaybackService BackupInfo ClientEncryptionService Client-side encryption service. Uses the same AES-256-GCM format as the server so messages are encrypted end-to-end between client and server. EchoHubConnection NotificationSoundService PathSetup Ensures the application's directory is on the system PATH so users can run 'echohub' from any terminal session. UpdateBackupService Manages pre-update backups and rollback restoration for the auto-updater. Backup location: ~/.echohub/update-backup/ UpdateChecker"
},
"api/client/EchoHub.Client.Themes.Theme.html": {
"href": "api/client/EchoHub.Client.Themes.Theme.html",
@@ -117,12 +132,12 @@
"api/client/EchoHub.Client.UI.Chat.ChatColors.html": {
"href": "api/client/EchoHub.Client.UI.Chat.ChatColors.html",
"title": "Class ChatColors | EchoHub Documentation",
- "summary": "Class ChatColors Namespace EchoHub.Client.UI.Chat Assembly EchoHub.Client.dll Shared color attributes for chat rendering (timestamps, system messages). public static class ChatColors Inheritance object ChatColors Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Fields AudioAttr public static readonly Attribute AudioAttr Field Value Attribute EmbedBorderAttr public static readonly Attribute EmbedBorderAttr Field Value Attribute EmbedDescAttr public static readonly Attribute EmbedDescAttr Field Value Attribute EmbedTitleAttr public static readonly Attribute EmbedTitleAttr Field Value Attribute EmbedUrlAttr public static readonly Attribute EmbedUrlAttr Field Value Attribute FileAttr public static readonly Attribute FileAttr Field Value Attribute MentionHighlightAttr public static readonly Attribute MentionHighlightAttr Field Value Attribute MentionTextAttr public static readonly Attribute MentionTextAttr Field Value Attribute SystemAttr public static readonly Attribute SystemAttr Field Value Attribute TimestampAttr public static readonly Attribute TimestampAttr Field Value Attribute Methods SplitMentions(string, Attribute?) Split text around @mentions, giving each @word the MentionTextAttr accent color. Non-mention text uses the provided default color. public static List SplitMentions(string text, Attribute? defaultColor = null) Parameters text string defaultColor Attribute? Returns List"
+ "summary": "Class ChatColors Namespace EchoHub.Client.UI.Chat Assembly EchoHub.Client.dll Shared color attributes for chat rendering (timestamps, system messages). public static class ChatColors Inheritance object ChatColors Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Fields AudioAttr public static readonly Attribute AudioAttr Field Value Attribute ChannelRefAttr public static readonly Attribute ChannelRefAttr Field Value Attribute EmbedBorderAttr public static readonly Attribute EmbedBorderAttr Field Value Attribute EmbedDescAttr public static readonly Attribute EmbedDescAttr Field Value Attribute EmbedTitleAttr public static readonly Attribute EmbedTitleAttr Field Value Attribute EmbedUrlAttr public static readonly Attribute EmbedUrlAttr Field Value Attribute FileAttr public static readonly Attribute FileAttr Field Value Attribute MentionHighlightAttr public static readonly Attribute MentionHighlightAttr Field Value Attribute MentionTextAttr public static readonly Attribute MentionTextAttr Field Value Attribute SystemAttr public static readonly Attribute SystemAttr Field Value Attribute TimestampAttr public static readonly Attribute TimestampAttr Field Value Attribute Methods SplitMentions(string, Attribute?) Split text around @mentions and #channels, giving each the appropriate accent color. Non-special text uses the provided default color. public static List SplitMentions(string text, Attribute? defaultColor = null) Parameters text string defaultColor Attribute? Returns List"
},
"api/client/EchoHub.Client.UI.Chat.ChatLine.html": {
"href": "api/client/EchoHub.Client.UI.Chat.ChatLine.html",
"title": "Class ChatLine | EchoHub Documentation",
- "summary": "Class ChatLine Namespace EchoHub.Client.UI.Chat Assembly EchoHub.Client.dll A single line in the chat, composed of colored segments. public class ChatLine Inheritance object ChatLine Inherited Members object.GetType() object.MemberwiseClone() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors ChatLine(List) public ChatLine(List segments) Parameters segments List ChatLine(string) public ChatLine(string plainText) Parameters plainText string Properties AttachmentFileName public string? AttachmentFileName { get; set; } Property Value string AttachmentUrl public string? AttachmentUrl { get; set; } Property Value string IsMention public bool IsMention { get; set; } Property Value bool MessageId public Guid? MessageId { get; set; } Property Value Guid? Segments public List Segments { get; } Property Value List TextLength public int TextLength { get; } Property Value int Type public MessageType? Type { get; set; } Property Value MessageType? Methods FromColoredText(string, Attribute?) Parse a string containing printable color tags into colored segments. Format: {F:RRGGBB} (foreground), {B:RRGGBB} (background), {X} (reset). public static ChatLine FromColoredText(string text, Attribute? defaultAttr = null) Parameters text string defaultAttr Attribute? Returns ChatLine HasColorTags(string) Returns true if a line contains printable color tags. public static bool HasColorTags(string text) Parameters text string Returns bool StripColorTags(string) Remove all color tags from text, returning only the visible characters. public static string StripColorTags(string text) Parameters text string Returns string ToString() public override string ToString() Returns string Wrap(int, int) Wrap this line into multiple lines that fit within the given width. Continuation lines are indented with the specified number of spaces. public List Wrap(int width, int continuationIndent = 0) Parameters width int continuationIndent int Returns List"
+ "summary": "Class ChatLine Namespace EchoHub.Client.UI.Chat Assembly EchoHub.Client.dll A single line in the chat, composed of colored segments. public class ChatLine Inheritance object ChatLine Inherited Members object.GetType() object.MemberwiseClone() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors ChatLine(List) public ChatLine(List segments) Parameters segments List ChatLine(string) public ChatLine(string plainText) Parameters plainText string Properties AttachmentFileName public string? AttachmentFileName { get; set; } Property Value string AttachmentUrl public string? AttachmentUrl { get; set; } Property Value string ContinuationIndent Number of spaces to prepend on continuation lines when this line is word-wrapped. public int ContinuationIndent { get; set; } Property Value int IsMention public bool IsMention { get; set; } Property Value bool MessageId public Guid? MessageId { get; set; } Property Value Guid? Segments public List Segments { get; } Property Value List SenderUsername public string? SenderUsername { get; set; } Property Value string TextLength public int TextLength { get; } Property Value int Type public MessageType? Type { get; set; } Property Value MessageType? Methods FromColoredText(string, Attribute?) Parse a string containing printable color tags into colored segments. Format: {F:RRGGBB} (foreground), {B:RRGGBB} (background), {X} (reset). public static ChatLine FromColoredText(string text, Attribute? defaultAttr = null) Parameters text string defaultAttr Attribute? Returns ChatLine HasColorTags(string) Returns true if a line contains printable color tags. public static bool HasColorTags(string text) Parameters text string Returns bool StripColorTags(string) Remove all color tags from text, returning only the visible characters. public static string StripColorTags(string text) Parameters text string Returns string ToString() public override string ToString() Returns string Wrap(int, int) Wrap this line into multiple lines that fit within the given width. Continuation lines are indented with the specified number of spaces. public List Wrap(int width, int continuationIndent = 0) Parameters width int continuationIndent int Returns List"
},
"api/client/EchoHub.Client.UI.Chat.ChatListSource.html": {
"href": "api/client/EchoHub.Client.UI.Chat.ChatListSource.html",
@@ -237,7 +252,7 @@
"api/client/EchoHub.Client.UI.ListSources.UserListSource.html": {
"href": "api/client/EchoHub.Client.UI.ListSources.UserListSource.html",
"title": "Class UserListSource | EchoHub Documentation",
- "summary": "Class UserListSource Namespace EchoHub.Client.UI.ListSources Assembly EchoHub.Client.dll Custom list data source for the online users panel with per-user nickname colors. public class UserListSource : IListDataSource, IDisposable Inheritance object UserListSource Implements IListDataSource IDisposable Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors UserListSource() public UserListSource() Properties Count public int Count { get; } Property Value int MaxItemLength public int MaxItemLength { get; } Property Value int SuspendCollectionChangedEvent public bool SuspendCollectionChangedEvent { get; set; } Property Value bool Methods Dispose() public void Dispose() IsMarked(int) public bool IsMarked(int item) Parameters item int Returns bool Render(ListView, bool, int, int, int, int, int) public void Render(ListView listView, bool selected, int item, int col, int row, int width, int viewportX = 0) Parameters listView ListView selected bool item int col int row int width int viewportX int SetMark(int, bool) public void SetMark(int item, bool value) Parameters item int value bool ToList() public IList ToList() Returns IList Update(List<(string Text, Attribute? NameColor)>) public void Update(List<(string Text, Attribute? NameColor)> users) Parameters users List<(string Text, Attribute? NameColor)> Events CollectionChanged public event NotifyCollectionChangedEventHandler? CollectionChanged Event Type NotifyCollectionChangedEventHandler"
+ "summary": "Class UserListSource Namespace EchoHub.Client.UI.ListSources Assembly EchoHub.Client.dll Custom list data source for the online users panel with per-user nickname colors. public class UserListSource : IListDataSource, IDisposable Inheritance object UserListSource Implements IListDataSource IDisposable Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors UserListSource() public UserListSource() Properties Count public int Count { get; } Property Value int MaxItemLength public int MaxItemLength { get; } Property Value int SuspendCollectionChangedEvent public bool SuspendCollectionChangedEvent { get; set; } Property Value bool Methods Dispose() public void Dispose() GetUsername(int) public string? GetUsername(int index) Parameters index int Returns string IsMarked(int) public bool IsMarked(int item) Parameters item int Returns bool Render(ListView, bool, int, int, int, int, int) public void Render(ListView listView, bool selected, int item, int col, int row, int width, int viewportX = 0) Parameters listView ListView selected bool item int col int row int width int viewportX int SetMark(int, bool) public void SetMark(int item, bool value) Parameters item int value bool ToList() public IList ToList() Returns IList Update(List<(string Text, Attribute? NameColor, string Username)>) public void Update(List<(string Text, Attribute? NameColor, string Username)> users) Parameters users List<(string Text, Attribute? NameColor, string Username)> Events CollectionChanged public event NotifyCollectionChangedEventHandler? CollectionChanged Event Type NotifyCollectionChangedEventHandler"
},
"api/client/EchoHub.Client.UI.ListSources.html": {
"href": "api/client/EchoHub.Client.UI.ListSources.html",
@@ -247,7 +262,7 @@
"api/client/EchoHub.Client.UI.MainWindow.html": {
"href": "api/client/EchoHub.Client.UI.MainWindow.html",
"title": "Class MainWindow | EchoHub Documentation",
- "summary": "Class MainWindow Namespace EchoHub.Client.UI Assembly EchoHub.Client.dll Main Terminal.Gui window for the EchoHub chat client. public sealed class MainWindow : Runnable, IDisposable, IRunnable Inheritance object View Runnable MainWindow Implements IDisposable IRunnable Inherited Members Runnable.SetApp(IApplication) Runnable.SetIsRunning(bool) Runnable.RequestStop() Runnable.RaiseIsRunningChanging(bool, bool) Runnable.RaiseIsRunningChangedEvent(bool) Runnable.SetIsModal(bool) Runnable.RaiseIsModalChangedEvent(bool) Runnable.Result Runnable.IsRunning Runnable.IsModal Runnable.StopRequested Runnable.IsRunningChanging Runnable.IsRunningChanged Runnable.IsModalChanged View.NewMouseEvent(Mouse) View.RaiseMouseEvent(Mouse) View.GetAdornmentsThickness() View.GetSupportedCommands() View.InvokeCommands(Command[], IInputBinding) View.InvokeCommand(Command, IInputBinding) View.InvokeCommand(Command, ICommandContext) View.InvokeCommand(Command) View.SetContentSize(Size?) View.GetContentSize() View.GetWidthRequiredForSubViews() View.GetHeightRequiredForSubViews() View.ContentToScreen(in Point) View.ScreenToContent(in Point) View.ViewportToScreen(in Rectangle) View.ViewportToScreen(in Point) View.ViewportToScreen() View.ScreenToViewport(in Point) View.GetViewportOffsetFromFrame() View.ScrollVertical(int) View.ScrollHorizontal(int) View.Dispose() View.ToString() View.ToDebugString() View.BeginInit() View.EndInit() View.OnEnabledChanged() View.SetCursorNeedsUpdate() View.GetCurrentAttribute() View.GetAttributeForRole(VisualRole) View.SetAttribute(Attribute) View.SetAttributeForRole(VisualRole) View.GetClip() View.SetClip(Region) View.SetClipToScreen() View.ExcludeFromClip(Rectangle) View.ExcludeFromClip(Region) View.AddViewportToClip() View.Draw(DrawContext) View.DrawAdornments() View.ClearViewport(DrawContext) View.DrawText(DrawContext) View.DrawSubViews(DrawContext) View.RenderLineCanvas(DrawContext) View.Move(int, int) View.AddRune(Rune) View.AddRune(char) View.AddRune(int, int, Rune) View.AddStr(string) View.AddStr(int, int, string) View.DrawHotString(string, Attribute, Attribute) View.DrawHotString(string, bool) View.FillRect(Rectangle, Color?) View.FillRect(Rectangle, Rune) View.GetScheme() View.SetScheme(Scheme) View.GetSubViews(bool, bool, bool) View.Add(View) View.Add(params View[]) View.Remove(View) View.RemoveAll() View.RemoveAll() View.IsInHierarchy(View, View, bool) View.MoveSubViewTowardsEnd(View) View.MoveSubViewToEnd(View) View.MoveSubViewTowardsStart(View) View.MoveSubViewToStart(View) View.AddKeyBindingsForHotKey(Key, Key, object) View.AssignHotKeysToSubViews() View.NewKeyDownEvent(Key) View.Contains(in Point) View.FrameToScreen() View.ScreenToFrame(in Point) View.Layout(Size) View.Layout() View.SetRelativeLayout(Size) View.SetNeedsLayout() View.GetContainerSize() View.GetViewsUnderLocation(in Point, ViewportSettingsFlags) View.AdvanceFocus(NavigationDirection, TabBehavior?) View.FocusDeepest(NavigationDirection, TabBehavior?) View.OnCanFocusChanged() View.ClearFocus() View.SetFocus() View.SetNeedsDraw() View.SetNeedsDraw(Rectangle) View.OnTextChanged() View.MouseBindings View.MouseHoldRepeat View.MousePositionTracking View.MouseState View.MouseHighlightStates View.Margin View.ShadowStyle View.Border View.BorderStyle View.Padding View.Arrangement View.ContentSizeTracksViewport View.ViewportSettings View.Viewport View.Data View.Id View.App View.IsInitialized View.Enabled View.Visible View.Title View.Cursor View.Diagnostics View.LineCanvas View.SuperViewRendersLineCanvas View.SchemeName View.HasScheme View.SubViews View.SuperView View.HotKey View.HotKeySpecifier View.AssignHotKeys View.UsedHotKeys View.KeyBindings View.HotKeyBindings View.Frame View.X View.Y View.Height View.Width View.NeedsLayout View.ValidatePosDim View.CanFocus View.Focused View.IsCurrentTop View.MostFocused View.HasFocus View.TabStop View.NeedsDraw View.HorizontalScrollBar View.VerticalScrollBar View.PreserveTrailingSpaces View.Text View.TextAlignment View.TextDirection View.TextFormatter View.VerticalTextAlignment View.MouseEnter View.MouseLeave View.MouseHoldRepeatChanging View.MouseHoldRepeatChanged View.MouseEvent View.MouseStateChanged View.BorderStyleChanged View.CommandNotBound View.Accepting View.Accepted View.Activating View.HandlingHotKey View.ContentSizeChanging View.ContentSizeChanged View.ViewportChanged View.Disposing View.Initialized View.EnabledChanged View.VisibleChanging View.VisibleChanged View.TitleChanging View.TitleChanged View.GettingAttributeForRole View.ClearingViewport View.ClearedViewport View.DrawingText View.DrewText View.DrawingContent View.DrawingSubViews View.DrawComplete View.SchemeNameChanging View.SchemeNameChanged View.GettingScheme View.SchemeChanging View.SchemeChanged View.SuperViewChanging View.SuperViewChanged View.SubViewAdded View.SubViewRemoved View.Removed View.HotKeyChanged View.KeyDown View.KeyDownNotHandled View.FrameChanged View.HeightChanging View.HeightChanged View.WidthChanging View.WidthChanged View.SubViewLayout View.SubViewsLaidOut View.AdvancingFocus View.CanFocusChanged View.FocusedChanged View.HasFocusChanging View.HasFocusChanged View.TextChanged object.GetType() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors MainWindow(IApplication, ChatMessageManager) public MainWindow(IApplication app, ChatMessageManager messageManager) Parameters app IApplication messageManager ChatMessageManager Properties CurrentChannel Get the current channel name. public string CurrentChannel { get; } Property Value string Methods ApplyColorSchemes() Applies the currently registered color schemes to all views. Call after theme changes to refresh colors. public void ApplyColorSchemes() ClearAll() Clear all messages and channels (used on disconnect). public void ClearAll() EnsureChannelInList(string, bool?) Ensure a channel exists in the left panel list (used for private channels joined via /join). public void EnsureChannelInList(string channelName, bool? isPublic = null) Parameters channelName string isPublic bool? FocusInput() Focus the input field for typing. public void FocusInput() GetChannelNames() Get all channel names that have message buffers (for broadcasting status changes). public IReadOnlyList GetChannelNames() Returns IReadOnlyList RefreshMenuBar() Rebuilds and replaces the menu bar (e.g., after theme list changes). public void RefreshMenuBar() RemoveChannel(string) Remove a channel from the left panel list. public void RemoveChannel(string channelName) Parameters channelName string SetChannelTopic(string, string?) Update the topic for a specific channel. public void SetChannelTopic(string channelName, string? topic) Parameters channelName string topic string SetChannels(List) Set the list of available channels, storing topics, and refresh the channel list view. public void SetChannels(List channels) Parameters channels List SetCurrentUser(string) Set the current user name (delegates to message manager for @mention detection). public void SetCurrentUser(string username) Parameters username string ShowError(string) Show an error message to the user. public void ShowError(string message) Parameters message string SwitchToChannel(string) Switch the chat view to the given channel, resetting its unread count and updating the topic bar. public void SwitchToChannel(string channelName) Parameters channelName string ToggleUsersPanel() Toggle the online users panel visibility (F2). public void ToggleUsersPanel() UpdateOnlineUsers(List) Update the online users list display. public void UpdateOnlineUsers(List users) Parameters users List UpdateStatusBar(string) Update the connection status displayed in the status bar. public void UpdateStatusBar(string status) Parameters status string Events OnAudioPlayRequested Fired when the user activates (Enter/click) an audio message. Parameters: attachmentUrl, fileName. public event Action? OnAudioPlayRequested Event Type Action OnChannelSelected Fired when the user selects a channel. Parameter is the channel name. public event Action? OnChannelSelected Event Type Action OnConnectRequested Fired when the user requests to connect via the menu. public event Action? OnConnectRequested Event Type Action OnCreateChannelRequested Fired when the user requests to create a new channel. public event Action? OnCreateChannelRequested Event Type Action OnDeleteChannelRequested Fired when the user requests to delete the current channel. public event Action? OnDeleteChannelRequested Event Type Action OnDisconnectRequested Fired when the user requests to disconnect via the menu. public event Action? OnDisconnectRequested Event Type Action OnFileDownloadRequested Fired when the user activates (Enter/click) a file message. Parameters: attachmentUrl, fileName. public event Action? OnFileDownloadRequested Event Type Action OnLogoutRequested Fired when the user requests to logout (disconnect + revoke session). public event Action? OnLogoutRequested Event Type Action OnMessageSubmitted Fired when the user presses Enter in the input field. Parameters: channel name, message content. public event Action? OnMessageSubmitted Event Type Action OnProfileRequested Fired when the user requests to open their profile panel. public event Action? OnProfileRequested Event Type Action OnSavedServersRequested Fired when the user requests to view saved servers. public event Action? OnSavedServersRequested Event Type Action OnStatusRequested Fired when the user requests to set their status. public event Action? OnStatusRequested Event Type Action OnThemeSelected Fired when the user selects a theme from the menu. Parameter is the theme name. public event Action? OnThemeSelected Event Type Action"
+ "summary": "Class MainWindow Namespace EchoHub.Client.UI Assembly EchoHub.Client.dll Main Terminal.Gui window for the EchoHub chat client. public sealed class MainWindow : Runnable, IDisposable, IRunnable Inheritance object View Runnable MainWindow Implements IDisposable IRunnable Inherited Members Runnable.SetApp(IApplication) Runnable.SetIsRunning(bool) Runnable.RequestStop() Runnable.RaiseIsRunningChanging(bool, bool) Runnable.RaiseIsRunningChangedEvent(bool) Runnable.SetIsModal(bool) Runnable.RaiseIsModalChangedEvent(bool) Runnable.Result Runnable.IsRunning Runnable.IsModal Runnable.StopRequested Runnable.IsRunningChanging Runnable.IsRunningChanged Runnable.IsModalChanged View.NewMouseEvent(Mouse) View.RaiseMouseEvent(Mouse) View.GetAdornmentsThickness() View.GetSupportedCommands() View.InvokeCommands(Command[], IInputBinding) View.InvokeCommand(Command, IInputBinding) View.InvokeCommand(Command, ICommandContext) View.InvokeCommand(Command) View.SetContentSize(Size?) View.GetContentSize() View.GetWidthRequiredForSubViews() View.GetHeightRequiredForSubViews() View.ContentToScreen(in Point) View.ScreenToContent(in Point) View.ViewportToScreen(in Rectangle) View.ViewportToScreen(in Point) View.ViewportToScreen() View.ScreenToViewport(in Point) View.GetViewportOffsetFromFrame() View.ScrollVertical(int) View.ScrollHorizontal(int) View.Dispose() View.ToString() View.ToDebugString() View.BeginInit() View.EndInit() View.OnEnabledChanged() View.SetCursorNeedsUpdate() View.GetCurrentAttribute() View.GetAttributeForRole(VisualRole) View.SetAttribute(Attribute) View.SetAttributeForRole(VisualRole) View.GetClip() View.SetClip(Region) View.SetClipToScreen() View.ExcludeFromClip(Rectangle) View.ExcludeFromClip(Region) View.AddViewportToClip() View.Draw(DrawContext) View.DrawAdornments() View.ClearViewport(DrawContext) View.DrawText(DrawContext) View.DrawSubViews(DrawContext) View.RenderLineCanvas(DrawContext) View.Move(int, int) View.AddRune(Rune) View.AddRune(char) View.AddRune(int, int, Rune) View.AddStr(string) View.AddStr(int, int, string) View.DrawHotString(string, Attribute, Attribute) View.DrawHotString(string, bool) View.FillRect(Rectangle, Color?) View.FillRect(Rectangle, Rune) View.GetScheme() View.SetScheme(Scheme) View.GetSubViews(bool, bool, bool) View.Add(View) View.Add(params View[]) View.Remove(View) View.RemoveAll() View.RemoveAll() View.IsInHierarchy(View, View, bool) View.MoveSubViewTowardsEnd(View) View.MoveSubViewToEnd(View) View.MoveSubViewTowardsStart(View) View.MoveSubViewToStart(View) View.AddKeyBindingsForHotKey(Key, Key, object) View.AssignHotKeysToSubViews() View.NewKeyDownEvent(Key) View.Contains(in Point) View.FrameToScreen() View.ScreenToFrame(in Point) View.Layout(Size) View.Layout() View.SetRelativeLayout(Size) View.SetNeedsLayout() View.GetContainerSize() View.GetViewsUnderLocation(in Point, ViewportSettingsFlags) View.AdvanceFocus(NavigationDirection, TabBehavior?) View.FocusDeepest(NavigationDirection, TabBehavior?) View.OnCanFocusChanged() View.ClearFocus() View.SetFocus() View.SetNeedsDraw() View.SetNeedsDraw(Rectangle) View.OnTextChanged() View.MouseBindings View.MouseHoldRepeat View.MousePositionTracking View.MouseState View.MouseHighlightStates View.Margin View.ShadowStyle View.Border View.BorderStyle View.Padding View.Arrangement View.ContentSizeTracksViewport View.ViewportSettings View.Viewport View.Data View.Id View.App View.IsInitialized View.Enabled View.Visible View.Title View.Cursor View.Diagnostics View.LineCanvas View.SuperViewRendersLineCanvas View.SchemeName View.HasScheme View.SubViews View.SuperView View.HotKey View.HotKeySpecifier View.AssignHotKeys View.UsedHotKeys View.KeyBindings View.HotKeyBindings View.Frame View.X View.Y View.Height View.Width View.NeedsLayout View.ValidatePosDim View.CanFocus View.Focused View.IsCurrentTop View.MostFocused View.HasFocus View.TabStop View.NeedsDraw View.HorizontalScrollBar View.VerticalScrollBar View.PreserveTrailingSpaces View.Text View.TextAlignment View.TextDirection View.TextFormatter View.VerticalTextAlignment View.MouseEnter View.MouseLeave View.MouseHoldRepeatChanging View.MouseHoldRepeatChanged View.MouseEvent View.MouseStateChanged View.BorderStyleChanged View.CommandNotBound View.Accepting View.Accepted View.Activating View.HandlingHotKey View.ContentSizeChanging View.ContentSizeChanged View.ViewportChanged View.Disposing View.Initialized View.EnabledChanged View.VisibleChanging View.VisibleChanged View.TitleChanging View.TitleChanged View.GettingAttributeForRole View.ClearingViewport View.ClearedViewport View.DrawingText View.DrewText View.DrawingContent View.DrawingSubViews View.DrawComplete View.SchemeNameChanging View.SchemeNameChanged View.GettingScheme View.SchemeChanging View.SchemeChanged View.SuperViewChanging View.SuperViewChanged View.SubViewAdded View.SubViewRemoved View.Removed View.HotKeyChanged View.KeyDown View.KeyDownNotHandled View.FrameChanged View.HeightChanging View.HeightChanged View.WidthChanging View.WidthChanged View.SubViewLayout View.SubViewsLaidOut View.AdvancingFocus View.CanFocusChanged View.FocusedChanged View.HasFocusChanging View.HasFocusChanged View.TextChanged object.GetType() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors MainWindow(IApplication, ChatMessageManager) public MainWindow(IApplication app, ChatMessageManager messageManager) Parameters app IApplication messageManager ChatMessageManager Properties CurrentChannel Get the current channel name. public string CurrentChannel { get; } Property Value string Methods ApplyColorSchemes() Applies the currently registered color schemes to all views. Call after theme changes to refresh colors. public void ApplyColorSchemes() ClearAll() Clear all messages and channels (used on disconnect). public void ClearAll() EnsureChannelInList(string, bool?) Ensure a channel exists in the left panel list (used for private channels joined via /join). public void EnsureChannelInList(string channelName, bool? isPublic = null) Parameters channelName string isPublic bool? FocusInput() Focus the input field for typing. public void FocusInput() GetChannelNames() Get all channel names that have message buffers (for broadcasting status changes). public IReadOnlyList GetChannelNames() Returns IReadOnlyList RefreshMenuBar() Rebuilds and replaces the menu bar (e.g., after theme list changes). public void RefreshMenuBar() RemoveChannel(string) Remove a channel from the left panel list. public void RemoveChannel(string channelName) Parameters channelName string SetChannelTopic(string, string?) Update the topic for a specific channel. public void SetChannelTopic(string channelName, string? topic) Parameters channelName string topic string SetChannels(List) Set the list of available channels, storing topics, and refresh the channel list view. public void SetChannels(List channels) Parameters channels List SetCurrentUser(string) Set the current user name (delegates to message manager for @mention detection). public void SetCurrentUser(string username) Parameters username string ShowError(string) Show an error message to the user. public void ShowError(string message) Parameters message string SwitchToChannel(string) Switch the chat view to the given channel, resetting its unread count and updating the topic bar. public void SwitchToChannel(string channelName) Parameters channelName string ToggleUsersPanel() Toggle the online users panel visibility (F2). public void ToggleUsersPanel() UpdateOnlineUsers(List) Update the online users list display. public void UpdateOnlineUsers(List users) Parameters users List UpdateStatusBar(string) Update the connection status displayed in the status bar. public void UpdateStatusBar(string status) Parameters status string Events OnAudioPlayRequested Fired when the user activates (Enter/click) an audio message. Parameters: attachmentUrl, fileName. public event Action? OnAudioPlayRequested Event Type Action OnChannelJoinRequested Fired when the user activates a #channel reference in a message. Parameter is the channel name. public event Action? OnChannelJoinRequested Event Type Action OnChannelSelected Fired when the user selects a channel. Parameter is the channel name. public event Action? OnChannelSelected Event Type Action OnCheckForUpdatesRequested Fired when the user requests to check for updates. public event Action? OnCheckForUpdatesRequested Event Type Action OnConnectRequested Fired when the user requests to connect via the menu. public event Action? OnConnectRequested Event Type Action OnCreateChannelRequested Fired when the user requests to create a new channel. public event Action? OnCreateChannelRequested Event Type Action OnDeleteChannelRequested Fired when the user requests to delete the current channel. public event Action? OnDeleteChannelRequested Event Type Action OnDisconnectRequested Fired when the user requests to disconnect via the menu. public event Action? OnDisconnectRequested Event Type Action OnFileDownloadRequested Fired when the user activates (Enter/click) a file message. Parameters: attachmentUrl, fileName. public event Action? OnFileDownloadRequested Event Type Action OnLogoutRequested Fired when the user requests to logout (disconnect + revoke session). public event Action? OnLogoutRequested Event Type Action OnMessageSubmitted Fired when the user presses Enter in the input field. Parameters: channel name, message content. public event Action? OnMessageSubmitted Event Type Action OnProfileRequested Fired when the user requests to open their profile panel. public event Action? OnProfileRequested Event Type Action OnRollbackRequested Fired when the user requests to rollback to the previous version. public event Action? OnRollbackRequested Event Type Action OnSavedServersRequested Fired when the user requests to view saved servers. public event Action? OnSavedServersRequested Event Type Action OnStatusRequested Fired when the user requests to set their status. public event Action? OnStatusRequested Event Type Action OnThemeSelected Fired when the user selects a theme from the menu. Parameter is the theme name. public event Action? OnThemeSelected Event Type Action OnUserProfileRequested Fired when the user activates a username (in userlist or message). Parameter is the username. public event Action? OnUserProfileRequested Event Type Action"
},
"api/client/EchoHub.Client.UI.html": {
"href": "api/client/EchoHub.Client.UI.html",
@@ -292,27 +307,32 @@
"api/core/EchoHub.Core.Contracts.IChatBroadcaster.html": {
"href": "api/core/EchoHub.Core.Contracts.IChatBroadcaster.html",
"title": "Interface IChatBroadcaster | EchoHub Documentation",
- "summary": "Interface IChatBroadcaster Namespace EchoHub.Core.Contracts Assembly EchoHub.Core.dll public interface IChatBroadcaster Methods ForceDisconnectUserAsync(List, string) Task ForceDisconnectUserAsync(List connectionIds, string reason) Parameters connectionIds List reason string Returns Task SendChannelNukedAsync(string) Task SendChannelNukedAsync(string channelName) Parameters channelName string Returns Task SendChannelUpdatedAsync(ChannelDto, string?) Task SendChannelUpdatedAsync(ChannelDto channel, string? channelName = null) Parameters channel ChannelDto channelName string Returns Task SendErrorAsync(string, string) Task SendErrorAsync(string connectionId, string message) Parameters connectionId string message string Returns Task SendMessageDeletedAsync(string, Guid) Task SendMessageDeletedAsync(string channelName, Guid messageId) Parameters channelName string messageId Guid Returns Task SendMessageToChannelAsync(string, MessageDto) Task SendMessageToChannelAsync(string channelName, MessageDto message) Parameters channelName string message MessageDto Returns Task SendUserBannedAsync(string, string?) Task SendUserBannedAsync(string username, string? reason) Parameters username string reason string Returns Task SendUserJoinedAsync(string, string, string?) Task SendUserJoinedAsync(string channelName, string username, string? excludeConnectionId = null) Parameters channelName string username string excludeConnectionId string Returns Task SendUserKickedAsync(string, string, string?) Task SendUserKickedAsync(string channelName, string username, string? reason) Parameters channelName string username string reason string Returns Task SendUserLeftAsync(string, string) Task SendUserLeftAsync(string channelName, string username) Parameters channelName string username string Returns Task SendUserStatusChangedAsync(List, UserPresenceDto) Task SendUserStatusChangedAsync(List channelNames, UserPresenceDto presence) Parameters channelNames List presence UserPresenceDto Returns Task"
+ "summary": "Interface IChatBroadcaster Namespace EchoHub.Core.Contracts Assembly EchoHub.Core.dll public interface IChatBroadcaster Methods ForceDisconnectUserAsync(List, string) Task ForceDisconnectUserAsync(List connectionIds, string reason) Parameters connectionIds List reason string Returns Task SendChannelNukedAsync(string) Task SendChannelNukedAsync(string channelName) Parameters channelName string Returns Task SendChannelUpdatedAsync(ChannelDto, string?) Task SendChannelUpdatedAsync(ChannelDto channel, string? channelName = null) Parameters channel ChannelDto channelName string Returns Task SendErrorAsync(string, string) Task SendErrorAsync(string connectionId, string message) Parameters connectionId string message string Returns Task SendMessageDeletedAsync(string, Guid) Task SendMessageDeletedAsync(string channelName, Guid messageId) Parameters channelName string messageId Guid Returns Task SendMessageToChannelAsync(string, MessageDto) Task SendMessageToChannelAsync(string channelName, MessageDto message) Parameters channelName string message MessageDto Returns Task SendUserBannedAsync(string, string?) Task SendUserBannedAsync(string username, string? reason) Parameters username string reason string Returns Task SendUserJoinedAsync(string, string, UserPresenceDto?, string?) Task SendUserJoinedAsync(string channelName, string username, UserPresenceDto? presence, string? excludeConnectionId = null) Parameters channelName string username string presence UserPresenceDto excludeConnectionId string Returns Task SendUserKickedAsync(string, string, string?) Task SendUserKickedAsync(string channelName, string username, string? reason) Parameters channelName string username string reason string Returns Task SendUserLeftAsync(string, string) Task SendUserLeftAsync(string channelName, string username) Parameters channelName string username string Returns Task SendUserStatusChangedAsync(List, UserPresenceDto) Task SendUserStatusChangedAsync(List channelNames, UserPresenceDto presence) Parameters channelNames List presence UserPresenceDto Returns Task"
},
"api/core/EchoHub.Core.Contracts.IChatService.html": {
"href": "api/core/EchoHub.Core.Contracts.IChatService.html",
"title": "Interface IChatService | EchoHub Documentation",
- "summary": "Interface IChatService Namespace EchoHub.Core.Contracts Assembly EchoHub.Core.dll public interface IChatService Methods AuthenticateUserAsync(string, string) Task<(Guid UserId, string Username)?> AuthenticateUserAsync(string username, string password) Parameters username string password string Returns Task<(Guid UserId, string Username)?> BroadcastChannelUpdatedAsync(ChannelDto, string?) Task BroadcastChannelUpdatedAsync(ChannelDto channel, string? channelName = null) Parameters channel ChannelDto channelName string Returns Task BroadcastMessageAsync(string, MessageDto) Task BroadcastMessageAsync(string channelName, MessageDto message) Parameters channelName string message MessageDto Returns Task GetChannelHistoryAsync(string, int) Task> GetChannelHistoryAsync(string channelName, int count) Parameters channelName string count int Returns Task> GetChannelsForUserAsync(string) Task> GetChannelsForUserAsync(string username) Parameters username string Returns Task> GetOnlineUsersAsync(string) Task> GetOnlineUsersAsync(string channelName) Parameters channelName string Returns Task> GetUserProfileAsync(string) Task GetUserProfileAsync(string username) Parameters username string Returns Task JoinChannelAsync(string, Guid, string, string) Task<(List History, string? Error)> JoinChannelAsync(string connectionId, Guid userId, string username, string channelName) Parameters connectionId string userId Guid username string channelName string Returns Task<(List History, string Error)> LeaveChannelAsync(string, string, string) Task LeaveChannelAsync(string connectionId, string username, string channelName) Parameters connectionId string username string channelName string Returns Task SendMessageAsync(Guid, string, string, string) Task SendMessageAsync(Guid userId, string username, string channelName, string content) Parameters userId Guid username string channelName string content string Returns Task UpdateStatusAsync(Guid, string, UserStatus, string?) Task UpdateStatusAsync(Guid userId, string username, UserStatus status, string? statusMessage) Parameters userId Guid username string status UserStatus statusMessage string Returns Task UserConnectedAsync(string, Guid, string) Task UserConnectedAsync(string connectionId, Guid userId, string username) Parameters connectionId string userId Guid username string Returns Task UserDisconnectedAsync(string) Task UserDisconnectedAsync(string connectionId) Parameters connectionId string Returns Task"
+ "summary": "Interface IChatService Namespace EchoHub.Core.Contracts Assembly EchoHub.Core.dll public interface IChatService Methods BroadcastChannelUpdatedAsync(ChannelDto, string?) Task BroadcastChannelUpdatedAsync(ChannelDto channel, string? channelName = null) Parameters channel ChannelDto channelName string Returns Task BroadcastMessageAsync(string, MessageDto) Task BroadcastMessageAsync(string channelName, MessageDto message) Parameters channelName string message MessageDto Returns Task GetChannelHistoryAsync(string, int) Task> GetChannelHistoryAsync(string channelName, int count) Parameters channelName string count int Returns Task> GetChannelsForUserAsync(string) Task> GetChannelsForUserAsync(string username) Parameters username string Returns Task> GetOnlineUsersAsync(string) Task> GetOnlineUsersAsync(string channelName) Parameters channelName string Returns Task> JoinChannelAsync(string, Guid, string, string) Task<(List History, string? Error)> JoinChannelAsync(string connectionId, Guid userId, string username, string channelName) Parameters connectionId string userId Guid username string channelName string Returns Task<(List History, string Error)> LeaveChannelAsync(string, string, string) Task LeaveChannelAsync(string connectionId, string username, string channelName) Parameters connectionId string username string channelName string Returns Task SendMessageAsync(Guid, string, string, string) Task SendMessageAsync(Guid userId, string username, string channelName, string content) Parameters userId Guid username string channelName string content string Returns Task UpdateStatusAsync(Guid, string, UserStatus, string?) Task UpdateStatusAsync(Guid userId, string username, UserStatus status, string? statusMessage) Parameters userId Guid username string status UserStatus statusMessage string Returns Task UserConnectedAsync(string, Guid, string) Task UserConnectedAsync(string connectionId, Guid userId, string username) Parameters connectionId string userId Guid username string Returns Task UserDisconnectedAsync(string) Task UserDisconnectedAsync(string connectionId) Parameters connectionId string Returns Task"
},
"api/core/EchoHub.Core.Contracts.IEchoHubClient.html": {
"href": "api/core/EchoHub.Core.Contracts.IEchoHubClient.html",
"title": "Interface IEchoHubClient | EchoHub Documentation",
- "summary": "Interface IEchoHubClient Namespace EchoHub.Core.Contracts Assembly EchoHub.Core.dll Methods the server can invoke on connected clients. public interface IEchoHubClient Methods ChannelNuked(string) Task ChannelNuked(string channelName) Parameters channelName string Returns Task ChannelUpdated(ChannelDto) Task ChannelUpdated(ChannelDto channel) Parameters channel ChannelDto Returns Task Error(string) Task Error(string message) Parameters message string Returns Task ForceDisconnect(string) Task ForceDisconnect(string reason) Parameters reason string Returns Task MessageDeleted(string, Guid) Task MessageDeleted(string channelName, Guid messageId) Parameters channelName string messageId Guid Returns Task ReceiveMessage(MessageDto) Task ReceiveMessage(MessageDto message) Parameters message MessageDto Returns Task UserBanned(string, string?) Task UserBanned(string username, string? reason) Parameters username string reason string Returns Task UserJoined(string, string) Task UserJoined(string channelName, string username) Parameters channelName string username string Returns Task UserKicked(string, string, string?) Task UserKicked(string channelName, string username, string? reason) Parameters channelName string username string reason string Returns Task UserLeft(string, string) Task UserLeft(string channelName, string username) Parameters channelName string username string Returns Task UserStatusChanged(UserPresenceDto) Task UserStatusChanged(UserPresenceDto presence) Parameters presence UserPresenceDto Returns Task"
+ "summary": "Interface IEchoHubClient Namespace EchoHub.Core.Contracts Assembly EchoHub.Core.dll Methods the server can invoke on connected clients. public interface IEchoHubClient Methods ChannelNuked(string) Task ChannelNuked(string channelName) Parameters channelName string Returns Task ChannelUpdated(ChannelDto) Task ChannelUpdated(ChannelDto channel) Parameters channel ChannelDto Returns Task Error(string) Task Error(string message) Parameters message string Returns Task ForceDisconnect(string) Task ForceDisconnect(string reason) Parameters reason string Returns Task MessageDeleted(string, Guid) Task MessageDeleted(string channelName, Guid messageId) Parameters channelName string messageId Guid Returns Task ReceiveMessage(MessageDto) Task ReceiveMessage(MessageDto message) Parameters message MessageDto Returns Task UserBanned(string, string?) Task UserBanned(string username, string? reason) Parameters username string reason string Returns Task UserJoined(string, string, UserPresenceDto?) Task UserJoined(string channelName, string username, UserPresenceDto? presence) Parameters channelName string username string presence UserPresenceDto Returns Task UserKicked(string, string, string?) Task UserKicked(string channelName, string username, string? reason) Parameters channelName string username string reason string Returns Task UserLeft(string, string) Task UserLeft(string channelName, string username) Parameters channelName string username string Returns Task UserStatusChanged(UserPresenceDto) Task UserStatusChanged(UserPresenceDto presence) Parameters presence UserPresenceDto Returns Task"
},
"api/core/EchoHub.Core.Contracts.IMessageEncryptionService.html": {
"href": "api/core/EchoHub.Core.Contracts.IMessageEncryptionService.html",
"title": "Interface IMessageEncryptionService | EchoHub Documentation",
"summary": "Interface IMessageEncryptionService Namespace EchoHub.Core.Contracts Assembly EchoHub.Core.dll public interface IMessageEncryptionService Properties EncryptDatabaseEnabled Whether database content should be encrypted at rest (server setting). bool EncryptDatabaseEnabled { get; } Property Value bool Methods Decrypt(string) string Decrypt(string content) Parameters content string Returns string DecryptNullable(string?) string? DecryptNullable(string? value) Parameters value string Returns string Encrypt(string) string Encrypt(string plaintext) Parameters plaintext string Returns string EncryptNullable(string?) string? EncryptNullable(string? value) Parameters value string Returns string"
},
+ "api/core/EchoHub.Core.Contracts.IUserService.html": {
+ "href": "api/core/EchoHub.Core.Contracts.IUserService.html",
+ "title": "Interface IUserService | EchoHub Documentation",
+ "summary": "Interface IUserService Namespace EchoHub.Core.Contracts Assembly EchoHub.Core.dll public interface IUserService Methods AuthenticateUserAsync(string, string) Task AuthenticateUserAsync(string username, string password) Parameters username string password string Returns Task GetUserByIdAsync(Guid) Task GetUserByIdAsync(Guid userId) Parameters userId Guid Returns Task GetUserProfileAsync(string) Task GetUserProfileAsync(string username) Parameters username string Returns Task RegisterUserAsync(string, string, string?) Task RegisterUserAsync(string username, string password, string? displayName = null) Parameters username string password string displayName string Returns Task SetAvatarAsync(Guid, string) Task SetAvatarAsync(Guid userId, string asciiArt) Parameters userId Guid asciiArt string Returns Task UpdateProfileAsync(Guid, string?, string?, string?) Task UpdateProfileAsync(Guid userId, string? displayName, string? bio, string? nicknameColor) Parameters userId Guid displayName string bio string nicknameColor string Returns Task"
+ },
"api/core/EchoHub.Core.Contracts.html": {
"href": "api/core/EchoHub.Core.Contracts.html",
"title": "Namespace EchoHub.Core.Contracts | EchoHub Documentation",
- "summary": "Namespace EchoHub.Core.Contracts Classes ChannelListItem Interfaces IChannelService IChatBroadcaster IChatService IEchoHubClient Methods the server can invoke on connected clients. IMessageEncryptionService"
+ "summary": "Namespace EchoHub.Core.Contracts Classes ChannelListItem Interfaces IChannelService IChatBroadcaster IChatService IEchoHubClient Methods the server can invoke on connected clients. IMessageEncryptionService IUserService"
},
"api/core/EchoHub.Core.DTOs.ApiResponse-1.html": {
"href": "api/core/EchoHub.Core.DTOs.ApiResponse-1.html",
@@ -362,7 +382,7 @@
"api/core/EchoHub.Core.DTOs.EmbedDto.html": {
"href": "api/core/EchoHub.Core.DTOs.EmbedDto.html",
"title": "Class EmbedDto | EchoHub Documentation",
- "summary": "Class EmbedDto Namespace EchoHub.Core.DTOs Assembly EchoHub.Core.dll public record EmbedDto : IEquatable Inheritance object EmbedDto Implements IEquatable Inherited Members object.GetType() object.MemberwiseClone() object.Equals(object, object) object.ReferenceEquals(object, object) Constructors EmbedDto(EmbedDto) protected EmbedDto(EmbedDto original) Parameters original EmbedDto EmbedDto(string?, string?, string?, string?, string) public EmbedDto(string? SiteName, string? Title, string? Description, string? ImageAscii, string Url) Parameters SiteName string Title string Description string ImageAscii string Url string Properties Description public string? Description { get; init; } Property Value string EqualityContract protected virtual Type EqualityContract { get; } Property Value Type ImageAscii public string? ImageAscii { get; init; } Property Value string SiteName public string? SiteName { get; init; } Property Value string Title public string? Title { get; init; } Property Value string Url public string Url { get; init; } Property Value string Methods Deconstruct(out string?, out string?, out string?, out string?, out string) public void Deconstruct(out string? SiteName, out string? Title, out string? Description, out string? ImageAscii, out string Url) Parameters SiteName string Title string Description string ImageAscii string Url string Equals(EmbedDto?) public virtual bool Equals(EmbedDto? other) Parameters other EmbedDto Returns bool Equals(object?) public override bool Equals(object? obj) Parameters obj object Returns bool GetHashCode() public override int GetHashCode() Returns int PrintMembers(StringBuilder) protected virtual bool PrintMembers(StringBuilder builder) Parameters builder StringBuilder Returns bool ToString() public override string ToString() Returns string Operators operator ==(EmbedDto?, EmbedDto?) public static bool operator ==(EmbedDto? left, EmbedDto? right) Parameters left EmbedDto right EmbedDto Returns bool operator !=(EmbedDto?, EmbedDto?) public static bool operator !=(EmbedDto? left, EmbedDto? right) Parameters left EmbedDto right EmbedDto Returns bool"
+ "summary": "Class EmbedDto Namespace EchoHub.Core.DTOs Assembly EchoHub.Core.dll public record EmbedDto : IEquatable Inheritance object EmbedDto Implements IEquatable Inherited Members object.GetType() object.MemberwiseClone() object.Equals(object, object) object.ReferenceEquals(object, object) Constructors EmbedDto(EmbedDto) protected EmbedDto(EmbedDto original) Parameters original EmbedDto EmbedDto(string?, string?, string?, string?, string, string?) public EmbedDto(string? SiteName, string? Title, string? Description, string? ImageAscii, string Url, string? ThemeColor = null) Parameters SiteName string Title string Description string ImageAscii string Url string ThemeColor string Properties Description public string? Description { get; init; } Property Value string EqualityContract protected virtual Type EqualityContract { get; } Property Value Type ImageAscii public string? ImageAscii { get; init; } Property Value string SiteName public string? SiteName { get; init; } Property Value string ThemeColor public string? ThemeColor { get; init; } Property Value string Title public string? Title { get; init; } Property Value string Url public string Url { get; init; } Property Value string Methods Deconstruct(out string?, out string?, out string?, out string?, out string, out string?) public void Deconstruct(out string? SiteName, out string? Title, out string? Description, out string? ImageAscii, out string Url, out string? ThemeColor) Parameters SiteName string Title string Description string ImageAscii string Url string ThemeColor string Equals(EmbedDto?) public virtual bool Equals(EmbedDto? other) Parameters other EmbedDto Returns bool Equals(object?) public override bool Equals(object? obj) Parameters obj object Returns bool GetHashCode() public override int GetHashCode() Returns int PrintMembers(StringBuilder) protected virtual bool PrintMembers(StringBuilder builder) Parameters builder StringBuilder Returns bool ToString() public override string ToString() Returns string Operators operator ==(EmbedDto?, EmbedDto?) public static bool operator ==(EmbedDto? left, EmbedDto? right) Parameters left EmbedDto right EmbedDto Returns bool operator !=(EmbedDto?, EmbedDto?) public static bool operator !=(EmbedDto? left, EmbedDto? right) Parameters left EmbedDto right EmbedDto Returns bool"
},
"api/core/EchoHub.Core.DTOs.EncryptionKeyResponse.html": {
"href": "api/core/EchoHub.Core.DTOs.EncryptionKeyResponse.html",
@@ -374,6 +394,11 @@
"title": "Class ErrorResponse | EchoHub Documentation",
"summary": "Class ErrorResponse Namespace EchoHub.Core.DTOs Assembly EchoHub.Core.dll public record ErrorResponse : IEquatable Inheritance object ErrorResponse Implements IEquatable Inherited Members object.GetType() object.MemberwiseClone() object.Equals(object, object) object.ReferenceEquals(object, object) Constructors ErrorResponse(ErrorResponse) protected ErrorResponse(ErrorResponse original) Parameters original ErrorResponse ErrorResponse(string, string?) public ErrorResponse(string Error, string? Detail = null) Parameters Error string Detail string Properties Detail public string? Detail { get; init; } Property Value string EqualityContract protected virtual Type EqualityContract { get; } Property Value Type Error public string Error { get; init; } Property Value string Methods Deconstruct(out string, out string?) public void Deconstruct(out string Error, out string? Detail) Parameters Error string Detail string Equals(ErrorResponse?) public virtual bool Equals(ErrorResponse? other) Parameters other ErrorResponse Returns bool Equals(object?) public override bool Equals(object? obj) Parameters obj object Returns bool GetHashCode() public override int GetHashCode() Returns int PrintMembers(StringBuilder) protected virtual bool PrintMembers(StringBuilder builder) Parameters builder StringBuilder Returns bool ToString() public override string ToString() Returns string Operators operator ==(ErrorResponse?, ErrorResponse?) public static bool operator ==(ErrorResponse? left, ErrorResponse? right) Parameters left ErrorResponse right ErrorResponse Returns bool operator !=(ErrorResponse?, ErrorResponse?) public static bool operator !=(ErrorResponse? left, ErrorResponse? right) Parameters left ErrorResponse right ErrorResponse Returns bool"
},
+ "api/core/EchoHub.Core.DTOs.JoinChannelResult.html": {
+ "href": "api/core/EchoHub.Core.DTOs.JoinChannelResult.html",
+ "title": "Class JoinChannelResult | EchoHub Documentation",
+ "summary": "Class JoinChannelResult Namespace EchoHub.Core.DTOs Assembly EchoHub.Core.dll public record JoinChannelResult : IEquatable Inheritance object JoinChannelResult Implements IEquatable Inherited Members object.GetType() object.MemberwiseClone() object.Equals(object, object) object.ReferenceEquals(object, object) Constructors JoinChannelResult(JoinChannelResult) protected JoinChannelResult(JoinChannelResult original) Parameters original JoinChannelResult JoinChannelResult(bool, List, string?) public JoinChannelResult(bool Success, List History, string? Error = null) Parameters Success bool History List Error string Properties EqualityContract protected virtual Type EqualityContract { get; } Property Value Type Error public string? Error { get; init; } Property Value string History public List History { get; init; } Property Value List Success public bool Success { get; init; } Property Value bool Methods Deconstruct(out bool, out List, out string?) public void Deconstruct(out bool Success, out List History, out string? Error) Parameters Success bool History List Error string Equals(JoinChannelResult?) public virtual bool Equals(JoinChannelResult? other) Parameters other JoinChannelResult Returns bool Equals(object?) public override bool Equals(object? obj) Parameters obj object Returns bool GetHashCode() public override int GetHashCode() Returns int PrintMembers(StringBuilder) protected virtual bool PrintMembers(StringBuilder builder) Parameters builder StringBuilder Returns bool ToString() public override string ToString() Returns string Operators operator ==(JoinChannelResult?, JoinChannelResult?) public static bool operator ==(JoinChannelResult? left, JoinChannelResult? right) Parameters left JoinChannelResult right JoinChannelResult Returns bool operator !=(JoinChannelResult?, JoinChannelResult?) public static bool operator !=(JoinChannelResult? left, JoinChannelResult? right) Parameters left JoinChannelResult right JoinChannelResult Returns bool"
+ },
"api/core/EchoHub.Core.DTOs.KickRequest.html": {
"href": "api/core/EchoHub.Core.DTOs.KickRequest.html",
"title": "Class KickRequest | EchoHub Documentation",
@@ -449,6 +474,16 @@
"title": "Class UserDto | EchoHub Documentation",
"summary": "Class UserDto Namespace EchoHub.Core.DTOs Assembly EchoHub.Core.dll public record UserDto : IEquatable Inheritance object UserDto Implements IEquatable Inherited Members object.GetType() object.MemberwiseClone() object.Equals(object, object) object.ReferenceEquals(object, object) Constructors UserDto(UserDto) protected UserDto(UserDto original) Parameters original UserDto UserDto(Guid, string, string?, string?, UserStatus, DateTimeOffset) public UserDto(Guid Id, string Username, string? DisplayName, string? NicknameColor, UserStatus Status, DateTimeOffset LastSeenAt) Parameters Id Guid Username string DisplayName string NicknameColor string Status UserStatus LastSeenAt DateTimeOffset Properties DisplayName public string? DisplayName { get; init; } Property Value string EqualityContract protected virtual Type EqualityContract { get; } Property Value Type Id public Guid Id { get; init; } Property Value Guid LastSeenAt public DateTimeOffset LastSeenAt { get; init; } Property Value DateTimeOffset NicknameColor public string? NicknameColor { get; init; } Property Value string Status public UserStatus Status { get; init; } Property Value UserStatus Username public string Username { get; init; } Property Value string Methods Deconstruct(out Guid, out string, out string?, out string?, out UserStatus, out DateTimeOffset) public void Deconstruct(out Guid Id, out string Username, out string? DisplayName, out string? NicknameColor, out UserStatus Status, out DateTimeOffset LastSeenAt) Parameters Id Guid Username string DisplayName string NicknameColor string Status UserStatus LastSeenAt DateTimeOffset Equals(UserDto?) public virtual bool Equals(UserDto? other) Parameters other UserDto Returns bool Equals(object?) public override bool Equals(object? obj) Parameters obj object Returns bool GetHashCode() public override int GetHashCode() Returns int PrintMembers(StringBuilder) protected virtual bool PrintMembers(StringBuilder builder) Parameters builder StringBuilder Returns bool ToString() public override string ToString() Returns string Operators operator ==(UserDto?, UserDto?) public static bool operator ==(UserDto? left, UserDto? right) Parameters left UserDto right UserDto Returns bool operator !=(UserDto?, UserDto?) public static bool operator !=(UserDto? left, UserDto? right) Parameters left UserDto right UserDto Returns bool"
},
+ "api/core/EchoHub.Core.DTOs.UserError.html": {
+ "href": "api/core/EchoHub.Core.DTOs.UserError.html",
+ "title": "Enum UserError | EchoHub Documentation",
+ "summary": "Enum UserError Namespace EchoHub.Core.DTOs Assembly EchoHub.Core.dll public enum UserError Fields AlreadyExists = 1 Banned = 4 InvalidCredentials = 3 NotFound = 2 ValidationFailed = 0"
+ },
+ "api/core/EchoHub.Core.DTOs.UserOperationResult.html": {
+ "href": "api/core/EchoHub.Core.DTOs.UserOperationResult.html",
+ "title": "Class UserOperationResult | EchoHub Documentation",
+ "summary": "Class UserOperationResult Namespace EchoHub.Core.DTOs Assembly EchoHub.Core.dll public record UserOperationResult : IEquatable Inheritance object UserOperationResult Implements IEquatable Inherited Members object.GetType() object.MemberwiseClone() object.Equals(object, object) object.ReferenceEquals(object, object) Constructors UserOperationResult(UserOperationResult) protected UserOperationResult(UserOperationResult original) Parameters original UserOperationResult UserOperationResult(UserProfileDto?, UserError?, string?) public UserOperationResult(UserProfileDto? User, UserError? Error, string? ErrorMessage) Parameters User UserProfileDto Error UserError? ErrorMessage string Properties EqualityContract protected virtual Type EqualityContract { get; } Property Value Type Error public UserError? Error { get; init; } Property Value UserError? ErrorMessage public string? ErrorMessage { get; init; } Property Value string IsSuccess public bool IsSuccess { get; } Property Value bool User public UserProfileDto? User { get; init; } Property Value UserProfileDto Methods Deconstruct(out UserProfileDto?, out UserError?, out string?) public void Deconstruct(out UserProfileDto? User, out UserError? Error, out string? ErrorMessage) Parameters User UserProfileDto Error UserError? ErrorMessage string Equals(UserOperationResult?) public virtual bool Equals(UserOperationResult? other) Parameters other UserOperationResult Returns bool Equals(object?) public override bool Equals(object? obj) Parameters obj object Returns bool Fail(UserError, string) public static UserOperationResult Fail(UserError error, string message) Parameters error UserError message string Returns UserOperationResult GetHashCode() public override int GetHashCode() Returns int PrintMembers(StringBuilder) protected virtual bool PrintMembers(StringBuilder builder) Parameters builder StringBuilder Returns bool Success(UserProfileDto) public static UserOperationResult Success(UserProfileDto user) Parameters user UserProfileDto Returns UserOperationResult ToString() public override string ToString() Returns string Operators operator ==(UserOperationResult?, UserOperationResult?) public static bool operator ==(UserOperationResult? left, UserOperationResult? right) Parameters left UserOperationResult right UserOperationResult Returns bool operator !=(UserOperationResult?, UserOperationResult?) public static bool operator !=(UserOperationResult? left, UserOperationResult? right) Parameters left UserOperationResult right UserOperationResult Returns bool"
+ },
"api/core/EchoHub.Core.DTOs.UserPresenceDto.html": {
"href": "api/core/EchoHub.Core.DTOs.UserPresenceDto.html",
"title": "Class UserPresenceDto | EchoHub Documentation",
@@ -462,7 +497,7 @@
"api/core/EchoHub.Core.DTOs.html": {
"href": "api/core/EchoHub.Core.DTOs.html",
"title": "Namespace EchoHub.Core.DTOs | EchoHub Documentation",
- "summary": "Namespace EchoHub.Core.DTOs Classes ApiResponse ApiResponse AssignRoleRequest AvatarUploadResponse BanRequest ChannelDto ChannelOperationResult CreateChannelRequest EmbedDto EncryptionKeyResponse ErrorResponse KickRequest LoginRequest LoginResponse MessageDto MuteRequest PaginatedResponse RefreshRequest RegisterRequest SendMessageRequest SendUrlRequest ServerStatusDto UpdateProfileRequest UpdateStatusRequest UpdateTopicRequest UserDto UserPresenceDto UserProfileDto Enums ChannelError"
+ "summary": "Namespace EchoHub.Core.DTOs Classes ApiResponse ApiResponse AssignRoleRequest AvatarUploadResponse BanRequest ChannelDto ChannelOperationResult CreateChannelRequest EmbedDto EncryptionKeyResponse ErrorResponse JoinChannelResult KickRequest LoginRequest LoginResponse MessageDto MuteRequest PaginatedResponse RefreshRequest RegisterRequest SendMessageRequest SendUrlRequest ServerStatusDto UpdateProfileRequest UpdateStatusRequest UpdateTopicRequest UserDto UserOperationResult UserPresenceDto UserProfileDto Enums ChannelError UserError"
},
"api/core/EchoHub.Core.Models.Channel.html": {
"href": "api/core/EchoHub.Core.Models.Channel.html",
@@ -522,7 +557,7 @@
"api/server-irc/EchoHub.Server.Irc.IrcBroadcaster.html": {
"href": "api/server-irc/EchoHub.Server.Irc.IrcBroadcaster.html",
"title": "Class IrcBroadcaster | EchoHub Documentation",
- "summary": "Class IrcBroadcaster Namespace EchoHub.Server.Irc Assembly EchoHub.Server.Irc.dll public class IrcBroadcaster : IChatBroadcaster Inheritance object IrcBroadcaster Implements IChatBroadcaster Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors IrcBroadcaster(IrcGatewayService, IMessageEncryptionService) public IrcBroadcaster(IrcGatewayService gateway, IMessageEncryptionService encryption) Parameters gateway IrcGatewayService encryption IMessageEncryptionService Methods ForceDisconnectUserAsync(List, string) public Task ForceDisconnectUserAsync(List connectionIds, string reason) Parameters connectionIds List reason string Returns Task SendChannelNukedAsync(string) public Task SendChannelNukedAsync(string channelName) Parameters channelName string Returns Task SendChannelUpdatedAsync(ChannelDto, string?) public Task SendChannelUpdatedAsync(ChannelDto channel, string? channelName = null) Parameters channel ChannelDto channelName string Returns Task SendErrorAsync(string, string) public Task SendErrorAsync(string connectionId, string message) Parameters connectionId string message string Returns Task SendMessageDeletedAsync(string, Guid) public Task SendMessageDeletedAsync(string channelName, Guid messageId) Parameters channelName string messageId Guid Returns Task SendMessageToChannelAsync(string, MessageDto) public Task SendMessageToChannelAsync(string channelName, MessageDto message) Parameters channelName string message MessageDto Returns Task SendUserBannedAsync(string, string?) public Task SendUserBannedAsync(string username, string? reason) Parameters username string reason string Returns Task SendUserJoinedAsync(string, string, string?) public Task SendUserJoinedAsync(string channelName, string username, string? excludeConnectionId = null) Parameters channelName string username string excludeConnectionId string Returns Task SendUserKickedAsync(string, string, string?) public Task SendUserKickedAsync(string channelName, string username, string? reason) Parameters channelName string username string reason string Returns Task SendUserLeftAsync(string, string) public Task SendUserLeftAsync(string channelName, string username) Parameters channelName string username string Returns Task SendUserStatusChangedAsync(List, UserPresenceDto) public Task SendUserStatusChangedAsync(List channelNames, UserPresenceDto presence) Parameters channelNames List presence UserPresenceDto Returns Task"
+ "summary": "Class IrcBroadcaster Namespace EchoHub.Server.Irc Assembly EchoHub.Server.Irc.dll public class IrcBroadcaster : IChatBroadcaster Inheritance object IrcBroadcaster Implements IChatBroadcaster Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors IrcBroadcaster(IrcGatewayService, IMessageEncryptionService) public IrcBroadcaster(IrcGatewayService gateway, IMessageEncryptionService encryption) Parameters gateway IrcGatewayService encryption IMessageEncryptionService Methods ForceDisconnectUserAsync(List, string) public Task ForceDisconnectUserAsync(List connectionIds, string reason) Parameters connectionIds List reason string Returns Task SendChannelNukedAsync(string) public Task SendChannelNukedAsync(string channelName) Parameters channelName string Returns Task SendChannelUpdatedAsync(ChannelDto, string?) public Task SendChannelUpdatedAsync(ChannelDto channel, string? channelName = null) Parameters channel ChannelDto channelName string Returns Task SendErrorAsync(string, string) public Task SendErrorAsync(string connectionId, string message) Parameters connectionId string message string Returns Task SendMessageDeletedAsync(string, Guid) public Task SendMessageDeletedAsync(string channelName, Guid messageId) Parameters channelName string messageId Guid Returns Task SendMessageToChannelAsync(string, MessageDto) public Task SendMessageToChannelAsync(string channelName, MessageDto message) Parameters channelName string message MessageDto Returns Task SendUserBannedAsync(string, string?) public Task SendUserBannedAsync(string username, string? reason) Parameters username string reason string Returns Task SendUserJoinedAsync(string, string, UserPresenceDto?, string?) public Task SendUserJoinedAsync(string channelName, string username, UserPresenceDto? presence, string? excludeConnectionId = null) Parameters channelName string username string presence UserPresenceDto excludeConnectionId string Returns Task SendUserKickedAsync(string, string, string?) public Task SendUserKickedAsync(string channelName, string username, string? reason) Parameters channelName string username string reason string Returns Task SendUserLeftAsync(string, string) public Task SendUserLeftAsync(string channelName, string username) Parameters channelName string username string Returns Task SendUserStatusChangedAsync(List, UserPresenceDto) public Task SendUserStatusChangedAsync(List channelNames, UserPresenceDto presence) Parameters channelNames List presence UserPresenceDto Returns Task"
},
"api/server-irc/EchoHub.Server.Irc.IrcClientConnection.html": {
"href": "api/server-irc/EchoHub.Server.Irc.IrcClientConnection.html",
@@ -532,7 +567,7 @@
"api/server-irc/EchoHub.Server.Irc.IrcCommandHandler.html": {
"href": "api/server-irc/EchoHub.Server.Irc.IrcCommandHandler.html",
"title": "Class IrcCommandHandler | EchoHub Documentation",
- "summary": "Class IrcCommandHandler Namespace EchoHub.Server.Irc Assembly EchoHub.Server.Irc.dll public sealed class IrcCommandHandler Inheritance object IrcCommandHandler Inherited Members object.GetType() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors IrcCommandHandler(IrcClientConnection, IrcOptions, IChatService, IChannelService, IMessageEncryptionService, ILogger) public IrcCommandHandler(IrcClientConnection conn, IrcOptions options, IChatService chatService, IChannelService channelService, IMessageEncryptionService encryption, ILogger logger) Parameters conn IrcClientConnection options IrcOptions chatService IChatService channelService IChannelService encryption IMessageEncryptionService logger ILogger Methods RunAsync(CancellationToken) public Task RunAsync(CancellationToken ct) Parameters ct CancellationToken Returns Task"
+ "summary": "Class IrcCommandHandler Namespace EchoHub.Server.Irc Assembly EchoHub.Server.Irc.dll public sealed class IrcCommandHandler Inheritance object IrcCommandHandler Inherited Members object.GetType() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors IrcCommandHandler(IrcClientConnection, IrcOptions, IChatService, IUserService, IChannelService, IMessageEncryptionService, ILogger) public IrcCommandHandler(IrcClientConnection conn, IrcOptions options, IChatService chatService, IUserService userService, IChannelService channelService, IMessageEncryptionService encryption, ILogger logger) Parameters conn IrcClientConnection options IrcOptions chatService IChatService userService IUserService channelService IChannelService encryption IMessageEncryptionService logger ILogger Methods RunAsync(CancellationToken) public Task RunAsync(CancellationToken ct) Parameters ct CancellationToken Returns Task"
},
"api/server-irc/EchoHub.Server.Irc.IrcGatewayService.html": {
"href": "api/server-irc/EchoHub.Server.Irc.IrcGatewayService.html",
@@ -572,7 +607,7 @@
"api/server/EchoHub.Server.Auth.JwtTokenService.html": {
"href": "api/server/EchoHub.Server.Auth.JwtTokenService.html",
"title": "Class JwtTokenService | EchoHub Documentation",
- "summary": "Class JwtTokenService Namespace EchoHub.Server.Auth Assembly EchoHub.Server.dll public class JwtTokenService Inheritance object JwtTokenService Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors JwtTokenService(IConfiguration) public JwtTokenService(IConfiguration configuration) Parameters configuration IConfiguration Fields RefreshTokenLifetime public static readonly TimeSpan RefreshTokenLifetime Field Value TimeSpan Methods GenerateAccessToken(User) public (string Token, DateTimeOffset ExpiresAt) GenerateAccessToken(User user) Parameters user User Returns (string Token, DateTimeOffset ExpiresAt) GenerateRefreshToken() public static string GenerateRefreshToken() Returns string HashToken(string) public static string HashToken(string token) Parameters token string Returns string"
+ "summary": "Class JwtTokenService Namespace EchoHub.Server.Auth Assembly EchoHub.Server.dll public class JwtTokenService Inheritance object JwtTokenService Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors JwtTokenService(IConfiguration) public JwtTokenService(IConfiguration configuration) Parameters configuration IConfiguration Fields RefreshTokenLifetime public static readonly TimeSpan RefreshTokenLifetime Field Value TimeSpan Methods GenerateAccessToken(UserProfileDto) public (string Token, DateTimeOffset ExpiresAt) GenerateAccessToken(UserProfileDto profile) Parameters profile UserProfileDto Returns (string Token, DateTimeOffset ExpiresAt) GenerateAccessToken(User) public (string Token, DateTimeOffset ExpiresAt) GenerateAccessToken(User user) Parameters user User Returns (string Token, DateTimeOffset ExpiresAt) GenerateRefreshToken() public static string GenerateRefreshToken() Returns string HashToken(string) public static string HashToken(string token) Parameters token string Returns string"
},
"api/server/EchoHub.Server.Auth.html": {
"href": "api/server/EchoHub.Server.Auth.html",
@@ -582,7 +617,7 @@
"api/server/EchoHub.Server.Controllers.AuthController.html": {
"href": "api/server/EchoHub.Server.Controllers.AuthController.html",
"title": "Class AuthController | EchoHub Documentation",
- "summary": "Class AuthController Namespace EchoHub.Server.Controllers Assembly EchoHub.Server.dll [ApiController] [Route(\"api/auth\")] [EnableRateLimiting(\"auth\")] public class AuthController : ControllerBase Inheritance object ControllerBase AuthController Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors AuthController(EchoHubDbContext, JwtTokenService) public AuthController(EchoHubDbContext db, JwtTokenService jwt) Parameters db EchoHubDbContext jwt JwtTokenService Methods Login(LoginRequest) [HttpPost(\"login\")] public Task Login(LoginRequest request) Parameters request LoginRequest Returns Task Logout(RefreshRequest) [HttpPost(\"logout\")] public Task Logout(RefreshRequest request) Parameters request RefreshRequest Returns Task Refresh(RefreshRequest) [HttpPost(\"refresh\")] public Task Refresh(RefreshRequest request) Parameters request RefreshRequest Returns Task Register(RegisterRequest) [HttpPost(\"register\")] public Task Register(RegisterRequest request) Parameters request RegisterRequest Returns Task"
+ "summary": "Class AuthController Namespace EchoHub.Server.Controllers Assembly EchoHub.Server.dll [ApiController] [Route(\"api/auth\")] [EnableRateLimiting(\"auth\")] public class AuthController : ControllerBase Inheritance object ControllerBase AuthController Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors AuthController(EchoHubDbContext, JwtTokenService, IUserService) public AuthController(EchoHubDbContext db, JwtTokenService jwt, IUserService userService) Parameters db EchoHubDbContext jwt JwtTokenService userService IUserService Methods Login(LoginRequest) [HttpPost(\"login\")] public Task Login(LoginRequest request) Parameters request LoginRequest Returns Task Logout(RefreshRequest) [HttpPost(\"logout\")] public Task Logout(RefreshRequest request) Parameters request RefreshRequest Returns Task Refresh(RefreshRequest) [HttpPost(\"refresh\")] public Task Refresh(RefreshRequest request) Parameters request RefreshRequest Returns Task Register(RegisterRequest) [HttpPost(\"register\")] public Task Register(RegisterRequest request) Parameters request RegisterRequest Returns Task"
},
"api/server/EchoHub.Server.Controllers.ChannelsController.html": {
"href": "api/server/EchoHub.Server.Controllers.ChannelsController.html",
@@ -607,7 +642,7 @@
"api/server/EchoHub.Server.Controllers.UsersController.html": {
"href": "api/server/EchoHub.Server.Controllers.UsersController.html",
"title": "Class UsersController | EchoHub Documentation",
- "summary": "Class UsersController Namespace EchoHub.Server.Controllers Assembly EchoHub.Server.dll [ApiController] [Route(\"api/users\")] [Authorize] [EnableRateLimiting(\"general\")] public class UsersController : ControllerBase Inheritance object ControllerBase UsersController Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors UsersController(EchoHubDbContext, ImageToAsciiService) public UsersController(EchoHubDbContext db, ImageToAsciiService asciiService) Parameters db EchoHubDbContext asciiService ImageToAsciiService Methods GetProfile(string) [HttpGet(\"{username}/profile\")] public Task GetProfile(string username) Parameters username string Returns Task UpdateProfile(UpdateProfileRequest) [HttpPut(\"profile\")] public Task UpdateProfile(UpdateProfileRequest request) Parameters request UpdateProfileRequest Returns Task UploadAvatar() [HttpPost(\"avatar\")] [EnableRateLimiting(\"upload\")] public Task UploadAvatar() Returns Task"
+ "summary": "Class UsersController Namespace EchoHub.Server.Controllers Assembly EchoHub.Server.dll [ApiController] [Route(\"api/users\")] [Authorize] [EnableRateLimiting(\"general\")] public class UsersController : ControllerBase Inheritance object ControllerBase UsersController Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors UsersController(IUserService, ImageToAsciiService) public UsersController(IUserService userService, ImageToAsciiService asciiService) Parameters userService IUserService asciiService ImageToAsciiService Methods GetProfile(string) [HttpGet(\"{username}/profile\")] public Task GetProfile(string username) Parameters username string Returns Task UpdateProfile(UpdateProfileRequest) [HttpPut(\"profile\")] public Task UpdateProfile(UpdateProfileRequest request) Parameters request UpdateProfileRequest Returns Task UploadAvatar() [HttpPost(\"avatar\")] [EnableRateLimiting(\"upload\")] public Task UploadAvatar() Returns Task"
},
"api/server/EchoHub.Server.Controllers.html": {
"href": "api/server/EchoHub.Server.Controllers.html",
@@ -667,7 +702,7 @@
"api/server/EchoHub.Server.Hubs.ChatHub.html": {
"href": "api/server/EchoHub.Server.Hubs.ChatHub.html",
"title": "Class ChatHub | EchoHub Documentation",
- "summary": "Class ChatHub Namespace EchoHub.Server.Hubs Assembly EchoHub.Server.dll [Authorize] public class ChatHub : Hub, IDisposable Inheritance object Hub Hub ChatHub Implements IDisposable Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors ChatHub(IChatService, ILogger) public ChatHub(IChatService chatService, ILogger logger) Parameters chatService IChatService logger ILogger Methods GetChannelHistory(string, int) public Task> GetChannelHistory(string channelName, int count = 100) Parameters channelName string count int Returns Task