From 4b34881adc9c508c59b4461f89708e300d04a34e Mon Sep 17 00:00:00 2001 From: David Phillips Date: Sun, 21 May 2017 20:06:53 +1200 Subject: Separate functionalities into modules --- idalius.pl | 72 ++++++----------------------------------------------- plugin/tittilate.pm | 36 +++++++++++++++++++++++++++ plugin/url_title.pm | 62 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 105 insertions(+), 65 deletions(-) create mode 100644 plugin/tittilate.pm create mode 100644 plugin/url_title.pm diff --git a/idalius.pl b/idalius.pl index 4bf1544..9c1483b 100755 --- a/idalius.pl +++ b/idalius.pl @@ -8,8 +8,7 @@ use POE::Kernel; use POE::Component::IRC; use POE::Component::IRC::Plugin::NickServID; use config_file; -use HTTP::Tiny; -use HTML::HeadParser; +use Module::Pluggable search_path => "plugin", instantiate => 'configure'; my $config_file = "bot.conf"; my %config = config_file::parse_config($config_file); @@ -22,6 +21,8 @@ my $current_nick = $config{nick}; +$config{url_on}; +$config{url_len}; +my @plugin_list = plugins("dummy", \%config); + # New PoCo-IRC object my $irc = POE::Component::IRC->spawn( UseSSL => $config{usessl}, @@ -64,43 +65,6 @@ sub drop_priv { setuid($config{uid}) or die "Failed to setuid: $!\n"; } -sub url_get_title -{ - my $url = $_[0]; - my $http = HTTP::Tiny->new((default_headers => {accept => 'text/html'}, timeout => 5, agent => "Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0")); - - my $response = $http->get($url); - - if (!$response->{success}) { - print "Something broke: $response->{reason}\n"; - return; - } - - if (!($response->{headers}->{"content-type"} =~ m,text/html ?,)) { - print("Not html, giving up now\n"); - return; - } - - my $html = $response->{content}; - - my $parser = HTML::HeadParser->new; - $parser->parse($html); - - # get title and unpack from utf8 (assumption) - my $title = $parser->header("title"); - return unless $title; - - my $shorturl = $url; - $shorturl = (substr $url, 0, $config{url_len}) . "…" if length ($url) > $config{url_len}; - - # remove http(s):// to avoid triggering other poorly configured bots - $shorturl =~ s,^https?://,,g; - $shorturl =~ s,/$,,g; - - my $composed_title = "$title ($shorturl)"; - return $composed_title; -} - sub _start { my $heap = $_[HEAP]; my $irc = $heap->{irc}; @@ -151,33 +115,11 @@ sub irc_public { # reject ignored nicks first return if (grep {$_ eq $nick} @{$config{ignore}}); - my $me = $irc->nick_name; - - if ($config{url_on} and $what =~ /(https?:\/\/[^ ]+)/i) - { - my $title = url_get_title($1); - if ($title) { - print "Title: $title\n"; - $irc->yield(privmsg => $channel => $title); - } - } - - my $gathered = ""; - my @expressions = (keys %{$config{triggers}}); - my $expression = join '|', @expressions; - while ($what =~ /($expression)/gi) { - my $matched = $1; - my $key; - # figure out which key matched - foreach (@expressions) { - if ($matched =~ /$_/i) { - $key = $_; - last; - } - } - $gathered .= $config{triggers}->{$key}; + for my $module (@plugin_list) { + print "Module $module"; + my $output = $module->message($irc->nick_name, $who, $where, $what); + $irc->yield(privmsg => $where => $output) if $output; } - $irc->yield(privmsg => $channel => $gathered) if $gathered; return; } diff --git a/plugin/tittilate.pm b/plugin/tittilate.pm new file mode 100644 index 0000000..a1ea7f3 --- /dev/null +++ b/plugin/tittilate.pm @@ -0,0 +1,36 @@ +#!/usr/bin/env perl + +package plugin::tittilate; + +use strict; +use warnings; + +my %config; + +sub configure { + my $self = $_[0]; + my $cref = $_[1]; + %config = %$cref; + return $self; +} + +sub message { + my ($self, $me, $who, $where, $what) = @_; + my $gathered = ""; + my @expressions = (keys %{$config{triggers}}); + my $expression = join '|', @expressions; + while ($what =~ /($expression)/gi) { + my $matched = $1; + my $key; + # figure out which key matched + foreach (@expressions) { + if ($matched =~ /$_/i) { + $key = $_; + last; + } + } + $gathered .= $config{triggers}->{$key}; + } + return $gathered; +} +1; diff --git a/plugin/url_title.pm b/plugin/url_title.pm new file mode 100644 index 0000000..2a2258b --- /dev/null +++ b/plugin/url_title.pm @@ -0,0 +1,62 @@ +#!/usr/bin/env perl + +package plugin::url_title; + +use strict; +use warnings; +use HTTP::Tiny; +use HTML::HeadParser; + +my %config; + +sub configure { + my $self = $_[0]; + my $cref = $_[1]; + %config = %$cref; + return $self; +} + +sub message +{ + my ($self, $me, $who, $where, $what) = @_; + my $url; + + if ($what =~ /(https?:\/\/[^ ]+)/i) { + $url = $1; + } + return unless $url; + + my $http = HTTP::Tiny->new((default_headers => {accept => 'text/html'}, timeout => 5)); + + my $response = $http->get($url); + + if (!$response->{success}) { + print "Something broke: $response->{reason}\n"; + return; + } + + if (!($response->{headers}->{"content-type"} =~ m,text/html ?,)) { + print("Not html, giving up now\n"); + return; + } + + my $html = $response->{content}; + + my $parser = HTML::HeadParser->new; + $parser->parse($html); + + # get title and unpack from utf8 (assumption) + my $title = $parser->header("title"); + return unless $title; + + my $shorturl = $url; + $shorturl = (substr $url, 0, $config{url_len}) . "…" if length ($url) > $config{url_len}; + + # remove http(s):// to avoid triggering other poorly configured bots + $shorturl =~ s,^https?://,,g; + $shorturl =~ s,/$,,g; + + my $composed_title = "$title ($shorturl)"; + return $composed_title; +} +1; -- cgit v1.1