<?php
// ##############################################
// Written by Andreas Schädler 2004 v.1.0      #
// www.syriel.de                               #
// Dieser Script darf frei verwendet und       #
// verändert werden, solange dieser Hinweis    #
// erhalten bleibt.                            #
// #
// Bei Benutzung wäre eine kurze mail mit der  #
// URL nett. Natürlich werdet ihr dann verlinkt#
// admin@syriel.de                             #
// #
// Achtung: Ich gebe keine Installationshilfe! #
// zu 50% für TWG verändert :)                 #
// alle fontsachen raus, da diese alle vom     #
// stylesheet der aufrufeseite kommen          #
// ##############################################

/*************************
Copyright (c) 2004-2024 TinyWebGallery
  written by Michael Dempfle
 
  This program is free software; you can redistribute it and/or modify 
  it under the terms of the TinyWebGallery license (based on the GNU  
  General Public License as published by the Free Software Foundation;  
  either version 2 of the License, or (at your option) any later version. 
  See license.txt for details.
 
  TWG version: 2.7
 
$Date: 2009-06-17 22:57:10 +0200 (Mi, 17 Jun 2009) $
$Revision: 73 $
 **********************************************/

defined('_VALID_TWG') or die('Direct Access to this location is not allowed.');
$startmenge = "0"; //Ab welcher besucherzahl soll der counter zählen?
if (!isset($min)) {
    $min = 5; //Wie viele min. gilt ein besucher als ein Zugriff?
}

$fileuseronline = "/useronline.txt";
$fileip_data = "/ip_data.txt";
$fileuserlog = "/user_log.txt"; // this name is used in the image.php as well - change both to the same value if you change it here :) !!
$fileusertoday = "/user_today.txt";
$filecounter = "/counter.txt";
$filecounterb = "/counter_backup.txt";

$heutestyle = $lang_today; //Anzeige von Besucher Heute
if ($show_today_counter) {
    $gesamtstyle = $lang_visitor . "  " . $lang_total; //Anzeige von Besucher Gesamt
} else {
    $gesamtstyle = $lang_visitor . "&nbsp;";
}
$datei = $counterdir . $fileuseronline;

$time = time() - $min * 60;
$current_ip = $_SERVER['REMOTE_ADDR'];

$lines = array();

if (file_exists($datei)) {
    $fd = fopen ($datei, "r"); 
      flock($fd, LOCK_SH );
      while (!feof ($fd)) {
         $buffer = fgets($fd, 4096); 
         $lines[] = $buffer; 
      } 
      flock($fd, LOCK_UN );
      fclose ($fd); 
    
    $lines = file($datei);
    foreach ($lines as $key => $data) {
        if (strpos($data, "µ") !== false) {
            list($ip, $timest) = explode("µ", $data);
            if (trim($timest) < $time || trim($ip) == $current_ip) {
                unset($lines[$key]);
            }
        }
    }
} else {
  touch ($datei); 
}
$lines[] = $current_ip . "µ" . time() . "\n";
$save = implode("", $lines);
$handle = fopen($datei, "r+");
flock($handle, LOCK_EX );
fputs($handle, $save);
ftruncate($handle,ftell($handle));
flock($handle, LOCK_UN); //release
fclose($handle);
$user = count($lines);

$file = $counterdir . $fileip_data;
if (!file_exists($file)) {
    $handle = fopen($file, "w+");
    fclose($handle);
}

$duration = $min * 60;

$lines = array();
$fd = fopen ($file, "r");
flock($fd, LOCK_SH );
while (!feof ($fd)) { 
   $buffer = fgets($fd, 4096); 
   $lines[] = $buffer; 
} 
flock($fd, LOCK_UN );
fclose ($fd); 

$ips = null;
foreach ($lines as $line) {
    if (!empty($line)) {
      @list($ip, $time) = @explode("µ", $line);
      if (isset($ip) && isset($time)) {
          if ($time > time() - $duration) {
              $ips[$ip] = trim($time);
          }
      }
    }
}
$ip = $_SERVER['REMOTE_ADDR'];
if (@array_key_exists($ip, (array)$ips)) {
    if ($ips[$ip] > time() - $duration) {
        // TRUE
        $ips[$ip] = time();
        $was_here = true;
    }
} else {
    $ips[$ip] = time();
    $was_here = false;
}
if ($fp = @fopen($file, "r+")) {
    flock($fp, LOCK_EX );
    foreach ($ips as $ip => $time) {
        @fputs($fp, $ip . "µ" . $time . "\n");
    }
    ftruncate($fp,ftell($fp));
    flock($fp, LOCK_UN); //release
    @fclose($fp);
}

