OSDN Git Service

空発言を送信できないようにした
[webchat/WebChat.git] / public / scripts / chatclient.js
1 $expires = 30;       //クッキーの保持日数\r
2 $afk_time = 1000 * 60 * 60;     //AFKと判定する時間(ミリ秒で指定すること)\r
3 $log_file_name = "logfile%d.txt";       //ログファイル名(%dはそのままにしておくこと)\r
4 $system_name = "system";        //システム発言を表す名前(chat.phpと同じにすること)\r
5 $entered_message = "%sが入室しました";\r
6 $quited_message = "%sが退室しました";\r
7 $system_msg_color ="#000000";\r
8 $profile_link = ""      //プロフィールシステムへのリンク先(%nで名前を表す)\r
9 $fanble_message = "[color=blue]%s ファンブル![/color]";\r
10 $critical_message = "[color=red]%s クリティカル![/color]";\r
11 $send_message = "%sからの送信 %s";\r
12 $failed_connect_message = "接続に失敗しました";\r
13 $invaild_name_message = "名前を空欄にすることはできません";\r
14 $free_password1 = "最初に入室する人が自由にパスワードを設定できます";   //自由パスワードメッセージ1\r
15 $free_password2 = "この部屋は使用されています。パスワードを入力してください";       //自由パスワードメッセージ2\r
16 $fixed_password = "この部屋にはパスワードが設定されています";       //固定パスワードルーム\r
17 $hidden_log_to_rom = "この部屋ではROMできないようになっています";    //ROM禁止ルーム\r
18 $adminmsg = "(管理モード)";        //管理モード\r
19 $romcount_msg = "ROM(%d人)"    //ROMカウント\r
20 \r
21 //ここから先は変更しないでください\r
22 $prefix_filelist = "!";\r
23 $socket = new Object();\r
24 $names = {};\r
25 $roominfo = {};\r
26 $dateFormat = new DateFormat("yyyy/MM/dd HH:mm:ss");\r
27 $romcount = 0;\r
28 //ここまで\r
29 \r
30 $(document).ready(function(){\r
31         CreateColorList();\r
32 \r
33         //クッキーからフォームに読み込む\r
34         var temp = $.cookie("name");\r
35         if(temp)        document.enter_form.name.value = temp;\r
36         temp = $.cookie("color_index");\r
37         if(temp)        document.enter_form.color.selectedIndex = temp;\r
38 \r
39         $("input[name=sid]").click(sidEventListener);\r
40         $("input[name=enter]").click(enterEventListener);\r
41         $("input[name=quit]").click(quitEventListener);\r
42         $("input[name=help]").click(function(e){\r
43                 $("#help_frame").css("display","block");\r
44         });\r
45         $("input[name=close]").click(function(e){\r
46                 $("#help_frame").css("display","none");\r
47         });\r
48         $("input[name=openPastlog]").click(openPastlogEventListener);\r
49         document.chat_form.onsubmit = function(){return false;};\r
50         document.enter_form.onsubmit = function(){return false;};\r
51 \r
52         $socket = io.connect(location.hostname  + "/" + document.chat_form.rno.value + "?token="+ encodeURIComponent(document.chat_form.token.value));\r
53         $socket.on("error",getErrorMessage);\r
54         $socket.on("send roominfo",sendRoomInfoListerner);\r
55         $socket.on("send romcount",sendRomCountListerner);\r
56         $socket.on("connect",function(){\r
57                 $socket.on("req pastlog",pastLogEventListerner);\r
58                 $socket.on("req msg",getMessageEventListerner);\r
59                 $socket.on("req pastloglist",CreatePastLogList);\r
60         });\r
61 });\r
62 \r
63 function sendRomCountListerner(count)\r
64 {\r
65         $romcount = count;\r
66         createNameList();\r
67 }\r
68 \r
69 function sendRoomInfoListerner(info)\r
70 {\r
71         $roominfo = info;\r
72         var logflag = true;\r
73         var msg = "";\r
74         if(info.type == 1){\r
75                 if(info.IsOwned)\r
76                         msg = $free_password2;\r
77                 else\r
78                         msg = $free_password1;\r
79                 logflag = false;\r
80         }else if(info.type == 2){\r
81                 msg = $fixed_password;\r
82                 logflag = false;\r
83         }else if(info.type == 3){\r
84                 msg = $hidden_log_to_rom;\r
85                 logflag = false;\r
86         }\r
87         if(info.admin)\r
88         {\r
89                 logflag = true;\r
90                 msg += $adminmsg;\r
91         }\r
92         if(msg != "")\r
93                 $("#enter_message").append(msg);\r
94         if(logflag)\r
95         {\r
96                 $socket.json.emit("get pastLogList",{rno:document.chat_form.rno.value});\r
97                 getCurretLog();\r
98         }\r
99 }\r
100 \r
101 function CreateColorList()\r
102 {\r
103         var c = new Array("00","33","66","99","CC","FF");\r
104         for(var r = 0; r < c.length; r++){\r
105                 for(var g = 0; g < c.length; g++){\r
106                         for(var b = 0; b < c.length; b++){\r
107                                 var t = document.createElement("option");\r
108                                 t.value = "#"+c[r]+c[g]+c[b];\r
109                                 t.style.backgroundColor = "#"+c[r]+c[g]+c[b];\r
110                                 t.appendChild(document.createTextNode("#"+c[r]+c[g]+c[b]));\r
111                                 $("#enter_frame form select[name=color]").append(t);\r
112                         }\r
113                 }\r
114         }\r
115 }\r
116 \r
117 function CreatePastLogList(text)\r
118 {\r
119         $("#enter_frame form select[name=past]").empty();\r
120         var rno = document.chat_form.rno.value;\r
121         var file = text.split("\n");\r
122         for(var i = 0; i < file.length; i++)\r
123         {\r
124                 var logname = file[i];\r
125                 if(logname == "")\r
126                         continue;\r
127                 var element = document.createElement("option");\r
128                 element.value = logname;\r
129                 element.appendChild(document.createTextNode(logname));\r
130                 $("#enter_frame form select[name=past]").append(element);\r
131         }\r
132 }\r
133 \r
134 function getCurretLog()\r
135 {\r
136         var rno = document.chat_form.rno.value;\r
137         var url = sprintf($log_file_name,rno);\r
138         $socket.emit("get pastLog",url);\r
139 }\r
140 \r
141 function openPastlogEventListener()\r
142 {\r
143         $tid = 0;\r
144         $("#message").empty();\r
145         $("#namelist").empty();\r
146         var url = document.enter_form.past.options[document.enter_form.past.selectedIndex].value;\r
147         $socket.emit("get pastLog",url);\r
148 }\r
149 \r
150 function pastLogEventListerner(msg)\r
151 {\r
152         if(IsRomMode() && $roominfo.type != 0 && $roominfo.admin == false)\r
153                 return;\r
154         for(var i = 0; i < msg.length; i++)\r
155                 ParseMessage(msg[i]);\r
156         createNameList();\r
157 }\r
158 \r
159 function getMessageEventListerner(msg)\r
160 {\r
161         if(IsRomMode() && $roominfo.type != 0 && $roominfo.admin == false)\r
162                 return;\r
163         ParseMessage(msg);\r
164         createNameList();\r
165         if( document.getElementById("bell").checked == true && msg.name != document.enter_form.name.value)\r
166                 document.getElementById("NoticeSound").play();\r
167 }\r
168 \r
169 var $messageTag = null;\r
170 function ParseMessage(msg)\r
171 {\r
172         var util = new Util();\r
173         var cmd = new CommandParserWhenGet;\r
174         msg.message = util.htmlspecialchars(msg.message);\r
175         var childtag = cmd.parse(msg);\r
176 \r
177         if(childtag == null)\r
178                 return;\r
179 \r
180         var ptag = $("<p/>");\r
181 \r
182         var color = $system_msg_color;\r
183         var mailto = "";\r
184         var date = new Date(Date.parse(msg.date));\r
185         if(msg.name != $system_name)\r
186         {\r
187                 color = $names[msg.name].color;\r
188                 $names[msg.name].time = date.getTime();\r
189                 var atag = $("<a/>")\r
190                         .attr("href",GetNameLink(msg.name))\r
191                         .css("color",color)\r
192                         .text(util.htmlspecialchars(msg.name));\r
193                 ptag.append(atag);\r
194         }else{\r
195                 ptag.append(msg.name);\r
196         }\r
197         if(msg.ip != "")\r
198                 ptag.append(" " + msg.ip);\r
199         ptag.append(":");\r
200         ptag.append(childtag);\r
201         ptag.append("(" + $dateFormat.format(date) +")");\r
202 \r
203         ptag.css("color",color);\r
204 \r
205         if($messageTag == null)\r
206                 $messageTag = $("#message");\r
207 \r
208         $messageTag.prepend(ptag);\r
209 }\r
210 \r
211 function GetNameLink(name)\r
212 {\r
213         var util = new Util();\r
214         if($names[name].mailto == "")\r
215                 return $profile_link.replace("%n",encodeURIComponent(name));\r
216         return "mailto:" + util.htmlspecialchars($names[name].mailto);\r
217 }\r
218 \r
219 function createNameList()\r
220 {\r
221         var date = new Date();\r
222         $("#namelist").empty();\r
223         $("#namelist").append("<ul></ul>");\r
224         $("#namelist > ul").append($("<li/>").append(sprintf($romcount_msg,$romcount)));\r
225         for(var name in $names)\r
226         {\r
227                 var diff = date.getTime() - $names[name].time;\r
228                 if(diff >= $afk_time)\r
229                         continue;\r
230                 if(name != $system_name)\r
231                 {\r
232                         var atag = $("<a/>")\r
233                                 .attr("href",GetNameLink(name))\r
234                                 .css("color",$names[name].color)\r
235                                 .text(name);\r
236                         $("#namelist > ul").append($("<li/>").append(atag));\r
237                 }\r
238         }\r
239 }\r
240 \r
241 function enterEventListener()\r
242 {\r
243         if(document.enter_form.name.value == "")\r
244         {\r
245                 alert($invaild_name_message);\r
246                 return;\r
247         }\r
248 \r
249         $("#enter_frame").css("display","none");\r
250         $("#chat_frame").css("display","block");\r
251 \r
252         var color = document.enter_form.color.options[document.enter_form.color.selectedIndex].value;\r
253 \r
254         $.cookie("name",document.enter_form.name.value,{ expires: $expires });\r
255         $.cookie("color_index",document.enter_form.color.selectedIndex,{ expires: $expires });\r
256 \r
257         $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
258 }\r
259 \r
260 function quitEventListener(){\r
261         $socket.json.emit("quit",{name:document.enter_form.name.value});\r
262 \r
263         $("#enter_frame").css("display","block");\r
264         $("#chat_frame").css("display","none");\r
265 \r
266         if($roominfo.type != 0 && $roominfo.admin == false)\r
267         {\r
268                 $("#message").empty();\r
269                 $("#namelist").empty();\r
270                 $names = {};\r
271                 createNameList();\r
272         }\r
273         else\r
274                 $socket.json.emit("get pastLogList",{rno:document.chat_form.rno.value});\r
275 }\r
276 \r
277 function sidEventListener(){\r
278         var cmd = new CommandParserWhenPost;\r
279         var msg = {\r
280                 name:document.enter_form.name.value,\r
281                 message:document.chat_form.message.value\r
282         };      \r
283         msg.message = cmd.parse(msg);\r
284 \r
285         if(msg.message != null && msg.message != "")\r
286                 $socket.json.emit("send msg",msg);\r
287 \r
288         document.chat_form.message.value ="";\r
289 }\r
290 \r
291 function ReflushChatMessage(flag)\r
292 {\r
293         if(flag)        $("#message").empty();\r
294 }\r
295 \r
296 function getErrorMessage(text)\r
297 {\r
298         if(text == "")\r
299                 alert($failed_connect_message);\r
300         else\r
301                 alert(text);\r
302 }\r
303 \r
304 function IsRomMode()\r
305 {\r
306         return $("#chat_frame").css("display") == "none";\r
307 }\r
308 \r
309 //NameCollectionクラス\r
310 function GetNameCollection(text)\r
311 {\r
312         var output = new Array();\r
313         var list = text.split("\n");\r
314         for(var i = 0; i < list.length; i++)\r
315         {\r
316                 if(list[i] == "")\r
317                         continue;\r
318                 output.push(new NameElement(list[i]));\r
319         }\r
320         return output;\r
321 }\r
322 \r
323 //\r
324 // NamesElementsクラス\r
325 //\r
326 function NameElement(s)\r
327 {\r
328         this.data = s.split("<>");\r
329         this.getName = function()\r
330         {\r
331                 return this.data[0];\r
332         }\r
333 }\r
334 \r
335 // NameInfoクラス\r
336 function CreateNameInfo(time,color,mailto)\r
337 {\r
338         var result = { time:time,color:color,mailto:""};\r
339         if(typeof(mailto) != "undifined")\r
340                 result.mailto = mailto;\r
341         return result;\r
342 }\r
343 \r
344 //\r
345 // CommandParserクラス\r
346 //\r
347 function CommandParser()\r
348 {\r
349         this.word = new Array;\r
350         this.CommandList;\r
351         this.DefaultCommand = function(msg)\r
352         {\r
353                 return msg.message;\r
354         }\r
355 \r
356         this.parse = function(msg)\r
357         {\r
358                 this.word = msg.message.split(" ");\r
359                 if(this.CommandList[this.word[0]])\r
360                         return this.CommandList[this.word[0]](msg,this.word);\r
361                 else\r
362                         return this.DefaultCommand(msg);\r
363         }\r
364 }\r
365 \r
366 //\r
367 // CommandParserWhenGetクラス\r
368 //\r
369 //      function(msg,word)\r
370 //              msg\r
371 //                      msgオブジェクト\r
372 //              word\r
373 //                      トークンリスト\r
374 //              返り値\r
375 //                      タグもしくは文字列を返す\r
376 //                      nullを返した場合、メッセージリストには何も表示されなくなる\r
377 function CommandParserWhenGet()\r
378 {\r
379         this.DefaultCommand = function(msg)\r
380         {\r
381                 return parseBBCode(msg.message);\r
382         }\r
383         this.CommandList = new Array;\r
384         this.CommandList["/tell"] = function(msg,word)\r
385         {\r
386                 if((word[2] == "all")||\r
387                         (word[2] == document.enter_form.name.value)||\r
388                         (word[1] == document.enter_form.name.value)\r
389                 ){\r
390                         return $("<span/>").attr("id","whisper").append(parseBBCode(word[3]));\r
391                 }else{\r
392                         return null;\r
393                 }\r
394         }\r
395         this.CommandList["/enteredby"] = function(msg,word)\r
396         {\r
397                 var name = word[1];\r
398                 var color = word[2];\r
399                 var mailto = word[3];\r
400                 var text = sprintf($entered_message,name);\r
401                 var date = new Date(Date.parse(msg.date));\r
402                 $names[name] = CreateNameInfo(date.getTime(),color,mailto);\r
403                 createNameList();\r
404                 return text;\r
405         }\r
406         this.CommandList["/quitedby"] = function(msg,word)\r
407         {\r
408                 var name = word[1];\r
409                 var text = sprintf($quited_message,name);\r
410                 delete $names[name];\r
411                 createNameList();\r
412                 return text;\r
413         }\r
414 }\r
415 CommandParserWhenGet.prototype = new CommandParser;\r
416 \r
417 //\r
418 // CommandParserWhenPostクラス\r
419 //\r
420 //msg\r
421 //      msgオブジェクト\r
422 //word\r
423 //      word[0] コマンド名\r
424 //              word[1] 単語1\r
425 //                      :\r
426 //      word[n] 単語n\r
427 //      返却値\r
428 //              文字列を返す\r
429 //              nullを返した場合、送信操作が行われなくなる\r
430 function CommandParserWhenPost()\r
431 {\r
432         this.CommandList = new Array;\r
433         this.CommandList["/tell"] = function(msg,word)\r
434         {\r
435                 word[3] = word[2];\r
436                 word[2] = word[1];\r
437                 word[1] = msg.name;\r
438                 return word.join(" ");\r
439         }\r
440         this.CommandList["/dice"] = function(msg,word)\r
441         {\r
442                 if(word.length == 1)\r
443                         text = CastDice("6d1");\r
444                 else\r
445                         text = CastDice(word[1]);\r
446                 return text;\r
447         }\r
448         this.CommandList["/send"] = function(msg,word)\r
449         {\r
450                 if(word.length != 3)\r
451                         return msg.message;\r
452 \r
453                 var message = sprintf($send_message,document.enter_form.name.value,word[2]);\r
454 \r
455                 if(word[1] == document.chat_form.rno.value)\r
456                         $socket.json.emit("send msg",{name:$system_name,message:message,token:document.chat_form.token.value});\r
457 \r
458                 var socket = io.connect(location.hostname + "/" + word[1]);\r
459                 socket.on("error",getErrorMessage);\r
460                 socket.on("connect",function(){\r
461                         socket.json.emit("send msg",{name:$system_name,message:message,token:document.chat_form.token.value});\r
462                 });\r
463 \r
464                 return null;\r
465         }\r
466         this.CommandList["/setpassword"] = function(msg,word)\r
467         {\r
468                 if(word.length != 2)\r
469                         return msg.message;\r
470 \r
471                 $socket.json.emit("set password",{owner:document.enter_form.name.value,password:word[1]});\r
472 \r
473                 return null;\r
474         }\r
475 }\r
476 CommandParserWhenPost.prototype = new CommandParser;\r
477 \r
478 function ParseDiceParam(number,option)\r
479 {\r
480         if(typeof(number) != "undefined")\r
481         {\r
482                 var result = new Object();\r
483                 result.option = typeof(option) == "undefined" ? null : option;\r
484                 result.number = parseInt(number);\r
485                 return result;\r
486         }\r
487         return null;\r
488 }\r
489 \r
490 function CastDice(text){\r
491         var p = text.match(/(\d+)D(\d+)C*(\d+)?(\-|\+)?F*(\d+)?(\-|\+)?/i);\r
492         var max = parseInt(p[1]);\r
493         var dice_num = parseInt(p[2]);\r
494         var critical = ParseDiceParam(p[3],p[4]);\r
495         var fanble = ParseDiceParam(p[5],p[6]);\r
496         var total = 0;\r
497         var hasCritical = true;\r
498         var hasFanble = true;\r
499         var util = new Util();\r
500 \r
501         text = "[" + text + "] -> ";\r
502         for(var i = 0; i < dice_num; i++)\r
503         {\r
504                 var t = util.get_random_number(1,max);\r
505                 total += t;\r
506                 text += t + " + ";\r
507 \r
508                 if(hasCritical && critical != null)\r
509                 {\r
510                         if(critical.option == "-" && t <= critical.number)\r
511                                 hasCritical = true;\r
512                         else if(critical.option == "+" && t >= critical.number)\r
513                                 hasCritical = true;\r
514                         else if(critical.option == null && t == critical.number)\r
515                                 hasCritical = true;\r
516                         else\r
517                                 hasCritical = false;\r
518                 }\r
519 \r
520                 if(hasFanble && fanble != null)\r
521                 {\r
522                         if(fanble.option == "-" && t <= fanble.number)\r
523                                 hasFanble = true;\r
524                         else if(fanble.option == "+" && t >= fanble.number)\r
525                                 hasFanble = true;\r
526                         else if(fanble.option == null && t == fanble.number)\r
527                                 hasFanble = true;\r
528                         else\r
529                                 hasFanble = false;\r
530                 }\r
531         }\r
532 \r
533         text = text.slice(0,text.length - 3);   //最後に付く" + "を取り除く\r
534         text += " = " + total;\r
535 \r
536         if(critical == null)\r
537                 hasCritical = false;\r
538         if(fanble == null)\r
539                 hasFanble = false;\r
540 \r
541         if(hasCritical)\r
542                 text = sprintf($critical_message,text);\r
543         else if(hasFanble)\r
544                 text = sprintf($fanble_message,text);\r
545 \r
546         return text;\r
547 }\r
548 \r
549 //\r
550 // Utilクラス\r
551 //\r
552 function Util()\r
553 {\r
554         this.get_random_number = function (a,b)\r
555         {\r
556                 return Math.floor(a + Math.random() * b);\r
557         }\r
558 \r
559         this.htmlspecialchars = function (ch) {\r
560                 ch = ch.replace(/&/g,"&amp;") ;\r
561                 ch = ch.replace(/"/g,"&quot;") ;\r
562                 ch = ch.replace(/'/g,"&#039;") ;\r
563                 ch = ch.replace(/</g,"&lt;") ;\r
564                 ch = ch.replace(/>/g,"&gt;") ;\r
565           return ch ;\r
566         }\r
567 \r
568 }\r