예제 #1
0
        private void network_MessageReceived(MeshNetwork.Peer peer, MessageItem message)
        {
            switch (message.Type)
            {
            case MessageType.Info:
                AddMessage(new ChatMessageInfoItem(message), peer.IsSelfPeer);
                break;

            case MessageType.TextMessage:
                ChatMessageTextItem textItem = new ChatMessageTextItem(peer, message);
                textItem.ForwardTo += MessageItem_ForwardTo;

                AddMessage(textItem, peer.IsSelfPeer);
                ShowPeerTypingNotification(peer.ProfileDisplayName, false);
                break;

            case MessageType.InlineImage:
            case MessageType.FileAttachment:
                ChatMessageFileItem fileItem = new ChatMessageFileItem(peer, message);
                fileItem.ForwardTo += MessageItem_ForwardTo;

                AddMessage(fileItem, peer.IsSelfPeer);
                break;
            }
        }
예제 #2
0
        public frmViewProfile(MeshNetwork.Peer peer)
        {
            InitializeComponent();

            _peer = peer;

            ShowDetails(_peer.ProfileDisplayName, _peer.PeerUserId.ToString(), _peer.ProfileStatus, _peer.ProfileStatusMessage, _peer.ProfileDisplayImage);
        }
예제 #3
0
        private void peer_StateChanged(object sender, EventArgs e)
        {
            MeshNetwork.Peer peer = sender as MeshNetwork.Peer;

            if (_network.Type == MeshNetworkType.Private)
            {
                _view.Title = _network.NetworkName;
            }

            //MessageNotification(_network, null, message);
        }
예제 #4
0
        private void network_MessageReceived(MeshNetwork.Peer peer, MessageItem message)
        {
            string msg = null;

            switch (message.Type)
            {
            case MessageType.TextMessage:
                if (peer.IsSelfPeer)
                {
                    msg = message.MessageText;
                }
                else
                {
                    msg = peer.ProfileDisplayName + ": " + message.MessageText;
                }

                break;

            case MessageType.InlineImage:
                if (peer.IsSelfPeer)
                {
                    msg = "shared an image.";
                }
                else
                {
                    msg = peer.ProfileDisplayName + " shared an image.";
                }

                break;

            case MessageType.FileAttachment:
                if (peer.IsSelfPeer)
                {
                    msg = "shared a file.";
                }
                else
                {
                    msg = peer.ProfileDisplayName + " shared a file: " + message.FileName;
                }

                break;
            }

            if (msg != null)
            {
                if (msg.Length > 100)
                {
                    msg = msg.Substring(0, 100) + "...";
                }

                SetLastMessage(msg, message.MessageDate, true);
            }
        }
예제 #5
0
 private void network_MessageDeliveryNotification(MeshNetwork.Peer sender, MessageItem message)
 {
     foreach (Control item in customListView1.Controls)
     {
         IChatMessageItem msgItem = item as IChatMessageItem;
         if ((msgItem != null) && (msgItem.Message.MessageNumber == message.MessageNumber))
         {
             msgItem.DeliveryNotification(message);
             break;
         }
     }
 }
예제 #6
0
        public UserListItem(MeshNetwork.Peer peer)
        {
            InitializeComponent();

            _peer = peer;

            RefreshIcon();
            RefreshText();
            RefreshView();

            _peer.StateChanged += peer_StateChanged;
            _peer.ConnectivityStatusChanged += peer_ConnectivityStatusChanged;
            _peer.ProfileChanged            += peer_ProfileChanged;
        }
예제 #7
0
        private void network_PeerTyping(MeshNetwork.Peer peer)
        {
            //show typing notification
            if ((_network.Type == MeshNetworkType.Private) && !peer.IsSelfPeer)
            {
                labLastMessage.Text = "typing...";
            }
            else
            {
                labLastMessage.Text = peer.ProfileDisplayName + " is typing...";
            }

            labLastMessage.ForeColor = Color.FromArgb(255, 213, 89);

            timerTypingNotification.Stop();
            timerTypingNotification.Start();
        }
