232 lines
8.5 KiB
Perl
232 lines
8.5 KiB
Perl
# ==================================================================
|
|
# Plugins::MostPopular - Auto Generated Program Module
|
|
#
|
|
# Plugins::MostPopular
|
|
# Author : Virginia Lo
|
|
# Version : 1.0
|
|
# Updated : Tue Sep 4 11:23:30 2007
|
|
#
|
|
# ==================================================================
|
|
#
|
|
|
|
package Plugins::MostPopular;
|
|
# ==================================================================
|
|
|
|
use strict;
|
|
use GT::Base;
|
|
use GT::Plugins qw/STOP CONTINUE/;
|
|
use Links qw/:objects/;
|
|
|
|
# Inherit from base class for debug and error methods
|
|
@Plugins::MostPopular::ISA = qw(GT::Base);
|
|
|
|
# Your code begins here.
|
|
|
|
|
|
# PLUGIN HOOKS
|
|
# ===================================================================
|
|
|
|
|
|
sub jump_link {
|
|
# -----------------------------------------------------------------------------
|
|
# This subroutine will be called whenever the hook 'jump_link' is run. You
|
|
# should call $PLG->action(STOP) if you don't want the regular
|
|
# 'jump_link' code to run, otherwise the code will continue as normal.
|
|
#
|
|
$PLG->action(STOP);
|
|
my $links = $DB->table('Links');
|
|
my $id = $IN->param('ID') || $IN->param('Detailed');
|
|
my $action = $IN->param('action') || '';
|
|
my $goto = '';
|
|
my $rec = {};
|
|
|
|
if ($CFG->{framed_jump} and $id and $action eq 'jump_frame') {
|
|
my $error;
|
|
if ($id !~ /^\d+$/) {
|
|
$error = Links::language('JUMP_INVALIDID', $id);
|
|
}
|
|
else {
|
|
$rec = $links->select({ ID => $id }, VIEWABLE)->fetchrow_hashref;
|
|
unless ($rec) {
|
|
$error = Links::language('JUMP_INVALIDID', $id);
|
|
$rec = {};
|
|
}
|
|
elsif ($CFG->{build_detailed}) {
|
|
$rec->{detailed_url} = "$CFG->{build_detail_url}/" . $links->detailed_url($id);
|
|
}
|
|
}
|
|
print $IN->header();
|
|
print Links::SiteHTML::display('jump_frame', { error => $error, %$rec });
|
|
return;
|
|
}
|
|
|
|
# If we are chosing a random link, then get the total and go to one at random.
|
|
if (lc $id eq "random") {
|
|
my $offset = int rand $links->count(VIEWABLE);
|
|
$links->select_options("LIMIT 1 OFFSET $offset");
|
|
my $sth = $links->select(qw/ID URL/ => VIEWABLE);
|
|
($id, $goto) = $sth->fetchrow_array;
|
|
}
|
|
elsif (defined $id) {
|
|
if ($id !~ /^\d+$/) {
|
|
print $IN->header();
|
|
print Links::SiteHTML::display('error', { error => Links::language('JUMP_INVALIDID', $id) });
|
|
return;
|
|
}
|
|
|
|
# Find out if we're going to be displaying a file
|
|
my $col = $IN->param('v') || $IN->param('dl') || $IN->param('view') || $IN->param('download');
|
|
|
|
if ($col) {
|
|
# in this case, we need to know from what table we want to load our data from.
|
|
# It will by default pull information from the Links table, however if the
|
|
# DB=tablename option is used, it will apply the request to that table instead
|
|
my $table_name = $IN->param('DB') || 'Links';
|
|
|
|
unless ($table_name =~ m/^\w+$/) {
|
|
print $IN->header();
|
|
print Links::SiteHTML::display('error', { error => Links::language('FILE_TABLEFORMAT' ) });
|
|
return;
|
|
};
|
|
|
|
if ($table_name ne 'Links') {
|
|
eval { $links = $DB->table($table_name) };
|
|
if ($@) {
|
|
print $IN->header();
|
|
print Links::SiteHTML::display('error', { error => Links::language('FILE_TABLE', $table_name, $GT::SQL::error) });
|
|
return;
|
|
}
|
|
}
|
|
|
|
my $fh;
|
|
eval { $fh = $links->file_info($col, $id); };
|
|
if ($fh) {
|
|
if ($IN->param('v') or $IN->param('view')) { # Viewing
|
|
print $IN->header($IN->file_headers(
|
|
filename => $fh->File_Name,
|
|
mimetype => $fh->File_MimeType,
|
|
inline => 1,
|
|
size => $fh->File_Size
|
|
));
|
|
}
|
|
else { # Downloading
|
|
print $IN->header($IN->file_headers(
|
|
filename => $fh->File_Name,
|
|
mimetype => $fh->File_MimeType,
|
|
inline => 0,
|
|
size => $fh->File_Size
|
|
));
|
|
}
|
|
binmode $fh;
|
|
while (read($fh, my $buffer, 65536)) {
|
|
print $buffer;
|
|
}
|
|
return 1;
|
|
}
|
|
else {
|
|
print $IN->header();
|
|
print Links::SiteHTML::display('error', { error => Links::language('FILE_UNKNOWN', $id) });
|
|
return;
|
|
}
|
|
}
|
|
# Jump to a URL, bump the hit counter.
|
|
else {
|
|
$rec = $links->select({ ID => $id }, VIEWABLE)->fetchrow_hashref;
|
|
unless ($rec) {
|
|
print $IN->header();
|
|
print Links::SiteHTML::display('error', { error => Links::language('JUMP_INVALIDID', $id) });
|
|
return;
|
|
}
|
|
$goto = $rec->{URL};
|
|
|
|
my $clicktrack = $DB->table('ClickTrack');
|
|
my $customdb = $DB->table('ClickTrack_Custom');
|
|
|
|
my $rows = $clicktrack->count({ LinkID => $id, IP => $ENV{REMOTE_ADDR}, ClickType => 'Hits' });
|
|
unless ($rows) {
|
|
eval {
|
|
$clicktrack->insert({ LinkID => $id, IP => $ENV{REMOTE_ADDR}, ClickType => 'Hits', Created => \"NOW()" });
|
|
$customdb->insert({ click_linkid => $id, click_date => \"NOW()" });
|
|
$links->update({ Hits => \"Hits + 1", Timestmp => $rec->{Timestmp} }, { ID => $id }, { GT_SQL_SKIP_INDEX => 1 });
|
|
};
|
|
}
|
|
}
|
|
}
|
|
# Oops, no link.
|
|
else {
|
|
print $IN->header();
|
|
print Links::SiteHTML::display('error', { error => Links::language('JUMP_INVALIDID', $id) });
|
|
return;
|
|
}
|
|
|
|
# Redirect to a detailed page if requested.
|
|
if ($CFG->{build_detailed} and $IN->param('Detailed')) {
|
|
$goto = Links::transform_url("$CFG->{build_detail_url}/" . $links->detailed_url($id));
|
|
}
|
|
($goto =~ m,^\w+://,) or ($goto = "http://$goto");
|
|
|
|
unless (defined $goto) {
|
|
my $error = ($IN->param('ID') eq 'random') ? Links::language('RANDOM_NOLINKS') : Links::language('JUMP_INVALIDID', $id);
|
|
print $IN->header();
|
|
print Links::SiteHTML::display('error', { error => $error });
|
|
return;
|
|
}
|
|
|
|
if ($goto) {
|
|
if ($CFG->{framed_jump} and not ($CFG->{build_detailed} and $IN->param('Detailed'))) {
|
|
unless (keys %$rec) {
|
|
$rec = $links->select({ ID => $id }, VIEWABLE)->fetchrow_hashref;
|
|
}
|
|
$rec->{detailed_url} = "$CFG->{build_detail_url}/" . $links->detailed_url($id) if $CFG->{build_detailed};
|
|
print $IN->header();
|
|
print Links::SiteHTML::display('jump', { destination => $goto, %$rec });
|
|
return;
|
|
}
|
|
else {
|
|
print $IN->redirect($goto);
|
|
}
|
|
}
|
|
else {
|
|
print $IN->header();
|
|
print Links::SiteHTML::display('error', { error => Links::language('JUMP_INVALIDID', $id) });
|
|
return;
|
|
}
|
|
}
|
|
|
|
sub generate_popular_links {
|
|
my $mh = shift || 5;
|
|
if ($GLinks::MOSTPOP) {
|
|
return $GLinks::MOSTPOP;
|
|
}
|
|
|
|
my $today = GT::Date::date_get();
|
|
require Links::Plugins;
|
|
my $cfg = Links::Plugins::get_plugin_user_cfg('MostPopular');
|
|
my $last_x_days = $cfg->{last_x_days} || 14;
|
|
my $from_date = GT::Date::date_sub($today, $last_x_days);
|
|
my $to_date = GT::Date::date_sub($today, 0);
|
|
require GT::SQL::Condition;
|
|
#my $cond = GT::SQL::Condition->new('click_date', '>=', $from_date, 'click_date','<=', $to_date);
|
|
my $cond = GT::SQL::Condition->new('Mod_Date', '>=', $from_date, 'Mod_Date','<=', $to_date);
|
|
#my $db = $DB->table('ClickTrack_Custom');
|
|
my $db = $DB->table('Links');
|
|
my $linksdb = $DB->table('Links');
|
|
use Data::Dumper;
|
|
#$db->select_options('GROUP by click_linkid','ORDER BY count desc',"Limit $mh");
|
|
$db->select_options('ORDER BY Hits DESC',"Limit $mh");
|
|
#my $sth = $db->select($cond, ['count(*) as count', 'click_linkid']);
|
|
my $sth = $db->select($cond, ['ID']);
|
|
my @loop;
|
|
while (my $row = $sth->fetchrow_hashref()) {
|
|
my $link = $linksdb->get($row->{ID});
|
|
$link = Links::SiteHTML::tags('link',$link);
|
|
push @loop, { %$link, %$row };
|
|
}
|
|
|
|
$GLinks::MOSTPOP = { MostPopularLinks => \@loop, FromDate => $from_date, ToDate => $to_date };
|
|
return $GLinks::MOSTPOP;
|
|
}
|
|
|
|
# Always end with a 1.
|
|
1;
|