Merge: concurrent_collections: Add implementation of has method
[nit.git] / contrib / nitrpg / src / reactors.nit
1 # This file is part of NIT ( http://www.nitlanguage.org ).
2 #
3 # Copyright 2014-2015 Alexandre Terrasa <alexandre@moz-code.org>
4 #
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
8 #
9 # http://www.apache.org/licenses/LICENSE-2.0
10 #
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.
16
17 # Various implementations of `GameReactor` can be found here.
18 module reactors
19
20 import events
21
22 # Reacts to event that can affect players (like giving nitcoins).
23 class PlayerReactor
24 super GameReactor
25
26 # Nitcoins rewarded when the player opens a new pull request.
27 var nc_pull_open = 10
28
29 # Nitcoins rewarded when the player reviews a pull request.
30 var nc_pull_review = 2
31
32 # Nitcoins rewarded when the player has a commit merged.
33 var nc_commit_merged = 1
34
35 redef fun react_event(game, e) do e.react_player_event(self, game)
36 end
37
38 redef class GithubEvent
39 # Reacts to a player related event.
40 #
41 # Called by `PlayerReactor::react_event`.
42 # No-op by default.
43 private fun react_player_event(reactor: PlayerReactor, game: Game) do end
44
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)
53 return event
54 end
55 end
56
57 redef class PullRequestEvent
58
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)
65 end
66 end
67
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
71 player.save
72 var event = player_reward_event("pull_open", player, r.nc_pull_open)
73 player.add_event(event)
74 end
75
76 private fun react_pull_close(r: PlayerReactor, game: Game) do
77 var player = pull.user.player(game)
78 var reward
79 var event
80 if pull.merged then
81 reward = pull.commits * r.nc_commit_merged
82 event = player_reward_event("pull_merged", player, reward)
83 else
84 reward = -r.nc_pull_open
85 event = player_reward_event("pull_closed", player, reward)
86 end
87 player.nitcoins += reward
88 player.save
89 player.add_event(event)
90 end
91 end
92
93 redef class IssueCommentEvent
94
95 # Rewards player for review comments.
96 #
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)
102 end
103 end
104
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
111 player.save
112 var event = player_reward_event("pull_review", player, r.nc_pull_review)
113 player.add_event(event)
114 end
115 end