/// <summary> /// This method gets the x most recent upvotes from the filled Upvote account to the author of the given post /// </summary> /// <param name="author">The author of the post</param> /// <param name="vars">Validation variables incl. upvote account name and various other variables to validate the post against</param> /// <returns>Returns the most recent upvotes and the one matching given minimum percentage criteria</returns> private GetAccountVotesViewModel GetLastUpvotesFromUpvoteAccountToAuthor(string author, ValidationVariables vars) { var model = new GetAccountVotesViewModel(); model.MinPercentage = vars.MinPercentageUpvoteFromUpvoteAccount; // get top x most recent posts containing the upvote var posts = _postService.GetMostRecentPostsContainingVoter(author, vars.UpvoteAccount, ConfigurationHelper.RetrieveUpvoteAccountVoteCount); if (posts != null && posts.Any()) { // map results to our FindVotesItemModel foreach (var p in posts) { var pm = DiscussionMapper.ToFindVotesItemModel(p, vars.UpvoteAccount); model.LastVotes.Add(pm); } // get timestamp details of most recent highest upvote // this is not stored in hivemind, so we need to make a call to Steem API if (model.MostRecentUpvote != null) { // get vote details from Steem API's because hivemind doesn't contain detailed vote data var lastUpdate = GetVoteDateOfMostRecentUpvote(author, model.MostRecentUpvote.permlink, vars.UpvoteAccount); if (lastUpdate.HasValue) { model.MostRecentUpvote.last_update = lastUpdate.Value; } } } return(model); }
public static ValidationItemViewModel ValidateMaxPostPayoutRule(CurationDetailsViewModel model, ValidationVariables vars) { var validationItem = new ValidationItemViewModel(); ValidationPriority prio = ValidationPriority.High; ValidationResultType resultType = ValidationResultType.Failure; validationItem.Title = string.Format("Max post payout <= {0} for posts created within {1} days", vars.MaxPostPayoutAmount, vars.MaxPostPayoutDays); validationItem.Priority = prio; validationItem.PriorityDescription = prio.ToString(); validationItem.OrderId = 20; // get posts within given range in MaxReceivedPayoutDays var dateFrom = DateTime.Now.AddDays(-vars.MaxPostPayoutDays); decimal maxPayoutReceived = 0; double maxPayoutReceivedDays = 0; // check if we have sufficient data to run the validation if (model.LastRetrievedPostDate > dateFrom) { resultType = ValidationResultType.Neutral; validationItem.ResultMessage = string.Format(Resources.General.DataSetInsufficientWarning, model.LastRetrievedPostDate.ToString("yyyy-MM-dd HH:mm")); } else { // get posts within range var posts = model.Posts.Where(x => x.CreatedAt >= dateFrom).ToList(); if (posts != null && posts.Any()) { // get the post containing max value var maxReceived = posts.OrderByDescending(x => x.PaidOutTotal).Take(1).FirstOrDefault(); if (maxReceived != null) { maxPayoutReceived = maxReceived.PaidOutTotal; maxPayoutReceivedDays = Math.Floor(DateTime.Now.Subtract(maxReceived.CreatedAt).TotalDays); } } if (maxPayoutReceived > 0 && maxPayoutReceived <= vars.MaxPostPayoutAmount) { resultType = ValidationResultType.Success; } else { resultType = ValidationResultType.Failure; } } validationItem.ResultType = resultType; validationItem.ResultTypeDescription = resultType.ToString(); if (String.IsNullOrEmpty(validationItem.ResultMessage)) { validationItem.ResultMessage = string.Format("${0} is the highest payout for a post created {1} days ago", maxPayoutReceived.ToString("N"), maxPayoutReceivedDays); } return(validationItem); }
/// <summary> /// This method runs all validation rules and returns a summary of the results & rules /// </summary> /// <param name="model">The model containing already retrieved results like Author details, Post details etc. used to run validation on.</param> /// <param name="vars">The validation variables being used to run the validation on the data</param> /// <returns>Returns the model containing validation results</returns> public ValidationSummaryViewModel RunValidation(CurationDetailsViewModel model, ValidationVariables vars) { var result = new ValidationSummaryViewModel(); var validationItems = new List <ValidationItemViewModel>(); try { validationItems.Add(ValidationHelper.ValidatePostCreateDateRule(model, vars)); validationItems.Add(ValidationHelper.ValidatePostMaxPendingPayoutRule(model, vars)); validationItems.Add(ValidationHelper.ValidateTotalMaxPendingPayoutRule(model, vars)); validationItems.Add(ValidationHelper.ValidateMaxPostPayoutRule(model, vars)); validationItems.Add(ValidationHelper.ValidateAuthorReputationRule(model, vars)); validationItems.Add(ValidationHelper.ValidateMinPostsRule(model, vars)); validationItems.Add(ValidationHelper.ValidateMinCommentsRule(model, vars)); var upvoteAccountDetails = GetAccountDetails(vars.UpvoteAccount.Replace("@", "")); validationItems.Add(ValidationHelper.ValidateUpvoteAccountMinVPRule(upvoteAccountDetails, vars)); validationItems.Add(ValidationHelper.ValidateMinDaysSinceLastUpvoteFromUpvoteAccount(model.Author.Details.name, model.UpvoteAccountVotes, vars)); } catch (Exception ex) { _log.Error(ex); } result.Items = validationItems; return(result); }
public static ValidationItemViewModel ValidateMinCommentsRule(CurationDetailsViewModel model, ValidationVariables vars) { ValidationPriority prio = ValidationPriority.High; ValidationResultType resultType = ValidationResultType.Failure; var validationItem = new ValidationItemViewModel(); validationItem.Title = string.Format("Required minimum # comments {0} in last {1} days", vars.CommentsMin, vars.CommentsMinDays); validationItem.Priority = prio; validationItem.PriorityDescription = prio.ToString(); validationItem.OrderId = 50; // get comments within range var dateCheck = DateTime.Now.AddDays(-vars.CommentsMinDays); var commentCount = model.Comments.Count(x => x.TimeStamp >= dateCheck); if (commentCount >= vars.CommentsMin) { resultType = ValidationResultType.Success; validationItem.ResultMessage = string.Format("Author posted {0} comments in last {1} days.", commentCount, vars.CommentsMinDays); } else { if (model.LastTransactionDate > dateCheck) { resultType = ValidationResultType.Neutral; validationItem.ResultMessage = string.Format(Resources.General.DataSetInsufficientWarning, model.LastTransactionDate.ToString("yyyy-MM-dd HH:mm")); } else { resultType = ValidationResultType.Failure; validationItem.ResultMessage = string.Format("Author posted {0} comments in last {1} days.", commentCount, vars.CommentsMinDays); } } validationItem.ResultType = resultType; validationItem.ResultTypeDescription = resultType.ToString(); return(validationItem); }
public static ValidationItemViewModel ValidateUpvoteAccountMinVPRule(GetAccountsModel accountDetails, ValidationVariables vars) { ValidationPriority prio = ValidationPriority.High; ValidationResultType resultType = ValidationResultType.Failure; var validationItem = new ValidationItemViewModel(); validationItem.Title = string.Format("Minimum required VP for account {0} is {1} %", vars.UpvoteAccount, vars.VPMinRequired); validationItem.Priority = prio; validationItem.PriorityDescription = prio.ToString(); validationItem.OrderId = 60; // get comments within range var vpCalculated = CalculationHelper.CalculateVotingManaPercentage(accountDetails); if (vpCalculated >= vars.VPMinRequired) { resultType = ValidationResultType.Success; validationItem.ResultMessage = string.Format("VP of account {0} is {1} %.", vars.UpvoteAccount, vpCalculated.ToString("N")); } else { resultType = ValidationResultType.Failure; validationItem.ResultMessage = string.Format("VP of account {0} is {1} %.", vars.UpvoteAccount, vpCalculated.ToString("N")); } validationItem.ResultType = resultType; validationItem.ResultTypeDescription = resultType.ToString(); return(validationItem); }
public static ValidationItemViewModel ValidateAuthorReputationRule(CurationDetailsViewModel model, ValidationVariables vars) { ValidationPriority prio = ValidationPriority.High; ValidationResultType resultType = ValidationResultType.Failure; var validationItem = new ValidationItemViewModel(); validationItem.Title = string.Format("Author reputation is >= {0} and < {1}", vars.AuthorRepMin, vars.AuthorRepMax); validationItem.Priority = prio; validationItem.PriorityDescription = prio.ToString(); validationItem.OrderId = 35; // Check if the author rep value is within the required range if (model.Author.ReputationCalculated >= vars.AuthorRepMin && model.Author.ReputationCalculated < vars.AuthorRepMax) { resultType = ValidationResultType.Success; } else { resultType = ValidationResultType.Failure; } validationItem.ResultType = resultType; validationItem.ResultTypeDescription = resultType.ToString(); validationItem.ResultMessage = string.Format("Author reputation is {0}", model.Author.ReputationCalculated.ToString("N")); return(validationItem); }
public static ValidationItemViewModel ValidateTotalMaxPendingPayoutRule(CurationDetailsViewModel model, ValidationVariables vars) { var validationItem = new ValidationItemViewModel(); ValidationPriority prio = ValidationPriority.High; ValidationResultType resultType = ValidationResultType.Failure; validationItem.Title = string.Format("Total max pending payout value < {0}", vars.TotalMaxPendingPayout); validationItem.Priority = prio; validationItem.PriorityDescription = prio.ToString(); validationItem.OrderId = 30; // if the oldest post retrieved is a more recent post than 1 week before current date, we don't have enough data to validate this rule var dateCheck = DateTime.Now.AddDays(-7); if (model.LastRetrievedPostDate > dateCheck) { if (model.Author.PendingPostPayout > vars.TotalMaxPendingPayout) { resultType = ValidationResultType.Failure; } else { resultType = ValidationResultType.Neutral; validationItem.ResultMessage = string.Format(Resources.General.DataSetInsufficientWarning, model.LastRetrievedPostDate.ToString("yyyy-MM-dd HH:mm")); } } else { if (model.Author.PendingPostPayout < vars.TotalMaxPendingPayout) { resultType = ValidationResultType.Success; } else { resultType = ValidationResultType.Failure; } } validationItem.ResultType = resultType; validationItem.ResultTypeDescription = resultType.ToString(); if (String.IsNullOrEmpty(validationItem.ResultMessage)) { validationItem.ResultMessage = string.Format("Total pending payout value = ${0}", model.Author.PendingPostPayout.ToString("N")); } return(validationItem); }
public static ValidationItemViewModel ValidatePostCreateDateRule(CurationDetailsViewModel model, ValidationVariables vars) { ValidationPriority prio = ValidationPriority.High; ValidationResultType resultType = ValidationResultType.Failure; var validationItem = new ValidationItemViewModel(); validationItem.Title = string.Format("Post creation date is >= {0} minutes and < {1} hours", vars.PostCreatedAtMin, vars.PostCreatedAtMax / 60); validationItem.Priority = prio; validationItem.PriorityDescription = prio.ToString(); validationItem.OrderId = 10; var postCreatedDate = model.BlogPost.Details.created; // Check if the post creation date is between the required ranges if (DateTime.Now >= postCreatedDate.AddMinutes(vars.PostCreatedAtMin) && DateTime.Now < postCreatedDate.AddMinutes(vars.PostCreatedAtMax)) { resultType = ValidationResultType.Success; } else { resultType = ValidationResultType.Failure; } validationItem.ResultType = resultType; validationItem.ResultTypeDescription = resultType.ToString(); var span = (TimeSpan)(DateTime.Now - postCreatedDate); validationItem.ResultMessage = string.Format("Post created {0} days, {1} hours, {2} minutes ago.", span.Days, span.Hours, span.Minutes); return(validationItem); }
public static ValidationItemViewModel ValidatePostMaxPendingPayoutRule(CurationDetailsViewModel model, ValidationVariables vars) { var validationItem = new ValidationItemViewModel(); ValidationPriority prio = ValidationPriority.High; ValidationResultType resultType = ValidationResultType.Failure; validationItem.Title = string.Format("Post max pending payout value < {0}", vars.PostMaxPendingPayout); validationItem.Priority = prio; validationItem.PriorityDescription = prio.ToString(); validationItem.OrderId = 25; decimal postPendingPayoutValue = 0; var postPendingPayoutString = model.BlogPost.Details.pending_payout_value.Replace("SBD", "").Trim(); Decimal.TryParse(postPendingPayoutString, out postPendingPayoutValue); // check if the pending payout value of the post is less than the max payout setting if (postPendingPayoutValue < vars.PostMaxPendingPayout) { resultType = ValidationResultType.Success; } else { resultType = ValidationResultType.Failure; } validationItem.ResultType = resultType; validationItem.ResultTypeDescription = resultType.ToString(); validationItem.ResultMessage = string.Format("Post pending payout value = ${0}", postPendingPayoutValue.ToString("N")); return(validationItem); }
public static ValidationItemViewModel ValidateMinDaysSinceLastUpvoteFromUpvoteAccount(string author, GetAccountVotesViewModel model, ValidationVariables vars) { var validationItem = new ValidationItemViewModel(); ValidationPriority prio = ValidationPriority.High; ValidationResultType resultType = ValidationResultType.Failure; validationItem.Title = string.Format("Min amount of days after the last upvote from {0} to {1} >= {2} with percentage >= {3}", vars.UpvoteAccount, author, vars.MinDaysLastUpvoteFromUpvoteAccount, vars.MinPercentageUpvoteFromUpvoteAccount); validationItem.Priority = prio; validationItem.PriorityDescription = prio.ToString(); validationItem.OrderId = 60; var dateFrom = DateTime.Now.AddDays(-vars.MinDaysLastUpvoteFromUpvoteAccount); if (model.MostRecentUpvote != null && model.MostRecentUpvote.last_update > dateFrom) { resultType = ValidationResultType.Failure; var dateDiffDays = DateTime.Now.Subtract(model.MostRecentUpvote.last_update).TotalDays; validationItem.ResultMessage = string.Format("Last received upvote from {0} to {1} is {2} days ago", vars.UpvoteAccount, author, dateDiffDays.ToString("N")); } else { resultType = ValidationResultType.Success; if (model.MostRecentUpvote != null) { var dateDiffDays = DateTime.Now.Subtract(model.MostRecentUpvote.last_update).TotalDays; validationItem.ResultMessage = string.Format("Last received upvote from {0} to {1} is {2} days ago with {3} %", vars.UpvoteAccount, author, dateDiffDays.ToString("N"), (model.MostRecentUpvote.vote_percent / 100).ToString("N")); } else { validationItem.ResultMessage = string.Format("Author {0} never received a vote from {1}", author, vars.UpvoteAccount); } } validationItem.ResultType = resultType; validationItem.ResultTypeDescription = resultType.ToString(); return(validationItem); }