OSDN Git Service

ある特定のパターンで名前を入力すると何も表示されなくなるバグを修正した
[webchat/WebChat.git] / public / scripts / chatclient.js
index 413f083..77da651 100644 (file)
@@ -1,21 +1,29 @@
 $expires = 30;      //クッキーの保持日数\r
 $afk_time = 1000 * 60 * 60;    //AFKと判定する時間(ミリ秒で指定すること)\r
 $log_file_name = "logfile%d.txt";      //ログファイル名(%dはそのままにしておくこと)\r
+$pastlogfile_pattern = "logfile%d(_+.*)?\.txt";        //過去ログと判定する正規表現\r
 $system_name = "system";       //システム発言を表す名前(chat.phpと同じにすること)\r
 $entered_message = "%sが入室しました";\r
 $quited_message = "%sが退室しました";\r
 $system_msg_color ="#000000";\r
-$profile_link = ""     //プロフィールシステムへのリンク先(%nで名前を表す)\r
-$fanble_message = "[color=blue]%s ファンブル![/color]";   //ファンブル時のメッセージ\r
-$critical_message = "[color=red]%s クリティカル![/color]";       //クリティカル時のメッセージ\r
+$profile_link = "/profile/detail?name=%n"      //プロフィールシステムへのリンク先(%nで名前を表す)\r
+$fanble_message = "[color=blue]%s ファンブル![/color]";\r
+$critical_message = "[color=red]%s クリティカル![/color]";\r
 $send_message = "%sからの送信 %s";\r
-$failed_connect_message = "failed connect or ip banned";\r
+$failed_connect_message = "接続に失敗しました";\r
+$invaild_name_message = "名前を空欄にすることはできません";\r
+$free_password1 = "最初に入室する人が自由にパスワードを設定できます";  //自由パスワードメッセージ1\r
+$free_password2 = "この部屋は使用されています。パスワードを入力してください";      //自由パスワードメッセージ2\r
+$fixed_password = "この部屋にはパスワードが設定されています";      //固定パスワードルーム\r
+$hidden_log_to_rom = "この部屋ではROMできないようになっています";   //ROM禁止ルーム\r
+$romcount_msg = "ROM(%d人)"   //ROMカウント\r
 \r
 //ここから先は変更しないでください\r
 $prefix_filelist = "!";\r
 $socket = new Object();\r
 $names = {};\r
