✨ Mix awarded score into ranks
This commit is contained in:
@@ -19,12 +19,12 @@ public class ActivityService(
|
|||||||
{
|
{
|
||||||
private static double CalculateHotRank(Post.Post post, Instant now)
|
private static double CalculateHotRank(Post.Post post, Instant now)
|
||||||
{
|
{
|
||||||
var performanceScore = post.Upvotes - post.Downvotes + post.RepliesCount;
|
var performanceScore = post.Upvotes - post.Downvotes + post.RepliesCount + (int)post.AwardedScore / 10;
|
||||||
var postTime = post.PublishedAt ?? post.CreatedAt;
|
var postTime = post.PublishedAt ?? post.CreatedAt;
|
||||||
var timeScore = (now - postTime).TotalMinutes;
|
var timeScore = (now - postTime).TotalMinutes;
|
||||||
// Add 1 to score to prevent negative results for posts with more downvotes than upvotes
|
// Add 1 to score to prevent negative results for posts with more downvotes than upvotes
|
||||||
// Time dominates ranking, performance adjusts within similar timeframes.
|
// Time dominates ranking, performance adjusts within similar timeframes.
|
||||||
var performanceWeight = Math.Log(performanceScore + 5); // smooth adjustment, median ~4-5
|
var performanceWeight = performanceScore + 5;
|
||||||
// Normalize time influence since average post interval ~60 minutes
|
// Normalize time influence since average post interval ~60 minutes
|
||||||
var normalizedTime = timeScore / 60.0;
|
var normalizedTime = timeScore / 60.0;
|
||||||
return performanceWeight / Math.Pow(normalizedTime + 1.0, 1.2);
|
return performanceWeight / Math.Pow(normalizedTime + 1.0, 1.2);
|
||||||
|
@@ -848,12 +848,19 @@ public partial class PostService(
|
|||||||
g => g.Count()
|
g => g.Count()
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// Load awardsScores for postsInPeriod
|
||||||
|
var awardsScores = await db.Posts
|
||||||
|
.Where(p => postsInPeriod.Contains(p.Id))
|
||||||
|
.ToDictionaryAsync(p => p.Id, p => p.AwardedScore);
|
||||||
|
|
||||||
var reactSocialPoints = postsInPeriod
|
var reactSocialPoints = postsInPeriod
|
||||||
.Select(postId => new
|
.Select(postId => new
|
||||||
{
|
{
|
||||||
PostId = postId,
|
PostId = postId,
|
||||||
Count = (reactionScores.TryGetValue(postId, out var rScore) ? rScore : 0) +
|
Count =
|
||||||
(repliesCounts.TryGetValue(postId, out var repCount) ? repCount : 0)
|
(reactionScores.TryGetValue(postId, out var rScore) ? rScore : 0)
|
||||||
|
+ (repliesCounts.TryGetValue(postId, out var repCount) ? repCount : 0)
|
||||||
|
+ (awardsScores.TryGetValue(postId, out var awardScore) ? (int)(awardScore / 10) : 0)
|
||||||
})
|
})
|
||||||
.OrderByDescending(e => e.Count)
|
.OrderByDescending(e => e.Count)
|
||||||
.Take(5)
|
.Take(5)
|
||||||
@@ -877,7 +884,7 @@ public partial class PostService(
|
|||||||
SocialCredits = e.Value
|
SocialCredits = e.Value
|
||||||
}).ToList();
|
}).ToList();
|
||||||
|
|
||||||
if (records.Any())
|
if (records.Count != 0)
|
||||||
{
|
{
|
||||||
db.PostFeaturedRecords.AddRange(records);
|
db.PostFeaturedRecords.AddRange(records);
|
||||||
await db.SaveChangesAsync();
|
await db.SaveChangesAsync();
|
||||||
|
Reference in New Issue
Block a user