Usuário:Danilo.bot/wikiprojetos.py

# -*- coding: utf-8  -*-
"""
Este robô utiliza os geguientes comandos:

-projeto:PROJETO          Wikiprojeto onde a lista será salva

-listarev:ASSUNTO         Gera a lista de todos artigos da categoria
                          '!Artigos a revisar sobre ASSUNTO' por ordem de importância e tempo
                          que espera a revisão e salva entre as tags <!--BOT-Start:revisão-->
                          e <!--BOT-End:revisão--> que já devem existir na página do projeto

-matrizgeral              Gera uma matriz geral baseada nas matrizes afluentes da predefinição
                          'Matriz de classificação' e salva em 'Wikipédia:Conselho de WikiProjetos/matriz'
                   
-matriz:ASSUNTO           Gera a matriz de classificação de um assunto e salva na página 
                          'Wikipédia:Projetos/PROJETO/Matriz' caso o projeto tenha sido informado

-participantes:PROJETO    Separa a lista da página "Wikipédia:Projetos/PROJETO/Participantes" em ativos e
                          inativos, desde que esteja de forma padronizada, ou seja, em listas "#~~~~" e não
                          tenham nada abaixo da lista (todo conteúdo abaixo da lista é deletado).
                          
"""
import re, time, sys
import wikipedia as pywikibot
import catlib, query

mes = {u'janeiro': u'01', u'fevereiro': u'02', u'março': u'03', u'abril': u'04', u'maio': u'05', u'junho': u'06',
	u'julho': u'07', u'agosto': u'08', u'setembro': u'09', u'outubro': u'10', u'novembro': u'11', u'dezembro': u'12'}

