mourningdove/cgi-bin/LJ/NotificationMethod.pm
2026-05-24 01:03:05 +00:00

124 lines
3.5 KiB
Perl

# This code was forked from the LiveJournal project owned and operated
# by Live Journal, Inc. The code has been modified and expanded by
# Dreamwidth Studios, LLC. These files were originally licensed under
# the terms of the license supplied by Live Journal, Inc, which can
# currently be found at:
#
# http://code.livejournal.org/trac/livejournal/browser/trunk/LICENSE-LiveJournal.txt
#
# In accordance with the original license, this code and all its
# modifications are provided under the GNU General Public License.
# A copy of that license can be found in the LICENSE file included as
# part of this distribution.
package LJ::NotificationMethod;
use strict;
use Carp qw/ croak /;
use LJ::Typemap;
use LJ::NotificationMethod::Email;
use LJ::NotificationMethod::Inbox;
# this is basically just an interface
# Mischa's contribution: "straight up"
sub new { croak "can't instantiate base LJ::NotificationMethod" }
sub notify { croak "can't call notification on LJ::NotificationMethod base class" }
sub title { croak "can't call title on LJ::NotificationMethod base class" }
sub can_digest { 0 }
# subclasses have to override
sub configured { 0 } # system-wide configuration
sub configured_for_user { my ( $class, $u ) = @_; return 0; }
# override where applicable
sub disabled_url { undef }
sub url { undef }
sub help_url { undef }
# run a hook to see if a user can receive these kinds of notifications
sub available_for_user {
my ( $class, $u ) = @_;
my $available = LJ::Hooks::run_hook( 'notificationmethod_available_for_user', $class, $u );
return defined $available ? $available : 1;
}
sub new_from_subscription {
my ( $class, $subscription ) = @_;
my $sub_class = $class->class( $subscription->ntypeid )
or return undef;
return $sub_class->new_from_subscription($subscription);
}
# this should return a unique identifier for this notification method
# so that we don't send more than one of the same notification
# override this if implementing extra properties
# instance method
sub unique {
my $self = shift;
croak "Unique is an instance method" unless ref $self;
return $self->class;
}
# get the typemap for the notifytype classes (class/instance method)
sub typemap {
return LJ::Typemap->new(
table => 'notifytypelist',
classfield => 'class',
idfield => 'ntypeid',
);
}
# returns the class name, given an ntypid
sub class {
my ( $class, $typeid ) = @_;
my $tm = $class->typemap
or return undef;
$typeid ||= $class->ntypeid;
croak "Invalid typeid" unless $typeid;
return $tm->typeid_to_class($typeid);
}
# returns the notifytypeid for this site.
# don't override this in subclasses.
sub ntypeid {
my ($class_self) = @_;
my $class = ref $class_self ? ref $class_self : $class_self;
my $tm = $class->typemap
or return undef;
return $tm->class_to_typeid($class);
}
# Class method
# Returns ntypeid given an event name
sub method_to_ntypeid {
my ( $class, $meth_name ) = @_;
$meth_name = "LJ::NotificationMethod::$meth_name"
unless $meth_name =~ /^LJ::NotificationMethod::/;
return eval { $meth_name->ntypeid };
}
# this returns a list of all possible notification method classes
# class method
*all_classes = \&all_available_methods;
sub all_available_methods {
my $class = shift;
croak "all_classes is a class method" unless $class;
return grep { LJ::is_enabled($_) && $_->configured } @LJ::NOTIFY_TYPES;
}
1;