@@ -8,15 +8,29 @@ export type KarmaAgg = {
88 readonly value : number ;
99} ;
1010
11- const karmaAggregateGroup = {
12- $group : { _id : '$to' , from : { $push : '$from' } , value : { $sum : '$value' } } ,
13- } as const ;
11+ const RATE_OF_DECAY = 1000 * 60 * 60 * 24 * ( 365 / 2 ) ; // half every half a year
12+
13+ const karmaAggregateGroup = [
14+ {
15+ $project : {
16+ to : '$to' ,
17+ from : '$from' ,
18+ value : {
19+ $multiply : [
20+ '$value' ,
21+ { $exp : { $divide : [ { $subtract : [ '$createdAt' , new Date ( ) ] } , RATE_OF_DECAY ] } } ,
22+ ] ,
23+ } ,
24+ } ,
25+ } ,
26+ { $group : { _id : '$to' , from : { $push : '$from' } , value : { $sum : '$value' } } } ,
27+ ] as const ;
1428
1529export const getKarmaForMember = async ( memberId : string , db : Db ) => {
1630 const karmaCollection = getKarmaCollection ( db ) ;
1731
1832 const [ agg ] = await karmaCollection
19- . aggregate < KarmaAgg | undefined > ( [ { $match : { to : memberId } } , karmaAggregateGroup ] )
33+ . aggregate < KarmaAgg | undefined > ( [ { $match : { to : memberId } } , ... karmaAggregateGroup ] )
2034 . toArray ( ) ;
2135 return agg ;
2236} ;
@@ -25,7 +39,7 @@ export const getKarmaForMembers = async (db: Db) => {
2539 const karmaCollection = getKarmaCollection ( db ) ;
2640
2741 const agg = await karmaCollection
28- . aggregate < KarmaAgg | undefined > ( [ karmaAggregateGroup ] )
42+ . aggregate < KarmaAgg | undefined > ( [ ... karmaAggregateGroup ] )
2943 . sort ( { value : - 1 } )
3044 . limit ( 10 )
3145 . toArray ( ) ;
@@ -34,9 +48,10 @@ export const getKarmaForMembers = async (db: Db) => {
3448
3549export const getEmojiForKarmaValue = ( value : number ) => {
3650 const adjustedValue = Math . floor ( Math . sqrt ( value + 1 ) - 1 ) ;
37- const idx = Math . min ( karmaEmojis . length , adjustedValue ) ;
51+ const idx = Math . min ( karmaEmojis . length - 1 , adjustedValue ) ;
3852 return karmaEmojis [ idx ] ;
3953} ;
54+
4055const karmaEmojis = [
4156 '👋' ,
4257 '👍' ,
0 commit comments