Files
lcdproc/clients/headlines/lcdheadlines
T
1999-12-09 23:15:14 +00:00

294 lines
10 KiB
Perl
Executable File

#!/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";
}
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++;
if ($line =~ /^%%/) { $i = 1; $flag = 1; }
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);
open(MENUFILE, $menufile);
open(TMPFILE, $tmpfile);
# 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) {
close(MENUFILE);
close(TMPFILE);
unlink($tmpfile);
exit();
}
} else {
$tmpline = <TMPFILE>;
}
unless (eof(MENUFILE)) {
$menuline = <MENUFILE>;
}
}
if (($forceupdate == 0) && (($tmpline =~ /^"$sitename Headlines/) || ($tmpline =~ /^"$sitename Frontpage/) || ($tmpline eq $menuline))) {
close(MENUFILE);
close(TMPFILE);
unlink($tmpfile);
exit();
}
}
close(MENUFILE);
close(TMPFILE);
copy($tmpfile, $menufile);
unlink($tmpfile);
exit();
sub wmdie {
my $string = shift;
if ($string ne "") {
print "$string\n";
}
close(SOCK);
close(TMPFILE);
unlink($tmpfile);
if ($string eq "") {
exit(0);
} else {
exit(1);
}
}