Usuari:Iradigalesc Bot/Canvis.py

Aquest és el codi que utilitza el bot per revisar els canvis que es produeixen a la Viquipèdia. Cal executar-lo juntament amb la resta d'scripts del Pywikipediabot. No té cap utilitat ja que s'ha de passat mitjançant un script local, però el poso perquè serveixi per donar idees a altra gent o perquè algú expert m'ajudi a trobar-hi errors. És possible que no estigui actualitzat i que estigui usant una versió modificada de l'script:

#!/usr/bin/python
# -*- coding: utf-8 -*-

"""
Script per detectar i notificar les mancances de les noves pàgines creades a la Viquipèdia com per exemple la negreta inicial, les categories, els enllaços interns o per revertir els canvis clarament vandàlics de les pàgines ja creades.

Només es revisaran les pàgines noves sense les plantilles {{Inacabat}} o {{Enconstrucció}}.

Està pensat per actuar de manera autònoma sense que hi hagi d'intervenir cap humà.

Implementat per l'usuari Iradigalesc amb la col·laboració de Pasqual.
"""

import sys, thread, re, time, irclib
from ircbot import SingleServerIRCBot
import wikipedia

def avisa(titol, usuari, discussio, motiu):
	try:
		contingutdiscussio = discussio.get() + u"\n"
	except wikipedia.IsRedirectPage:
		contingutdiscussio = u""
	except wikipedia.NoPage:
		contingutdiscussio = u""
	if contingutdiscussio == u"":
		if usuari.count(u".") == 3:
			if usuari.replace(u".", u"").isdigit():
				contingutdiscussio = u"{{subst:Registre}}--~~~~\n"
			else:
				contingutdiscussio = u"{{Benvinguda}}--~~~~\n"
		else:
			contingutdiscussio = u"{{Benvinguda}}--~~~~\n"
	if motiu == u"ninapropiat":
		discussio.put(contingutdiscussio + u"{{subst:Usuari:Iradigalesc Bot/Destrucció/Contingut inapropiat/Avís|%s}}" %titol, u"Avís automàtic per destrucció a causa de contingut inapropiat en la pàgina [[%s]]." %titol, minorEdit=False)
		return
	if motiu == u"nbreu":
		discussio.put(contingutdiscussio + u"{{subst:Usuari:Iradigalesc Bot/Destrucció/Massa breu/Avís|%s}}" %titol, u"Avís automàtic per destrucció a causa de la brevetat de la pàgina [[%s]]." %titol, minorEdit=False)
		return
	if motiu == u"nformat":
		discussio.put(contingutdiscussio + u"{{subst:Usuari:Iradigalesc Bot/Millorar/Avís|%s}}" %titol, u"Avís automàtic de bot en la pàgina [[%s]] per millorar-ne el format de la negreta inicial i dels enllaços interns." %titol, minorEdit=False)
		return
	if motiu == u"nnegreta":
		discussio.put(contingutdiscussio + u"{{subst:Usuari:Iradigalesc Bot/Millorar/Negreta/Avís|%s}}" %titol, u"Avís automàtic de bot en la pàgina [[%s]] per millorar-ne el format de la negreta inicial." %titol, minorEdit=False)
		return
	if motiu == u"nenllaços":
		discussio.put(contingutdiscussio + u"{{subst:Usuari:Iradigalesc Bot/Millorar/Enllaços/Avís|%s}}" %titol, u"Avís automàtic de bot en la pàgina [[%s]] per millorar-ne el format dels enllaços interns." %titol, minorEdit=False)
		return
	if motiu == u"eesborrat":
		discussio.put(contingutdiscussio + u"{{subst:Usuari:Iradigalesc Bot/Revertit/Esborrat|%s}}" %titol, u"Avís automàtic de reverssió de bot en la pàgina [[%s]]." %titol, minorEdit=False)
		return
	if motiu == u"einapropiat":
		discussio.put(contingutdiscussio + u"{{subst:Usuari:Iradigalesc Bot/Revertit/Inapropiat|%s}}" %titol, u"Avís automàtic de reverssió de bot en la pàgina [[%s]]." %titol, minorEdit=False)
		return
	if motiu == u"introduccio":
		discussio.put(contingutdiscussio + u"{{subst:Usuari:Iradigalesc Bot/Revertit/Introducció|%s}}" %titol, u"Avís automàtic de reverssió de bot en la pàgina [[%s]]." %titol, minorEdit=False)
		return
	if motiu == u"OD":
		discussio.put(contingutdiscussio + u"{{subst:Usuari:Iradigalesc Bot/OD|%s}}" %titol, u"Avís automàtic de plantilla OD a [[%s]]." %titol, minorEdit=False)
		return
	if motiu == u"JD":
		discussio.put(contingutdiscussio + u"{{subst:Usuari:Iradigalesc Bot/JD|%s}}" %titol, u"Avís automàtic de plantilla JD a [[%s]]." %titol, minorEdit=False)
		return