$tag = date("d");
$monat = date("m");
$jahr = date("Y");
$date = getdate();
$zeit = time();

$file_today = $counterdir . $fileusertoday;
$neuer_tag_setzen = "n";
$count = "1";
$datei = array();
if (!file_exists($file_today)) {
    $handle = fopen($file_today, "w+");
    $generatecounter = true;
    fclose($handle);
} else {
    $fd = fopen ($file_today, "r"); 
    flock($fd, LOCK_SH );
    while (!feof ($fd)) {
       $buffer = fgets($fd, 4096); 
       $datei[] = $buffer; 
    } 
    flock($fd, LOCK_UN );
    fclose ($fd); 

    // $datei = file($file_today);
    $index1 = "0";
    while ($index1 < count($datei)) {
        $dat = explode("&", $datei[$index1]);
        if ($dat[0] < $tag or $dat[1] != $monat or $dat[2] != $jahr) {
            $neuer_tag_setzen = "j";
            $dateilog = fopen($counterdir . $fileuserlog, "a+");
            //flock($dateilog, LOCK_EX );
            $generatecounter = true;
            if (is_numeric($dat[0])) {
                fputs($dateilog, "$dat[0]&$dat[1]&$dat[2]&$dat[3]&\n");
            }
            //ftruncate($dateilog,ftell($dateilog));
            //flock($dateilog, LOCK_UN); //release
            fclose($dateilog);
        } else {
            $neuer_tag_setzen = "n";
            if (!$was_here) {
                $count = $dat[3] + 1;
            } else {
                $count = $dat[3];
            }
        }
        $index1++;
    }
}

if ($neuer_tag_setzen == "j") {
    $datei = fopen($file_today, "r+");
    flock($datei, LOCK_EX );
    fputs($datei, "$tag&$monat&$jahr&1&");
    ftruncate($datei,ftell($datei));
    flock($datei, LOCK_UN); //release
    fclose($datei);
}

if ($neuer_tag_setzen == "n" && !$was_here) {
    if (is_numeric($tag)) {
        $datei = fopen($file_today, "r+");
        flock($datei, LOCK_EX );
        fputs($datei, "$tag&$monat&$jahr&$count&");
        ftruncate($datei,ftell($datei));
        flock($datei, LOCK_UN); //release
        fclose($datei);
    }
}

$dateiname = $counterdir . $filecounter;
$dateinameb = $counterdir . $filecounterb;
if (!$was_here) {
    $zaehler = (integer)0;
    if (file_exists($dateiname)) {
        /* with the synch this part should not be needed anymore!
        // first we make a backup! if the counterfile is > 0! else we use the backup!
        if (filesize($dateiname) > 0) {
            copy($dateiname, $dateinameb);
        } else {
            // somethin seems wrong + we try to use the backup
            @unlink($dateiname);
            if (file_exists($dateinameb)) {
                copy($dateinameb, $dateiname);
            } else { // we make new file of the copy if the backup failed.
                $dateiw = fopen($dateiname, "w+");
                fwrite($dateiw, 1);
                fclose($dateiw);
            }
        }
        */
        $dateir = fopen($dateiname, "r+");
        if ($dateir !== false && flock($dateir, LOCK_SH )) { // read lock
           $zaehler = (integer) fgets($dateir, 20);
           flock($dateir, LOCK_UN); // release
           $closed = fclose($dateir);
        }    
    } else  {
         touch ($dateiname); 
    }

    $zaehler++;
    $dateiw = fopen($dateiname, "r+");
    if ($dateiw !== false && flock($dateiw, LOCK_EX )) { // write lock
        fwrite($dateiw, $zaehler);
        ftruncate($dateiw,ftell($dateiw));
        flock($dateiw, LOCK_UN); //release
    }
    fclose($dateiw);
    $total = $zaehler + $startmenge;
} else {
    $dateir = fopen($dateiname, "r");
    if ($dateir !== false && flock($dateir, LOCK_SH )) { // read lock
       $zaehler = (integer) fgets($dateir, 20);
       flock($dateir, LOCK_UN); // release
       $closed = fclose($dateir);
    }    
    // $zaehler = file_get_contents($dateiname);
    $total = $zaehler + $startmenge;
}

if ($show_counter) {
    echo $gesamtstyle . number_format($total, 0, '', '.') . "&nbsp;";
    if ($show_today_counter) {
        echo $heutestyle . number_format($count, 0, '', '.');
    }
}
// The variable $user would show the current online users.
?>