private async void Window_Loaded(object sender, RoutedEventArgs e)
        {
            buttonMore.IsEnabled = false;
            AddStatus("Starting...");
            AddStatus("Find Me at https://t.me/paijemdev");

            AddStatus("Reading configs...");
            Configs.SetRetryTimeoutValue();

            AddStatus("Get my Account...");
            var myinfo = await MangoApi.GetMyInfo();

            if (myinfo.errno != 0)
            {
                while (true)
                {
                    AddStatus("Login with account...");
                    var login = await MangoApi.Login();

                    if (login.errno != 0)
                    {
                        AddStatus("Status : Login Failed!");
                        var dialog = MessageBox.Show($"{login.msg}\n\n-- -- --\n[YES] Try again? [NO] To close.", this.Title, MessageBoxButton.YesNo, MessageBoxImage.Question);
                        if (dialog == MessageBoxResult.No)
                        {
                            Environment.Exit(1);
                        }
                    }
                    else
                    {
                        AddStatus("Status : Login Success");
                        break;
                    }
                }
            }
            else
            {
                AddStatus("Status : Logged In");
            }

            await GetNextPage();

            buttonMore.IsEnabled = true;

            var serial     = App.GetSID();
            var isKeyValid = Configs.IsKeyValid(serial);

            if (!isKeyValid)
            {
                var auth = new AuthWindow();
                if (auth.ShowDialog() == false)
                {
                    Environment.Exit(1);
                }
            }
        }
        private async Task GetNextPage(bool reset = false)
        {
            buttonReset.IsEnabled = false;
            buttonMore.IsEnabled  = false;

            if (reset)
            {
                nextPage = 0;
            }

            bool noMore = false;

            AddStatus($"Loading page {nextPage}");

            var rooms = await MangoApi.GetRooms(nextPage);

            if (rooms.errno == 0)
            {
                if (rooms.data.Length > 0)
                {
                    nextPage++;
                    await Task.Run(() =>
                    {
                        InsertUsers(rooms.data, reset);
                    });
                }
                else
                {
                    AddStatus("No more users");
                    noMore = true;
                }
            }
            else
            {
                AddStatus(rooms.msg);
            }

            buttonReset.IsEnabled = true;
            buttonMore.IsEnabled  = !noMore;
        }
        private async void ButtonDump_Click(object sender, RoutedEventArgs e)
        {
            if (isRecording)
            {
                return;
            }

            if (string.IsNullOrWhiteSpace(user.videoPlayUrl))
            {
                SetStatus("[Error] Can't find the stream link");
                return;
            }

            LockInput(true);
            cardFind.Visibility   = Visibility.Collapsed;
            buttonDump.Visibility = Visibility.Collapsed;
            buttonStop.Visibility = Visibility.Visible;

            isRecording = true;
            var firsttime = true;
            var timestart = DateTime.Now;

            while (isRecording)
            {
                var dump      = false;
                var isPlaying = !App.CheckBeforeRecording;

                if (!firsttime && App.CheckBeforeRecording)
                {
                    SetStatus("Checking room...");
                    var room = await MangoApi.GetRoomInfo(user.rid);

                    if (room.errno == 0)
                    {
                        isPlaying       = room.data.isPlaying;
                        textViewer.Text = room.data.isPlaying ? "Online" : "Offline";
                        SetStatus(room.data.isPlaying ? "User Online" : "User Offline");
                    }
                    else
                    {
                        isPlaying       = true;
                        textViewer.Text = "Unknown";
                        SetStatus(room.msg);
                    }
                    labelViewer.Text = "LiveShow :";
                }

                if (isPlaying)
                {
                    dump = await DumpStream();
                }

                firsttime = false;

                if (dump)
                {
                    timestart = DateTime.Now;
                }

                if (!isRecording)
                {
                    SetStatus("Stopped by user");
                    break;
                }
                if (radioManual.IsChecked == false)
                {
                    if (radioImmediately.IsChecked == true)
                    {
                        SetStatus("Timeout!");
                        break;
                    }
                    if (radioCustomTimeout.IsChecked == true)
                    {
                        if (IsTimeout(timestart))
                        {
                            SetStatus("Timeout!");
                            break;
                        }

                        var to = Timeout(timestart);
                        SetStatus($"Timeout in {to.Minutes.ToString("00")}:{to.Seconds.ToString("00")}");
                    }
                }
                else
                {
                    SetStatus("Please wait... Retry in 10s");
                }

                await Task.Delay(10000);
            }

            isRecording = false;
            LockInput(false);
            buttonDump.Visibility = Visibility.Visible;
            buttonStop.Visibility = Visibility.Collapsed;
        }
        private async void ButtonFind_Click(object sender, RoutedEventArgs e)
        {
            var text = textInput.Text.Trim();

            if (string.IsNullOrWhiteSpace(text))
            {
                SetStatus("Input isn't valid!!!");
                return;
            }

            var id = text;

            if (text.StartsWith("rtmp") || text.StartsWith("http"))
            {
                Match regex = Regex.Match(text, @"live/(\d+)/?");
                if (regex.Success)
                {
                    id = regex.Groups[1].Value;
                }
            }

            Console.WriteLine("ID : " + id);
            if (Regex.IsMatch(id, @"^\d$"))
            {
                SetStatus("Input isn't valid!!!");
                return;
            }

            LockInput(true);
            LockButtonAndReset(true);

            SetStatus($"Get userid: {id}");

            var getUser = await MangoApi.GetUser(id);

            if (getUser.errno != 0)
            {
                SetStatus(getUser.msg);
                return;
            }
            var userInfo = getUser.data;

            // parse userInfo to user
            user = new User
            {
                rid          = userInfo.rid,
                mid          = userInfo.id,
                nickname     = userInfo.nickname,
                announcement = userInfo.signature,
                videoPlayUrl = userInfo.videoPlayUrl
            };

            LoadUserInfo(userInfo);

            var room = await MangoApi.GetRoomInfo(user.rid);

            if (room.errno == 0)
            {
                textViewer.Text = room.data.isPlaying ? "Online" : "Offline";
                if (room.data.isPlaying)
                {
                    cardFind.Visibility = Visibility.Collapsed;
                }
            }

            LockInput(false);
            LockButtonAndReset(false);

            SetStatus("Let's start the party");
        }