From 8376f556e9ecbd7769a0efb3e3d6aa4ee3178bce Mon Sep 17 00:00:00 2001 From: Alexandre Terrasa Date: Mon, 23 Feb 2015 12:07:04 +0100 Subject: [PATCH] contrib/nitrpg: add some achievements on IssueComments Signed-off-by: Alexandre Terrasa --- contrib/nitrpg/src/achievements.nit | 116 +++++++++++++++++++++++++++++++++++ contrib/nitrpg/src/listener.nit | 2 + contrib/nitrpg/src/statistics.nit | 24 ++++++++ 3 files changed, 142 insertions(+) diff --git a/contrib/nitrpg/src/achievements.nit b/contrib/nitrpg/src/achievements.nit index 625bfc2..eeae17e 100644 --- a/contrib/nitrpg/src/achievements.nit +++ b/contrib/nitrpg/src/achievements.nit @@ -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 diff --git a/contrib/nitrpg/src/listener.nit b/contrib/nitrpg/src/listener.nit index 0e4ba00..8bee99b 100644 --- a/contrib/nitrpg/src/listener.nit +++ b/contrib/nitrpg/src/listener.nit @@ -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 diff --git a/contrib/nitrpg/src/statistics.nit b/contrib/nitrpg/src/statistics.nit index dfdb3ba..7b493c6 100644 --- a/contrib/nitrpg/src/statistics.nit +++ b/contrib/nitrpg/src/statistics.nit @@ -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 -- 1.7.9.5