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

Content deleted Content added
AnomieBOT (talk | contribs)
Updating published sources: WikiProjectWorker: * Also match "importance"
AnomieBOT (talk | contribs)
Updating published sources: WikiProjectTagger, WikiProjectWorker: * Retire these tasks, WikiProject templates have changed a bunch since I last ran these.
 
(47 intermediate revisions by the same user not shown)
Line 1:
{{ombox|type=notice|text= Approved 2009-04-08<br />[[Wikipedia:Bots/Requests for approval/AnomieBOT 28]]}}
{{ombox|type=notice|text= Retired 2024-01-29. Haven't had call to run this in a while, and the related templates have changed so I'd probably have to update this code to run it again.}}
<source lang="perl">
<syntaxhighlight lang="perl">
package tasks::WikiProjectWorker;
 
Line 7 ⟶ 8:
=begin metadata
 
Bot: AnomieBOT
Task: WikiProjectWorker
BRFA: Wikipedia:Bots/Requests for approval/AnomieBOT 28
Status: ApprovedInactive 20092024-0401-0829
Rate: Max 6 edits/minute
Created: 2009-03-27
OnDemand: true
Line 27 ⟶ 28:
 
use Data::Dumper;
use Digest::SHA qw/sha256_base64/;
use AnomieBOT::Task;
use vars qw/@ISA/;
Line 33:
 
### Request link, for edit summary.
my $req="[[User:AnomieBOT/req/WikiProject BiographyHigher 1Education|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=1128;
 
### How to find the pages?
my @cats%catmap = (
"Category:Articles using infobox university" => "WikiProject Higher education",
'Category:Biography articles with more than one work group needing priority parameter replacement',
);
my @cats=keys %catmap;
my @iterators=(
{
generator => 'categorymembers',
gcmtitle => [@cats],
gcmlimit => '100',
},
);
Line 61 ⟶ 62:
### How to copy other projects' assessments
sub copy_class {
return ''($_[0]->WPBmax($_[2]))[0];
#return '';
}
 
my $always_copy_importance = 0;
my $set_empty_importance = 0;
sub copy_importance {
#return ($_[0]->WPBmax($_[2]))[1];
return '';
}
 
# Banner configurations.
my $main_banner='WPBiographyWikiProject Higher education';
my @preprocess_templates=();
my %banner_cfgs=(
'WPBiographyWikiProject Higher education' => {
meta => 01,
importance => '',
canonicalize => 'WikiProject Higher education',
blp => qr/(?:living|blpo)\s*=\s*+(?!(?i)no|n|0|$|¬)/,
activepol => qr/activepol\s*=\s*+(?!(?i)no|n|0|$|¬)/,
},
);
 
# Extra parameters (e.g. workgroup).
my %wg=(
my @extra_params=();
'a&e-work-group' => 'a&e-priority',
my $taggingwith = @extra_params ? '|' . join( '|', @extra_params ) : '';
'filmbio-work-group' => 'filmbio-priority',
 
'musician-work-group' => 'musician-priority',
# Regex fragment to match any aliases of params in @extra_params.
'military-work-group' => 'military-priority',
my %extra_param_aliases = ();
'peerage-work-group' => 'peerage-priority',
 
'politician-work-group' => 'politician-priority',
# Possible main banners, usually just $main_banner.
'royalty-work-group' => 'royalty-priority',
my @main_banners=(
's&a-work-group' => 's&a-priority',
$main_banner,
'sport-work-group' => 'sport-priority',
);
 
# Set this to merge these existing banners into $main_banner.
my @merge_banners=();
 
# Set this to tag WikiProject Biography workgroups in addition to the project's own banner.
my @bio_wg = (
);
 
Line 106 ⟶ 116:
=for info
Approved 2009-04-08<br />[[Wikipedia:Bots/Requests for approval/AnomieBOT 28]]
 
=for info
Retired 2024-01-29. Haven't had call to run this in a while, and the related templates have changed so I'd probably have to update this code to run it again.
 
=cut
 
sub approved {
return -1;
}
 
Line 126 ⟶ 139:
$cfg=$api->WPBMetaConfig($cfg->{'meta'}, %$cfg) if exists($cfg->{'meta'});
$cfg{$banner}=$cfg;
$banner_cfgs{$banner}{'stubauto'}=$cfg->{'stubauto'};
}
$api->WPBconfig(%cfg);
Line 184 ⟶ 198:
$api->log("Checking $title...");
 
my $intxt=$tok->{'revisions'}[0]{'slots'}{'main'}{'*'} // '';
my ($outtxt,$nowiki)=$api->strip_nowiki($intxt);
 
my @params=()@extra_params;
 
