package POE::Component::IRC::Plugin::Syntax::Highlight::HTML; use warnings; use strict; our $VERSION = '0.0101'; use base 'POE::Component::IRC::Plugin::BasePoCoWrap'; use POE::Component::Syntax::Highlight::HTML; sub _make_default_args { return ( coloring => 1, pastebin_trigger => '[irc_to_pastebin]', response_event => 'irc_html_highlighter', trigger => qr/^highlight\s*html\s+(?=\S)/i, ); } sub _make_poco { return POE::Component::Syntax::Highlight::HTML->spawn( debug => shift->{debug}, ); } sub _make_response_message { my $self = shift; my $in_ref = shift; my $prefix = ''; $in_ref->{_type} eq 'public' and $prefix = (split /!/, $in_ref->{_who})[0] . ', '; exists $in_ref->{error} and return "$prefix$in_ref->{error}"; if ( $self->{coloring} ) { $in_ref->{out} = _css_coloring() . "\n\n\n\n$in_ref->{out}"; } return "$prefix see [irc_to_pastebin]$in_ref->{out}"; } sub _message_into_response_event { 'out' } sub _make_poco_call { my $self = shift; my $data_ref = shift; my $uri = delete $data_ref->{what}; $uri =~ s/^\s+|\s+\z//g; $self->{poco}->parse( { event => '_poco_done', uri => $uri, map +( "_$_" => $data_ref->{$_} ), keys %$data_ref, } ); } sub _css_coloring { return <<'END'; END } 1; __END__ =head1 NAME POE::Component::IRC::Plugin::Syntax::Highlight::HTML - IRC plugin to highlight HTML code from URIs =head1 SYNOPSIS use strict; use warnings; use POE qw( Component::IRC Component::IRC::Plugin::OutputToPastebin Component::IRC::Plugin::Syntax::Highlight::HTML ); my $irc = POE::Component::IRC->spawn( nick => 'HTMLHighlighterBot', server => 'irc.freenode.net', port => 6667, ircname => 'HTMLHighlighterBot', ); POE::Session->create( package_states => [ main => [ qw(_start irc_001) ], ], ); $poe_kernel->run; sub _start { $irc->yield( register => 'all' ); $irc->plugin_add( 'Paster' => POE::Component::IRC::Plugin::OutputToPastebin->new ); $irc->plugin_add( 'HTMLHighlighter' => POE::Component::IRC::Plugin::Syntax::Highlight::HTML->new ); $irc->yield( connect => {} ); } sub irc_001 { $_[KERNEL]->post( $_[SENDER] => join => '#zofbot' ); } HTMLHighlighterB, highlight html http://zoffix.com/ Zoffix, see http://erxz.com/pb/13194 HTMLHighlighterB, highlight html http://zoffix.com/not_found.html Zoffix, 404 Not Found =head1 IMPORTANT IMPORTANT IMPORTANT Unless you are going to manually generate responses into IRC from events or you enjoy huge spams, you need to use L along with this module. =head1 DESCRIPTION This module is a L plugin which uses L for its base. It provides interface to fetch HTML code from URIs, do syntax highlighting using L and pastebin the result. The plugin accepts input from public channel events, C messages as well as C (private messages); although that can be configured at will. The plugin is non-blocking. =head1 CONSTRUCTOR =head2 C # plain and simple $irc->plugin_add( 'HTMLHighlighter' => POE::Component::IRC::Plugin::Syntax::Highlight::HTML->new ); # juicy flavor $irc->plugin_add( 'HTMLHighlighter' => POE::Component::IRC::Plugin::Syntax::Highlight::HTML->new( coloring => 1, pastebin_trigger => '[irc_to_pastebin]', auto => 1, response_event => 'irc_html_highlighter', banned => [ qr/aol\.com$/i ], addressed => 1, root => [ qr/mah.net$/i ], trigger => qr/^highlight\s*html\s+(?=\S)/i, triggers => { public => qr/^highlight\s*html\s+(?=\S)/i, notice => qr/^highlight\s*html\s+(?=\S)/i, privmsg => qr/^highlight\s*html\s+(?=\S)/i, }, listen_for_input => [ qw(public notice privmsg) ], eat => 1, debug => 0, ) ); The C method constructs and returns a new C object suitable to be fed to L's C method. The constructor takes a few arguments, but I. The possible arguments/values are as follows: =head3 C ->new( coloring => 1, ); B. If set to a true value the plugin will add some CSS code that can be used for coloring the highlighted HTML code. B C<1> =head3 C ->new( pastebin_trigger => '[irc_to_pastebin]', ); B. You'll need to read the docs for L to understand this one.. or just leave everything at defaults and forget about it... This is the "trigger" or "tag" that L looks for; you can set it via C argument in L. =head3 C ->new( auto => 0 ); B. Takes either true or false values, specifies whether or not the plugin should auto respond to requests. When the C argument is set to a true value plugin will respond to the requesting person with the results automatically. When the C argument is set to a false value plugin will not respond and you will have to listen to the events emited by the plugin to retrieve the results (see EMITED EVENTS section and C argument for details). B C<1>. =head3 C ->new( response_event => 'event_name_to_recieve_results' ); B. Takes a scalar string specifying the name of the event to emit when the results of the request are ready. See EMITED EVENTS section for more information. B C =head3 C ->new( banned => [ qr/aol\.com$/i ] ); B. Takes an arrayref of regexes as a value. If the usermask of the person (or thing) making the request matches any of the regexes listed in the C arrayref, plugin will ignore the request. B C<[]> (no bans are set). =head3 C ->new( root => [ qr/\Qjust.me.and.my.friend.net\E$/i ] ); B. As opposed to C argument, the C argument B access only to people whose usermasks match B of the regexen you specify in the arrayref the argument takes as a value. B it is not specified. B as opposed to C specifying an empty arrayref to C argument will restrict access to everyone. =head3 C ->new( trigger => qr/^highlight\s*html\s+(?=\S)/i ); B. Takes a regex as an argument. Messages matching this regex, irrelevant of the type of the message, will be considered as requests. See also B option below which is enabled by default as well as B option which is more specific. B the trigger will be B from the message, therefore make sure your trigger doesn't match the actual data (the URI) that needs to be processed. B C =head3 C ->new( triggers => { public => qr/^highlight\s*html\s+(?=\S)/i, notice => qr/^highlight\s*html\s+(?=\S)/i, privmsg => qr/^highlight\s*html\s+(?=\S)/i, } ); B. Takes a hashref as an argument which may contain either one or all of keys B, B and B which indicates the type of messages: channel messages, notices and private messages respectively. The values of those keys are regexes of the same format and meaning as for the C argument (see above). Messages matching this regex will be considered as requests. The difference is that only messages of type corresponding to the key of C hashref are checked for the trigger. B the C will be matched irrelevant of the setting in C, thus you can have one global and specific "local" triggers. See also B option below which is enabled by default as well as B option which is more specific. B the trigger will be B from the message, therefore make sure your trigger doesn't match the actual data that needs to be processed. B C =head3 C ->new( addressed => 1 ); B. Takes either true or false values. When set to a true value all the public messages must be I. In other words, if your bot's nickname is C and your trigger is C you would make the request by saying C. When addressed mode is turned on, the bot's nickname, including any whitespace and common punctuation character will be removed before matching the C (see above). When C argument it set to a false value, public messages will only have to match C regex in order to make a request. Note: this argument has no effect on C and C requests. B C<1> =head3 C ->new( listen_for_input => [ qw(public notice privmsg) ] ); B. Takes an arrayref as a value which can contain any of the three elements, namely C, C and C which indicate which kind of input plugin should respond to. When the arrayref contains C element, plugin will respond to requests sent from messages in public channels (see C argument above for specifics). When the arrayref contains C element plugin will respond to requests sent to it via C messages. When the arrayref contains C element, the plugin will respond to requests sent to it via C (private messages). You can specify any of these. In other words, setting C<( listen_for_input => [ qr(notice privmsg) ] )> will enable functionality only via C and C messages. B C<[ qw(public notice privmsg) ]> =head3 C ->new( eat => 0 ); B. If set to a false value plugin will return a C after responding. If eat is set to a true value, plugin will return a C after responding. See L documentation for more information if you are interested. B: C<1> =head3 C ->new( debug => 1 ); B. Takes either a true or false value. When C argument is set to a true value some debugging information will be printed out. When C argument is set to a false value no debug info will be printed. B C<0>. =head1 EMITED EVENTS =head2 C $VAR1 = { 'out' => 'Zoffix, see [irc_to_pastebin]