#!/usr/bin/perl #入室初回処理 # 99/06/05 update(v5.0) by 普通 #==================================================================== #ご協力を頂いた方 #oidon_<)'); #顔文字設定 ##################################################Option:002 by Add End if ($in{'cook'} eq 'yes') {&set_cookie();} print "Content-type: text/html\n\n"; if ($in{'roomno'} && $in{'chatname'}) { &profchk(); if ($frame eq 'yes') {&main2();} else {&main();}} else {&error("このスクリプトを動作させる為の情報が不足しています。");} exit; sub profchk { $chatname = $in{'chatname'}; #ハンドル名 $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();} $roomno = $in{'roomno'}; #Chat室No &roomset(); #部屋属性取得 #選択データセット $java = $in{'java'}; #java script利用可否 $frame = $in{'frame'}; #Frame利用可否 $cook = $in{'cook'}; #Cookies利用可否 $seq = $in{'seq'}; #ささやき受付可否 $color = $in{'color'}; #発言文字カラー ##################################################Option:001 by Add Start # $call = $in{'call'}; #語り掛け受け可否 ##################################################Option:001 by Add End #プロフィールチェック $pfreg = 'ng'; if ($func_prof) { &prof_check(); if ($prof_reg eq 'ok') { $chatname_disp = "$chatname"; } else {$chatname_disp = $chatname;} } else {$chatname_disp = $chatname;} #部屋表現セット ################フラッシュバージョンへ変更################ if ($ficon eq 'y') { # $roomdisp = ""; # $roomdisp2 = ""; $roomdisp = ""; $roomdisp2 = ""; ################################################### }else{ $roomdisp = $bhf_roomname; $roomdisp2 = $bhf_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"; } } #参加人数確認 &ReadMember ($roomno); $memcnt = 0; foreach (@mf_list) { ($tmf_roomno,$tmf_roomname,$tmf_chatname,$tmf_inenv,$tmf_inproc,$tmf_yobi) = split(/||\n/); ($tmf_ipaddr,$tmf_intime,$tmf_latime,$tmf_agent,$tmf_profno,$tmf_yobi21) = split(/,/,$tmf_inproc); if (!($tmf_ipaddr eq 'ROM')) {$memcnt++;} } &roomin_check(); #入室チェック &rom_proc(); #参加者登録、登参加者・ROM精査 &roomh_update(); #部屋属性ファイル更新、参加記録 @orgmf_list = @mf_list; if ($guid_msg eq '1') {&an_inmsg();} #入室広報 } sub main { print "$title2\n"; print<<"__EOF__"; $bhf_pgbody
    発言 __EOF__ #ささやき相手メンバー表示 &seqmember (); print<<"__EOF__"; 文字サイズ __EOF__ ##################################################Option:002 by Add Start # print<<"__EOF__"; #顔文字 #__EOF__ ##################################################Option:002 by Add End print<<"__EOF__";
    自発言消し:
    __EOF__ if ($in{'java'} eq 'yes') { print<<"__EOF__"; __EOF__ } ######退室する######################################################## print<<"__EOF__";

    __EOF__ &roominmsg (); #入室メッセージ表示 &prcom2(); #発言内容の表示 print<<"__EOF__";



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

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

    __EOF__ exit(0); } #フレームモード表示判定 sub main2 { &main2_1st(); #フレーム初期表示 } #フレーム初期表示(フレーム対応) sub main2_1st { &roominmsg (); #入室メッセージ表示 $w_color = $color; $w_chatname = $chatname; $e_color = &encode($w_color); $e_chatname = &encode($w_chatname); print "$title2\n"; print<<"__EOF__"; $bhf_pgbody <TABLE><TR> <TD VALIGN=bottom><FORM METHOD="POST" ACTION="${sbase}chat_end.cgi"> <INPUT TYPE=hidden NAME="roomno" VALUE="$roomno"> <INPUT TYPE=hidden NAME="chatname" VALUE="$chatname"> <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 roomset { &ReadHeader ($roomno); ($bhf_roomname,$bhf_intime,$bhf_outtime,$bhf_memcnt,$bhf_page,$bhf_ccolor,$bhf_roomenv,$bhf_roompass,$bhf_bkurl,$bhf_yobi1,$bhf_yobi2,$bhf_yobi3) = split(/||\n/,$hf_list); $bhf_page =~ s/body/BODY/gi; @page_set = split(/,/,$bhf_page); if ($bhf_page =~ /.+BODY.+BODY.+/) { if ($bgmode eq '1') { $bhf_pgbody = $page_set[0]; $bhf_pgbody2 = $page_set[1]; } else { $bhf_pgbody = $page_set[1]; $bhf_pgbody2 = $page_set[0]; } $bhf_line = $page_set[2]; } else { $bhf_pgbody = $page_set[0]; $bhf_pgbody2 = $page_set[0]; $bhf_line = $page_set[1]; } ($bhf_roomenvi1,$bhf_roomenvi2,$bhf_roomenvo,$bhf_roomenvd,$bhf_imaxcnt) = split(/,/,$bhf_roomenv); #&error("入室パスワードは省略できません。($hf_list)"); } #入室チェック sub roomin_check { if ($bhf_roompass) {&room_pass();} #入室パスワードチェック if (($bhf_roomenvi2) && !($profno)) { #プロフィール登録者のみ入室 &error("この部屋はプロフィール登録されてる方のみ入室が可能\です。");} if (($bhf_roomenvi1) && !($in{'rpass'})) { #新プライベートモード &error("入室パスワードは省略できません。(1)");} if ($bhf_imaxcnt eq $memcnt) { #入室者数制限有り &error("現在、この部屋は満室です。他部屋のご利用又はしばらくお待ち下さい。");} } #入室パスワードチェック sub room_pass { if ($in{'rpass'}) { &crpt_check1() if $FLK; $roompass = $in{'rpass'} if !($FLK); if ($bhf_roompass eq $roompass) {;} else {&error("入室パスワードが違います、確認してください。
    パスワード:$in{'rpass'}");} } else {&error("入室パスワードは省略できません。(2)");} } #暗号パスワードチェック(部屋入室) sub crpt_check1 { if ($bhf_roompass =~ /^\$1\$/) { $crptkey = 3; } # FreeBSDサーバ対応 else { $crptkey = 0; } $wk_pass = $bhf_roompass; $roompass = crypt($in{'rpass'}, substr($wk_pass, $crptkey, 2)); } #プロフィールチェック 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) { &crpt_check2() if $FLK; $profpass = $in{'ppass'} if !($FLK); if ($pf_pass eq $profpass) { $profno = $pf_regno; $prof_reg = 'ok'; return; } else { if ($prof_env eq '1') { &error("お名前「$chatname」はプロフィール登録されています、入室するには個人キーを正しく入力してください。");} else {return;} } } else { if ($prof_env eq '1') { &error("お名前「$chatname」はプロフィール登録されています、入室するには個人キーを正しく入力してください。");} else {return;} } } } } #暗号パスワードチェック(プロフィール) sub crpt_check2 { if ($pf_pass =~ /^\$1\$/) { $crptkey = 3; } # FreeBSDサーバ対応 else { $crptkey = 0; } $pwk_pass = $pf_pass; $profpass = crypt($in{'ppass'}, substr($pwk_pass, $crptkey, 2)); } #ささやき受けメンバー表示 sub seqmember { print "
    ささやき!→\n"; } #入室メッセージ表示 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'},$user_agent\n"; close (logf); flock (logf,8) if $FLK; } } #部屋属性ファイル更新 sub roomh_update { &LockReadHeader ($roomno); ($thf_roomname,$thf_intime,$thf_outtime,$thf_memcnt,$thf_page,$thf_ccolor,$thf_roomenv,$thf_roompass,$thf_bkurl,$thf_yobi1,$thf_yobi2,$thf_yobi3) = split(/||\n/,$hf_list); ($thf_roomenvi1,$thf_roomenvi2,$thf_roomenvo,$thf_roomenvd,$thf_imaxcnt) = split(/,/,$thf_roomenv); if (($thf_roomenvi1 eq '2') && !($thf_roompass)) { $wk_pass = $in{'rpass'}; $new_roompass = crypt($in{'rpass'}, substr($wk_pass, 0, 2)) if $FLK; $new_roompass = $in{'rpass'} if !($FLK); } else {$new_roompass = $thf_roompass;} $hf_list = "$thf_roomname|$times|$thf_outtime|$memcnt|$thf_page|$thf_ccolor|$thf_roomenvi1,$thf_roomenvi2,$thf_roomenvo,$thf_roomenvd,$thf_imaxcnt|$new_roompass|$thf_bkurl|$thf_yobi1|$thf_yobi2|$thf_yobi3\n"; &UnlockWriteHeader ($roomno); #入室履歴登録 if (($bhf_roomenvd eq '2') || !($func_lglst)) {;} else { $logtext = "
  • $roomdisp2「$chatname_disp」さんが入室!\[$date\]
    \n"; &WriteLog ($logtext); } } #投稿内容の表示 sub prcom2 { print "在室者:\n"; foreach (@memb_list) {print "$_ \n";} print "

    \n"; if ($rom_disp) {&rom_disp();} if (($in{'start'} || $in{'fstart'}) && $profno && -e "${dfbase}dmsg$profno.txt") {&dmsg_disp();} $lcnt = 0; &ReadComment ($roomno); $myid = "$chatname:$ipaddr"; foreach (@cf_list) { if (s///g) { next if ($1 ne $myid && $2 ne $myid); $_ = "$_"; } s///g; s///g; print $bhf_line, $_; last if (++$lcnt > $dmax); } } #参加者登録、参加者・ROM精査 sub rom_proc { $memcnt = 0; &LockReadMember($roomno); foreach (@mf_list) { ($tmf_roomno,$tmf_roomname,$tmf_chatname,$tmf_inenv,$tmf_inproc,$tmf_yobi) = split(/||\n/); ($tmf_ipaddr,$tmf_intime,$tmf_latime,$tmf_agent,$tmf_profno,$tmf_yobi21) = split(/,/,$tmf_inproc); if ($tmf_ipaddr eq 'ROM') { $timewk = time - $tmf_intime; if ($timewk > $rom_time) {$_ = '';} elsif ($tmf_chatname eq $rom_name) {$_ = '';} else {push (@rom_list,$tmf_chatname);} } else { $timewk = time - $tmf_latime; if ($timewk > $aout_time) {$_ = '';} # elsif ($tmf_ipaddr eq $ipaddr) {$_ = '';} elsif ($tmf_chatname eq $chatname) {$_ = '';} else { ($tmf_ccolor,$tmf_seq,$tmf_java,$tmf_yobi11,$tmf_yobi12) = split(/,/,$tmf_inenv); if ($tmf_profno) {push(@memb_list,"$tmf_chatname");} else {push(@memb_list,"$tmf_chatname");} $memcnt++; } } } ##################################################Option:001 by Add Start # unshift(@mf_list,"$roomno|$bhf_roomname|$chatname|$in{'color'},$in{'seq'},$in{'java'},$in{'end'},|$ipaddr,$times,$times,$user_agent,$profno,|$call,|\n"); #改めて登録 ##################################################Option:001 by Add End ################################################## NOT Option:001 by Add Start unshift(@mf_list,"$roomno|$bhf_roomname|$chatname|$in{'color'},$in{'seq'},$in{'java'},$in{'end'},|$ipaddr,$times,$times,$user_agent,$profno,||\n"); #改めて登録 ################################################## NOT Option:001 by Add End &UnlockWriteMember($roomno); if ($profno) {push(@memb_list,"$chatname");} else {push(@memb_list,"$chatname");} $memcnt++; } #ROM表示 sub rom_disp { $rom_dsw = '0'; $rom_count = @rom_list; if (($rom_count eq 0) || ($bhf_roomenvd)) {return;} if ($rom_nmmd eq '1') { print "ご案内>ROM中!さんが$rom_count人、いらっしゃいます〜。
    \n"; } else { foreach (@rom_list) { if ($rom_dsw eq '0') { print "ご案内>現在のROMさんは『$_』"; $rom_dsw = '1'; } else {print "『$_』";} } print "です。
    \n"; } } #伝言表示 sub dmsg_disp { &ReadDenMessage ($profno); $denmsg_cnt = @dmf_list; print "ご案内>伝言を$denmsg_cnt件預かっていました。
    \n"; print @dmf_list; print "
    \n"; } #他部屋への入室メッセージ投稿 sub an_inmsg { if ($bhf_roomenvd eq '2') {return;} foreach $froomno (@room_list) { next if ($froomno eq $roomno || -z "${fbase}roommember$froomno.txt"); undef @mf_list; $an_msgsw = '0'; &ReadMember ($froomno); foreach (@mf_list) { ($tmf_roomno,$tmf_roomname,$tmf_chatname,$tmf_inenv,$tmf_inproc,$tmf_yobi) = split(/||\n/); ($tmf_ipaddr,$tmf_intime,$tmf_latime,$tmf_agent,$tmf_profno,$tmf_yobi21) = split(/,/,$tmf_inproc); if (!($tmf_ipaddr eq 'ROM')) { $an_msgsw = '1'; last; } } if ($an_msgsw eq '1') { $ta_com = "ご案内>「$chatname_disp」さんが$roomdisp2に入室\[$date$rhost\]
    \n"; &WriteComment ($froomno,$ta_com); } } } #エンコード処理 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'},seq\:$in{'seq'},java\:$in{'java'},frame\:$in{'frame'},color\:$in{'color'}"; 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: 404\n\n"; exit(0);} } #エラー表示 sub error { print "$title2\n"; print<<"__EOF__"; $hp_bcolor
    $_[0]
    __EOF__ exit(0); }