예제 #8
0
        private void network_MessageReceived(MeshNetwork.Peer peer, MessageItem message)
        {
            if (!peer.Network.Mute && (!this.Visible || !ApplicationIsActivated()))
            {
                string msg;

                switch (message.Type)
                {
                case MessageType.TextMessage:
                    msg = message.MessageText;
                    break;

                case MessageType.InlineImage:
                    msg = "shared an image.";
                    break;

                case MessageType.FileAttachment:
                    msg = "shared a file '" + message.FileName + "'";
                    break;

                default:
                    return;
                }

                lock (_profileManager.SystemTrayIcon)
                {
                    if (peer.Network.Type == MeshNetworkType.Private)
                    {
                        _profileManager.SystemTrayIcon.ShowBalloonTip(30000, peer.Network.NetworkName + " - Mesh App", msg, ToolTipIcon.Info);
                    }
                    else
                    {
                        _profileManager.SystemTrayIcon.ShowBalloonTip(30000, peer.Network.NetworkName + " - Mesh App", peer.ProfileDisplayName + ": " + msg, ToolTipIcon.Info);
                    }

                    _profileManager.SystemTrayIcon.Tag = this;
                }

                _sndMessageNotification.Play();
            }
        }
예제 #9
0
 private void network_GroupImageChanged(MeshNetwork.Peer peer)
 {
     RefreshIcon();
 }
예제 #10
0
        public frmViewUserDetails(MeshNetwork.Peer peer)
        {
            InitializeComponent();

            _peer = peer;

            //name
            {
                string name = _peer.ProfileDisplayName;

                //name icon
                if (name.Length > 0)
                {
                    labIcon.Text = name.Substring(0, 1).ToUpper();

                    int x = name.LastIndexOf(" ", StringComparison.CurrentCultureIgnoreCase);
                    if (x > 0)
                    {
                        labIcon.Text += name.Substring(x + 1, 1).ToUpper();
                    }
                    else if (name.Length > 1)
                    {
                        labIcon.Text += name.Substring(1, 1).ToLower();
                    }
                }
                else
                {
                    labIcon.Text = "";
                }

                if (_peer.IsOnline)
                {
                    labIcon.BackColor = Color.FromArgb(102, 153, 255);
                }
                else
                {
                    labIcon.BackColor = Color.Gray;
                }

                labName.Text = name;
            }

            //status
            labStatus.Text = _peer.ProfileStatusMessage;

            switch (_peer.ProfileStatus)
            {
            case MeshProfileStatus.Inactive:
                labStatus.Text = "(Inactive) " + labStatus.Text;
                break;

            case MeshProfileStatus.Busy:
                labStatus.Text = "(Busy) " + labStatus.Text;
                break;
            }

            //userId
            labUserId.Text = _peer.PeerUserId.ToString();

            //image icon
            if ((_peer.ProfileDisplayImage != null) && (_peer.ProfileDisplayImage.Length > 0))
            {
                using (MemoryStream mS = new MemoryStream(_peer.ProfileDisplayImage))
                {
                    picIcon.Image = new Bitmap(Image.FromStream(mS), picIcon.Size);
                }

                picIcon.Visible = true;
                labIcon.Visible = false;
            }

            //network status
            switch (_peer.ConnectivityStatus)
            {
            case MeshNetwork.PeerConnectivityStatus.NoNetwork:
                labNetworkStatus.Text      = "No Network";
                labNetworkStatus.ForeColor = Color.DimGray;
                picNetwork.Image           = Properties.Resources.NoNetwork;
                break;

            case MeshNetwork.PeerConnectivityStatus.PartialMeshNetwork:
                labNetworkStatus.Text      = "Partial Mesh Network";
                labNetworkStatus.ForeColor = Color.OrangeRed;
                picNetwork.Image           = Properties.Resources.PartialNetwork;
                break;

            case MeshNetwork.PeerConnectivityStatus.FullMeshNetwork:
                labNetworkStatus.Text      = "Full Mesh Network";
                labNetworkStatus.ForeColor = Color.Green;
                picNetwork.Image           = Properties.Resources.FullNetwork;
                break;

            default:
                labNetworkStatus.Text      = "Unknown";
                labNetworkStatus.ForeColor = Color.DimGray;
                picNetwork.Image           = Properties.Resources.NoNetwork;
                break;
            }

            //cipher suite
            if (_peer.CipherSuite == SecureChannelCipherSuite.None)
            {
                labCipherSuite.Text = "Not applicable";
            }
            else
            {
                labCipherSuite.Text = _peer.CipherSuite.ToString();
            }

            //connected with
            MeshNetworkPeerInfo[] connectedWith = _peer.ConnectedWith;

            foreach (MeshNetworkPeerInfo peerInfo in connectedWith)
            {
                string peerIPs = null;

                foreach (EndPoint peerEP in peerInfo.PeerEPs)
                {
                    if (peerIPs == null)
                    {
                        peerIPs = peerEP.ToString();
                    }
                    else
                    {
                        peerIPs += ", " + peerEP.ToString();
                    }
                }

                lstConnectedWith.Items.Add(peerInfo.PeerDisplayName + " [" + peerInfo.PeerUserId.ToString() + "]").SubItems.Add(peerIPs);
            }

            //not connected with
            MeshNetworkPeerInfo[] notConnectedWith = _peer.NotConnectedWith;

            foreach (MeshNetworkPeerInfo peerInfo in notConnectedWith)
            {
                string peerIPs = null;

                foreach (EndPoint peerEP in peerInfo.PeerEPs)
                {
                    if (peerIPs == null)
                    {
                        peerIPs = peerEP.ToString();
                    }
                    else
                    {
                        peerIPs += ", " + peerEP.ToString();
                    }
                }

                lstNotConnectedWith.Items.Add(peerInfo.PeerDisplayName + " [" + peerInfo.PeerUserId.ToString() + "]").SubItems.Add(peerIPs);
            }
        }
