contrib/nitrpg: add some achievements on IssueComments
authorAlexandre Terrasa <alexandre@moz-code.org>
Mon, 23 Feb 2015 11:07:04 +0000 (12:07 +0100)
committerAlexandre Terrasa <alexandre@moz-code.org>
Tue, 21 Apr 2015 23:37:49 +0000 (19:37 -0400)
Signed-off-by: Alexandre Terrasa <alexandre@moz-code.org>

contrib/nitrpg/src/achievements.nit
contrib/nitrpg/src/listener.nit
contrib/nitrpg/src/statistics.nit

index 625bfc2..eeae17e 100644 (file)
@@ -400,3 +400,119 @@ class Player10KCommits
        redef var reward = 10000
        redef var threshold = 10000
 end
+
+#####################
+### Issue Comments
+#####################
+
+# Unlock achievement after X issue comments.
+#
+# Used to factorize behavior.
+abstract class PlayerXComments
+       super AchievementReactor
+
+       # Number of comments required to unlock the achievement.
+       var threshold: Int is noinit
+
+       redef fun react_event(game, event) do
+               if not event isa IssueCommentEvent then return
+               if not event.action == "created" then return
+               var player = event.comment.user.player(game)
+               if player.stats["comments"] == threshold then
+                       var a = new_achievement(game)
+                       player.unlock_achievement(a, event)
+               end
+       end
+end
+
+# Player author his first comment in issues.
+class Player1Comment
+       super PlayerXComments
+
+       redef var id = "player_1_comment"
+       redef var name = "From lurker to member"
+       redef var desc = "Comment on an issue."
+       redef var reward = 10
+       redef var threshold = 1
+end
+
+# Player author 100 issue comments.
+class Player100Comments
+       super PlayerXComments
+
+       redef var id = "player_100_comments"
+       redef var name = "Chatter"
+       redef var desc = "Comment 100 times on issues."
+       redef var reward = 100
+       redef var threshold = 100
+end
+
+# Player author 1000 issue comments.
+class Player1KComments
+       super PlayerXComments
+
+       redef var id = "player_1000__comments"
+       redef var name = "You sir, talk a lot!"
+       redef var desc = "Comment 1000 times on issues."
+       redef var reward = 1000
+       redef var threshold = 1000
+end
+
+# Ping @privat in a comment.
+class PlayerPingGod
+       super AchievementReactor
+
+       redef var id = "player_ping_god"
+       redef var name = "Ping god"
+       redef var desc = "Ping the owner of the repo for the first time."
+       redef var reward = 50
+
+       redef fun react_event(game, event) do
+               if not event isa IssueCommentEvent then return
+               var owner = game.repo.owner.login
+               if event.comment.body.has("@{owner}".to_re) then
+                       var player = event.comment.user.player(game)
+                       var a = new_achievement(game)
+                       player.unlock_achievement(a, event)
+               end
+       end
+end
+
+# Give your first +1
+class PlayerFirstReview
+       super AchievementReactor
+
+       redef var id = "player_first_review"
+       redef var name = "First +1"
+       redef var desc = "Give a +1 for the first time."
+       redef var reward = 10
+
+       redef fun react_event(game, event) do
+               if not event isa IssueCommentEvent then return
+               # FIXME use a more precise way to locate reviews
+               if event.comment.has_ok_review then
+                       var player = event.comment.user.player(game)
+                       var a = new_achievement(game)
+                       player.unlock_achievement(a, event)
+               end
+       end
+end
+
+# Talk about nitcoin in issue comments.
+class PlayerSaysNitcoin
+       super AchievementReactor
+
+       redef var id = "player_says_nitcoin"
+       redef var name = "Talking about money"
+       redef var desc = "Say something about nitcoins in a comment."
+       redef var reward = 10
+
+       redef fun react_event(game, event) do
+               if not event isa IssueCommentEvent then return
+               if event.comment.body.has("(n|N)itcoin".to_re) then
+                       var player = event.comment.user.player(game)
+                       var a = new_achievement(game)
+                       player.unlock_achievement(a, event)
+               end
+       end
+end
index 0e4ba00..8bee99b 100644 (file)
@@ -63,6 +63,8 @@ l.add_reactor(new Player1Issue, new Player100Issues, new Player1KIssues)
 l.add_reactor(new Player1Pull, new Player100Pulls, new Player1KPulls)
 l.add_reactor(new Player1Commit, new Player100Commits, new Player1KCommits)
 l.add_reactor(new IssueAboutNitdoc, new IssueAboutFFI)
+l.add_reactor(new Player1Comment, new Player100Comments, new Player1KComments)
+l.add_reactor(new PlayerPingGod, new PlayerFirstReview, new PlayerSaysNitcoin)
 
 print "Listening events on {host}:{port}"
 l.listen
index dfdb3ba..7b493c6 100644 (file)
@@ -187,3 +187,27 @@ redef class PullRequestEvent
                end
        end
 end
+
+redef class IssueCommentEvent
+
+       # Count posted comments
+       redef fun react_stats_event(game) do
+               if action == "created" then
+                       var player = comment.user.player(game)
+                       game.stats.inc("comments")
+                       player.stats.inc("comments")
+                       # FIXME use a more precise way to locate reviews
+                       if comment.has_ok_review then
+                               game.stats.inc("reviews")
+                               player.stats.inc("reviews")
+                       end
+                       game.save
+                       player.save
+               end
+       end
+end
+
+redef class IssueComment
+       # Does this comment contain a "+1"?
+       fun has_ok_review: Bool do return body.has("\\+1\\b".to_re)
+end