mirror of
https://github.com/RedWizardsLab/EchoHub.git
synced 2026-09-04 08:36:11 +02:00
117 lines
6.9 KiB
Markdown
117 lines
6.9 KiB
Markdown
# v0.2.5 - Session Persistence, Auto-Updates, Audio & Transparent Theme
|
|
|
|
## 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 and open it with the system default application
|
|
- `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))
|
|
|
|
### Enhanced Status Bar
|
|
|
|
- Status bar now shows **EchoHub** branding at the start
|
|
- Connection state is color-coded: green (Connected), red (Disconnected), yellow (transitional states like Connecting, Reconnecting, Authenticating)
|
|
- Current channel shows its type: `#channel - public` or `#channel - private`
|
|
|
|
### Remember Me (Session Persistence)
|
|
|
|
- "Remember me" checkbox in the connect dialog — saves a 30-day refresh token so users can reconnect without entering their password
|
|
- Saved servers with active sessions show `[session]` indicator in the connect dialog and saved servers list
|
|
- Token-based login: selecting a saved server with a session lets you click Login with an empty password
|
|
- Graceful expiry handling: if the saved session is expired or revoked, shows an error and prompts for password
|
|
- Refresh token rotation: rotated tokens are automatically persisted to config so the session stays valid across refreshes
|
|
- New "Logout" menu item (Server menu): revokes the refresh token server-side and clears the saved session
|
|
- Removed dead `SavedServer.Token` field (stored 15-min access token that was never read back)
|
|
|
|
### Automatic Update Checking
|
|
|
|
- `UpdateChecker` rewritten to use the [AlwaysUpToDate](https://github.com/AuriRex/AlwaysUpToDate) library for self-updating
|
|
- Polls the EchoHub version manifest hourly (active only in `RELEASE` builds)
|
|
- `UpdateConfirmDialog` shows current vs. available version with Update/Cancel buttons
|
|
- `UpdateProgressDialog` displays real-time download progress bar
|
|
- Errors are logged via Serilog instead of being silently swallowed
|
|
|
|
### Windows Installer
|
|
|
|
- New Inno Setup script (`installer/Installer.iss`) to build a Windows installer
|
|
- Auto-reads product version from the built EXE
|
|
- User-level install by default (no admin required), with admin override option
|
|
- Creates desktop and quick-launch shortcuts (optional)
|
|
- Supports English and German languages
|
|
|
|
### Application Icons
|
|
|
|
- New `hue_icon` branding assets (ICO, PNG, SVG) in `assets/`
|
|
- Application icon set on both Client and Server projects
|
|
|
|
### #general Channel Protection
|
|
|
|
- `#general` channel is now auto-recreated if somehow missing (both in `GetChannels` endpoint and `JoinChannel` flow)
|
|
- Users cannot `/leave` the #general channel (client-side guard)
|
|
- Connecting while already connected now prompts to disconnect first instead of silently leaking the previous connection
|
|
|
|
## 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<bool>` (`RequireRegisteredAsync`) so the error reply is properly awaited before the handler returns
|
|
|
|
### ChannelService Extraction
|
|
|
|
- Extracted channel management logic from `ChannelsController` and `ChatService` into a dedicated `IChannelService` / `ChannelService`
|
|
- `ChannelsController` is now a thin adapter — delegates CRUD operations to `IChannelService` and maps `ChannelError` to HTTP status codes
|
|
- `ChatService.JoinChannelAsync` delegates channel validation + membership to `IChannelService.EnsureChannelMembershipAsync()`
|
|
- New `ChannelOperationResult` result type with `ChannelError` enum for typed error handling across service boundaries
|
|
- IRC gateway uses `IChannelService` for topic queries and channel listing (instead of `IChatService`)
|
|
|
|
### EchoHub Branding
|
|
|
|
- Status bar "EchoHub" text now uses golden color (218, 165, 32)
|
|
|
|
## Infrastructure
|
|
|
|
- Audio MIME types in `FilesController` (mp3, wav, ogg, flac, aac, m4a, wma)
|
|
- CI workflows updated to handle Terminal.Gui submodule `nuget.config` workaround (`rm -f` step)
|
|
- Root `nuget.config` added for package source management
|
|
- Terminal.Gui formatting excluded from CI format checks
|
|
- Recursive submodule fetching enabled in CI workflows
|
|
- `Server:Admins` config array in `appsettings.example.json` for designating admin usernames
|
|
- `Storage:CleanupIntervalHours` and `Storage:RetentionDays` added to `appsettings.example.json`
|
|
- `FakeChannelService` test helper added for IRC unit tests
|
|
- 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`, `FakeChannelService`, `FakeEncryptionService` for IRC unit testing without network I/O
|
|
- 346 total tests
|