#!/usr/bin/perl --
#
#	↑サーバーのperlまでのパス
#		動かなかったら #!/usr/local/bin/perlに変更してみたください

###############################################
#                                             #
#   CGI's  GifCounter                         #
#   E-Mail:syokunin@syokunin.no-ip.org        #
#   HomePage:http://syokunin.no-ip.org        #
#   (C)2003/7/9 職人                          #
#                                             #
###############################################

#####　説明　###############################################
#
#・解凍すると「cnt.cgi」と「gifcat.pl」と「cnt.dat」と「chk.dat」と「img」(フォルダ)---(中身)「0〜9.gif」が出てきます。
#・設定の部分をお好みにしてください。
#・パーミッションは
#　cnt.cgi　755
#　libフォルダ　755　中のgifcat.pl　644
#　cnt.dat、chk.dat　666
#　imgフォルダ　755　中の0〜9.gif　644
#・html（htm）ファイルの表示したい場所に以下の様なタグを記述
#「<img src="./cnt.cgi">」(""内はhtmlファイルから見たcnt.cgiのパス)
#
############################################################

#----------------設定------------------------------------------------------------------------------

#■カウントを記録するファイルまでのパス設定
$cnt_dat="./cnt.dat";
#■ＩＰアドレスと時間を記録するファイルまでのパス設定
$chk_dat="./chk.dat";
#■gif画像フォルダ(imgフォルダ)までのパス設定
$gif_fol="./img/";

#■重複カウント許可・不許可設定「1」「0」から選択
#
#重複カウント不許可の場合
#chk.datにIPアドレスと時間を記録。一定時間、同IPアドレスのカウントアップをしない
#「1」
#重複カウントを許す場合
#「0」
$check_cnt=1;
###$check_cnt=0;

#■以下は重複カウントを許さない場合関係してくる設定
#■重複カウント不許可の時間（秒数）
#ORG 1-Hour# $check_time=(60*60*1);
$check_time=(60*15*1);

#■記録するＩＰアドレスの数設定
#ORG# $log=50;
$log=1000;

#---------------設定終了----------------------------------------------------------------------------

#gifcat.pl呼び出し
require "./lib/gifcat.pl";

#現在の時間とアクセスしたホストのアドレス格納
$time=time;
$addr = $ENV{'REMOTE_ADDR'};

open (CHK,"+<$chk_dat");
flock(CHK,2);
@array=<CHK>;

#カウントフラグ
$flg=1;
if($check_cnt==1){
	#今回アクセスしたアドレスがLogの中にあり、かつ、一定時間経過してなければフラグを「0」（カウントしない）
	foreach $line (@array){
		($kako_time,$kako_addr)=split(/<>/,$line);
		chomp $kako_addr;
		if($kako_addr eq $addr && ($kako_time + $check_time) > $time){
			$flg=0;
			last;
		}
	}
}
foreach $line (@array){
	($kako_time,$kako_addr)=split(/<>/,$line);
	chomp $kako_addr;
	if($kako_addr ne $addr){
		$temp=join("<>",$kako_time,$kako_addr);
		push (@new_array,"$temp\n");
	}
}

#今回のアクセス時間とアドレスを纏める
$konkai=join("<>",($time,$addr));
push (@new_array,"$konkai\n");
while(@new_array > $log){
	shift @new_array;
}
truncate(CHK,0);
seek(CHK,0,0);
print CHK @new_array;
close CHK;


#カウント処理
open (CNT,"+<$cnt_dat");
flock(CNT,2);
$cnt=<CNT>;
if($flg == 1){
	#countup
	$cnt++;
	seek(CNT,0,0);
	print CNT "$cnt";
}
close CNT;

#５桁に修正
$cnt=sprintf("%05d",$cnt);

#表示するgifファイル名の配列作成
for($i=0;$i<length($cnt);$i++){
	$n=substr($cnt,$i,1);
	push(@gifs,"$gif_fol$n.gif");
}

#出力
print "Content-type:image/gif\n\n";
binmode(STDOUT);
print &gifcat'gifcat(@gifs);

exit;
