private void Challenge_OnMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            KulamiPeer peer = PlayersListBox.SelectedPeer();

            if (peer == null)
            {
                return;
            }

            //todo: make this an animation instead
            if (OutgoingChallengesCanvas.Visibility == Visibility.Hidden)
            {
                OutgoingChallengesCanvas.Visibility = Visibility.Visible;
            }

            if (OutgoingChallengesListBox.Contains(peer))
            {
                OutgoingChallengesListBox.UpdatePeer(peer);
            }
            else
            {
                OutgoingChallengesListBox.AddPeer(peer);
            }

            // todo make this random number
            peer.SendRequest(5, true);
        }
        private void peer_update(KulamiPeer peer)
        {
            Dispatcher.Invoke(() =>
            {
                if (string.IsNullOrEmpty(peer.Name) || !peer.InLobby)
                {
                    PlayersListBox.RemovePeer(peer, null);
                    IncomingChallengesListBox.RemovePeer(peer, IncomingChallengesCanvas);
                    OutgoingChallengesListBox.RemovePeer(peer, OutgoingChallengesCanvas);
                    return;
                }

                PlayersListBox.AddOrUpdatePeer(peer);
                IncomingChallengesListBox.UpdatePeer(peer);
                OutgoingChallengesListBox.UpdatePeer(peer);
            });
        }
        private void ChallengeCancel_OnMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            KulamiPeer peer = OutgoingChallengesListBox.SelectedPeer();

            if (peer == null)
            {
                return;
            }

            //todo: rescind challenge request for selected peer
            peer.SendResponse(false);

            OutgoingChallengesListBox.RemovePeer(peer, OutgoingChallengesCanvas);

            //todo: make this an animation instead
            if (!OutgoingChallengesListBox.HasItems)
            {
                OutgoingChallengesCanvas.Visibility = Visibility.Hidden;
            }
        }
        private void on_peer_connect_change(object sender, NetConnectionEventArgs e)
        {
            KulamiPeer peer = sender as KulamiPeer;

            if (peer == null)
            {
                return;
            }

            if (e.Connected)
            {
                return;
            }

            Dispatcher.Invoke(() =>
            {
                PlayersListBox.RemovePeer(peer, null);
                IncomingChallengesListBox.RemovePeer(peer, IncomingChallengesCanvas);
                OutgoingChallengesListBox.RemovePeer(peer, OutgoingChallengesCanvas);
            });
        }