1999-12-09 23:15:14 +00:00
#!/usr/bin/perl -w
# wmslashdot.pl v1.3, written by Jeff Meininger
# http://rive.boxybutgood.com/WMHeadlines/ - jeffm@boxybutgood.com
#
# Original concept by Pascal Hofstee...
# <daeron@shadowmere.student.utwente.nl>
#
# Proxy support based on code provided by Dan Gundlach...
# <dan@msl.net>
#
# Proper HTTP/1.1 calls by Kjeld Hoyer Mortensen...
# <khm@daimi.au.dk>
#
# wmslashdot is licensed under the GPL version 2.
# wmslashdot is Copyright (C) 1999 by Jeff Meininger
#
# For setup information, please see the following URL...
# http://rive.boxybutgood.com/WMHeadlines/
#
# For configuration options, type 'wmslashdot.pl --help'
# All options are available from the command line.
#
# NO NEED TO EDIT THIS FILE FOR CONFIGURATION PURPOSES!
print "Sorry, this doesn't do anything yet..\n" ;
exit 0 ;
require 5.002 ;
use strict ;
use Socket ;
use File::Copy ;
# TODO: my ($upkey, $downkey, $enterkey) = ("E", "F", "G");
# TODO: my @sitenames = ("Slashdot", "Freshmeat", ...);
# TODO: my @remotes = ("slashdot.org", "freshmeat.net", ...);
# TODO: my @urls = ("/ultramode.txt", "/whatever.txt", ...);
my $sitename = "Slashdot" ;
my $scriptname = "slashdot" ;
my $remote = 'slashdot.org' ;
my $url = "/ultramode.txt" ;
my @time = localtime ();
my $garble = scalar ( localtime );
$garble =~ s/\W//g ;
my $randomcrap = rand ( 900 );
my ( $iaddr , $paddr , $proto , $line , $menufile , $tmpfile , $newstring , $proxy );
my ( $twentyfour , $dayfirst , $proxyflag , $loudflag , $forceupdate ) = ( 0 ) x5 ;
my ( $showdate , $newflag ) = ( 1 ) x2 ;
my ( $frontpage , $deathtext , $datestring ) = ( "" ) x3 ;
my $nspath = "netscape" ;
$menufile = "$ENV{'HOME'}/.$scriptname" . "menu" ;
my $port = 80 ;
my $maxlength = 9999 ;
my $ampmstring = "AM" ;
my $kick = "\n\n" ;
my $yearstring = "-" . ( $time [ 5 ] + 1900 );
# get configuration from commandline
my $i ;
for ( $i = 0 ; $i < scalar ( @ARGV ); $i ++ ) {
if ( $ARGV [ $i ] eq "--help" ) {
print "\nlcd$scriptname.pl usage:\n" ;
print "[-proxy host port] - enables use over a proxy\n" ;
print "[-n] - prevents netscape from opening a new window for each headline\n" ;
print "[-frontpage top|bottom] - adds a persistant item for the $sitename frontpage.\n\tIt can be placed at the top or bottom of the menu.\n" ;
print "[-loud] - useful for debugging problems. Otherwise, the script exits quietly\n\tin the case of an error.\n" ;
print "[-24] - display time in 24 format instead of 12 AM/PM\n" ;
print "[-dayfirst] - display day before month (like 25-12-1999) in date.\n" ;
print "[-nodate] - do not display 'last updated' date in menu title.\n" ;
print "[-noyear] - do not display the year in the 'last updated' date.\n" ;
print "[-proxyfix] - proxy support not working? Try this.\n" ;
print "[-maxlength num] - items will not be shown with more than [num] letters.\n" ;
print "[-nspath /path/to/netscape/executable] - if your 'netscape' is not in the PATH\n\tused by Window Maker, you may specify the full pathname to the netscape\n\texecutable here.\n" ;
print "[-menufile /etc/X11/WindowMaker/menu.$scriptname] - if you want to store the\n\tmenu somewhere other than ~/.$scriptname" . "menu, specify the FULL\n\tpathname with this option. (Keep write permissions in mind...)\n" ;
print "[-forceupdate] - force the menu file to be written even if the headlines have\n\tnot changed. For example, a change in preference options will _NOT_\n\tbe visible without using this option.\n" ;
print "\n" ;
exit ();
} elsif ( $ARGV [ $i ] eq "-proxy" ) {
if (( ! defined ( $ARGV [ $i + 2 ])) || ( $ARGV [ $i + 1 ] =~ /^-/ ) || ( $ARGV [ $i + 2 ] =~ /^-/ ) || ( $ARGV [ $i + 2 ] =~ /\D/ )) {
print "Please use '-proxy proxy.yourisp.com 3128' or whatever is appropriate.\n" ;
exit ();
} else {
$proxyflag = 1 ;
$proxy = $ARGV [ $i + 1 ];
$port = $ARGV [ $i + 2 ];
}
} elsif ( $ARGV [ $i ] eq "-n" ) {
$newflag = 0 ;
} elsif ( $ARGV [ $i ] eq "-frontpage" ) {
if (( ! defined ( $ARGV [ $i + 1 ])) || (( $ARGV [ $i + 1 ] ne "top" ) && ( $ARGV [ $i + 1 ] ne "bottom" ))) {
print "Please use '-frontpage top' or '-frontpage bottom' to enable this feature.\n" ;
exit ();
} else {
$frontpage = $ARGV [ $i + 1 ];
}
} elsif ( $ARGV [ $i ] eq "-loud" ) {
$deathtext = "ERROR: Could not connect to remote site" ;
} elsif ( $ARGV [ $i ] eq "-24" ) {
$twentyfour = 1 ;
} elsif ( $ARGV [ $i ] eq "-dayfirst" ) {
$dayfirst = 1 ;
} elsif ( $ARGV [ $i ] eq "-nodate" ) {
$showdate = 0 ;
} elsif ( $ARGV [ $i ] eq "-noyear" ) {
$yearstring = "" ;
} elsif ( $ARGV [ $i ] eq "-proxyfix" ) {
$kick = "\r\n\r\n" ;
} elsif ( $ARGV [ $i ] eq "-maxlength" ) {
if (( ! defined ( $ARGV [ $i + 1 ])) || ( $ARGV [ $i + 1 ] =~ /\D/ )) {
print "Please use '-maxlength NUM' where NUM is an integer, like 60.\n" ;
exit ();
} else {
$maxlength = $ARGV [ $i + 1 ];
}
} elsif ( $ARGV [ $i ] eq "-nspath" ) {
if ( ! defined ( $ARGV [ $i + 1 ]) || ( $ARGV [ $i + 1 ] !~ /^\// )) {
print "Please use '-nspath /opt/netscape-4.5/netscape', or whatever is appropriate.\nNote... you must specify the FULL pathname.\n" ;
exit ();
}
$nspath = $ARGV [ $i + 1 ];
} elsif ( $ARGV [ $i ] eq "-menufile" ) {
if ( ! defined ( $ARGV [ $i + 1 ]) || ( $ARGV [ $i + 1 ] !~ /^\// )) {
print "Please use '-menufile /etc/X11/WindowMaker/menu.$scriptname', or whatever is\nappropriate. Note... you must specify the FULL pathname.\n" ;
exit ();
}
$menufile = $ARGV [ $i + 1 ];
} elsif ( $ARGV [ $i ] eq "-forceupdate" ) {
$forceupdate = 1 ;
}
}
if ( $newflag == 0 ) {
$newstring = "" ;
} else {
$newstring = ", new-window" ;
}
if ( $twentyfour > 0 ) {
$ampmstring = "" ;
} else {
if ( $time [ 2 ] > 11 ) {
$ampmstring = "PM" ;
}
2006-04-27 15:10:59 +00:00
1999-12-09 23:15:14 +00:00
if ( $time [ 2 ] > 12 ) {
$time [ 2 ] = $time [ 2 ] - 12 ;
}
}
if ( $showdate > 0 ) {
if ( $dayfirst > 0 ) {
$datestring = " [$time[3]-" . ( $time [ 4 ] + 1 ) . "$yearstring, " . $time [ 2 ] . ":" . sprintf ( "%02d" , $time [ 1 ]) . "$ampmstring]" ;
} else {
$datestring = " [" . ( $time [ 4 ] + 1 ) . "-$time[3]$yearstring, " . $time [ 2 ] . ":" . sprintf ( "%02d" , $time [ 1 ]) . "$ampmstring]" ;
}
} else {
$datestring = "" ;
}
# start the fun
$tmpfile = "/tmp/$scriptname" . "menu$garble$randomcrap" ;
open ( TMPFILE , ">$tmpfile" );
print TMPFILE "\"$sitename Headlines$datestring\" MENU\n" ;
if ( $frontpage eq "top" ) {
print TMPFILE "\"$sitename Frontpage\" EXEC $nspath -remote 'openURL(http://$remote/$newstring)' || $nspath 'http://$remote/'\n" ;
}
# network connection portion is pretty much stolen from 'man perlipc'
if ( $proxyflag > 0 ) {
$iaddr = inet_aton ( $proxy ) || wmdie ( $deathtext );
} else {
$iaddr = inet_aton ( $remote ) || wmdie ( $deathtext );
}
$paddr = sockaddr_in ( $port , $iaddr );
$proto = getprotobyname ( 'tcp' );
socket ( SOCK , PF_INET , SOCK_STREAM , $proto ) || wmdie ( $deathtext );
connect ( SOCK , $paddr ) || wmdie ( $deathtext );
select ( SOCK ); $| = 1 ; select ( STDOUT );
if ( $proxyflag > 0 ) {
print SOCK "GET http://$remote$url HTTP/1.1$kick" ;
} else {
print SOCK "GET $url HTTP/1.1\nHost: $remote:80$kick" ;
}
$i = 0 ;
my $flag = 0 ;
while ( defined ( $line = <SOCK> )) {
$i ++ ;
2006-04-27 15:10:59 +00:00
1999-12-09 23:15:14 +00:00
if ( $line =~ /^%%/ ) { $i = 1 ; $flag = 1 ; }
2006-04-27 15:10:59 +00:00
1999-12-09 23:15:14 +00:00
if ( $flag > 0 ) {
if ( $i == 2 ) {
chop ( $line );
$line =~ s/"/'/g ; # " Balances out quote...
$line =~ s/<.*?>//g ;
$line =~ s/&.{1,5}?;//g ;
if ( length ( $line ) > $maxlength ) {
$line = substr ( $line , 0 , $maxlength ) . "..." ;
}
print TMPFILE "\"$line\" EXEC $nspath -remote 'openURL(" ;
} elsif ( $i == 3 ) {
chop ( $line );
print TMPFILE "$line$newstring)' || $nspath '$line'\n" ;
}
}
}
if ( $frontpage eq "bottom" ) {
print TMPFILE "\"$sitename Frontpage\" EXEC $nspath -remote 'openURL(http://$remote/$newstring)' || $nspath 'http://$remote/'\n" ;
}
print TMPFILE "\"$sitename Headlines$datestring\" END\n" ;
close ( SOCK ) || die "Error closing socket: $!" ;
close ( TMPFILE );
# compare tmpfile with current menufile and possibly update it.
if ( - e $menufile ) {
my ( $tmpline , $menuline , $linecount );
2006-04-27 15:10:59 +00:00
1999-12-09 23:15:14 +00:00
open ( MENUFILE , $menufile );
open ( TMPFILE , $tmpfile );
2006-04-27 15:10:59 +00:00
1999-12-09 23:15:14 +00:00
# read in the first 'headline' menu entry from each file.
if ( $frontpage eq "top" ) {
$linecount = 3 ;
} else {
$linecount = 2 ;
}
for ( $i = 0 ; $i < $linecount ; $i ++ ) {
if ( eof ( TMPFILE )) {
if ( $forceupdate == 0 ) {
2006-04-27 15:10:59 +00:00
1999-12-09 23:15:14 +00:00
close ( MENUFILE );
close ( TMPFILE );
unlink ( $tmpfile );
exit ();
}
} else {
$tmpline = <TMPFILE> ;
}
unless ( eof ( MENUFILE )) {
$menuline = <MENUFILE> ;
}
}
2006-04-27 15:10:59 +00:00
1999-12-09 23:15:14 +00:00
if (( $forceupdate == 0 ) && (( $tmpline =~ /^"$sitename Headlines/ ) || ( $tmpline =~ /^"$sitename Frontpage/ ) || ( $tmpline eq $menuline ))) {
close ( MENUFILE );
close ( TMPFILE );
unlink ( $tmpfile );
2006-04-27 15:10:59 +00:00
1999-12-09 23:15:14 +00:00
exit ();
}
}
close ( MENUFILE );
close ( TMPFILE );
copy ( $tmpfile , $menufile );
unlink ( $tmpfile );
exit ();
sub wmdie {
my $string = shift ;
if ( $string ne "" ) {
print "$string\n" ;
}
2006-04-27 15:10:59 +00:00
1999-12-09 23:15:14 +00:00
close ( SOCK );
close ( TMPFILE );
unlink ( $tmpfile );
2006-04-27 15:10:59 +00:00
1999-12-09 23:15:14 +00:00
if ( $string eq "" ) {
exit ( 0 );
} else {
exit ( 1 );
}
}