def main(*args):
    site = pywikibot.getSite()
    projeto = u''
    for arg in pywikibot.handleArgs(*args):
	if arg.startswith('-projeto:'):
	    projeto = arg[9:]
	elif arg.startswith('-assunto:'):
	    assunto = arg[9:]
	elif arg == "-matrizgeral":
	    predef = pywikibot.Page(site,u"Predefinição:Matriz de classificação")
	    tabela = u"{| class=\"wikitable sortable\" style=\"min-width:600px;text-align:center\"\n"
	    tabela += u"|-\n!Qualidade||<big>?</big>||colspan=4|1||colspan=4|2||colspan=4|3||colspan=4|4||colspan=4|5||colspan=4|6\n"
	    tabela += u"|-\n!Importância||1 a 4||1||2||3||4||1||2||3||4||1||2||3||4||1||2||3||4||1||2||3||4||1||2||3||4\n"
            for page in predef.getReferences(onlyTemplateInclusion=True):
		titulo = page.title()
		if re.search(r"/[Mm]atriz$",titulo):
		    texto = page.get()
		    if not re.search(ur"{{Matriz de classificação",texto):
			pywikibot.output(u"%s não tem matriz" % titulo)
			if pywikibot.input(u'continuar buscando? (s/n)') == 'n': return
			continue
		    n = re.findall(r"(?<=\| )\d+",texto)
		    sobre = re.findall(r"(?<=sobre=).+?(?=\n}})",texto)[0]
		    tabela += u"|-\n|style=\"text-align:left\"|[[%s|%s]]||{{PAGESINCAT:!Artigos de qualidade desconhecida sobre %s}}\n" % (titulo,sobre,sobre)
		    tabela += u"|%s||%s||%s||%s||%s||%s||%s||%s||%s||%s||%s||%s" % (n[21],n[14],n[7],n[0],n[22],n[15],n[8],n[1],n[23],n[15],n[9],n[2])
		    tabela += u"||%s||%s||%s||%s||%s||%s||%s||%s||%s||%s||%s||%s\n" % (n[24],n[16],n[10],n[3],n[25],n[17],n[11],n[4],n[26],n[18],n[12],n[5])
		    pywikibot.output(u"+ matriz sobre %s" % sobre)
		    continue
		else:
		    pywikibot.output(u'%s não é uma matriz...' % titulo)
	    tabela += u"|}"
	    salvar = pywikibot.input(u'Salvar, exibir ou cancelar? (s/e/c)')
	    if salvar == 'e':
		pywikibot.output(tabela)
		salvar = pywikibot.input(u'Salvar ou cancelar? (s/c)')
	    if salvar == 's':
		pagmatriz = pywikibot.Page(site,u"Wikipédia:Conselho de WikiProjetos/matriz")
		pagmatriz.put(tabela,comment=u"atualizando matriz")
	elif arg.startswith('-listarev:'):
	    sobre = arg[10:]
	    categoria = catlib.Category(site, u'Categoria:!Artigos a revisar sobre %s' % sobre)
	    lista = []
	    contador = 0
	    for page in categoria.articles():
		cats = page.categories(api=True)
		cats = [x.title() for x in cats]
		desde = None
		data = '999999'
		cat = [cat for cat in cats if cat.startswith(u'Categoria:!Artigos a revisar desde ')]
		if cat:
		    desde = cat[0][35:]
		    data = [re.findall(ur'\d+',desde)[0], re.findall(ur'\S+(?= de)',desde)[0], re.findall(ur'(?<= de /d/d)/d/d',desde)[0]]
		    if data[1] in mes: data[1] = mes[data[1]]
		    elif pywikibot.input(u'Data da revisão de  \"%s\" fora do padrão: %s .. continuar buscando? (s/n)' % (page.title(),desde)) == 'n': return
		    else: data = '999999'
		    if data != '999999': data = ''.join(data)
		discus = page.toggleTalkPage()
		dcats = discus.categories(api=True)
		dcats = [x.title() for x in dcats]
		imp = None
		dcats = [dcat for dcat in dcats if dcat.startswith(u'Categoria:!Artigos de importância ')]
		for dcat in dcats:
		    if dcat.split()[-1].lower() != sobre.lower(): continue
		    imp = dcat[34:35]
		    if imp == 'd': imp = u'desconhecida'
		    lista.append((page.title(),u'De importância '+imp,data,desde))
		    pywikibot.output(u'>Importância %s, data = %s' % (imp,desde))
		    contador += 1
		if not imp:
		    lista.append((page.title(),u'Sem marca',data,desde))
		    pywikibot.output(u'>Sem marca, data = %s' % desde)
		    contador += 1
		if contador % 10 == 0:
		    if pywikibot.input(u' .. Continuar buscando? (s/n)') == 'n': return
	    listafinal = []
	    listafinal.append([x for x in lista if x[1] == u'De importância 4'])
	    listafinal.append([x for x in lista if x[1] == u'De importância 3'])
	    listafinal.append([x for x in lista if x[1] == u'De importância 2'])
	    listafinal.append([x for x in lista if x[1] == u'De importância 1'])
	    listafinal.append([x for x in lista if x[1] == u'De importância desconhecida'])
	    listafinal.append([x for x in lista if x[1] == u'Sem marca'])
	    for lst in listafinal: lst.sort(key= lambda x: int(x[2]))
	    saida = ''
	    for imp in listafinal:
		if not imp: continue
		saida += u'\n==== %s ====\n' % imp[0][1]
		for artigo in imp:
		    if artigo[3]: saida += u'* [[%s]] <small>(desde %s)</small>\n' % (artigo[0],artigo[3].lower())
		    else: saida += u'* [[%s]]\n' % artigo[0]
	    saida += u"\n\n<sub>'''última atualização:''' ~~~~~</sub>\n"
	    if not projeto:
		pywikibot.output(saida)
		return
	    salvar = pywikibot.input(u'Salvar, exibir ou cancelar? (s/e/c)')
	    if salvar == 'e':
		pywikibot.output(saida)
		salvar = pywikibot.input(u'Salvar ou cancelar? (s/c)')
	    if salvar == 's':
		projeto = pywikibot.Page(site,u'Wikipédia:Projetos/'+projeto)
		texto = projeto.get()
		texto = re.sub(ur'(?s)<!--BOT-Start:revisão-->.*?<!--BOT-End:revisão-->',u'<!--BOT-Start:revisão-->\n'+saida+u'\n<!--BOT-End:revisão-->',texto)
		projeto.put(texto,comment=u"bot atualizando lista de artigos a revisar")
	elif arg.startswith('-matriz:'):
	    sobre = arg[8:]
	    q0 = catlib.Category(site,u'!Artigos de qualidade desconhecida sobre '+sobre).articlesList()
	    q1 = catlib.Category(site,u'!Artigos de qualidade 1 sobre '+sobre).articlesList()
	    q2 = catlib.Category(site,u'!Artigos de qualidade 2 sobre '+sobre).articlesList()
	    q3 = catlib.Category(site,u'!Artigos de qualidade 3 sobre '+sobre).articlesList()
	    q4 = catlib.Category(site,u'!Artigos de qualidade 4 sobre '+sobre).articlesList()
	    q5 = catlib.Category(site,u'!Artigos bons sobre '+sobre).articlesList()
	    if len(q5) == 0: q5 = catlib.Category(site,u'!Artigos de qualidade 5 sobre '+sobre).articlesList()
	    q6 = catlib.Category(site,u'!Artigos destacados sobre '+sobre).articlesList()
	    if len(q6) == 0: q6 = catlib.Category(site,u'!Artigos de qualidade 6 sobre '+sobre).articlesList()
	    i0 = catlib.Category(site,u'!Artigos de importância desconhecida sobre '+sobre).articlesList()
	    i1 = catlib.Category(site,u'!Artigos de importância 1 sobre '+sobre).articlesList()
	    i2 = catlib.Category(site,u'!Artigos de importância 2 sobre '+sobre).articlesList()
	    i3 = catlib.Category(site,u'!Artigos de importância 3 sobre '+sobre).articlesList()
	    i4 = catlib.Category(site,u'!Artigos de importância 4 sobre '+sobre).articlesList()
	    q0i0 = [p for p in q0 if p in i0]
	    q0i1 = [p for p in q0 if p in i1]
	    q0i2 = [p for p in q0 if p in i2]
	    q0i3 = [p for p in q0 if p in i3]
	    q0i4 = [p for p in q0 if p in i4]
	    q1i0 = [p for p in q1 if p in i0]
	    q1i1 = [p for p in q1 if p in i1]
	    q1i2 = [p for p in q1 if p in i2]
	    q1i3 = [p for p in q1 if p in i3]
	    q1i4 = [p for p in q1 if p in i4]
	    q2i0 = [p for p in q2 if p in i0]
	    q2i1 = [p for p in q2 if p in i1]
	    q2i2 = [p for p in q2 if p in i2]
	    q2i3 = [p for p in q2 if p in i3]
	    q2i4 = [p for p in q2 if p in i4]
	    q3i0 = [p for p in q3 if p in i0]
	    q3i1 = [p for p in q3 if p in i1]
	    q3i2 = [p for p in q3 if p in i2]
	    q3i3 = [p for p in q3 if p in i3]
	    q3i4 = [p for p in q3 if p in i4]
	    q4i0 = [p for p in q4 if p in i0]
	    q4i1 = [p for p in q4 if p in i1]
	    q4i2 = [p for p in q4 if p in i2]
	    q4i3 = [p for p in q4 if p in i3]
	    q4i4 = [p for p in q4 if p in i4]
	    q5i0 = [p for p in q5 if p in i0]
	    q5i1 = [p for p in q5 if p in i1]
	    q5i2 = [p for p in q5 if p in i2]
	    q5i3 = [p for p in q5 if p in i3]
	    q5i4 = [p for p in q5 if p in i4]
	    q6i0 = [p for p in q6 if p in i0]
	    q6i1 = [p for p in q6 if p in i1]
	    q6i2 = [p for p in q6 if p in i2]
	    q6i3 = [p for p in q6 if p in i3]
	    q6i4 = [p for p in q6 if p in i4]
	    matriz = u'{{Matriz de classificação\n'
	    matriz += u'| %d | %d | %d | %d | %d | %d | %d\n' % (len(q1i4),len(q2i4),len(q3i4),len(q4i4),len(q5i4),len(q6i4),len(q0i4))
	    matriz += u'| %d | %d | %d | %d | %d | %d | %d\n' % (len(q1i3),len(q2i3),len(q3i3),len(q4i3),len(q5i3),len(q6i3),len(q0i3))
	    matriz += u'| %d | %d | %d | %d | %d | %d | %d\n' % (len(q1i2),len(q2i2),len(q3i2),len(q4i2),len(q5i2),len(q6i2),len(q0i2))
	    matriz += u'| %d | %d | %d | %d | %d | %d | %d\n' % (len(q1i1),len(q2i1),len(q3i1),len(q4i1),len(q5i1),len(q6i1),len(q0i1))
	    matriz += u'| %d | %d | %d | %d | %d | %d | %d\n' % (len(q1i0),len(q2i0),len(q3i0),len(q4i0),len(q5i0),len(q6i0),len(q0i0))
	    matriz += u'|sobre=%s\n}}\n<small>\'\'\'última atualização\'\'\': ~~~~~ </small>\n' % sobre
	    if projeto:
		page = pywikibot.Page(site,u'Wikipédia:Projetos/'+projeto+u'/matriz')
		if page.exists():
		    texto = page.get()
		    texto = re.sub(ur'(?s)<!-- ### inicio ### -->.*?<!-- ### fim ### -->',u'<!-- ### inicio ### -->%s<!-- ### fim ### -->' % matriz,texto)
		    page.put(texto,comment=u'Bot: Atualizando matriz')
	    else: pywikibot.output(matriz)
	elif arg.startswith('-participantes:'):
	    page = pywikibot.Page(site,u'Wikipédia:Projetos/%s/Participantes' % arg[15:])
	    if page.exists(): texto = page.get()
	    else: return
	    lista = re.findall(ur'(?<=\n#)([^:\n].*?(?:Usuário|User): ?([^\|\]/}\n]+).+)',texto)
	    #for u in lista: print lista.index(u)+1, u[1]
	    seismeses = int(time.strftime('%Y%m%d', time.gmtime(time.time()-15724800)))
	    ativo, inativo = [], []
	    for u in lista:
		params = {'action':'query','list':'usercontribs','ucuser':u[1],'uclimit':'1'}
		dados = query.GetData(params, encodeTitle = False)
		#d = re.search(ur'(\d{1,2}) de (\S{4,9}) de (\d{4})',u[0])
		try: data = dados['query']['usercontribs'][0]['timestamp'][0:10].replace('-','')
		except:
		    inativo.append(u)
		    pywikibot.output(u'Usuário:{0} não encontrado, colocando como inativo...'.format(u[1]))
		    continue
		if int(data) < seismeses:
		    inativo.append(u)
		else:
		    ativo.append(u)
	    nova = u'\n;Ativos\n'
	    for u in ativo: nova += u'# '+u[0]+u'\n'
	    nova += u'\n;Inativos\n'
	    for u in inativo: nova += u'# '+u[0]+u'\n'
	    texto = re.sub(ur'(?s)(?:\n;Ativos)?\n#.*',nova,texto)
	    page.put(texto,u'Bot: separando participantes em ativos e inativos')


if __name__ == "__main__":
    try:
        main()
    finally:
        pywikibot.stopme()