Utente:Wisbot/elimina immagini.py

Da Wikipedia, l'enciclopedia libera.
Vai alla navigazione Vai alla ricerca
# -*- coding: utf-8 -*-
# funziona solo con l'ultima versione di pywikipedia
"""
Questo bot controlla che le immagini specificate non siano presenti nelle
pagine utenti. Nel caso lo siano lascia un messaggio nella pagine di
discussione dell'utente. Nel caso il messaggio sia stato lasciato più di
un certo tempo rimuove l'immagine.

Parametri:

-images      - Lavora sulle immagini. Controlla tutte le immagini specificate,
               se sono presenti su una pagina utente mette l'avviso, se
               l'avviso è caduto elimina l'immagine

-users       - Lavora sugli utenti. Controlla gli utenti specificati, se hanno
               un avviso scaduto elimina l'immagine relativa all'avviso

-template    - Considera tutti gli/le utenti/immagini che includono un template,
               ad esempio "-template:EDP"

-page        - Considera gli/le utenti/immagini specificati

-file        - Considera gli/le utenti/immagini specificati nel file

-cat         - Considera gli/le utenti/immagini che appartengono ad una
               categoria specificate

-first       - Agisce solo sulle pagine dopo l'argomento specificato

-always      - Non chiede conferma

-ultimatum   - Numero di giorni tra la segnalazione tramite avviso e la
               cancellazione. Default = 7



Esempi:      elimina_immagini.py -images -template:EDP
               controlla tutte le immagini che includono il Template:EDP, se
               sono presenti in una pagina utente mette l'avviso, se l'avviso
               è scaduto elimina l'immagine

             elimina_immagini.py -images -page:Immagine:Italia-Stemma.png
               controlla se l'immagine Italia-Stemma.png è presente nelle
               pagine utente. Mette gli avvisi, se trova avvisi scaduti
               relativi a queste immagini elimina le immagini

             elimina_immagini.py -users -cat:\"Categoria:Utenti che hanno
             immagini EDP\"
               controlla tutti gli utenti che appartegono alla categoria:... che
               è quella a cui appartengono gli utenti se hanno l'avviso nella
               pagina di discussione. La categoria può riferirsi sia alla pagina
               utente che alla pagina di discussione

             elimina_immagini-py -users -template:EDP Pagina Utente
               controlla tutti gli utenti che hanno nella loro pagina il
               template Template:EDP_Pagina_Utente. Se hanno un avviso
               scaduto elimina le immagini.

             elimina_immagini.py -users -page:Utente:Wisbot
               controlla se l'utente Wisbot ha un avviso scaduto nelle sue
               discussioni. Se scaduto elimina l'immagine a cui l'avviso
               si riferisce

             elimina_immagini.py -images -template:EDP -first=\"Immagine:British
             iot flag medium.png\"

"""

#
# (C) Wiso, 2007
#
# Distributed under the terms of the GPL license.
#
               
from __future__ import generators
from datetime import date, timedelta
from time import strptime
import sys, re
import wikipedia, pagegenerators, config, catlib


mysite = wikipedia.getSite()
# TODO: generalizzare
userDiscussionNamespaceName = 'Discussioni_utente'
# TODO: generalizzare
userNamespaceName = 'Utente'
paginaSostituti = 'Utente:Wisbot/EDP/sostituti'
formatoData = '%d %b %Y'
regexTrovaUtente = re.compile(u'[^/]+')
rAvviso = u'\{\{[Ee]DP[ _]Pagina[ _]Utente\|(.*?)\|[Dd]ata_eliminazione ?= ?(.*?)\|[Ss]tato ?= ?(.*?)\}\}'
regex_ = re.compile('_([^\]])')


def imageName2regex(image):
    """
    prende il nome di una immagine e la rende adatta ad essere usata in una
    regex es: 'mia immagine.png' -> '[Mm]ia[ _]immagine\.png'
    """
    # maiuscole / minuscole come iniziale
    image = '[' + image.upper()[0] + image.lower()[0] + ']' + image[1:]
    # escape sul .
    image = image.replace('.','\.')
    # escape su parantesi )(
    image = image.replace('(','\(')
    image = image.replace(')','\)')
    # spazio -> [ _]
    image = image.replace(' ','[ _]')
    # accenti ' -> ('|%27)
    image = image.replace('\'','(\'|%27)')
    # à -> (à|%C3%A0)
    image = image.replace(u'à',u'(à|%C3%A0)')
    # _ -> [ _] facendo attenzione che è già stata fatta la
    # precedente sostituzione
    regex = regex_
    regex_.sub('[ _]\1',image)
    return image



