#!/usr/bin/perl #発射&リロード # 99/1/31 update(v4.5) by 普通 #==================================================================== #ご協力を頂いた方 #oidon"; # $roomdisp2 = ""; ##################フラッシュバージョン################## if ($ficon eq 'y') { $roomdisp = ""; $roomdisp2 = ""; ####################変更はここまで###################### }else{ $roomdisp = $roomname; $roomdisp2 = $roomname; } if ($ic_chat) { if ($ic_chat eq '1') {$ic_disp = "
  • あいこん一覧\n";} else { if ($frame eq 'yes') {$ic_disp = "
  • あいこん一覧\n";} else {$ic_disp = "
  • あいこん一覧\n";} } } if ($ranking) { if ($frame eq 'yes') {$disp9 = "
  • 発言ランキング\n";} else {$disp9 = "
  • 発言ランキング\n";} } #発言文字カラー $color = $in{'color'}; #ささやき相手殿 $seqmem = $in{'seqmem'}; &jcode'convert(*seqmem,'sjis'); #ささやき要求 if ($in{'seqmem'} eq 'noneseq') {;} else {$seqreq = '1';} #ハンドル名 $chatname = $in{'chatname'}; #発言色変更チェック if ($in{'ccolor'}) {&ccolor();} if ($profno) { $chatname_disp = "$chatname";} else {$chatname_disp = $chatname;} #入室チェック if ($in{'start'}) { $chatname =~ s/\r//g; $chatname =~ s/\n//g; $chatname =~ s/ //g; $chatname =~ s/\(/(/g; $chatname =~ s/\)/)/g; $chatname =~ s/|/\|/g; $chatname =~ s/ //g; if (!$chatname) {&error();} $pfreg = 'ng'; #プロフィールチェック if ($func_prof) { &prof_check(); if ($prof_reg eq 'ok') { $chatname_disp = "$chatname"; } else {$chatname_disp = $chatname;} } else {$chatname_disp = $chatname;} #入室パスワードチェック &room_pass(); #入室時の参加メンバー登録 &memberin(); #入室広報 if ($guid_msg eq '1') {&an_inmsg();} } } sub main { &actmemcheck(); print<<"__EOF__"; $title2
    発言 __EOF__ #ささやき相手メンバー表示 &seqmember (); print "
    \n"; if ($in{'java'} eq 'yes') { print<<"__EOF__"; __EOF__ } ######退室する######################################################## print<<"__EOF__";

    __EOF__ #ささやき要求時でのメンバー検索 if ($seqreq eq '1') {&seqmems ();} #入室メッセージ表示 if ($in{'start'}) {&roominmsg ();} #発言内容の書き込み elsif ($in{'comment'}) {&commsg ();} #待機からの復帰の書き込み elsif ($in{'wait'}) {&retmsg ();} #発言内容の表示 &prcom2(); print<<"__EOF__";



    ここは、$title - $roomdispです。

    うこそ、いらっしゃいませ!「$chatname」さん。じゃん、じゃんんでってくださいね!
    • 発言内容の更新は「発言/リロード」ボタンを押してください。
    • お帰り(退室)は下の「退室する」ボタンを押してネ!(参加人数を間違えるので・・・)
      $disp9
    • HELP
      $ic_disp

    __EOF__ exit(0); } #フレームモード表示判定 sub main2 { &actmemcheck(); if ($in{'wind'} eq 'f') {&main2_f();} elsif ($in{'wind'} eq 't') {&main2_t();} else {&main2_1st();} } #フレーム初期表示(フレーム対応) sub main2_1st { #入室メッセージ表示 if ($in{'start'}) {&roominmsg ();} $w_color = $color; $w_chatname = $chatname; $e_color = &encode($w_color); $e_chatname = &encode($w_chatname); print<<"__EOF__"; $title2 <BODY BGCOLOR="$mf_bgcolor" TEXT="$mf_txcolor"> <TABLE><TR> <TD VALIGN=bottom><FORM METHOD="POST" ACTION="${sbase}chat_end.cgi"> <INPUT TYPE=hidden NAME="roomno" VALUE="$roomno"> <INPUT TYPE=hidden NAME="profno" VALUE="$profno"> <INPUT TYPE=hidden NAME="chatname" VALUE="$chatname"> <INPUT TYPE=hidden NAME="color" VALUE="$color"> <INPUT TYPE=submit VALUE="退室する"></FORM> </TR></TABLE><HR SIZE=2> <FONT FACE="MS Pゴシック"> <H2><STRONG>ここは、$title - $roomdispです。</STRONG></H2> 現在、この部屋はフレーム表\示モードにて動作しています。一旦退室し、非フレームにて入室願います<BR> </FONT><HR NOSHADE> __EOF__ } #発言フォーム表示(フレーム対応) sub main2_f { print "$title2\n"; if ($in{'java'} eq 'yes') { print<<"__EOF__"; __EOF__ $jsubmit = "onSubmit=\"setTimeout("autoclear()",10)\""; } print<<"__EOF__";
    発言 __EOF__ #ささやき相手メンバー表示 &seqmember (); print<<"__EOF__";
    自動リロード : CallBell:


    ここは、$title - $roomdispです。

    うこそ、いらっしゃいませ!「$chatname」さん。じゃん、じゃんんでってくださいね!
    • 発言内容の更新は「発言/リロード」ボタンを押してください。
    • お帰り(退室)は下の「退室する」ボタンを押してネ!(参加人数を間違えるので・・・)
      $disp9
    • HELP
      $ic_disp

    __EOF__ } #発言内容表示(フレーム対応) sub main2_t { $rlt = $in{'rlt'}; $w_color = $color; $w_color = $color; $w_chatname = $chatname; $e_color = &encode($w_color); $e_chatname = &encode($w_chatname); print "$title2\n"; if ($in{'rlt'}) { if ($in{'rlt'} eq '0') {;} else { if ($in{'bell'} eq '1' || $in{'entime'}) { print "\n"; } else { print "\n"; } } } print "\n"; #ささやき要求時でのメンバー検索 if ($seqreq eq '1') {&seqmems ();} #発言内容の書き込み if ($in{'comment'}) {&commsg();} #発言内容の表示 if ($in{'bell'} eq '1' || $in{'entime'}) {print "【ベルON】
    \n";} &prcom2(); print "
    \n"; if ($in{'rlt'}) { if ($in{'rlt'} eq '0') {print "リロード:手動\n";} else {print "リロード:$in{'rlt'}秒\n";}} else {print "リロード:手動\n";} print "\n"; exit(0); } #部屋属性取得 sub roomset { &ReadHeader ($roomno); ($roomname,$f_intime,$f_outtime,$f_memcnt,$hf_bgcolor,$hf_txcolor,$hf_line,$hf_roomenv,$hf_roompass,$hf_ccolor,$dmy) = split(/||\n/,$hf_list); } #入室パスワードチェック sub room_pass { if ($hf_roompass) { if ($in{'rpass'}) { if ($hf_roompass =~ /^\$1\$/) { $crptkey = 3; } # FreeBSDサーバ対応 else { $crptkey = 0; } $wk_pass = $hf_roompass; $roompass = crypt($in{'rpass'}, substr($wk_pass, $crptkey, 2)); if ($hf_roompass eq $roompass) {;} else {&perror2();} } else {&perror();} } } #プロフィールチェック sub prof_check { if ($chatname =~ /@/) {@pmf_chatname = split(/@/,$chatname);} else {push (@pmf_chatname,$chatname);} &ReadProfile(); $prof_reg = 'ng'; foreach (@pmf_list) { ($pf_regno,$pf_udate,$pf_chatname,$pf_mail,$pf_url,$pf_turl,$pf_msg1,$pf_msg2,$pf_pass,$pf_yobi) = split("||\n"); if ($pf_chatname eq $pmf_chatname[0]) { if ($in{'ppass'} && $pf_pass) { if ($pf_pass =~ /^\$1\$/) { $crptkey = 3; } # FreeBSDサーバ対応 else { $crptkey = 0; } $pwk_pass = $pf_pass; $profpass = crypt($in{'ppass'}, substr($pwk_pass, $crptkey, 2)); if ($pf_pass eq $profpass) { $profno = $pf_regno; $prof_reg = 'ok'; return; } else { if ($prof_env eq '1') {&pmerror();} else {return;} } } else { if ($prof_env eq '1') {&pmerror();} else {return;} } } } } #アクティブメンバーチェック sub actmemcheck { &ReadMember ($roomno); foreach (@mf_list) { ($mf_roomno,$mf_roomname,$mf_chatname,$mf_intime,$mf_seq,$mf_ipaddr,$mf_bgcolor,$mf_txcolor,$mf_line,$mf_ccolor) = split(/||\n/); if ($chatname eq $mf_chatname) {return;} } &actmemerr(); } #ささやき受けメンバー表示 sub seqmember { print "
    ささやき!→\n"; } #ささやき受けメンバー検索 sub seqmems { local($cn,$ip) = ("相手無し","000000000000"); foreach (@mf_list) { ($mf_roomno,$mf_roomname,$mf_chatname,$mf_intime,$mf_seq,$mf_ipaddr,$mf_bgcolor,$mf_txcolor,$mf_line,$mf_ccolor) = split(/||\n/); if ($mf_chatname eq $seqmem) { ($cn,$ip) = ($mf_chatname,$mf_ipaddr); last; } } $seq_chatname = $cn; $seqmsg= ""; } #発言メッセージ書き込み sub commsg { $comment = $in{'comment'}; &jcode'convert(*comment, 'sjis'); $comment =~ s//>/g; $comment =~ s/\r//g; $comment =~ s/\n//g; $comment =~ s/(http:\/\/[\w\-\?\#\+\.\/~:]{9,})/$1<\/A>/ig; if ($ic_chat) {$comment =~ s/\[(\w{3,8})\]//g;} if ($seq_chatname) { $seqdst = "→$seq_chatname"; } else { $seqdst = ""; } &WriteComment ($roomno, "$chatname_disp$cend1$seqdst>$comment$cend2\[$date$rhost\]$seqmsg
    \n"); if ($ranking && !$seqreq eq '1') {&ranking();} } #入室メッセージ表示 sub roominmsg { &WriteComment ($roomno, "「$chatname_disp」さんが入室!\[$date$rhost\]
    \n"); if ($log) { $logfile ="$logdir$logbase$year$mon$mday.csv"; open (logf,">>$logfile"); flock(logf,2) if $FLK; print logf "$year/$mon/$mday,$hour:$mon,$roomname,$chatname,$ENV{'REMOTE_HOST'},$ENV{'REMOTE_ADDR'},$ENV{'HTTP_USER_AGENT'}\n"; close (logf); flock (logf,8) if $FLK; } } #復帰メッセージ表示 sub retmsg { &WriteComment ($roomno, "「$chatname_disp」は待機から復帰!\[$date$rhost\]
    \n"); } #参加メンバー登録 sub memberin { &LockReadMember($roomno); $memcnt = @mf_list + 1; #追加を前提に行数を算出 foreach (@mf_list) { ($mf_roomno,$mf_roomname,$mf_chatname,$mf_intime,$mf_seq,$mf_ipaddr,$mf_bgcolor,$mf_txcolor,$mf_line,$mf_ccolor) = split(/||\n/); if ($chatname eq $mf_chatname) { $_ = ''; #既登録済みの場合、古いエントリを削除 $memcnt--; #追加でなかった時行数を調整 } } unshift(@mf_list,"$roomno|$roomname|$chatname|$time|$seq|$ipaddr|$hf_bgcolor|$hf_txcolor|$hf_line|$color\n"); #改めて登録 $mf_bgcolor = $hf_bgcolor; $mf_txcolor = $hf_txcolor; &UnlockWriteMember($roomno); #Chat室表紙情報更新 &LockReadHeader ($roomno); ($f_rname,$f_intime,$f_outtime,$f_memcnt,$hf_bgcolor,$hf_txcolor,$hf_line,$hf_roomenv,$hf_roompass,$hf_ccolor,$dmy) = split(/||\n/,$hf_list); $hf_list = "$f_rname|$date|$f_outtime|$memcnt|$hf_bgcolor|$hf_txcolor|$hf_line|$hf_roomenv|$hf_roompass|$hf_ccolor|\n"; &UnlockWriteHeader ($roomno); #参加履歴登録 $logtext = "
  • $roomdisp2「$chatname_disp」さんが入室!\[$date\]
    \n"; &WriteLog ($logtext); } #発言色変更登録 sub ccolor { &LockReadMember ($roomno); foreach (@mf_list) { ($mf_roomno,$mf_roomname,$mf_chatname,$mf_intime,$mf_seq,$mf_ipaddr,$mf_bgcolor,$mf_txcolor,$mf_line,$mf_ccolor) = split(/||\n/); if ($chatname eq $mf_chatname) { $_ = "$mf_roomno|$mf_roomname|$mf_chatname|$mf_intime|$mf_seq|$mf_ipaddr|$mf_bgcolor|$mf_txcolor|$mf_line|$color\n"; last; } } &UnlockWriteMember ($roomno); } #投稿内容の表示 sub prcom2 { $lcnt = 0; $bell = ''; &ReadComment ($roomno); $myid = "$chatname:$ipaddr"; foreach (@cf_list) { if (s///g) { next if ($1 ne $myid && $2 ne $myid); $_ = "$_"; } if ($in{'entime'} && s///g) { if ($1 > $in{'entime'}) { $bell = 1; } } print $mf_line, $_; last if (++$lcnt > $dmax); } if ($bell) { print "\n"; } } #他部屋への入室メッセージ投稿 sub an_inmsg { foreach $froomno (@room_list) { next if ($froomno eq $roomno || -z "${fbase}roommember$froomno.txt"); $ta_com = "ご案内>「$chatname_disp」さんが$roomdisp2に入室\[$date$rhost\]
    \n"; &WriteComment ($froomno,$ta_com); } } #発言ランキング累計 sub ranking { if ($chatname =~ /@/) {@rk_chatname = split(/@|@/,$chatname);} else {push (@rk_chatname,$chatname);} &LockReadRanking; $mod = '0'; foreach (@rf_list) { ($rf_chatname,$rf_ltime,$rf_mon,$rf_cnt1,$rf_cnt2,$rf_cnt3,$rf_lhost,$rf_profno) = split(/||\n/); if ($rf_chatname eq $rk_chatname[0]) { if ($rf_mon eq $mon) { $mrf_cnt = $rf_cnt1 + 1; } else { $rf_mon = $mon; $rf_cnt3 = $rf_cnt2; $rf_cnt2 = $rf_cnt1; $mrf_cnt = 1; } $_ = "$rf_chatname|$date_now|$rf_mon|$mrf_cnt|$rf_cnt2|$rf_cnt3|$rf_lhost|$profno\n"; $mod = '1'; last; } } if ($mod eq '0') {unshift(@rf_list,"$rk_chatname[0]|$date_now|$mon|1|0|0||\n");} &UnlockWriteRanking; } #エンコード処理 sub encode { $_[0] =~ s/([^0-9A-Za-z_ ])/'%'.unpack('H2',$1)/ge; $_[0] =~ s/\s/+/g; $_[0]; } sub set_cookie { # クッキーの発行 $ENV{'TZ'} = "GMT"; # 国際標準時を取得 ($secg,$ming,$hourg,$mdayg,$mong,$yearg,$wdayg,$ydayg,$isdstg)=localtime(time+30*24*60*60); if ($yearg < 10) { $yearg = "0$yearg"; } if ($secg < 10) { $secg = "0$secg"; } if ($ming < 10) { $ming = "0$ming"; } if ($hourg < 10) { $hourg = "0$hourg"; } if ($mdayg < 10) { $mdayg = "0$mdayg"; } $month = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec')[$mong]; $youbi = ('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday')[$wdayg]; $ENV{'TZ'} = "Japan"; $date_gmt = "$youbi, $mdayg\-$month\-$yearg $hourg:$ming:$secg GMT"; # $cook="name\:$name\,email\:$email"; $cook="name\:$in{'chatname'}\,email\:"; print "Set-Cookie: Zoo_Chat=$cook; expires=$date_gmt\n"; } sub ng_check { $a_ng = '0'; foreach(@ng_ipa){if($ENV{'REMOTE_ADDR'} =~ /^$_/){$a_ng = '1';}} foreach(@ng_rmh){if($ENV{'REMOTE_HOST'} =~ /^$_/){$a_ng = '1';}} if($a_ng eq '1'){ print "Content-type: text/html\n"; print "Status: 401\n\n"; exit(0);} } #エラー表示 sub error { print<<"__EOF__"; $title2 $hp_bcolor
    ここに入る為の情報に誤りがあります。
    __EOF__ exit(0); } #エラー表示 sub pmerror { print<<"__EOF__"; $title2 $hp_bcolor
    お名前「$chatname」での入室は個人キーを正しく入力してください。
    __EOF__ exit(0); } #エラー表示 sub perror { print<<"__EOF__"; $title2 $hp_bcolor
    入室パスワードは省略できません。
    __EOF__ exit(0); } #エラー表示 sub perror2 { print<<"__EOF__"; $title2 $hp_bcolor
    入室パスワードが違います、確認してください。
    パスワード:$in{'rpass'}
    __EOF__ exit(0); } #エラー表示 sub actmemerr { print<<"__EOF__"; $title2 $hp_bcolor
    ここに発言する為の情報が不足しています。
    __EOF__ exit(0); }