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 )