def trovaPaginaUtente(page):
    #TODO: FAR FUNZIONARE CON SOTTOPAGINE
    if (page.namespace() == 2):
        return page
    elif (page.namespace() == 3):
        title = page.titleWithoutNamespace()
        regex = regexTrovaUtente
        match = regex.search(title)
        if (not match):
            return None
        paginaUtente = wikipedia.Page(mysite, userNamespaceName + ':' + match.group(0))
        return paginaUtente
    else:
        return None
        

def trovaPaginaDiscussione(page):
    #TODO: FAR FUNZINOARE CON SOTTOPAGINE
    if (page.namespace() == 3):
        return page
    elif (page.namespace() == 2):
        title = page.titleWithoutNamespace()
        regex = regexTrovaUtente
        match = regex.search(title)
        if (not match):
            return None
        paginaDiscussione = wikipedia.Page(mysite, userDiscussionNamespaceName + ':' + match.group(0))
        return paginaDiscussione
    else:
        return None

def scaduto(string):
    """
    ritorna True o False a seconda che la data rappresentata nella stringa
    string sia scaduta
    """
    dataScadenza = date(*(strptime(string, formatoData)[:3]))
    delta = date.today() - dataScadenza
    if (delta.days >= 0):
        return True
    return False


class ImmaginiUtenteRobotCattivo:
    """
    Questo bot cicla sulle pagine utente contenute in gen. Se in gen sono
    contente delle pagine di discussione cicla sulle pagine utente relative.
    Per prima cosa analizza se sono stati lasciati avvisi nella pagina di
    discussione. In caso positivo fa passare la pagina utente e tutte le
    sottopagine guardando quali immagini sono incluse. Se è inclusa l'
    immagine cercata apre la pagina e cerca dove è inserita l'immagine. La
    elimina e aggiorna il messaggio nella discussione.
    """
    def __init__(self, gen, acceptAll = False, ultimatumGiorni = 7, verbose = True):
        # generatore che contiene le pagine su cui agire. Le pagine dovrebbero
        # essere pagine utente o di discussione. Nel secondo caso vengono
        # trovate le pagine utente relative
        self.gen = gen
        self.acceptAll = acceptAll
        self.verbose = verbose
        self.ultimatumGiorni = ultimatumGiorni
        self.mysite = wikipedia.getSite()
        # stringhe da usare nel template
        self.fattoStr = 'fatto'
        self.rimossoStr = 'rimosso'
        self.incorsoStr = 'in_corso'
        # messaggio in setAction
        self.messageEliminaImmagine = "Bot: elimino immagine [[Immagine:%s]]"
        # regex per immagini semplici
        self.preRegexImmagine1 = u'\[\[[Ii]m(?:age|magine): ?%s ?(?P<arg>(\|.*?)?\]\])'
        # regex per immagini nelle gallerie
        self.preRegexImmagine2 = u'(?s)(?P<pre><gallery>.*?)([Ii]m(?:age|magine):%s)(?P<post>.*?</gallery>)'
        # quello che lascia al posto delle immagini semplici
#        self.immagineSostituto1 = '<!-- Immagine eliminata dal bot -->'
        # e quelle nelle gallerie
