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 # Display `nitrpg` data as a website.
23 # A custom action forn `nitrpg`.
27 # Root URL is used as a prefix for all URL generated by the actions.
30 # Github oauth token used for GithubAPI.
31 var auth
: String is lazy
do return get_github_oauth
33 # API client used to import data from Github.
34 var api
: GithubAPI is lazy
do
35 var api
= new GithubAPI(auth
)
42 print
"Error: Invalid Github oauth token!"
47 # Return an Error reponse page.
48 fun bad_request
(msg
: String): HttpResponse do
49 var rsp
= new HttpResponse(400)
50 var page
= new NitRpgPage(root_url
)
51 var error
= new ErrorPanel(msg
)
52 page
.flow_panels
.add error
53 rsp
.body
= page
.write_to_string
58 # An action that require a game.
63 var page
: NitRpgPage is noinit
66 var game
: Game is noinit
68 redef fun answer
(request
, url
) is abstract
70 # Check errors and prepare response.
71 private fun prepare_response
(request
: HttpRequest, url
: String): HttpResponse do
72 var owner
= request
.param
("owner")
73 var repo_name
= request
.param
("repo")
74 if owner
== null or repo_name
== null then
75 var msg
= "Bad request: should look like /repos/:owner/:repo."
76 return bad_request
(msg
)
78 var repo
= new Repo(api
, "{owner}/{repo_name}")
79 game
= new Game(api
, repo
)
80 game
.root_url
= root_url
82 var msg
= api
.last_error
.message
83 return bad_request
("Repo Error: {msg}")
85 var response
= new HttpResponse(200)
86 page
= new NitRpgPage(root_url
)
87 page
.side_panels
.add
new GameStatusPanel(game
)
88 page
.breadcrumbs
= new Breadcrumbs
89 page
.breadcrumbs
.add_link
(game
.url
, game
.name
)
98 redef fun answer
(request
, url
) do
99 var rsp
= prepare_response
(request
, url
)
100 page
.side_panels
.add
new ShortListPlayersPanel(game
)
101 page
.flow_panels
.add
new PodiumPanel(game
)
102 rsp
.body
= page
.write_to_string
111 redef fun answer
(request
, url
) do
112 var rsp
= prepare_response
(request
, url
)
113 page
.breadcrumbs
.add_link
(game
.url
/ "players", "players")
114 page
.flow_panels
.add
new ListPlayersPanel(game
)
115 rsp
.body
= page
.write_to_string
120 # Player details page.
124 redef fun answer
(request
, url
) do
125 var rsp
= prepare_response
(request
, url
)
126 var name
= request
.param
("player")
128 var msg
= "Bad request: should look like /:owner/:repo/:players/:name."
129 return bad_request
(msg
)
131 var player
= game
.load_player
(name
)
132 if player
== null then
133 return bad_request
("Request Error: unknown player {name}.")
135 page
.breadcrumbs
.add_link
(game
.url
/ "players", "players")
136 page
.breadcrumbs
.add_link
(player
.url
, name
)
137 page
.side_panels
.clear
138 page
.side_panels
.add
new PlayerStatusPanel(game
, player
)
139 page
.flow_panels
.add
new PlayerReviewsPanel(game
, player
)
140 rsp
.body
= page
.write_to_string
145 if args
.length
!= 3 then
146 print
"Error: missing argument"
149 print
"web <host> <port> <root_url>"
157 var iface
= "{host}:{port}"
158 var vh
= new VirtualHost(iface
)
159 vh
.routes
.add
new Route("/styles/", new FileServer("www/styles"))
160 vh
.routes
.add
new Route("/games/:owner/:repo/players/:player", new PlayerHome(root
))
161 vh
.routes
.add
new Route("/games/:owner/:repo/players", new ListPlayers(root
))
162 vh
.routes
.add
new Route("/games/:owner/:repo", new RepoHome(root
))
164 var fac
= new HttpFactory.and_libevent
165 fac
.config
.virtual_hosts
.add vh
167 print
"Launching server on http://{iface}/"