#! /usr/local/bin/perl
#
#ゆいちゃっとMagic1.0(pref.cgi)
#
#pref.cgiは、chat.cgiとenter.cgiで、共通して使われるサブルーチン集です。
sub init{ #初期設定など
$sanka_file = './mgcsanka.dat'; #参加記録ファイル(ファイル名は絶対に変更しておくこと。)
$chat_file = './mgc.dat'; #チャットログ(ファイル名は絶対に変更しておくこと。)
$method = 'GET';#やっぱり、GETよねぇ〜
#退室後のページは、他のHPにも変えられます。
$endpage= 'http://www.big.or.jp/~vampire/Magic/';
$title = 'ゆいちゃっとMagic';
$body='
';
$max = 80;#ログの最大行数
#$host = &gethost;if($host=~/bmc/){$host="ppp777.yuichat.co.jp";}
$host=$ENV{'REMOTE_HOST'} || $ENV{'REMOTE_ADDR'};
$metacode = '';#SJIS認識させる
####アクセス制限を使用するなら、#を消す。
#$kill_file = './kill.dat';#アクセス制限用
#open(DB,"$kill_file") || die "Cannot Open Log File $kill_file: $!";
# @lines2 = ; close(DB);
#foreach $line (@lines2) {
# next if(length($line)<4); chop $line;
# if( $host=~/$line/ ){ print "Status: 204\n\n"; exit; }
#}
####アクセス制限ここまで
#ロックファイルを使用するなら、#を消す。
#$lockfile = './lock/lock-file.lock';
#$retry = 5;
#while (!symlink(".", $lockfile)) {
#if (--$retry <= 0) { print "Status: 204\n\n"; unlink($lockfile); exit; }
#sleep(1);
#}
#ロックファイルここまで
}#init END
sub ended{ #unlinkとexitを行うためだけのもの。
# unlink($lockfile);#ロックファイルを使用するなら、#を消す。
print "Content-type: text/plain\n\n $_[0] \n"if($_[0]);#この行は削除可です。
exit;
}#ended END
sub decode{ #一般的なデコード&変数への代入
$buffer = $ENV{'QUERY_STRING'};
@pairs = split(/&/,$buffer);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
&jcode'convert(*value,'sjis');
$value =~ s/\t/ /g;$value =~ s/\t/g;$value =~ s/\n//g;
$FORM{$name} = $value;
}
$name = $FORM{'name'}; $name =~ s/ //g; $name =~ s/ //g;
$name =~ s/\t/</g; $name = $host if (!$name);
$color = $FORM{'color'}; $color='red' if(!$color);
$mode = $FORM{'mode'}; $reload = $FORM{'reload'};
$email = $FORM{'email'}; $window =$FORM{'window'};$pass =$FORM{'pss'};
#パスワードに、testという単語が含まれないとダメにするばあい。
#unless($pass=~/test/i){
#print "Content-type: text/html\n\n";
#print "$title$body\n";
#print "パスワード$passは、無効です。
\n";
#print "戻る\n";
#exit;
#}
#特定のパスワードだけで利用したい場合は、上の#マーク7個を消しましょう。
}#decode END
sub jikan{#$dateに時刻を代入します。
$times = time;#18時間時差があるなら、$times = time+18*60*60とする。
($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime($times);
$min = "0$min" if ($min < 10); $month++;
$youbi = ('日','月','火','水','木','金','土') [$wday];
$date = "$month/$mday($youbi)$hour:$min";
}#jikan END
sub sanka{#ここで、アクセス記録をとる。
open(LOG,"$sanka_file") || &ended('$sanka_file open error');
seek(LOG,0,0); @sanka=;
close(LOG);
$flag=1;
foreach $line (@sanka) {
($timerec, $handle, $host2,$id) = split(/\t/, $line);
if( $times-60 > $timerec){$line = ''; next;}
if(($handle eq $name) && ($host2 eq $host) && $flag && ($pass eq $id)){#ホスト名が同一の場合、時間と名前を最新のものにする。
$line = "$times\t$name\t$host\t$pass\t\n";
$flag =0;$handle = $name; $handle =~ s/☆/★/g;
}
push (@sanka3, "$handle☆") if($pass eq $id);
}#foreach
if($flag){ #新しい参加者は、加える
$name =~ s/☆/★/g;
push(@sanka,"$times\t$name\t$host\t$pass\t\n");
push (@sanka3, "$name☆");
}
undef(@sanka) if($chat eq 'sanka');
open(LOG,">$sanka_file") || &ended('$sanka_file write error');
eval 'flock(LOG,2);';
seek(LOG,0,0); print LOG @sanka;
eval 'flock(LOG,8);';
close(LOG);
}#sanka END
sub readlog{ #配列@linesにログを読み込む
open(DB,"$chat_file") || &ended('$chat_file open error');
seek(DB,0,0); @lines = ; close(DB);
}#readlog END
sub writelog{ #$valueを@linesに加えたのち、書き込む
(@lines < $max-1) || (@lines = @lines[0 .. $max - 2]);
unshift( @lines,$value);
open(DB,">$chat_file") || &ended('$chat_file write error');
eval 'flock(DB,2);';
seek(DB,0,0); print DB @lines;
eval 'flock(DB,8);';
close(DB);
}#writelog END
sub hide{ #HTML生成時に共有される部分を一つにまとめる。
$hidden =<<"_HIDE_";
_HIDE_
$logw =<<"_HIDE_";
_HIDE_
$kao =<<'_HIDE_';
今のきもち:
_HIDE_
#顔文字は、最初の6個は残してね。
}#hide END
sub gethost{
$host=$ENV{'REMOTE_HOST'};
$host=$ENV{'HTTP_VIA'} if( $ENV{'HTTP_VIA'}=~s/.*\s(\d+)\.(\d+)\.(\d+)\.(\d+)/$1.$2.$3.$4/ );
$host=$ENV{'HTTP_X_FORWARDED_FOR'} if(
$ENV{'HTTP_X_FORWARDED_FOR'}=~s/^(\d+)\.(\d+)\.(\d+)\.(\d+)(\D*).*/$1.$2.$3.$4/ );
$host=$ENV{'HTTP_FORWARDED'} if(
$ENV{'HTTP_FORWARDED'}=~s/.*\s(\d+)\.(\d+)\.(\d+)\.(\d+)/$1.$2.$3.$4/ );
return $host;
}#gethost END
1; # RETURN TRUE
__END__