From a8a0a0a728fba78a12769981999fffed0ad2b313 Mon Sep 17 00:00:00 2001 From: Stone_Red <56473591+Stone-Red-Code@users.noreply.github.com> Date: Thu, 16 Jul 2026 14:50:33 +0200 Subject: [PATCH] Auto-join channels --- src/Decho/Services/ConnectionService.cs | 58 +++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/src/Decho/Services/ConnectionService.cs b/src/Decho/Services/ConnectionService.cs index 0f8499c..fa37607 100644 --- a/src/Decho/Services/ConnectionService.cs +++ b/src/Decho/Services/ConnectionService.cs @@ -75,9 +75,45 @@ public sealed class ConnectionService : IDisposable SaveRefreshToken(dialogResult.ServerUrl, dialogResult.RememberMe); ServerAdded?.Invoke(serverModel); + AutoJoinRemainingChannels(dialogResult.ServerUrl, result.Channels); + return serverModel; } + private async void AutoJoinRemainingChannels(string serverUrl, List channels) + { + ClientConfig config = ConfigManager.Load(); + List leftChannels = config.SavedServers + .FirstOrDefault(s => string.Equals(s.Url, serverUrl, StringComparison.OrdinalIgnoreCase)) + ?.LeftChannels ?? []; + + foreach (ChannelDto ch in channels) + { + if (string.Equals(ch.Name, HubConstants.DefaultChannel, StringComparison.OrdinalIgnoreCase)) + { + continue; + } + + if (leftChannels.Contains(ch.Name, StringComparer.OrdinalIgnoreCase)) + { + continue; + } + + try + { + _ = await JoinChannelAsync(serverUrl, ch.Name); + } + catch (EchoHub.Client.Services.ChannelPasswordRequiredException) + { + // protected channel — join stays manual + } + catch + { + // skip channels we can't join + } + } + } + public async Task ConnectAsync(string serverUrl, string username, string password, bool isRegister, bool rememberMe) { ConnectDialogResult dialogResult = new ConnectDialogResult( @@ -166,9 +202,11 @@ public sealed class ConnectionService : IDisposable if (entry.Manager.TrackChannel(channelName)) { JoinOutcome outcome = await entry.Manager.JoinChannelAsync(channelName, password); + RemoveFromLeftChannels(serverUrl, channelName); return outcome.History.Select(m => MessageModelFromDto(m, entry)).ToList(); } + RemoveFromLeftChannels(serverUrl, channelName); List existing = await entry.Manager.GetHistoryAsync(channelName); return existing.Select(m => MessageModelFromDto(m, entry)).ToList(); } @@ -181,6 +219,26 @@ public sealed class ConnectionService : IDisposable } await entry.Manager.LeaveChannelAsync(channelName); + + ClientConfig config = ConfigManager.Load(); + SavedServer? saved = config.SavedServers + .FirstOrDefault(s => string.Equals(s.Url, serverUrl, StringComparison.OrdinalIgnoreCase)); + if (saved is not null && !saved.LeftChannels.Contains(channelName, StringComparer.OrdinalIgnoreCase)) + { + saved.LeftChannels.Add(channelName); + ConfigManager.Save(config); + } + } + + private static void RemoveFromLeftChannels(string serverUrl, string channelName) + { + ClientConfig config = ConfigManager.Load(); + SavedServer? saved = config.SavedServers + .FirstOrDefault(s => string.Equals(s.Url, serverUrl, StringComparison.OrdinalIgnoreCase)); + if (saved is not null && saved.LeftChannels.Remove(channelName)) + { + ConfigManager.Save(config); + } } public async Task> GetHistoryAsync(string serverUrl, string channelName, int count = HubConstants.DefaultHistoryCount, int offset = 0)