예제 #11
0
        public ChatMessageFileItem(MeshNetwork.Peer senderPeer, MessageItem message)
        {
            InitializeComponent();

            _senderPeer = senderPeer;
            _message    = message;

            lblFileName.Text    = _message.FileName;
            lblContentType.Text = WebUtilities.GetContentType(_message.FileName).ToString();
            lblFileSize.Text    = WebUtilities.GetFormattedSize(_message.FileSize);

            TimeSpan span = DateTime.UtcNow.Date - _message.MessageDate.Date;

            if (span.TotalDays >= 7)
            {
                lblDateTime.Text = _message.MessageDate.ToLocalTime().ToString();
            }
            else if (span.TotalDays >= 2)
            {
                lblDateTime.Text = _message.MessageDate.ToLocalTime().DayOfWeek.ToString() + " " + _message.MessageDate.ToLocalTime().ToShortTimeString();
            }
            else if (span.TotalDays >= 1)
            {
                lblDateTime.Text = "Yesterday " + _message.MessageDate.ToLocalTime().ToShortTimeString();
            }
            else
            {
                lblDateTime.Text = _message.MessageDate.ToLocalTime().ToShortTimeString();
            }

            toolTip1.SetToolTip(lblDateTime, _message.MessageDate.ToLocalTime().ToString());

            if (_senderPeer.IsSelfPeer)
            {
                if (File.Exists(_message.FilePath))
                {
                    linkAction.Visible = true;
                    linkAction.Text    = "Open";
                }
                else
                {
                    linkAction.Visible = false;
                }

                pbDownloadProgress.Visible = false;
            }
            else if (WasFileDownloaded())
            {
                linkAction.Visible         = true;
                linkAction.Text            = "Open";
                pbDownloadProgress.Visible = false;
            }
            else
            {
                linkAction.Visible         = true;
                linkAction.Text            = "Download";
                pbDownloadProgress.Visible = false;
            }

            if (_senderPeer == null)
            {
                lblUsername.Text = _message.SenderUserId.ToString();
            }
            else
            {
                lblUsername.Text = _senderPeer.ProfileDisplayName;

                if (_senderPeer.IsSelfPeer)
                {
                    lblUsername.ForeColor  = Color.FromArgb(63, 186, 228);
                    pnlBubble.Left         = this.Width - pnlBubble.Width - 20;
                    pnlBubble.Anchor       = AnchorStyles.Top | AnchorStyles.Right;
                    picPointLeft.Visible   = false;
                    picPointRight.Visible  = true;
                    mnuMessageInfo.Visible = true;

                    switch (_message.GetDeliveryStatus())
                    {
                    case MessageDeliveryStatus.Undelivered:
                        if (_senderPeer.Network.Type == MeshNetworkType.Private)
                        {
                            picDeliveryStatus.Image = Properties.Resources.waiting;
                        }
                        else
                        {
                            if ((_message.Recipients.Length > 0) && ((DateTime.UtcNow - _message.MessageDate).TotalSeconds < 10))
                            {
                                picDeliveryStatus.Image = Properties.Resources.waiting;
                                timer1.Start();
                            }
                            else
                            {
                                picDeliveryStatus.Image = Properties.Resources.message_failed;
                            }
                        }

                        break;

                    case MessageDeliveryStatus.PartiallyDelivered:
                        picDeliveryStatus.Image = Properties.Resources.single_tick;
                        break;

                    case MessageDeliveryStatus.Delivered:
                        picDeliveryStatus.Image = Properties.Resources.double_ticks;
                        break;

                    default:
                        picDeliveryStatus.Image = null;
                        break;
                    }

                    picDeliveryStatus.Visible = (picDeliveryStatus.Image != null);
                }
                else
                {
                    lblDateTime.Left = pnlBubble.Width - lblDateTime.Width - 2;
                }
            }
        }
