aboutsummaryrefslogtreecommitdiffhomepage
path: root/server/lib/files-cache/actor-follow-score-cache.ts
blob: d070bde09fbdff1b15e27e1876e4488a759a7074 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import { ACTOR_FOLLOW_SCORE } from '../../initializers'
import { logger } from '../../helpers/logger'

// Cache follows scores, instead of writing them too often in database
// Keep data in memory, we don't really need Redis here as we don't really care to loose some scores
class ActorFollowScoreCache {

  private static instance: ActorFollowScoreCache
  private pendingFollowsScore: { [ url: string ]: number } = {}

  private constructor () {}

  static get Instance () {
    return this.instance || (this.instance = new this())
  }

  updateActorFollowsScore (goodInboxes: string[], badInboxes: string[]) {
    if (goodInboxes.length === 0 && badInboxes.length === 0) return

    logger.info('Updating %d good actor follows and %d bad actor follows scores in cache.', goodInboxes.length, badInboxes.length)

    for (const goodInbox of goodInboxes) {
      if (this.pendingFollowsScore[goodInbox] === undefined) this.pendingFollowsScore[goodInbox] = 0

      this.pendingFollowsScore[goodInbox] += ACTOR_FOLLOW_SCORE.BONUS
    }

    for (const badInbox of badInboxes) {
      if (this.pendingFollowsScore[badInbox] === undefined) this.pendingFollowsScore[badInbox] = 0

      this.pendingFollowsScore[badInbox] += ACTOR_FOLLOW_SCORE.PENALTY
    }
  }

  getPendingFollowsScoreCopy () {
    return this.pendingFollowsScore
  }

  clearPendingFollowsScore () {
    this.pendingFollowsScore = {}
  }
}

export {
  ActorFollowScoreCache
}