From ee387ac9cc78f9b97a510a9cac86ab8c73b742b6 Mon Sep 17 00:00:00 2001 From: Elijah R Date: Wed, 3 Jan 2024 17:59:15 -0500 Subject: [PATCH] fix a fun little race condition --- collab-vm-server-1.3/User.cs | 2 +- collab-vm-server-1.3/VM.cs | 30 +++++++++++++++--------------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/collab-vm-server-1.3/User.cs b/collab-vm-server-1.3/User.cs index c7fa870..9435fb7 100644 --- a/collab-vm-server-1.3/User.cs +++ b/collab-vm-server-1.3/User.cs @@ -152,7 +152,7 @@ public class User this.vm = vm; await this.SendAsync(Guacutils.Encode("connect", "1", "1", vm.Controller.Snapshots ? "1" : "0", "0")); List usermsg = new(new[] { "adduser", vm.Users.Count.ToString() }); - foreach (User user in vm.Users) + foreach (User user in vm.Users.ToArray()) { usermsg.Add(user.Username); usermsg.Add(((int)user.Rank).ToString()); diff --git a/collab-vm-server-1.3/VM.cs b/collab-vm-server-1.3/VM.cs index f658733..350e8df 100644 --- a/collab-vm-server-1.3/VM.cs +++ b/collab-vm-server-1.3/VM.cs @@ -40,7 +40,7 @@ public class VM private void ControllerOnScreenSize(object? sender, Size e) { // Send the new size to all users - foreach (User user in this.Users) + foreach (User user in this.Users.ToArray()) { if (screenHidden && user.Rank == Rank.Unregistered) continue; user.SendScreenSize(e); @@ -66,7 +66,7 @@ public class VM var jpeg = ms.GetBuffer(); var jpg64 = Convert.ToBase64String(jpeg); // Send the dirty rect to all users - foreach (User user in this.Users) + foreach (User user in this.Users.ToArray()) { if (screenHidden && user.Rank == Rank.Unregistered) continue; user.SendRect(jpg64, e.X, e.Y); @@ -122,7 +122,7 @@ public class VM }; user.Renamed += async (_, e) => { - foreach (User u in this.Users) + foreach (User u in this.Users.ToArray()) { await u.SendRename(e, user.Username!, user.Rank); } @@ -136,15 +136,15 @@ public class VM { this.Vote.ClearVote(user); var status = this.Vote.GetStatus(); - foreach (User u in this.Users) + foreach (User u in this.Users.ToArray()) await u.SendVoteUpdate(status); } - foreach (User u in this.Users) + foreach (User u in this.Users.ToArray()) { await u.SendDisconnect(user.Username!); } }; - foreach (User u in this.Users) + foreach (User u in this.Users.ToArray()) { await u.SendNewUser(user.Username!, user.Rank); } @@ -153,7 +153,7 @@ public class VM public async Task SendChat(User user, string message, bool xss = false, bool excludeAdmins = false) { var messageSanitized = WebUtility.HtmlEncode(message); - foreach (User u in this.Users) + foreach (User u in this.Users.ToArray()) { if (xss && (u.Rank != Rank.Admin || !excludeAdmins)) await u.SendChat(user.Username!, message); @@ -175,7 +175,7 @@ public class VM public async Task ReannounceUser(User user) { - foreach (var u in this.Users) + foreach (var u in this.Users.ToArray()) { await u.SendNewUser(user.Username, user.Rank); } @@ -184,7 +184,7 @@ public class VM public async Task SendTurnQueue(TurnStatus? s = null) { TurnStatus status = s ?? this.TurnQueue.CurrentTurn(); - foreach (User u in this.Users) + foreach (User u in this.Users.ToArray()) { u.IPData!.IsTurning = status.Queue.Contains(u); await u.SendTurnUpdate(status); @@ -200,34 +200,34 @@ public class VM { this.Vote = null; this.VoteCooldown.Run(); - foreach (var u in Users) + foreach (var u in Users.ToArray()) { u.IPData!.IsVoting = false; await u.SendAsync(Guacutils.Encode("vote", "2")); } if (e.Result) { - foreach (var u in Users) + foreach (var u in Users.ToArray()) await u.SendChat("", "The vote to reset the VM has won."); await this.Controller.Reset(); } else { - foreach (var u in Users) + foreach (var u in Users.ToArray()) await u.SendChat("", "The vote to reset the VM has lost."); } }; - foreach (User u in this.Users) + foreach (User u in this.Users.ToArray()) { await u.SendAsync(Guacutils.Encode("vote", "0")); await u.SendChat("", $"{user.Username} has started a vote to reset the VM."); } } else - foreach (User u in this.Users) + foreach (User u in this.Users.ToArray()) await u.SendChat("", $"{user.Username} has voted {(vote ? "yes" : "no")}."); this.Vote.Vote(user, vote); var status = this.Vote.GetStatus(); - foreach (User u in this.Users) + foreach (User u in this.Users.ToArray()) await u.SendVoteUpdate(status); }