在js建立声誉/业力系统

时间:2018-04-18 15:53:08

标签: javascript angular firebase firebase-realtime-database

所以这就是绊倒我:

  • 当用户赞成帖子时,他们会获得+2业力。

  • 当用户向帖子投票时,他们会获得+2业力。

  • 当用户取消/删除他们的投票时,他们会获得-2业力。 (净0)

  • 被低估的用户帖子会获得-2业力。

  • 投赞的用户帖子会获得+2业力。

  • 如果某人取消/删除了他们的投票,那么发布的用户会获得-2(如果它是一个upvote)和+2如果它是downvote ..(net 0)

    < / LI>

我不知道这是否合理,但基本上我想奖励人们投票并惩罚人们创造不好的帖子..

这就是我所拥有的:

在我的数据库中,如果某个帖子获得了this.userVote {$ 1}},则downvote为1,并且他们的投票结果为-1

0

所以这可以按预期工作,如上所述。

问题是,我不确定如何设置业力以使其按预期工作。

我目前正在执行以下行来更新用户业力以及海报业力:

upvote() {
   let vote = this.userVote == 1 ? 0 : 1;
   this.database.list('/upvotes/'+this.postData.id).set(this.userData.uid, vote)
}

downvote() {
    let vote = this.userVote == -1 ? 0 : -1;
    this.database.list('/upvotes/'+this.postData.id).set(this.userData.uid, vote)
}

如何将变量this.database.database.ref('users/'+this.userData.uid).update({'karma': this.userKarma + karma}) //this.userKarma is the users karma this.database.database.ref('users/'+this.postData.uid).update({'karma': this.postKarma + karma}) //this.postKarma is the karma of the user who created the post 设置为如上所述..

有什么建议吗?谢谢!

2 个答案:

答案 0 :(得分:1)

您可以使用Firebase Transaction system。事务是原子(firebase中没有真正的原子性)更新数据的一种方式。

例如,将业力减少1

this.database.database.ref('users/'+this.userData.uid).child('karma')
    .transaction(function(karma){
        if (!karma)
            return 0;
        return karma - 1;
});

答案 1 :(得分:0)

我最终解决了这个问题:

getKarmaDelta(prevVote, vote) {
    if((prevVote !== 1 && prevVote !== -1) && (vote === 1 || vote === -1)) {
      this.updateUserKarma(2)
    } else if (vote === 0) {
      this.updateUserKarma(-2)
    }
      if(vote === -1 || (vote === 0 && prevVote === 1)) {
        this.updatePosterKarma(-2)
      } else if (vote === 1 || (vote === 0 && prevVote === -1)) {
        this.updatePosterKarma(2)
      }
  }

希望这有助于其他人。