package Foorum::ResultSet::UserOnline;
use strict;
use warnings;
our $VERSION = '1.001000';
use base 'DBIx::Class::ResultSet';
sub get_data {
my ( $self, $sid, $forum_code, $attr ) = @_;
my $schema = $self->result_source->schema;
my $cache = $schema->cache();
$attr->{page} = 1 unless ( $attr->{page} );
$attr->{order_by} = \'last_time DESC' unless ( $attr->{order_by} );
my @extra_cols;
if ($forum_code) {
@extra_cols = (
-or => [
'path' => { 'like', "forum/$forum_code/%" },
'path' => { 'like', "forum/$forum_code" },
]
);
}
# get the last 15 minites' data
# 15 * 60 = 900
my $last_15_min = time() - 900;
my $rs = $schema->resultset('UserOnline')->search(
{ last_time => { '>', $last_15_min },
@extra_cols,
},
{ order_by => $attr->{order_by},
rows => 20,
page => $attr->{page},
}
);
my @onlines = $rs->all;
@onlines = &_handler_onlines( $self, $sid, @onlines );
return wantarray ? ( \@onlines, $rs->pager ) : \@onlines;
}
sub whos_view_this_page {
my ( $self, $sid, $path ) = @_;
my $schema = $self->result_source->schema;
my $cache = $schema->cache();
# get the last 15 minites' data
# 15 * 60 = 900
my $last_15_min = time() - 900;
my @onlines = $schema->resultset('UserOnline')->search(
{ last_time => { '>', $last_15_min },
path => $path,
},
{ order_by => \'last_time DESC',
rows => 20,
page => 1,
}
)->all;
@onlines = &_handler_onlines( $self, $sid, @onlines );
return wantarray ? @onlines : \@onlines;
}
sub _handler_onlines {
my ( $self, $sid, @onlines ) = @_;
my $schema = $self->result_source->schema;
my $cache = $schema->cache();
my $has_me = 0; # damn it, we query it *before* the path is updated.
my @results;
foreach my $online (@onlines) {
if ( not $has_me and $online->sessionid eq $sid ) {
$has_me = 1;
}
my $user;
if ( $online->user_id ) {
$user = $schema->resultset('User')
->get( { user_id => $online->user_id } );
}
$online->{user} = $user;
push @results, $online;
}
# if it's not in @onlines
unless ($has_me) {
push @results, 'SELF'; # let TT2 handle this.
}
return wantarray ? @results : \@results;
}