User:HighInBC/MCP/WaitTillUserEdits
Appearance
< User:HighInBC | MCP
This is a plugin, not a stand alone program.
This is a stable version, but I am going to add more features.
package HBCPlugins::WaitTillUserEdits; use MediaWiki; use URI::Escape; use Data::Dumper; our $self; sub new { shift; $self = shift; bless($self); &{$self->{shared}{add_job}}(\&scan_for_wait_till_edit_template,30); return $self; } sub set_info { my $self = shift; my $type = shift; my $value = shift; if ($type eq 'client') {$self->{WP_obj} = $value;} elsif ($type eq 'panel' ) {$self->{params}{param} = $value;} return 1; } sub scan_for_wait_till_edit_template { warn "Scanning for {{UAA|wt}} templates\n"; unless ($self->{WP_obj} && $self->{params}{param}{'Default target'}) { warn "Still waiting for needed information from name watcher, will wait.\n"; &{$self->{shared}{add_job}}(\&scan_for_wait_till_edit_template,120); return; } my $page = $self->{WP_obj}->get($self->{params}{param}{'Default target'}, 'r'); my @lines = split("\n",$page->{'content'}); my $current_report; my %users_to_check; my %users_to_update; foreach my $line (@lines) { $line =~ s|\n||g; $current_report = $1 if ($line =~ m/\{\{user-uaa\|1=(.*?)\}\}/i); if ($line =~ m/\{\{UAA\|wt\}\}/ && $current_report) { $users_to_check{uri_escape($current_report)} = 1; } if ($line =~ m/\{\{UAA\|hasedited\}\}.*?made (\d+) edit/) { delete($users_to_check{uri_escape($current_report)}); $users_to_update = $1; } } $self->{wait_for_edit} = \%users_to_update; my %user_contribs = query_contribs(keys(%users_to_check)); my $delay = 5; foreach my $name (keys(%user_contribs)) { my $edit_count = $user_contribs{$name}; my $message = 'This user has now made '.(($edit_count > 1) ? "$edit_count edits" : '1 edit'); &{$self->{shared}{add_job}}([\&add_note_to_report, $name, $message],$delay); $delay += 5; } &{$self->{shared}{add_job}}(\&scan_for_wait_till_edit_template,120); } sub query_contribs { my @users_to_check = @_; my $name_url_string = join('|',@users_to_check); my $url = 'http://en.wikipedia.org/w/api.php?action=query&list=users&ususers=<NAMES>&usprop=editcount&format=yaml'; $url =~ s|<NAMES>|$name_url_string|; warn "Scan complete\n"; my %user_contribs; if (scalar(@users_to_check)) { warn "Running a query on ".scalar(@users_to_check)." usernames.\n"; my $data = $self->{WP_obj}->{ua}->get($url)->content(); my @lines = split("\n", $data); while (my $line = shift(@lines)) { $line =~ s|\n||g; if ($line =~ m|\s+-|) { my $name = shift(@lines); $name =~ m|name: (.+)|; $name = $1; my $edit_count = shift(@lines); $edit_count =~ m|editcount: (\d+)|; $edit_count = $1; warn "\tQuery result: $name - $edit_count\n"; $user_contribs{$name} = $edit_count if ($edit_count > 0); } } } else { warn "No users need a query ran, skipping\n"; } warn "Query complete\n"; return %user_contribs; } sub add_note_to_report { my ($username, $note) = @_; warn "Adding note to '$username': $note\n"; my $page = $self->{WP_obj}->get($self->{params}{param}{'Default target'}, 'rw'); return unless $page->{'content'}; my(@content) = split("\n",$page->{'content'}); # Split into lines my (@new_content); # Place to put replacement content my $report_name; LINE: while (scalar(@content)) { my $line = shift(@content); push(@new_content, $line); $report_name = $1 if ($line =~ m/\{\{user-uaa\|1=(.*?)\}\}/i); unless ($report_name eq $username) { # Find the correct report. next LINE; } unless ($content[0] =~ m|^\s*$| || $content[0] =~ m/\{\{user-uaa\|1=(.*?)\}\}/) { # Find first blank line or next report next LINE; # Empty line } push(@new_content, '::{{UAA|hasedited}} '.$note.' ~~~~'); $report_name = undef; } $page->{'content'} = join("\n",@new_content); $page->{'summary'} = "Adding note to '$username': $note"; $page->save(); warn "done.\n"; return; } 1;