User:AnomieBOT/source/tasks/TemplateReplacer3.pm

package tasks::TemplateReplacer3;

=pod

=for warning
Due to breaking changes in AnomieBOT::API, this task will probably not run
anymore. If you really must run it, try getting a version from before
2009-03-23.

=begin metadata

Bot:     AnomieBOT
Task:    TemplateReplacer3
BRFA:    Wikipedia:Bots/Requests for approval/AnomieBOT 5
Status:  Completed 2008-09-21
Created: 2008-09-13

Per [[Wikipedia:Bot requests/Archive 22#Template:Female adult bio]], go through all uses
of {{tl|Female adult bio}} to remove the obsolete <code>orientation</code>
parameter.

=end metadata

=cut

use utf8;
use strict;

use AnomieBOT::Task;
use vars qw/@ISA/;
@ISA=qw/AnomieBOT::Task/;

sub new {
    my $class=shift;
    my $self=$class->SUPER::new();
    bless $self, $class;
    return $self;
}

=pod

=for info
Approved 2008-09-20, completed 2008-09-21<br />[[Wikipedia:Bots/Requests for approval/AnomieBOT 5]]

=cut

sub approved {
    return -1;
}

sub run {
    my ($self, $api)=@_;
    my $res;

    $api->task('TemplateReplacer3');
    $api->read_throttle(0);
    $api->edit_throttle(10);

    # List of templates to replace in this task
    my @templates=('Female adult bio');

    # Spend a max of 5 minutes on this task before restarting
    my $endtime=time()+300;

    # Get a list of templates redirecting to our targets
    my %templates=();
    foreach my $template (@templates){
        $templates{"Template:$template"}=1;
        $res=$api->query([],
            list          => 'backlinks',
            bltitle       => "Template:$template",
            blfilterredir => 'redirects',
            bllimit       => 'max',
        );
        $templates{$_->{'title'}}=1 foreach (@{$res->{'query'}{'backlinks'}});
    }

    foreach my $template (@templates){
        # Get the list of pages to check
        my %q=(
            generator => 'embeddedin',
            geititle  => "Template:$template",
            geilimit  => 'max',
            prop      => 'info',
        );
        do {
            $res=$api->query(%q);
            if($res->{'code'} ne 'success'){
                $self->warn("Failed to retrieve transclusion list for $template: ".$res->{'error'}."\n");
                return 60;
            }
            if(exists($res->{'query-continue'})){
                $q{'geicontinue'}=$res->{'query-continue'}{'embeddedin'}{'geicontinue'};
            } else {
                delete $q{'geicontinue'};
            }

            # Process found pages
            foreach (values %{$res->{'query'}{'pages'}}){
                my $title=$_->{'title'};

                # Have we checked this page before?
                my $checked=$api->fetch($_->{'pageid'});
                next if(defined($checked) && $$checked eq $_->{'lastrevid'});

                $self->warn("Checking for $template in $title\n");

                # WTF?
                if(exists($_->{'missing'})){
                    $self->warn("$title is missing? WTF?\n");
                    next;
                }

                # Ok, check the page
                my $tok=$api->edittoken($title);
                if($tok->{'code'} eq 'shutoff'){
                    $self->warn("Task disabled: ".$tok->{'content'}."\n");
                    return 300;
                }
                if($tok->{'code'} ne 'success'){
                    $self->warn("Failed to get edit token for $title: ".$tok->{'error'}."\n");
                    next;
                }
                next if exists($tok->{'missing'});

                # Get page text
                my $intxt=$tok->{'revisions'}[0]{'*'};

                # Perform the replacement
                my $summary="Removing 'orientation' parameter from {{$template}} per [[Wikipedia:Bot requests#Template:Female adult bio|request]]";
                my $minor=1;
                my $outtxt=$self->process_templates($intxt, sub {
                    my $name=$_[0];
                    my @params=@{$_[1]};
                    my $oname=$_[4];

                    return undef unless exists($templates{"Template:$name"});

                    # We have the template. Now, strip the obsolete param.
                    my $l=@params;
                    @params=grep(!/^\s*orientation\s*=/, @params);
                    return undef if $l==@params;

                    # Ok, return the new template code now.
                    return "{{$oname|".join("|", @params)."}}";
                });

                # Need to edit?
                my $revid=$tok->{'lastrevid'};
                if($outtxt ne $intxt){
                    $self->warn("$summary in $title\n");
                    my $r=$api->edit($tok, $outtxt, $summary, $minor, 1);
                    if($r->{'code'} ne 'success'){
                        $self->warn("Write failed on $title: ".$r->{'error'}."\n");
                        next;
                    }
                    $revid=$r->{'edit'}{'newrevid'};
                } else {
                    $self->warn("Nothing to do in $title\n");
                }

                # Save checked revision
                $api->store($_->{'pageid'}, \$revid);

                # If we've been at it long enough, let another task have a go.
                return 0 if time()>=$endtime;
            }
        } while(exists($q{'eicontinue'}));
    }

    # No more pages to check, try again in 10 minutes or so in case of errors.
    return 600;
}

1;