User:AnomieBOT/source/tasks/TemplateReplacer9.pm

and  to 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 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="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 ""; });

# Need to edit? $revid=$tok->{'lastrevid'}; if(@summary && $outtxt ne $intxt){ $summary[-1]='and '.$summary[-1] if @summary>1; my $summary="Update (".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;