Converts emoji grapheme clusters to text shortcodes for safe TUI rendering.
+Terminal width calculations for emoji are unreliable across different terminals,
+so we replace them with fixed-width ASCII shortcodes for display only.
+ Deconstruct(out string?, out string?, out string?, out string?, out bool?, out byte?)
+
+
+
+
+
+
+
+
public void Deconstruct(out string? DisplayName, out string? Bio, out string? NicknameColor, out string? AvatarPath, out bool? NotificationSoundEnabled, out byte? NotificationVolume)
Parameters
@@ -371,6 +470,12 @@ Class ProfileEditResult string
+
Converts emoji grapheme clusters to text shortcodes for safe TUI rendering.
+Terminal width calculations for emoji are unreliable across different terminals,
+so we replace them with fixed-width ASCII shortcodes for display only.
- Deconstruct(out Guid, out string, out string, out string?, out string, out MessageType, out string?, out string?, out DateTimeOffset)
+
+ Deconstruct(out Guid, out string, out string, out string?, out string, out MessageType, out string?, out string?, out DateTimeOffset, out List<EmbedDto>?)
- Deconstruct(out Guid, out string, out string?, out string?, out string?, out string?, out UserStatus, out string?, out DateTimeOffset, out DateTimeOffset)
+
+ Deconstruct(out Guid, out string, out string?, out string?, out string?, out string?, out UserStatus, out string?, out ServerRole, out DateTimeOffset, out DateTimeOffset)
diff --git a/api/server-irc/EchoHub.Server.Irc.IrcMessageFormatter.html b/api/server-irc/EchoHub.Server.Irc.IrcMessageFormatter.html
index d07d222..03a4612 100644
--- a/api/server-irc/EchoHub.Server.Irc.IrcMessageFormatter.html
+++ b/api/server-irc/EchoHub.Server.Irc.IrcMessageFormatter.html
@@ -152,6 +152,44 @@ Class IrcMessageFormatter
+
+
+ ColorTagsToAnsi(string)
+
+
+
+
Convert printable color tags ({F:RRGGBB}, {B:RRGGBB}, {X}) to ANSI escape codes for IRC clients.
+Also passes through content that already uses ANSI codes unchanged.
diff --git a/api/server/EchoHub.Server.Services.ImageToAsciiService.html b/api/server/EchoHub.Server.Services.ImageToAsciiService.html
index a2ed735..88a920c 100644
--- a/api/server/EchoHub.Server.Services.ImageToAsciiService.html
+++ b/api/server/EchoHub.Server.Services.ImageToAsciiService.html
@@ -189,11 +189,16 @@ Class ImageToAsciiService
-
+
Converts an image to ASCII art using half-block characters (▀▄█) with
+printable color tags for 2x vertical resolution.
+Each character cell represents two vertical pixels.
+Format: {F:RRGGBB} foreground, {B:RRGGBB} background, {X} reset.
+Uses only printable ASCII — no terminal escape bytes.
+
-
public string ConvertToAscii(Stream imageStream, int width = 80, int height = 40)
+
public string ConvertToAscii(Stream imageStream, int width = 80, int height = 80)
Parameters
@@ -222,6 +227,44 @@ Class ImageToAsciiService
+
+
+ GetDimensions(string?)
+
+
+
+
Returns (width, height) dimensions for the given size code.
+s = small (40x40), m = medium/default (80x80), l = large (120x120).
+
+
+
+
+
public static (int Width, int Height) GetDimensions(string? size)
Detect all URLs in message content and attempt to fetch OG embed data for each.
+Returns null if no URLs found or all fetches fail.
+Never throws — all errors are caught internally.
+
+
+
+
+
public Task<List<EmbedDto>?> TryGetEmbedsAsync(string content)
Forcibly remove a user from all tracking. Returns their connection IDs and channels
+so the caller can broadcast departures and force-disconnect connections.
+
+
+
+
+
public (List<string> ConnectionIds, List<string> Channels) ForceRemoveUser(string username)
EchoHub can play a notification sound when someone @mentions you. This is disabled by default and must be enabled in your profile settings.
+
Enabling Notifications
+
Open your profile (/profile) and check the "Notification sound on @mention" checkbox, then save. You can also adjust the Volume (0-100, default 30). All settings are persisted in ~/.echohub/config.json.
+
Customizing the Sound
+
The client ships with a default Notification.mp3 in the Assets folder. To use your own notification sound, replace the file at:
+
<app-directory>/Assets/Notification.mp3
+
+
The file must be a valid .mp3 or .wav audio file. The replacement takes effect on the next app launch.
+
Alternatively, set a custom path in ~/.echohub/config.json:
Added server roles: Owner, Admin, Mod, Member — first registered user is automatically Owner
+
New /kick, /ban, /unban, /mute, /unmute, /role, /nuke commands for moderators and admins
+
ModerationController with full REST API for role assignment, kicks, bans, mutes, message deletion, and channel nuking
+
Mutes support optional duration (auto-expire) and blocked users cannot log in
+
Role claim included in JWT tokens; role badges shown in the online users panel
+
Kicked and banned users are forcibly disconnected in real time — server cleans up presence, broadcasts departures, and signals client disconnect
+
Works for both SignalR and IRC connections; client shows an error dialog with the reason
+
+
Private Channels
+
+
Channels can be created as public or private via a checkbox in the Create Channel dialog
+
Public channels are visible to all users; private channels only appear for members who joined them
+
Persistent channel membership tracked in the database (ChannelMembership table)
+
GET /api/channels returns the combined list: public channels + user's joined private channels
+
Channel creators are automatically added as members
+
+
OpenGraph Link Embeds
+
+
Messages containing URLs now show a rich preview below the message text
+
Multiple URLs per message supported (up to 3) — each gets its own embed
+
Server-side fetching: detects URLs in a message, fetches each page, and parses OpenGraph meta tags (og:title, og:description, og:site_name)
+
Embeds are persisted in the database as a JSON array and included in channel history
+
TUI client renders embeds with a ▏ left border bar — site name and border in blue, title in white, description in gray; text word-wraps at actual viewport width
IRC gateway converts color tags back to ANSI for IRC client compatibility
+
+
Client UI
+
+
Version number shown in the status bar
+
Custom colored rendering for channel list (active indicator, unread count badges)
+
Avatar upload field added to the profile edit dialog (file path or URL)
+
Profile avatar now renders with full color tag support in the profile view dialog
+
Update check notification on connect — shows a system message if a newer GitHub release exists
+
Chat messages no longer show selection/focus highlight
+
Exit shortcut changed from Ctrl+C to Alt+Q — frees Ctrl+C for copy
+
Default history increased from 50 to 100 messages on channel join
+
+
Fixes
+
+
Fixed #general channel not visible after adding the IsPublic column — migration default changed to true and startup service ensures it
+
Fixed channels disappearing when creating a new channel — replaced full re-fetch with incremental updates
+
Wired OnChannelUpdated SignalR event so new public channels appear for all connected users in real time
+
Fixed color tag parser using wrong regex group numbers (6,7,8 instead of 1,2,3) — new ASCII art was rendering without colors
+
Full Unicode/emoji support — renderers use Terminal.Gui v2 grapheme cluster API (GraphemeHelper, AddStr) for proper wide character handling
+
Emoji-to-text shortcode conversion for consistent cross-platform rendering
+
Fixed /send and /avatar commands not handling file paths with spaces correctly, even when quoted
+
Server-side newline spam protection — consecutive blank/whitespace-only lines collapsed to 1 and total lines capped at 30
+
Fixed OG tag regex truncating descriptions containing apostrophes (e.g. "HueByte's portfolio" was cut to "HueByte") — switched to backreference-based quote pairing
+
+
Infrastructure
+
+
New LinkEmbedService on the server — URL detection, HTML fetching (first 64KB), OG tag parsing via compiled regex
+
EmbedDto record added to shared Core DTOs; MessageDto.Embeds list for multiple embeds per message
+
EmbedJson nullable column on the Message table stores serialized embed data as JSON array (max 8KB); DataMigrationService auto-migrates old single-object format
+
Dedicated "OgFetch" named HttpClient with bot User-Agent header and 5-second timeout
+
PresenceTracker.ForceRemoveUser() for atomic user cleanup on kick/ban
+
IChatBroadcaster.ForceDisconnectUserAsync() and IEchoHubClient.ForceDisconnect for force-disconnect signaling
+
NotificationSoundService for cross-platform audio playback of embedded notification sounds
+
Startup DataMigrationService automatically converts old ANSI-format messages to the new color tag format on server boot, logging the count of migrated records
+
EmojiHelper utility for emoji-to-shortcode conversion
+
Heartbeat handling in ServerDirectoryService for connection health checks
+
Four new EF Core migrations: AddModerationRoles, AddChannelIsPublic, AddChannelMembership, AddMessageEmbed
+
ChannelMembership table with cascade delete on both channel and user removal
+
+
+
+
+
+
+
diff --git a/index.json b/index.json
index ab456ca..beeb57c 100644
--- a/index.json
+++ b/index.json
@@ -2,7 +2,7 @@
"api/client-articles/index.html": {
"href": "api/client-articles/index.html",
"title": "Client Articles | EchoHub Documentation",
- "summary": "Client Articles Articles related to the EchoHub TUI client built with Terminal.Gui v2. Topics Terminal.Gui v2 patterns and conventions Theme system and customization Command system reference Configuration management"
+ "summary": "Client Articles Articles related to the EchoHub TUI client built with Terminal.Gui v2. Topics Terminal.Gui v2 patterns and conventions Theme system and customization Command system reference Configuration management Notification sounds"
},
"api/client/EchoHub.Client.AppOrchestrator.html": {
"href": "api/client/EchoHub.Client.AppOrchestrator.html",
@@ -17,7 +17,7 @@
"api/client/EchoHub.Client.Commands.CommandHandler.html": {
"href": "api/client/EchoHub.Client.Commands.CommandHandler.html",
"title": "Class CommandHandler | EchoHub Documentation",
- "summary": "Class CommandHandler Namespace EchoHub.Client.Commands Assembly EchoHub.Client.dll public class CommandHandler Inheritance object CommandHandler Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors CommandHandler() public CommandHandler() Methods HandleAsync(string) public Task HandleAsync(string input) Parameters input string Returns Task IsCommand(string) public bool IsCommand(string input) Parameters input string Returns bool Events OnHelp public event Func? OnHelp Event Type Func OnJoinChannel public event Func? OnJoinChannel Event Type Func OnLeaveChannel public event Func? OnLeaveChannel Event Type Func OnListUsers public event Func? OnListUsers Event Type Func OnOpenProfile public event Func? OnOpenProfile Event Type Func OnOpenServers public event Func? OnOpenServers Event Type Func OnQuit public event Func? OnQuit Event Type Func OnSendFile public event Func? OnSendFile Event Type Func OnSetAvatar public event Func? OnSetAvatar Event Type Func OnSetColor public event Func? OnSetColor Event Type Func OnSetNick public event Func? OnSetNick Event Type Func OnSetStatus public event Func? OnSetStatus Event Type Func OnSetTheme public event Func? OnSetTheme Event Type Func OnSetTopic public event Func? OnSetTopic Event Type Func"
+ "summary": "Class CommandHandler Namespace EchoHub.Client.Commands Assembly EchoHub.Client.dll public class CommandHandler Inheritance object CommandHandler Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors CommandHandler() public CommandHandler() Methods HandleAsync(string) public Task HandleAsync(string input) Parameters input string Returns Task IsCommand(string) public bool IsCommand(string input) Parameters input string Returns bool Events OnAssignRole public event Func? OnAssignRole Event Type Func OnBanUser public event Func? OnBanUser Event Type Func OnHelp public event Func? OnHelp Event Type Func OnJoinChannel public event Func? OnJoinChannel Event Type Func OnKickUser public event Func? OnKickUser Event Type Func OnLeaveChannel public event Func? OnLeaveChannel Event Type Func OnListUsers public event Func? OnListUsers Event Type Func OnMuteUser public event Func? OnMuteUser Event Type Func OnNukeChannel public event Func? OnNukeChannel Event Type Func OnOpenProfile public event Func? OnOpenProfile Event Type Func OnOpenServers public event Func? OnOpenServers Event Type Func OnQuit public event Func? OnQuit Event Type Func OnSendFile public event Func? OnSendFile Event Type Func OnSetAvatar public event Func? OnSetAvatar Event Type Func OnSetColor public event Func? OnSetColor Event Type Func OnSetNick public event Func? OnSetNick Event Type Func OnSetStatus public event Func? OnSetStatus Event Type Func OnSetTheme public event Func? OnSetTheme Event Type Func OnSetTopic public event Func? OnSetTopic Event Type Func OnTestSound public event Func? OnTestSound Event Type Func OnUnbanUser public event Func? OnUnbanUser Event Type Func OnUnmuteUser public event Func? OnUnmuteUser Event Type Func"
},
"api/client/EchoHub.Client.Commands.CommandResult.html": {
"href": "api/client/EchoHub.Client.Commands.CommandResult.html",
@@ -37,13 +37,18 @@
"api/client/EchoHub.Client.Config.ClientConfig.html": {
"href": "api/client/EchoHub.Client.Config.ClientConfig.html",
"title": "Class ClientConfig | EchoHub Documentation",
- "summary": "Class ClientConfig Namespace EchoHub.Client.Config Assembly EchoHub.Client.dll public class ClientConfig Inheritance object ClientConfig Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors ClientConfig() public ClientConfig() Properties ActiveTheme public string ActiveTheme { get; set; } Property Value string DefaultPreset public AccountPreset DefaultPreset { get; set; } Property Value AccountPreset SavedServers public List SavedServers { get; set; } Property Value List"
+ "summary": "Class ClientConfig Namespace EchoHub.Client.Config Assembly EchoHub.Client.dll public class ClientConfig Inheritance object ClientConfig Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors ClientConfig() public ClientConfig() Properties ActiveTheme public string ActiveTheme { get; set; } Property Value string DefaultPreset public AccountPreset DefaultPreset { get; set; } Property Value AccountPreset Notifications public NotificationConfig Notifications { get; set; } Property Value NotificationConfig SavedServers public List SavedServers { get; set; } Property Value List"
},
"api/client/EchoHub.Client.Config.ConfigManager.html": {
"href": "api/client/EchoHub.Client.Config.ConfigManager.html",
"title": "Class ConfigManager | EchoHub Documentation",
"summary": "Class ConfigManager Namespace EchoHub.Client.Config Assembly EchoHub.Client.dll public static class ConfigManager Inheritance object ConfigManager Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Methods Load() public static ClientConfig Load() Returns ClientConfig RemoveServer(string) public static void RemoveServer(string url) Parameters url string Save(ClientConfig) public static void Save(ClientConfig config) Parameters config ClientConfig SaveServer(SavedServer) public static void SaveServer(SavedServer server) Parameters server SavedServer"
},
+ "api/client/EchoHub.Client.Config.NotificationConfig.html": {
+ "href": "api/client/EchoHub.Client.Config.NotificationConfig.html",
+ "title": "Class NotificationConfig | EchoHub Documentation",
+ "summary": "Class NotificationConfig Namespace EchoHub.Client.Config Assembly EchoHub.Client.dll public class NotificationConfig Inheritance object NotificationConfig Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors NotificationConfig() public NotificationConfig() Properties Enabled public bool Enabled { get; set; } Property Value bool SoundFile public string? SoundFile { get; set; } Property Value string Volume public byte Volume { get; set; } Property Value byte"
+ },
"api/client/EchoHub.Client.Config.SavedServer.html": {
"href": "api/client/EchoHub.Client.Config.SavedServer.html",
"title": "Class SavedServer | EchoHub Documentation",
@@ -52,22 +57,32 @@
"api/client/EchoHub.Client.Config.html": {
"href": "api/client/EchoHub.Client.Config.html",
"title": "Namespace EchoHub.Client.Config | EchoHub Documentation",
- "summary": "Namespace EchoHub.Client.Config Classes AccountPreset ClientConfig ConfigManager SavedServer"
+ "summary": "Namespace EchoHub.Client.Config Classes AccountPreset ClientConfig ConfigManager NotificationConfig SavedServer"
},
"api/client/EchoHub.Client.Services.ApiClient.html": {
"href": "api/client/EchoHub.Client.Services.ApiClient.html",
"title": "Class ApiClient | EchoHub Documentation",
- "summary": "Class ApiClient Namespace EchoHub.Client.Services Assembly EchoHub.Client.dll public sealed class ApiClient : IDisposable Inheritance object ApiClient Implements IDisposable Inherited Members object.GetType() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors ApiClient(string) public ApiClient(string baseUrl) Parameters baseUrl string Properties BaseUrl public string BaseUrl { get; } Property Value string RefreshToken public string? RefreshToken { get; } Property Value string Token public string? Token { get; } Property Value string Methods CreateChannelAsync(string, string?) public Task CreateChannelAsync(string name, string? topic = null) Parameters name string topic string Returns Task DeleteChannelAsync(string) public Task DeleteChannelAsync(string channelName) Parameters channelName string Returns Task Dispose() public void Dispose() GetChannelsAsync() public Task> GetChannelsAsync() Returns Task> GetServerInfoAsync() public Task GetServerInfoAsync() Returns Task GetUserProfileAsync(string) public Task GetUserProfileAsync(string username) Parameters username string Returns Task GetValidTokenAsync() Returns a valid access token, refreshing if expired. Used by EchoHubConnection for SignalR token provider. public Task GetValidTokenAsync() Returns Task LoginAsync(string, string) public Task LoginAsync(string username, string password) Parameters username string password string Returns Task LogoutAsync() public Task LogoutAsync() Returns Task RefreshTokenAsync() public Task RefreshTokenAsync() Returns Task RegisterAsync(string, string, string?) public Task RegisterAsync(string username, string password, string? displayName = null) Parameters username string password string displayName string Returns Task SendUrlAsync(string, string) public Task SendUrlAsync(string channelName, string url) Parameters channelName string url string Returns Task UpdateChannelTopicAsync(string, string?) public Task UpdateChannelTopicAsync(string channelName, string? topic) Parameters channelName string topic string Returns Task UpdateProfileAsync(UpdateProfileRequest) public Task UpdateProfileAsync(UpdateProfileRequest request) Parameters request UpdateProfileRequest Returns Task UploadAvatarAsync(Stream, string) public Task UploadAvatarAsync(Stream imageStream, string fileName) Parameters imageStream Stream fileName string Returns Task UploadFileAsync(string, Stream, string) public Task UploadFileAsync(string channelName, Stream fileStream, string fileName) Parameters channelName string fileStream Stream fileName string Returns Task"
+ "summary": "Class ApiClient Namespace EchoHub.Client.Services Assembly EchoHub.Client.dll public sealed class ApiClient : IDisposable Inheritance object ApiClient Implements IDisposable Inherited Members object.GetType() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors ApiClient(string) public ApiClient(string baseUrl) Parameters baseUrl string Properties BaseUrl public string BaseUrl { get; } Property Value string RefreshToken public string? RefreshToken { get; } Property Value string Token public string? Token { get; } Property Value string Methods AssignRoleAsync(string, ServerRole) public Task AssignRoleAsync(string username, ServerRole role) Parameters username string role ServerRole Returns Task BanUserAsync(string, string?) public Task BanUserAsync(string username, string? reason = null) Parameters username string reason string Returns Task CreateChannelAsync(string, string?, bool) public Task CreateChannelAsync(string name, string? topic = null, bool isPublic = true) Parameters name string topic string isPublic bool Returns Task DeleteChannelAsync(string) public Task DeleteChannelAsync(string channelName) Parameters channelName string Returns Task DeleteMessageAsync(Guid) public Task DeleteMessageAsync(Guid messageId) Parameters messageId Guid Returns Task Dispose() public void Dispose() GetChannelsAsync() public Task> GetChannelsAsync() Returns Task> GetServerInfoAsync() public Task GetServerInfoAsync() Returns Task GetUserProfileAsync(string) public Task GetUserProfileAsync(string username) Parameters username string Returns Task GetValidTokenAsync() Returns a valid access token, refreshing if expired. Used by EchoHubConnection for SignalR token provider. public Task GetValidTokenAsync() Returns Task KickUserAsync(string, string?) public Task KickUserAsync(string username, string? reason = null) Parameters username string reason string Returns Task LoginAsync(string, string) public Task LoginAsync(string username, string password) Parameters username string password string Returns Task LogoutAsync() public Task LogoutAsync() Returns Task MuteUserAsync(string, int?, string?) public Task MuteUserAsync(string username, int? durationMinutes = null, string? reason = null) Parameters username string durationMinutes int? reason string Returns Task NukeChannelAsync(string) public Task NukeChannelAsync(string channelName) Parameters channelName string Returns Task RefreshTokenAsync() public Task RefreshTokenAsync() Returns Task RegisterAsync(string, string, string?) public Task RegisterAsync(string username, string password, string? displayName = null) Parameters username string password string displayName string Returns Task SendUrlAsync(string, string, string?) public Task SendUrlAsync(string channelName, string url, string? size = null) Parameters channelName string url string size string Returns Task UnbanUserAsync(string) public Task UnbanUserAsync(string username) Parameters username string Returns Task UnmuteUserAsync(string) public Task UnmuteUserAsync(string username) Parameters username string Returns Task UpdateChannelTopicAsync(string, string?) public Task UpdateChannelTopicAsync(string channelName, string? topic) Parameters channelName string topic string Returns Task UpdateProfileAsync(UpdateProfileRequest) public Task UpdateProfileAsync(UpdateProfileRequest request) Parameters request UpdateProfileRequest Returns Task UploadAvatarAsync(Stream, string) public Task UploadAvatarAsync(Stream imageStream, string fileName) Parameters imageStream Stream fileName string Returns Task UploadFileAsync(string, Stream, string, string?) public Task UploadFileAsync(string channelName, Stream fileStream, string fileName, string? size = null) Parameters channelName string fileStream Stream fileName string size string Returns Task"
},
"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) public EchoHubConnection(string serverUrl, ApiClient apiClient) Parameters serverUrl string apiClient ApiClient 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 = 50) 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 OnChannelUpdated public event Action? OnChannelUpdated Event Type Action OnConnectionStateChanged public event Action? OnConnectionStateChanged Event Type Action OnError public event Action? OnError Event Type Action OnMessageReceived public event Action? OnMessageReceived Event Type Action OnReconnected public event Action? OnReconnected Event Type Action OnUserJoined public event Action? OnUserJoined 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) public EchoHubConnection(string serverUrl, ApiClient apiClient) Parameters serverUrl string apiClient ApiClient 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.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 static class UpdateChecker Inheritance object UpdateChecker Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Methods CheckForUpdateAsync() Checks GitHub for a newer release. Returns the new version string if one exists, or null. Never throws — all errors are silently swallowed. public static Task CheckForUpdateAsync() Returns Task"
},
"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 EchoHubConnection"
+ "summary": "Namespace EchoHub.Client.Services Classes ApiClient EchoHubConnection NotificationSoundService UpdateChecker"
},
"api/client/EchoHub.Client.Themes.Theme.html": {
"href": "api/client/EchoHub.Client.Themes.Theme.html",
@@ -89,20 +104,25 @@
"title": "Namespace EchoHub.Client.Themes | EchoHub Documentation",
"summary": "Namespace EchoHub.Client.Themes Classes Theme ThemeColors ThemeManager"
},
+ "api/client/EchoHub.Client.UI.ChannelListSource.html": {
+ "href": "api/client/EchoHub.Client.UI.ChannelListSource.html",
+ "title": "Class ChannelListSource | EchoHub Documentation",
+ "summary": "Class ChannelListSource Namespace EchoHub.Client.UI Assembly EchoHub.Client.dll Custom list data source for colored channel list rendering. Active channel gets a > indicator, unread channels are bright with a count badge. public class ChannelListSource : IListDataSource, IDisposable Inheritance object ChannelListSource Implements IListDataSource IDisposable Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors ChannelListSource() public ChannelListSource() Properties Count public int Count { get; } Property Value int MaxItemLength public int MaxItemLength { get; } Property Value int SuspendCollectionChangedEvent public bool SuspendCollectionChangedEvent { get; set; } Property Value bool Methods Dispose() public void Dispose() IsMarked(int) public bool IsMarked(int item) Parameters item int Returns bool Render(ListView, bool, int, int, int, int, int) public void Render(ListView listView, bool selected, int item, int col, int row, int width, int viewportX = 0) Parameters listView ListView selected bool item int col int row int width int viewportX int SetMark(int, bool) public void SetMark(int item, bool value) Parameters item int value bool ToList() public IList ToList() Returns IList Update(List, Dictionary, string) public void Update(List channels, Dictionary unread, string activeChannel) Parameters channels List unread Dictionary activeChannel string Events CollectionChanged public event NotifyCollectionChangedEventHandler? CollectionChanged Event Type NotifyCollectionChangedEventHandler"
+ },
"api/client/EchoHub.Client.UI.ChatColors.html": {
"href": "api/client/EchoHub.Client.UI.ChatColors.html",
"title": "Class ChatColors | EchoHub Documentation",
- "summary": "Class ChatColors Namespace EchoHub.Client.UI 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 SystemAttr public static readonly Attribute SystemAttr Field Value Attribute TimestampAttr public static readonly Attribute TimestampAttr Field Value Attribute"
+ "summary": "Class ChatColors Namespace EchoHub.Client.UI 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 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 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"
},
"api/client/EchoHub.Client.UI.ChatLine.html": {
"href": "api/client/EchoHub.Client.UI.ChatLine.html",
"title": "Class ChatLine | EchoHub Documentation",
- "summary": "Class ChatLine Namespace EchoHub.Client.UI 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 Segments public List Segments { get; } Property Value List TextLength public int TextLength { get; } Property Value int Methods FromAnsi(string, Attribute?) Parse a string containing ANSI 24-bit color escape codes into colored segments. Format: \\x1b[38;2;R;G;Bm (foreground color), \\x1b[0m (reset) public static ChatLine FromAnsi(string ansiText, Attribute? defaultAttr = null) Parameters ansiText string defaultAttr Attribute? Returns ChatLine 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 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 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 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.ChatListSource.html": {
"href": "api/client/EchoHub.Client.UI.ChatListSource.html",
"title": "Class ChatListSource | EchoHub Documentation",
- "summary": "Class ChatListSource Namespace EchoHub.Client.UI Assembly EchoHub.Client.dll Custom list data source for chat messages with per-character coloring. public class ChatListSource : IListDataSource, IDisposable Inheritance object ChatListSource 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 ChatListSource() public ChatListSource() 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 Add(ChatLine) public void Add(ChatLine line) Parameters line ChatLine AddRange(IEnumerable) public void AddRange(IEnumerable lines) Parameters lines IEnumerable Clear() public void Clear() Dispose() public void Dispose() InsertRange(int, IEnumerable) public void InsertRange(int index, IEnumerable lines) Parameters index int lines IEnumerable 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 Events CollectionChanged public event NotifyCollectionChangedEventHandler? CollectionChanged Event Type NotifyCollectionChangedEventHandler"
+ "summary": "Class ChatListSource Namespace EchoHub.Client.UI Assembly EchoHub.Client.dll Custom list data source for chat messages with per-segment coloring. public class ChatListSource : IListDataSource, IDisposable Inheritance object ChatListSource 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 ChatListSource() public ChatListSource() 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 Add(ChatLine) public void Add(ChatLine line) Parameters line ChatLine AddRange(IEnumerable) public void AddRange(IEnumerable lines) Parameters lines IEnumerable Clear() public void Clear() Dispose() public void Dispose() InsertRange(int, IEnumerable) public void InsertRange(int index, IEnumerable lines) Parameters index int lines IEnumerable 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 Events CollectionChanged public event NotifyCollectionChangedEventHandler? CollectionChanged Event Type NotifyCollectionChangedEventHandler"
},
"api/client/EchoHub.Client.UI.ChatSegment.html": {
"href": "api/client/EchoHub.Client.UI.ChatSegment.html",
@@ -132,12 +152,17 @@
"api/client/EchoHub.Client.UI.CreateChannelResult.html": {
"href": "api/client/EchoHub.Client.UI.CreateChannelResult.html",
"title": "Class CreateChannelResult | EchoHub Documentation",
- "summary": "Class CreateChannelResult Namespace EchoHub.Client.UI Assembly EchoHub.Client.dll public record CreateChannelResult : IEquatable Inheritance object CreateChannelResult Implements IEquatable Inherited Members object.GetType() object.MemberwiseClone() object.Equals(object, object) object.ReferenceEquals(object, object) Constructors CreateChannelResult(CreateChannelResult) protected CreateChannelResult(CreateChannelResult original) Parameters original CreateChannelResult CreateChannelResult(string, string?) public CreateChannelResult(string Name, string? Topic) Parameters Name string Topic string Properties EqualityContract protected virtual Type EqualityContract { get; } Property Value Type Name public string Name { get; init; } Property Value string Topic public string? Topic { get; init; } Property Value string Methods Deconstruct(out string, out string?) public void Deconstruct(out string Name, out string? Topic) Parameters Name string Topic string Equals(CreateChannelResult?) public virtual bool Equals(CreateChannelResult? other) Parameters other CreateChannelResult Returns bool Equals(object?) public override bool Equals(object? obj) Parameters obj object Returns bool GetHashCode() public override int GetHashCode() Returns int PrintMembers(StringBuilder) protected virtual bool PrintMembers(StringBuilder builder) Parameters builder StringBuilder Returns bool ToString() public override string ToString() Returns string Operators operator ==(CreateChannelResult?, CreateChannelResult?) public static bool operator ==(CreateChannelResult? left, CreateChannelResult? right) Parameters left CreateChannelResult right CreateChannelResult Returns bool operator !=(CreateChannelResult?, CreateChannelResult?) public static bool operator !=(CreateChannelResult? left, CreateChannelResult? right) Parameters left CreateChannelResult right CreateChannelResult Returns bool"
+ "summary": "Class CreateChannelResult Namespace EchoHub.Client.UI Assembly EchoHub.Client.dll public record CreateChannelResult : IEquatable Inheritance object CreateChannelResult Implements IEquatable Inherited Members object.GetType() object.MemberwiseClone() object.Equals(object, object) object.ReferenceEquals(object, object) Constructors CreateChannelResult(CreateChannelResult) protected CreateChannelResult(CreateChannelResult original) Parameters original CreateChannelResult CreateChannelResult(string, string?, bool) public CreateChannelResult(string Name, string? Topic, bool IsPublic) Parameters Name string Topic string IsPublic bool Properties EqualityContract protected virtual Type EqualityContract { get; } Property Value Type IsPublic public bool IsPublic { get; init; } Property Value bool Name public string Name { get; init; } Property Value string Topic public string? Topic { get; init; } Property Value string Methods Deconstruct(out string, out string?, out bool) public void Deconstruct(out string Name, out string? Topic, out bool IsPublic) Parameters Name string Topic string IsPublic bool Equals(CreateChannelResult?) public virtual bool Equals(CreateChannelResult? other) Parameters other CreateChannelResult Returns bool Equals(object?) public override bool Equals(object? obj) Parameters obj object Returns bool GetHashCode() public override int GetHashCode() Returns int PrintMembers(StringBuilder) protected virtual bool PrintMembers(StringBuilder builder) Parameters builder StringBuilder Returns bool ToString() public override string ToString() Returns string Operators operator ==(CreateChannelResult?, CreateChannelResult?) public static bool operator ==(CreateChannelResult? left, CreateChannelResult? right) Parameters left CreateChannelResult right CreateChannelResult Returns bool operator !=(CreateChannelResult?, CreateChannelResult?) public static bool operator !=(CreateChannelResult? left, CreateChannelResult? right) Parameters left CreateChannelResult right CreateChannelResult Returns bool"
+ },
+ "api/client/EchoHub.Client.UI.EmojiHelper.html": {
+ "href": "api/client/EchoHub.Client.UI.EmojiHelper.html",
+ "title": "Class EmojiHelper | EchoHub Documentation",
+ "summary": "Class EmojiHelper Namespace EchoHub.Client.UI Assembly EchoHub.Client.dll Converts emoji grapheme clusters to text shortcodes for safe TUI rendering. Terminal width calculations for emoji are unreliable across different terminals, so we replace them with fixed-width ASCII shortcodes for display only. public static class EmojiHelper Inheritance object EmojiHelper Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Methods ReplaceEmoji(string) Replace emoji graphemes in the text with :shortcode: equivalents. Non-emoji text passes through unchanged. public static string ReplaceEmoji(string text) Parameters text string Returns string"
},
"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) public MainWindow(IApplication app) Parameters app IApplication Properties CurrentChannel Get the current channel name. public string CurrentChannel { get; } Property Value string Methods AddMessage(MessageDto) Add a message to the specified channel's message list and refresh if it is the current channel. Tracks unread count for non-active channels. public void AddMessage(MessageDto message) Parameters message MessageDto AddStatusMessage(string, string, string) Add a status change message to a channel with colored styling. public void AddStatusMessage(string channelName, string username, string status) Parameters channelName string username string status string AddSystemMessage(string, string) Add a system/informational message to a channel with colored styling. public void AddSystemMessage(string channelName, string text) Parameters channelName string text string 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() 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 LoadHistory(string, List) Load historical messages into a channel, replacing any existing messages. public void LoadHistory(string channelName, List messages) Parameters channelName string messages List RefreshMenuBar() Rebuilds and replaces the menu bar (e.g., after theme list changes). public void RefreshMenuBar() 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 for display in the status bar. 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 UpdateStatusBar(string) Update the connection status displayed in the status bar. public void UpdateStatusBar(string status) Parameters status string Events 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 OnDisconnectRequested Fired when the user requests to disconnect via the menu. public event Action? OnDisconnectRequested 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) public MainWindow(IApplication app) Parameters app IApplication Properties CurrentChannel Get the current channel name. public string CurrentChannel { get; } Property Value string Methods AddMessage(MessageDto) Add a message to the specified channel's message list and refresh if it is the current channel. Tracks unread count for non-active channels. public void AddMessage(MessageDto message) Parameters message MessageDto AddStatusMessage(string, string, string) Add a status change message to a channel with colored styling. public void AddStatusMessage(string channelName, string username, string status) Parameters channelName string username string status string AddSystemMessage(string, string) Add a system/informational message to a channel with colored styling. public void AddSystemMessage(string channelName, string text) Parameters channelName string text string 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() ClearChannelMessages(string) Clear all messages from a specific channel. public void ClearChannelMessages(string channelName) Parameters channelName string EnsureChannelInList(string) Ensure a channel exists in the left panel list (used for private channels joined via /join). public void EnsureChannelInList(string channelName) Parameters channelName string 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 LoadHistory(string, List) Load historical messages into a channel, replacing any existing messages. public void LoadHistory(string channelName, List messages) Parameters channelName string messages List 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 RemoveMessage(string, Guid) Remove all lines associated with a specific message ID. public void RemoveMessage(string channelName, Guid messageId) Parameters channelName string messageId Guid 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 for display in the status bar. 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 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 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