-$dateFormat = new DateFormat("yyyy/MM/dd HH:mm:ss");\r
+$roominfo = {};\r
+$romcount = 0;\r
 //ここまで\r
 \r
 $(document).ready(function(){\r
@@ -36,29 +44,57 @@ $(document).ready(function(){
        $("input[name=close]").click(function(e){\r
                $("#help_frame").css("display","none");\r
        });\r
-       $("input[name=openPastlog]").click(openPastlogEventListener);\r
-       $("#enter_frame input[name=name]").keydown(function(e){\r
-               if(e.keyCode == 13)\r
-                       enterEventListener();\r
+       $("#whisper_list_view").click(function(e){\r
+               $("#whisper_list").toggle();\r
        });\r
-       $("#chat_frame input[name=message]").keydown(function(e){\r
-               if(e.keyCode == 13)\r
-                       sidEventListener();\r
+       $("#decoration_list_view").click(function(e){\r
+               $("#decoration_list").toggle();\r
        });\r
        document.chat_form.onsubmit = function(){return false;};\r
        document.enter_form.onsubmit = function(){return false;};\r
 \r
-       $socket = io.connect(location.hostname + "/" + document.chat_form.rno.value);\r
+       $socket = io.connect(location.hostname  + "/" + document.chat_form.rno.value + "?token="+ encodeURIComponent(document.chat_form._csrf.value));\r
        $socket.on("error",getErrorMessage);\r
+       $socket.on("send roominfo",sendRoomInfoListerner);\r
+       $socket.on("send romcount",sendRomCountListerner);\r
        $socket.on("connect",function(){\r
                $socket.on("req pastlog",pastLogEventListerner);\r
                $socket.on("req msg",getMessageEventListerner);\r
-               $socket.on("req pastloglist",CreatePastLogList);\r
-               $socket.json.emit("get pastLogList",{rno:document.chat_form.rno.value});\r
-               getCurretLog();\r
        });\r
 });\r
 \r
+function sendRomCountListerner(count)\r
+{\r
+       $romcount = count;\r
+       createNameList();\r
+}\r
+\r
+function sendRoomInfoListerner(info)\r
+{\r
+       $roominfo = info;\r
+       var logflag = true;\r
+       var msg = "";\r
+       if(info.type == 1){\r
+               if(info.IsOwned)\r
+                       msg = $free_password2;\r
+               else\r
+                       msg = $free_password1;\r
+               logflag = false;\r
+       }else if(info.type == 2){\r
+               msg = $fixed_password;\r
+               logflag = false;\r
+       }else if(info.type == 3){\r
+               msg = $hidden_log_to_rom;\r
+               logflag = false;\r
+       }\r
+       if(msg != "")\r
+               $("#enter_message").append(msg);\r
+       if(logflag)\r
+       {\r
+               getCurretLog();\r
+       }\r
+}\r
+\r
 function CreateColorList()\r
 {\r
        var c = new Array("00","33","66","99","CC","FF");\r
@@ -75,23 +111,6 @@ function CreateColorList()
        }\r
 }\r
 \r
-function CreatePastLogList(text)\r
-{\r
-       $("#enter_frame form select[name=past]").empty();\r
-       var rno = document.chat_form.rno.value;\r
-       var file = text.split("\n");\r
-       for(var i = 0; i < file.length; i++)\r
-       {\r
-               var logname = file[i];\r
-               if(logname == "")\r
-                       continue;\r
-               var element = document.createElement("option");\r
-               element.value = logname;\r
-               element.appendChild(document.createTextNode(logname));\r
-               $("#enter_frame form select[name=past]").append(element);\r
-       }\r
-}\r
-\r
 function getCurretLog()\r
 {\r
        var rno = document.chat_form.rno.value;\r
@@ -99,81 +118,90 @@ function getCurretLog()
        $socket.emit("get pastLog",url);\r
 }\r
 \r
-function openPastlogEventListener()\r
-{\r
-       $tid = 0;\r
-       $("#message").empty();\r
-       $("#namelist").empty();\r
-       var url = document.enter_form.past.options[document.enter_form.past.selectedIndex].value;\r
-       $socket.emit("get pastLog",url);\r
-}\r
-\r
 function pastLogEventListerner(msg)\r
 {\r
-       ParseMessage(msg);\r
+       if(IsRomMode() && $roominfo.type != 0 && $roominfo.admin == false)\r
+               return;\r
+       for(var i = 0; i < msg.length; i++)\r
+               ParseMessage(msg[i]);\r
+       createNameList();\r
 }\r
 \r
 function getMessageEventListerner(msg)\r
 {\r
+       if(IsRomMode() && $roominfo.type != 0)\r
+               return;\r
        ParseMessage(msg);\r
+       createNameList();\r
        if( document.getElementById("bell").checked == true && msg.name != document.enter_form.name.value)\r
                document.getElementById("NoticeSound").play();\r
 }\r
 \r
+var $messageTag = null;\r
 function ParseMessage(msg)\r
 {\r
        var util = new Util();\r
-       var cmd = new CommandParserWhenGet;\r
        msg.message = util.htmlspecialchars(msg.message);\r
-       var childtag = cmd.parse(msg);\r
+       var childtag = $GetCommandParser.parse(msg);\r
 \r
        if(childtag == null)\r
                return;\r
+       if(typeof(childtag) == "string")\r
+               childtag = $("<span/>").append(childtag);\r
 \r
-       var ptag = $("<p/>");\r
+       var trtag = $("<tr/>");\r
+       var namepart,msgpart;\r
 \r
        var color = $system_msg_color;\r
+\r
        var mailto = "";\r
        var date = new Date(Date.parse(msg.date));\r
-       if(msg.name != $system_name)\r
+       var name = util.htmlspecialchars(msg.name);\r
+       if(name != $system_name)\r
        {\r
-               color = $names[msg.name].color;\r
-               $names[msg.name].time = date.getTime();\r
-               var atag = $("<a/>")\r
-                       .attr("href",GetNameLink(msg.name))\r
+               color = $names[name].color;\r
+               $names[name].time = date.getTime();\r
+               namepart = $("<a/>")\r
+                       .attr("href",GetNameLink(name))\r
+                       .attr("target","_blank")\r
                        .css("color",color)\r
-                       .text(util.htmlspecialchars(msg.name));\r
-               ptag.append(atag);\r
+                       .text(name);\r
        }else{\r
-               ptag.append(msg.name);\r
+               namepart = $("<span/>").append(name);\r
        }\r
-       ptag.append(":");\r
-       ptag.append(childtag);\r
-       ptag.append("(" + $dateFormat.format(date) +")");\r
+       if(msg.ip != "")\r
+               namepart.append("@" + msg.ip);\r
+       trtag.append($("<td/>").append(namepart));\r
 \r
-       ptag.css("color",color);\r
+       msgpart = childtag\r
+               .append("(" + date.toFormat("YYYY/MM/DD HH:MI:SS") +")")\r
+               .css("color",color);\r
+       trtag.append($("<td/>").append(msgpart));\r
 \r
-       if($("#message > p").length == 0)\r
-               $("#message").append(ptag);\r
-       else\r
-               $("#message > p:first").before(ptag);\r
+       if($messageTag == null)\r
+               $messageTag = $("#message");\r
 \r
-       createNameList();\r
+       $messageTag.prepend(trtag);\r
 }\r
 \r
 function GetNameLink(name)\r
 {\r
        var util = new Util();\r
-       if(document.enter_form.mailto.value == "")\r
-               return $profile_link.replace("%n",encodeURI(name));\r
+       if($names[name].mailto == "")\r
+               return $profile_link.replace("%n",encodeURIComponent(name));\r
        return "mailto:" + util.htmlspecialchars($names[name].mailto);\r
 }\r
 \r
 function createNameList()\r
 {\r
        var date = new Date();\r
+       $("#whisper_list").empty();\r
+       $("#whisper_list").append("<ul></ul>");\r
+\r
        $("#namelist").empty();\r
        $("#namelist").append("<ul></ul>");\r
+       $("#namelist > ul").append($("<li/>").append(sprintf($romcount_msg,$romcount)));\r
+\r
        for(var name in $names)\r
        {\r
                var diff = date.getTime() - $names[name].time;\r
@@ -183,14 +211,87 @@ function createNameList()
                {\r
                        var atag = $("<a/>")\r
                                .attr("href",GetNameLink(name))\r
+                               .attr("target","_blank")\r
                                .css("color",$names[name].color)\r
                                .text(name);\r
+                       var spantag = $("<span/>")\r
+                               .click(clickNameEventListener)\r
+                               .text(name);\r
+                       $("#whisper_list > ul").append($("<li/>").append(spantag));\r
                        $("#namelist > ul").append($("<li/>").append(atag));\r
                }\r
        }\r
 }\r
 \r
-function enterEventListener(){\r
+function clickNameEventListener(e)\r
+{\r
+       document.chat_form.message.value = "/tell " + $(this).text();\r
+       document.chat_form.message.focus();\r
+}\r
+\r
+function AddBold()\r
+{\r
+       var text = GetSelection(document.chat_form.message);\r
+       ReplaceSelection(document.chat_form.message,sprintf("[b]%s[/b]",text));\r
+}\r
+\r
+function AddItalic()\r
+{\r
+       var text = GetSelection(document.chat_form.message);\r
+       ReplaceSelection(document.chat_form.message,sprintf("[i]%s[/i]",text));\r
+}\r
+\r
+function AddStrike()\r
+{\r
+       var text = GetSelection(document.chat_form.message);\r
+       ReplaceSelection(document.chat_form.message,sprintf("[s]%s[/s]",text));\r
+}\r
+\r
+function AddFontSize(size)\r
+{\r
+       var text = GetSelection(document.chat_form.message);\r
+       ReplaceSelection(document.chat_form.message,sprintf("[size=%f]%s[/size]",size,text));\r
+}\r
+\r
+function GetSelection(element)\r
+{\r
+    if (document.selection) {\r
+        element.focus();\r
+        var sel = document.selection.createRange();\r
+        return sel.text;\r
+    } else if (element.selectionStart || element.selectionStart === 0) {\r
+        var startPos = element.selectionStart;\r
+        var endPos = element.selectionEnd;\r
+        var scrollTop = element.scrollTop;\r
+        return element.value.substring(startPos,endPos);\r
+    }else{\r
+        return "";\r
+    }\r
+}\r
+\r
+function ReplaceSelection(element,text)\r
+{\r
+    if (document.selection) {\r
+        element.focus();\r
+        var sel = document.selection.createRange();\r
+        sel.text = text;\r
+    } else if (element.selectionStart || element.selectionStart === 0) {\r
+        var startPos = element.selectionStart;\r
+        var endPos = element.selectionEnd;\r
+        element.value = element.value.substring(0, startPos) + text + element.value.substring(endPos, element.value.length);\r
+    } else{\r
+       element.value = text;\r
+    }\r
+}\r
+\r
+function enterEventListener()\r
+{\r
+       if(document.enter_form.name.value == "")\r
+       {\r
+               alert($invaild_name_message);\r
+               return;\r
+       }\r
+\r
        $("#enter_frame").css("display","none");\r
        $("#chat_frame").css("display","block");\r
 \r
@@ -199,30 +300,34 @@ function enterEventListener(){
        $.cookie("name",document.enter_form.name.value,{ expires: $expires });\r
        $.cookie("color_index",document.enter_form.color.selectedIndex,{ expires: $expires });\r
 \r
-       var text = "/enteredby " + document.enter_form.name.value + " " + color + " " + document.enter_form.mailto.value;\r
-\r
-       $socket.json.emit("send msg",{name:$system_name,message:text,token:document.chat_form.token.value});\r
+       $socket.json.emit("join",{name:document.enter_form.name.value,color:color,mailto:document.enter_form.mailto.value,password:document.enter_form.password.value});\r
 }\r
 \r
 function quitEventListener(){\r
-       var text = "/quitedby " + document.enter_form.name.value;\r
-       $socket.json.emit("send msg",{name:$system_name,message:text,token:document.chat_form.token.value});\r
+       $socket.json.emit("quit",{name:document.enter_form.name.value});\r
 \r
-       $socket.json.emit("get pastLogList",{rno:document.chat_form.rno.value});\r
        $("#enter_frame").css("display","block");\r
        $("#chat_frame").css("display","none");\r
+\r
+       if($roominfo.type != 0 && $roominfo.admin == false)\r
+       {\r
+               $("#message").empty();\r
+               $("#namelist").empty();\r
+               $names = {};\r
+               createNameList();\r
+       }\r
+       else\r
+               $socket.json.emit("get pastLogList",{rno:document.chat_form.rno.value});\r
 }\r
 \r
 function sidEventListener(){\r
-       var cmd = new CommandParserWhenPost;\r
        var msg = {\r
                name:document.enter_form.name.value,\r
-               message:document.chat_form.message.value,\r
-               token:document.chat_form.token.value\r
+               message:document.chat_form.message.value\r
        };      \r
-       msg.message = cmd.parse(msg);\r
+       msg.message = $PostCommandParser.parse(msg);\r
 \r
-       if(msg.message != null)\r
+       if(msg.message != null && msg.message != "")\r
                $socket.json.emit("send msg",msg);\r
 \r
        document.chat_form.message.value ="";\r
@@ -241,6 +346,11 @@ function getErrorMessage(text)
                alert(text);\r
 }\r
 \r
+function IsRomMode()\r
+{\r
+       return $("#chat_frame").css("display") == "none";\r
+}\r
+\r
 //NameCollectionクラス\r
 function GetNameCollection(text)\r
 {\r
@@ -277,202 +387,6 @@ function CreateNameInfo(time,color,mailto)
 }\r
 \r
 //\r
-// CommandParserクラス\r
-//\r
-function CommandParser()\r
-{\r
-       this.word = new Array;\r
-       this.CommandList;\r
-       this.DefaultCommand = function(msg)\r
-       {\r
-               return msg.message;\r
-       }\r
-\r
-       this.parse = function(msg)\r
-       {\r
-               this.word = msg.message.split(" ");\r
-               if(this.CommandList[this.word[0]])\r
-                       return this.CommandList[this.word[0]](msg,this.word);\r
-               else\r
-                       return this.DefaultCommand(msg);\r
-       }\r
-}\r
-\r
-//\r
-// CommandParserWhenGetクラス\r
-//\r
-//     function(msg,word)\r
-//             msg\r
-//                     msgオブジェクト\r
-//             word\r
-//                     トークンリスト\r
-//             返り値\r
-//                     タグもしくは文字列を返す\r
-//                     nullを返した場合、メッセージリストには何も表示されなくなる\r
-function CommandParserWhenGet()\r
-{\r
-       this.DefaultCommand = function(msg)\r
-       {\r
-               return parseBBCode(msg.message);\r
-       }\r
-       this.CommandList = new Array;\r
-       this.CommandList["/tell"] = function(msg,word)\r
-       {\r
-               if((word[2] == "all")||\r
-                       (word[2] == document.enter_form.name.value)||\r
-                       (word[1] == document.enter_form.name.value)\r
-               ){\r
-                       return $("<span/>").attr("id","whisper").append(parseBBCode(word[3]));\r
-               }else{\r
-                       return null;\r
-               }\r
-       }\r
-       this.CommandList["/enteredby"] = function(msg,word)\r
-       {\r
-               var name = word[1];\r
-               var color = word[2];\r
-               var mailto = word[3];\r
-               var text = sprintf($entered_message,name);\r
-               var date = new Date(Date.parse(msg.date));\r
-               $names[name] = CreateNameInfo(date.getTime(),color,mailto);\r
-               createNameList();\r
-               return text;\r
-       }\r
-       this.CommandList["/quitedby"] = function(msg,word)\r
-       {\r
-               var name = word[1];\r
-               var text = sprintf($quited_message,name);\r
-               delete $names[name];\r
-               createNameList();\r
-               return text;\r
-       }\r
-}\r
-CommandParserWhenGet.prototype = new CommandParser;\r
-\r
-//\r
-// CommandParserWhenPostクラス\r
-//\r
-//msg\r
-//     msgオブジェクト\r
-//word\r
-//     word[0] コマンド名\r
-//             word[1] 単語1\r
-//                     :\r
-//     word[n] 単語n\r
-//     返却値\r
-//             文字列を返す\r
-//             nullを返した場合、送信操作が行われなくなる\r
-function CommandParserWhenPost()\r
-{\r
-       this.CommandList = new Array;\r
-       this.CommandList["/tell"] = function(msg,word)\r
-       {\r
-               word[3] = word[2];\r
-               word[2] = word[1];\r
-               word[1] = msg.name;\r
-               return word.join(" ");\r
-       }\r
-       this.CommandList["/dice"] = function(msg,word)\r
-       {\r
-               if(word.length == 1)\r
-                       text = CastDice("6d1");\r
-               else\r
-                       text = CastDice(word[1]);\r
-               return text;\r
-       }\r
-       this.CommandList["/send"] = function(msg,word)\r
-       {\r
-               if(word.length != 3)\r
-                       return msg.message;\r
-\r
-               var message = sprintf($send_message,document.enter_form.name.value,word[2]);\r
-\r
-               if(word[1] == document.chat_form.rno.value)\r
-                       $socket.json.emit("send msg",{name:$system_name,message:message,token:document.chat_form.token.value});\r
-\r
-               var socket = io.connect(location.hostname + "/" + word[1]);\r
-               socket.on("error",getErrorMessage);\r
-               socket.on("connect",function(){\r
-                       socket.json.emit("send msg",{name:$system_name,message:message,token:document.chat_form.token.value});\r
-               });\r
-\r
-               return null;\r
-       }\r
-}\r
-CommandParserWhenPost.prototype = new CommandParser;\r
-\r
-function ParseDiceParam(number,option)\r
-{\r
-       if(typeof(number) != "undefined")\r
-       {\r
-               var result = new Object();\r
-               result.option = typeof(option) == "undefined" ? null : option;\r
-               result.number = parseInt(number);\r
-               return result;\r
-       }\r
-       return null;\r
-}\r
-\r
-function CastDice(text){\r
-       var p = text.match(/(\d+)D(\d+)C*(\d+)?(\-|\+)?F*(\d+)?(\-|\+)?/i);\r
-       var max = parseInt(p[1]);\r
-       var dice_num = parseInt(p[2]);\r
-       var critical = ParseDiceParam(p[3],p[4]);\r
-       var fanble = ParseDiceParam(p[5],p[6]);\r
-       var total = 0;\r
-       var hasCritical = true;\r
-       var hasFanble = true;\r
-       var util = new Util();\r
-\r
-       text = "[" + text + "] -> ";\r
-       for(var i = 0; i < dice_num; i++)\r
-       {\r
-               var t = util.get_random_number(1,max);\r
-               total += t;\r
-               text += t + " + ";\r
-\r
-               if(hasCritical && critical != null)\r
-               {\r
-                       if(critical.option == "-" && t <= critical.number)\r
-                               hasCritical = true;\r
-                       else if(critical.option == "+" && t >= critical.number)\r
-                               hasCritical = true;\r
-                       else if(critical.option == null && t == critical.number)\r
-                               hasCritical = true;\r
-                       else\r
-                               hasCritical = false;\r
-               }\r
-\r
-               if(hasFanble && fanble != null)\r
-               {\r
-                       if(fanble.option == "-" && t <= fanble.number)\r
-                               hasFanble = true;\r
-                       else if(fanble.option == "+" && t >= fanble.number)\r
-                               hasFanble = true;\r
-                       else if(fanble.option == null && t == fanble.number)\r
-                               hasFanble = true;\r
-                       else\r
-                               hasFanble = false;\r
-               }\r
-       }\r
-\r
-       text = text.slice(0,text.length - 3);   //最後に付く" + "を取り除く\r
-       text += " = " + total;\r
-\r
-       if(critical == null)\r
-               hasCritical = false;\r
-       if(fanble == null)\r
-               hasFanble = false;\r
-\r
-       if(hasCritical)\r
-               text = sprintf($critical_message,text);\r
-       else if(hasFanble)\r
-               text = sprintf($fanble_message,text);\r
-\r
-       return text;\r
-}\r
-\r
-//\r
 // Utilクラス\r
 //\r
 function Util()\r