########################################### # Ticker.pm # 2009, Mike Schilli ########################################### package PerlPanel::Applet::Ticker; use strict; use Log::Log4perl qw(:easy); my $REFRESH = 5 * 30_000; my($CFG_FILE)= glob "~/.ticker-rc"; my $GETQUOTE = "/usr/bin/getquote"; Log::Log4perl->easy_init({ level => $DEBUG, file => ">>/tmp/ticker.log", }); ########################################### sub new { ########################################### my($package) = @_; my $self = {}; bless($self, $package); return $self; } ########################################### sub configure { ########################################### my($self) = @_; $self->{label} = Gtk2::Label->new("Ticker"); $self->{widget} = Gtk2::Button->new(); $self->{widget}->signal_connect( 'clicked', sub { $self->stocks_update() }); $self->{widget}->set_relief('none'); $self->{widget}->add($self->{label}); $self->{widget}->show_all; $self->stocks_update(); PerlPanel::add_timeout(5 * 60_000, sub { $self->stocks_update() ; return 1 }); return 1; } ########################################### sub symbols { ########################################### my @symbols = (); if(! open(FILE, "<$CFG_FILE")) { ERROR "Cannot open $CFG_FILE"; return (); } while() { s/#.*//g; s/[^\w\.]//g; next if /^\s*$/; chomp; push @symbols, $_; } return @symbols; } ########################################### sub stocks_update { ########################################### my ($self) = @_; my($tag, $buffer); my $symbols = join " ", symbols(); DEBUG "Updating '$symbols'"; if($symbols eq "") { $self->{label}->set_markup( "No symbols defined"); return undef; } if (!open(COMMAND, "$GETQUOTE $symbols |")) { $self->{label}->set_markup( "Fetch failed ($!)"); ERROR "Fetch failed ($!)"; return undef; } $tag = Gtk2::Helper->add_watch( fileno(COMMAND), 'in', sub { if (eof(COMMAND)) { DEBUG "Received data: $buffer"; close(COMMAND); Gtk2::Helper->remove_watch($tag); $buffer =~ s/\n/ /g; $self->{label}->set_markup( $buffer); } else { $buffer .= ; } }); return 1; } ########################################### sub expand { return 0; } sub fill { return 0; } sub widget { return $_[0]->{widget} } sub get_default_config { return undef; } 1;