Usuário:Chicocvenancio/central de fusões.py

Origem: Wikipédia, a enciclopédia livre.

Código[editar | editar código-fonte]

#-------------------------------------------------------------------------------
# Name:        Central de Fusões
# Purpose:
#
# Author:      Chico Venancio
#
# Created:     01/03/2012
# Copyright:   (c) Chico Venancio 2012
# Licence:     GNU General Public License
#          See http://www.gnu.org/licenses/gpl.txt for full text of the license
#-------------------------------------------------------------------------------
#!/usr/bin/env python
import wikipedia
import catlib
import pagegenerators
import string
import re
import json
import codecs
import datetime

site = wikipedia.getSite()
def main():
    """inserir automaticamente {{fusões a avaliar|nome do artigo}} na Central
     de fusões e na PD dos artigos"""

    #abrir o arquivo do dicionário
    try:
        with codecs.open (u'fusões.txt', encoding='utf-8') as dicionario:
            lista = json.load(dicionario, encoding='utf-8')
    except ValueError: #se o arquivo de dicionário der erro
        print (u'dicionário mal formatado, criando novo')
        #Gerar lista mesmo que tiver erro no arquivo
        lista = {}
    except IOError: #se o arquivo de dicionário der erro
        print (u'dicionário não presente, criando novo')
        #Gerar lista mesmo que tiver erro no arquivo
        lista = {}
    lista ={} #para testes, rodar sem o dicionário
    central = wikipedia.Page(site, u'Wikipédia:Fusão/Central de fusões')
##    central = wikipedia.Page(site, u'Usuário:Chicocvenancio/teste2') #para testes
    casos_novos = u'' #inicializar os casos
    #iniciando o log em wiki texto
    log = u'\n==Log da Central das fusões dia ' + str(datetime.datetime.utcnow(
    ).day) +u' de {{LCMONTHNAME|' + str(datetime.datetime.utcnow().month
    ) + u'}} de '+ str(datetime.datetime.utcnow().year) + u' ==\n'+ str(
    datetime.datetime.utcnow().hour) +u':'+ str(datetime.datetime.utcnow(
    ).minute) + u':' + str(datetime.datetime.utcnow().second) + u' (utc)\n\n'

