2019-10-15 23:42:47 -03:00
const express = require ( 'express' ) ;
const fs = require ( "fs" )
const timeout = require ( 'connect-timeout' )
2019-11-07 01:07:31 -03:00
const compression = require ( 'compression' ) ;
2019-10-15 23:42:47 -03:00
let api = true ;
let gdicons = fs . readdirSync ( './icons/iconkit' )
const app = express ( ) ;
2019-10-21 12:20:25 -03:00
app . use ( compression ( ) ) ;
2019-10-15 23:42:47 -03:00
app . use ( express . json ( ) ) ;
app . use ( express . urlencoded ( { extended : true } ) ) ;
app . use ( timeout ( '25s' ) ) ;
app . use ( haltOnTimedout )
app . set ( 'json spaces' , 2 )
2019-10-16 19:47:53 -03:00
app . modules = { }
fs . readdirSync ( './api' ) . forEach ( x => {
app . modules [ x . split ( '.' ) [ 0 ] ] = require ( './api/' + x )
} )
2019-10-15 23:42:47 -03:00
app . secret = 'Wmfd2893gb7'
2019-10-16 19:47:53 -03:00
const secrets = require ( "./misc/secretStuff.json" )
2019-10-15 23:42:47 -03:00
app . id = secrets . id
app . gjp = secrets . gjp
2019-10-16 19:47:53 -03:00
//these are the only two things in secretStuff.json, both are only used for level leaderboards
2019-10-15 23:42:47 -03:00
function haltOnTimedout ( req , res , next ) {
if ( ! req . timedout ) next ( )
}
app . parseResponse = function ( responseBody , splitter ) {
2019-10-23 18:48:01 -03:00
if ( ! responseBody || responseBody == "-1" ) return { } ;
2019-10-15 23:42:47 -03:00
let response = responseBody . split ( '#' ) [ 0 ] . split ( splitter || ':' ) ;
let res = { } ;
for ( let i = 0 ; i < response . length ; i += 2 ) {
res [ response [ i ] ] = response [ i + 1 ] }
return res }
2019-10-16 19:47:53 -03:00
//xss bad
2019-10-25 18:22:29 -03:00
app . clean = function ( text ) { if ( ! text || typeof text != "string" ) return text ; else return text . replace ( /&/g , "&" ) . replace ( /</g , "<" ) . replace ( />/g , ">" ) . replace ( /=/g , "=" ) . replace ( /"/g , """ ) . replace ( /'/g , "'" ) }
2019-10-15 23:42:47 -03:00
console . log ( "Site online!" )
2019-12-16 10:48:05 -03:00
// ASSETS
2019-12-18 21:37:21 -03:00
let assets = [ '/css' , '/assets' , '/blocks' , '/difficulty' , '/gauntlets' , '/gdicon' , '/iconkitbuttons' , '/levelstyle' , '/objects' ]
2019-10-19 01:27:17 -03:00
app . use ( '/css' , express . static ( _ _dirname + '/assets/css' ) ) ;
2019-12-16 10:48:05 -03:00
app . use ( '/assets' , express . static ( _ _dirname + '/assets' , { maxAge : "7d" } ) ) ;
2019-10-18 17:48:33 -03:00
app . use ( '/blocks' , express . static ( _ _dirname + '/assets/blocks' , { maxAge : "7d" } ) ) ;
app . use ( '/difficulty' , express . static ( _ _dirname + '/assets/gdfaces' , { maxAge : "7d" } ) ) ;
2019-12-16 10:48:05 -03:00
app . use ( '/gauntlets' , express . static ( _ _dirname + '/assets/gauntlets' , { maxAge : "7d" } ) ) ;
2019-10-18 17:48:33 -03:00
app . use ( '/gdicon' , express . static ( _ _dirname + '/icons/iconkit' , { maxAge : "7d" } ) ) ;
2019-12-16 10:48:05 -03:00
app . use ( '/iconkitbuttons' , express . static ( _ _dirname + '/assets/iconkitbuttons' , { maxAge : "7d" } ) ) ;
app . use ( '/levelstyle' , express . static ( _ _dirname + '/assets/initial' , { maxAge : "7d" } ) ) ;
app . use ( '/objects' , express . static ( _ _dirname + '/assets/objects' , { maxAge : "7d" } ) ) ;
2019-10-15 23:42:47 -03:00
2019-12-16 10:48:05 -03:00
// POST REQUESTS
2019-10-15 23:42:47 -03:00
2019-12-16 10:48:05 -03:00
app . post ( "/like" , function ( req , res ) { app . modules . like ( app , req , res ) } )
app . post ( "/postComment" , function ( req , res ) { app . modules . postComment ( app , req , res ) } )
app . post ( "/postProfileComment" , function ( req , res ) { app . modules . postProfileComment ( app , req , res ) } )
2019-10-15 23:42:47 -03:00
2019-12-16 10:48:05 -03:00
// HTML
2019-10-15 23:42:47 -03:00
2019-12-16 10:48:05 -03:00
app . get ( "/" , function ( req , res ) { res . sendFile ( _ _dirname + "/html/home.html" ) } )
app . get ( "/analyze/:id" , async function ( req , res ) { res . sendFile ( _ _dirname + "/html/analyze.html" ) } )
app . get ( "/api" , function ( req , res ) { res . sendFile ( _ _dirname + "/html/api.html" ) } )
app . get ( "/comments/:id" , function ( req , res ) { res . sendFile ( _ _dirname + "/html/comments.html" ) } )
app . get ( "/gauntlets" , function ( req , res ) { res . sendFile ( _ _dirname + "/html/gauntlets.html" ) } )
2019-12-16 17:01:46 -03:00
app . get ( "/iconkit" , function ( req , res ) { res . sendFile ( _ _dirname + "/html/iconkit.html" ) } )
2019-12-16 10:48:05 -03:00
app . get ( "/leaderboard" , function ( req , res ) { res . sendFile ( _ _dirname + "/html/leaderboard.html" ) } )
app . get ( "/leaderboard/:text" , function ( req , res ) { res . sendFile ( _ _dirname + "/html/levelboard.html" ) } )
app . get ( "/mappacks" , function ( req , res ) { res . sendFile ( _ _dirname + "/html/mappacks.html" ) } )
app . get ( "/search" , function ( req , res ) { res . sendFile ( _ _dirname + "/html/filters.html" ) } )
app . get ( "/search/:text" , function ( req , res ) { res . sendFile ( _ _dirname + "/html/search.html" ) } )
2019-10-15 23:42:47 -03:00
2019-12-16 10:48:05 -03:00
// API
2019-10-21 00:33:01 -03:00
2019-12-16 10:48:05 -03:00
app . get ( "/api/analyze/:id" , async function ( req , res ) { app . modules . level ( app , req , res , api , true ) } )
app . get ( "/api/comments/:id" , function ( req , res ) { app . modules . comments ( app , req , res , api ) } )
app . get ( "/api/credits" , function ( req , res ) { res . send ( require ( './misc/credits.json' ) ) } )
app . get ( "/api/leaderboard" , function ( req , res , api ) { app . modules [ req . query . hasOwnProperty ( "accurate" ) ? "accurateLeaderboard" : "leaderboard" ] ( app , req , res ) } )
app . get ( "/api/leaderboardLevel/:id" , function ( req , res ) { app . modules . leaderboardLevel ( app , req , res , api ) } )
app . get ( "/api/level/:id" , async function ( req , res ) { app . modules . level ( app , req , res , api ) } )
app . get ( "/api/mappacks" , async function ( req , res ) { res . send ( require ( './misc/mapPacks.json' ) ) } )
app . get ( "/api/profile/:id" , function ( req , res ) { app . modules . profile ( app , req , res , api ) } )
app . get ( "/api/search/:text" , function ( req , res ) { app . modules . search ( app , req , res , api ) } )
2019-12-16 17:01:46 -03:00
// API AND HTML
app . get ( "/profile/:id" , function ( req , res ) { app . modules . profile ( app , req , res ) } )
app . get ( "/:id" , function ( req , res ) { app . modules . level ( app , req , res ) } )
2019-12-16 10:48:05 -03:00
2019-10-15 23:42:47 -03:00
2019-12-16 10:48:05 -03:00
// REDIRECTS
2019-10-15 23:42:47 -03:00
2019-12-16 10:48:05 -03:00
app . get ( "/icon" , function ( req , res ) { res . redirect ( '/iconkit' ) } )
app . get ( "/iconkit/:text" , function ( req , res ) { res . redirect ( '/icon/' + req . params . text ) } )
app . get ( "/leaderboards/:id" , function ( req , res ) { res . redirect ( '/leaderboard/' + req . params . id ) } )
app . get ( "/l/:id" , function ( req , res ) { res . redirect ( '/leaderboard/' + req . params . id ) } )
app . get ( "/a/:id" , function ( req , res ) { res . redirect ( '/analyze/' + req . params . id ) } )
app . get ( "/c/:id" , function ( req , res ) { res . redirect ( '/comments/' + req . params . id ) } )
app . get ( "/u/:id" , function ( req , res ) { res . redirect ( '/profile/' + req . params . id ) } )
app . get ( "/p/:id" , function ( req , res ) { res . redirect ( '/profile/' + req . params . id ) } )
2019-10-15 23:42:47 -03:00
2019-12-16 10:48:05 -03:00
// MISC
2019-10-15 23:42:47 -03:00
2019-12-16 10:48:05 -03:00
app . get ( "/assets/sizecheck.js" , function ( req , res ) { res . sendFile ( _ _dirname + "/misc/sizecheck.js" ) } )
app . get ( '/api/icons' , function ( req , res ) { res . send ( gdicons ) ; } ) ;
app . get ( "/icon/:text" , function ( req , res ) { app . modules . icon ( app , req , res ) } )
2019-10-15 23:42:47 -03:00
app . get ( '*' , function ( req , res ) {
2019-12-16 10:48:05 -03:00
if ( req . path . startsWith ( '/api' ) ) res . send ( '-1' )
2019-12-18 21:37:21 -03:00
if ( assets . some ( x => req . path . startsWith ( x ) ) ) res . send ( "Looks like this file doesn't exist ¯\\_(ツ)_/¯<br>You can check out all of the assets <a href='https://github.com/GDColon/GDBrowser/tree/master/assets'>here</a>" )
2019-12-15 21:11:35 -03:00
else res . redirect ( '/search/404%20' )
2019-10-15 23:42:47 -03:00
} ) ;
2019-12-16 10:48:05 -03:00
app . listen ( 2000 ) ;