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]