#        self.immagineSostituto2 = '\g<pre> '+ self.immagineSostituto1 + ' \g<post>'
        # save time
        self.compileRegex()
        # load sostituti
        self.sostituti = self.caricaSostituti()
        
        
    def compileRegex(self):
        #TODO: duplicato
        self.regexAvviso = re.compile(rAvviso)
        self.regexTrovaUtente = re.compile(u'[^/]+')

    def caricaSostituti(self):
        regex = re.compile('\[\[:(Immagine:.*?)\]\]\|\|\[\[:(Immagine:.*?)\]\]')
        page = wikipedia.Page(mysite,paginaSostituti)
        text = page.get()
        sostituti = {}
        for m in regex.finditer(text):
            pageIm = wikipedia.Page(mysite,m.group(1))        
            sostituti[pageIm.title()] = m.group(2)
        return sostituti

    def immagineSostituta(self, immagine, gallery=False):
        sostituto = '<!-- Immagine eliminata dal bot -->'
        immagine = u'Immagine:' + immagine
        if self.sostituti.has_key(immagine):
            wikipedia.output(u'Trovata immagine sostituta: %s' % self.sostituti[immagine])
            if gallery:
                sostituto = '\g<pre>' + self.sostituti[immagine] + '\g<post>'
            else:
                # arg comprende già le parentesi di chiusura
                sostituto = '[[' +  self.sostituti[immagine] + '\g<arg>'
        return sostituto


    def run(self):
        for page in self.gen:
            # se la pagina è una pagina di discussione passa la pagina
            # utente relativa
            page = trovaPaginaUtente(page)
            # se è bloccata segnala e salta
            if (not page.canBeEdited()):
                string = u'\03{lightyellow}Pagina \03{lightred}%s\03{lightyellow} bloccata\03{default}' % page.title()
                wikipedia.output(string)
                continue
            stringa = u'\03{lightpurple} >>> %s <<<\03{default}' % page.title()
            wikipedia.output(stringa)
            self.runPage(page)

    def runPage(self,page):
        pageDiscussione = trovaPaginaDiscussione(page)
        if (not pageDiscussione):
            # se non c'è la pagina di discussione lascia perdere
            # significa che non ci possono essere avvisi
            stringa = u'\03{lightyellow}PAGINA \03{lightred}%s\03{lightyellow} NON VALIDA\03{default}' % page.title()
            wikipedia.output(stringa)
            return
        # cerca le immagini segnalate nella pagina di discussione
        images = self.trovaImmaginiSegnalate(pageDiscussione)
        for image in images:
            if self.verbose:
                wikipedia.output(u'E\' stata segnalata l\'immagine \03{lightblue}%s\03{default} in \03{lightblue}%s\03{default}' % (image, page.title()))
            self.doinPage(page,image)    

    def doinPage(self,page,image):
        if self.deleteinPage(page,image):
            self.avvisoRimosso(trovaPaginaDiscussione(page),image)
            return True
        else:
            # se l'immagine non viene eliminata significa che non è stata
            # trovata.
            wikipedia.output(u'\03{lightgreen}L\'utente ha rimosso da solo l\'immagine\03{default}')
            self.avvisoFatto(trovaPaginaDiscussione(page),image)
            return True


    def sottoPagine(self,page):
        """
        Ritorna una lista di nomi di sottopagine
        """
        #TODO: CHECK AND FIX
        result = []
        text = page.get()
        Rtemplate = re.compile(r'{{(?P<name>[^{\|]+?)}}')
        for m in Rtemplate.finditer(text):
            name = m.group('name')
            result.append(name)
        return result

    def deleteinPage(self,page,imageEliminare):
        """
        Trova in quale sottopagina c'è l'immagine da eliminare e chiama la
        funzione che l'elimina. Resistuisce True o False se l'immagine è stata
        trovata ed eliminata
        """
        # TODO trovato / trovato2
        if self.verbose:
            wikipedia.output(u'Cerco in %s' % page.title())
        try:
            images = page.imagelinks()
        except wikipedia.IsRedirectPage:
            string = u'\03{lightyellow}La pagina \03{lightred}%s\03{lightyellow} è un REDIRECT ==> SALTO\03{default}' % page.title()
            wikipedia.output(string)
            return False
        except wikipedia.NoPage:
            string = u'\03{lightyellow}Pagina \03{lightred}%s\03{lightyellow} NON TROVATA ==> SALTO\03{default}' % page.title()
            wikipedia.output(string)
            return False
        # imagelinks restituisce solo le immagini che sono presenti nella pagina
        # NON quelle presenti nelle sottopagine incluse (e che quindi compaiono)
        trovata = False
        for image in images:
            if (image.title() == imageEliminare):
                # l'immagine è proprio in questa (sotto)pagina
                wikipedia.output(u'Immagine \03{lightblue}%s\03{default} presente in \03{lightblue}%s\03{default}' %(image.title(), page.title()))
                if (self.deleteImage(page,image.titleWithoutNamespace())):
                    trovata = True
                else:
                    stringa = u'\03{lightyellow}ERRORE: NON TROVO L\'IMMAGINE \03{lightred}%s\03{default} in \03{lightred}%s\03{default}' % (imageEliminare,page.title())
                    wikipedia.output(stringa)
                

        # cerca nelle sottopagine (anche se l'immagine è già stata trovata)
        trovato2 = False
        # prendo la lista di tutte le pagine incluse
        templates = self.sottoPagine(page)
        for template in templates:
            if (template[0]=='/'):
                # sintassi sintetica "/", gli aggiungo il prefisso assoluto
                template = page.title() + template
            templatePage = wikipedia.Page(self.mysite,template)
            if (templatePage.namespace() == 2 and templatePage.title()!=page.title()):
                if (self.deleteinPage(templatePage,imageEliminare)):
                    trovato2 = True
        if (trovato2):
            trovata = True
        return trovata



    def deleteImage(self,page,imageEliminare):
        """
        Cancella l'immagine dalla pagina specificata e ritorna True o False
        se l'operazione è riuscita o meno.
        """
        # editabile?
        if not page.canBeEdited():
            stringa = u'\03{lightyellow}La pagina \03{lightred}%s\03{lightyello} è bloccata, salto\03{lightyellow}' % page.title()
            wikipedia.output(stringa)
            return False
        # ask
        if not self.acceptAll:
            choice = wikipedia.inputChoice(u'Elimino l\'immagine %s dalla pagina %s?' % (imageEliminare,page.title()), ['Yes', 'No', 'All'], ['y', 'N', 'a'], 'N')
            if choice in ['a', 'A']:
                self.acceptAll = True
        if self.acceptAll or choice in ['y', 'Y']:
            # do it!
            if self.verbose:
                wikipedia.output('Cerco l\'immagine \03{lightblue}%s\03{default}' % imageEliminare)
            # converti il nome dell'immagine in modo che sia usabile come regex
            imageEliminareR = imageName2regex(imageEliminare)
            # regex che trova tipo [[Immagine:mia_immagine|...]]
            regex1 = re.compile(self.preRegexImmagine1 % imageEliminareR)
            # regex che trova le gallerie (trova solo un'immagine per
            # volta, quindi deve essere reiterata ==> FIX REGEX
            regex2 = re.compile(self.preRegexImmagine2 % imageEliminareR)
            # force=True, altrimenti è possibile che non ricarichi la pagina
            # perché l'ha già fatto in precedenza, ma la pagina potrebbe essere
            # cambiata quando ci sono più immagini diverse da togliere
            try:
                oldtext = page.get(force = True)
            except wikipedia.IsRedirectPage:
                string = u'\03{lightyellow}La pagina \03{lightred}%s\03{lightyellow} è un REDIRECT ==> SALTO\03{default}' % page.title()
                wikipedia.output(string)
                return False
            text = oldtext
            # applica prima regex
            text = regex1.sub(self.immagineSostituta(imageEliminare),text)
            # applica seconda regex iterando
            textnew = regex2.sub(self.immagineSostituta(imageEliminare,gallery=True),text)
            while (textnew!=text):
                text = textnew
                textnew = regex2.sub(self.immagineSostituta(imageEliminare,gallery=True),text)
            # controllo finale
            if (text==oldtext):
                stringa = u'\03{lightyellow}Non trovo l\'immagine\03{default}'
                wikipedia.output(stringa)
                return False
            wikipedia.setAction(self.messageEliminaImmagine % imageEliminare)
            page.put(text, minorEdit = False)
            return True
        # sicurezza
        return False

    def avvisoFatto(self,page,imageEliminare):
        """
        Cambia l'avviso per l'immagine specificata che era in_corso in fatto
        """
        self.avvisoCambiaStato(page,imageEliminare,self.fattoStr)

    def avvisoRimosso(self,page,imageEliminare):
        """
        Cambia l'avviso per l'immagine specificata che era in_corso in rimosso
        """
        self.avvisoCambiaStato(page,imageEliminare,self.rimossoStr)

    def avvisoCambiaStato(self,page,imageEliminare,nuovoStato):
        if not self.acceptAll:
            choice = wikipedia.inputChoice(u'Modifico pagina %s per l\'immagine %s? Nuovo stato: %s' % (page.title(),imageEliminare,nuovoStato), ['Yes', 'No', 'All'], ['y', 'N', 'a'], 'N')
            if choice in ['a', 'A']:
                self.acceptAll = True
        if self.acceptAll or choice in ['y', 'Y']:    
            regex = self.regexAvviso
            text = page.get()
            avvisi = regex.finditer(text)
            trovato = False
            for avviso in avvisi:
                image = avviso.group(1)
                if (image==imageEliminare):
                    trovato = True
                    nuovoAvviso = avviso.group(0)
                    nuovoAvviso = nuovoAvviso.replace(self.incorsoStr,nuovoStato)
                    text = text[:avviso.start()] + nuovoAvviso + text[avviso.end():]
            if (trovato):
                wikipedia.setAction(u'Bot:Cambio stato per immagine %s: %s' %(imageEliminare,nuovoStato))
                page.put(text, minorEdit = False)
            else:
                stringa = u'\03{lightyellow}PROBLEMA: NON RIESCO A CAMBIARE STATO IN PAGINA %s PER IMMAGINE %s\03{default}' %(page.title(),imageEliminare)
                wikipedia.output(stringa)        
        

    def trovaImmaginiSegnalate(self,page):
        """
        Apre la pagina di discussione e restituisce la lista delle immagini i
        cui avvisi sono scaduti
        """
        immaginiTrovate = []
        if self.verbose:
            wikipedia.output(u'Controllo gli avvisi in %s' % page.title())
        text = page.get()
        regex = self.regexAvviso
        match = regex.finditer(text)

        if (not match):
            return []

        for item in match:
            immagineTrovata = item.group(1)
            scadenza = item.group(2)
            dataScadenza = date(*(strptime(scadenza, formatoData)[:3]))
            stato = item.group(3)

            if (stato == self.incorsoStr):
                if (scaduto(scadenza)):
                    immaginiTrovate.append(immagineTrovata)
                    wikipedia.output('Trovata immagine \03{lightblue}%s\03{default} da controllare' % immagineTrovata)
                else:
                    wikipedia.output(u'Non ancora scaduto %s' % immagineTrovata)
            else:
                wikipedia.output(u'Non è più in corso %s' % immagineTrovata)
        return immaginiTrovate
            

    
