public void AddRedBaoItem(RedBaoItem item)
 {
     if (!_grid.IsDisposed && !_grid.Disposing)
     {
         _grid.BeginInvoke(new MethodInvoker(() =>
         {
             Items.Insert(0, item);
             _grid.FirstDisplayedScrollingRowIndex = 0;
         }));
     }
 }
 public void ProcessRedBaoItem(RedBaoItem item, int goldAmount, string status, string senderName)
 {
     if (!_grid.IsDisposed && !_grid.Disposing)
     {
         _grid.BeginInvoke(new MethodInvoker(() =>
         {
             if (_grid.IsDisposed || _grid.Disposing)
             {
                 return;
             }
             item.SenderName       = senderName;
             item.IsProcessed      = true;
             item.Status           = status;
             item.FetchedGoldCount = goldAmount;
             _grid.FirstDisplayedScrollingRowIndex = 0;
         }));
     }
 }
        public void RunRedBao()
        {
            while (true)
            {
                //myCtrl.UpdateRoomCount(_userIds.Count.ToString());
                RountCount++;
                if (!Started)
                {
                    Thread.Sleep(2000);
                    continue;
                }
                if (_userIds.Count != 0 && _tokens.Count > 0)
                {
                    if (!Logined)
                    {
                        Logined = true;
                        myCtrl.ChangeLoginStatus(Logined);
                    }

                    int totalCount   = _userIds.Count;
                    int currentCount = 0;

                    _userIds.ToList().ForEach((userid =>
                    {
                        currentCount++;
                        //                        _tokens.ToList().ForEach(_token =>
                        //                        {

                        if (_waittingForProcessingItems.ToList().Any(item => item.UserId == userid))
                        {
                            return;
                        }


                        string tempLiveId = string.Empty;
                        if (!_UserIdToLiveId.ContainsKey(userid))
                        {
                            return;
                        }
                        string getResult =
                            GetRequest(
                                $@"https://redenvelope.lizhi.fm/redenvelope/getCandidateLiveRedEnvelop?receiverLiveUserId={
                                        userid
                                    }&token={_tokens[0]}&liveId={_UserIdToLiveId[userid]}&deviceId={_TokenToDeviceId[_tokens[0]]}&accessToken={_TokenToAccessToken[_tokens[0]]}&r={new Random().NextDouble()}");
                        //}&token={_tokens[0]}&liveId={_UserIdToLiveId[userid]}&deviceId={_TokenToDeviceId[_tokens[0]]}&r={new Random().NextDouble()}");

                        var redbaoItem = new RedBaoItem();

                        myCtrl.SetProgressBar(currentCount * 100 / totalCount);

                        if (!string.IsNullOrEmpty(getResult) && !getResult.Contains("无红包可抢") &&
                            getResult.Contains(@"""id"":"))
                        {
                            string roomInfoResponse =
                                GetRequest(
                                    $@"http://www.lizhi.fm/user/{userid}");
                            Regex roomUserPhotoAndRoomNameRegex =
                                new Regex(
                                    @"<div class=""user-info-img"">[^<]+<img src=""([^""]+)"" alt=""([^""]+)"" />");
                            Regex roomPicRegex =
                                new Regex(
                                    @"data-cover=""([^""]+)""");
                            //@" < div class=""radioCover left"">[^<]+<img alt=""[^""]+"" src=""([^""]+)"" />");
                            Regex roomFMAndRoomTitleRegex =
                                new Regex("<h1 class=\"user-info-name\">([^ ]+)([^<]+)<i class=");
                            //new Regex(@"div class=""left""><a href=""/"">发现</a><a href=""/([^""]+)/"">([^<]+)</a>");
                            string roomFmId = "未获取";
                            string roomFmName = "未获取";
                            string roomOwner = "未获取";
                            if (!string.IsNullOrEmpty(roomInfoResponse))
                            {
                                var roomUserPhotoAndRoomName = roomUserPhotoAndRoomNameRegex.Match(roomInfoResponse);
                                if (roomUserPhotoAndRoomName.Success)
                                {
                                    //房主图片
                                    redbaoItem.RoomOwnerPic = (roomUserPhotoAndRoomName.Groups[1].Value);
                                    myCtrl.SetRoomOwner(roomUserPhotoAndRoomName.Groups[1].Value);
                                    //房主名字
                                    roomOwner = (roomUserPhotoAndRoomName.Groups[2].Value);
                                }
                                var roomPic = roomPicRegex.Match(roomInfoResponse);
                                if (roomPic.Success)
                                {
                                    //房间图片
                                    redbaoItem.RoomPic = (roomPic.Groups[1].Value);
                                    myCtrl.SetRoomConver(roomPic.Groups[1].Value);
                                }
                                var roomFMAndRoomTitle = roomFMAndRoomTitleRegex.Match(roomInfoResponse);
                                if (roomFMAndRoomTitle.Success)
                                {
                                    //FM ID
                                    roomFmId = roomFMAndRoomTitle.Groups[1].Value;
                                    //房间名字
                                    roomFmName = roomFMAndRoomTitle.Groups[2].Value;
                                }
                            }

                            Regex regex = new Regex(@"\{""id"":""([0-9]+)""");
                            string resultID = regex.Match(getResult).Groups[1].Value;
                            redbaoItem.FieldResultID = resultID;

                            if (!string.IsNullOrEmpty(resultID))
                            {
                                if (!_userIds.Contains(resultID))
                                {
                                    _userIds.Add(resultID);
                                    myCtrl.AddMessage($@"Added new userID: {resultID}");
                                }
                            }

                            var senderIdMatch = new Regex(@"""senderId"":""([^""]+)""").Match(getResult);
                            if (senderIdMatch.Success)
                            {
                                redbaoItem.RoomFmNumber = roomFmId;
                                redbaoItem.RoomName = roomFmName;
                                redbaoItem.RoomOwnerName = roomOwner;
                                redbaoItem.UserId = userid;
                                redbaoItem.RoomId = userid;
                                redbaoItem.SenderId = senderIdMatch.Groups[1].Value;
                                redbaoItem.Status = "等待抢...";
                                redbaoItem.IsProcessed = false;
                                redbaoItem.Id = AutoIncreaseId++;
                                //myCtrl.AddMessage($"^^^红包,房间FM:{roomFmId} 房间名:{roomFmName} 房主:{roomOwner}");
                                //myCtrl.AddMessage($"^^^红包,发送者ID:{senderIdMatch.Groups[1].Value}, 房间ID:{userid}.^^^");
                            }


                            var senderPhotoMatch = new Regex(@"""senderCover"":""([^""]+)""").Match(getResult);
                            if (senderPhotoMatch.Success)
                            {
                                //发送者图片
                                redbaoItem.SenderPic = (senderPhotoMatch.Groups[1].Value);
                                myCtrl.SetImage(senderPhotoMatch.Groups[1].Value);
                            }

                            redbaoItem.DelayDateTime = DateTime.Now.AddMilliseconds(myCtrl.GetDelayFetchGoldMillSecs());

                            lock (_waittingForProcessingItems)
                                _waittingForProcessingItems.Add(redbaoItem);
                            myCtrl.AddRedBaoItem(redbaoItem);
                        }

                        //                        });
                    }));
                }
                else
                {
                    if (Logined)
                    {
                        Logined = false;
                        myCtrl.ChangeLoginStatus(Logined);
                    }
                }
                Thread.Sleep(DelayTime);
            }
        }
        public void RunRedBaoEmptyRoom()
        {
            while (true)
            {
                myCtrl.UpdateRoomCount((_userIds.Count + _userEmptyRoomIds.Count).ToString());
                RountCount++;
                if (!Started)
                {
                    Thread.Sleep(2000);
                    continue;
                }

                //获得热门用户

                List <UserId> hotList = new List <UserId>();
                if (myCtrl.IsLoadHotLiveRooms)
                {
                    GetHotUsersList(hotList);
                }


                if (_userEmptyRoomIds.Count != 0 && _tokens.Count > 0)
                {
                    if (!Logined)
                    {
                        Logined = true;
                        myCtrl.ChangeLoginStatus(Logined);
                    }

                    int totalCount   = _userEmptyRoomIds.Count;
                    int currentCount = 0;

                    var pendingAddUsers = new List <string>();

                    _userEmptyRoomIds.ToList().ForEach((userid =>
                    {
                        currentCount++;
                        //                        _tokens.ToList().ForEach(_token =>
                        //                        {

                        if (_waittingForProcessingItems.ToList().Any(item => item.UserId == userid))
                        {
                            return;
                        }
                        if (!_UserIdToLiveId.ContainsKey(userid) || !_TokenToDeviceId.ContainsKey(_tokens[0]))
                        {
                            return;
                        }
                        string getResult =
                            GetRequest(
                                $@"https://redenvelope.lizhi.fm/redenvelope/getCandidateLiveRedEnvelop?receiverLiveUserId={
                                        userid
                                    }&token={_tokens[0]}&liveId={_UserIdToLiveId[userid]}&deviceId={_TokenToDeviceId[_tokens[0]]}&r={new Random().NextDouble()}");
                        //      }&token={_tokens[0]}&liveId={_UserIdToLiveId[userid]}&deviceId={ _TokenToDeviceId[_tokens[0]]}&accessToken={_TokenToAccessToken[_tokens[0]]}&r={new Random().NextDouble()}");

                        var redbaoItem = new RedBaoItem();

                        myCtrl.SetProgressBarSecond(currentCount * 100 / totalCount);

                        if (!string.IsNullOrEmpty(getResult) && !getResult.Contains("无红包可抢") &&
                            getResult.Contains(@"""id"":"))
                        {
                            //add to quick fetch process
                            pendingAddUsers.Add(userid);

                            string roomInfoResponse =
                                GetRequest(
                                    $@"http://www.lizhi.fm/user/{userid}");
                            Regex roomUserPhotoAndRoomNameRegex =
                                new Regex(
                                    @"<div class=""user-info-img"">[^<]+<img src=""([^""]+)"" alt=""([^""]+)"" />");
                            Regex roomPicRegex =
                                new Regex(
                                    @"data-cover=""([^""]+)""");
                            //@" < div class=""radioCover left"">[^<]+<img alt=""[^""]+"" src=""([^""]+)"" />");
                            Regex roomFMAndRoomTitleRegex =
                                new Regex("<h1 class=\"user-info-name\">([^ ]+)([^<]+)<i class=");
                            //new Regex(@"div class=""left""><a href=""/"">发现</a><a href=""/([^""]+)/"">([^<]+)</a>");
                            string roomFmId = "未获取";
                            string roomFmName = "未获取";
                            string roomOwner = "未获取";
                            if (!string.IsNullOrEmpty(roomInfoResponse))
                            {
                                var roomUserPhotoAndRoomName = roomUserPhotoAndRoomNameRegex.Match(roomInfoResponse);
                                if (roomUserPhotoAndRoomName.Success)
                                {
                                    //房主图片
                                    redbaoItem.RoomOwnerPic = (roomUserPhotoAndRoomName.Groups[1].Value);
                                    myCtrl.SetRoomOwner(roomUserPhotoAndRoomName.Groups[1].Value);
                                    //房主名字
                                    roomOwner = (roomUserPhotoAndRoomName.Groups[2].Value);
                                }
                                var roomPic = roomPicRegex.Match(roomInfoResponse);
                                if (roomPic.Success)
                                {
                                    //房间图片
                                    redbaoItem.RoomPic = (roomPic.Groups[1].Value);
                                    myCtrl.SetRoomConver(roomPic.Groups[1].Value);
                                }
                                var roomFMAndRoomTitle = roomFMAndRoomTitleRegex.Match(roomInfoResponse);
                                if (roomFMAndRoomTitle.Success)
                                {
                                    //FM ID
                                    roomFmId = roomFMAndRoomTitle.Groups[1].Value;
                                    //房间名字
                                    roomFmName = roomFMAndRoomTitle.Groups[2].Value;
                                }
                            }

                            Regex regex = new Regex(@"\{""id"":""([0-9]+)""");
                            string resultID = regex.Match(getResult).Groups[1].Value;
                            redbaoItem.FieldResultID = resultID;

//                            if (!string.IsNullOrEmpty(resultID))
//                            {
//                                if (!_userIds.Contains(resultID) && !_userEmptyRoomIds.Contains(resultID))
//                                {
//                                    _userEmptyRoomIds.Add(resultID);
//                                    myCtrl.AddMessage($@"Added new userID: {resultID}");
//                                }
//                            }

                            var senderIdMatch = new Regex(@"""senderId"":""([^""]+)""").Match(getResult);
                            if (senderIdMatch.Success)
                            {
                                redbaoItem.RoomFmNumber = roomFmId;
                                redbaoItem.RoomName = roomFmName;
                                redbaoItem.RoomOwnerName = roomOwner;
                                redbaoItem.UserId = userid;
                                redbaoItem.RoomId = userid;
                                redbaoItem.SenderId = senderIdMatch.Groups[1].Value;
                                redbaoItem.Status = "等待抢...";
                                redbaoItem.IsProcessed = false;
                                redbaoItem.Id = AutoIncreaseId++;
                                //myCtrl.AddMessage($"^^^红包,房间FM:{roomFmId} 房间名:{roomFmName} 房主:{roomOwner}");
                                //myCtrl.AddMessage($"^^^红包,发送者ID:{senderIdMatch.Groups[1].Value}, 房间ID:{userid}.^^^");
                            }


                            var senderPhotoMatch = new Regex(@"""senderCover"":""([^""]+)""").Match(getResult);
                            if (senderPhotoMatch.Success)
                            {
                                //发送者图片
                                redbaoItem.SenderPic = (senderPhotoMatch.Groups[1].Value);
                                myCtrl.SetImage(senderPhotoMatch.Groups[1].Value);
                            }

                            redbaoItem.DelayDateTime = DateTime.Now.AddMilliseconds(myCtrl.GetDelayFetchGoldMillSecs());



//
//
//
//                            lock (_waittingForProcessingItems)
//                                _waittingForProcessingItems.Add(redbaoItem);



                            myCtrl.AddRedBaoItem(redbaoItem);


                            /**************************************/
                            List <string> randomTokens = shuffle(_tokens.ToList());
                            int amount = 0;
                            string senderName = string.Empty;


                            randomTokens.ForEach(token =>
                            {
                                int perAmount = 0;
                                if (!_TokenToDeviceId.ContainsKey(token))
                                {
                                    myCtrl.AddMessage("One of the users doesn't fill the deviceId successful!!!");
                                    myCtrl.AddMessage("Missing token of deviceId: " + token);
                                    return;
                                }
                                var postResult = PostRequest(
                                    $"https://redenvelope.lizhi.fm/redenvelope/grab?token={token}",
                                    $"id={redbaoItem.FieldResultID}&token={token}&liveId={_UserIdToLiveId[redbaoItem.UserId]}&deviceId={_TokenToDeviceId[token]}&"
                                    // $"id={itemDoing.FieldResultID}&token={token}&liveId={_UserIdToLiveId[itemDoing.UserId]}&deviceId={_TokenToDeviceId[token]}&accessToken={_TokenToAccessToken[token]}"
                                    );
                                if (GetMoneyAmount(postResult, ref senderName, out perAmount) == 0)
                                {
                                    //清空BAG,发生概率低忽略效率
                                    var tempList = _userIds.ToList();
                                    while (!_userIds.IsEmpty)
                                    {
                                        string someItem;
                                        _userIds.TryTake(out someItem);
                                    }
                                    tempList.Remove(redbaoItem.UserId);
                                    tempList.ForEach(item => _userIds.Add(item));
                                }
                                amount += perAmount;
                            });
                            if (amount > 0)
                            {
                                myCtrl.ProcessRedBaoItem(redbaoItem, amount, "完成", senderName);
                            }
                            else
                            {
                                myCtrl.ProcessRedBaoItem(redbaoItem, amount, "失败", senderName);
                            }

//                            lock (_waittingForProcessingItems)
//                                _waittingForProcessingItems.Remove(itemDoing);
                        }
                    }));



//
//                    // Thread.Sleep(10000);
//                    //Doing quick process transfer
//                    if (pendingAddUsers.Count > 0)
//                    {
//                        pendingAddUsers.ForEach(userid =>
//                        {
//                            if (!_userIds.Contains(userid))
//                                _userIds.Add(userid);
//
//                        });
//                        var tempEmptyUserIds = _userEmptyRoomIds.ToList();
//
//                        //ignore prefermance...just code like this.
//                        while (!_userEmptyRoomIds.IsEmpty)
//                        {
//                            string someItem;
//                            _userEmptyRoomIds.TryTake(out someItem);
//                        }
//
//                        tempEmptyUserIds.ForEach(item =>
//                        {
//                            if (!pendingAddUsers.Contains(item))
//                            {
//                                _userEmptyRoomIds.Add(item);
//                            }
//                        });
//
//                        pendingAddUsers.Clear();
//                    }
//



                    Thread.Sleep(DelayTime);
                }
                else
                {
                    if (Logined)
                    {
                        Logined = false;
                        myCtrl.ChangeLoginStatus(Logined);
                    }
                    Thread.Sleep(1000);
                }
            }
        }