def introduccio(titol, pagina, usuari, discussio):
	try:
		contingut = pagina.get()
		contingutantic = pagina.getPreviousVersion()
	except wikipedia.IsRedirectPage:
		return
	except wikipedia.NoPage:
		return
	if not u"{{Si us plau, no esborreu aquesta línia}}" in contingut:
		if u"{{Si us plau, no esborreu aquesta línia}}" in contingutantic:
			pagina.put(contingutantic, u"[[VP:B|Bot]] revertint els canvis de [[User:%s|%s]] ([[Special:Contributions/%s|contribucions]] · [[User talk:%s|discussió]]) per suprimir la línia \"{{Si us plau, no esborreu aquesta línia}}\"." %(usuari, usuari, usuari, usuari))
			avisa(titol, usuari, discussio, u"introduccio")
			print u"-[[%s]] (editat per %s) s'ha revertit; suprimida plantilla introducció." %(titol, usuari)
			return

def novaimatge(imatge, usuari, discussio):
	pagina = wikipedia.Page(wikipedia.getSite(), imatge)
	try:
		contingut = pagina.get()
	except wikipedia.IsRedirectPage:
		return
	except wikipedia.NoPage:
		return
	if contingut == u"":
		pagina.put(contingut + u"\n{{OD|--~~~~}}", u"[[VP:B|Bot]] afegint la plantilla d'Origen Desconegut a la imatge carregada per [[User:%s|%s]] ([[Special:Contributions/%s|contribucions]] · [[User talk:%s|discussió]])." %(usuari, usuari, usuari, usuari))
		avisa(imatge, usuari, discussio, u"OD")
		print u"-[[%s]] (pujat per %s) s'ha marcat amb OD." %(imatge, usuari)
		return
	if not u"{{Justificaci" in contingut:
		pagina.put(contingut + u"\n{{JD|--~~~~}}", u"[[VP:B|Bot]] afegint la plantilla de Justificació Desconeguda a la imatge carregada per [[User:%s|%s]] ([[Special:Contributions/%s|contribucions]] · [[User talk:%s|discussió]])." %(usuari, usuari, usuari, usuari))
		avisa(imatge, usuari, discussio, u"JD")
		print u"-[[%s]] (pujat per %s) s'ha marcat amb JD." %(imatge, usuari)
		return

def novaedicio(titol, pagina, usuari, discussio, exprVulgars):
	try:
		contingut = pagina.get()
		contingutantic = pagina.getPreviousVersion()
	except wikipedia.IsRedirectPage:
		return
	except wikipedia.NoPage:
		return
	if 10*len(contingut) < len(contingutantic):
		pagina.put(contingutantic, u"[[VP:B|Bot]] revertint els canvis de [[User:%s|%s]] ([[Special:Contributions/%s|contribucions]] · [[User talk:%s|discussió]]) per suprimir gran part del contingut." %(usuari, usuari, usuari, usuari))
		avisa(titol, usuari, discussio, u"eesborrat")
		print u"-[[%s]] (editat per %s) s'ha revertit; supressió de contingut." %(titol, usuari)
		return
	if re.search(exprVulgars, contingut +r"", re.I) is not None:
		if re.search(exprVulgars, contingutantic +r"", re.I) is None:
			pagina.put(contingutantic, u"[[VP:B|Bot]] revertint els canvis de [[User:%s|%s]] ([[Special:Contributions/%s|contribucions]] · [[User talk:%s|discussió]]) per afegir contingut inapropiat." %(usuari, usuari, usuari, usuari))
			avisa(titol, usuari, discussio, u"einapropiat")
			print u"-[[%s]] (editat per %s) s'ha revertit; afegit contingut inapropiat." %(titol, usuari)
			return

