public async Task <IActionResult> Submit([FromForm] MessageRequestViewModel messageRequest) { if (!ModelState.IsValid) { return(BadRequest()); } PublicProfile profile = null; if (!messageRequest.IsAnonymous && _signInManager.IsSignedIn(User)) { profile = await _userManager.GetPublicProfileByUserAsync(User); } var model = new Message { Author = profile, Content = messageRequest.Content, PublishDate = DateTime.Now }; if (profile != null) { var baseValue = ReviewSubmitExperienceReward; var recentMessages = await GetRecentMessagesCountAsync(profile) * SubsequentReviewModifier; baseValue = Math.Max(baseValue - recentMessages, 0); if (baseValue > 0) { var realXpGained = profile.AddExperience(baseValue); if (realXpGained > 0) { ViewBag.HasExperience = true; ViewBag.GainedExperience = baseValue; } } } await _context.WebsiteReviews.AddAsync(model); await _context.SaveChangesAsync(); _cache.Remove(Cache.LastReviews); // refresh the cache ViewBag.IsRecent = true; return(PartialView("_ReviewPartial", model)); }
private static void ProcessExperience(int diff, PublicProfile author, bool isFromDownVote = false) { if (diff == 0) { return; } var sign = Math.Clamp(diff, -1, 1); var downvoteXp = diff * UpvoteExperienceBonus / 4; var xp = UpvoteExperienceBonus * sign; if (isFromDownVote && diff <= 1) { xp = downvoteXp; } if (diff > 1 || diff < -1) // big vote (upvote -> downvote) { xp += (downvoteXp / diff) * sign; } author.AddExperience(xp); }