Bot-BasicBot-Pluggable-Module-Notify
view release on metacpan or search on metacpan
lib/Bot/BasicBot/Pluggable/Module/Notify.pm view on Meta::CPAN
} elsif($nick && $emails{$nick}) {
$self->_send_email(1,$mess,$nick);
$users{$nick} = 1; # we only send 1 email per user
@recipients = grep { $_ ne $nick } @recipients; # don't send repeated mails
}
}
return 1 if(any { $_ == 1 } values %users);
return 0;
}
#############################################################################
# Private Methods #
#############################################################################
sub _send_email {
my ($self,$type,$mess,@users) = @_;
my $subject = sprintf "IRC: %s sent you a message",
$mess->{who};
my $body = sprintf "Hi,\n\n%s sent the following message in channel %s at %s %s:\n\n%s\n\n",
$mess->{who},
$mess->{channel},
DateTime->now->ymd, DateTime->now->hms,
$mess->{body};
my $data = $self->bot->channel_data( $mess->{channel} );
my %channel = map { $_ => 1 } keys %$data; # get users in channel
for my $user (@users) {
my $nick = $self->_match_user($user, $self->{nicks});
next unless($nick);
# if user is in channel, they must be inactive for at least 15 minues
# if the user is not in the channel, send them an email, even if they
# were recently active, as they have likely just left.
if($channel{$user}) {
my $seen = $self->store->get( 'Seen', "seen_$user");
if($seen && $seen->{'time'}) {
my $time = time - $seen->{'time'};
next if($time < $settings{active} * 60);
next if($time > 3600 && $type == 2);
}
}
$self->_sendmail(
to => $emails{$nick}{email},
subject => $subject,
body => $body
);
}
}
sub _load_notification_file {
my $self = shift;
my $fn = $self->store->get( 'notify', 'notifications' ) or return 0;
return 0 unless(-r $fn); # file must be readable
my $mod = (stat($fn))[9];
return 1 if($mod <= $load_time && keys %emails); # don't reload if not modified
my $fh = IO::File->new($fn,'r') or return 0;
(%settings,%emails) = ();
while(<$fh>) {
s/\s+$//;
next if(/^#/ || /^$/);
my ($nick,$ident,$email) = split(/,/,$_,3);
if($nick eq 'CONFIG') {
$settings{$ident} = $email;
next;
}
$emails{$nick}{email} = $email;
$emails{$nick}{ident} = $ident if($ident);
}
$fh->close;
$load_time = $mod;
for my $key (keys %defaults) {
$settings{$key} ||= $defaults{$key};
}
return 0 unless($settings{smtp});
return 1 if(keys %emails);
return 0;
}
sub _match_user {
my ($self,$user,$nicks) = @_;
# matches a known user
return $user if($emails{$user});
# see if idents match
for my $ident (keys %emails) {
next unless($emails{$ident}{ident});
for my $nick (keys %$nicks) {
next unless($user eq $nick);
return $ident if($nicks->{$nick}->{Real} =~ /\Q$emails{$ident}{ident}\E/);
return $ident if($nicks->{$nick}->{User} =~ /\Q$emails{$ident}{ident}\E/);
return $ident if($nicks->{$nick}->{Userhost} =~ /\Q$emails{$ident}{ident}\E/);
}
}
return;
}
sub _sendmail {
my ($self,%hash) = @_;
MIME::Lite->send('smtp', $settings{smtp}, Timeout=>60);
my $mail = MIME::Lite->new(
'Reply-To' => $settings{replyto},
'From' => $settings{from},
( run in 0.546 second using v1.01-cache-2.11-cpan-ed4147ee29a )