OSDN Git Service

一部ルームで退出したにもかかわらず名前が表示されるバグを修正した
[webchat/WebChat.git] / chatServer.js
index 16ae00e..78dad96 100644 (file)
@@ -3,7 +3,8 @@
  */\r
 $max_room_number = 3;  //最大ルーム数\r
 $spilt_size = 1024 * 512;      //分割するサイズ\r
-$reset_password_diff = 1000 * 60 * 60;\r
+$reset_password_diff = 1000 * 60 * 60; //ルームパスワードをリセットする間隔\r
+$gc_time_interval = 1000 * 60 * 60;    //ゴミ掃除を行う間隔\r
 $block_message = "メッセージの送信に失敗しました";      //ブロック時のメッセージ\r
 $not_match_password = "パスワードが一致しませんでした"; //パスワードが一致しない場合に表示されるメッセージ\r
 $password_setted_message = "パスワードを設定しました";     //パスワードが設定されたときに表示されるメッセージ\r
@@ -194,19 +195,31 @@ for(var i = 0; i < $max_room_number; i++)
        .of(GetNameFromRoomNumber(i))\r
        .authorization(ParseAuthorization)\r
        .on("connection", function (socket) {\r
-               console.log("connected from %s",GetClientIPAdress(socket));\r
+               var ip = GetClientIPAdress(socket);\r
+\r
+               console.log("connected from %s",ip);\r
 \r
                var rno = GetRoomNumberFromName(socket.namespace.name);\r
                var roomconfig = {};\r
-               if($rooms.IsFixedPassword(rno))\r
-                       roomconfig.type = 2;\r
-               else if($rooms.IsContains(rno))\r
-                       roomconfig.type = 1;\r
-               else\r
+               $rooms.Get(rno).AddRom(ip);\r
+               if($rooms.Get(rno).IsVolatile() == false)\r
+               {\r
+                       if($rooms.Get(rno).IsFixedPassword())\r
+                               roomconfig.type = 2;\r
+                       else if($rooms.Get(rno).IsHiddenLogFromRom())\r
+                               roomconfig.type = 3;\r
+                       else\r
+                               roomconfig.type = 1;\r
+                       roomconfig.IsOwned = !$rooms.Get(rno).IsFirstAuth();\r
+               }else{\r
                        roomconfig.type = 0;\r
-               roomconfig.IsOwned = !$rooms.IsFirstAuth(rno);\r
+               }\r
                socket.json.emit("send roominfo",roomconfig);\r
 \r
+               var romcount = $rooms.Get(rno).GetRomCount();\r
+               socket.json.emit("send romcount",romcount);\r
+               socket.json.broadcast.emit("send romcount",romcount);\r
+\r
                socket.on("get pastLogList", function (msg) {\r
                        ParseGetPastLogList(socket,msg);\r
                });\r
@@ -246,8 +259,10 @@ function ParseAuthorization(handshakeData, callback)
                var sessionID = parseCookie(cookie)["connect.sid"];\r
                sessionStore.get(sessionID, function (err, session) {\r
                        var result = null;\r
-                       if (err || ipbanlist.IsBaned(handshakeData.address.address))\r
+                       if (ipbanlist.IsBaned(handshakeData.address.address))\r
                                result = "failed get from session store";\r
+                       else if(err)\r
+                               result = err;\r
                        else if(handshakeData.query.token != session.items.token)\r
                                result = "invaild token";\r
                        sessionStore.destroy(sessionID);\r
@@ -260,6 +275,14 @@ function ParseAuthorization(handshakeData, callback)
 \r
 function ParseDisconnect(socket,msg)\r
 {\r
+       var ip = GetClientIPAdress(socket);\r
+       var rno = GetRoomNumberFromName(socket.namespace.name);\r
+       $rooms.Get(rno).RemoveRom(ip);\r
+\r
+       var romcount = $rooms.Get(rno).GetRomCount();\r
+       socket.json.emit("send romcount",romcount);\r
+       socket.json.broadcast.emit("send romcount",romcount);\r
+\r
        console.log("disconnected");\r
 }\r
 \r
@@ -270,7 +293,7 @@ function ParseSetPassword(socket,msg)
                name:$system_name,\r
                message:null,\r
        };\r
-       if($rooms.SetPassword(rno,msg.owner,msg.password))\r
+       if($rooms.Get(rno).IsVolatile() == false && $rooms.Get(rno).SetPassword(msg.owner,msg.password))\r
                newMeg.message = $password_setted_message;\r
        else\r
                newMeg.message = $failed_set_password_message;\r
@@ -288,15 +311,22 @@ function ParseJoin(socket,msg)
        }\r
 \r
        var rno = GetRoomNumberFromName(socket.namespace.name);\r
-       if($rooms.IsContains(rno))\r
+\r
+       $rooms.Get(rno).RemoveRom(ip);\r
+       \r
+       var romcount = $rooms.Get(rno).GetRomCount();\r
+       socket.json.emit("send romcount",romcount);\r
+       socket.json.broadcast.emit("send romcount",romcount);\r
+\r
+       if($rooms.Get(rno).IsVolatile() == false)\r
        {\r
-               if($rooms.IsTimeout(rno) ||\r
-                       $rooms.IsFirstAuth(rno))\r
+               if($rooms.Get(rno).IsTimeout() ||\r
+                       $rooms.Get(rno).IsFirstAuth())\r
                {\r
-                       $rooms.Reset(rno,msg.name);\r
+                       $rooms.Get(rno).Reset(msg.name);\r
                        ParseGetPastLog(socket,util.format($log_file_name,rno));\r
                }\r
-               else if($rooms.Auth(rno,msg.name,msg.password))\r
+               else if($rooms.Get(rno).Auth(msg.name,msg.password))\r
                {\r
                        ParseGetPastLog(socket,util.format($log_file_name,rno));\r
                }\r
@@ -330,18 +360,25 @@ function ParseQuit(socket,msg)
                name:$system_name,\r
                message:$password_resetted_message,\r
        };\r
-       if($rooms.IsContains(rno))\r
+\r
+       $rooms.Get(rno).AddRom(ip);\r
+\r
+       var romcount = $rooms.Get(rno).GetRomCount();\r
+       socket.json.emit("send romcount",romcount);\r
+       socket.json.broadcast.emit("send romcount",romcount);\r
+\r
+       if($rooms.Get(rno).IsVolatile() == false)\r
        {\r
-               if($rooms.IsOwner(rno,msg.name))\r
+               if($rooms.Get(rno).IsOwner(msg.name))\r
                {\r
-                       $rooms.Reset(rno,null);\r
+                       $rooms.Get(rno).Reset(null);\r
                        ParseSendMsg(socket,newMeg);\r
                }\r
-               if(!$rooms.IsFirstAuth(rno) &&\r
-                       !$rooms.IsAuthed(rno,msg.name))\r
+               if(!$rooms.Get(rno).IsFirstAuth() &&\r
+                       !$rooms.Get(rno).IsAuthed(msg.name))\r
                        return;\r
                else\r
-                       $rooms.RemoveAuth(rno,msg.name);\r
+                       $rooms.Get(rno).RemoveAuth(msg.name);\r
        }\r
 \r
        newMeg.message = util.format("/quitedby %s",msg.name);\r
@@ -363,9 +400,9 @@ function ParseSendMsg(socket,msg)
        var rno = GetRoomNumberFromName(socket.namespace.name);\r
 \r
        if(msg.name != $system_name && \r
-               $rooms.IsContains(rno) &&\r
-               !$rooms.IsAuthed(rno,msg.name) &&\r
-               !$rooms.IsOwner(rno,msg.name))\r
+               $rooms.Get(rno).IsVolatile() == false &&\r
+               !$rooms.Get(rno).IsAuthed(msg.name) &&\r
+               !$rooms.Get(rno).IsOwner(rno,msg.name))\r
        {\r
                return;\r
        }\r
@@ -528,83 +565,23 @@ function CreateMessageFromText(text)
 function RoomInfomationCollection()\r
 {\r
        var collection = {};\r
-       this.Reset = function(rno,owner){\r
-               var date = new Date();\r
-               var time = date.getTime();\r
-               collection[rno].password = null;\r
-               collection[rno].authed_list = {};\r
-               collection[rno].owner = owner;\r
-               collection[rno].time = time;\r
-               console.log(util.format("password is reseted in %s",rno));\r
-       };\r
+       this.Get = function(rno){\r
+               return collection[rno];\r
+       }\r
        this.IsContains = function(rno){\r
                return rno in collection;\r
        };\r
-       this.IsFirstAuth = function(rno){\r
-               if(!this.IsContains(rno) || typeof(collection[rno].owner) == "undefined")\r
-                       return false;\r
-               return collection[rno].owner == null;\r
-       }\r
-       this.IsAuthed = function(rno,name){\r
-               if(!this.IsContains(rno))\r
-                       return false;\r
-               return name == collection[rno].owner ||\r
-                       name in collection[rno].authed_list;\r
-       };\r
-       this.IsFixedPassword = function(rno){\r
-               if(!this.IsContains(rno))\r
-                       return false;\r
-               return collection[rno].owner == $system_name;\r
-       };\r
-       this.IsOwner = function(rno,name){\r
-               return this.IsContains(rno) &&\r
-                       typeof(collection[rno].owner) != "undefined" &&\r
-                       collection[rno].owner == name;\r
-       }\r
-       this.IsTimeout = function(rno){\r
-               var date = new Date();\r
-               var time = date.getTime();\r
-               return this.IsContains(rno) &&\r
-                       !this.IsFixedPassword(rno) &&\r
-                       (typeof(collection[rno].time) != "undefined" &&\r
-                       time - collection[rno].time >= $reset_password_diff);\r
-       };\r
-       this.RemoveAuth = function(rno,name)\r
-       {\r
-               delete collection[rno].authed_list[name];\r
-       }\r
-       this.Auth = function(rno,name,password){\r
-               if(typeof(collection[rno].password) != "undefined" &&\r
-                       collection[rno].password != password)\r
-                       return false;\r
-               var date = new Date();\r
-               var time = date.getTime();\r
-               collection[rno].time = time;\r
-               collection[rno].authed_list[name] = "";\r
-               return true;\r
-       }\r
-       this.SetPassword = function(rno,owner,password){\r
-               if(this.IsContains(rno) && \r
-                       owner == collection[rno].owner &&\r
-                       !this.IsFixedPassword(rno))\r
-               {\r
-                       var date = new Date();\r
-                       collection[rno].time = date.getTime();\r
-                       collection[rno].password = password;\r
-                       \r
-                       console.log(util.format("password is seted to %s in %s",password,rno));\r
-                       return true;\r
-               }\r
-               return false;\r
-       };\r
        this.GetString = function(){\r
                var retval = "";\r
                for(var rno in collection)\r
                {\r
+                       if($rooms.Get(rno).IsVolatile())\r
+                               continue;\r
                        var pass = collection[rno].password;\r
                        if(pass == null)\r
                                pass = "";\r
-                       retval += rno + ":" + pass + "\r\n";\r
+                       var hiddenlog = collection[rno].hiddenlog;\r
+                       retval += rno + ":" + pass + ":" + hiddenlog + "\r\n";\r
                }\r
                return retval;\r
        };\r
@@ -650,7 +627,7 @@ function RoomInfomationCollection()
                                        var token = line.toString().replace(/(\r|\n|\r\n)/gm, "").split(":");\r
                                        if(token.length == 1)\r
                                        {\r
-                                               Add(token[0],null);\r
+                                               Add(token[0],null,false);\r
                                        }\r
                                        else if(token.length == 2)\r
                                        {\r
@@ -658,7 +635,18 @@ function RoomInfomationCollection()
                                                var pass = token[1];\r
                                                if(pass == "")\r
                                                        pass = null;\r
-                                               Add(rno, pass);\r
+                                               Add(rno, pass,false);\r
+                                       }\r
+                                       else if(token.length == 3)\r
+                                       {\r
+                                               var rno = token[0];\r
+                                               var pass = token[1];\r
+                                               if(pass == "")\r
+                                                       pass = null;\r
+                                               var hiddenlog = false;\r
+                                               if(token[2] == "true")\r
+                                                       hiddenlog = true;\r
+                                               Add(rno, pass,hiddenlog);\r
                                        }\r
                                })\r
                                .join(function(){\r
@@ -669,19 +657,115 @@ function RoomInfomationCollection()
        }\r
        function Clear(){\r
                collection = {};\r
+               for(var i = 0; i < $max_room_number; i++)\r
+                       Add(i,null,null);\r
        };\r
-       function Add(rno,pass){\r
-               collection[rno] = {time : null,\r
-                       password : pass,\r
-                       owner : null,\r
-                       authed_list : {}};\r
+       function Add(rno,pass,hiddenlogflag){\r
+               collection[rno] = new RoomInfomation(pass,hiddenlogflag);\r
                if(pass != null)\r
                        collection[rno].owner = $system_name;\r
        };\r
-\r
+       var $gc_interval_id = setInterval(function(){\r
+               for(var rno in this.rom_list)\r
+                       collection[rno].GCRomList();\r
+       },$gc_time_interval);\r
        GetRoomList();\r
 }\r
 \r
+//RoomInfomationクラス\r
+function RoomInfomation(pass,hiddenlogflag)\r
+{\r
+       this.password = pass;\r
+       this.rom_list = {};\r
+       this.authed_list = {};\r
+       this.owner = null;\r
+       this.time = null;\r
+       this.hiddenlog = hiddenlogflag;\r
+       this.IsVolatile = function(){\r
+               return this.owner == null &&\r
+                       this.password == null &&\r
+                       this.time == null &&\r
+                       this.hiddenlog == null;\r
+       }\r
+       this.GetRomCount = function(){\r
+               var count = 0;\r
+               for(var key in this.rom_list)\r
+                       count++;\r
+               return count;\r
+       };\r
+       this.AddRom = function(ip){\r
+               var date = new Date();\r
+               this.rom_list[ip] = {time:date.getTime()};\r
+       };\r
+       this.RemoveRom = function(ip){\r
+               delete this.rom_list[ip];\r
+       };\r
+       this.Reset = function(owner){\r
+               var date = new Date();\r
+               var time = date.getTime();\r
+               this.password = null;\r
+               this.authed_list = {};\r
+               this.owner = owner;\r
+               this.time = time;\r
+       };\r
+       this.IsFirstAuth = function(){\r
+               return this.owner == null;\r
+       };\r
+       this.IsAuthed = function(name){\r
+               return name == this.owner ||\r
+                       name in this.authed_list;\r
+       };\r
+       this.IsHiddenLogFromRom = function(){\r
+               return this.hiddenlog;\r
+       };\r
+       this.IsFixedPassword = function(){\r
+               return this.owner == $system_name;\r
+       };\r
+       this.IsOwner = function(name){\r
+               return this.owner == name;\r
+       };\r
+       this.IsTimeout = function(){\r
+               var date = new Date();\r
+               var current_time = date.getTime();\r
+               return !this.IsFixedPassword() &&\r
+                       current_time - this.time >= $reset_password_diff;\r
+       };\r
+       this.RemoveAuth = function(name)\r
+       {\r
+               delete this.authed_list[name];\r
+       };\r
+       this.Auth = function(name,password){\r
+               if(this.password != password)\r
+                       return false;\r
+               var date = new Date();\r
+               var time = date.getTime();\r
+               this.time = time;\r
+               this.authed_list[name] = "";\r
+               return true;\r
+       };\r
+       this.SetPassword = function(owner,password){\r
+               if(owner == this.owner &&\r
+                       !this.IsFixedPassword() &&\r
+                       !this.IsHiddenLogFromRom())\r
+               {\r
+                       var date = new Date();\r
+                       this.time = date.getTime();\r
+                       this.password = password;\r
+                       return true;\r
+               }\r
+               return false;\r
+       };\r
+       this.GCRomList = function(){\r
+               var date = new Date();\r
+               var current_time = date.getTime();\r
+               for(var ip in this.rom_list)\r
+               {\r
+                       if(current_time - this.rom_list[ip].time >= $gc_time_interval)\r
+                               delete this.rom_list[ip];\r
+               }\r
+       };\r
+}\r
+\r
 //IPBANクラス\r
 function IpBanCollecion()\r
 {\r