Usuário:Danilo.bot/painel.py

O código abaixo é do script que realiza a atualização da página Wikimedia:Painel.

# -*- coding: utf-8  -*-
"""
@ Autor: [[Usuário:Danilo.mac]]
@ Licença: GNU General Public License (GPL) e Creative Commons Attribution/Share-Alike (CC-BY-SA)
"""
import re, urllib, time, locale, catlib
import wikipedia as pywikibot

def ultimos(page=None, prefixo=u'', mr=None, subpage=None):
  topico = subpage and re.compile(subpage+u'/(.+)') or re.compile('/\* (.+?) \*/')
  hist = mr or page.getVersionHistory()
  lista, d = [], {}
  for l in hist:
    # Procurando o nome do tópico
    if subpage: t = topico.search(l[0].title())
    else: t = not (mr and not l[5]) and topico.search(mr and l[5] or l[3]) or None
    # Pula se: 1) O tópico já foi registrado antes; 2) É uma subpágina de arquivo; 3) O nome do tópico não foi encontrado e é uma busca por subpáginas ou em uma única página
    if not t and (subpage or not mr or l[0].title()+u'(st)' in d) or t and (t.group(1) in d or (subpage and t.group(1).startswith(u'arquivo'))): continue
    lista.append((t and t.group(1) or u'',mr and l[4] or l[2], u'{}h{}min de {}/{}/{}'.format(l[1][11:13],
                  l[1][14:16],l[1][8:10],l[1][5:7],l[1][0:4]),str(l[1]).translate(None,'-Z:T'),mr and (subpage or l[0])))
    d[t and t.group(1) or l[0].title()+u'(st)'] = True
  linha = lambda t: t and u'|-\n|<small>[[{p}{t}]]</small><br/>\'\'\'[[{p}{t}#{0}|{0}]]\'\'\'' or u'|-\n|\'\'\'[[{p}{t}]]\'\'\' <small>(sem tópico)</small>'
  return [((linha(i[0])+u'||[[Usuário:{1}|{1}]]<br><small>{2}</small>').format(i[0],i[1],i[2],t=(mr and i[4] or page).title(),p=prefixo),i[3]) for i in lista[0:10]]

def listaemail(mais=None):
  locale.setlocale(locale.LC_ALL,'C')
  url = 'http://lists.wikimedia.org/pipermail/wikimediabr-l/%s/' % time.strftime('%Y-%B',time.gmtime(mais and time.time()-2000000))
  lista = re.findall(ur'<LI><A HREF="(.+?)">\[Wikimedia Brasil\] (?:Fwd: |Re: )?(.+)\n.*\n<I>(.+)',urllib.urlopen(url+'date.html').read().decode('iso-8859-1'))
  locale.setlocale(locale.LC_ALL,'')
  d, lista2 = {}, []
  for item in reversed(lista):
    if not item[1].replace(u'\t',u' ') in d:
      lista2.append(item)
      d[item[1].replace(u'\t',u' ')] = True
  def linha(item):
    data = time.strptime(re.search(ur'<I>\S+ (.+?)</I>',urllib.urlopen(url+item[0]).read().decode('cp1252').encode('utf-8')).group(1),'%B %d %H:%M:%S UTC %Y')
    return (u'|-bgcolor=#f5f9ff\n|<small>[[Wikimedia:WikimediaBR-l|Lista de e-mail]]</small><br/>\'\'\'[{u}{0} {1}]\'\'\'||{2}<br><small>{3}</small>'.format(item[0],
            u']' in item[1] and u'<nowiki>%s</nowiki>'%item[1] or item[1],item[2],time.strftime('%Hh%Mmin de %d/%m/%Y',data),u=url),time.strftime('%Y%m%d%H%M%S',data))
  if mais: return [linha(item) for item in lista2[0:mais]]
  else: return [linha(item) for item in lista2[0:10]] + (len(lista2) < 10 and listaemail(10-len(lista2)) or [])

