Skip to content

Commit 461382b

Browse files
committed
Decay karma
1 parent 161b566 commit 461382b

File tree

2 files changed

+22
-7
lines changed

2 files changed

+22
-7
lines changed

src/commands/ranking.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ const ranking: Command = {
2020
...data.map(({ _id: memberId, value }, index) => {
2121
return `\`${(index + 1).toString().padStart(2, ' ')}\`. ${
2222
msg.guild?.members.cache.get(memberId)?.displayName ?? ''
23-
}${value} ${getEmojiForKarmaValue(value)}`;
23+
}${value.toFixed(2)} ${getEmojiForKarmaValue(value)}`;
2424
}),
2525
];
2626

src/data/karma.ts

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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

1529
export 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

3549
export 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+
4055
const karmaEmojis = [
4156
'👋',
4257
'👍',

0 commit comments

Comments
 (0)