# 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::PageStats;
use strict;
use DW::SiteScheme;
my $all_modules;
# loads a page stat tracker
sub new {
my ($class) = @_;
unless ( defined $all_modules ) {
$all_modules = [ LJ::ModuleLoader::module_subclasses('DW::PageStats') ];
}
my $self = {
conf => {
_active => $all_modules,
},
ctx => '',
};
bless $self, $class;
return $self;
}
# render JS output for embedding in pages
# ctx can be "journal" or "app". defaults to "app".
sub render {
my ($self) = @_;
my $ctx = $self->get_context;
return '' unless $self->should_do_pagestats;
my $output = '';
foreach my $plugin ( $self->get_active_plugins ) {
my $class = $plugin;
eval "use $class; 1;";
die "Error loading PageStats '$plugin': $@" if $@;
my $plugin_obj = $class->new;
next unless $plugin_obj->should_render;
$output .= $plugin_obj->_render( conf => $self->{conf}->{$plugin} );
}
# return nothing
return
"
$output
";
}
# render JS output that goes into the tags
sub render_head {
my ($self) = @_;
my $ctx = $self->get_context;
return '' unless $self->should_do_pagestats;
my $output = '';
foreach my $plugin ( $self->get_active_plugins ) {
my $class = $plugin;
eval "use $class; 1;";
die "Error loading PageStats '$plugin': $@" if $@;
my $plugin_obj = $class->new;
next unless $plugin_obj->should_render;
$output .= $plugin_obj->_render_head( conf => $self->{conf}->{$plugin} );
}
return $output;
}
sub _render {
return "";
}
sub _render_head {
return "";
}
# method on root object (LJ::PageStats instance) to decide if user has
# opted-out of page stats tracking. Note: this isn't pagestat-specific logic.
# that's in the "should_render" method.
sub should_do_pagestats {
my $self = shift;
my $u = $self->get_user;
my $ctx = $self->get_context;
if ( $ctx && $ctx eq 'journal' ) {
return 0 if $u && $u->exclude_from_own_stats && $u->equals( LJ::get_active_journal() );
}
return 1;
}
# decide if tracker should be embedded in page
sub should_render {
my ($self) = @_;
my $ctx = $self->get_context;
return 0 unless ( $ctx && $ctx =~ /^(app|journal)$/ );
my $r = DW::Request->get or return 0;
# Make sure we don't exclude tracking from this page or path
return 0 if grep { $r->uri =~ /$_/ } @{ $LJ::PAGESTATS_EXCLUDE{'uripath'} };
# See if their ljuniq cookie has the PageStats flag
if ( $r->cookie('ljuniq') =~ /[a-zA-Z0-9]{15}:\d+:pgstats([01])/ ) {
return 0 unless $1; # Don't serve PageStats if it is "pgstats:0"
}
else {
return 0; # They don't have it set this request, but will for the next one
}
return 1;
}
sub get_context {
my ($self) = @_;
return LJ::get_active_journal() ? 'journal' : 'app';
}
sub get_user {
my ($self) = @_;
return LJ::get_remote();
}
# return Apache request
sub get_request {
my ($self) = @_;
return BML::get_request();
}
sub get_root {
my ($self) = @_;
return $LJ::SITEROOT;
}
sub get_active_plugins {
my ($self) = @_;
my $conf = $self->get_conf;
return () unless $conf;
return @{ $conf->{_active} || [] };
}
sub get_conf {
my ($self) = @_;
return $self->{conf};
}
sub filename {
my ($self) = @_;
my $r = $self->get_request;
my $filename = $r->filename;
$filename =~ s!$LJ::HOME/(?:ssldocs|htdocs)!!;
return $filename;
}
sub journaltype {
my $self = shift;
my $j = LJ::get_active_journal();
return $j->journaltype_readable;
}
sub journalbase {
my $self = shift;
my $j = LJ::get_active_journal();
return $j->journal_base;
}
sub is_journal_ctx {
my $self = shift;
my $ctx = $self->get_context;
return 1 if ( $ctx eq 'journal' );
return 0;
}
# not implemented for livejournal
sub groups {
my ($self) = @_;
return undef;
}
sub scheme {
return DW::SiteScheme->current;
}
sub language {
my ($self) = @_;
my $lang = LJ::Lang::get_effective_lang();
return $lang;
}
sub loggedin {
my ($self) = @_;
my $loggedin = $self->get_user ? '1' : '0';
return $loggedin;
}
sub campaign_tracking {
my ( $self, $opts ) = @_;
return '' unless $self->should_do_pagestats;
my $output = '';
foreach my $plugin ( $self->get_active_plugins ) {
my $class = $plugin;
eval "use $class; 1;";
die "Error loading PageStats '$plugin': $@" if $@;
my $plugin_obj = $class->new;
next unless $plugin_obj->should_render;
next unless ( $plugin_obj->can('campaign_track_html') );
$output .= $plugin_obj->campaign_track_html($opts);
}
return $output;
}
1;