class ImmaginiUtenteRobot:
    def __init__(self,genImages, acceptAll = False, ultimatumGiorni = 7, verbose = True):
        """
        Questo bot cicla sulle immagini presenti nel generatore. Se trova un
        utente che include l'immagine lo segnala. Se l'avviso era già presente
        ed è scaduto rimuove l'immagine usando l'altro bot
        """
        self.mysite = wikipedia.getSite()
        self.genImages = genImages
        self.ultimatumGiorni = ultimatumGiorni
        self.templateNamespaceName = self.mysite.template_namespace()
        self.fattoStr = 'fatto'
        self.rimossoStr = 'rimosso'
        self.incorsoStr = 'in_corso'
        self.manualeStr = 'manuale'
        self.avviso = u'\n\n{{EDP Pagina Utente|%s|data_eliminazione=%s|stato=' + self.incorsoStr + '}}messaggio automatico del bot ~~~~' 
        self.acceptAll = acceptAll
        self.verbose = verbose
        self.compileRegex()
        self.fratelloCattivo = ImmaginiUtenteRobotCattivo(None, acceptAll, ultimatumGiorni, verbose)
        

    def compileRegex(self):
        self.regexTrovaUtente = re.compile(u'[^/]+')
        self.regexAvviso = re.compile(rAvviso)

    def trovaUtente(self,titolo):
        regex = self.regexTrovaUtente
        match = regex.search(titolo)
        if (match):
            return match.group(0)
        return None

    def isPrincipal(self,page):
        """
        Restituisce True se il titolo non è quello di una sottopagina.
        Utente:utente -> True Utente:utente/sottopagina -> False
        """
        titolo = page.titleWithoutNamespace()
        if (titolo.find('/')==-1):
            return True
        else:
            return False

    def scadenza(self):
        """
        Ritorna la data della scadenza da oggi in formato stringa
        """
        delta = timedelta(days=self.ultimatumGiorni)
        scadenza = date.today() + delta
        return scadenza.strftime(formatoData)


    def decidiMettereAvviso(self,page,text,immagine):
        if (text == ''):
            text = page.get()
        regex = self.regexAvviso
        match = regex.finditer(text)
        
        if (not match):
            return True

        metto = True        
        for item in match:
            immagineTrovata = item.group(1)        
            scadenza = item.group(2)
            dataScadenza = date(*(strptime(scadenza, formatoData)[:3]))
            stato = item.group(3)

            if (immagineTrovata == immagine):
                if (stato==self.incorsoStr):
                    metto = False
                    if (scaduto(scadenza)):
                        wikipedia.output('L\'avviso trovato è scaduto, \03{lightred}elimino l\'immagine\03{default}')
                        pageUtente = trovaPaginaUtente(page)
                        if (not self.fratelloCattivo.doinPage(pageUtente,immagine)):
                            stringa = u'\03{lightyellow}ERRORE: è stato segnalato che nella pagina c\'è l\'immagine ma non la trova\03{default}'
                            wikipedia.output(stringa)
                elif (stato==self.fattoStr or stato==self.rimossoStr):
                    string = u'\03{lightyellow}L\'utente sta facendo il furbo oppure è recidivo per l\'immagine \03{lightred}%s\03{lightyellow}. CONTROLLA MANUALMENTE\03{default}' % immagine
                    wikipedia.output(string)
                elif (stato==self.manualeStr):
                    metto = False
        return metto        
        
    

    def marchiaUtente(self,utente,immagine):
        pageDiscussione = wikipedia.Page(self.mysite,userDiscussionNamespaceName+ ':' + utente)
        try:
            text = pageDiscussione.get()
            if not pageDiscussione.canBeEdited():
                string = u'\03{lightyellow}Pagina \03{lightred}%s\03{lightyellow} bloccata ==> SALTO\03{default}' % pageDiscussione.title()
                wikipedia.output(string)
                return
        except wikipedia.NoPage:
            string = u'\03{lightyellow}Pagina \03{lightred}%s\03{lightyellow} non trovata ==> SALTO\03{default}' % pageDiscussione.title()
            wikipedia.output(string)
            return
        except wikipedia.IsRedirectPage:
            string = u'\03{lightyellow}La pagina \03{lightred}%s\03{lightyellow} è un REDIRECT ==> SALTO\03{default}' % pageDiscussione.title()
            wikipedia.output(string)
            return
            
        if (self.decidiMettereAvviso(pageDiscussione,text,immagine)):
            if not self.acceptAll:
                choice = wikipedia.inputChoice(u'L\'%s:%s ha l\'%s, segnalo?' % (userNamespaceName,utente,immagine), ['Yes', 'No', 'All'], ['y', 'N', 'a'], 'N')
                if choice in ['a', 'A']:
                    self.acceptAll = True
            if self.acceptAll or choice in ['y', 'Y']:
                if self.verbose:
                    wikipedia.output('Segnalo all\'utente %s la presenza dell\'immagine %s' % (utente,immagine))
                text += self.avviso % (immagine,self.scadenza())
                wikipedia.setAction('Bot: segnalo presenza immagine [[%s]]' % immagine)
                pageDiscussione.put(text, minorEdit = False)                
        else:
            wikipedia.output('Non metto avviso per l\'immagine %s' % immagine)        
        
        
    def run(self):    
        for image in self.genImages:
            # preleva le pagine che includono direttamente o indirettamente
            # tramite altre pagine l'immagine
            genUser = pagegenerators.FileLinksGenerator(image)
            # le pagine devono essere pagine utente -> filtra namespace
            genUser = pagegenerators.NamespaceFilterPageGenerator(genUser,[2])
            for paginaUtente in genUser:
                stringa = u'\03{lightpurple} >>> %s <<<\03{default}' % paginaUtente.title()
                wikipedia.output(stringa)
                utente = self.trovaUtente(paginaUtente.titleWithoutNamespace())
                if (not utente):
                    stringa = u'\03{lightyellow}ERRORE: NON RIESCO A RISALIRE ALLA PAGINA UTENTE\03{default}'
                    wikipedia.output(stringa)
                    continue                
                if (self.isPrincipal(paginaUtente)):
                    # solo se la pagina è quella principale si avvisa l'utente,
                    # altrimenti si genererebbero avvisi duplicati. Quindi
                    # l'utente viene avvisato solo se l'immagine compare,
                    # nel senso che si vede, nella sua pagina principale. Se
                    # l'immagine è presente in una sottopagina, ma questa non è
                    # inclusa (anche indirettamente) nella pagina principale non
                    # viene segnalata
                    self.marchiaUtente(utente,image.title())
                                                            


        
