142 lines
4.4 KiB
Perl
142 lines
4.4 KiB
Perl
#!/usr/bin/perl
|
|
#
|
|
# DW::Controller::Shop::Gifts
|
|
#
|
|
# This controller is for the random gift and circle gift shop pages.
|
|
#
|
|
# Authors:
|
|
# Cocoa <cocoa@tokyo-tower.org>
|
|
#
|
|
# Copyright (c) 2010-2023 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::Controller::Shop::Gifts;
|
|
|
|
use strict;
|
|
use warnings;
|
|
use Carp qw/ croak confess /;
|
|
|
|
use DW::Controller;
|
|
use DW::Pay;
|
|
use DW::Routing;
|
|
use DW::Shop;
|
|
use DW::Template;
|
|
use LJ::JSON;
|
|
|
|
DW::Routing->register_string( '/shop/randomgift', \&shop_randomgift_handler, app => 1 );
|
|
DW::Routing->register_string( '/shop/gifts', \&shop_gifts_handler, app => 1 );
|
|
|
|
# Gives a person a random active free user that they can choose to purchase a
|
|
# paid account for.
|
|
sub shop_randomgift_handler {
|
|
my ( $ok, $rv ) = controller( anonymous => 1 );
|
|
return $rv unless $ok;
|
|
|
|
my $r = $rv->{r};
|
|
my $remote = $rv->{remote};
|
|
my $GET = $r->get_args;
|
|
my $POST = $r->post_args;
|
|
|
|
my $type = $GET->{type};
|
|
$type = 'P' unless $type && $type eq 'C';
|
|
my $othertype = $type eq 'P' ? 'C' : 'P';
|
|
|
|
if ( $r->did_post() ) {
|
|
my $username = $POST->{username};
|
|
my $u = LJ::load_user($username);
|
|
if ( LJ::isu($u) ) {
|
|
return $r->redirect("$LJ::SHOPROOT/account?for=random&user=$username");
|
|
}
|
|
}
|
|
|
|
my $randomu = DW::Pay::get_random_active_free_user($type);
|
|
|
|
my $vars = {
|
|
type => $type,
|
|
othertype => $othertype,
|
|
randomu => $randomu,
|
|
mysql_time => \&LJ::mysql_time
|
|
};
|
|
return DW::Template->render_template( 'shop/randomgift.tt', $vars );
|
|
}
|
|
|
|
# Provides a list of users in your Circle who might want a paid account.
|
|
sub shop_gifts_handler {
|
|
my ( $ok, $rv ) = controller();
|
|
return $rv unless $ok;
|
|
|
|
my $r = $rv->{r};
|
|
my $remote = $rv->{remote};
|
|
|
|
my ( @free, @expired, @expiring, @paid, @seed );
|
|
|
|
my $circle = LJ::load_userids( $remote->circle_userids );
|
|
|
|
foreach my $target ( values %$circle ) {
|
|
|
|
if ( ( $target->is_person || $target->is_community ) && $target->is_visible ) {
|
|
my $paidstatus = DW::Pay::get_paid_status($target);
|
|
|
|
# account was never paid if it has no paidstatus row:
|
|
push @free, $target unless defined $paidstatus;
|
|
|
|
if ( defined $paidstatus ) {
|
|
if ( $paidstatus->{permanent} ) {
|
|
push @seed, $target unless $target->is_official;
|
|
}
|
|
else {
|
|
# account is expired if the expiration date has passed:
|
|
push @expired, $target unless $paidstatus->{expiresin} > 0;
|
|
|
|
# account is expiring soon if the expiration time is
|
|
# within the next month:
|
|
push @expiring, $target
|
|
if $paidstatus->{expiresin} < 2592000
|
|
&& $paidstatus->{expiresin} > 0;
|
|
|
|
# account is expiring in more than one month:
|
|
push @paid, $target if $paidstatus->{expiresin} >= 2592000;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
# now that we have the lists, sort them alphabetically by display name:
|
|
my $display_sort = sub { $a->display_name cmp $b->display_name };
|
|
@free = sort $display_sort @free;
|
|
@expired = sort $display_sort @expired;
|
|
@expiring = sort $display_sort @expiring;
|
|
@paid = sort $display_sort @paid;
|
|
@seed = sort $display_sort @seed;
|
|
|
|
# build a list of free users in the circle, formatted with
|
|
# the display username and a buy-a-gift link:
|
|
# sort into two lists depending on whether it's a personal or community account
|
|
my ( @freeusers, @freecommunities );
|
|
foreach my $person (@free) {
|
|
if ( $person->is_personal ) {
|
|
push( @freeusers, $person );
|
|
}
|
|
else {
|
|
push( @freecommunities, $person );
|
|
}
|
|
}
|
|
|
|
my $vars = {
|
|
remote => $remote,
|
|
freeusers => \@freeusers,
|
|
freecommunities => \@freecommunities,
|
|
expusers => \@expiring,
|
|
lapsedusers => \@expired,
|
|
paidusers => \@paid,
|
|
seedusers => \@seed,
|
|
};
|
|
|
|
return DW::Template->render_template( 'shop/gifts.tt', $vars );
|
|
}
|
|
|
|
1;
|