예제 #12
0
        public frmMessageInfo(MeshNetwork.Peer selfPeer, MessageItem message)
        {
            this.SuspendLayout();

            InitializeComponent();

            CustomListViewItem displayItem;

            switch (message.Type)
            {
            case MessageType.TextMessage:
                ChatMessageTextItem textItem = new ChatMessageTextItem(selfPeer, message);
                textItem.Anchor           = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
                textItem.Width            = chatMessagePanel.Width - 30;
                textItem.ContextMenuStrip = null;

                displayItem = textItem;
                break;

            case MessageType.FileAttachment:
                ChatMessageFileItem fileItem = new ChatMessageFileItem(selfPeer, message);
                fileItem.Anchor           = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
                fileItem.Width            = chatMessagePanel.Width - 30;
                fileItem.ContextMenuStrip = null;

                displayItem = fileItem;
                break;

            default:
                return;
            }

            if (displayItem.Height > 150)
            {
                chatMessagePanel.Height = 140;
            }
            else
            {
                chatMessagePanel.Height = displayItem.Height + 10;

                int heightDiff = 150 - chatMessagePanel.Height;

                this.Height   -= heightDiff;
                listView1.Top -= heightDiff;
                btnClose.Top  -= heightDiff;
            }

            chatMessagePanel.Controls.Add(displayItem);

            MeshNetwork.Peer[] peers = selfPeer.Network.GetPeers();

            foreach (MessageRecipient rcpt in message.Recipients)
            {
                string rcptName = null;

                foreach (MeshNetwork.Peer peer in peers)
                {
                    if (peer.PeerUserId.Equals(rcpt.UserId))
                    {
                        rcptName = peer.ProfileDisplayName;
                        break;
                    }
                }

                if (rcptName == null)
                {
                    rcptName = rcpt.UserId.ToString();
                }

                ListViewItem item = listView1.Items.Add(rcptName);

                switch (rcpt.Status)
                {
                case MessageRecipientStatus.Delivered:
                    item.SubItems.Add("Delivered on " + rcpt.DeliveredOn.ToLocalTime().ToString());
                    break;

                case MessageRecipientStatus.Undelivered:
                    item.SubItems.Add("Undelivered");
                    break;
                }
            }

            this.ResumeLayout();
        }
예제 #13
0
        private List <CustomListViewItem> ConvertToListViewItems(MessageItem[] items, bool updateLastMessageInChatItem)
        {
            MeshNetwork.Peer[] peerList = _network.GetPeers();

            List <CustomListViewItem> listItems = new List <CustomListViewItem>(items.Length);
            DateTime lastItemDate    = new DateTime();
            string   lastMessage     = null;
            DateTime lastMessageDate = new DateTime();

            foreach (MessageItem item in items)
            {
                if (lastItemDate.Date < item.MessageDate.Date)
                {
                    lastItemDate = item.MessageDate;
                    listItems.Add(new ChatMessageInfoItem(new MessageItem(lastItemDate)));
                }

                switch (item.Type)
                {
                case MessageType.Info:
                    listItems.Add(new ChatMessageInfoItem(item));
                    break;

                case MessageType.TextMessage:
                {
                    MeshNetwork.Peer sender = null;

                    foreach (MeshNetwork.Peer peer in peerList)
                    {
                        if (peer.PeerUserId.Equals(item.SenderUserId))
                        {
                            sender = peer;
                            break;
                        }
                    }

                    if (sender == null)
                    {
                        continue;
                    }

                    ChatMessageTextItem textItem = new ChatMessageTextItem(sender, item);
                    textItem.ForwardTo += MessageItem_ForwardTo;

                    listItems.Add(textItem);

                    if (sender == null)
                    {
                        lastMessage = item.SenderUserId + ": " + item.MessageText;
                    }
                    else if (sender.IsSelfPeer)
                    {
                        lastMessage = item.MessageText;
                    }
                    else
                    {
                        lastMessage = sender.ProfileDisplayName + ": " + item.MessageText;
                    }

                    lastMessageDate = item.MessageDate;
                }
                break;

                case MessageType.InlineImage:
                case MessageType.FileAttachment:
                {
                    MeshNetwork.Peer sender = null;

                    foreach (MeshNetwork.Peer peer in peerList)
                    {
                        if (peer.PeerUserId.Equals(item.SenderUserId))
                        {
                            sender = peer;
                            break;
                        }
                    }

                    if (sender == null)
                    {
                        continue;
                    }

                    ChatMessageFileItem fileItem = new ChatMessageFileItem(sender, item);
                    fileItem.ForwardTo += MessageItem_ForwardTo;

                    listItems.Add(fileItem);

                    string messageText = item.MessageText;
                    if (string.IsNullOrEmpty(messageText))
                    {
                        messageText = "file attachment";
                    }

                    if (sender == null)
                    {
                        lastMessage = item.SenderUserId + ": " + messageText;
                    }
                    else if (sender.IsSelfPeer)
                    {
                        lastMessage = messageText;
                    }
                    else
                    {
                        lastMessage = sender.ProfileDisplayName + ": " + messageText;
                    }

                    lastMessageDate = item.MessageDate;
                }
                break;
                }
            }

            if (updateLastMessageInChatItem && (lastMessage != null))
            {
                _chatItem.SetLastMessage(lastMessage, lastMessageDate, false);
            }

            return(listItems);
        }
