[SimBot-commits] CVS: simbot/plugins httpd.pl,1.14,1.15 recap.pl,1.21,1.22 sqlite-logger.pl,1.49,1.5
Status: Abandoned
Brought to you by:
kstange
|
From: Pete P. <fou...@us...> - 2005-08-10 11:51:08
|
Update of /cvsroot/simbot/simbot/plugins In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv16455/plugins Modified Files: httpd.pl recap.pl sqlite-logger.pl Log Message: - Added a template for the HTML IRC log. - Make recap use the - Removed row_hashref_to_html as it isn't used. - Removed f_nick. Any nickname formatting should be done in the template. - Added error pages. - Added templates for error pages. Currently only 401 and 500 are provided, other errors will be displayed using 500's template. Index: httpd.pl =================================================================== RCS file: /cvsroot/simbot/simbot/plugins/httpd.pl,v retrieving revision 1.14 retrieving revision 1.15 diff -u -d -p -r1.14 -r1.15 --- httpd.pl 9 Aug 2005 02:33:57 -0000 1.14 +++ httpd.pl 10 Aug 2005 11:50:59 -0000 1.15 @@ -56,48 +56,66 @@ sub index_handler { my ($req_root) = $request->uri =~ m|^/([^\?]*)|; &SimBot::debug(3, 'httpd: handling request for ' . $request->uri . ", req root $req_root\n"); + my $code = 500; # An error by default. - if(defined $SimBot::hash_plugin_httpd_pages{$req_root}) { + if($req_root && defined $SimBot::hash_plugin_httpd_pages{$req_root}) { my $handler = $SimBot::hash_plugin_httpd_pages{$req_root}->{'handler'}; - &$handler($request, $response, \&get_template); + $code = &$handler($request, $response, \&get_template); - if(defined $response->code && $response->code == RC_UNAUTHORIZED) { - $response->content('Bad login/pass or your browser does not know how to log in.'); - } elsif(!defined $response->content - || length $response->content == 0) - { - # Hey! Our plugin didn't do anything useful. - $response->code(RC_INTERNAL_SERVER_ERROR); - $response->content("something's broken"); - # FIXME: We need error pages... - } elsif(!defined $response->code) { - $response->code(RC_OK); # assume everything's OK + } else { + if($req_root) { # a page was requested, but we don't have it. + $code = RC_NOT_FOUND; + } else { + # do the index page + my $msg; + $msg .= "<ul>\n"; + foreach my $url (keys %SimBot::hash_plugin_httpd_pages) { + my $title = $SimBot::hash_plugin_httpd_pages{$url}->{'title'}; + + $msg .= qq(<li><a href="$url">$title</a>\n); + } + $msg .= "</ul>\n"; + + $code = RC_OK; + $response->push_header("Content-Type", "text/html"); + + my $template = &get_template('base'); + $template->param( + title => 'Index', + content => $msg, + ); + $response->content($template->output()); } - - $heap->{client}->put($response); - $kernel->yield('shutdown'); - return; } - my $msg; - $msg .= "<ul>\n"; - foreach my $url (keys %SimBot::hash_plugin_httpd_pages) { - my $title = $SimBot::hash_plugin_httpd_pages{$url}->{'title'}; - - $msg .= qq(<li><a href="$url">$title</a>\n); + if(!defined $code || int $code >= 300 || int $code < 200) { + # Plugin gave us no return value, or an error code, or an absurd number + # make the error page. + if(!defined $code || $code < 200 || $code >= 600) { + # no code, or code absurd. + $code = RC_INTERNAL_SERVER_ERROR; + } + my $err_template = &get_template("error.$code"); + if(!defined $err_template) { $err_template = &get_template('error.500'); } + if(!defined $err_template) { + $response->code(RC_INTERNAL_SERVER_ERROR); + $response->content("An internal error prevented us from completing your request, and no template was available for the error message."); + } else { + $response->code($code); + $err_template->param( + request_url => $request->uri, + ); + my $base_template = &get_template('base'); + $base_template->param( + content => $err_template->output(), + title => "$code " . status_message($code), + ); + $response->content($base_template->output()); + } + } - $msg .= "</ul>\n"; - - $response->code(RC_OK); - $response->push_header("Content-Type", "text/html"); - - my $template = &get_template('base'); - $template->param( - title => 'Index', - content => $msg, - ); - $response->content($template->output()); + $response->code($code); $heap->{client}->put($response); $kernel->yield('shutdown'); } @@ -111,7 +129,7 @@ sub get_template { } elsif(-r "templates/${template}.default.tmpl") { $file_name = "templates/${template}.default.tmpl"; } else { - &SimBot::debug(&SimBot::DEBUG_WARN, "httpd: No template $template available!"); + &SimBot::debug(&SimBot::DEBUG_WARN, "httpd: No template $template available!\n"); return; } @@ -131,13 +149,14 @@ sub admin_page { my ($request, $response) = @_; if(!defined &SimBot::option('plugin.httpd', 'admin_pass')) { - die "In admin_page with no password!"; + &SimBot::debug(&SimBot::DEBUG_WARN, "httpd: in admin_page with no password defined!\n"); + return 500; # internal server error } if(!defined $request->authorization_basic) { $response->www_authenticate('Basic realm="simbot admin"'); $response->code(RC_UNAUTHORIZED); - return; + return RC_UNAUTHORIZED; } my ($user, $pass) = $request->authorization_basic; if($user ne &SimBot::option('plugin.httpd', 'admin_user') @@ -146,7 +165,7 @@ sub admin_page { $response->www_authenticate = 'Basic realm="simbot admin"'; $response->code(RC_UNAUTHORIZED); - return; + return RC_UNAUTHORIZED; } my $msg; my $say; @@ -184,6 +203,7 @@ sub admin_page { content => $msg, ); $response->content($template->output()); + return RC_OK; } sub messup_httpd { Index: recap.pl =================================================================== RCS file: /cvsroot/simbot/simbot/plugins/recap.pl,v retrieving revision 1.21 retrieving revision 1.22 diff -u -d -p -r1.21 -r1.22 --- recap.pl 9 Aug 2005 02:31:41 -0000 1.21 +++ recap.pl 10 Aug 2005 11:50:59 -0000 1.22 @@ -122,6 +122,7 @@ sub recap_page { content => &SimBot::htmlize(join("\n", @backlog)), ); $response->content($template->output()); + return 200; } # Register Plugin Index: sqlite-logger.pl =================================================================== RCS file: /cvsroot/simbot/simbot/plugins/sqlite-logger.pl,v retrieving revision 1.49 retrieving revision 1.50 diff -u -d -p -r1.49 -r1.50 --- sqlite-logger.pl 7 Aug 2005 18:33:27 -0000 1.49 +++ sqlite-logger.pl 10 Aug 2005 11:50:59 -0000 1.50 @@ -697,13 +697,12 @@ sub row_hashref_to_text { return $msg; } -sub row_hashref_to_html { +# This turns the row hashref into a hashref with a human readable timestamp +# and user nicks instead of IDs. +sub row_hashref_to_template_hashref { my ($row) = @_; - my $msg = '<div class="row ' . lc($row->{'event'}) . '">'; - - - # timestamp + # TIMESTAMP my (undef, undef, undef, $cur_day, $cur_month, $cur_yr) = localtime; $cur_month += 1; # localtime gives us 0..11, we want 1..12 $cur_yr += 1900; # localtime gives us number of years since 1900 @@ -712,72 +711,36 @@ sub row_hashref_to_html { $month += 1; $yr += 1900; - $msg .= '<span class="ts">'; - + $row->{'timestamp'} = ''; if($cur_day != $day || $cur_month != $month || $cur_yr != $yr) { - $msg .= (MONTHS)[$month-1] . " $day "; + $row->{'timestamp'} .= (MONTHS)[$month-1] . " $day "; } - if($cur_yr != $yr) { $msg .= "$yr "; } + if($cur_yr != $yr) { $row->{'timestamp'} .= "$yr "; } - $msg .= $hr . ':' . sprintf('%02d',$min) . '</span> '; + $row->{'timestamp'} .= $hr . ':' . sprintf('%02d',$min); - # event -# $msg .= q(<span class=") . lc($row->{'event'}) . q(">); - $msg .= q(<span class="msg">); - if($row->{'event'} eq 'SAY') { - $msg .= '<' . &f_nick($row->{'source_nick_id'}) - . '> ' . f_content($row->{'content'}); - } elsif($row->{'event'} eq 'NOTICE') { - $msg .= '-' . &f_nick($row->{'source_nick_id'}) - . '- ' . f_content($row->{'content'}); - } elsif($row->{'event'} eq 'ACTION') { - $msg .= '* ' . &f_nick($row->{'source_nick_id'}) - . ' ' . f_content($row->{'content'}); - } elsif($row->{'event'} eq 'JOINED') { - $msg .= '* ' . &f_nick($row->{'source_nick_id'}) - . ' joined.'; - } elsif($row->{'event'} eq 'PARTED') { - $msg .= '* ' . &f_nick($row->{'source_nick_id'}) - . ' left (' . f_content($row->{'content'}) . ')'; - } elsif($row->{'event'} eq 'QUIT') { - $msg .= '* ' . &f_nick($row->{'source_nick_id'}) - . ' quit (' . f_content($row->{'content'}) . ')'; - } elsif($row->{'event'} eq 'TOPIC') { - $msg .= '* ' . &f_nick($row->{'source_nick_id'}) - . ' changed the topic to: ' . f_content($row->{'content'}); - } elsif($row->{'event'} eq 'MODE') { - $msg .= '* ' . &f_nick($row->{'source_nick_id'}) - . ' set ' . f_content($row->{'content'}); - } elsif($row->{'event'} eq 'KICKED') { - $msg .= '* ' . &f_nick($row->{'target_nick_id'}) - . ' was kicked by ' . &f_nick($row->{'source_nick_id'}) - . ' (' . f_content($row->{'content'}) . ')'; - } elsif($row->{'event'} eq 'NICK') { - $msg .= '* ' . &f_nick($row->{'source_nick_id'}) - . ' is now known as ' . &f_nick($row->{'target_nick_id'}); - - } else { # Oh, great, we forgot one. - $msg .= 'UNKNOWN EVENT ' . $row->{'event'} . ':'; - if(defined $row->{'source_nick_id'}) - { $msg .= ' source:' . &f_nick($row->{'source_nick_id'}); } - if(defined $row->{'target_nick_id'}) - { $msg .= ' target:' . &f_nick($row->{'target_nick_id'}); } - if(defined f_content($row->{'content'})) - { $msg .= ' content:' . f_content($row->{'content'}); } + # NICKS + if(defined $row->{'source_nick_id'}) { + $row->{'source_nick'} = + &get_nickchan_name($row->{'source_nick_id'}); } - $msg .= q(</span></div>); - return $msg; + if(defined $row->{'target_nick_id'}) { + $row->{'target_nick'} = + &get_nickchan_name($row->{'target_nick_id'}); + } + + # CONTENT + if(defined $row->{'content'}) { + $row->{'content'} = &f_content($row->{'content'}); + } + + return $row; } ### FORMATTING FUNCTIONS ### -sub f_nick { - return '<span class="nick">' - . &get_nickchan_name($_[0]) - . '</span>'; -} # f_content is used to format the content part of chat. # this does things like linkify URLs, escape characters that @@ -785,9 +748,6 @@ sub f_nick { sub f_content { my $content = encode_entities($_[0]); - # mask email - - # linkify $content = &linkify($content); @@ -866,25 +826,25 @@ sub seen_nlp_match { } sub web_request { - my ($request, $response) = @_; + my ($request, $response, $get_template) = @_; my $query = &create_query_hash($request->uri); if(defined $query->{'recap'}) { - &web_recap($query, $response); + return &web_recap($query, $response, $get_template); } else { - &web_log($query, $response); + return &web_log($query, $response, $get_template); } } sub web_recap { my ($query, $response) = @_; - + return 501; # not implemented } sub web_log { - my ($query, $response) = @_; + my ($query, $response, $get_template) = @_; my (undef, undef, undef, $start_day, $start_month, $start_year) = localtime; @@ -929,14 +889,6 @@ sub web_log { my $start_time = timelocal(0,$start_min,$start_hour,$start_day, $start_month-1, $start_year); my $end_time = timelocal(59,$end_min,$end_hour,$end_day, $end_month-1, $end_year); - - my $message = - '<div id="header">IRC log for ' - . &get_nickchan_name($channel_id) - . ' from ' . scalar localtime($start_time) - . ' to ' . scalar localtime($end_time) - . '. Generated ' . scalar localtime() - . "</div>\n"; my $log_query = $dbh->prepare_cached( 'SELECT time, source_nick_id, event, target_nick_id, content' @@ -949,11 +901,28 @@ sub web_log { $log_query->execute($channel_id, $start_time, $end_time); my $row; + my @loop_data; while($row = $log_query->fetchrow_hashref) { - $message .= &row_hashref_to_html($row) . "\n"; + push(@loop_data, &row_hashref_to_template_hashref($row)); } - $response->content($message); + + my $irclog_template = &$get_template('irclog'); + $irclog_template->param( + ircloop => \@loop_data, + channel => &get_nickchan_name($channel_id), + start_time => scalar localtime($start_time), + end_time => scalar localtime($end_time), + ); + + my $base_template = &$get_template('base'); + $base_template->param( + content => $irclog_template->output(), + title => 'IRC Log', + ); + + $response->content($base_template->output()); $response->push_header("Content-Type", "text/html"); + return 200; # OK } sub create_query_hash { |