def novapagina(titol, pagina, usuari, discussio, exprVulgars):
	try:
		contingut = pagina.get()
	except wikipedia.IsRedirectPage:
		return
	except wikipedia.NoPage:
		return
	ignora = r"(\{\{([Dd]esambiguaci|[Ii]nacabat|[Ee]nconstrucci)|[Ll]listat?)"
	if re.search(ignora, contingut +r"") is not None:
		return
	if re.search(exprVulgars, contingut +r"", re.I) is not None:
		if len(contingut) < 1000:
			pagina.put(u"{{Usuari:Iradigalesc Bot/Destrucció/Contingut inapropiat}}" + u"\n" + contingut, u"[[VP:B|Bot]] marcant pàgina de [[User:%s|%s]] ([[Special:Contributions/%s|contribucions]] · [[User talk:%s|discussió]]) per destruir automàticament degut a contingut inapropiat." %(usuari, usuari, usuari, usuari))
			avisa(titol, usuari, discussio, u"ninapropiat")
			print u"-[[%s]] (creat per %s) s'ha marcat per destruir; contingut inapropiat." %(titol, usuari)
			return
	if len(contingut) < 100:
		pagina.put(u"{{Usuari:Iradigalesc Bot/Destrucció/Massa breu}}" + u"\n" + contingut, u"[[VP:B|Bot]] marcant pàgina de [[User:%s|%s]] ([[Special:Contributions/%s|contribucions]] · [[User talk:%s|discussió]]) per destruir automàticament degut a la seva brevetat." %(usuari, usuari, usuari, usuari))
		avisa(titol, usuari, discussio, u"nbreu")
		print u"-[[%s]] (creat per %s) s'ha marcat per destruir; massa breu." %(titol, usuari)
		return
	negreta = enllacos = False
	if not u"'''" in contingut:
		if not "[[" + titol + "]]" in contingut:
			negreta = True
	if not u"[[" in contingut:
		enllacos = True
	if negreta and enllacos:
		pagina.put(u"{{Usuari:Iradigalesc Bot/Millorar}}" + u"\n" + contingut, u"[[VP:B|Bot]] marcant pàgina de [[User:%s|%s]] ([[Special:Contributions/%s|contribucions]] · [[User talk:%s|discussió]]) per millorar a causa de la negreta inicial i dels enllaços interns." %(usuari, usuari, usuari, usuari))
		avisa(titol, usuari, discussio, u"nformat")
		print u"-[[%s]] (creat per %s) s'ha marcat per millorar-ne el format; negreta i enllaços." %(titol, usuari)
		return
	else:
		if negreta:
			pagina.put(u"{{Usuari:Iradigalesc Bot/Millorar/Negreta}}" + "\n" + contingut, u"[[VP:B|Bot]] marcant pàgina de [[User:%s|%s]] ([[Special:Contributions/%s|contribucions]] · [[User talk:%s|discussió]]) per millorar a causa de la negreta inicial." %(usuari, usuari, usuari, usuari))
			avisa(titol, usuari, discussio, u"nnegreta")
			print u"-[[%s]] (creat per %s) s'ha marcat per millorar-ne el format; negreta." %(titol, usuari)
			return
		if enllacos:
			pagina.put(u"{{Usuari:Iradigalesc Bot/Millorar/Enllaços}}" + "\n" + contingut, u"[[VP:B|Bot]] marcant pàgina de [[User:%s|%s]] ([[Special:Contributions/%s|contribucions]] · [[User talk:%s|discussió]]) per millorar a causa dels enllaços interns." %(usuari, usuari, usuari, usuari))
			avisa(titol, usuari, discussio, u"nenllaços")
			print u"-[[%s]] (creat per %s) s'ha marcat per millorar-ne el format; enllaços." %(titol, usuari)
			return