my $assess = undef;
Line 195 ⟶ 209:
next;
}
if($class eq ''){=~s/^\s+|\s+$//g;
$assess=$api->WPBassess($title);
if(ref($assess) eq 'HASH'){
if($assess->{'code'} eq 'pagemissing'){
# No subject page, doesn't matter
$assess=undef;
} else {
$api->warn("Processing $title failed: ".$assess->{'error'}."\n");
next;
}
}
}
 
my $copy_importance = $always_copy_importance; # Always copy?
if($class eq '' || lc($class) eq lc($assess)){
$class='';
} else {
$assess=undef;
push @params, "class=$class";
$copy_importance = 1;
}
 
if($copy_importance){
my $imp = copy_importance($api, $title, $intxt);
if(ref($imp) eq 'HASH'){
Line 213 ⟶ 236:
next;
}
#push @params, "importance=$imp" if ( $set_empty_importance || ($imp//'') eqne '' );
}
 
my $need_main_banner = ($api->WPBcheck($outtxt, $main_banner@main_banners) == 0);
if(0){
# grr, already redirected so the above always returns true
$need_main_banner=1;
$api->WPBcheck($outtxt, sub {
my $banner=shift;
my $name=shift;
$need_main_banner=0 if(grep $name eq $_, @main_banners);
return undef;
}, @main_banners);
}
 
### PROCESSING ###
Line 222 ⟶ 255:
my @merge=();
my @summary=();
my $no_summary = 0;
 
# Special: Different default parent banner depending on source category.
if(@preprocess_templates){
$main_banner = $catmap{$iter->iterval};
 
if(@merge_banners){
(undef,$outtxt)=$api->WPBcheck($outtxt, sub {
my $banner=shift;
Line 231 ⟶ 268:
my $wikitext=shift;
 
myreturn $imp=undef if(grep $name eq $_, @main_banners);
 
foreach (@$params){
push @merge, $imp=$1 if /^\s*importance\s*=\s*(\S.*?)\s*$/oname;
}
push @merge, $banner;
push @params, 'sfba=yes', defined($imp)?"sfba-importance=$imp":() if $banner eq 'SFBAProject';
 
return '' unless $need_main_banner;
$need_main_banner=0;
return "{{$main_banner}}";
}, @preprocess_templatesmerge_banners);
if(ref($outtxt) eq 'HASH'){
$api->warn("Preprocessing $title failed: ".$outtxt->{'error'}."\n");
Line 249 ⟶ 283:
$merge[-1]='and '.$merge[-1] if @merge>1;
push @summary, "merging ".join((@merge>2)?', ':' ', @merge)." into $main_banner" if @merge;
#} else { $no_summary = 1 if @merge;
} else {
# $api->warn("$title contains ".$iter->iterval.", but not in section 0\n");
# next;
}
}
 
if ( @bio_wg ) {
my %added_wg=();
(undef,$outtxt)=$api->WPBcheck($outtxt, sub {
my $banner=shift;
my $name=shift;
my $oname=shift;
my $params=shift;
my $wikitext=shift;
 
my %have = ();
foreach ($api->process_paramlist(@$params)) {
$have{$_->{'name'}} = 1;
}
my $any = 0;
foreach my $p (@bio_wg){
next if exists($have{$p});
push @$params, "$p=yes";
$added_wg{"$p=yes"}=1;
$any = 1;
}
return undef unless $any;
 
my $out="{{$oname";
$out.="|".join("|", @$params) if @$params;
$out.="}}";
return $out;
}, 'WikiProject Biography');
if(ref($outtxt) eq 'HASH'){
$api->warn("WPBIO workgroups in $title failed: ".$outtxt->{'error'}."\n");
next;
}
if(%added_wg){
my @added_wg = keys %added_wg;
$added_wg[-1]='and '.$added_wg[-1] if @added_wg>1;
push @summary, "added " . join((@added_wg>2)?', ':' ', @added_wg) . " to {{WikiProject Biography}}";
}
}
 
my $tag;
my $pg=$title;
$pg=~s/^Talk://;
Line 260 ⟶ 334:
$page=$api->query(
titles => $pg,
prop => 'info',
redirects => 1,
);
if($page->{'code'} eq 'shutoff'){
$api->warn("Task disabled: ".$page->{'content'}."\n");
return 300;
}
if($page->{'code'} ne 'success'){
$api->warn("Could not load $pg info: ".$page->{'error'}."\n");
return 60;
}
 
$page=(values %{$page->{'query'}{'pages'}})[0];
}
 
