1 # This file is part of NIT ( http://www.nitlanguage.org ).
3 # Copyright 2014-2015 Alexandre Terrasa <alexandre@moz-code.org>
5 # Licensed under the Apache License, Version 2.0 (the "License");
6 # you may not use this file except in compliance with the License.
7 # You may obtain a copy of the License at
9 # http://www.apache.org/licenses/LICENSE-2.0
11 # Unless required by applicable law or agreed to in writing, software
12 # distributed under the License is distributed on an "AS IS" BASIS,
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 # See the License for the specific language governing permissions and
15 # limitations under the License.
17 # Various implementations of `GameReactor` can be found here.
22 # Reacts to event that can affect players (like giving nitcoins).
26 # Nitcoins rewarded when the player opens a new pull request.
29 # Nitcoins rewarded when the player reviews a pull request.
30 var nc_pull_review
= 2
32 # Nitcoins rewarded when the player has a commit merged.
33 var nc_commit_merged
= 1
35 redef fun react_event
(game
, e
) do e
.react_player_event
(self, game
)
38 redef class GithubEvent
39 # Reacts to a player related event.
41 # Called by `PlayerReactor::react_event`.
43 private fun react_player_event
(reactor
: PlayerReactor, game
: Game) do end
45 # Generates a GameEvent preinitialized for a reward event.
46 private fun player_reward_event
(kind
: String, player
: Player, reward
: Int): GameEvent do
47 var obj
= new JsonObject
48 obj
["player"] = player
.name
49 obj
["reward"] = reward
50 obj
["github_event"] = self
51 var event
= new GameEvent(player
.game
, kind
, obj
)
52 player
.game
.add_event
(event
)
57 redef class PullRequestEvent
59 # Rewards player for opened pull requests.
60 redef fun react_player_event
(r
, game
) do
61 if action
== "opened" or action
== "reopened" then
62 react_pull_open
(r
, game
)
63 else if action
== "closed" then
64 react_pull_close
(r
, game
)
68 private fun react_pull_open
(r
: PlayerReactor, game
: Game) do
69 var player
= pull
.user
.player
(game
)
70 player
.nitcoins
+= r
.nc_pull_open
72 var event
= player_reward_event
("pull_open", player
, r
.nc_pull_open
)
73 player
.add_event
(event
)
76 private fun react_pull_close
(r
: PlayerReactor, game
: Game) do
77 var player
= pull
.user
.player
(game
)
81 reward
= pull
.commits
* r
.nc_commit_merged
82 event
= player_reward_event
("pull_merged", player
, reward
)
84 reward
= -r
.nc_pull_open
85 event
= player_reward_event
("pull_closed", player
, reward
)
87 player
.nitcoins
+= reward
89 player
.add_event
(event
)
93 redef class IssueCommentEvent
95 # Rewards player for review comments.
97 # TODO only give nitcoins if reviewers < 2
98 # TODO give more points to first reviewer
99 redef fun react_player_event
(r
, game
) do
100 if comment
.is_ack
then
101 react_player_review
(r
, game
)
105 # TODO same player should not be authorized to review multiple times? How to handle rerols?
106 private fun react_player_review
(r
: PlayerReactor, game
: Game) do
107 if issue
.state
== "closed" then return
108 var player
= comment
.user
.player
(game
)
109 if issue
.user
== player
.user
then return
110 player
.nitcoins
+= r
.nc_pull_review
112 var event
= player_reward_event
("pull_review", player
, r
.nc_pull_review
)
113 player
.add_event
(event
)