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

Content deleted Content added
AnomieBOT (talk | contribs)
Updating published sources: WikiProjectTagger: * Adjustments to tag even if not assessing * Start run for WP Physics. AutoAssessor2: * Adjustments to tag even if not assessing * Adjust config for WP Physics run, and start running. AutoAssessor2, Wiki
AnomieBOT (talk | contribs)
Updating published sources: AutoAssessor2: * Retire this task too, I think Lua now tends to handle this sort of thing.
 
(15 intermediate revisions by the same user not shown)
Line 1:
{{ombox|type=notice|text= Approved 2008-12-07<br />[[Wikipedia:Bots/Requests for approval/AnomieBOT 15]]}}
{{ombox|type=notice|text= Retired 2025-02-01. Haven't had call to run this in a while, and I think Lua now handles this sort of thing anyway.}}
<source lang="perl">
<syntaxhighlight lang="perl">
package tasks::AutoAssessor2;
 
Line 7 ⟶ 8:
=begin metadata
 
Bot: AnomieBOT
Task: AutoAssessor2
BRFA: Wikipedia:Bots/Requests for approval/AnomieBOT 15
Status: ApprovedInactive 20082025-1202-0701
Rate: Max 6 edits/minute
Created: 2008-11-26
OnDemand: true
Line 26 ⟶ 27:
use strict;
 
use Data::Dumper;
use AnomieBOT::Task;
use vars qw/@ISA/;
Line 32:
 
# Request link, for edit summary.
my $req="[[User:AnomieBOT/req/WikiProject PhysicsRadio Stations 1|request]]";
 
# Increment this number every time a new run is started, so we don't have to
# mess around with deleting previous runs' database entries.
my $seq=34;
 
# If any of the 'verify' or 'params' functions need the page contents, set this
Line 50:
# canonicalize => If defined, any instance of the template will be renamed to
# this when edits are done to the page.
# addempty => If true, add empty "class=" and "importance=" to all banners.
# verify => If defined, must be a subroutine that will be called with the
# page and talkpage results. The subroutine must return a boolean value,
Line 58 ⟶ 59:
my %cfg_templates;
%cfg_templates=(
'PhysicsWikiProject Radio Stations' => {
nsmeta => {1,
stubstubauto => [ 'stub', qr/\S.*/s, undef, undef ],
redirectcanonicalize => [ 'redirect',WikiProject qr/redirect|red|redir/i,Radio Stations'NA', qr/na/i ],
disambigaddempty => [ 'disambig', qr/disambig|dab/i, 'NA', qr/na/i ]0,
2 => [ 'NA', qr/na/i, 'NA', qr/na/i ], # User
4 => [ 'project', qr/project/i, 'NA', qr/na/i ], # Wikipedia
6 => [ 'image', qr/image/i, 'NA', qr/na/i ], # Image
8 => [ 'NA', qr/na/i, 'NA', qr/na/i ], # MediaWiki
10 => [ 'template', qr/template|templ|temp/i, 'NA', qr/na/i ], # Template
12 => [ 'NA', qr/na/i, 'NA', qr/na/i ], # Help
14 => [ 'category', qr/category|categ|cat/i, 'NA', qr/na/i ], # Category
100 => [ 'portal', qr/portal/i, 'NA', qr/na/i ], # Portal
},
stubauto => 'auto',
blp => undef,
activepol => undef,
canonicalize => undef,
verify => undef,
params => sub {undef,
my $api=shift;
my $page=shift;
my $talk=shift;
my $name=shift;
my $params=shift;
 
my @x=(@{$page->{'categories'} // []},@{$page->{'templates'} // []},@{$talk->{'categories'} // []},@{$talk->{'templates'} // []});
warn Dumper(\@x);
my $mark=0;
$mark|=1 if grep($_->{'title'} eq 'Template:WPBiography', @x);
$mark|=1 if grep($_->{'title'} eq 'Template:Blp', @x);
$mark|=8 if grep($_->{'title'} eq 'Template:WPBooks', @x);
$mark|=8 if grep($_->{'title'} eq 'Template:WikiProject Magazines', @x);
$mark|=8 if grep($_->{'title'} eq 'Template:WikiProject Academic Journals', @x);
$mark|=8 if grep($_->{'title'} eq 'Category:Journals', @x);
$mark|=8 if grep($_->{'title'} eq 'Category:Journal articles', @x);
$mark|=8 if grep($_->{'title'} eq 'Category:Scientific journals', @x);
$mark|=8 if grep($_->{'title'} eq 'Category:Scientific literature', @x);
$mark|=8 if grep($_->{'title'} eq 'Category:Academic publishing', @x);
$mark|=16 if grep($_->{'title'} eq 'Template:WikiProject History of Science', @x);
warn Dumper(\$mark);
 
if($mark&1){
push @$params, "bio=yes" unless(grep(s/^(\s*bio\s*=(?:\s*(?=\S))?).*?(\s*)$/${1}yes$2/s, @$params));
}
if($mark&2){
push @$params, "fluid-dynamics=yes" unless(grep(s/^(\s*fluid-dynamics\s*=(?:\s*(?=\S))?).*?(\s*)$/${1}yes$2/s, @$params));
}
if($mark&4){
push @$params, "relativity=yes" unless(grep(s/^(\s*relativity\s*=(?:\s*(?=\S))?).*?(\s*)$/${1}yes$2/s, @$params));
}
if($mark&8){
push @$params, "pub=yes" unless(grep(s/^(\s*pub\s*=(?:\s*(?=\S))?).*?(\s*)$/${1}yes$2/s, @$params));
}
if($mark&16){
push @$params, "hist=yes" unless(grep(s/^(\s*hist\s*=(?:\s*(?=\S))?).*?(\s*)$/${1}yes$2/s, @$params));
}
},
},
);
Line 123 ⟶ 73:
my $self=$class->SUPER::new();
$self->{'did_templates'}=0;
$self->{'config loaded'}=0;
bless $self, $class;
return $self;
Line 131 ⟶ 82:
=for info
Approved 2008-12-07<br />[[Wikipedia:Bots/Requests for approval/AnomieBOT 15]]
 
=for info
Retired 2025-02-01. Haven't had call to run this in a while, and I think Lua now handles this sort of thing anyway.
 
=cut
 
sub approved {
return -1;
}
 
Line 142 ⟶ 96:
my $res;
 
$api->task('AutoAssessor2', 0, 10, qw/d::WikiProjectTagging d::Redirects/);
 
# Load configs, if necessary
if(!$self->{'config loaded'}){
while(my ($banner,$cfg)=each %cfg_templates){
next unless exists($cfg->{'meta'});
my $ae=$cfg->{'addempty'} // 0;
$cfg=$api->WPBMetaConfig($cfg->{'meta'}, %$cfg) if exists($cfg->{'meta'});
$cfg->{'addempty'}=$ae;
$cfg_templates{$banner}=$cfg;
}
$self->{'config loaded'}=1;
}
 
if(!exists($api->store->{'metaseq'}) || $api->store->{'metaseq'}<$seq){
delete $api->store->{'template'};
delete $api->store->{'geicontinue'};
$api->store->{'metaseq'}=$seq;
}
 
# List of templates to assess in this task
if(!$self->{'did_templates'}){
while(my ($t,$c)=each %cfg_templates){
my %redirs=$capi->{'names'}=[ redirects_to_resolved("Template:$t" ]);
$res=$api->queryif([],exists($redirs{''})){
list$api->warn("Failed to get redirects to => Template:$t".$redirs{''}{'backlinkserror',}."\n");
bltitle => "Template:$t",
blfilterredir => 'redirects',
bllimit => 'max',
);
if($res->{'code'} ne 'success'){
$api->warn("Failed to retrieve redirect list for $t: ".$res->{'error'}."\n");
return 60;
}
push @{$c->{'names'}},=[ $_->{'title'}keys foreach%redirs (@{$res->{'query'}{'backlinks'}})];
}
$self->{'did_templates'}=1;
Line 167 ⟶ 133:
}
 
# Spend a max of 510 minutes on this task before restarting
my $endtime=time()+300600;
 
foreach my $template (sort keys %cfg_templates){
next if(exists($api->store->{'template'}) && $template lt $api->store->{'template'});
$api->store->{'template'}=$template;
my %q1=(
generator => 'embeddedin',
geititle => "Template:$template",
geilimit => 'max1000', # 'max' seems to time out fairly often
prop => 'info',
inprop => 'subjectid',
);
$q1{'geicontinue'}=$api->store->{'geicontinue'} if exists($api->store->{'geicontinue'});
my %q2=(
pageids => '',
Line 187 ⟶ 156:
$q2{'prop'}.='|revisions';
$q2{'rvprop'}='content';
$q2{'rvslots'}='main';
}
 
# Get the list of pages to check
do {
$api->store->{'geicontinue'}=$q1{'geicontinue'} if exists($q1{'geicontinue'});
$res=$api->query(%q1);
if($res->{'code'} ne 'success'){
Line 204 ⟶ 175:
# Collect page IDs of articles for found talk pages
my @pageids=map { exists($_->{'subjectid'})?($_->{'subjectid'}):() } values %{$res->{'query'}{'pages'}};
@pageids=grep { !exists($api->store->{$_}) || $api->store->{$_}<$seq } @pageids;
 
# Look up info for found pages, in blocks of 500 because that's the
Line 211 ⟶ 183:
$res=$api->query(%q2);
foreach my $page (values %{$res->{'query'}{'pages'}}){
return 0 if $api->halting;
 
my $pageid=$page->{'pageid'};
my $title=$page->{'title'};
Line 252 ⟶ 226:
 
# Get page text
my $intxt=$tok->{'revisions'}[0]{'slots'}{'main'}{'*'};
my ($outtxt,$nowiki)=$api->strip_nowiki($intxt);
my $any=0;
Line 268 ⟶ 242:
return undef if(defined($cfg{'verify'}) && !$cfg{'verify'}($api,$page,$tok));
my ($class,$classre,$imp,$impre);
my $impname;
if(exists($cfg{'ns'}{$ns})){
($class,$classre,$imp,$impre)=@{$cfg{'ns'}{$ns}};
$impname=exists($cfg{'importance'})?$cfg{'importance'}:'importance';
} else {
($class,$classre,$imp,$impre)=(undef,undef,undef,undef);
$impname=undef;
}
my $impname=exists($cfg{'importance'})?$cfg{'importance'}:'importance';
 
my $orig_param=join('|', @params);
 
# Auto-assess
if($class && defined($classre) && !grep(/^\s*class\s*=\s*$classre\s*$/s, @params)){
push @params, "class=$class" unless(grep(s/^(\s*class\s*=(?:\s*(?=\S))?).*?(\s*)$/$1$class$2/s, @params));
if(defined($cfg{'stubauto'})){
Line 289 ⟶ 265:
}
}
if($imp && defined($impre) && !grep(/^\s*$impname\s*=\s*$impre\s*$/s, @params)){
push @params, "$impname=$imp" unless(grep(s/^(\s*$impname\s*=(?:\s*(?=\S))?).*?(\s*)$/$1$imp$2/s, @params));
}
 
# If requested to add empty parameters, do so
if($cfg{'addempty'} // 0){
push @params, "class=" unless grep(/^\s*class\s*=/, @params);
push @params, "$impname=" if(defined($impname) && !grep(/^\s*$impname\s*=/, @params));
}
 
Line 300 ⟶ 282:
$any=1;
my @s=();
push @s, "class=$class" if($class && defined($classre));
push @s, "$impname=$imp" if($imp && defined($impre));
push @found, "{{$name}} (".join(' ', @s).')';
}
Line 309 ⟶ 291:
# edits.
push @params, "class=" unless grep(/^\s*class\s*=/, @params);
push @params, "$impname=" unlessif(defined($impname) && !grep(/^\s*$impname\s*=/, @params));
 
if(defined($cfg{'canonicalize'})){
Line 322 ⟶ 304:
# Need to edit?
if($outtxt ne $intxt && $any){
$outtxt=$api->WPBfixshell($outtxt);
$found[-1]='and '.$found[-1] if @found>1;
my $summary="Assessing ".join((@found>2)?', ':' ', @found)." per $req";
 
my @cleanup=();
$outtxt=$api->WPBfixshell($outtxt, \@cleanup);
if(ref($outtxt) eq 'HASH'){
$api->warn("Processing $title failed: ".$outtxt->{'error'}."\n");
next;
}
$summary.="; general banner cleanup (".join(', ', @cleanup).")" if @cleanup;
 
$api->log("$summary in $talk");
my $r=$api->edit($tok, $outtxt, $summary, 1, 1);
Line 344 ⟶ 334:
}
} while(exists($q1{'geicontinue'}));
delete $api->store->{'geicontinue'};
}
delete $api->store->{'template'};
 
# No more pages to check, try again in 10 minutes or so in case of errors.
$api->log("AutoAssessor2 may be DONE!");
return 600;
}
Line 352 ⟶ 345:
1;
 
</syntaxhighlight>
</source>