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);
        }