package tasks::TemplateReplacer9;
=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: TemplateReplacer9
BRFA: Wikipedia:Bots/Requests for approval/AnomieBOT 17
Status: Withdrawn
Created: 2008-12-23
Update <code>GA=yes</code> and <code>FC=yes</code> to {{tl|dyktalk}} as
appropriate.
=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 warning
Withdrawn<br />[[Wikipedia:Bots/Requests for approval/AnomieBOT 17]]
=cut
sub approved {
return -3;
}
sub run {
my ($self, $api)=@_;
my $res;
$api->task('TemplateReplacer9');
$api->read_throttle(0);
$api->edit_throttle(10);
# List of templates to replace in this task
my @templates=('Dyktalk');
my $req="[[Wikipedia:Bot requests#DYK success in leading to GA and FA articles|request]]";
# 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',
geinamespace => 1,
geititle => "Template:$template",
geilimit => '500', # To reduce the need for clcontinue
prop => 'categories|info',
cllimit => 'max',
);
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'};
my $revid=$_->{'lastrevid'};
# Have we checked this page before?
my $checked=$api->fetch($_->{'pageid'});
next if(defined($checked) && $$checked eq $revid);
# WTF?
if(exists($_->{'missing'})){
$self->warn("$title is missing? WTF?\n");
next;
}
next if exists($_->{'redirect'});
# Check cats, maybe we can avoid loading the page text
my $isFC=grep($_->{'title'}=~/^Category:Wikipedia featured (?:articles|lists)$/, @{$_->{'categories'}});
my $isDYKFC=grep($_->{'title'}=~/^Category:Wikipedia Did you know (articles|lists) that are featured \1$/, @{$_->{'categories'}});
my $isGA=grep($_->{'title'} eq 'Category:Wikipedia good articles', @{$_->{'categories'}});
my $isDYKGA=grep($_->{'title'} eq 'Category:Wikipedia Did you know articles that are good articles', @{$_->{'categories'}});
if($isFC==$isDYKFC && $isGA==$isDYKGA){
#$self->warn("Cats look ok, no need to update for $title\n");
$api->store($_->{'pageid'}, \$revid);
next;
}
$self->warn("Checking for $template in $title\n");
# 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'});
next if exists($tok->{'redirect'});
# Get page text
my $intxt=$tok->{'revisions'}[0]{'*'};
# Update the tagging
my $tmpl=$template;
my @summary=();
my $outtxt=$self->process_templates($intxt, sub {
my $name=shift;
my @params=@{shift()};
shift; # $wikitext
shift; # $data
my $oname=shift;
return undef unless exists($templates{"Template:$name"});
$tmpl=$name;
my @p=();
my ($hasGA,$hasFC)=(0,0);
foreach ($self->process_paramlist(@params)){
if($_->{'name'} eq 'GA'){
if($isGA){
$hasGA=1;
if($_->{'value'}!~/^\s*yes\s*$/){
push @summary, 'fix GA';
$_->{'text'}=~s/^([^=]*=\s*).*?(\s*)$/${1}yes$2/s;
}
push @p, $_->{'text'};
} else {
push @summary, 'remove GA';
}
} elsif($_->{'name'} eq 'FC'){
if($isFC){
$hasFC=1;
if($_->{'value'}!~/^\s*yes\s*$/){
push @summary, 'fix FC';
$_->{'text'}=~s/^([^=]*=\s*).*?(\s*)$/${1}yes$2/s;
}
push @p, $_->{'text'};
} else {
push @summary, 'remove FC';
}
} else {
push @p, $_->{'text'};
}
}
if($isGA && !$hasGA){
push @summary, 'add GA';
push @p, 'GA=yes';
}
if($isFC && !$hasFC){
push @summary, 'add FC';
push @p, 'FC=yes';
}
return "{{$oname|".join("|", @p)."}}";
});
# Need to edit?
$revid=$tok->{'lastrevid'};
if(@summary && $outtxt ne $intxt){
$summary[-1]='and '.$summary[-1] if @summary>1;
my $summary="Update {{$tmpl}} (".join((@summary>2)?', ':' ', @summary).") per $req";
$self->warn("$summary in $title\n");
my $r=$api->edit($tok, $outtxt, $summary, 1, 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{'geicontinue'}));
}
# No more pages to check, try again in 10 minutes or so in case of errors.
return 600;
}
1;