Ejemplo n.º 1
0
        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;
            }
        }
Ejemplo n.º 2
0
        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);
                            });
                        }
                    }
                }
            });
        }