Viewing a single comment thread. View all comments

not_bob wrote (edited )

In the near future I plan to be writing more little toys like this. Then plan is to have a toys.notbob.i2p site with a list of useful things.

Here is code what what I have running. You can see an example of it running here http://5gn3ca4z4occksx2cnwbcrun2mum2eg2c7zgfi7k7fetruwzmdiq.b32.i2p/count.html

To use it, you need include code like the following.

<img src="http://5gn3ca4z4occksx2cnwbcrun2mum2eg2c7zgfi7k7fetruwzmdiq.b32.i2p/conter.cgi?page=123456789k&color=green" height=40>

Pick a number. That will be your site number. Or, you can use a new number for each html page. But, any page with the same number will increment that number's count.

As for the color. Use normal color names. They should work. No hex colors. If you do not specify a color then it will default to black text. The background will be transparent.

Anyone is welcome to use this freely. Enjoy!


#!/usr/bin/perl

# code by notbob.i2p

use warnings;
use Fcntl ':flock'; # Import LOCK_* constants
use Time::HiRes qw(usleep); # For sub-second sleeping
use CGI qw/:standard/;

$site = param("site");
$site =~ s/\D//g;

$color = param("color");

$color = lc($color);
$color =~ s/[^a-z]//g;

if ( $color eq "" ) { $color = "black"; }

print("Content-type: image/svg+xml\n\n");

# File to store the page counter
my $counterFile = "/comhtml/5gn3ca4z4occksx2cnwbcrun2mum2eg2c7zgfi7k7fetruwzmdiq.b32.i2p/counter/$site.txt";

# Function to read the current counter value
sub read_counter {
 my ($filename) = @_;
 open(my $fh, '<', $filename) or die "Cannot open file $filename: $!";
 flock($fh, LOCK_SH); # Shared lock for reading
 my $counter = <$fh>;
 chomp($counter);
 close($fh);
 return $counter;
}

# Function to increment and save the counter
sub save_counter {
 my ($filename, $counter) = @_;
 open(my $fh, '>', $filename) or die "Cannot open file $filename: $!";
 while (!flock($fh, LOCK_EX | LOCK_NB)) {
 # If the file is locked, wait a short time and try again
 usleep(100000); # 100 milliseconds
 }
 print $fh $counter;
 close($fh);
}

# Read current counter value from file
my $counter = -e $counterFile ? read_counter($counterFile) : 0;

# Increment the counter
$counter++;

# Save updated counter value to file
save_counter($counterFile, $counter);

# Generate HTML page counter span
#print "Content-Type: text/html\n\n";
#print "<span id=\"counter\">$counter</span>\n";

print "<svg width=\"100\" height=\"50\" xmlns=\"http://www.w3.org/2000/svg\">
 <text x=\"10\" y=\"40\" font-family=\"Arial\" font-size=\"40\" fill=\"$color\">$counter</text>
</svg>";

To use this, you will also need to create a counter directory on the webserver and give it read-write permission for whatever webserver you are running.

2