/[irc-logger]/trunk/bin/irc-logger.pl
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Diff of /trunk/bin/irc-logger.pl

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 78 by dpavlin, Wed Feb 20 19:37:34 2008 UTC revision 92 by dpavlin, Fri Mar 7 10:30:57 2008 UTC
# Line 20  Import log from C<dircproxy> to C<irc-lo Line 20  Import log from C<dircproxy> to C<irc-lo
20    
21  =item --log=irc-logger.log  =item --log=irc-logger.log
22    
 Name of log file  
   
23  =back  =back
24    
25  =head1 DESCRIPTION  =head1 DESCRIPTION
# Line 46  my $CHANNEL = '#razmjenavjestina'; Line 44  my $CHANNEL = '#razmjenavjestina';
44  $CHANNEL = '#irc-logger' if ($HOSTNAME =~ m/llin/);  $CHANNEL = '#irc-logger' if ($HOSTNAME =~ m/llin/);
45  my $IRC_ALIAS = "log";  my $IRC_ALIAS = "log";
46    
 my %FOLLOWS =  
   (  
    ACCESS => "/var/log/apache/access.log",  
    ERROR => "/var/log/apache/error.log",  
   );  
   
47  my $DSN = 'DBI:Pg:dbname=' . $NICK;  my $DSN = 'DBI:Pg:dbname=' . $NICK;
48    
 my $ENCODING = 'ISO-8859-2';  
49  my $TIMESTAMP = '%Y-%m-%d %H:%M:%S';  my $TIMESTAMP = '%Y-%m-%d %H:%M:%S';
50    
51  my $sleep_on_error = 5;  my $sleep_on_error = 5;
52    
53    # number of last tags to keep in circular buffer
54    my $last_x_tags = 50;
55    
56    # don't pull rss feeds more often than this
57    my $rss_min_delay = 60;
58    $rss_min_delay = 15;
59    
60  my $http_port = $NICK =~ m/-dev/ ? 8001 : 8000;  my $http_port = $NICK =~ m/-dev/ ? 8001 : 8000;
61    
62  my $url = "http://$HOSTNAME:$http_port";  my $url = "http://$HOSTNAME:$http_port";
63    
64  ## END CONFIG  ## END CONFIG
65    
66    use POE qw(Component::IRC Component::Server::HTTP);
   
 use POE qw(Component::IRC Wheel::FollowTail Component::Server::HTTP);  
67  use HTTP::Status;  use HTTP::Status;
68  use DBI;  use DBI;
 use Encode qw/from_to is_utf8/;  
