User:MadmanBot/Source/zerozero.php

<?php

require_once '../config.php';
$log->setIdent('zerozero');

// Initialize Dementia
require_once '../dementia/Dementia.php';
Dementia::init('http://en.wikipedia.org', 'enwiki-p.rrdb.toolserver.org');

// Obtain login token
$login = DementiaAction::factory('login');
$result = $login->setName(BOT_NAME)->setPassword(BOT_PASSWORD)->execute();

if (!isset($result['token']))
{
	$log->err('Unable to obtain login token');
	exit;
}

// Log in and get authentication tokens
$login->setToken($result['token']);
$result = $login->execute();

if (!isset($result['result']) || $result['result'] !== 'Success')
{
	$log->err('Unable to log in and get authentication tokens');
	exit;
}

// Find last revision of all pages linking to www.zerozerofootball.com
$exturlusage = DementiaQuery::factory('exturlusage');
$exturlusage->setQuery('www.zerozerofootball.com')->setNamespace(0);
$revisions = DementiaQuery::factory('revisions');
$revisions->setGenerator($exturlusage)->setProp('content');

while (($pages = $revisions->execute()) !== false)
{
	// Loop through pages
	foreach ($pages as $page)
	{
		// Find bare links
		$content = $page['revisions'][0]['*'];
		preg_match_all($ExtLinkRegex, $content, $matches, PREG_OFFSET_CAPTURE);

		// Loop through links
		$offset = 0;
		foreach ($matches[0] as $key => $match)
		{
			// Get line of content
			$match[1] += $offset;
			$start = strrpos($content, "\n", -strlen($content) + $match[1]) + 1;
			$length = strpos($content, "\n", $match[1]) - $start;
			$line = substr($content, $start, $length);

			$link = $match[0];
			$parsed_link = parse_url($link);
			
			// Skip link if not within scope
			if ($parsed_link['host'] != 'www.zerozerofootball.com')
				continue;
				
			// Replace host in link
			$replacement = http_build_url(array_merge($parsed_link, 
				array('host' => 'www.footballzz.co.uk')));
				
			// Replace link within line
			$line = str_replace($link, $replacement, $line);

			// Replace host in line
			$line = str_ireplace('zerozerofootball.com', 'footballzz.co.uk', $line);

			// Replace line within content
			$content = substr_replace($content, $line, $start, $length);
			$offset += strlen($line) - $length;
		}

		// Find bracketed links
		preg_match_all($ExtLinkBracketedRegex, $content, $matches, PREG_OFFSET_CAPTURE);

		// Loop through links
		$offset = 0;
		foreach ($matches[0] as $key => $match)
		{
			$link = $match[0];
			$link_url = $matches[1][$key][0];
			$link_text = $matches[3][$key][0];
			$parsed_url = parse_url($link_url);

			// Skip link if not within scope of task
			if ($parsed_url['host'] != 'www.footballzz.co.uk')
				continue;

			if ($parsed_url['path'] == '/jogador.php')
			{
				// Replace link with template
				parse_str($parsed_url['query'], &$query);
				$replacement = "{{Zerozero profile|id=$query[id]}}";
			}
			else
			{
				// Replace host in link text
				$new_text = str_ireplace('zerozerofootball.com', 'footballzz.co.uk', $link_text);
				$replacement = str_replace($link_text, $new_text, $link);
			}

			// Replace link within content
			$content = substr_replace($content, $replacement, $match[1], strlen($link));
			$offset += strlen($replacement) - strlen($link);
		}
		
		if ($content == $page['revisions'][0]['*'])
		{
			$log->warning("[[$page[title]]]: No changes were made");
			continue;
		}
		
		if (strpos($content, 'zerozerofootball.com') !== FALSE)
		{
			$log->warning("[[$page[title]]]: References to zerozerofootball.com remain");
			continue;
		}

		// Edit content of page
		$edit = DementiaAction::factory('edit')->setTitle($page['title']);
		$edit->setMinor(true)->setBot(true);
		$edit->text = $content;
		$edit->summary = 'Replacing links to www.zerozerofootball.com [[Wikipedia:' . 
			'Bot requests#Bot needed to convert links to a template|by request]]';

		$info = DementiaQuery::factory('info')->setTitles($page['title'])->setToken('edit');
		$result = $info->execute();
		$result = $edit->setToken($result['edittoken'])->execute();
		if (!isset($result['result']) || $result['result'] !== 'Success')
			$log->err("Unable to edit [[$page[title]]]: " . json_encode($result));
		else
			$log->info("Edited [[$page[title]]] successfully");
	}
}