Usuari:CobainBot/scripts/cawiki/pace.py

#/usr/bin/python
# -*- coding: utf8 -*-
# By: Gerardduenas
# new features: Coet 2015-08-14
# updated: Coet 2023-02-27

from datetime import datetime

from dateutil.relativedelta import relativedelta
from pywikibot import Site, Page
from pywikibot.data import api

# globals
site = Site('ca', 'wikipedia', 'TronaBot')


class PaceResult:
    def __init__(self, hours):
        self.last_hours = hours
        self.articles = 0
        self.new_articles = 0
        self.last_article = ''
        self._title = ''
        self.summary = ''

    @property
    def title(self):
        return self._title

    @title.setter
    def title(self, name: str):
        self._title = f'Plantilla:{name}'


class Template(Page):
    def __init__(self, pace: PaceResult):
        Page.__init__(self, site, pace.title)
        self.pace: PaceResult = pace

    def write(self):
        text = f'{self.pace.new_articles}\n<noinclude>[[Categoria:Plantilles]]</noinclude>'
        comment = f'Actualitzant articles creats en {self.pace.summary} ({self.pace.new_articles}).'
        self.put(text, comment)


class Paces:
    def __init__(self):
        self.start_time = datetime.now()

    def query(self, params):
        query = api.Request(site, parameters=params)
        return query.submit()

    def get_new_arts(self, hours=24):
        pace_result = PaceResult(hours)
        rc_end_dt = datetime.now() - relativedelta(hours=hours)
        params = {
            "action": "query",
            # newarticles
            "list": "recentchanges",
            "rclimit": "max",
            "rctype": "new",
            "rcprop": ("title", "timestamp"),
            "rcnamespace": 0,
            "rcshow": "!redirect",
            "rcend": f'{rc_end_dt:%Y-%m-%dT%H:%M:%SZ}',
            # statistics
            "meta": "siteinfo",
            "siprop": "statistics",
            "indexpageids": "",
            "rawcontinue": ""
        }
        rcstart = True
        new_arts = 0
        data = None
        while rcstart:
            if isinstance(rcstart, str):
                params['rcstart'] = rcstart.split('|')[0]
            data = self.query(params)
            rcstart = data['query-continue']['recentchanges']['rccontinue'] if "query-continue" in data else None
            new_arts += len(data['query']['recentchanges'])
        pace_result.articles = data['query']['statistics']['articles']
        pace_result.last_article = data['query']['recentchanges'][0]['title'] if data['query']['recentchanges'] else ""
        pace_result.new_articles = new_arts
        return pace_result

    def run(self):
        last_24h_pace = self.get_new_arts(24)
        last_24h_pace.title = 'Ritme'
        last_24h_pace.summary = 'les darreres 24 hores'

        last_7d_pace = self.get_new_arts(168)
        last_7d_pace.title = 'Ritme7dies'
        last_7d_pace.summary = 'els darrers 7 dies'

        last_30d_pace = self.get_new_arts(720)
        last_30d_pace.title = 'Ritme30dies'
        last_30d_pace.summary = 'els darrers 30 dies'

        for template in (Template(last_24h_pace), Template(last_7d_pace), Template(last_30d_pace)):
            template.write()


if __name__ == '__main__':
    paces = Paces()
    paces.run()