69  use Regexp::Common qw /URI/;  use Regexp::Common qw /URI/;
70  use CGI::Simple;  use CGI::Simple;
71  use HTML::TagCloud;  use HTML::TagCloud;
# Line 96  GetOptions( Line 91  GetOptions(
91          'log:s' => \$log_path,          'log:s' => \$log_path,
92  );  );
93    
94  $SIG{__DIE__} = sub {  #$SIG{__DIE__} = sub {
95          confess "fatal error";  #       confess "fatal error";
96  };  #};
97    
98  open(STDOUT, '>', $log_path) || warn "can't redirect log to $log_path: $!";  open(STDOUT, '>', $log_path) || warn "can't redirect log to $log_path: $!";
99    
100  sub _log {  sub _log {
101          print strftime($TIMESTAMP,localtime()), ' ', join(" ",@_), $/;          print strftime($TIMESTAMP,localtime()) . ' ' . join(" ",@_) . $/;
102  }  }
103    
104  # HTML formatters  # HTML formatters
# Line 149  my $filter = { Line 144  my $filter = {
144  };  };
145    
146  my $dbh = DBI->connect($DSN,"","", { RaiseError => 1, AutoCommit => 1 }) || die $DBI::errstr;  my $dbh = DBI->connect($DSN,"","", { RaiseError => 1, AutoCommit => 1 }) || die $DBI::errstr;
147    $dbh->do( qq{ set client_encoding = 'UTF-8' } );
148    
149  my $sql_schema = {  my $sql_schema = {
150          log => '          log => qq{
151  create table log (  create table log (
152          id serial,          id serial,
153          time timestamp default now(),          time timestamp default now(),
# Line 165  create table log ( Line 161  create table log (
161  create index log_time on log(time);  create index log_time on log(time);
162  create index log_channel on log(channel);  create index log_channel on log(channel);
163  create index log_nick on log(nick);  create index log_nick on log(nick);
164          ',          },
165          meta => '          meta => q{
166  create table meta (  create table meta (
167          nick text not null,          nick text not null,
168          channel text not null,          channel text not null,
169          name text not null,          name text not null,
170          value text,          value text,
171          changed timestamp default now(),          changed timestamp default 'now()',
172          primary key(nick,channel,name)          primary key(nick,channel,name)
173  );  );
174          ',          },
175            feeds => qq{
176    create table feeds (
177            id serial,
178            url text not null,
179            name text,
180            delay interval not null default '5 min',
181            active boolean default true,
182            last_update timestamp default 'now()',
183            polls int default 0,
184            updates int default 0
185    );
186    create unique index feeds_url on feeds(url);
187    insert into feeds (url,name) values ('http://wiki.razmjenavjestina.org/feed/workspace/razmjenavjestina?category=Recent%20Changes','wiki');
188            },
189  };  };
190    
191  foreach my $table ( keys %$sql_schema ) {  foreach my $table ( keys %$sql_schema ) {
# Line 239  sub meta { Line 249  sub meta {
249    
250    
251    
252  my $sth = $dbh->prepare(qq{  my $sth_insert_log = $dbh->prepare(qq{
253  insert into log  insert into log
254          (channel, me, nick, message, time)          (channel, me, nick, message, time)
255  values (?,?,?,?,?)  values (?,?,?,?,?)
# Line 483  my $cloud = HTML::TagCloud->new; Line 493  my $cloud = HTML::TagCloud->new;
493    
494  =cut  =cut
495    
 my $last_x_tags = 5;  
496  my @last_tags;  my @last_tags;
497    
498  sub add_tag {  sub add_tag {
# Line 492  sub add_tag { Line 501  sub add_tag {
501          return unless ($arg->{id} && $arg->{message});          return unless ($arg->{id} && $arg->{message});
502    
503          my $m = $arg->{message};          my $m = $arg->{message};
         from_to('UTF-8', 'iso-8859-2', $m) if (is_utf8($m));  
504    
505          my @tags;          my @tags;
506    
# Line 561  sub save_message { Line 569  sub save_message {
569                  $a->{me} ? "***" . $a->{nick} : "<" . $a->{nick} . ">",                  $a->{me} ? "***" . $a->{nick} : "<" . $a->{nick} . ">",
570                  " " . $a->{message};                  " " . $a->{message};
571    
572          from_to($a->{message}, 'UTF-8', $ENCODING);          $sth_insert_log->execute($a->{channel}, $a->{me}, $a->{nick}, $a->{message}, $a->{time});
   
         $sth->execute($a->{channel}, $a->{me}, $a->{nick}, $a->{message}, $a->{time});  
573          add_tag( id => $dbh->last_insert_id(undef,undef,"log",undef), %$a );          add_tag( id => $dbh->last_insert_id(undef,undef,"log",undef), %$a );
574  }  }
575    
# Line 602  if ($import_dircproxy) { Line 608  if ($import_dircproxy) {
608          exit;          exit;
609  }  }
610    
611    #
612    # RSS follow
613    #
614    
615    my $_rss;
616    
617    
618    sub rss_fetch {
619            my ($args) = @_;
620    
621            # how many messages to send out when feed is seen for the first time?
622            my $send_rss_msgs = 1;
623    
624            _log "RSS fetch", $args->{url};
625    
626            my $feed = XML::Feed->parse(URI->new( $args->{url} ));
627            if ( ! $feed ) {
628                    _log("can't fetch RSS ", $args->{url});
629                    return;
630            }
631    
632            my ( $total, $updates ) = ( 0, 0 );
633            for my $entry ($feed->entries) {
634                    $total++;
635    
636                    # seen allready?
637                    next if $_rss->{$feed->link}->{seen}->{$entry->id}++ > 0;
638    
639                    sub prefix {
640                            my ($txt,$var) = @_;
641                            $var =~ s/^\s+//g;
642                            return $txt . $var if $var;
643                    }
644    
645                    my $msg;
646                    $msg .= prefix( 'From: ' , $args->{name} || $feed->title );
647                    $msg .= prefix( ' by ' , $entry->author );
648                    $msg .= prefix( ' | ' , $entry->title );
649                    $msg .= prefix( ' | ' , $entry->link );
650    #               $msg .= prefix( ' id ' , $entry->id );
651    
652                    if ( $args->{kernel} && $send_rss_msgs ) {
653                            $send_rss_msgs--;
654                            _log('>>', $msg);
655                            $sth_insert_log->execute( $CHANNEL, 1, $NICK, $msg, 'now()' );
656                            $args->{kernel}->post( $IRC_ALIAS => notice => $CHANNEL, $msg );
657                            $updates++;
658                    }
659            }
660    
661            my $sql = qq{ update feeds set last_update = now(), polls = polls + 1 };
662            $sql .= qq{, updates = updates + $updates } if $updates;
663            $sql .= qq{where id = } . $args->{id};
664            eval { $dbh->do( $sql ) };
665    
666            _log "RSS got $total items of which $updates new";
667    
668            return $updates;
669    }
670    
671    sub rss_fetch_all {
672            my $kernel = shift;
673            my $sql = qq{
674                    select id, url, name
675                    from feeds
676                    where active is true
677            };
678            # limit to newer feeds only if we are not sending messages out
679            $sql .= qq{     and last_update + delay < now() } if $kernel;
680            my $sth = $dbh->prepare( $sql );
681            $sth->execute();
682            warn "# ",$sth->rows," active RSS feeds\n";
683            my $count = 0;
684            while (my $row = $sth->fetchrow_hashref) {
685                    $row->{kernel} = $kernel if $kernel;
686                    $count += rss_fetch( $row );
687            }
688            return "OK, fetched $count posts from " . $sth->rows . " feeds";
689    }
690    
691    
692    sub rss_check_updates {
693            my $kernel = shift;
694            my $last_t = $_rss->{last_poll} || time();
695            my $t = time();
696            if ( $t - $last_t > $rss_min_delay ) {
697                    $_rss->{last_poll} = $t;
698                    _log rss_fetch_all( $kernel );
699            }
700    }
701    
702    # seed rss seen cache so we won't send out all items on startup
703    _log rss_fetch_all;
704    
705  #  #
706  # POE handing part  # POE handing part
707  #  #
708    
 my $SKIPPING = 0;               # if skipping, how many we've done  
 my $SEND_QUEUE;                 # cache  
709  my $ping;                                               # ping stats  my $ping;                                               # ping stats
710    
711  POE::Component::IRC->new($IRC_ALIAS);  POE::Component::IRC->new($IRC_ALIAS);
712    
713  POE::Session->create( inline_states =>  POE::Session->create( inline_states => {
714     {_start => sub {                _start => sub {      
715                  $_[KERNEL]->post($IRC_ALIAS => register => 'all');                  $_[KERNEL]->post($IRC_ALIAS => register => 'all');
716                  $_[KERNEL]->post($IRC_ALIAS => connect => $CONNECT);                  $_[KERNEL]->post($IRC_ALIAS => connect => $CONNECT);
717      },      },
718      irc_255 => sub {    # server is done blabbing      irc_255 => sub {    # server is done blabbing
719                  $_[KERNEL]->post($IRC_ALIAS => join => $CHANNEL);                  $_[KERNEL]->post($IRC_ALIAS => join => $CHANNEL);
                 $_[KERNEL]->post($IRC_ALIAS => join => '#logger');  
                 $_[KERNEL]->yield("heartbeat"); # start heartbeat  
 #               $_[KERNEL]->yield("my_add", $_) for keys %FOLLOWS;  
720                  $_[KERNEL]->post( $IRC_ALIAS => privmsg => 'nickserv', "IDENTIFY $NICK" );                  $_[KERNEL]->post( $IRC_ALIAS => privmsg => 'nickserv', "IDENTIFY $NICK" );
721      },      },
722      irc_public => sub {      irc_public => sub {
# Line 653  POE::Session->create( inline_states => Line 747  POE::Session->create( inline_states =>
747    
748      },      },
749          irc_ping => sub {          irc_ping => sub {
750                  warn "pong ", $_[ARG0], $/;                  _log( "pong ", $_[ARG0] );
751                  $ping->{ $_[ARG0] }++;                  $ping->{ $_[ARG0] }++;
752                    rss_check_updates( $_[KERNEL] );
753          },          },
754          irc_invite => sub {          irc_invite => sub {
755                  my $kernel = $_[KERNEL];                  my $kernel = $_[KERNEL];
756                  my $nick = (split /!/, $_[ARG0])[0];                  my $nick = (split /!/, $_[ARG0])[0];
757                  my $channel = $_[ARG1];                  my $channel = $_[ARG1];
758    
759                  warn "invited to $channel by $nick";                  _log "invited to $channel by $nick";
760    
761                  $_[KERNEL]->post( $IRC_ALIAS => privmsg => $nick, "how nice of you to invite me to $channel, I'll be right there..." );                  $_[KERNEL]->post( $IRC_ALIAS => privmsg => $nick, "how nice of you to invite me to $channel, I'll be right there..." );
762                  $_[KERNEL]->post($IRC_ALIAS => join => $channel);                  $_[KERNEL]->post($IRC_ALIAS => join => $channel);
# Line 672  POE::Session->create( inline_states => Line 767  POE::Session->create( inline_states =>
767                  my $nick = (split /!/, $_[ARG0])[0];                  my $nick = (split /!/, $_[ARG0])[0];
768                  my $msg = $_[ARG2];                  my $msg = $_[ARG2];
769                  my $channel = $_[ARG1]->[0];                  my $channel = $_[ARG1]->[0];
                 from_to($msg, 'UTF-8', $ENCODING);  
770    
771                  my $res = "unknown command '$msg', try /msg $NICK help!";                  my $res = "unknown command '$msg', try /msg $NICK help!";
772                  my @out;                  my @out;
# Line 716  POE::Session->create( inline_states => Line 810  POE::Session->create( inline_states =>
810    
811                          foreach my $res (get_from_log( limit => $limit )) {                          foreach my $res (get_from_log( limit => $limit )) {
812                                  _log "last: $res";                                  _log "last: $res";
                                 from_to($res, $ENCODING, 'UTF-8');  
813                                  $_[KERNEL]->post( $IRC_ALIAS => privmsg => $nick, $res );                                  $_[KERNEL]->post( $IRC_ALIAS => privmsg => $nick, $res );
814                          }                          }
815    
# Line 731  POE::Session->create( inline_states => Line 824  POE::Session->create( inline_states =>
824                                          search => $what,                                          search => $what,
825                                  )) {                                  )) {
826                                  _log "search [$what]: $res";                                  _log "search [$what]: $res";
                                 from_to($res, $ENCODING, 'UTF-8');  
827                                  $_[KERNEL]->post( $IRC_ALIAS => privmsg => $nick, $res );                                  $_[KERNEL]->post( $IRC_ALIAS => privmsg => $nick, $res );
828                          }                          }
829    
# Line 801  POE::Session->create( inline_states => Line 893  POE::Session->create( inline_states =>
893                                          $res = "config option $op doesn't exist";                                          $res = "config option $op doesn't exist";
894                                  }                                  }
895                          }                          }
896                    } elsif ($msg =~ m/^rss-update/) {
897                            $res = rss_fetch_all( $_[KERNEL] );
898                    } elsif ($msg =~ m/^rss-clean/) {
899                            $_rss = undef;
900                            $dbh->do( qq{ update feeds set last_update = now() - delay } );
901                            $res = "OK, cleaned RSS cache";
902                    } elsif ($msg =~ m/^rss-list/) {
903                            my $sth = $dbh->prepare(qq{ select url,name,last_update,active from feeds });
904                            $sth->execute;
905                            while (my @row = $sth->fetchrow_array) {
906                                    $_[KERNEL]->post( $IRC_ALIAS => privmsg => $nick, join(' | ',@row) );
907                            }
908                            $res = '';
909                    } elsif ($msg =~ m!^rss-(add|remove|stop|start)\s+(http://\S+)\s*(.*)!) {
910                            my $sql = {
911                                    add             => qq{ insert into feeds (url,name) values (?,?) },
912    #                               remove  => qq{ delete from feeds                                where url = ? and name = ? },
913                                    start   => qq{ update feeds set active = true   where url = ? },
914                                    stop    => qq{ update feeds set active = false  where url = ? },
915                                    
916                            };
917                            if (my $q = $sql->{$1} ) {
918                                    my $sth = $dbh->prepare( $q );
919                                    my @data = ( $2 );
920                                    push @data, $3 if ( $q =~ s/\?//g == 2 );
921                                    warn "## $1 SQL $q with ",dump( @data ),"\n";
922                                    eval { $sth->execute( @data ) };
923                            }
924    
925                            $res = "OK, RSS $1 : $2 - $3";
926                  }                  }
927    
928                  if ($res) {                  if ($res) {
929                          _log ">> [$nick] $res";                          _log ">> [$nick] $res";
                         from_to($res, $ENCODING, 'UTF-8');  
930                          $_[KERNEL]->post( $IRC_ALIAS => privmsg => $nick, $res );                          $_[KERNEL]->post( $IRC_ALIAS => privmsg => $nick, $res );
931                  }                  }
932    
933                    rss_check_updates( $_[KERNEL] );
934          },          },
935          irc_477 => sub {          irc_477 => sub {
936                  _log "# irc_477: ",$_[ARG1];                  _log "# irc_477: ",$_[ARG1];
# Line 847  POE::Session->create( inline_states => Line 969  POE::Session->create( inline_states =>
969                          "";                          "";
970        0;                        # false for signals        0;                        # false for signals
971      },      },
     my_add => sub {  
       my $trailing = $_[ARG0];  
       my $session = $_[SESSION];  
       POE::Session->create  
           (inline_states =>  
            {_start => sub {  
               $_[HEAP]->{wheel} =  
                 POE::Wheel::FollowTail->new  
                     (  
                      Filename => $FOLLOWS{$trailing},  
                      InputEvent => 'got_line',  
                     );  
             },  
             got_line => sub {  
               $_[KERNEL]->post($session => my_tailed =>  
                                time, $trailing, $_[ARG0]);  
             },  
            },  
           );  
       
     },  
     my_tailed => sub {  
       my ($time, $file, $line) = @_[ARG0..ARG2];  
       ## $time will be undef on a probe, or a time value if a real line  
   
       ## PoCo::IRC has throttling built in, but no external visibility  
       ## so this is reaching "under the hood"  
       $SEND_QUEUE ||=  
         $_[KERNEL]->alias_resolve($IRC_ALIAS)->get_heap->{send_queue};  
   
       ## handle "no need to keep skipping" transition  
       if ($SKIPPING and @$SEND_QUEUE < 1) {  
         $_[KERNEL]->post($IRC_ALIAS => privmsg => $CHANNEL =>  
                          "[discarded $SKIPPING messages]");  
         $SKIPPING = 0;  
       }  
   
       ## handle potential message display  
       if ($time) {  
         if ($SKIPPING or @$SEND_QUEUE > 3) { # 3 msgs per 10 seconds  
           $SKIPPING++;  
         } else {  
           my @time = localtime $time;  
           $_[KERNEL]->post($IRC_ALIAS => privmsg => $CHANNEL =>  
                            sprintf "%02d:%02d:%02d: %s: %s",  
                            ($time[2] + 11) % 12 + 1, $time[1], $time[0],  
                            $file, $line);  
         }  
       }  
   
       ## handle re-probe/flush if skipping  
       if ($SKIPPING) {  
         $_[KERNEL]->delay($_[STATE] => 0.5); # $time will be undef  
       }  
   
     },  
     my_heartbeat => sub {  
       $_[KERNEL]->yield(my_tailed => time, "heartbeat", "beep");  
       $_[KERNEL]->delay($_[STATE] => 10);  
     }  
972     },     },
973    );    );
974    
# Line 914  POE::Session->create( inline_states => Line 976  POE::Session->create( inline_states =>
976    
977  my $httpd = POE::Component::Server::HTTP->new(  my $httpd = POE::Component::Server::HTTP->new(
978          Port => $http_port,          Port => $http_port,
979            PreHandler => {
980                    '/' => sub {
981                            $_[0]->header(Connection => 'close')
982                    }
983            },
984          ContentHandler => { '/' => \&root_handler },          ContentHandler => { '/' => \&root_handler },
985          Headers        => { Server => 'irc-logger' },          Headers        => { Server => 'irc-logger' },
986  );  );
# Line 959  sub root_handler { Line 1026  sub root_handler {
1026          my ($request, $response) = @_;          my ($request, $response) = @_;
1027          $response->code(RC_OK);          $response->code(RC_OK);
1028    
1029            # this doesn't seem to work, so moved to PreHandler
1030            #$response->header(Connection => 'close');
1031    
1032          return RC_OK if $request->uri =~ m/favicon.ico$/;          return RC_OK if $request->uri =~ m/favicon.ico$/;
1033    
1034          my $q;          my $q;
# Line 973  sub root_handler { Line 1043  sub root_handler {
1043    
1044          my $search = $q->param('search') || $q->param('grep') || '';          my $search = $q->param('search') || $q->param('grep') || '';
1045    
1046          if ($request->url =~ m#/rss(?:/(tags)(?:=(\d+))?)?#i) {          if ($request->url =~ m#/rss(?:/(tags|last-tag|follow.*)\w*(?:=(\d+))?)?#i) {
1047                  my $show = lc($1);                  my $show = lc($1);
1048                  my $arg = $2 || 50;                  my $nr = $2;
1049    
1050                  my $type = 'RSS';       # Atom                  my $type = 'RSS';       # Atom
1051    
# Line 985  sub root_handler { Line 1055  sub root_handler {
1055                  #warn "create $type feed from ",dump( @last_tags );                  #warn "create $type feed from ",dump( @last_tags );
1056    
1057                  my $feed = XML::Feed->new( $type );                  my $feed = XML::Feed->new( $type );
1058                    $feed->link( $url );
1059    
1060                  if ( $show eq 'tags' ) {                  if ( $show eq 'tags' ) {
1061                            $nr ||= 50;
1062                          $feed->title( "tags from $CHANNEL" );                          $feed->title( "tags from $CHANNEL" );
1063                          $feed->link( "$url/tags" );                          $feed->link( "$url/tags" );
1064                          $feed->description( "tag cloud created from messages on channel $CHANNEL which have tags// in them" );                          $feed->description( "tag cloud created from messages on channel $CHANNEL which have tags// in them" );
1065                          my $feed_entry = XML::Feed::Entry->new($type);                          my $feed_entry = XML::Feed::Entry->new($type);
1066                          $feed_entry->title( "$arg tags from $CHANNEL" );                          $feed_entry->title( "$nr tags from $CHANNEL" );
1067                          $feed_entry->author( $NICK );                          $feed_entry->author( $NICK );
1068                          $feed_entry->link( '/#tags'  );                          $feed_entry->link( '/#tags'  );
1069    
# Line 999  sub root_handler { Line 1071  sub root_handler {
1071                                  qq{<![CDATA[<style type="text/css">}                                  qq{<![CDATA[<style type="text/css">}
1072                                  . $cloud->css                                  . $cloud->css
1073                                  . qq{</style>}                                  . qq{</style>}
1074                                  . $cloud->html( $arg )                                  . $cloud->html( $nr )
1075                                  . qq{]]>}                                  . qq{]]>}
1076                          );                          );
1077                          $feed->add_entry( $feed_entry );                          $feed->add_entry( $feed_entry );
1078    
1079                  } else {                  } elsif ( $show eq 'last-tag' ) {
1080    
1081                            $nr ||= $last_x_tags;
1082                            $nr = $last_x_tags if $nr > $last_x_tags;
1083    
1084                          $feed->title( "last $last_x_tags from $CHANNEL" );                          $feed->title( "last $nr tagged messages from $CHANNEL" );
                         $feed->link( $url );  
1085                          $feed->description( "collects messages which have tags// in them" );                          $feed->description( "collects messages which have tags// in them" );
1086    
1087                          foreach my $m ( @last_tags ) {                          foreach my $m ( @last_tags ) {
# Line 1021  sub root_handler { Line 1095  sub root_handler {
1095    
1096                                  my $message = $filter->{message}->( $m->{message} );                                  my $message = $filter->{message}->( $m->{message} );
1097                                  $message .= "<br/>\n" unless $message =~ m!<(/p|br/?)>!;                                  $message .= "<br/>\n" unless $message =~ m!<(/p|br/?)>!;
1098                                  warn "## message = $message\n";  #                               warn "## message = $message\n";
                                 from_to( $message, $ENCODING, 'UTF-8' );  
1099    
1100                                  #$feed_entry->summary(                                  #$feed_entry->summary(
1101                                  $feed_entry->content(                                  $feed_entry->content(
# Line 1030  sub root_handler { Line 1103  sub root_handler {
1103                                  );                                  );
1104                                  $feed_entry->category( join(', ', @{$m->{tags}}) );                                  $feed_entry->category( join(', ', @{$m->{tags}}) );
1105                                  $feed->add_entry( $feed_entry );                                  $feed->add_entry( $feed_entry );
1106    
1107                                    $nr--;
1108                                    last if $nr <= 0;
1109    
1110                          }                          }
1111    
1112                    } elsif ( $show =~ m/^follow/ ) {
1113    
1114                            $feed->title( "Feeds which this bot follows" );
1115    
1116                            my $sth = $dbh->prepare( qq{ select * from feeds order by last_update desc } );
1117                            $sth->execute;
1118                            while (my $row = $sth->fetchrow_hashref) {
1119                                    my $feed_entry = XML::Feed::Entry->new($type);
1120                                    $feed_entry->title( $row->{name} );
1121                                    $feed_entry->link( $row->{url}  );
1122                                    $feed_entry->issued( DateTime::Format::Flexible->build( $row->{last_update} ) );
1123                                    $feed_entry->content(
1124                                            '<![CDATA[<pre>' . dump( $row ) . '</pre>]]>'
1125                                    );
1126                                    $feed->add_entry( $feed_entry );
1127                            }
1128    
1129                    } else {
1130                            _log "unknown rss request ",$request->url;
1131                            return RC_DENY;
1132                  }                  }
1133    
1134                  $response->content( $feed->as_xml );                  $response->content( $feed->as_xml );
# Line 1041  sub root_handler { Line 1139  sub root_handler {
1139                  warn "$@";                  warn "$@";
1140          }          }
1141    
1142          $response->content_type("text/html; charset=$ENCODING");          $response->content_type("text/html; charset=UTF-8");
1143    
1144          my $html =          my $html =
1145                  qq{<html><head><title>$NICK</title><style type="text/css">$style}                  qq{<html><head><title>$NICK</title><style type="text/css">$style}
# Line 1090  sub root_handler { Line 1188  sub root_handler {
1188                                  $cal->weekdays('MON','TUE','WED','THU','FRI');                                  $cal->weekdays('MON','TUE','WED','THU','FRI');
1189                                  ($l_yyyy,$l_mm) = ($yyyy,$mm);                                  ($l_yyyy,$l_mm) = ($yyyy,$mm);
1190                          }                          }
1191                          $cal->setcontent($dd, qq{                          $cal->setcontent($dd, qq[
1192                                  <a href="$url?date=$row->{date}">$row->{nr}</a><br/>$row->{len}                                  <a href="$url?date=$row->{date}">$row->{nr}</a><br/>$row->{len}
1193                          });                          ]) if $cal;
1194                                                    
1195                  }                  }
1196                  $html .= qq{<td valign="top">} . $cal->as_HTML() . qq{</td></tr></table>};                  $html .= qq{<td valign="top">} . $cal->as_HTML() . qq{</td></tr></table>};

Legend:
Removed from v.78  
changed lines
  Added in v.92

  ViewVC Help
Powered by ViewVC 1.1.26