User:AnomieBOT/source/tasks/RedirectBypasser.pm: Difference between revisions

Content deleted Content added
AnomieBOT (talk | contribs)
Updating published sources: RedirectBypasser: * New task. DatedCategoryCreater: * New task, coded against anticipated need. d::IWNS: * Allow multiple runs of spaces in namespace regex (e.g. as in User talk:AnomieBOT). AnomieBOT::API: * Include...
 
AnomieBOT (talk | contribs)
Updating published sources: General: * Update for the addition of 'rvslots'. DatedCategoryDeleterTest: * Disable. It's clear that task won't be needed. BrokenRedirectDeleter: * Handle pages with newlines before the <code>#REDIRECT</code>.
 
(8 intermediate revisions by the same user not shown)
Line 1:
{{ombox|type=notice|text= ApprovalApproved requested2012-06-06<br />[[Wikipedia:Bots/Requests for approval/AnomieBOT 63]]}}
<syntaxhighlight lang="perl">
package tasks::RedirectBypasser;
Line 10:
Task: RedirectBypasser
BRFA: Wikipedia:Bots/Requests for approval/AnomieBOT 63
Status: BRFAApproved 2012-06-06
Created: 2012-05-11
OnDemand: true
 
Bypass redirects in certain limited cases, e.g.currently:
* toTo prevent confusion when a username is being usurped.
username is being usurped, or to prepare for the repurposing of a shortcut
for an entirely different meaning.
 
=end metadata
Line 33 ⟶ 32:
 
# Page to notify of errors
my $notify='User talk:AnomieBOTNard the Bard';
 
# Page to notify of errors
Line 57 ⟶ 56:
my @skip=(
qr{^Wikipedia:Articles for deletion/Log/},
'Wikipedia:Changing username/Usurpations',
'Wikipedia:Changing username/Usurpations/Completed/33',
'User talk:Nard the Bard',
'User talk:N',
'User talk:Anomie',
'User talk:AnomieBOT',
'Wikipedia:Bots/Requests for approval/AnomieBOT 63',
);
 
Line 63 ⟶ 69:
my $self=$class->SUPER::new();
$self->{'iter'}=undef;
$self->{'err'}={};
$self->{'noerr'}=0;
bless $self, $class;
return $self;
Line 70 ⟶ 78:
 
=for info
ApprovalApproved requested2012-06-06<br />[[Wikipedia:Bots/Requests for approval/AnomieBOT 63]]
 
=cut
 
sub approved {
return 0-1;
}
 
Line 118 ⟶ 126:
$skip=qr/$skip/;
 
my $iter=$apiself->iterator({'iter'};
if(!$iter){
generator => 'backlinks',
gbltitle $iter=$api-> [keys %redirects],iterator(
gbllimit generator => 'maxbacklinks',
gbltitle => [keys %redirects],
);
generator gbllimit => 'backlinksmax',
);
$self->{'iter'}=$iter;
$self->{'err'}={};
$self->{'noerr'}=0;
);}
my $endtime=time()+300;
while(my $p=$iter->next){
return 0 if $api->halting;
Line 132 ⟶ 147:
 
next if $p->{'title'}=~/$skip/;
delete $self->{'err'}{$p->{'title'}};
 
my $tok=$api->edittoken($p->{'title'}, EditRedir=>1);
Line 140 ⟶ 156:
if($tok->{'code'} eq 'pageprotected'){
$api->warn("Cannot edit $p->{title}: Page is protected\n");
$api->whine("Cannot bypass redirects in [[:$pself->{title'err'}]]", "I cannot bypass redirects in [[:{$p->{'title'}]], because the }="page is protected. Please bypass them manually. Thanks.", Pagename => $notify, NoSmallPrint => 1);
next;
}
if($tok->{'code'} eq 'botexcluded'){
$api->warn("Cannot edit $p->{title}: Bot exclusion applies\n");
$api->whine("Cannot bypass redirects in [[:$pself->{title'err'}]]", "I cannot bypass redirects in [[:{$p->{'title'}]],}="bot because I am excluded from editing that page usingexclusion ({{tl|bots}} or {{tl|nobots}}.) Please bypass them manually. Thanks.applies", Pagename => $notify, NoSmallPrint => 1);
next;
}
if($tok->{'code'} ne 'success'){
$api->warn("Failed to get edit token for $p->{title}: ".$tok->{'error'}."\n");
$self->{'noerr'}=1;
return 0;
}
 
my $intxt=$tok->{'revisions'}[0]{'slots'}{'main'}{'*'};
my ($outtxt,$nowiki)=$api->strip_nowiki($intxt);
 
Line 169 ⟶ 186:
if($res->{'code'} ne 'success'){
$api->warn("Write failed on $p->{title}: ".$res->{'error'}."\n");
$self->{'noerr'}=1;
next;
} else {
# In case one of the "cannot find redirects" pages transcluded
# this one.
$self->{'noerr'}=1;
}
} else {
$api->warn("Cannot# findPurge, redirectsthanks into $p->{title}\n");bug 5382
$res=$api->query(action=>'purge', titles=>$p->{'title'}, forcelinkupdate=>1);
$api->whine("Cannot bypass redirects in [[:$p->{title}]]", "I cannot find the redirects to bypass in [[:$p->{title}]], although the API tells me they are there. Chances are it is either because of links generated by templates or unusual formatting breaking up the link text. Please bypass them manually. Thanks.", Pagename => $notify, NoSmallPrint => 1);
if($res->{'code'} ne 'success'){
$self->{'noerr'}=1;
next;
}
# Now check links again
$res=$api->query(titles=>$p->{'title'}, prop=>'links', pllimit=>'max', pltitles=>$iter->iterval);
if($res->{'code'} ne 'success'){
$self->{'noerr'}=1;
next;
}
$res=(values %{$res->{'query'}{'pages'}})[0]{'links'} // [];
if(grep $_->{'title'} eq $iter->iterval, @$res){
$api->warn("Cannot find redirects in $p->{title}\n");
$self->{'err'}{$p->{'title'}}="cannot find redirects; they are probably template-generated or oddly formatted";
} else {
# Problem resolved!
}
next;
}
 
# If we've been at it long enough, let another task have a go.
return 0 if time()>$endtime;
}
 
my $ne=($self->{'noerr'} && %{$self->{'err'}});
if(!$ne && %{$self->{'err'}}){
my $msg="The following issues were encountered while bypassing redirects:\n";
for my $p (sort keys %{$self->{'err'}}) {
$msg.="* [[:$p]]: ".$self->{'err'}{$p}."\n";
}
$msg.="Please bypass the redirects in these pages manually. Thanks.";
$api->whine("Redirect bypass issues", $msg, Pagename => $notify);
}
 
$self->{'iter'}=undef;
$self->{'err'}={};
$self->{'noerr'}=0;
 
# Restart the scan immediately to find out if there are any real errors.
return 0 if $ne;
 
$api->log("Task may be complete!");