OSDN Git Service

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