public Multicast(Unicast uni, MediaElement msgPop, ListView recentList) { multicastIP = new HostName(ChatScreen.applicationData.Multicast_ip); multicastPort = ChatScreen.applicationData.Multicast_port; unicast = uni; recentMessageList = recentList; messageSound = msgPop; socketIsConnected = false; packet = new MulticastPacket(ChatScreen.loggedInUser, true); SetUpLocalFolder(); JoinMulticastGroup(); }
private async void SocketOnMessageReceived(DatagramSocket sender, DatagramSocketMessageReceivedEventArgs args) { Conversation WasSelected = null; var myDisp = CoreApplication.MainView.CoreWindow.Dispatcher; await myDisp.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () => { if (recentMessageList.SelectedItem != null) { WasSelected = recentMessageList.SelectedItem as Conversation; } }); var result = args.GetDataStream(); var resultStream = result.AsStreamForRead(1024); using (var reader = new StreamReader(resultStream)) { string encryptedString = await reader.ReadToEndAsync(); string text = StringCipher.Decrypt(encryptedString); if (text.StartsWith("trending")) { string[] splitted = text.Split(new char[] { '~', '|', '*' }); string senderUsername = splitted[3]; string trendingMessage = splitted[6]; User trendingUser = null; Message rMessage = new Message() { Type = Message.MessageType.Text, ReceivedSide = true, Text = trendingMessage, UnRead = true }; var disp = CoreApplication.MainView.CoreWindow.Dispatcher; await disp.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () => { foreach (User u in ChatScreen.availableUsers) { if (u.Username.Equals(senderUsername)) { trendingUser = u; } } if (trendingUser == null) { return; // change this to request the user later } if (trendingUser.Username.Equals(ChatScreen.loggedInUser.Username)) { return; } rMessage.MsgUser = trendingUser; foreach (Conversation c in ChatScreen.recentMessages) { if (c.MessageUser.Username.Equals("trending")) { if (c.LastMessage.MsgUser != null) { if (c.LastMessage.Text.Equals(rMessage.Text) && c.LastMessage.MsgUser.Username.Equals(trendingUser.Username)) { return; } } if (WasSelected == c) { rMessage.UnRead = false; } c.Messages.Add(rMessage); c.LastMessage = rMessage; if (ChatScreen.recentMessages.IndexOf(c) != 0) { ChatScreen.recentMessages.Move(ChatScreen.recentMessages.IndexOf(c), 0); } if (WasSelected != null) { recentMessageList.SelectedItem = WasSelected; } messageSound.Play(); StoreConversations(); return; } } }); return; } User incomingUser = getUser(text); //return if the user is same as the logged-in user if (incomingUser.Username.Equals(ChatScreen.loggedInUser.Username)) { return; } foreach (User u in ChatScreen.blockedUsers.ToList()) { if (u.Username.Equals(incomingUser.Username)) { return; } } foreach (User u in ChatScreen.availableUsers.ToList()) { if (u.Username.Equals(incomingUser.Username)) { var d = CoreApplication.MainView.CoreWindow.Dispatcher; await d.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () => { //ChatScreen.availableUsers.Remove(u); u.CurrentStatus = incomingUser.CurrentStatus; u.Name = incomingUser.Name; u.Email = incomingUser.Email; u.IPAddress = incomingUser.IPAddress; if (incomingUser.CurrentStatus == User.Status.Offline) { ChatScreen.availableUsers.Remove(u); } }); if (getAck(text)) { MulticastPacket p = new MulticastPacket(ChatScreen.loggedInUser, false); await SendMessage(Parse(p), multicastPort); if (!ChatScreen.loggedInUser.ProfilePicture.Equals("ms-appx:///Assets/default_profile_picture.png")) { await unicast.SendProfilePicture(incomingUser); } await unicast.RequestPicture(incomingUser); } return; } } var dispatcher = CoreApplication.MainView.CoreWindow.Dispatcher; await dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () => { ChatScreen.availableUsers.Add(incomingUser); foreach (User u in (ChatScreen.favouriteUsers).ToList()) { if (u.Username.Equals(incomingUser.Username)) { ChatScreen.availableUsers.Move(ChatScreen.availableUsers.IndexOf(incomingUser), 0); } } }); await UpdateMessageUser(incomingUser); if (getAck(text)) { MulticastPacket p = new MulticastPacket(ChatScreen.loggedInUser, false); await SendMessage(Parse(p), multicastPort); if (!ChatScreen.loggedInUser.ProfilePicture.Equals("ms-appx:///Assets/default_profile_picture.png")) { await unicast.SendProfilePicture(incomingUser); } await unicast.RequestPicture(incomingUser); } } }
private string Parse(MulticastPacket p) { string s = "" + p.UserIP + ":" + p.Username + ":" + p.UserFullName + ":" + p.UserEmail + ":" + p.Status + ":" + p.Ack; return(s); }
public async Task update() { MulticastPacket p = new MulticastPacket(ChatScreen.loggedInUser, true); await SendMessage(Parse(p), multicastPort); }