User:AnomieBOT/source/tasks/TemplateReplacer3.pm

{{ombox|type=content|style=border:1px solid #b22222|image=40px|text= 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.}}

{{ombox|type=notice|text= Approved 2008-09-20, completed 2008-09-21
Wikipedia:Bots/Requests for approval/AnomieBOT 5}}

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 orientation

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
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 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;