/*
【node.js】socket.ioで構築したローカルで動くシンプルなチャットルーム。みんなで書けるリモート版も公開中。
http://www.tettori.net/post/852/
Node + MongoDBでチャット的ななにかをつくる - Mongodbの導入、セッションを貼る、チャットロビーの作成まで
http://atasatamatara.hatenablog.jp/entry/20120420/1334922757
*/
// ----------------------------------------------------------
var http = require("http");
var url = require('url');
var path = require('path');
var fs = require("fs");
var socketio = require("socket.io");
var mongoose = require('mongoose');
var mime=require('mime');
var member={};
// ----------------------------------------------------------
// MongoDB定義フェーズ
var Schema = mongoose.Schema;
var commentSchema = new Schema({
message : { type:String, required: true },
date : { type:Date, default: Date.now }
});
mongoose.model('Comment', commentSchema);
//http://muddy-dixon.appspot.com/ja/mongoosejs/model-definition.html
var db = mongoose.createConnection('mongodb://localhost/chat_db');
var Comment = db.model('Comment');
// ----------------------------------------------------------
//httpサーバー
var server = http.createServer(function(req, res) {
//GET
var params = url.parse(req.url, true);
for (var keyString in params) {
if(keyString=="host"||keyString=="port"||keyString=="hostname"||keyString=="href"){
if(keyString=="href"){
var h=params[keyString];
if(h.indexOf("//")==0){
h=h.substring(1);
params[keyString]=h;
params.pathname=h.substring(0,h.indexOf("?"));;
}
}
console.log("params "+keyString+" : "+params[keyString]);
}
else
console.log("params "+keyString);
}
if(params.pathname=="/httpserv"){
console.log("***** "+params.query.mode);
if(params.query.mode=="getdata"){
Comment.find({}).sort({date:-1}).execFind( function(err, docs) {
var st="";
if(docs){
for (var i=0, size=docs.length; i<size; ++i) {
var msg=docs[i].message.split("\\'").join("'");
var msg=docs[i].message.split("\\\"").join("\"");
var dd=docs[i].date;
st += "message: "+msg+" date: "+dd+ "<br> ";
console.log(docs[i]);
}
}
else st="No Data";
for (var keyString in member) {
console.log("●USER INFO "+keyString+":"+member[keyString]);
} res.setHeader("Pragma","no-cache");
res.setHeader("Expires","-1");
res.writeHead(200, {'Content-Type': 'text/html; charset="UTF-8"'});
res.end("<p>"+st+"</p>");
});
}
}
/*
else {
res.writeHead(200, {"Content-Type":"text/html"});
var output = fs.readFileSync("./index_socketio.html", "utf-8");
res.end(output);
}
*/
//要求ファイル(HTMLや画像など)の送信
else{
var filePath = url.parse(req.url).pathname;
var fullPath = getRequestFilePath(filePath);
var ext = path.extname(fullPath);
if(ext=="")ext="index_socketio.html";
console.log("fullPath="+fullPath+" ext="+ext+".");
path.exists(fullPath, function(exists) {
if(exists){
var contentType = mime.lookup(ext);
console.log("ctype="+contentType);
if(contentType){
var statusCode = 200;
var body = fs.readFileSync(fullPath);
// Check HTTP Method
var method = req.method;
if (method == "GET" || method == "POST") {
res.setHeader("Pragma","no-cache");
res.setHeader("Expires","-1");
res.writeHead(statusCode, {
'Content-Type': contentType,
'Content-Length': body.length
});
res.write(body);
}
res.end();
}
}
});
}
}).listen(process.env.VMC_APP_PORT || 3002);
// Get Request File Path
var getRequestFilePath = function (filePath) {
//console.log("filePath="+filePath);
var fullPath = path.join(__dirname,path.join(".\/", filePath));
return fullPath;
};
// ----------------------------------------------------------
//socket.ioサーバー
var io = socketio.listen(server);
io.sockets.on("connection", function (socket) {
if(!member[socket.id])member[socket.id]=socket.id;
// ブロードキャスト(送信者以外の全員に送信)
socket.on("message", function (data) {
var comment = new Comment();
comment.message = data.message;
comment.date = Date.now();
comment.save( function(err, comment) {
if (err) { console.log(err); }
});
console.log('message:', comment.message);
socket.broadcast.emit("message", {message:data.message});
});
//切断イベント
socket.on("disconnect", function () {
console.log("user disconnected "+socket.id);
delete member[socket.id];
});
});