Gebruiker:Bitbotje/nl-mod-activiteit.py

# -*- coding: utf-8 -*-
# Author Simon Bijl, Edo de Roo, bdijkstra
# 2015, MIT-License

import sys
import datetime
from datetime import datetime, date, time, timedelta
from itertools import islice
import pywikibot
from pywikibot.data.api import ListGenerator
import urllib
import csv

debugmode = False
site = pywikibot.Site('nl')
editLimit = 500

now = site.server_time()
oneYearAgo = now.replace(now.year - 1) + timedelta(days=14)

def main():
    pywikibot.output(oneYearAgo)
    botAltData = urllib.request.urlopen('https://nl.wiki.x.io/w/index.php?title=Gebruiker:Wutsje/tmp&oldid=61851161&action=raw')
    # skip 1st 2 lines
    botAltData.__next__()
    botAltData.__next__()
    botDict = {}
    altDict = {}
    for row in csv.reader([l.decode('utf-8') for l in botAltData.readlines()]):
        main = row[0]
        if main == '</pre>':
            break
        bots = row[1]
        if bots and len(bots) > 0:
            botDict[main] = bots.split(', ')
        alts = row[2]
        if alts and len(alts) > 0:
            altDict[main] = alts.split(', ')

    wikiString = (u'Onderstaande tabel geeft een indicatie van de activiteit ' +
        'van een moderator. De vermelde aantallen zijn het aantal ' + 
        'niet-verwijderde bijdragen van de moderator in de afgelopen 351 '
        'dagen, welke wel meetellen bij het afwegen van het ' +
        'activiteitscriterium dat is vastgesteld in de ' +
        '[[Wikipedia:Regelingen rond moderatoren|Wikipedia:Regelingen rond ' +
        'moderatoren]]. Bij een activiteit onder de 250 edits in 365 dagen ' +
        'mag, onder voorwaarden, een aanvraag worden ingediend ter ' + 
        'verwijdering van de moderatorrechten.<br>\n' +
        'Alleen moderatoren met minder dan %d niet-verwijderde ' +
        'bijdragen worden getoond. In de kolommen ernaast wordt een ' +
        'indicatie gegeven van respectievelijk moderatorhandelingen ' + 
        '(beveiliging, blokkering, verwijdering), vandalismebestrijding ' +
        '(markeringen) en bijdragen van aangemelde bots en sokpoppen.\n\n' +
        'Laatste update: {{subst:#timel:Y-m-d H:i (T)}}.\n\n' +
        '{| class="wikitable sortable" style="text-align:right"\n' +
        '! Gebruiker || Bijdragen || Modacties || Markeringen || ' +
        'Bot-<br>bijdragen || Alt-<br>bijdragen\n'
        ) % editLimit
    sysopNames = getSysopNames() # Get sysop list

    # Process for each sysop:
    for username in sysopNames:
        edits = lastYearEditCount(username)
        if edits < editLimit:
            actions = formatCount(lastYearSysopActionCount(username))
            patrols = formatCount(lastYearPatrolCount(username))
            botEdits = 0
            if username in botDict:
                for bot in botDict[username]:
                    botEdits += lastYearEditCount(bot)
            botEdits = formatCount(botEdits)
            altEdits = 0
            if username in altDict:
                for alt in altDict[username]:
                    altEdits += lastYearEditCount(alt)
            altEdits = formatCount(altEdits)
            tableRow = (u'|-\n| style="text-align:left" | {{lg|%(u)s}}\n' +
                '| %(ec)s\n' +
                '| %(a)s\n' +
                '| %(p)s\n' +
                '| %(be)s\n'
                '| %(ae)s\n') % {'u':username, 'ec':edits, 'a':actions, 
                                 'p':patrols, 'be':botEdits, 'ae':altEdits}
            wikiString += tableRow
            if debugmode:
                pywikibot.output(tableRow)
    wikiString += u'|}\n\n[[Categorie:Wikipedia:Moderatoren]]\n'
 
    if not debugmode: 
        pywikibot.Page(site, u'Wikipedia:Regelingen_rond_moderatoren/Activiteit_moderatoren').put(wikiString, summary=u'Update') #Save page

# Returns the user's number of (non-deleted) edits in the last year,
# capped at `editLimit`+2
def lastYearEditCount(username):
    user = pywikibot.User(site, username)
    contributions = user.contributions(total=editLimit+2, end=oneYearAgo)
    editCount = 0
    for contribution in contributions:
        editCount += 1
    return editCount

def lastYearLogEventCount(username, logtype):
    user = pywikibot.User(site, username)
    logevents = user.logevents(
                            logtype=logtype, total=editLimit+2, end=oneYearAgo)
    count = 0
    try:
        for logevent in logevents:
            count += 1
    except pywikibot.exceptions.HiddenKeyError:
        # T78152
        count += 1
        pywikibot.output("HiddenKeyError: user=%s logtype=%s" % (
                                                            username, logtype))
    return count

def lastYearSysopActionCount(username):
    return (lastYearLogEventCount(username, 'block') +
            lastYearLogEventCount(username, 'protect') +
            lastYearLogEventCount(username, 'delete') +
            lastYearLogEventCount(username, 'contentmodel'))

def lastYearPatrolCount(username):
    return lastYearLogEventCount(username, 'patrol')

# Returns list with usernames of all sysops active on site
def getSysopNames():
    array = []
    users = ListGenerator('allusers', site=site, augroup='sysop')
    for user in users:
        array.append(user['name'])
    return array

def formatCount(i):
    if i > editLimit:
        i = "> %d" % editLimit
    return i

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