##    log += u'Rodada de testes, nenhuma modificação feita\n' #Para testes em que não se altera nada
    Plog = wikipedia.Page(site, u'Usuário(a):ChicoBot/log') #Página do Log
    se_tiver = re.compile(u'\{\{fusões a avaliar\|(?P<links>.*?)\}\}', re.I) #Regex, grupo links contém casos
    ordem_regex = re.compile(u'\{\{fusão\|1=(?P<primeiro>.*?)(\|.*)\|2=(?P<segundo>.*?)(\|.*)\}\}', re.I) #regex da {{fusão}} (para encontrar a ordem)
    ordem_regex2 = re.compile(u'\{\{fusão\|(.*?)(|\|.*)\}\}', re.I)
    artigos_sem_predef = u''

    #nunca mexer nessas subpáginas
    lista [wikipedia.Page(site, u'Wikipédia:Fusão/Central de fusões/instruções',
     site)._title] = 1
    for caso in pagegenerators.PrefixingPageGenerator(
    u'Wikipédia:Fusão/Central de fusões/'): #loop nas subpáginas da central
        if not lista.has_key(caso._title): lista[caso._title] = 0 #criar caso na lista com 0 se ele não existir
        if lista[caso._title] == 0: #só fazer qualquer coisa se o caso não já tiver sido tratado
        #verificar ainda se o caso não é um redirecionamento
            if not caso.isRedirectPage():
                #Gerar e limpar a lista de links
                links = [item for sublist in [string.split(a ,u'|')  for a in
                  re.findall(se_tiver, central.get())] for item in sublist]

                if not all(artigo in links for artigo in string.split(
                caso._title[34:], u'; ')): #Se não tiver todos
                    if any(artigo in links for artigo in string.split(
                    caso._title[34:], u'; ')): #Se tiver só um
                    #Não colocar a predefinição na página e avisar no log que não tinham todos os casos
                        log += u'\nPara o caso ([[' +caso._title + u']]) não foram encontrado todos os artigos nas {{lp|fusões a avaliar}} da central mas foi encontrado um dos casos\n'
                    #Se não tem nenhum caso na página, adicionar o caso à lista
                    else: casos_novos += u'\n{{fusões a avaliar|' +  u'|'.join (
                    string.split(caso._title[34:], u'; ')) + u'}}'
                try:
                    for artigo in string.split(caso._title[34:], u'; '): #separar os artigos no título
                        #Primeiro verificar se o artigo existe e não é redirecionamento
                        if wikipedia.Page(site, artigo).exists(
                        ) and not wikipedia.Page(site, artigo).isRedirectPage():
                            pd = wikipedia.Page(site, artigo).toggleTalkPage()
                            l = len(string.split(caso._title[34:], u'; ')) - 1
                            #Gerar lista de links e limpar ela
                            links = [item for sublist in [string.split(a ,u'|')
                             for a in re.findall(se_tiver, pd.get())
                             ] for item in sublist]
                            if not all(artigo in links for artigo in string.split(
                            caso._title[34:], u'; ')): #Se não tiver todos
                                if any(artigo in links for artigo in string.split(
                                caso._title[34:], u'; ')): #Se tiver algum
                                #Não adicionar predef e avisar no log
                                    log += u'\nPara o caso ([[' +caso._title + u']]) não foram encontrado todos os artigos na {{lp|fusões a avaliar}} da PD mas foi encontrado [[' + artigo + u']]\n'
                                else: #Se não tiver o caso
                                #adicionar predef na PD
                                    pd.put(pd.get() + u'\n{{fusões a avaliar|' +
                                     u'|'.join (string.split(caso._title[34:],
                                     u'; ')) + u'}}', u'Robô: Adicionando {{fusões a avaliar|' + u'|'.join (
                                     string.split(caso._title[34:], u'; ')) + u'}}', botflag=False)
                                     #avisar no output
                                    print (u'adicionaria {{fusões a avaliar|' + u'|'.join(
                                    string.split(caso._title[34:], u'; ')) + u'}} à PD ' + pd._title )
                                    #e no log...
                                    log += u'\nAdicionaria <nowiki>{{fusões a avaliar|' + u'|'.join(
                                    string.split(caso._title[34:], u'; ')) + u'}}</nowiki> à PD [[' + pd._title + u']]\n'
                            if string.split(caso._title[34:], u'; ')[1] == artigo:

                                try:
                                    if re.findall(ordem_regex, wikipedia.Page(site, artigo).get())[0][0] == string.split(
                                caso._title[34:], u'; ')[1]:
                                        wikipedia.Page(site, artigo).put(re.sub(ordem_regex, u'{{fusão|1={{subst:FULLPAGENAME}}\g<2>|2=\g<primeiro>\g<3>}}',
                                        wikipedia.Page(site, artigo).get()))
                                        wikipedia.showDiff(wikipedia.Page(site, artigo).get(), re.sub(ordem_regex, u'{{fusão|1={{subst:FULLPAGENAME}}\g<2>|2=\g<primeiro>\g<3>}}',
                                        wikipedia.Page(site, artigo).get()))
                                        log += u'\nTrocaria a ordem da predef de fusão no artigo [[' + artigo + u']]\n'
                                except IndexError:
                                    try:
                                        if re.findall(ordem_regex2, wikipedia.Page(site, artigo).get())[0][0
                                    ] == string.split(caso._title[34:], u'; ')[1] :
                                            wikipedia.Page(site, artigo).put(re.sub(ordem_regex2,
                                            u'{{fusão|1=\g<1>|2=' + artigo + u'\g<2>}}', wikipedia.Page(site,
                                            artigo).get()))
                                            wikipedia.showDiff(wikipedia.Page(site, artigo).get(), re.sub(ordem_regex2,
                                            u'{{fusão|1=\g<1>|2=' + artigo + u'\g<2>}}', wikipedia.Page(site,
                                            artigo).get()))
                                            log += u'\nTrocaria a ordem da predef de fusão no artigo [[' + artigo + u']]\n'
                                    except IndexError:
                                        if u'{{fusão com|' not in wikipedia.Page(site, artigo).get().lower(
                                        ) and u'{{fusão de|' not in wikipedia.Page(site, artigo).get().lower():
                                            artigos_sem_predef += u'\n[[' + artigo + u']]\n'


                except wikipedia.NoPage: # se a PD em questão não existir
                    if pd.toggleTalkPage().exists(): #Se o artigo da PD existir
                    #adicioanar predefinição
                        pd.put(u'{{fusões a avaliar|' + u'|'.join (string.split(
                        caso._title[34:], u'; ')) + u'}}', u'Robô: Adicionando {{fusões a avaliar|'
                         + u'|'.join (string.split(caso._title[34:], u'; ')) + u'}}', botflag=False)
                        #avisar no output e no log
                        print (u'Criaria a PD ' + pd._title + u' com {{fusões a avaliar|' + u'|'.join (
                        string.split(caso._title[34:], u'; ')) + u'}}' )
                        log += u'\nCriaria a PD [[' + pd._title + u']] com <nowiki>{{fusões a avaliar|' + u'|'.join (
                        string.split(caso._title[34:], u'; ')) + u'}}</nowiki>\n'
##                finally: # no final ;P
##                    for versao in versoes_do_titulo: # para cada título
##                        lista[versao] = 1 #adcionar ao dicionário como sem precisar rodar novamente
        lista[caso._title] = 1

    if casos_novos: # se houverem casos novos a adicionar a central
    #adicionar os casos, avisar no log e no output
        central.put(central.get() + casos_novos, u'Robô: Adicionando novos casos', botflag=False)
        print (u'Adicionaria os seguintes casos à central: ' + casos_novos)
        log += u'\nAdicionaria os seguintes casos à [[' + central._title + u'|central]]: <pre>' + casos_novos + u'</pre>\n'
    else: #ou avisar que não fez nada na central
        print (u'Nenhum caso novo a ser adicionado à central')
        log += u'\nNenhum caso novo a ser adicionado à central\n'
    log += u'\nArtigos sem a predefinição: <pre>' + artigos_sem_predef + u'</pre>\n'
    #gravar mudanças no arquivo do dicionário
    with codecs.open(u'fusões.txt', 'w', encoding='utf-8') as dicionario:
        json.dump(lista, dicionario, ensure_ascii=False)
    #marcar a hora final do script no log
    log += u'\nTerminado as ' + str(datetime.datetime.utcnow().hour) +u':'+ str(datetime.datetime.utcnow().minute) + u':' + str(datetime.datetime.utcnow().second) + u' (utc)\n'
    #gravar o log na subpágina
    Plog.put(Plog.get() + log)
    #gravar o log em um arquivo
    with codecs.open(u'logs da central de fusões.txt', 'w', encoding='utf-8') as Flog:
        Flog.write(log)

if __name__ == '__main__':
    try:main()
    finally:wikipedia.stopme()