コード例 #1
0
        /// <summary>
        /// 刷新微信公众账号Block模型。刷新意味关重新把所有公众账号中的IsBlocked,修改为false。
        /// 以便WXRobot(微信机器人),可以重新尝试这些公众账号。
        /// 刷新时,会考虑消息队列新加入的,同时也加入到微信公众账号Block模型中。
        /// </summary>
        /// <param name="wxPublicAccountBlockStatusModel"></param>
        /// <param name="messageQueues"></param>
        /// <returns></returns>
        private static IEnumerable <WXPublicAccountBlockStatusModel> RefreshWXPublicAccountBlockStatusModel(IEnumerable <WXPublicAccountBlockStatusModel> wxPublicAccountBlockStatusModel, IEnumerable <Proc_GetRobotServerMessageQueueForWXRobot_Result> messageQueues)
        {
            var wxPublicAccountBlockStatusModelList          = wxPublicAccountBlockStatusModel.ToList();
            var messageQueuesDistinctList                    = Common.Lists.ListHandler.DistinctBy(messageQueues, m => m.PublicAccountID).ToList();
            WXPublicAccountBlockStatusModel thePublicAccount = null;

            Proc_GetRobotServerMessageQueueForWXRobot_Result[] messageQueuesArray = new Proc_GetRobotServerMessageQueueForWXRobot_Result[messageQueuesDistinctList.Count];

            messageQueuesDistinctList.CopyTo(messageQueuesArray);

            //不存在的公众账号,加入到模型中
            foreach (var mqa in messageQueuesArray)
            {
                thePublicAccount = wxPublicAccountBlockStatusModel.FirstOrDefault(p => p.PublicAccountID == mqa.PublicAccountID);

                if (thePublicAccount == null)
                {
                    wxPublicAccountBlockStatusModelList.Add(new WXPublicAccountBlockStatusModel()
                    {
                        PublicAccountID = (int)mqa.PublicAccountID, BlockedDateTime = DateTime.MinValue, IsBlocked = false
                    });
                }
            }

            wxPublicAccountBlockStatusModel = wxPublicAccountBlockStatusModel.Select(c =>
            {
                c.IsBlocked = false;
                return(c);
            }).AsEnumerable();

            return(wxPublicAccountBlockStatusModel);
        }
コード例 #2
0
        /// <summary>
        /// 同步公众账号Block模型。
        /// </summary>
        /// <param name="wxPublicAccountBlockStatusModel"></param>
        /// <param name="messageQueues"></param>
        /// <param name="refresh">是否重新刷新WXPublicAccountBlockStatusModel。如果是:把WXPublicAccountBlockStatusModel下所有的IsBlocked改回为false。</param>
        /// <param name="autoRefreshAfter15">超过15秒的,是否自动把对应的公众账号修改为IsBlocked = false。</param>
        /// <returns></returns>
        private static IEnumerable <WXPublicAccountBlockStatusModel> SyncWXPublicAccountBlockStatusModel(IEnumerable <WXPublicAccountBlockStatusModel> wxPublicAccountBlockStatusModel, IEnumerable <Proc_GetRobotServerMessageQueueForWXRobot_Result> messageQueues, bool refresh, bool autoRefreshAfter15, double checkWXIntervalWhenBlock)
        {
            var wxPublicAccountBlockStatusModelList = wxPublicAccountBlockStatusModel.ToList();
            var messageQueuesDistinctList           = Common.Lists.ListHandler.DistinctBy(messageQueues, m => m.PublicAccountID).ToList();

            #region 如果公众Block模型中,在消息队列不存在,要删除
            Proc_GetRobotServerMessageQueueForWXRobot_Result theMessageQueue       = null;
            WXPublicAccountBlockStatusModel[] wxPublicAccountBlockStatusModelArray = new WXPublicAccountBlockStatusModel[wxPublicAccountBlockStatusModelList.Count];

            wxPublicAccountBlockStatusModelList.CopyTo(wxPublicAccountBlockStatusModelArray);

            foreach (var pba in wxPublicAccountBlockStatusModelArray)
            {
                theMessageQueue = messageQueuesDistinctList.FirstOrDefault(mqd => mqd.PublicAccountID == pba.PublicAccountID);

                if (theMessageQueue == null)
                {
                    wxPublicAccountBlockStatusModelList.Remove(pba);
                }
            }
            #endregion

            #region 确保公众账号中,加入了消息队列中,新进的公众账号,也要记录
            WXPublicAccountBlockStatusModel thePublicAccount = null;
            Proc_GetRobotServerMessageQueueForWXRobot_Result[] messageQueuesArray = new Proc_GetRobotServerMessageQueueForWXRobot_Result[messageQueuesDistinctList.Count];

            messageQueuesDistinctList.CopyTo(messageQueuesArray);

            foreach (var mqd in messageQueuesArray)
            {
                thePublicAccount = wxPublicAccountBlockStatusModelList.FirstOrDefault(p => p.PublicAccountID == mqd.PublicAccountID);

                if (thePublicAccount == null)
                {
                    wxPublicAccountBlockStatusModelList.Add(new WXPublicAccountBlockStatusModel()
                    {
                        PublicAccountID = (int)mqd.PublicAccountID, IsBlocked = false, BlockedDateTime = DateTime.MinValue
                    });
                }
            }
            #endregion

            if (refresh)
            {
                wxPublicAccountBlockStatusModelList = wxPublicAccountBlockStatusModelList.Select(c =>
                {
                    c.IsBlocked = false;
                    return(c);
                }).ToList();
            }
            else if (autoRefreshAfter15) //如果没有强制指定要刷新,但那些超过15秒的公众账号,也应该自动刷新为IsBlocked = false
            {
                DateTime currentDT = Common.Time.NowHandler.GetNowByTimeZone();

                wxPublicAccountBlockStatusModelList = wxPublicAccountBlockStatusModelList.Select(p =>
                {
                    if (p.BlockedDateTime != DateTime.MinValue &&
                        p.BlockedDateTime < currentDT.AddSeconds(-checkWXIntervalWhenBlock))
                    {
                        p.IsBlocked = false;
                    }

                    return(p);
                }).ToList();
            }

            return(wxPublicAccountBlockStatusModelList);
        }