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