private void serversListView_MouseDoubleClick(object sender, MouseButtonEventArgs e)
 {
     if (serversListView.SelectedIndex > -1)
     {
         ServerStub stub = serversListView.SelectedItem as ServerStub;
         ServerView view = new ServerView(stub.Server, MainClient);
         view.Closed += (se, xe) =>
         {
             openServerViews.Remove(se as ServerView);
         };
         openServerViews.Add(view);
         view.Show();
         //ServerInfo info = new ServerInfo(stub.Server);
         //info.ShowDialog();
     }
 }
 private void serversListView_MouseDoubleClick(object sender, MouseButtonEventArgs e)
 {
     if (serversListView.SelectedIndex > -1)
     {
         ServerStub stub = serversListView.SelectedItem as ServerStub;
         ServerView view = new ServerView(stub.Server, MainClient);
         view.Closed += (se, xe) =>
         {
             openServerViews.Remove(se as ServerView);
         };
         openServerViews.Add(view);
         view.Show();
         //ServerInfo info = new ServerInfo(stub.Server);
         //info.ShowDialog();
     }
 }
        private void SetupEvents()
        {
            MainClient.Connected += (sender, e) =>
            {
                Dispatcher.Invoke(() => this.Title = "Dissonance - " + e.User.Username);
                PopulateLists();

                Dispatcher.Invoke(() =>
                {
                    Mouse.OverrideCursor = null;
                });
            };
            MainClient.TextClientDebugMessageReceived += (sender, e) =>
            {
                //if(e.message.Level == MessageLevel.Critical)
                //{
                //    MessageBox.Show("Critical DiscordSharp Error Ocurred: " + e.message.Message);
                //}
            };
            MainClient.MessageDeleted += (sender, e) =>
            {
                if (e.DeletedMessage != null)
                {
                    var serverView = openServerViews.Find(x => x.Server.ID == e.Channel.Parent.ID);
                    if (serverView != null)
                    {
                        serverView.RemoveMessage(e.DeletedMessage);
                    }
                }
                else
                {
                    var serverView = openServerViews.Find(x => x.Server.ID == e.Channel.Parent.ID);
                    if (serverView != null)
                    {
                        serverView.RemoveMessage(e.RawJson["d"]["id"].ToString(), e.RawJson["d"]["channel_id"].ToString());
                    }
                }
            };
            MainClient.MentionReceived += (sender, e) =>
            {
                string toReplace = $"<@{MainClient.Me.ID}>";
                string message   = e.Message.Content;
                message = message.Replace(toReplace, $"@{MainClient.Me.Username}");

                if (e.Author.Avatar != null)
                {
                    e.Author.GetAvatar().Save("temp.png");
                }
                string messageToShow = e.Message.Content;
                string idToReplace   = $"<@{MainClient.Me.ID}>";
                messageToShow = messageToShow.Replace(idToReplace, $"@{MainClient.Me.Username}");
                if (App.ClientConfiguration.Settings.UseWindows10Notifications)
                {
                    var toast = toastManager.CreateToast(System.IO.Path.GetFullPath("temp.png"), $"Mention received from {e.Author.Username}", $"{messageToShow}", "");
                    lastNotification = $"{e.Channel.Parent.ID}:{e.Channel.ID}"; //server:channel
                    toast.Activated += (sxc, exc) =>
                    {
                        string[] split = lastNotification.Split(new char[] { ':' }, 2);
                        lastNotification = null;
                        string serverID  = split[0];
                        string channelID = split[1];
                        bool   hasServer = false;
                        foreach (var serverView in openServerViews)
                        {
                            if (serverView.Server.ID == serverID)
                            {
                                hasServer = true;
                            }
                        }

                        if (hasServer)
                        {
                            Dispatcher.Invoke(() => openServerViews.Find(x => x.Server.ID == serverID).Activate());
                        }
                        else
                        {
                            Dispatcher.Invoke(() =>
                            {
                                ServerView view = new ServerView(MainClient.GetServersList().Find(x => x.ID == serverID), MainClient);
                                view.Closed    += (x, f) =>
                                {
                                    openServerViews.Remove(x as ServerView);
                                };
                                openServerViews.Add(view);
                                view.LoadChannel(view.Server.Channels.Find(x => x.ID == channelID));
                                view.Show();
                                view.Activate();
                            });
                        }
                    };

                    ToastNotificationManager.CreateToastNotifier(toastManager.GetAppID).Show(toast);
                }
                else
                {
                    lastNotification = $"{e.Channel.Parent.ID}:{e.Channel.ID}"; //server:channel
                    notificationIcon.BalloonTipClicked += (sxc, exc) =>
                    {
                        string[] split = lastNotification.Split(new char[] { ':' }, 2);
                        lastNotification = null;
                        string serverID  = split[0];
                        string channelID = split[1];
                        bool   hasServer = false;
                        foreach (var serverView in openServerViews)
                        {
                            if (serverView.Server.ID == serverID)
                            {
                                hasServer = true;
                            }
                        }

                        if (hasServer)
                        {
                            Dispatcher.Invoke(() => openServerViews.Find(x => x.Server.ID == serverID).Activate());
                        }
                        else
                        {
                            Dispatcher.Invoke(() =>
                            {
                                ServerView view = new ServerView(MainClient.GetServersList().Find(x => x.ID == serverID), MainClient);
                                view.Closed    += (x, f) =>
                                {
                                    openServerViews.Remove(x as ServerView);
                                };
                                openServerViews.Add(view);
                                view.LoadChannel(view.Server.Channels.Find(x => x.ID == channelID));
                                view.Show();
                                view.Activate();
                            });
                        }
                    };
                    notificationIcon.BalloonTipTitle = $"Mentioned received from {e.Author.Username}";
                    notificationIcon.BalloonTipText  = $"{messageToShow}";
                    notificationIcon.ShowBalloonTip(2500); //2.5 seconds
                    notificationSound.PlaySync();
                }
            };
            MainClient.SocketClosed += (sender, e) =>
            {
                if (closing)
                {
                    return;
                }
                Dispatcher.Invoke(() => Title = "Connection lost, retrying..");
                discordTask.Dispose();
                Task.Delay(3000).Wait();
                if (MainClient.SendLoginRequest() != null)
                {
                    discordTask = Task.Run(() => MainClient.Connect());
                }
            };
            MainClient.MessageReceived += (sender, e) =>
            {
                DiscordServer serverIn = e.Channel.Parent;
                openServerViews.ForEach(x =>
                {
                    if (x.Server.ID == serverIn.ID)
                    {
                        x.AddMessage(e.Message);
                    }
                });
            };
        }
        private void SetupEvents()
        {
            MainClient.Connected += (sender, e) =>
            {
                Dispatcher.Invoke(()=>this.Title = "Dissonance - " + e.user.Username);
                PopulateLists();
                
                Dispatcher.Invoke(()=>
                {
                    Mouse.OverrideCursor = null;
                });
            };
            MainClient.TextClientDebugMessageReceived += (sender, e) =>
            {
                //if(e.message.Level == MessageLevel.Critical)
                //{
                //    MessageBox.Show("Critical DiscordSharp Error Ocurred: " + e.message.Message);
                //}
            };
            MainClient.MessageDeleted += (sender, e) =>
            {
                if(e.DeletedMessage != null)
                {
                    var serverView = openServerViews.Find(x => x.Server.id == e.Channel.parent.id);
                    if(serverView != null)
                    {
                        serverView.RemoveMessage(e.DeletedMessage);
                    }
                }
                else
                {
                    var serverView = openServerViews.Find(x => x.Server.id == e.Channel.parent.id);
                    if (serverView != null)
                    {
                        serverView.RemoveMessage(e.RawJson["d"]["id"].ToString(), e.RawJson["d"]["channel_id"].ToString());
                    }
                }
            };
            MainClient.MentionReceived += (sender, e) =>
            {
                string toReplace = $"<@{MainClient.Me.ID}>";
                string message = e.message.content;
                message = message.Replace(toReplace, $"@{MainClient.Me.Username}");

                if (e.author.Avatar != null)
                {
                    e.author.GetAvatar().Save("temp.png");
                }
                string messageToShow = e.message.content;
                string idToReplace = $"<@{MainClient.Me.ID}>";
                messageToShow = messageToShow.Replace(idToReplace, $"@{MainClient.Me.Username}");
                if (App.ClientConfiguration.Settings.UseWindows10Notifications)
                {
                    var toast = toastManager.CreateToast(System.IO.Path.GetFullPath("temp.png"), $"Mention received from {e.author.Username}", $"{messageToShow}", "");
                    lastNotification = $"{e.Channel.parent.id}:{e.Channel.ID}"; //server:channel
                    toast.Activated += (sxc, exc) =>
                    {
                        string[] split = lastNotification.Split(new char[] { ':' }, 2);
                        lastNotification = null;
                        string serverID = split[0];
                        string channelID = split[1];
                        bool hasServer = false;
                        foreach (var serverView in openServerViews)
                            if (serverView.Server.id == serverID)
                                hasServer = true;

                        if (hasServer)
                        {
                            Dispatcher.Invoke(() => openServerViews.Find(x => x.Server.id == serverID).Activate());
                        }
                        else
                        {
                            Dispatcher.Invoke(() =>
                            {
                                ServerView view = new ServerView(MainClient.GetServersList().Find(x => x.id == serverID), MainClient);
                                view.Closed += (x, f) =>
                                {
                                    openServerViews.Remove(x as ServerView);
                                };
                                openServerViews.Add(view);
                                view.LoadChannel(view.Server.channels.Find(x => x.ID == channelID));
                                view.Show();
                                view.Activate();
                            });
                        }
                    };

                    ToastNotificationManager.CreateToastNotifier(toastManager.GetAppID).Show(toast);
                }
                else
                {
                    lastNotification = $"{e.Channel.parent.id}:{e.Channel.ID}"; //server:channel
                    notificationIcon.BalloonTipClicked += (sxc, exc) =>
                    {
                        string[] split = lastNotification.Split(new char[] { ':' }, 2);
                        lastNotification = null;
                        string serverID = split[0];
                        string channelID = split[1];
                        bool hasServer = false;
                        foreach (var serverView in openServerViews)
                            if (serverView.Server.id == serverID)
                                hasServer = true;

                        if (hasServer)
                            Dispatcher.Invoke(() => openServerViews.Find(x => x.Server.id == serverID).Activate());
                        else
                        {
                            Dispatcher.Invoke(() =>
                            {
                                ServerView view = new ServerView(MainClient.GetServersList().Find(x => x.id == serverID), MainClient);
                                view.Closed += (x, f) =>
                                {
                                    openServerViews.Remove(x as ServerView);
                                };
                                openServerViews.Add(view);
                                view.LoadChannel(view.Server.channels.Find(x => x.ID == channelID));
                                view.Show();
                                view.Activate();
                            });
                        }
                    };
                    notificationIcon.BalloonTipTitle = $"Mentioned received from {e.author.Username}";
                    notificationIcon.BalloonTipText = $"{messageToShow}";
                    notificationIcon.ShowBalloonTip(2500); //2.5 seconds
                    notificationSound.PlaySync();
                }
            };
            MainClient.SocketClosed += (sender, e) =>
            {
                if (closing)
                    return;
                Dispatcher.Invoke(() => Title = "Connection lost, retrying..");
                discordTask.Dispose();
                Task.Delay(3000).Wait();
                if (MainClient.SendLoginRequest() != null)
                    discordTask = Task.Run(() => MainClient.Connect());
            };
            MainClient.MessageReceived += (sender, e) =>
            {
                DiscordServer serverIn = e.Channel.parent;
                openServerViews.ForEach(x =>
                {
                    if(x.Server.id == serverIn.id)
                    {
                        x.AddMessage(e.message);
                    }
                });
            };
        }