use Perlwikipedia;

my $user = 'DeadLinkBOT'; my $pass = 'XXX';
my $editor=Perlwikipedia->new($user);

$editor->login($user, $pass);

open (INF, "ReadyLinks.lst");
@data = <INF>;
close(INF);

foreach $line (@data) {
   chomp($line);
   undef(@cond);
   undef(@newtext);
   ($oldlink, $mode, $cond[0], $newtext[0], $cond[1], $newtext[1], $cond[2], $newtext[2], $cond[3], $newtext[3], $cond[4], $newtext[4], $cond[5], $newtext[5]) = split(/\|\|/, $line);

   $res = $editor->_get( 'Special:LinkSearch', 'view', "&target=$oldlink&limit=10" );
   $content = $res->decoded_content;
   while ($content =~ m{from <a href="[^"]+" title="([^"]+)">}g) {
      ($title, $junk) = split(/Archive/, $1);
      if ($junk eq "") { push(@articles, $title); }
   }

   foreach $title (@articles) {
      $text = $editor->get_text($title);
      $start = time;
      $replace = "";
      $c = 0;
      while ($c <= 5) {
         ($type, $regrex, $regrex2) = split(/==/, $cond[$c]);
         if ($type eq "*") {
            $replace = $newtext[$c];
            last;
         }
         elsif ($type eq "InTitleAndText") {
            if (($title =~ m/$regrex/) && ($text =~ m/$regrex2/)) {
               $replace = $newtext[$c];
               last;
            }
         }
         elsif ($type eq "InTitle") {
            if ($title =~ m/$regrex/) {
               $replace = $newtext[$c];
               last;
            }
         }
         elsif ($type eq "NotInTitle") {
            if ($title !~ m/$regrex/) {
               $replace = $newtext[$c];
               last;
            }
         }
         elsif ($type eq "InText") {
            if ($text =~ m/$regrex/) {
               $replace = $newtext[$c];
               last;
            }
         }
         elsif ($type eq "NotInText") {
            if ($text !~ m/$regrex/) {
               $replace = $newtext[$c];
               last;
            }
         }
         elsif ($type) {
            print "invalid condition type '$type' found in link '$oldlink' - trying next condition (if available)"; 
         }
         $c++;
      }
      if ($replace) {
         $oldtext = $text;
         $replace =~ s/\\n/\n/g;
         if ($mode == 1) {
            $text =~ s/$oldlink/$replace/g;
         }
         elsif ($mode == 2) {
            $text =~ s/\[?$oldlink.*?\]/$replace/g;
            $text =~ s/$oldlink/$replace/g;
         }
         else {
            print "article '$title' skipped due to invalid mode"; 
            $mode = 999;
         }
         if ($text eq $oldtext) {
            if ($mode != 999) { print "article '$title' skipped due to no changes made ('$oldlink' -> '$replace')";  }
         }
         else {
            $lapsed = time - $start;
            if ($lapsed > 5) { $lapsed = 5; }
            sleep(5 - $lapsed);
            $start = time;
            $title =~ s/[:\/()]/-/g;
            open (OUTF, ">$title.new.txt");
            print OUTF $text;
            close OUTF;
            $lapsed = time - $start;
            if ($lapsed > 5) { $lapsed = 5; }
            sleep(5 - $lapsed);
            $start = time;
         }
      }
      else { 
         print "article '$title' skipped due to no matching conditions for link '$oldlink'"; 
      }
   }
}