summaryrefslogtreecommitdiff
path: root/webserver.js
blob: ee700313da326b77e12c142efd4820f774f4dbdd (plain)
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
#!/usr/bin/env node
var cmn=require("./modules/$common.js");
var app=require("express")(),
    http=require("http"),
    httpServer=http.Server(app),
    io=require("socket.io")(httpServer),
    url=require("url"),
    fs=require("fs"),
    util=require("util"),
    bodyParser=require("body-parser"),
    basicAuth=require("basic-auth");


if(process.argv.length>3){
	console.log("Pass optional port as first argument");
	process.exit(1);
}
var PORT=process.argv.length==3?+process.argv[2]:80;


var whatpulse={"keys":"<??>","clicks":"<??>"};
function refreshWhatpulse(){
	http.get("http://api.whatpulse.org/user.php?user=tomsmeding&format=json&formatted=yes",function(res){
		var body="";
		res.on("data",function(data){body+=data;});
		res.on("end",function(){
			try{body=JSON.parse(body);}
			catch(e){return;}
			whatpulse.keys=body.Keys/*.replace(/,/g,"&nbsp;")*/;
			whatpulse.clicks=body.Clicks/*.replace(/,/g,"&nbsp;")*/;
		});
	});
}
setInterval(refreshWhatpulse,6*3600*1000); //every 6 hours
refreshWhatpulse();

/*app.use(function (req, res, next) {
	console.log(req.subdomains);
	next();
});*/

app.use(bodyParser.text());


var module_list=fs.readdirSync("modules").filter(function(f){
	return ["$common.js",".DS_Store"].indexOf(f)==-1&&f[0]!="$";
});
for(i=0;i<module_list.length;i++){
	require("./modules/"+module_list[i]+"/"+module_list[i]+".js")(app,io,cmn.serverdir+"/modules/"+module_list[i]);
	console.log("Loaded module "+module_list[i]);
}



app.get("/",function(req,res){
	res.send(
		String(fs.readFileSync(cmn.serverdir+"/index.html"))
		.replace(/<!--<<PULSE-KEYS>>-->/,whatpulse["keys"])
		.replace(/<!--<<PULSE-CLICKS>>-->/,whatpulse["clicks"])
	);
});

app.get("/f/univq/*",cmn.authgen());

app.get("/f/*",function(req,res){
	var parsed=url.parse(req.url),basefname=parsed.pathname.slice(2).replace(/\/\.+[^\/]*\//g,"/");
	fname=cmn.rootdir+"/web_files"+basefname;
	console.log("Requesting file "+fname);
	var stats=fs.statSync(fname);
	if(!fs.existsSync(fname))res.send("That file does not exist.");
	else if(stats.isFile())res.sendFile(fname);
	else if(stats.isDirectory()){
		var items=fs.readdirSync(fname)
		            .filter(function(f){return f[0]!=".";})
		            .map(function(f){
		            	if(fs.statSync(fname+"/"+f).isDirectory())return f+"/";
		            	else return f;
		            });
		res.send(
			String(fs.readFileSync(cmn.rootdir+"/web_files/dirlisting.html"))
			.replace("<!--DIRDIR-->",basefname)
			.replace("[/*LISTINGLISTING*/]",JSON.stringify(items))
		);
	} else res.send("I don't recognise that file.");
});

["o","k","rip","rip2"].forEach(function(target){
	app.get("/"+target,function(req,res){
		res.sendFile(cmn.rootdir+"/web_files/"+target+".html");
	});
	app.get("/"+target+"/*",function(req,res){
		res.set('Content-Type', 'text/html');
		res.send(
			String(fs.readFileSync(cmn.rootdir+"/web_files/"+target+".html"))
			.replace("<!--MESSAGEMESSAGE-->",cmn.simpleHTMLescape(url.parse(req.url).pathname.slice(target.length+2)))
		);
	});
});

app.get("/.well-known/keybase.txt",function(req,res){
	res.sendFile(cmn.rootdir+"/web_files/keybase.txt");
});

app.get("/dr",function(req,res){
	res.sendFile(cmn.rootdir+"/web_files/duckroll.html");
});

app.get(["/gpg","/pgp","/gpg.asc","/pgp.asc"],function(req,res){
	res.type("text/plain");
	res.sendFile(cmn.rootdir+"/web_files/pgp.asc");
});


/*app.get("/chat",function(req,res){
	res.redirect(301,"http://tomsmeding.com:81");
});*/


var server=httpServer.listen(PORT,function(){
	var host=server.address().address;
	var port=server.address().port;
	console.log("Server listening at http://"+host+":"+port);
});