#!/usr/bin/perl
#
# add an entry to my web log
#
# $dotat: scripts/blog,v 1.41 2011/09/14 08:57:33 fanf2 Exp $

use warnings;
use strict;

use IO::Socket;
use POSIX;

sub aargh ($);

chdir "/home/fanf2/doc/web/cgi"
or die "chdir ~/doc/web/cgi: $!\n";

my $doirc = 1;
if ($ARGV[0] eq "noirc") {
	shift;
	$doirc = 0;
}

die "usage: $0 <url> <comment>\n"
    unless @ARGV == 2;

my ($url,$comment) = @ARGV;

die "already blogged\n"
    if 0 == system "/usr/bin/egrep", "<".quotemeta($url).">", "url";

my $key = "";
while ($key !~ /[0-9]/) {
	my $random;
	open RANDOM, "< /dev/urandom" or aargh "open < /dev/random";
	sysread RANDOM, $random, 4
	    or aargh "read /dev/random";
	close RANDOM;
	$random = unpack "V", $random;
	my @char = qw( B C D F G H J K L M N P R T V W X Y Z 2 5 6 7 8 9 );
	$key = "";
	for my $i (1..5) {
		use integer;
		my $j = $random % @char;
		$random /= @char;
		$key .= $char[$j];
	}
	$key = "" if 0 == system "grep $key url";
}

my $reader = "url";
my $writer = "url.new";

open READER, "< $reader" or aargh "open < $reader";
open WRITER, "> $writer" or aargh "open > $writer";

while (defined (my $line = <READER>)) {
	print WRITER $line;
	next unless $line =~ /INSERT HERE/;
	my $date = strftime "%Y-%m-%dT%H:%M:%SZ", gmtime;
	print WRITER <<END;
  scalar(
    \$DATE{"$key"} = "$date",
    \$LINK{"$key"} = q<$url>,
    \$TEXT{"$key"} = q<$comment>,
          "$key"),
END
}

close READER or aargh "close $reader";
close WRITER or aargh "close $writer";
rename $writer, $reader or aargh "rename $writer to $reader";

system "/usr/bin/cvs", "ci", "-m", $comment, $reader;
system "/usr/bin/scp", "-i", "/home/fanf2/.ssh/id_link_log",
    $reader, "chiark:public-cgi/url";

########################################

if ($doirc) {
	my $s = IO::Socket::INET->new(PeerAddr => "irc.chiark.greenend.org.uk",
				      PeerPort => 6667);
	aargh "open irc" unless defined $s;
	aargh "unblock irc" unless defined $s->blocking(0);
	sub slurp {
		my $r = "";
		for (;;) {
			my $n = sysread $s, my $l, 1000;
			aargh "read irc" if not defined $n and $! != EAGAIN;
			return undef if $r eq "" and defined $n and $n == 0;
			return $r if $l eq "";
			print $l;
			$r .= $l;
		}
	}
	sub say {
		print my $l = join "", @_, "\r\n";
		aargh "write irc" if not defined syswrite $s, $l;
	}
	say "user fanf 0 * :Tony Finch";
	say "nick fanf-url";
	for (;;) {
		my $r = slurp;
		say "pong $1" if $r =~ /PING :(\d+)\s*/;
		last if $r =~ / NOTICE fanf-url :on /;
		sleep 0.1 if $r eq "";
	}
	say "privmsg #chiark :$url - $comment";
	say "quit";
	while (defined slurp) {
		sleep 0.1;
	}
	close $s;
}

########################################

sub enc {
	my $it = shift;
	$it =~ s/([^A-Za-z0-9._~-])/sprintf "%%%02x", ord $1/eg;
	return $it;
}

$comment =~ s/<[^>]*>//g;

my $q = "\x27";
my $tweet = "http://dotat.at/:/$key - $comment";
my $twenc = enc $tweet;
$tweet =~ s/$q/$q"$q"$q/g;

my $consumer_key = 'XXXXXXXXXXXXXXXXXXXXXX';
my $consumer_secret = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX';
my $token = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX';
my $secret = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX';
my $twit = "https://api.twitter.com/1/statuses/update.json";

my $oauth = qx(/home/fanf2/bin/oauth_sign $consumer_key $consumer_secret $token $secret POST $twit status=$q$tweet$q);
chomp $oauth;

system "/usr/local/bin/wget", "--output-document=-", "--no-verbose",
"--header=Authorization: $oauth",
"--post-data=status=$twenc",
$twit;

my $comenc = enc $comment;
my $urlenc = enc $url;

system "/usr/local/bin/wget", "--output-document=-", "--no-verbose",
"--http-user=fanf", "--http-password=".'XXXXXXXX',
"https://api.del.icio.us/v1/posts/add?url=$urlenc&description=$comenc";

sub aargh ($) {
	my $msg = "@_: $!\n";
	unlink $writer;
	die $msg;
}

########################################
