private async void OnAddInfo(object args) { if (AddInfoName == null || string.IsNullOrWhiteSpace(AddInfoName)) { Errors.Add(new Error { Message = "Specify the name of the channel you want to create.", Verbose = "Specify the name of the channel you want to create." }); return; } try { var info = ServerInfos.FirstOrDefault(i => i.Name.Equals(AddInfoName)); if (info == null) { var channelInfo = new ChannelInfo { Name = AddInfoName }; info = InfoFactory.GetInfo(channelInfo); ServerInfos.Add(info); } UserInfos.Add(info); SelectedInfo = (InfoDecorator)info; if (info is Channel) { var clientMessage = new Message { SenderConnectionId = User.Name, Data = AddInfoName, MessageType = MessageType.SubscribeToChannel }; await dipSocketClient.SendMessageAsync(clientMessage); } } catch (Exception ex) { Errors.Add(new Error { Message = ex.Message, Verbose = ex.ToString() }); } finally { AddInfoName = string.Empty; } }
private void OnServerInfo(Message message) { dispatcher.Invoke( () => { lock (serverInfosLock) { var serverInfo = JsonConvert.DeserializeObject <ServerInfo>(message.Data); var allServerInfos = serverInfo.Channels.Cast <IInfo>() .Union(serverInfo.Connections.Where(c => !c.Name.Equals(User.Name)).Cast <IInfo>()) .OrderBy(c => c.Name).ToList(); var removals = ServerInfos.Where(c => !allServerInfos.Any(nc => nc.Name.Equals(c.Name))).ToList(); foreach (var removal in removals) { ServerInfos.Remove(removal); var removeUserInfo = UserInfos.FirstOrDefault(i => i.Name.Equals(removal.Name)); if (removeUserInfo != null) { UserInfos.Remove(removeUserInfo); } } var updates = (from c in ServerInfos.OfType <Channel>() join ci in allServerInfos.OfType <ChannelInfo>() on c.Name equals ci.Name select c.UpdateConnections(ci)).ToList(); var additions = allServerInfos.Where(a => !ServerInfos.Any(c => c.Name.Equals(a.Name))).ToList(); if (additions.Any()) { foreach (var addition in additions) { dispatcher.Invoke( () => { var info = InfoFactory.GetInfo(addition); ServerInfos.Add(info); }); } } } }); }