Szerkesztő:BinBot/portalkarbantartok.py

A Wikipédiából, a szabad enciklopédiából
# -*- coding: utf-8 -*-
"""
Kikeresi a Portál:Portálok#Portálok listája szakaszból a karbantartókat,
és egy allapra gyűjti az utolsó szerkesztésük dátumát.
"""
# (C)(D)(E)(F)(G)(A)(H)(C) Bináris, 2016. augusztus 20.
# Első összeütött változat, alkalmi használatra, nincs hibakezelés

import re
import time
import wikipedia as pywikibot
import userlib

# Általános beállítások
FROMPAGE = u'Portál:Portálok'
TOPAGE = u'Portál:Portálok/Karbantartók jelenléte'
COMMENT = u'A portálkarbantartók listájának frissítése az utolsó szerkesztésük dátumával'
site = pywikibot.getSite()
HEADER = u'''
{{tudnivalók|Ezen az allapon a [[Portál:Portálok#Portálok listája]] szakaszban felsorolt karbantartók
utolsó szerkesztésének dátumát listázzuk, hogy látható legyen, köztünk vannak-e még a karbantartásra
vállalkozó szerkesztők. A dátumok UTC-ben vannak megadva, ezért ha valaki éjfél után kevéssel
szerkesztett utoljára, egy nap eltérés lehet.

Az átnevezett szerkesztőket a program nem követi, ilyenkor a ''Nincs ilyen szerkesztő'' szöveg jelenik meg.
Miután frissítetted a szerkesztő nevét az eredeti listában, a program újbóli futtatása javítja a hibát.

Utolsó frissítés: ~~~~
<br /><small>
Egyelőre nem frissül  automatikusan, [[user:Bináris|]]tól lehet kérni a frissítését,
vagy önállóan futtatni. A frissítés újragenerálja a lapot, törli az esetleges megjegyzéseket.
Kód: [[User:BinBot/portalkarbantartok.py]]</small>}}
\n\n
'''
months = [u'január', u'február', u'március', u'április', u'május', u'június',
          u'július', u'augusztus', u'szeptember', u'október', u'november',
          u'december']
thead = u'{| {{széptáblázat}}\n! Szerkesztő !! Utolsó szerkesztés'

def daystring(d):
    return d[1:] if d.startswith('0') else d

def long2date(l):
    s = str(l)
    d = None
    if re.match(ur'\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z', s):
        d = time.strptime(s, '%Y-%m-%dT%H:%M:%SZ')
    else:
        d = time.strptime(s, '%Y%m%d%H%M%S')
    d = (time.strftime('%Y', d), months[int(time.strftime('%m', d)) - 1], daystring(time.strftime('%d', d)))
    f = '%s. %s %s.' % d
    return f
    
def trow(usertuple):
    return '\n|-\n| {{user|%s}} || %s' % (usertuple[0], usertuple[1])
    
def namesort(usertuple):
    return usertuple[0].lower()

def datesort(usertuple):
    return str(usertuple[2]) + usertuple[0].lower()

# A karbantartók listája
usernames = set()
text = pywikibot.Page(site, FROMPAGE).get()
sectionpattern = re.compile(ur'(?s)== Portálok listája ==(.*?)== Portáltervek listája ==')
section = sectionpattern.search(text).group(1)
# | 1. || [[Portál:Biológia|Biológia]] || [[2005]]. [[október 23.]] || [[User:NCurse|NCurse]]  || [[User:NCurse|NCurse]]
rowpattern = re.compile(ur'\| *\d+\. *\|\|.*?\|\|.*?\|\|.*?\|\|(.*)')
userpattern = re.compile(ur'(?i)(\[\[(User|Szerkesztő):|\{\{user2?\|)(.*?)(\||\]\]|\}\})')
for row in rowpattern.findall(section):
    for username in userpattern.finditer(row):
        usernames.add(username.group(3))

# Az utolsó szerkesztések lekérdezése
users = set()
for username in usernames:
    user = userlib.User(site, username)
    if user.exists():
        van = False # Jojoka2 kedvéért, aki átnevezés után újraregisztrált, de az új néven
                    # nincs szerkesztése, így átugornánk az egész sort
        for contrib in user.contributions(1):
            users.add((username, long2date(contrib[2]), contrib[2]))
            van = True
        if not van:
            users.add((username, u'Nincs ilyen szerkesztő', 99999999999999L))
    else:
        users.add((username, u'Nincs ilyen szerkesztő', 99999999999999L))

text = HEADER
text += u'== Ábécében ==\nAz ékezetesek a végére kerültek.\n' + thead
for usertuple in sorted(users, key=namesort):
    text += trow(usertuple)
text += '\n|}\n\n'
text += u'== Időrendben ==\n' + thead
for usertuple in sorted(users, key=datesort):
    text += trow(usertuple)
text += u'\n|}\n\n[[Kategória:Portálok]]'
pywikibot.output(text)

# A lap frissítése
page = pywikibot.Page(site, TOPAGE)
page.put(text, comment=COMMENT, watchArticle=False, minorEdit=False, botflag=False)