#!/usr/bin/perl -w use lib "$ENV{HOME}/perl/lib"; use Net::IRC; use LWP::Simple; use POSIX qw(strftime); use Time::localtime; use Finance::YahooQuote; use strict; my($irc, $conn, $delay, $purl, $server, %nicks); $delay = 60; $purl = 'purl'; $server = $ARGV[0] || 'irc.cs.cmu.edu'; # 'irc.chat.org'; $irc = Net::IRC->new(); $conn = $irc->newconn( Nick => '^Tick', Server => $server, Port => 6667, ); print "Installing handler routines..."; $conn->add_handler('msg', \&on_msg); $conn->add_handler('public', \&on_public); $conn->add_handler('cping', \&on_ping); $conn->add_handler('crping', \&on_ping_reply); $conn->add_global_handler(376, \&on_connect); $conn->add_global_handler([ 251,252,253,254,302,255 ], \&on_init); print " done.\n"; print "starting...\n"; $irc->start(); sub on_msg { my($self, $event) = @_; my($nick, $args) = ($event->nick, $event->args); print "*$nick* $args\n"; $args =~ s/^stocks? //; $args =~ s/[?\s]+$//; foreach my $r (get_stock($args)) { $self->privmsg($nick, $r); } } sub on_public { my($self, $event) = @_; my($args) = $event->args; my($to) = $event->to; my($nick) = $event->nick; $args =~ s/[?\s]+$//; if ($args =~ /^\^?tick[,:] (.+)$/i) { print "*$to:$nick* $args\n"; foreach my $r (get_stock($1)) { $self->privmsg($to, $r); } $self->notice($nick, 'Please /msg me instead, when appropriate.') unless exists $nicks{$nick}; $nicks{$nick}++; } } sub get_stock { my($ss, %s, @r, @s, $c) = shift; %s = (djia => '^DJI', nasdaq => '^IXIC'); foreach my $s (split m/\s+/, $ss) { print $s, "\n"; $s = $s{lc $s} if exists $s{lc $s}; next if length($s) > 5; my @q = getonequote($s); my $r = ($q[3] ne 'N/A' ? sprintf('%s (%s): %s; Change: %s (%s); Volume, %s; %s EST', @q[0, 1, 2, 5, 6], commify($q[7]), $q[4]) : $s); print $r, "\n"; $r =~ /^\S+$/ ? push @s, $r : push @r, $r; # last if ++$c >= 4; } push @r, sprintf("No symbol(s) '%s' found.", join "', '", map {uc} @s) if @s; return @r; } sub commify { local $_ = shift; 1 while s/^(-?\d+)(\d{3})/$1,$2/; return $_; } sub on_connect { my $self = shift; foreach (qw(#macperl #tick #perl)) { print "Joining $_ ...\n"; $self->join($_); $self->privmsg($_, "Spoooon!"); } } sub on_init { my($self, $event) = @_; my @args = $event->args(); shift @args; print "*** @args\n"; } sub on_ping { my ($self, $event) = @_; my $nick = $event->nick; $self->ctcp_reply($nick, join (' ', ($event->args))); print "*** CTCP PING request from $nick received\n"; } sub on_ping_reply { my ($self, $event) = @_; my ($args) = ($event->args)[1]; my ($nick) = $event->nick; $args = time - $args; print "*** CTCP PING reply from $nick: $args sec.\n"; }