예제 #1
0
 private void OnDataChannelRemoved(DataChannel channel)
 {
     Logger.Log($"Removed data channel '{channel.Label}' (#{channel.ID}).");
     // FIXME - Delegating to another thread means possible race condition if user initiates
     // some action on the data channel before the delegated remove executes.
     ThreadHelper.RunOnMainThread(() =>
     {
         var chat = ChatChannels.Where(c => c.DataChannel == channel).First();
         ChatChannels.Remove(chat);
     });
 }
예제 #2
0
        public void StartAllChats()
        {
            steamChat = (SteamChat)GetChat(SettingsRegistry.ChatTitleSteam);
            if (historyService.Config.Enabled)
            {
                historyService.Start();
            }

            //Accumulate messages and update ViewModel periodically
            receiveTimer.Interval = TimeSpan.FromMilliseconds(1500);
            receiveTimer.Tick    += receiveTimer_Tick;
            receiveTimer.Start();

            timerUpdateDatabase = new Timer((o) => { UpdateDatabase(); }, this, 0, 60000);

            int waitChatStatus = 5000;

            Chats.ForEach(chat =>
            {
                chat.MessageReceived += chat_MessageReceived;
                chat.AddChannel       = (channel, fromChat) =>
                {
                    lock ( channelsLock )
                    {
                        UI.Dispatch(() => {
                            lock (channelsLock)
                            {
                                if (!ChatChannels.Any(c => c.ChannelName == channel && c.ChatName == fromChat.ChatName))
                                {
                                    ChatChannels.Add(new ChatChannel()
                                    {
                                        ChatName = fromChat.ChatName, ChannelName = channel, ChatIconURL = fromChat.IconURL
                                    });
                                }
                            }
                        });
                    }
                };
                chat.RemoveChannel = (channel, fromChat) =>
                {
                    UI.Dispatch(() =>
                    {
                        lock (channelsLock)
                        {
                            var searchItem = ChatChannels.FirstOrDefault(item => item.ChatName == fromChat.ChatName && item.ChannelName == channel && item.ChatIconURL == fromChat.IconURL);
                            if (searchItem != null)
                            {
                                ChatChannels.Remove(searchItem);
                            }

                            if (ChatChannels.Count <= 0)
                            {
                                if (!chat.Status.IsStopping)
                                {
                                    chat.Status.IsConnected = false;
                                    chat.Status.IsLoggedIn  = false;
                                    chat.Restart();
                                }
                            }
                        }
                    });
                };
                if (chat.Enabled)
                {
                    Task.Factory.StartNew(() => {
                        var c = chat;
                        c.Start();

                        while (ChatStatusHandler == null && waitChatStatus > 0)
                        {
                            waitChatStatus -= 50;
                            Thread.Sleep(100);
                        }

                        if (ChatStatusHandler != null)
                        {
                            ChatStatusHandler(c);
                        }
                    });
                }
            });
        }