Usuário:SandroHcBot/Código Fonte/SandboxesTask

De RuneScape Wiki
Ir para: navegação, pesquisa

Limpa a sandbox e outras páginas similares.

/*--------------------------------------------------------
 * AmauriceBot - RuneScape Wikia update task robot
 * Copyright (c) 2009-2012  Maurice Abraham.
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 * Contributors:
 *   None
 *------------------------------------------------------*/

package amauricebot;

import java.io.IOException;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

@Description(summary = "Limpa a sandbox e outras páginas similares.")
public class SandboxesTask implements BotTask {
	private WikiSession m_wiki = null;

	private final Actor[] m_actList = { new Cleaner(
			"RuneScape:Sandbox",
			6,
			"^(<!--NÃO ALTERES--><noinclude>\\{\\{Sandboxheader\\}\\}</noinclude><!--NÃO ALTERES-->\n"
					+ "<!---{10,}Por favor, edita a seguir a esta linha. Obrigado-{10,}-->\n?).*$", "$1"),
	};

	public SandboxesTask(WikiSession wiki) {
		m_wiki = wiki;
	}

	public void perform() throws IOException {
		for (Actor act : m_actList) {
			String msg = act.update(m_wiki);
			if (msg != null)
				Utils.log(msg);
		}
	}

	private interface Actor {
		String update(WikiSession wiki) throws IOException;
	}

	private class Cleaner implements Actor {
		private String m_title = null;
		private long m_delayHours = 0;
		private Pattern m_searchPattern = null;
		private String m_replace = null;

		public Cleaner(String title, long delayHours, String search, String replace) {
			m_title = title;
			m_delayHours = delayHours;
			m_searchPattern = Pattern.compile(search, Pattern.DOTALL);
			m_replace = replace;
		}

		public String update(WikiSession wiki) throws IOException {
			// get text
			String text = m_wiki.getText(m_title);
			if (text == null)
				return "ERRO: Não foi possível obter o conteúdo de [[" + m_title + "]]";

			Matcher matcher = m_searchPattern.matcher(text);
			if (!matcher.find())
				return "ERRO: Não foi possível reconhecer o layout de [[" + m_title + "]]";

			// check old enough edit
			Date histDate = m_wiki.getLastTimestamp();
			long ageHours = (histDate == null ? 24 : (System.currentTimeMillis() - histDate.getTime()) / 3600000);
			if (ageHours < m_delayHours)
				return null;

			// make new text
			String newText = matcher.replaceFirst(m_replace);
			if (newText.trim().equals(text.trim()))
				return null;

			// update text
			if (m_wiki.editText(m_title, newText, "Cleanup", false))
				return "O artigo [[" + m_title + "]] foi limpo";
			else
				return "AVISO: Falha ao limpar [[" + m_title + "]] (possível conflicto)";
		}
	}

	private class Merger implements Actor {
		private String m_title = null;
		private String m_source = null;
		private long m_forceDelay = 0;
		private Pattern m_sourcePattern = null;
		private Pattern m_targetPattern = null;

		public Merger(String title, String source, long forceDelay, String sourceMatch, String targetMatch) {
			m_title = title;
			m_source = source;
			m_forceDelay = forceDelay;
			m_sourcePattern = Pattern.compile(sourceMatch, Pattern.DOTALL);
			m_targetPattern = Pattern.compile(targetMatch, Pattern.DOTALL);
		}

		public String update(WikiSession wiki) throws IOException {
			// get source history
			WikiSession.PageRevision[] revisions = m_wiki.getHistory(m_source, 20);
			if (revisions.length < 1)
				return "ERRO: Não foi possível obter o hitórico de [[" + m_source + "]]";
			if (revisions[0].getContent() == null)
				return "ERRO: Não foi possível obter o conteúdo de [[" + m_source + "]]";

			// get new body
			Matcher matcher = m_sourcePattern.matcher(revisions[0].getContent());
			if (!matcher.find())
				return "ERRO: Não foi possível reconheçer o layout de [[" + m_source + "]]";
			String newBody = matcher.group(2);

			// get old target
			String oldText = m_wiki.getText(m_title);
			if (oldText == null)
				return "ERRO: Não foi possível obter o conteúdo de [[" + m_title + "]]";
			matcher = m_targetPattern.matcher(oldText);
			if (!matcher.find())
				return "ERROR: Não foi possível reconheçer o layout de [[" + m_title + "]]";
			String oldBody = matcher.group(2);
			String newText = matcher.group(1) + newBody;

			if (newBody.trim().equals(oldBody.trim()))
				return null;

			// check can update
			Date lastUpdate = m_wiki.getLastTimestamp();
			long age = Utils.ageDays(lastUpdate);
			boolean forced = (age > m_forceDelay);
			boolean canUpdate = forced;
			for (WikiSession.PageRevision rev : revisions) {
				if (canUpdate)
					break; // don't need to test more
				matcher = m_sourcePattern.matcher(rev.getContent());
				if (!matcher.find())
					continue; // skip to next
				String revBody = matcher.group(2);
				if (revBody.trim().equals(oldBody.trim()))
					canUpdate = true;
			}
			if (!canUpdate)
				return "AVISO: Não foi possível atualizar [[" + m_title + "]] (alterado da cópia [[" + m_source + "]])";

			// update text
			if (m_wiki.editText(m_title, newText, "Updated", false))
				return "Atualizado [[" + m_title + "]] de [[" + m_source + "]]" + (forced ? " (forçado)" : "");
			else
				return "AVISO: Falha ao atualizar [[" + m_title + "]] (possível conflicto)";
		}
	}
}