# -*- 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()