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
20 $prefix_filelist = "!";
\r
21 $socket = new Object();
\r
24 $dateFormat = new DateFormat("yyyy/MM/dd HH:mm:ss");
\r
27 $(document).ready(function(){
\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
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
42 $("input[name=close]").click(function(e){
\r
43 $("#help_frame").css("display","none");
\r
45 $("input[name=openPastlog]").click(openPastlogEventListener);
\r
46 $("#enter_frame input[name=name]").keydown(function(e){
\r
48 enterEventListener();
\r
50 $("#chat_frame input[name=message]").keydown(function(e){
\r
54 document.chat_form.onsubmit = function(){return false;};
\r
55 document.enter_form.onsubmit = function(){return false;};
\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
67 function sendRoomInfoListerner(info)
\r
72 $socket.json.emit("get pastLogList",{rno:document.chat_form.rno.value});
\r
74 }else if(info.type == 1){
\r
77 $("#enter_message").append($free_password2);
\r
79 $("#enter_message").append($free_password1);
\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
88 function CreateColorList()
\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
104 function CreatePastLogList(text)
\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
111 var logname = file[i];
\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
121 function getCurretLog()
\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
128 function openPastlogEventListener()
\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
137 function pastLogEventListerner(msg)
\r
139 if(IsRomMode() && $roominfo.type != 0)
\r
141 for(var i = 0; i < msg.length; i++)
\r
142 ParseMessage(msg[i]);
\r
146 function getMessageEventListerner(msg)
\r
148 if(IsRomMode() && $roominfo.type != 0)
\r
152 if( document.getElementById("bell").checked == true && msg.name != document.enter_form.name.value)
\r
153 document.getElementById("NoticeSound").play();
\r
156 var $messageTag = null;
\r
157 function ParseMessage(msg)
\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
164 if(childtag == null)
\r
167 var ptag = $("<p/>");
\r
169 var color = $system_msg_color;
\r
171 var date = new Date(Date.parse(msg.date));
\r
172 if(msg.name != $system_name)
\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
182 ptag.append(msg.name);
\r
185 ptag.append(childtag);
\r
186 ptag.append("(" + $dateFormat.format(date) +")");
\r
188 ptag.css("color",color);
\r
190 if($messageTag == null)
\r
191 $messageTag = $("#message");
\r
193 $messageTag.prepend(ptag);
\r
196 function GetNameLink(name)
\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
204 function createNameList()
\r
206 var date = new Date();
\r
207 $("#namelist").empty();
\r
208 $("#namelist").append("<ul></ul>");
\r
209 for(var name in $names)
\r
211 var diff = date.getTime() - $names[name].time;
\r
212 if(diff >= $afk_time)
\r
214 if(name != $system_name)
\r
216 var atag = $("<a/>")
\r
217 .attr("href",GetNameLink(name))
\r
218 .css("color",$names[name].color)
\r
220 $("#namelist > ul").append($("<li/>").append(atag));
\r
225 function enterEventListener()
\r
227 if(document.enter_form.name.value == "")
\r
229 alert($invaild_name_message);
\r
233 $("#enter_frame").css("display","none");
\r
234 $("#chat_frame").css("display","block");
\r
236 var color = document.enter_form.color.options[document.enter_form.color.selectedIndex].value;
\r
238 $.cookie("name",document.enter_form.name.value,{ expires: $expires });
\r
239 $.cookie("color_index",document.enter_form.color.selectedIndex,{ expires: $expires });
\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
244 function quitEventListener(){
\r
245 $socket.json.emit("quit",{name:document.enter_form.name.value});
\r
247 $("#enter_frame").css("display","block");
\r
248 $("#chat_frame").css("display","none");
\r
250 if($roominfo.type != 0)
\r
252 $("#message").empty();
\r
253 $("#namelist").empty();
\r
256 $socket.json.emit("get pastLogList",{rno:document.chat_form.rno.value});
\r
259 function sidEventListener(){
\r
260 var cmd = new CommandParserWhenPost;
\r
262 name:document.enter_form.name.value,
\r
263 message:document.chat_form.message.value
\r
265 msg.message = cmd.parse(msg);
\r
267 if(msg.message != null)
\r
268 $socket.json.emit("send msg",msg);
\r
270 document.chat_form.message.value ="";
\r
273 function ReflushChatMessage(flag)
\r
275 if(flag) $("#message").empty();
\r
278 function getErrorMessage(text)
\r
281 alert($failed_connect_message);
\r
286 function IsRomMode()
\r
288 return $("#chat_frame").css("display") == "none";
\r
291 //NameCollectionクラス
\r
292 function GetNameCollection(text)
\r
294 var output = new Array();
\r
295 var list = text.split("\n");
\r
296 for(var i = 0; i < list.length; i++)
\r
300 output.push(new NameElement(list[i]));
\r
306 // NamesElementsクラス
\r
308 function NameElement(s)
\r
310 this.data = s.split("<>");
\r
311 this.getName = function()
\r
313 return this.data[0];
\r
318 function CreateNameInfo(time,color,mailto)
\r
320 var result = { time:time,color:color,mailto:""};
\r
321 if(typeof(mailto) != "undifined")
\r
322 result.mailto = mailto;
\r
327 // CommandParserクラス
\r
329 function CommandParser()
\r
331 this.word = new Array;
\r
333 this.DefaultCommand = function(msg)
\r
335 return msg.message;
\r
338 this.parse = function(msg)
\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
344 return this.DefaultCommand(msg);
\r
349 // CommandParserWhenGetクラス
\r
351 // function(msg,word)
\r
358 // nullを返した場合、メッセージリストには何も表示されなくなる
\r
359 function CommandParserWhenGet()
\r
361 this.DefaultCommand = function(msg)
\r
363 return parseBBCode(msg.message);
\r
365 this.CommandList = new Array;
\r
366 this.CommandList["/tell"] = function(msg,word)
\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
372 return $("<span/>").attr("id","whisper").append(parseBBCode(word[3]));
\r
377 this.CommandList["/enteredby"] = function(msg,word)
\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
388 this.CommandList["/quitedby"] = function(msg,word)
\r
390 var name = word[1];
\r
391 var text = sprintf($quited_message,name);
\r
392 delete $names[name];
\r
397 CommandParserWhenGet.prototype = new CommandParser;
\r
400 // CommandParserWhenPostクラス
\r
411 // nullを返した場合、送信操作が行われなくなる
\r
412 function CommandParserWhenPost()
\r
414 this.CommandList = new Array;
\r
415 this.CommandList["/tell"] = function(msg,word)
\r
419 word[1] = msg.name;
\r
420 return word.join(" ");
\r
422 this.CommandList["/dice"] = function(msg,word)
\r
424 if(word.length == 1)
\r
425 text = CastDice("6d1");
\r
427 text = CastDice(word[1]);
\r
430 this.CommandList["/send"] = function(msg,word)
\r
432 if(word.length != 3)
\r
433 return msg.message;
\r
435 var message = sprintf($send_message,document.enter_form.name.value,word[2]);
\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
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
448 this.CommandList["/setpassword"] = function(msg,word)
\r
450 if(word.length != 2)
\r
451 return msg.message;
\r
453 $socket.json.emit("set password",{owner:document.enter_form.name.value,password:word[1]});
\r
458 CommandParserWhenPost.prototype = new CommandParser;
\r
460 function ParseDiceParam(number,option)
\r
462 if(typeof(number) != "undefined")
\r
464 var result = new Object();
\r
465 result.option = typeof(option) == "undefined" ? null : option;
\r
466 result.number = parseInt(number);
\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
479 var hasCritical = true;
\r
480 var hasFanble = true;
\r
481 var util = new Util();
\r
483 text = "[" + text + "] -> ";
\r
484 for(var i = 0; i < dice_num; i++)
\r
486 var t = util.get_random_number(1,max);
\r
490 if(hasCritical && critical != null)
\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
499 hasCritical = false;
\r
502 if(hasFanble && fanble != null)
\r
504 if(fanble.option == "-" && t <= fanble.number)
\r
506 else if(fanble.option == "+" && t >= fanble.number)
\r
508 else if(fanble.option == null && t == fanble.number)
\r
515 text = text.slice(0,text.length - 3); //最後に付く" + "を取り除く
\r
516 text += " = " + total;
\r
518 if(critical == null)
\r
519 hasCritical = false;
\r
524 text = sprintf($critical_message,text);
\r
526 text = sprintf($fanble_message,text);
\r
536 this.get_random_number = function (a,b)
\r
538 return Math.floor(a + Math.random() * b);
\r
541 this.htmlspecialchars = function (ch) {
\r
542 ch = ch.replace(/&/g,"&") ;
\r
543 ch = ch.replace(/"/g,""") ;
\r
544 ch = ch.replace(/'/g,"'") ;
\r
545 ch = ch.replace(/</g,"<") ;
\r
546 ch = ch.replace(/>/g,">") ;
\r