mourningdove/cgi-bin/DW/Controller/InviteCodes.pm
2026-05-24 01:03:05 +00:00

98 lines
3 KiB
Perl

#!/usr/bin/perl
#
# DW::Controller::InviteCodes
#
# Tools for managing invite codes, including generating an image
# that shows the current status of a given invite code.
#
# Authors:
# Jen Griffin <kareila@livejournal.com>
#
# Copyright (c) 2011 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::InviteCodes;
use strict;
use DW::Routing;
use DW::Template;
use DW::Controller;
use DW::InviteCodes;
use DW::InviteCodeRequests;
use DW::BusinessRules::InviteCodeRequests;
DW::Routing->register_string( '/invite/index', \&management_handler, app => 1 );
sub management_handler {
my $r = DW::Request->get;
my ( $ok, $rv ) = controller();
return $rv unless $ok;
my $remote = $rv->{remote};
# check whether we requested more invite codes
if ( $r->did_post ) {
my $args = $r->post_args;
return error_ml('error.invalidform')
unless LJ::check_form_auth( $args->{lj_form_auth} );
if ( DW::InviteCodeRequests->create( userid => $remote->id, reason => $args->{reason} ) ) {
$r->add_msg( LJ::Lang::ml('/invite/index.tt.msg.request.success'), $r->SUCCESS );
}
else {
$r->add_msg( LJ::Lang::ml('/invite/index.tt.msg.request.error'), $r->ERROR );
}
}
$rv->{print_req_form} = DW::BusinessRules::InviteCodeRequests::can_request( user => $remote );
$rv->{view_full} = $r->get_args->{full};
my @invitecodes = DW::InviteCodes->by_owner( userid => $remote->id );
my @recipient_ids;
foreach my $code (@invitecodes) {
push @recipient_ids, $code->recipient if $code->recipient;
}
my $recipient_users = LJ::load_userids(@recipient_ids);
unless ( $rv->{view_full} ) {
# filter out codes that were used over two weeks ago
my $two_weeks_ago = time() - ( 14 * 24 * 60 * 60 );
@invitecodes = grep {
my $u = $recipient_users->{ $_->recipient };
# if it's used, we should always have a recipient, but...
!$_->is_used || ( $u && $u->timecreate ) > $two_weeks_ago
} @invitecodes;
}
# sort so that invite codes end up in this order:
# - unsent and unused
# - sent but unused, with earliest sent first
# - used
@invitecodes = sort {
return $a->is_used <=> $b->is_used if $a->is_used != $b->is_used;
return ( $a->timesent // 0 ) <=> ( $b->timesent // 0 );
} @invitecodes;
$rv->{has_codes} = scalar @invitecodes;
$rv->{invitecodes} = \@invitecodes;
$rv->{users} = $recipient_users;
$rv->{create_link} = sub {
my ($code) = @_;
return "$LJ::SITEROOT/create?from=$remote->{user}&code=$code";
};
$rv->{time_to_http} = sub { return $_[0] ? LJ::time_to_http( $_[0] ) : '' };
return DW::Template->render_template( 'invite/index.tt', $rv );
}
1;