def main():
    doImmagini = False
    doUtenti = False
    acceptAll = False
    gen = None
    first = ''
    templateName = None
    pageTitles = []
    pageCat = []
    ultimatum = 7
    verbose = True
    # This factory is responsible for processing command line arguments
    # that are also used by other scripts and that determine on which pages
    # to work on.
    genFactory = pagegenerators.GeneratorFactory()
    
    mysite = wikipedia.getSite()
    for arg in wikipedia.handleArgs():
        if arg == '-images':
            doImmagini = True
        elif arg == '-users':
            doUtenti = True
        elif arg.startswith('-template'):
            if len(arg) == 9:
                templateName = wikipedia.input(u'Inserisci il nome del template:')
            else:
                templateName = arg[10:]
        elif arg.startswith('-page'):
            if len(arg) == 5:
                pageTitles.append(wikipedia.input(u'Quale voce vuoi controllare?'))
            else:
                pageTitles.append(arg[6:])
        elif arg.startswith('-cat'):
            if len(arg) == 4:
                pageCat.append(wikipedia.intput(u'Quale categoria vuoi controllare?'))
            else:
                pageCat = arg[5:]
        elif arg.startswith('-first'):
            if len(arg) == 6:
                first = wikipedia.input(u'Quale deve essere la prima pagina?')
            else:
                first = arg[7:]
        elif arg == '-always':
            acceptAll = True
        elif arg.startswith('-ultimatum'):
            if len(arg) == 10:
                ultimatum = int(wikipedia.input(u'Quanto deve essere l\'ultimatum?'))
            else:
                ultimatum = int(arg[11:])
        else:
            generator = genFactory.handleArg(arg)
            if generator:
                gen = generator
            else:
                wikipedia.output(u'argomento non valido %s' % arg)
                


    if (doImmagini == doUtenti):
        # syntax error, show help text from the top of this file
        wikipedia.showHelp('elimina_immagini')
        wikipedia.stopme()
        sys.exit()

    if templateName:
        gen = pagegenerators.ReferringPageGenerator(wikipedia.Page(mysite, mysite.template_namespace() + ':' + templateName), onlyTemplateInclusion= True)
    elif pageTitles:
        pages = [wikipedia.Page(mysite, pageTitle) for pageTitle in pageTitles]
        gen = iter(pages)
    elif pageCat:        
        cat = catlib.Category(mysite, pageCat)
        gen = pagegenerators.CategorizedPageGenerator(cat)
        
        
    if not gen:
        # gen is empty: syntax error, show help text from the top of this file
        wikipedia.showHelp('elimina_immagini')
        wikipedia.stopme()
        sys.exit()

    if first:
        for page in gen:
            # salto le pagine precedenti
            if (page.title()==first):
                break

    if (doImmagini):
        # ciclo sulle immagini
        gen = pagegenerators.NamespaceFilterPageGenerator(gen,[6])
        robot = ImmaginiUtenteRobot(gen, acceptAll, ultimatum, verbose)
        robot.run()

    if (doUtenti):
        # ciclo sugli utenti
        # il namespace può anche essere quello delle discussioni (3)
        # verranno convertite dal bot
        gen = pagegenerators.NamespaceFilterPageGenerator(gen,[2,3])
        robot = ImmaginiUtenteRobotCattivo(gen, acceptAll, ultimatum, verbose)
        robot.run()


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