#!/usr/local/bin/perl

#===================================================================================================
# らくらく日計カウンタv1.0 (2002/11/23)
#
# Copyright(C) 2002 Mura's…
# http://www1.harenet.ne.jp/~a-mura/
#  
# 本プログラムはフリーソフトとして配布していますが
# 著作権は放棄していません。
#
# このソフトを使用することによるいかなる損害も作者は
# 一切責任を負いません。
#
# -----------------------------------------------------------------------
#
#　☆カウンタ設置の方法
#
#  　カウンタ表示用CGIプログラム   [ oneday.cgi ]
#  　設定ページ表示用CGIプログラム [ dayset.cgi ]
#
#    タグ設定方法
#
#     １.累計カウンタ(設定画面へのリンクを設定しています)
# 　    <a href="oneday/dayset.cgi" target="_blank">
# 　    <img src="oneday/oneday.cgi?id=***&mode=total" border="0"></a>
#
#     ２．本日のカウンタ
#       <img src="oneday/oneday.cgi?id=***&mode=today">
#
#     ３．昨日のカウンタ
#       <img src="oneday/oneday.cgi?id=***&mode=yday">
#
#     oneday.cgiへのファイルパスを指定し、オプションを設定します。
#     idとmodeしていの間は半角の&で区切ってください。
#     (id=***&mode=total)
#
#     ***の部分に半角英数８文字までのIDを必ず指定してください。
#     １つのIDで「トータル・本日・昨日」の３個のカウンタが１セットになります。
#     mode= の部分でカウンタの種類を指定します。
#     mode=total　トータルカウント
#     mode=today　本日のカウント
#     mode=yday　 昨日のカウント
#
#
# 　１．上記のカウンタ表示用タグコードを表示したいページ場所に書き込みます。
#
#   ２．このファイルoneday.cgiとdayset.cgiの１行目のPerlへのパスを確認し、必要であれば修正します。
#
#   ３．ファイルをサーバーに転送します。
#
#   ４．パーミッションの設定をします。
#
#   ☆パーミッション設定
#   　public_html / index.html(ホームページディレクトリ)
#
#　               / oneday(755) - oneday.cgi(755)
#  　                           - dayset.cgi(755)
#    　                         - param.cgi(644)
#      　                       - gifcat.pl(644)
#                          
#          　                   / dat(755) - index.html
#
#　                             / gif / image1 - 0.gif, 1.gif, … 
#  　                                 / image2 - 0.gif, 1.gif, …
#    　                               / image3 - 0.gif, 1.gif, …
#      　                             /   :  4 -      :
#        　                           /   :  5 -      :
#
#
#　 上記のように設定してページ上でトータルカウンタをクリックすると設定画面が開きます。
#   IDとパスワードを入力して「送信」ボタンを押すとカウンタのIDごとに各種設定ができます。
#
#  ☆設定画面で選択できる画像を追加するには
#    gif フォルダ以下に番号数を増やしたimageフォルダを追加する
#
#    ※例えばimage23フォルダまですでに存在する時、image24フォルダ
#      を作成してそこに画像を格納
#
#===================================================================================================

#-- ライブラリ＆設定ファイル読み込み
require './gifcat.pl';
require './param.cgi';

#-- パラメータ読み込み＆デコード
&paraDecode;

#-- 例外
if($IN{'id'} eq '' || $IN{'mode'} eq ''){exit;}

#-- ファイルロック
if($IN{'mode'} eq 'total' || $IN{'mode'} eq 'today'){
    &lock;
}

#-- 設定ファイル読み込み
if(&readSetup($IN{'id'}) eq 'NG'){
    if($IN{'mode'} eq 'total' || $IN{'mode'} eq 'today'){&unlock;}
    exit;
}

#-- 過去ファイル削除
for($i=0; $i<$delete; $i++){
    my($expath) = getPath('true', $i+2, $IN{'id'});
    unlink($expath);
    
    $expath = getPath('false', $i+2, $IN{'id'});
    unlink($expath);
}

