User:HighInBC/MCP/WaitTillUserEdits

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;