# v0.2.5 - Audio Playback, File Downloads & IRC Fixes ## Features ### Audio Message Support - New `Audio` message type — uploaded audio files (`.mp3`, `.wav`, `.ogg`, `.flac`, `.aac`, `.m4a`, `.wma`) are automatically detected and categorized - TUI client renders audio messages with `♪ [Audio: filename] (Enter to play)` indicator - Press Enter on an audio message to play it locally via `AudioPlaybackService` (NetCoreAudio) - IRC gateway formats audio messages as `♪ [Audio: filename] url` - Server detects audio files by extension via `FileValidationHelper.IsAudioFile()` ### File Downloads - Press Enter on a file message in the TUI client to download it to the local machine - `ApiClient.DownloadFileAsync()` streams file downloads from the server - File and audio messages in the chat list now show colored indicators with interaction hints ### File Cleanup Service - `FileCleanupService` (BackgroundService) periodically removes old uploaded files - Configurable via `Storage:CleanupIntervalHours` (default 1h) and `Storage:RetentionDays` (default 30d) ### Data Migration Service - `DataMigrationService` runs at startup to handle schema/data evolution - Ensures `#general` channel and pre-existing channels are marked public - Migrates legacy ANSI escape codes in image messages to printable color tags (`{F:RRGGBB}`, `{B:RRGGBB}`, `{X}`) - Migrates legacy single-object `EmbedJson` to array format - Promotes usernames listed in `Server:Admins` config to Admin role ### True Transparent Background - Transparent theme now uses the terminal's native background instead of solid black - Powered by `Color.Transparent` (alpha=0) which emits ANSI `CSI 49m` (default background) instead of explicit RGB - Terminal transparency, acrylic, wallpaper effects now show through the TUI - Dialogs retain solid `DarkGray` background for readability - Uses local Terminal.Gui fork (submodule) with transparent color support pending upstream merge ([gui-cs/Terminal.Gui#4234](https://github.com/gui-cs/Terminal.Gui/pull/4234)) ## Fixes ### IRC Gateway - **Fixed: IRC JOIN history replay showed encrypted gibberish** — `IrcCommandHandler.HandleJoinAsync` now decrypts channel history before formatting for IRC clients (history was encrypted for SignalR transport but sent raw to IRC) - **Fixed: `JoinedChannels` race condition** — `IrcClientConnection.JoinedChannels` replaced with thread-safe methods (`JoinChannel`, `LeaveChannel`, `IsInChannel`, `GetJoinedChannels`) using lock synchronization; prevents crashes when broadcaster threads read while the command handler writes - **Fixed: `RequireRegistered` fire-and-forget** — converted from sync `bool` to `async Task` (`RequireRegisteredAsync`) so the error reply is properly awaited before the handler returns ## Infrastructure - Audio MIME types in `FilesController` (mp3, wav, ogg, flac, aac, m4a, wma) - Test suites: ChatLine, CommandHandler, DataMigrationService, FileValidationHelper, ImageToAsciiService, IrcMessageFormatter, JwtTokenService, LinkEmbedService - IRC abstraction layer test suite: IrcMessage parsing, IrcMessageFormatter, IrcClientConnection, IrcCommandHandler, IrcBroadcaster - Test helpers: `TestDuplexStream`, `TestIrcConnectionFactory`, `FakeChatService`, `FakeEncryptionService` for IRC unit testing without network I/O - 214 total tests