#-- IPチェック&カウント取得表示
if($IN{'mode'} eq 'total'){

    if($termflg != 0){ # IPチェックON
        if(&ipCheck(getPath('true', 0, $IN{'id'})) eq 'true'){
            $nowcount = &countUp("$basepath$IN{'id'}cnt\.cgi", 'true');
            &countUp(getPath('false', 0, $IN{'id'}), 'true');
        }else{
            $nowcount = &countUp("$basepath$IN{'id'}cnt\.cgi", 'false');
        }
    }else{             # IPチェックOFF
        $nowcount = &countUp("$basepath$IN{'id'}cnt\.cgi", 'true');
    }

    if($nowcount eq ''){&unlock; exit;}
    #-- カウント整形
    $digit = sprintf("%0${totalfigure}d", $nowcount);
    #-- ロック解除
    &unlock;
    #-- 出力
    &showImage($digit, $totalfigure, $totalimg);

}elsif($IN{'mode'} eq 'today'){

    if($termflg != 0){ # IPチェックON
        if(&ipCheck(getPath('true', 0, $IN{'id'})) eq 'true'){
            $nowcount = &countUp(getPath('false', 0, $IN{'id'}), 'true');
            &countUp("$basepath$IN{'id'}cnt\.cgi", 'true');
        }else{
            $nowcount = &countUp(getPath('false', 0, $IN{'id'}), 'false');
        }
    }else{             # IPチェックOFF
        $nowcount = &countUp(getPath('false', 0, $IN{'id'}), 'true');
    }

    if($nowcount eq ''){&unlock; exit;}
    #-- カウント整形
    $digit = sprintf("%0${todayfigure}d", $nowcount);
    #-- ロック解除
    &unlock;
    #-- 出力
    &showImage($digit, $todayfigure, $todayimg);

}else{
    $nowcount = &countUp(getPath('false', 1, $IN{'id'}), 'false');
    if($nowcount eq ''){exit;}
    #-- カウント整形
    $digit = sprintf("%0${ydayfigure}d", $nowcount);
    #-- 出力
    &showImage($digit, $ydayfigure, $ydayimg);
}


#======================#
#  パラメータ読み込み
#======================#
sub paraDecode {
    my($pair,$name,$value);
    foreach $pair(split(/&/, $ENV{'QUERY_STRING'})){
        ($name, $value) = split(/=/, $pair);
        #-- 文字のデコード
        $value =~ tr/+/ /;
        $value =~ s/%([0-9a-fA-F][0-9a-fA-F])/chr(hex($1))/eg;
        $IN{$name} = $value;
    }
}

#===================#
#      GIF出力
#===================#
sub showImage {
    my(@num) = ();
    my($chip);
    
    for(my($i)=0; $i<$_[1]; $i++){
        $chip = substr($_[0], $i, 1);
        push(@num, "$_[2]$chip\.gif");
    }

    print "Content-type: image/gif\n\n";
    binmode(STDOUT);
    print &gifcat'gifcat(@num);
    exit;
}

#===========================#
#  IPアドレスチェック&更新
#===========================#
sub ipCheck {
    my($time) = time;

    if((-e $_[0])){
        open(FILE, "+< $_[0]") or return 'false';
        my(@data) = <FILE>;
        my($res) = 'true';
        my($exflg) = 0;
        my(@para);
        seek(FILE, 0, 0);
        truncate(FILE, 0);

        foreach(@data){
            $_ =~ s/\r//;
            $_ =~ s/\n//;
            @para = split(/\,/, $_);
            $para[1] =~ s/\D//g;
            if($ENV{'REMOTE_ADDR'} eq $para[0]){
                $exflg = 1;
                if(($termtime*60) < ($time-$para[1])){
                    print FILE "$para[0],$time\n";
                }else{
                    $para[1] += 7;
                    print FILE "$para[0],$para[1]\n";
                    $res = 'false';
                }
                next;
            }
            if(($termtime*60) < ($time-$para[1])){next;}
            print FILE "$_\n";
        }

        if($exflg == 0){print FILE "$ENV{'REMOTE_ADDR'},$time\n";}
        close(FILE);
        return $res;

    }else{
        open(FILE, "> $_[0]") or return 'false';
        print FILE "$ENV{'REMOTE_ADDR'},$time\n";
        close(FILE);
        chmod(0666, $_[0]);
        return 'true';
    }
}
