From d9c8cd837f154810ea589065680f93d537c0880e Mon Sep 17 00:00:00 2001 From: Grant Bartlett Date: Sat, 1 Feb 2025 20:11:40 +0000 Subject: [PATCH 01/12] Prevent ignored users from joining games --- .../DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs | 7 +++ .../Multiplayer/GameLobby/CnCNetGameLobby.cs | 22 +++++++ DXMainClient/Online/Channel.cs | 14 +++-- DXMainClient/Online/CnCNetManager.cs | 58 ++++++++++++++++++- DXMainClient/Online/Connection.cs | 6 ++ DXMainClient/Online/IConnectionManager.cs | 5 +- 6 files changed, 103 insertions(+), 9 deletions(-) diff --git a/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs b/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs index 70f694a81..e52ad4c98 100644 --- a/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs +++ b/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs @@ -993,6 +993,13 @@ private void GameChannel_UserAdded(object sender, Online.ChannelUserEventArgs e) { Channel gameChannel = (Channel)sender; + if (e.User.IRCUser.IsIgnored) + { + // Howboutno + Logger.Log("This user is ignored, so we shouldn't let them in"); + return; + } + if (e.User.IRCUser.Name == ProgramConstants.PLAYERNAME) { ClearGameChannelEvents(gameChannel); diff --git a/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs b/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs index 892fde5b1..960de6da9 100644 --- a/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs +++ b/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs @@ -19,6 +19,7 @@ using System.Text; using DTAClient.Domain.Multiplayer.CnCNet; using ClientCore.Extensions; +using System.Net.NetworkInformation; namespace DTAClient.DXGUI.Multiplayer.GameLobby { @@ -521,6 +522,15 @@ private void Channel_UserListReceived(object sender, EventArgs e) private void Channel_UserAdded(object sender, ChannelUserEventArgs e) { PlayerInfo pInfo = new PlayerInfo(e.User.IRCUser.Name); + + if (e.User.IRCUser.IsIgnored) + { + // If this ignored player constantly rejoins, he could cause the host to floodout using the normal RemovePlayer() functionality. + // So lets Ghost kickban from gameroom instead. This should only be needed once per created room + GhostBanIgnoredUser(pInfo.Name); + return; + } + Players.Add(pInfo); if (Players.Count + AIPlayers.Count > MAX_PLAYER_COUNT && AIPlayers.Count > 0) @@ -1558,6 +1568,18 @@ protected override void BanPlayer(int playerIndex) } } + private void GhostBanIgnoredUser(string playerName) + { + var user = connectionManager.UserList.Find(u => u.Name == playerName); + + if (user != null) + { + // Informing the host like we do when we kick might be annoying. So keep it on the downlow. + channel.SendBanMessage(user.Hostname, 8); + channel.SendKickMessage(user.Name, 8); + } + } + private void HandleCheatDetectedMessage(string sender) => AddNotice(string.Format("{0} has modified game files during the client session. They are likely attempting to cheat!".L10N("Client:Main:PlayerModifyFileCheat"), sender), Color.Red); diff --git a/DXMainClient/Online/Channel.cs b/DXMainClient/Online/Channel.cs index 26aa02607..fb6e64add 100644 --- a/DXMainClient/Online/Channel.cs +++ b/DXMainClient/Online/Channel.cs @@ -112,14 +112,15 @@ public void AddUser(ChannelUser user) UserAdded?.Invoke(this, new ChannelUserEventArgs(user)); } - public void OnUserJoined(ChannelUser user) + public void OnUserJoined(ChannelUser user, bool silentJoin = false) { AddUser(user); if (notifyOnUserListChange) { - AddMessage(new ChatMessage( - string.Format("{0} has joined {1}.".L10N("Client:Main:PlayerJoinChannel"), user.IRCUser.Name, UIName))); + if (!silentJoin) + AddMessage(new ChatMessage( + string.Format("{0} has joined {1}.".L10N("Client:Main:PlayerJoinChannel"), user.IRCUser.Name, UIName))); } #if !YR @@ -152,7 +153,7 @@ public void OnUserListReceived(List userList) UserListReceived?.Invoke(this, EventArgs.Empty); } - public void OnUserKicked(string userName) + public void OnUserKicked(string userName, bool silentKick = false) { if (users.Remove(userName)) { @@ -161,8 +162,9 @@ public void OnUserKicked(string userName) users.Clear(); } - AddMessage(new ChatMessage( - string.Format("{0} has been kicked from {1}.".L10N("Client:Main:PlayerKickedFromChannel"), userName, UIName))); + if (!silentKick) + AddMessage(new ChatMessage( + string.Format("{0} has been kicked from {1}.".L10N("Client:Main:PlayerKickedFromChannel"), userName, UIName))); UserKicked?.Invoke(this, new UserNameEventArgs(userName)); } diff --git a/DXMainClient/Online/CnCNetManager.cs b/DXMainClient/Online/CnCNetManager.cs index 1b3845952..d28da6569 100644 --- a/DXMainClient/Online/CnCNetManager.cs +++ b/DXMainClient/Online/CnCNetManager.cs @@ -40,6 +40,8 @@ public class CnCNetManager : IConnectionManager public event EventHandler ReconnectAttempt; public event EventHandler Disconnected; public event EventHandler Connected; + public event EventHandler UserListInitialized; + public event EventHandler UserAdded; public event EventHandler UserGameIndexUpdated; @@ -114,6 +116,8 @@ public bool IsAttemptingConnection private bool disconnect = false; + private bool userListInitialized = false; + public bool IsCnCNetInitialized() { return Connection.IsIdSet(); @@ -500,6 +504,7 @@ private void DoDisconnected() MainChannel.AddMessage(new ChatMessage("You have disconnected from CnCNet.".L10N("Client:Main:CncNetDisconnected"))); connected = false; + userListInitialized = false; UserList.Clear(); @@ -619,8 +624,9 @@ private void DoUserJoinedChannel(string channelName, string host, string userNam channelUser.IsAdmin = isAdmin; channelUser.IsFriend = cncNetUserData.IsFriend(channelUser.IRCUser.Name); + bool ignoredUser = channelUser.IRCUser.IsIgnored; ircUser.Channels.Add(channelName); - channel.OnUserJoined(channelUser); + channel.OnUserJoined(channelUser, ignoredUser); //UserJoinedChannel?.Invoke(this, new ChannelUserEventArgs(channelName, userName)); } @@ -645,7 +651,8 @@ private void DoUserKicked(string channelName, string userName) if (channel == null) return; - channel.OnUserKicked(userName); + ChannelUser kickedUser = channel.Users.Find(userName); + channel.OnUserKicked(userName, kickedUser.IRCUser.IsIgnored); if (userName == ProgramConstants.PLAYERNAME) { @@ -770,6 +777,13 @@ private void DoUserListReceived(string channelName, string[] userList) MultipleUsersAdded?.Invoke(this, EventArgs.Empty); channel.OnUserListReceived(channelUserList); + + // We only need to request user info once, and chat channels only. + if (!userListInitialized && channel.IsChatChannel) + { + channel.RequestUserInfo(); + userListInitialized = true; + } } public void OnUserQuitIRC(string userName) @@ -947,6 +961,46 @@ private void DoServerLatencyTested(int candidateCount, int closerCount) "Lobby servers: {0} available, {1} fast.".L10N("Client:Main:LobbyServerLatencyTestResult"), candidateCount, closerCount))); } + + public void OnWhoQueryComplete(string channelName, List> whoDataList) + { + wm.AddCallback(new Action>>(DoWhoQueryComplete), channelName, whoDataList); + } + + private void DoWhoQueryComplete(string channelName, List> whoDataList) + { + Channel channel = FindChannel(channelName); + + if (channel == null) + return; + + if (!channel.IsChatChannel) + return; + + var channelUserList = new List(); + + foreach (var whoData in whoDataList) + { + (string ident, string host, string userName, string extraInfo) = whoData; + + IRCUser ircUser = new(userName); + ircUser.Ident = ident; + ircUser.Hostname = host; + + UserList.Add(ircUser); + + var channelUser = new ChannelUser(ircUser); + channelUser.IsFriend = cncNetUserData.IsFriend(channelUser.IRCUser.Name); + + channelUserList.Add(channelUser); + } + + UserList = UserList.OrderBy(u => u.Name).ToList(); + MultipleUsersAdded?.Invoke(this, EventArgs.Empty); + UserListInitialized?.Invoke(this, EventArgs.Empty); + + channel.OnUserListReceived(channelUserList); + } } public class UserEventArgs : EventArgs diff --git a/DXMainClient/Online/Connection.cs b/DXMainClient/Online/Connection.cs index ef9764a25..5962304dd 100644 --- a/DXMainClient/Online/Connection.cs +++ b/DXMainClient/Online/Connection.cs @@ -121,6 +121,7 @@ private bool disconnect private static bool idSet = false; private static string systemId; private static readonly object idLocker = new object(); + private readonly List> whoResponseList = []; public static void SetId(string id) { @@ -618,6 +619,11 @@ private void PerformCommand(string message) case 311: // Reply to WHOIS NAME query connectionManager.OnWhoReplyReceived(parameters[2], parameters[3], parameters[1], string.Empty); break; + case 315: // End of WHO query (RPL_ENDOFWHO) + Logger.Log($"END OF WHO QUERY " + parameters[1] + " COUNT:" + whoResponseList.Count); + connectionManager.OnWhoQueryComplete(parameters[1], new List>(whoResponseList)); + whoResponseList.Clear(); + break; case 433: // Name already in use message = serverMessagePart + parameters[1] + ": " + parameters[2]; //connectionManager.OnGenericServerMessageReceived(message); diff --git a/DXMainClient/Online/IConnectionManager.cs b/DXMainClient/Online/IConnectionManager.cs index f283245ab..a33036baa 100644 --- a/DXMainClient/Online/IConnectionManager.cs +++ b/DXMainClient/Online/IConnectionManager.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; namespace DTAClient.Online { @@ -21,6 +22,8 @@ public interface IConnectionManager void OnWhoReplyReceived(string ident, string hostName, string userName, string extraInfo); + void OnWhoQueryComplete(string channel, List> whoList); + void OnChannelFull(string channelName); void OnTargetChangeTooFast(string channelName, string message); From ec936310aa276a5f8dc346e37f6838e50d67770b Mon Sep 17 00:00:00 2001 From: Grant Bartlett Date: Mon, 3 Feb 2025 13:01:16 +0000 Subject: [PATCH 02/12] Update DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs Co-authored-by: SadPencil --- DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs b/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs index 960de6da9..95eff0fa0 100644 --- a/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs +++ b/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs @@ -1575,8 +1575,8 @@ private void GhostBanIgnoredUser(string playerName) if (user != null) { // Informing the host like we do when we kick might be annoying. So keep it on the downlow. - channel.SendBanMessage(user.Hostname, 8); - channel.SendKickMessage(user.Name, 8); + channel.SendBanMessage(user.Hostname, priority: 8); + channel.SendKickMessage(user.Name, priority: 8); } } From 24eb444d5432e3d7daf92cd50d2f68f82fe60ac3 Mon Sep 17 00:00:00 2001 From: Grant Bartlett Date: Mon, 3 Feb 2025 14:26:45 +0000 Subject: [PATCH 03/12] Replace tuple --- DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs | 7 ------- DXMainClient/Online/CnCNetManager.cs | 6 +++--- DXMainClient/Online/Connection.cs | 5 ++--- DXMainClient/Online/IConnectionManager.cs | 2 +- 4 files changed, 6 insertions(+), 14 deletions(-) diff --git a/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs b/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs index e52ad4c98..70f694a81 100644 --- a/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs +++ b/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs @@ -993,13 +993,6 @@ private void GameChannel_UserAdded(object sender, Online.ChannelUserEventArgs e) { Channel gameChannel = (Channel)sender; - if (e.User.IRCUser.IsIgnored) - { - // Howboutno - Logger.Log("This user is ignored, so we shouldn't let them in"); - return; - } - if (e.User.IRCUser.Name == ProgramConstants.PLAYERNAME) { ClearGameChannelEvents(gameChannel); diff --git a/DXMainClient/Online/CnCNetManager.cs b/DXMainClient/Online/CnCNetManager.cs index d28da6569..ce3892ff5 100644 --- a/DXMainClient/Online/CnCNetManager.cs +++ b/DXMainClient/Online/CnCNetManager.cs @@ -962,12 +962,12 @@ private void DoServerLatencyTested(int candidateCount, int closerCount) candidateCount, closerCount))); } - public void OnWhoQueryComplete(string channelName, List> whoDataList) + public void OnWhoQueryComplete(string channelName, List<(string ident, string host, string userName, string extraInfo)> whoDataList) { - wm.AddCallback(new Action>>(DoWhoQueryComplete), channelName, whoDataList); + wm.AddCallback(new Action>(DoWhoQueryComplete), channelName, whoDataList); } - private void DoWhoQueryComplete(string channelName, List> whoDataList) + private void DoWhoQueryComplete(string channelName, List<(string ident, string host, string userName, string extraInfo)> whoDataList) { Channel channel = FindChannel(channelName); diff --git a/DXMainClient/Online/Connection.cs b/DXMainClient/Online/Connection.cs index 5962304dd..c1c818009 100644 --- a/DXMainClient/Online/Connection.cs +++ b/DXMainClient/Online/Connection.cs @@ -121,7 +121,7 @@ private bool disconnect private static bool idSet = false; private static string systemId; private static readonly object idLocker = new object(); - private readonly List> whoResponseList = []; + private readonly List<(string ident, string host, string userName, string extraInfo)> whoResponseList = []; public static void SetId(string id) { @@ -620,8 +620,7 @@ private void PerformCommand(string message) connectionManager.OnWhoReplyReceived(parameters[2], parameters[3], parameters[1], string.Empty); break; case 315: // End of WHO query (RPL_ENDOFWHO) - Logger.Log($"END OF WHO QUERY " + parameters[1] + " COUNT:" + whoResponseList.Count); - connectionManager.OnWhoQueryComplete(parameters[1], new List>(whoResponseList)); + connectionManager.OnWhoQueryComplete(parameters[1], new List<(string ident, string host, string userName, string extraInfo)>(whoResponseList)); whoResponseList.Clear(); break; case 433: // Name already in use diff --git a/DXMainClient/Online/IConnectionManager.cs b/DXMainClient/Online/IConnectionManager.cs index a33036baa..57b3a5432 100644 --- a/DXMainClient/Online/IConnectionManager.cs +++ b/DXMainClient/Online/IConnectionManager.cs @@ -22,7 +22,7 @@ public interface IConnectionManager void OnWhoReplyReceived(string ident, string hostName, string userName, string extraInfo); - void OnWhoQueryComplete(string channel, List> whoList); + void OnWhoQueryComplete(string channel, List<(string ident, string host, string userName, string extraInfo)> whoList); void OnChannelFull(string channelName); From 6883e2a907ea6e2cb5831262c8ca9146a3c993a0 Mon Sep 17 00:00:00 2001 From: Grant Bartlett Date: Tue, 4 Feb 2025 09:46:35 +0000 Subject: [PATCH 04/12] Remove redundant list --- DXMainClient/Online/CnCNetManager.cs | 40 ----------------------- DXMainClient/Online/Connection.cs | 7 ++-- DXMainClient/Online/IConnectionManager.cs | 2 -- 3 files changed, 2 insertions(+), 47 deletions(-) diff --git a/DXMainClient/Online/CnCNetManager.cs b/DXMainClient/Online/CnCNetManager.cs index ce3892ff5..55526cda9 100644 --- a/DXMainClient/Online/CnCNetManager.cs +++ b/DXMainClient/Online/CnCNetManager.cs @@ -961,46 +961,6 @@ private void DoServerLatencyTested(int candidateCount, int closerCount) "Lobby servers: {0} available, {1} fast.".L10N("Client:Main:LobbyServerLatencyTestResult"), candidateCount, closerCount))); } - - public void OnWhoQueryComplete(string channelName, List<(string ident, string host, string userName, string extraInfo)> whoDataList) - { - wm.AddCallback(new Action>(DoWhoQueryComplete), channelName, whoDataList); - } - - private void DoWhoQueryComplete(string channelName, List<(string ident, string host, string userName, string extraInfo)> whoDataList) - { - Channel channel = FindChannel(channelName); - - if (channel == null) - return; - - if (!channel.IsChatChannel) - return; - - var channelUserList = new List(); - - foreach (var whoData in whoDataList) - { - (string ident, string host, string userName, string extraInfo) = whoData; - - IRCUser ircUser = new(userName); - ircUser.Ident = ident; - ircUser.Hostname = host; - - UserList.Add(ircUser); - - var channelUser = new ChannelUser(ircUser); - channelUser.IsFriend = cncNetUserData.IsFriend(channelUser.IRCUser.Name); - - channelUserList.Add(channelUser); - } - - UserList = UserList.OrderBy(u => u.Name).ToList(); - MultipleUsersAdded?.Invoke(this, EventArgs.Empty); - UserListInitialized?.Invoke(this, EventArgs.Empty); - - channel.OnUserListReceived(channelUserList); - } } public class UserEventArgs : EventArgs diff --git a/DXMainClient/Online/Connection.cs b/DXMainClient/Online/Connection.cs index c1c818009..c78d48d50 100644 --- a/DXMainClient/Online/Connection.cs +++ b/DXMainClient/Online/Connection.cs @@ -121,7 +121,6 @@ private bool disconnect private static bool idSet = false; private static string systemId; private static readonly object idLocker = new object(); - private readonly List<(string ident, string host, string userName, string extraInfo)> whoResponseList = []; public static void SetId(string id) { @@ -614,15 +613,13 @@ private void PerformCommand(string message) string host = parameters[3]; string wUserName = parameters[5]; string extraInfo = parameters[7]; + Logger.Log("Reply to WHO query"); + connectionManager.OnWhoReplyReceived(ident, host, wUserName, extraInfo); break; case 311: // Reply to WHOIS NAME query connectionManager.OnWhoReplyReceived(parameters[2], parameters[3], parameters[1], string.Empty); break; - case 315: // End of WHO query (RPL_ENDOFWHO) - connectionManager.OnWhoQueryComplete(parameters[1], new List<(string ident, string host, string userName, string extraInfo)>(whoResponseList)); - whoResponseList.Clear(); - break; case 433: // Name already in use message = serverMessagePart + parameters[1] + ": " + parameters[2]; //connectionManager.OnGenericServerMessageReceived(message); diff --git a/DXMainClient/Online/IConnectionManager.cs b/DXMainClient/Online/IConnectionManager.cs index 57b3a5432..c176b9a37 100644 --- a/DXMainClient/Online/IConnectionManager.cs +++ b/DXMainClient/Online/IConnectionManager.cs @@ -22,8 +22,6 @@ public interface IConnectionManager void OnWhoReplyReceived(string ident, string hostName, string userName, string extraInfo); - void OnWhoQueryComplete(string channel, List<(string ident, string host, string userName, string extraInfo)> whoList); - void OnChannelFull(string channelName); void OnTargetChangeTooFast(string channelName, string message); From c2ba61e3ea9522ba55310f2cf33c8214bc7c9dc0 Mon Sep 17 00:00:00 2001 From: Grant Bartlett Date: Tue, 4 Feb 2025 09:47:47 +0000 Subject: [PATCH 05/12] Code as it was --- DXMainClient/Online/IConnectionManager.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/DXMainClient/Online/IConnectionManager.cs b/DXMainClient/Online/IConnectionManager.cs index c176b9a37..f283245ab 100644 --- a/DXMainClient/Online/IConnectionManager.cs +++ b/DXMainClient/Online/IConnectionManager.cs @@ -1,5 +1,4 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; namespace DTAClient.Online { From a22b6b807e4ba69303d526e5de0fbb138197fb3e Mon Sep 17 00:00:00 2001 From: Grant Bartlett Date: Tue, 4 Feb 2025 09:48:29 +0000 Subject: [PATCH 06/12] Remove log --- DXMainClient/Online/Connection.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/DXMainClient/Online/Connection.cs b/DXMainClient/Online/Connection.cs index c78d48d50..ef9764a25 100644 --- a/DXMainClient/Online/Connection.cs +++ b/DXMainClient/Online/Connection.cs @@ -613,8 +613,6 @@ private void PerformCommand(string message) string host = parameters[3]; string wUserName = parameters[5]; string extraInfo = parameters[7]; - Logger.Log("Reply to WHO query"); - connectionManager.OnWhoReplyReceived(ident, host, wUserName, extraInfo); break; case 311: // Reply to WHOIS NAME query From b4ed432131f0a74e7ac2c372edeaf932d2438105 Mon Sep 17 00:00:00 2001 From: Grant Bartlett Date: Tue, 4 Feb 2025 10:11:43 +0000 Subject: [PATCH 07/12] On BanPlayer, add to ignore list too --- .../DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs | 5 +++-- DXMainClient/Online/CnCNetUserData.cs | 10 ++++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs b/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs index 95eff0fa0..4d3c4b109 100644 --- a/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs +++ b/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs @@ -1563,8 +1563,9 @@ protected override void BanPlayer(int playerIndex) if (user != null) { AddNotice(string.Format("Banning and kicking {0} from the game...".L10N("Client:Main:BanAndKickPlayer"), pInfo.Name)); - channel.SendBanMessage(user.Hostname, 8); - channel.SendKickMessage(user.Name, 8); + channel.SendBanMessage(user.Hostname, priority: 8); + channel.SendKickMessage(user.Name, priority: 8); + cncnetUserData.AddIgnoredUser(user.Ident); } } diff --git a/DXMainClient/Online/CnCNetUserData.cs b/DXMainClient/Online/CnCNetUserData.cs index 2f2cb0343..55171cba3 100644 --- a/DXMainClient/Online/CnCNetUserData.cs +++ b/DXMainClient/Online/CnCNetUserData.cs @@ -174,6 +174,16 @@ public void ToggleIgnoreUser(string ident) UserIgnoreToggled?.Invoke(this, new(ident)); } + /// + /// Adds a specified user ident to the chat ignore list + /// + /// + public void AddIgnoredUser(string ident) + { + if (!IgnoreList.Contains(ident)) + IgnoreList.Add(ident); + } + public void AddRecentPlayers(IEnumerable recentPlayerNames, string gameName) { recentPlayerNames = recentPlayerNames.Where(name => name != ProgramConstants.PLAYERNAME); From 8697259cda26d91c0b005abbb07854cc2123a4f7 Mon Sep 17 00:00:00 2001 From: Grant Bartlett Date: Tue, 4 Feb 2025 10:12:38 +0000 Subject: [PATCH 08/12] Comment update --- DXMainClient/Online/CnCNetUserData.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DXMainClient/Online/CnCNetUserData.cs b/DXMainClient/Online/CnCNetUserData.cs index 55171cba3..2608ff429 100644 --- a/DXMainClient/Online/CnCNetUserData.cs +++ b/DXMainClient/Online/CnCNetUserData.cs @@ -177,7 +177,7 @@ public void ToggleIgnoreUser(string ident) /// /// Adds a specified user ident to the chat ignore list /// - /// + /// The ident of the IRCUser. public void AddIgnoredUser(string ident) { if (!IgnoreList.Contains(ident)) From d4a92aac49e1ce8e4ef7954e0152f4617af51628 Mon Sep 17 00:00:00 2001 From: Grant Bartlett Date: Tue, 4 Feb 2025 10:35:01 +0000 Subject: [PATCH 09/12] Remove unused event --- DXMainClient/Online/CnCNetManager.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/DXMainClient/Online/CnCNetManager.cs b/DXMainClient/Online/CnCNetManager.cs index 55526cda9..41ea6017a 100644 --- a/DXMainClient/Online/CnCNetManager.cs +++ b/DXMainClient/Online/CnCNetManager.cs @@ -40,8 +40,6 @@ public class CnCNetManager : IConnectionManager public event EventHandler ReconnectAttempt; public event EventHandler Disconnected; public event EventHandler Connected; - public event EventHandler UserListInitialized; - public event EventHandler UserAdded; public event EventHandler UserGameIndexUpdated; From ff9b96faa44e95a28bc3c05cbf2f4ce68f469a74 Mon Sep 17 00:00:00 2001 From: Grant Bartlett Date: Tue, 4 Feb 2025 15:41:41 +0000 Subject: [PATCH 10/12] Kerb says howboutno --- .../DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs | 1 - DXMainClient/Online/CnCNetUserData.cs | 10 ---------- 2 files changed, 11 deletions(-) diff --git a/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs b/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs index 4d3c4b109..46f972af6 100644 --- a/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs +++ b/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs @@ -1565,7 +1565,6 @@ protected override void BanPlayer(int playerIndex) AddNotice(string.Format("Banning and kicking {0} from the game...".L10N("Client:Main:BanAndKickPlayer"), pInfo.Name)); channel.SendBanMessage(user.Hostname, priority: 8); channel.SendKickMessage(user.Name, priority: 8); - cncnetUserData.AddIgnoredUser(user.Ident); } } diff --git a/DXMainClient/Online/CnCNetUserData.cs b/DXMainClient/Online/CnCNetUserData.cs index 2608ff429..2f2cb0343 100644 --- a/DXMainClient/Online/CnCNetUserData.cs +++ b/DXMainClient/Online/CnCNetUserData.cs @@ -174,16 +174,6 @@ public void ToggleIgnoreUser(string ident) UserIgnoreToggled?.Invoke(this, new(ident)); } - /// - /// Adds a specified user ident to the chat ignore list - /// - /// The ident of the IRCUser. - public void AddIgnoredUser(string ident) - { - if (!IgnoreList.Contains(ident)) - IgnoreList.Add(ident); - } - public void AddRecentPlayers(IEnumerable recentPlayerNames, string gameName) { recentPlayerNames = recentPlayerNames.Where(name => name != ProgramConstants.PLAYERNAME); From 8c4525ad2b13421dab7439c89cd33f76dbeba7ee Mon Sep 17 00:00:00 2001 From: Kerbiter Date: Wed, 5 Feb 2025 15:01:19 +0200 Subject: [PATCH 11/12] Improve codestyle a bit --- DXMainClient/Online/Channel.cs | 13 ++++++------- DXMainClient/Online/CnCNetManager.cs | 5 ++--- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/DXMainClient/Online/Channel.cs b/DXMainClient/Online/Channel.cs index fb6e64add..96e9ecde1 100644 --- a/DXMainClient/Online/Channel.cs +++ b/DXMainClient/Online/Channel.cs @@ -112,15 +112,14 @@ public void AddUser(ChannelUser user) UserAdded?.Invoke(this, new ChannelUserEventArgs(user)); } - public void OnUserJoined(ChannelUser user, bool silentJoin = false) + public void OnUserJoined(ChannelUser user, bool isSilent = false) { AddUser(user); - if (notifyOnUserListChange) + if (notifyOnUserListChange && !isSilent) { - if (!silentJoin) - AddMessage(new ChatMessage( - string.Format("{0} has joined {1}.".L10N("Client:Main:PlayerJoinChannel"), user.IRCUser.Name, UIName))); + AddMessage(new ChatMessage( + string.Format("{0} has joined {1}.".L10N("Client:Main:PlayerJoinChannel"), user.IRCUser.Name, UIName))); } #if !YR @@ -153,7 +152,7 @@ public void OnUserListReceived(List userList) UserListReceived?.Invoke(this, EventArgs.Empty); } - public void OnUserKicked(string userName, bool silentKick = false) + public void OnUserKicked(string userName, bool isSilent = false) { if (users.Remove(userName)) { @@ -162,7 +161,7 @@ public void OnUserKicked(string userName, bool silentKick = false) users.Clear(); } - if (!silentKick) + if (!isSilent) AddMessage(new ChatMessage( string.Format("{0} has been kicked from {1}.".L10N("Client:Main:PlayerKickedFromChannel"), userName, UIName))); diff --git a/DXMainClient/Online/CnCNetManager.cs b/DXMainClient/Online/CnCNetManager.cs index 41ea6017a..7a3097e4d 100644 --- a/DXMainClient/Online/CnCNetManager.cs +++ b/DXMainClient/Online/CnCNetManager.cs @@ -622,9 +622,8 @@ private void DoUserJoinedChannel(string channelName, string host, string userNam channelUser.IsAdmin = isAdmin; channelUser.IsFriend = cncNetUserData.IsFriend(channelUser.IRCUser.Name); - bool ignoredUser = channelUser.IRCUser.IsIgnored; ircUser.Channels.Add(channelName); - channel.OnUserJoined(channelUser, ignoredUser); + channel.OnUserJoined(channelUser, isSilent: channelUser.IRCUser.IsIgnored); //UserJoinedChannel?.Invoke(this, new ChannelUserEventArgs(channelName, userName)); } @@ -650,7 +649,7 @@ private void DoUserKicked(string channelName, string userName) return; ChannelUser kickedUser = channel.Users.Find(userName); - channel.OnUserKicked(userName, kickedUser.IRCUser.IsIgnored); + channel.OnUserKicked(userName, isSilent: kickedUser.IRCUser.IsIgnored); if (userName == ProgramConstants.PLAYERNAME) { From 3d36caff78f28c61428b407f4d463d6c9aef5cb9 Mon Sep 17 00:00:00 2001 From: Kerbiter Date: Wed, 5 Feb 2025 15:01:49 +0200 Subject: [PATCH 12/12] Only ban ignored users if host (part 1) --- DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs b/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs index 46f972af6..5e149616a 100644 --- a/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs +++ b/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs @@ -523,7 +523,7 @@ private void Channel_UserAdded(object sender, ChannelUserEventArgs e) { PlayerInfo pInfo = new PlayerInfo(e.User.IRCUser.Name); - if (e.User.IRCUser.IsIgnored) + if (IsHost && e.User.IRCUser.IsIgnored) { // If this ignored player constantly rejoins, he could cause the host to floodout using the normal RemovePlayer() functionality. // So lets Ghost kickban from gameroom instead. This should only be needed once per created room