$outtxt=$api->WPBadd($outtxt,my $assess,@process_banners sub= {();
$api->WPBcheck( $outtxt, sub { shiftpush @process_banners, $_[0]; #}, banner@main_banners );
@process_banners = ( $main_banner shift;) #unless name@process_banners;
for my $process_banner (@process_banners) my $oname=shift;{
my $paramsouttxt=shift;$api->WPBadd($outtxt, $assess, sub {
my $wikitextbanner=shift; # banner
my $newname=shift; # name
return undef if my $newoname=shift;
my $params=shift;
my $wikitext=shift;
my $new=shift;
#return '' if $new;
 
my $prio= return undef unless(grep $banner eq $_, @main_banners);
my $imp%cfg=undef%{$banner_cfgs{$banner}};
 
foreach my $p (@$params){
$prio=$1 ifmy $pany=~/^\s*priority\s*=\s*(\S.*?)\s*$/0;
$imp=$1foreach ifmy $p=~/^\s*importance\s*=\s* (\S.*?@params)\s*$/;{
} next unless $p=~/^(.+?)=(.*)$/;
my ($prio//k,$v)=($1,$imp2);
return $wikitext unless defined( my $kre=qr/\Q$prio)k\E/;
my @pp= if ( defined( $extra_param_aliases{$k} ); ) {
foreach my $paliasre = (@$params)extra_param_aliases{$k};
next if $pkre =~ qr/^\s*(?:priority$kre|importance$aliasre)\s*=/;
if($p=~/^(\s*([^=]*?)\s*=\s*+(?!(?i)no|n|0|$|¬).*?)(\s*)$/ && exists($wg{$2 })){
push @pp,my $1re=qr/\S.*?/;
pushunless(grep(/^\s*$kre\s*=\s*$re\s*$/, @pp, $wgparams)){$2}.'='.$prio.$3;
} else { next if(grep(/^\s*$kre\s*=\s*(?i:\Q$v\E)\s*$/s, @$params));
push unshift @pp$params, "$k=$v" unless(grep(s/^(\s*$kre\s*=\s*?)(?:\S.*?)?(\s*)$/$1$v$2/s, @$pparams));
$any=1 unless $v eq '';
if($k eq 'class' && exists($cfg{'meta'}) && ($cfg{'stubauto'}//'')){
my $aa=$cfg{'stubauto'};
$aa=~s/\s*=.*//;
push @$params, "$aa=inherit" unless(grep(s/^(\s*\Q$aa\E\s*=\s*?)(?:\S.*?)?(\s*)$/$1inherit$2/s, @$params));
}
}
}
if($new && $class && (grep /^class=/, @$params) && exists($cfg{'meta'}) && ($cfg{'stubauto'}//'')){
}
my $paramsaa=\@pp$cfg{'stubauto'};
$aa=~s/\s*=.*//;
push @$params, "$aa=inherit" unless(grep(s/^(\s*\Q$aa\E\s*=\s*?)(?:\S.*?)?(\s*)$/$1inherit$2/s, @$params));
$any=1;
}
return $wikitext unless $any;
 
my if(defined($any=0;cfg{'canonicalize'})){
foreach my $p (@params)n=$cfg{'canonicalize'};
next unless $poname=~s/^(.+?)=(.*)$_/ /g;
my ( $k,$v)oname=~s/^(\s*)\S(?:.*\S)?(\s*)$/$1,$n$2)/is;
my $re=qr/\S/;
unless(grep(/^\s*\Q$k\E\s*=\s*$re/, @$params)){
next if(grep(/^\s*\Q$k\E\s*=\s*\Q$v\E\s*$/s, @$params));
push @$params, "$k=$v" unless(grep(s/^(\s*\Q$k\E\s*=\s*?)(?:\S.*?)?(\s*)$/$1$v$2/s, @$params));
$any=1 if($v ne '' || $k ne 'importance');
}
my $out="{{$oname";
$out.="|".join("|", @$params) if @$params;
$out.="}}";
return $out;
}, $process_banner, @params);
if(ref($outtxt) eq 'HASH'){
$api->warn("Processing $title failed: ".$outtxt->{'error'}."\n");
next;
}
#returnpush @summary, "Tagging with {{$process_banner$wikitexttaggingwith}}" unless $anyno_summary;
 
my $out="{{$oname";
$out.="|".join("|", @$params) if @$params;
$out.="}}";
return $wikitext if $out eq $wikitext;
push @summary, "updating {{$main_banner}} workgroup priority" unless @summary;
return $out;
}, $main_banner, @params);
if(ref($outtxt) eq 'HASH'){
$api->warn("Processing $title failed: ".$outtxt->{'error'}."\n");
next;
}
push @summary, "Tagging with {{$main_banner}}" unless @summary;
 
$outtxt=$api->replace_nowiki($outtxt, $nowiki);
Line 337 ⟶ 417:
my $cat=$iter->iterval;
$summary[-1]='and '.$summary[-1] if @summary>1;
my $summary = ucfirst(join((@summary>2)?', ':' ', @summary))." per $req $errto";
 
my @cleanup=();
Line 346 ⟶ 426:
}
$summary.="; general banner cleanup (".join(', ', @cleanup).")" if @cleanup;
$summary.=". $errto";
 
$api->log("$summary in $title");
Line 373 ⟶ 454:
}
 
1;
</source>
 
</syntaxhighlight>