def projetos():
  andamento = re.compile(ur'''\{\{[Aa]ndamento
\|planejamento ?= ?(.*)
\|implementação ?= ?(.*)
\|passo1 ?= ?(.*)
\|passo2 ?= ?(.*)
\|passo3 ?= ?(.*)
\|passo4 ?= ?(.*)
\|passo5 ?= ?(.*)
\|passo6 ?= ?(.*)
\|passo7 ?= ?(.*)
\|passo8 ?= ?(.*)
\|situação ?= ?(.*)
\}\}'''.replace(u'\n',ur'\n?'))
  site = pywikibot.Site('pt-br','wikimediabr')
  lista = [page for page in catlib.Category(site,u'Categoria:Projetos em andamento').articles()]
  tabela = u'{|class=wikitable\n|-style="line-height:14px"\n!Projeto||Planejamento||Implementação||Situação\n'
  pla = lambda n: not n in [u'1',u'2',u'3',u'4'] and u'[[imagem:00%.svg]] \'\'não iniciado\'\'' or u'[[imagem:{}%.svg]] \'\'{}\'\''.format(int(n)*25,
        {u'1':u'inicial',u'2':u'desenvolvendo',u'3':u'finalizando',u'4':u'concluído'}[n])
  imp = lambda l: not l[1] in [u'1',u'2',u'3',u'4',u'5',u'6',u'7',u'8'] and u'[[imagem:0de8.svg]] \'\'não iniciada\'\'' or u'[[imagem:{}de8.svg]] \'\'{}\'\''.format(l[1],
        l[int(l[1])+1] or u'passo'+l[1])
  doismeses = int(time.strftime('%Y%m%d%H%M%S',time.gmtime(time.time()-3600*24*60)))
  rev = lambda r: int(r) < doismeses and u'<span style="color:#0AF">* </span>' or u''
  andamentos = [(page.title(),andamento.search(page.get()),page._editTime) for page in lista]
  andamentos = [u'|-\n|{}[[{}]]||{}||{}||{}'.format(rev(r),t,pla(p.group(1)),imp(p.groups()),p.group(11)) for t,p,r in andamentos if p]
  return not andamentos and u'<big>\'\'Nenhum projeto em andamento\'\'</big>' or tabela + u'\n'.join(andamentos) + u'\n|}'

if time.strptime(pywikibot.Page(pywikibot.Site('pt-br','wikimediabr'),u'Wikimedia:Painel').getVersionHistory(revCount=1)[0][1],'%Y-%m-%dT%H:%M:%SZ')[2] != time.gmtime()[2]:
  paginas = ultimos(pywikibot.Page(pywikibot.Site('pt-br','wikimediabr'),u'Wikimedia:Ágora'))
  paginas += ultimos(pywikibot.Page(pywikibot.Site('meta','meta'),u'Talk:Programa Catalisador do Brasil/Planejamento 2012-2013'),u'meta:')
  paginas += ultimos(pywikibot.Page(pywikibot.Site('meta','meta'),u'Wikimedia Brasil/AffCom'),u'meta:')
  paginas += ultimos(pywikibot.Page(pywikibot.Site('meta','meta'),u'Talk:Wikimedia Brasil/AffCom'),u'meta:')
  paginas += ultimos(mr=pywikibot.Site('pt-br','wikimediabr').recentchanges(namespace=1))
  paginas += ultimos(mr=pywikibot.Site('pt-br','wikimediabr').recentchanges(namespace=4),subpage=u'Wikimedia:Ágora')
  paginas += listaemail()
  texto = u'''{{{{/cabeçalho}}}}
== Projetos em andamento ==
<div style="color:#555;font-size:x-small;margin-top:-14px">Adicione {{{{tl|andamento}}}} na página do projeto para inseri-lo aqui</div>

{0}
<span style="color:#0AF">* </span> página sem edição há mais de dois meses (ajude a movimentar esses projetos!).
== Discussões ==
{{|class="wikitable plainlinks" style="text-size:80%;line-height:14px"
|-
!Página / Tópico||style="min-width:20%"|Último comentário
{1}
|}}
<small>última atualização: ~~~~~</small>'''.format(projetos(),u'\n'.join(l[0] for l in sorted(paginas, key=lambda l:l[1], reverse=True)[0:30]))
  pywikibot.Page(pywikibot.Site('pt-br','wikimediabr'),u'Wikimedia:Painel').put(texto,comment=u'BOT: atualizando')
  #pywikibot.output(texto)
pywikibot.stopme()