-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathboot.js
128 lines (98 loc) · 3.32 KB
/
boot.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
'use strict';
const config = require( '../config' );
const http = require( 'http' );
const url = require( 'url' );
const qs = require( 'querystring' );
const fs = require( 'fs' );
const Controller = require( './controller' );
const History = require( './model/history' );
const Aliases = require( './model/aliases' );
const Rank = require( './model/rank' );
const Stats = require( './model/stats' );
const StorageRepository = require( './storage' );
const storageRepository = new StorageRepository( '../data/' );
const history = new History( storageRepository.createStorage( 'history', [] ) );
const aliases = new Aliases( storageRepository.createStorage( 'aliases', {} ) );
const rank = new Rank( history, { numberOfDaysToBeAnOldBoy: 30, numberOfMatchesToStopBeingARookie: 20 } );
rank.reload();
const controller = new Controller( storageRepository, { history: history, aliases: aliases, rank: rank, config: config } );
const commands = [
{ name: 'aliases' },
{ name: 'delete-alias' },
{ name: 'expected' },
{ name: 'help' },
{ name: 'history' },
{ name: 'rank' },
{ name: 'registration', 'config': { timeToLive: 8 * 60 * 60 * 1000, randomize: true, randomizeFactor: 1 } },
{ name: 'remove' },
{ name: 'result' },
{ name: 'set-alias' },
{ name: 'stats' },
{ name: 'update' }
];
for ( let command of commands ) {
const Command = require( './command/' + command.name );
controller.addCommand( new Command( controller, command.config ) );
}
const server = http.createServer( function( request, response ) {
let requestData = '';
let jsonResponse;
if ( request.url.indexOf( '/stats/get' ) === 0 ) {
const query = url.parse( request.url, true ).query;
const stats = new Stats( rank );
response.writeHead( 200, { 'Content-Type': 'application/json' } );
response.end( JSON.stringify( query.player ? stats.getPlayerStats( query.player ) : stats.getFull() ) );
return;
}
if ( request.url.indexOf( '/stats?' ) === 0 ) {
fs.readFile( './app/static/player-stats.html', ( error, data ) => {
if ( error ) {
response.writeHead( 500, { 'Content-Type': 'text/plain' } );
response.write( error + '\n' );
response.end();
return;
}
response.writeHead( 200 );
response.write( data, 'binary' );
response.end();
} );
return;
}
if ( request.url.indexOf( '/stats' ) === 0 ) {
fs.readFile( './app/static/stats.html', ( error, data ) => {
if ( error ) {
response.writeHead( 500, { 'Content-Type': 'text/plain' } );
response.write( error + '\n' );
response.end();
return;
}
response.writeHead( 200 );
response.write( data, 'binary' );
response.end();
} );
return;
}
request.on( 'data', ( data ) => {
requestData += data;
if ( requestData.length > 1e6 ) {
// Prevent DoS attack.
request.connection.destroy();
}
} );
request.on( 'end', function() {
let query = qs.parse( requestData );
if ( config.debug ) {
query = url.parse( request.url, true ).query;
}
if ( query.token == config.token || config.debug ) {
jsonResponse = controller.handleRequest( query );
} else {
jsonResponse = { 'text': 'Invalid token.' };
}
response.writeHead( 200, { 'Content-Type': 'application/json' } );
response.end( JSON.stringify( jsonResponse ) );
} );
} );
server.listen( config.port, function() {
console.log( 'Server started on port ' + config.port + '!' );
} );