88 lines
2.8 KiB
Perl
88 lines
2.8 KiB
Perl
#!/usr/bin/perl
|
|
#
|
|
# DW::Task::ESN::ProcessSub
|
|
#
|
|
# ESN worker to do final subscription processing.
|
|
#
|
|
# Authors:
|
|
# Mark Smith <mark@dreamwidth.org>
|
|
#
|
|
# Copyright (c) 2019 by Dreamwidth Studios, LLC.
|
|
#
|
|
# This program is free software; you may redistribute it and/or modify it under
|
|
# the same terms as Perl itself. For a copy of the license, please reference
|
|
# 'perldoc perlartistic' or 'perldoc perlgpl'.
|
|
#
|
|
|
|
package DW::Task::ESN::ProcessSub;
|
|
|
|
use strict;
|
|
use v5.10;
|
|
use Log::Log4perl;
|
|
my $log = Log::Log4perl->get_logger(__PACKAGE__);
|
|
|
|
use LJ::Event;
|
|
|
|
use base 'DW::Task';
|
|
|
|
sub work {
|
|
my $self = $_[0];
|
|
my $a = $self->args;
|
|
|
|
my $failed = sub {
|
|
$log->error( sprintf( $_[0], @_[ 1 .. $#_ ] ) );
|
|
return DW::Task::FAILED;
|
|
};
|
|
|
|
my ( $userid, $subid, $eparams ) = @$a;
|
|
Log::Log4perl::MDC->put( 'userid', $userid );
|
|
|
|
my $u = LJ::load_userid($userid)
|
|
or return $failed->( 'Failed to load user: %d', $userid );
|
|
Log::Log4perl::MDC->put( 'user', $u->user );
|
|
|
|
$log->debug( 'Processing event for user: ', $u->user, '(', $u->id, ') subscription ', $subid );
|
|
|
|
my $evt = LJ::Event->new_from_raw_params(@$eparams)
|
|
or return $failed->( 'Failed to get event from params: %s', join( ', ', @$eparams ) );
|
|
$evt->configure_logger;
|
|
|
|
my $subsc = $evt->get_subscriptions( $u, $subid )
|
|
or return $failed->(
|
|
'Failed to get subscriptions for: %s(%d) subid %d event (%s)',
|
|
$u->user, $u->id, $subid, join( ', ', @$eparams )
|
|
);
|
|
|
|
# if the subscription doesn't exist anymore, we're done here
|
|
# (race: if they delete the subscription between when we start processing
|
|
# events and when we get here, LJ::Subscription->new_by_id will return undef)
|
|
# We won't reach here if we get DB errors because new_by_id will die, so we're
|
|
# safe to mark the job completed and return.
|
|
unless ($subsc) {
|
|
$log->debug('Subscription not found on load, skipping notification.');
|
|
return DW::Task::COMPLETED;
|
|
}
|
|
|
|
# If the user hasn't logged in in a year, complete the sub and let's
|
|
# move on
|
|
my $user_idle_days = int( ( time() - $u->get_timeactive ) / 86400 );
|
|
if ( $user_idle_days > 365 && !$LJ::_T_CONFIG ) {
|
|
$log->debug('User inactive, skipping notification.');
|
|
return DW::Task::COMPLETED;
|
|
}
|
|
|
|
# if the user deleted their account (or otherwise isn't visible), bail
|
|
unless ( $u->is_visible || $evt->is_significant ) {
|
|
$log->debug('User not visible, and event is not significant, skipping notification.');
|
|
return DW::Task::COMPLETED;
|
|
}
|
|
|
|
# Send notification.
|
|
$subsc->process($evt)
|
|
or return $failed->(
|
|
"Failed to process notification method for userid=$userid/subid=$subid, evt=[@$eparams]");
|
|
return DW::Task::COMPLETED;
|
|
}
|
|
|
|
1;
|
|
|