private async Task RemoveFromParty(Party party, params string[] names) { if (party.UserNames.Count == 2 && names.Any(x => party.UserNames.Contains(x))) { names = party.UserNames.ToArray(); // party has just two people and we remove one of them -> remove all } // removing user before changing party removes all party users if (await server.MatchMaker.RemoveUser(names.First(), true)) { await server.UserLogSay($"Removed {names.First()}'s party from MM because someone left the party"); } var broadcastNames = party.UserNames.ToList(); foreach (var n in names) { var conus = server.ConnectedUsers.Get(n); var lobus = conus?.User; if (lobus != null) { lobus.PartyID = null; } party.UserNames.Remove(n); broadcastNames.Add(n); if (conus != null) { await conus.Process(new LeaveChannel() { ChannelName = party.ChannelName }); } } var ps = new OnPartyStatus() { PartyID = party.PartyID, UserNames = party.UserNames }; if (party.UserNames.Count == 0) { parties.Remove(party); } await server.Broadcast(AddFriendsBy(broadcastNames), ps); }
private async Task AddToParty(Party party, params string[] names) { var isChange = false; foreach (var n in names) { if (!party.UserNames.Contains(n)) { var conus = server.ConnectedUsers.Get(n); var lobus = conus?.User; if (lobus != null) { lobus.PartyID = party.PartyID; } party.UserNames.Add(n); isChange = true; if (conus != null) { await conus.Process(new JoinChannel() { ChannelName = party.ChannelName }); } } } var ps = new OnPartyStatus() { PartyID = party.PartyID, UserNames = party.UserNames }; if (isChange) { // remove all people from this party from mm if (await server.MatchMaker.RemoveUser(names.First(), true)) { await server.UserLogSay($"Removed {names.First()}'s party from MM because someone joined the party"); } } await server.Broadcast(AddFriendsBy(party.UserNames), ps); }