##############################################################################
# 本程式係參考自 many.pl 這支程式的運作原理，或許當初引進 many.pl 這支程式時，
# 原作者未製作表頭資料或是資料被人刪除掉，因而該程式作者之相關資訊已不可考，若
# 有知悉者煩請告知。
#
# 本程式由傅鴻銘所製作，本程式之使用者可視個人需要與使用環境之不同而酌予修改，
# 但本段表頭資料及程式註解請予以保留，以示對作者的尊重及供他人參考之用。
#
# 作者資訊：
#   作者姓名：傅鴻銘
#   聯絡信箱：redsnow@pmail.net
#   個人網頁：http://www.tacocity.com.tw/redsnow/index.htm 紅雪網頁
#
# 程式名稱：線上訪客人數程式 - HowMany.pl 1.02 版
# 使用方式：請參閱 HowManyDoc.htm 檔案或到紅雪網頁參考
# 最初製作日期：11/29/1998
# 最後修改日期：12/13/1998 (增加 turn_mode 參數及隨機亂數顯示訊息之動作)
##############################################################################
# 程式下載:免費皇帝 ################
# Url:     http://hey.to/freeking  #
# E-mail:  fking@tomail.com.tw #####
################################
$|=1;

my($rec_file);
my($linksurl);
my($max_sec);
my($interval_sec);
my($remote_addr);
my($now);
my($sec);
my($min);
my($hour);
my($guests);
my(@LINES);
my($check);
my($line);
my($line2);
my($cmd);
my($list);
my($parm) = "";

$rec_file = "vfhae_ym_o_lvok/HowMany.txt";

$linksurl = "http://$ENV{'SERVER_NAME'}$ENV{'SCRIPT_NAME'}";
$max_sec = 360;			# 比對他人資料是否仍屬有效之秒數
$interval_sec = 300;	# 自己更新與檢查週期的秒數 (<=300)，不要設得太小，以免加重系統負荷
$remote_addr = "$ENV{'REMOTE_ADDR'}";
$now = time();
($sec,$min,$hour) = localtime($now);

read(STDIN, $cmd, $ENV{'CONTENT_LENGTH'});
if ($cmd eq "") { $cmd = $ENV{'QUERY_STRING'}; }
if ($cmd eq "") { $cmd = $ARGV[0]; }
if ($cmd eq "") { $cmd = "link_mode"; }
else { ($cmd, $parm) = split(/=/, $cmd); }

$cmd = lc($cmd);

$linksurl ="$linksurl\?$cmd";

if ($cmd eq "turn_mode"){
   if ($parm ne "2") {
      $cmd = "link_mode";
      $linksurl ="$linksurl\=2";
   } else {
      $cmd = "list_mode";
      $linksurl ="$linksurl\=1";
   }
} elsif ($cmd ne "" && $cmd ne "link_mode" && $cmd ne "list_mode"){
   die "參數錯誤！";
}

###### 檢查並記錄瀏覽者資訊 ######
open (FILE,"$rec_file") || die "無法開啟 $rec_file 這個檔案！\n系統傳回訊息為：$!\n";
@LINES = <FILE>;
close(FILE);

open (FILE,">$rec_file");
flock (FILE, 2);

$guests = 1;
$check = 0;
foreach $line (@LINES) {
   $line2 = $line;
   $line2 =~ s/\n//g;
   if ( length($line2) > 0 ) {
      ($check_addr,$perv_rec_sec,$visit_time) = split(/,/,$line);
      $check_sec = $now-$perv_rec_sec;	# 比對秒數為現在時間減去前次所紀錄的時間

      if ( $check_addr eq $remote_addr ) {
         if ($cmd ne "remove"){
            # 若為現在瀏覽者已記錄的資料，則將比對時間更新掉，以免下次別人比對時被剔除
            print FILE "$remote_addr,$now,$visit_time\n";
	        if ($cmd eq "list_mode"){
	           $list = "<OPTION>$remote_addr ← You$list";
            }
         }
         $check = 1;
      } elsif ($check_sec < $max_sec && $check_sec > 0) {
         # 若比對他人資料前一次寫入秒數在 360 秒之內，表示該行仍屬有效資料，將該行
         # 重新寫入一次以備他人比對之用，若比對秒數超過 360 秒，表示該行已屬無效資
         # 料，將予以略過不再寫入
         print FILE "$line";
         if ($cmd eq "list_mode"){
	        $list = "$list<OPTION>$check_addr";
         }
         $guests++;
      }
   }
}

if ($check == 0) {	# 若瀏覽者資料不在現有資料內，則表示為新加入的資料
   print FILE "$remote_addr,$now,$hour:$min:$sec\n";
   if ($cmd eq "list_mode"){
      $list = "<OPTION>$remote_addr ← You$list";
   }
}
flock (FILE, 8);
close (FILE);

###### 輸出結果至瀏覽器 ######
if ($cmd ne "remove"){

   srand;
   my($number) = rand(9);
   $number = substr($number,0,1);
   my($msg) = ('漫遊','充電','瀏覽','散步','觀摩','參考','閒逛','欣賞','學習')[$number];
   $msg = "人同時在此$msg";

   print "Content-type: text/html\n\n";
   print "<HTML><TITLE>RS 線上人數</TITLE><HEAD>\n";
   print "<META HTTP-EQUIV=REFRESH CONTENT=\"$interval_sec;URL=$linksurl\">\n";

   print "<STYLE TYPE=\"text/css\">\n<!--\nBODY {font-size: 9pt;line-height:9pt;margin: 0em 0em 0em 0em;}\n//-->\n</STYLE>\n";
   print "</HEAD><BODY TEXT=\"0000FF\" BGCOLOR=\"#D0E0FF\">\n";

   print "<CENTER>";
   if ($cmd eq "list_mode"){
      print "<FORM><SELECT ONCHANGE=\"if(this.options[selectedIndex].value !='') window.location.href=this.options[selectedIndex].value; this.selectedIndex=0;this.blur()\">\n";
      print "<OPTION>$guests$msg\n";
      print "$list\n<OPTION VALUE=\"$linksurl\">查看最新的狀況\n";
      print "</SELECT></FORM>\n";
   }else{
      print "<a href=\"$linksurl\" onMouseOver=\"window.status='查看最新的線上人數'; return true\" onMouseOut=\"self.status='';return true\"><FONT COLOR=\"FF0000\">$guests</FONT>$msg</a>";
   }
   print "</CENTER></BODY></HTML>";
}

exit(0);
