示例#1
0
        private void PeerButtonClick(object sender, RoutedEventArgs e)
        {
            var button          = (Button)sender;
            var peerContextData = _peersByButtons[button];

            CurrentPeer.PeerButton.Background = PEER_BUTTON_NO_MESSAGES_COLOR;

            CurrentPeer       = peerContextData;
            button.Background = PEER_BUTTON_CURRENT_COLOR;

            OuputPeerMessages(CurrentPeer);
        }
示例#2
0
        internal void OuputPeerMessages(PeerContextData peer)
        {
            if (peer == CurrentPeer)
            {
                var messages = new StringBuilder();
                foreach (var message in CurrentPeer.Messages)
                {
                    messages.Append(message.From.DisplayedName + SENDER_SEPARATOR + message.Content + Environment.NewLine);
                }

                MessagesHistoryTextBlock.Text = messages.ToString();
            }
            else
            {
                var button = peer.PeerButton;
                button.Background = PEER_BUTTON_MESSAGE_RECEIVED_COLOR;
            }
        }
示例#3
0
        private void ShiftCurrentUser()
        {
            CurrentPeer.PeerButton.Background = PEER_BUTTON_NO_MESSAGES_COLOR;

            var indexOfCurrent = AvailablePeers.ToList().IndexOf(CurrentPeer);

            if (AvailablePeers.Count < indexOfCurrent + 2)
            {
                CurrentPeer = AvailablePeers[0];
            }
            else
            {
                CurrentPeer = AvailablePeers[indexOfCurrent + 1];
            }

            CurrentPeer.PeerButton.Background = PEER_BUTTON_CURRENT_COLOR;
            OuputPeerMessages(CurrentPeer);
        }
示例#4
0
        public void ExcludePeer(string displayedName)
        {
            if (CurrentPeer.PeerEntry.DisplayedName == displayedName)
            {
                var nextPeer = AvailablePeers.FirstOrDefault(x => x.PeerEntry.DisplayedName != displayedName);
                if (nextPeer == null)
                {
                    MessagesHistoryTextBlock.Text = string.Empty;
                }
                else
                {
                    OuputPeerMessages(nextPeer);
                    CurrentPeer = nextPeer;
                    nextPeer.PeerButton.Background = PEER_BUTTON_CURRENT_COLOR;
                }
            }

            _peersByButtons = _peersByButtons.Where(x => x.Value.PeerEntry.DisplayedName != displayedName)
                              .ToDictionary(x => x.Key, x => x.Value);
            AvailablePeers = _peersByButtons.Values.ToList();
            RefreshPeerPanel();
        }
示例#5
0
        private void SendMessage()
        {
            var messageToSend = MessageTextBox.Text;

            if (string.IsNullOrEmpty(messageToSend))
            {
                return;
            }

            if (CurrentPeer != null)
            {
                try
                {
                    var internalMessage = new Message(_user, messageToSend);

                    var msgOverNet = new MessageOverNet(_user, messageToSend);
                    var msgStr     = JsonConvert.SerializeObject(msgOverNet);

                    CurrentPeer.PeerEntry.ServiceProxy.SendMessage(msgStr);
                    CurrentPeer.Messages.Add(internalMessage);

                    MessagesHistoryTextBlock.Text += _user.DisplayedName + SENDER_SEPARATOR + messageToSend + Environment.NewLine;
                }
                catch (CommunicationException ex)
                {
                    _logger.Error($"Connection aborted. Host: {CurrentPeer.PeerEntry.Address}");
                    MessageBox.Show($"User {CurrentPeer.PeerEntry.DisplayedName} disconected");

                    _peersByButtons = _peersByButtons.Where(x => x.Key != CurrentPeer.PeerButton).ToDictionary(x => x.Key, x => x.Value);
                    AvailablePeers  = _peersByButtons.Select(x => x.Value).ToList();
                    CurrentPeer     = AvailablePeers.FirstOrDefault();
                    RefreshPeerPanel();
                }
            }
            MessageTextBox.Text = string.Empty;
        }
示例#6
0
        private void OnPeerResolveComplete(object sender, ResolveCompletedEventArgs e)
        {
            var peerPanel = this.PeerListPanel;

            _uiSyncContex.Send(state =>
            {
                try
                {
                    _logger.Debug("Updating peer list...");

                    var existedEntries    = _peersByButtons.Values.ToList();
                    var newPeersByButtons = new Dictionary <Button, PeerContextData>();

                    var newEntries = new List <KeyValuePair <Button, PeerContextData> >();
                    foreach (var foundPeer in _foundPeers)
                    {
                        var entry = existedEntries.FirstOrDefault(x => x.PeerEntry.DisplayedName == foundPeer.DisplayedName);
                        if (entry == null) // new peer
                        {
                            var button = new Button()
                            {
                                Width      = peerPanel.Width,
                                Height     = 25,
                                Content    = foundPeer.DisplayedName,
                                Background = PEER_BUTTON_NO_MESSAGES_COLOR
                            };
                            button.Click += PeerButtonClick;

                            var entryContex = new PeerContextData(foundPeer, button);
                            newEntries.Add(new KeyValuePair <Button, PeerContextData>(button, entryContex));
                        }
                        else
                        {
                            newPeersByButtons.Add(_peersByButtons.First(x => x.Value == entry).Key, entry);
                        }
                    }
                    foreach (var newEntry in newEntries)
                    {
                        newPeersByButtons.Add(newEntry.Key, newEntry.Value);
                    }
                    var oldKeys = _peersByButtons.Keys.ToList();
                    if (_peersByButtons != null && _peersByButtons.Count > 0)
                    {
                        newPeersByButtons = newPeersByButtons.OrderBy(x => oldKeys.IndexOf(x.Key))
                                            .ToDictionary(x => x.Key, y => y.Value);
                    }

                    _peersByButtons = newPeersByButtons;
                    AvailablePeers  = _peersByButtons.Values.ToList();

                    if ((AvailablePeers.Any() && CurrentPeer == null) ||
                        (AvailablePeers.Any() && !AvailablePeers.Contains(CurrentPeer)))
                    {
                        CurrentPeer = AvailablePeers.First();
                        CurrentPeer.PeerButton.Background = PEER_BUTTON_CURRENT_COLOR;
                    }

                    RefreshPeerPanel();

                    _canUpdatePeers = true;
                    _logger.Debug($"Peer list update is completed. Number of peers: {_peersByButtons.Count}");
                }
                catch (Exception ex)
                {
                    _logger.Error(ex, $"Cannot update peer list: {ex.Message}");
                }
            }, new object());
        }