class TestBot(SingleServerIRCBot):
	def __init__(self, channel, nickname, server, port=6667, reconnection_interval=5):
		SingleServerIRCBot.__init__(self, [(server, port)], nickname, nickname)
		self.channel = channel
		self.nickname = nickname
		self.angus = 0

	def keepitgoin(self):
		printedyet = False
		while True:
			if not self.connection.is_connected():
				printedyet = False
				self.connection.disconnect()
			else:
				if not printedyet:
					printedyet = True
				pass
			time.sleep(30)
	def on_nicknameinuse(self, c, e):
		c.nick(c.get_nickname() + '_')

	def on_welcome(self, c, e):
		c.join(self.channel)
		thread.start_new_thread(self.keepitgoin, ())

	def on_join(self, c, e):
		pass

	def on_kick(self, c, e):
		nick = nm_to_n(e.source())
		c.join(self.channel)

	def on_privmsg(self, c, e):
		orig = (e.arguments()[0]).decode('utf-8', 'replace')
		lastgots.append(time.time())
		lastgots.remove(lastgots[0])
		pass

	def on_pubmsg(self, c, e):
		missatge = (e.arguments()[0]).decode('utf-8', 'replace')
		titol = missatge.split(u"[[")[1]
		titol = titol[3:].split(u"]]")[0]
		titol = titol[:-3]
		if titol == u"Viquipèdia:Pàgina de proves":
			return
		usuari = missatge.split(u"5*")[1]
		usuari = usuari[5:].split(u"5*")[0]
		usuari = usuari[:-3]
		administradors = (u"Barcelona", u"Brion VIBBER", u"Dúnadan", u"Felato", u"Friviere", u"Joanjoc", u"Jordicollcosta", u"Lohen11‎", u"Makinal", u"Martorell", u"Oersted", u"Paucabot", u"Pepetps", u"Plàcid Pérez Bru", u"SMP", u"Vriullop", u"Xevi", u"Xtv")
		for administrador in administradors:
			if administrador == usuari:
				return
		pagina = wikipedia.Page(wikipedia.getSite(), titol)
		discussio = wikipedia.Page(wikipedia.getSite(), u"User talk:" + usuari)
		if titol == u"Viquipèdia:Introducció":
			introduccio(titol, pagina, usuari, discussio)
			return
		if titol == u"Viquipèdia:Introducció/Simple":
			introduccio(titol, pagina, usuari, discussio)
			return
		exprVulgars = r"\b(put(ad)?[ae]s?|fuck(ing|e[dr])?|culo?s?|fot(re|[ie]n)|(foll|jod)[ae][nr]|cacalane?s|vi[xs]ca lo regne de valencia|tont[ao]s?|mi?erd[ae]s?)\b"
		if pagina.namespace() == -1:
			if "upload" in titol:
				imatge = missatge.split(u"[[")[2]
				imatge = imatge.split(u"]]")[0]
				imatge = imatge[3:]
				imatge = imatge[:-3]
				novaimatge(imatge, usuari, discussio)
		espais=[1,5,7,9,11,13,14,15,101,103]
		for espai in espais:
			if pagina.namespace() == espai:
                		return
		if pagina.namespace() == 2:
			if titol == u"Usuari:" + usuari:
				return
			if u"Usuari:" + usuari + u"/" in titol:
				return
		if pagina.namespace() == 3:
			if titol == u"Usuari Discussió:" + usuari:
				return
			if u"Usuari Discussió:" + usuari + u"/" in titol:
				return
			exprVulgars = ""
		opcions = missatge.split(u"]]")[1]
		opcions = opcions.split(u"02http://")[0]
		if u"N" in opcions:
			novapagina(titol, pagina, usuari, discussio, exprVulgars)
		else:
			novaedicio(titol, pagina, usuari, discussio, exprVulgars)

def main():
	channel = '#ca.wikipedia'
	nickname = 'IradiBot'
	while True:
		bot = TestBot(channel, nickname, 'irc.wikimedia.org', 6667)
		bot.start()

if __name__ == '__main__':
	try:
		estat = wikipedia.Page(wikipedia.getSite(), u"Usuari:Iradigalesc Bot/Estat")
		estat.put(u"Funcionant", u"[[VP:B|Bot]] en marxa.")
		main()
	finally:
		estat = wikipedia.Page(wikipedia.getSite(), u"Usuari:Iradigalesc Bot/Estat")
		estat.put(u"Aturat", u"[[VP:B|Bot]] aturat.")
		wikipedia.stopme()