예제 #14
0
 private void network_PeerTyping(MeshNetwork.Peer peer)
 {
     ShowPeerTypingNotification(peer.ProfileDisplayName, true);
 }
예제 #15
0
        public ChatMessageTextItem(MeshNetwork.Peer senderPeer, MessageItem message)
        {
            InitializeComponent();

            this.SuspendLayout();

            _senderPeer = senderPeer;
            _message    = message;

            lblMessage.Text = _message.MessageText;

            TimeSpan span = DateTime.UtcNow.Date - _message.MessageDate.Date;

            if (span.TotalDays >= 7)
            {
                lblDateTime.Text = _message.MessageDate.ToLocalTime().ToString();
            }
            else if (span.TotalDays >= 2)
            {
                lblDateTime.Text = _message.MessageDate.ToLocalTime().DayOfWeek.ToString() + " " + _message.MessageDate.ToLocalTime().ToShortTimeString();
            }
            else if (span.TotalDays >= 1)
            {
                lblDateTime.Text = "Yesterday " + _message.MessageDate.ToLocalTime().ToShortTimeString();
            }
            else
            {
                lblDateTime.Text = _message.MessageDate.ToLocalTime().ToShortTimeString();
            }

            toolTip1.SetToolTip(lblDateTime, _message.MessageDate.ToLocalTime().ToString());

            if (_senderPeer == null)
            {
                lblUsername.Text = _message.SenderUserId.ToString();
            }
            else
            {
                lblUsername.Text = _senderPeer.ProfileDisplayName;

                if (_senderPeer.IsSelfPeer)
                {
                    lblUsername.ForeColor  = Color.FromArgb(63, 186, 228);
                    pnlBubble.Left         = this.Width - pnlBubble.Width - 20;
                    picPointLeft.Visible   = false;
                    picPointRight.Visible  = true;
                    mnuMessageInfo.Visible = true;

                    switch (_message.GetDeliveryStatus())
                    {
                    case MessageDeliveryStatus.Undelivered:
                        if (_senderPeer.Network.Type == MeshNetworkType.Private)
                        {
                            picDeliveryStatus.Image = Properties.Resources.waiting;
                        }
                        else
                        {
                            if ((_message.Recipients.Length > 0) && ((DateTime.UtcNow - _message.MessageDate).TotalSeconds < 10))
                            {
                                picDeliveryStatus.Image = Properties.Resources.waiting;
                                timer1.Start();
                            }
                            else
                            {
                                picDeliveryStatus.Image = Properties.Resources.message_failed;
                            }
                        }

                        break;

                    case MessageDeliveryStatus.PartiallyDelivered:
                        picDeliveryStatus.Image = Properties.Resources.single_tick;
                        break;

                    case MessageDeliveryStatus.Delivered:
                        picDeliveryStatus.Image = Properties.Resources.double_ticks;
                        break;

                    default:
                        picDeliveryStatus.Image = null;
                        break;
                    }

                    picDeliveryStatus.Visible = (picDeliveryStatus.Image != null);
                }
            }

            this.ResumeLayout();

            ResizeByTextSize();
        }
예제 #16
0
        private void network_PeerAdded(MeshNetwork.Peer peer)
        {
            lstUsers.AddItem(new UserListItem(peer));

            peer.StateChanged += peer_StateChanged;
        }