X-Git-Url: http://nitlanguage.org diff --git a/contrib/nitrpg/src/reactors.nit b/contrib/nitrpg/src/reactors.nit index 33545b7..79a3682 100644 --- a/contrib/nitrpg/src/reactors.nit +++ b/contrib/nitrpg/src/reactors.nit @@ -17,7 +17,7 @@ # Various implementations of `GameReactor` can be found here. module reactors -import game +import events # Reacts to event that can affect players (like giving nitcoins). class PlayerReactor @@ -29,6 +29,9 @@ class PlayerReactor # Nitcoins rewarded when the player reviews a pull request. var nc_pull_review = 2 + # Nitcoins rewarded when the player has a commit merged. + var nc_commit_merged = 1 + redef fun react_event(game, e) do e.react_player_event(self, game) end @@ -38,6 +41,17 @@ redef class GithubEvent # Called by `PlayerReactor::react_event`. # No-op by default. private fun react_player_event(reactor: PlayerReactor, game: Game) do end + + # Generates a GameEvent preinitialized for a reward event. + private fun player_reward_event(kind: String, player: Player, reward: Int): GameEvent do + var obj = new JsonObject + obj["player"] = player.name + obj["reward"] = reward + obj["github_event"] = json + var event = new GameEvent(player.game, kind, obj) + player.game.add_event(event) + return event + end end redef class PullRequestEvent @@ -45,11 +59,29 @@ redef class PullRequestEvent # Rewards player for opened pull requests. redef fun react_player_event(r, game) do if action == "opened" then - var player = pull.user.player(game) - player.nitcoins += r.nc_pull_open - player.save + react_pull_open(r, game) + else if action == "closed" then + react_pull_close(r, game) end end + + private fun react_pull_open(r: PlayerReactor, game: Game) do + var player = pull.user.player(game) + player.nitcoins += r.nc_pull_open + player.save + var event = player_reward_event("pull_open", player, r.nc_pull_open) + player.add_event(event) + end + + private fun react_pull_close(r: PlayerReactor, game: Game) do + if not pull.merged then return + var player = pull.user.player(game) + var reward = pull.commits * r.nc_commit_merged + player.nitcoins += reward + player.save + var event = player_reward_event("pull_merged", player, reward) + player.add_event(event) + end end redef class IssueCommentEvent @@ -62,9 +94,15 @@ redef class IssueCommentEvent redef fun react_player_event(r, game) do # FIXME use a more precise way to locate reviews if comment.body.has("\\+1\\b".to_re) then - var player = comment.user.player(game) - player.nitcoins += r.nc_pull_review - player.save + react_player_review(r, game) end end + + private fun react_player_review(r: PlayerReactor, game: Game) do + var player = comment.user.player(game) + player.nitcoins += r.nc_pull_review + player.save + var event = player_reward_event("pull_review", player, r.nc_pull_review) + player.add_event(event) + end end