User:GalliumBot/darn/darn.py

"""

Copyright (c) 2022 theleekycauldron

Permission is hereby granted, free of charge, to any person obtaining a copy

of this software and associated documentation files (the "Software"), to deal

in the Software without restriction, including without limitation the rights

to use, copy, modify, merge, publish, distribute, sublicense, and/or sell

copies of the Software, and to permit persons to whom the Software is

furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all

copies or substantial portions of the Software.

"""

import pywikibot as pwb

import re

version = " d a r n v1.0.3]"

site = pwb.Site('en', 'wikipedia')

time_page = pwb.Page(site,"User:GalliumBot/Time")

timestamps = time_page.get().splitlines()

class Nomination:

def __init__(self,name):

self.name = name #should be the nompage name

self.log = [] # [(time, text, user, revid)]

self.authors = [] #list of names, no "User:"

def __repr__(self):

return self.name + ": " + str(self.log)

def loglink(self,ind):

return self.log[ind][1]+" ["+self.log[ind][0].replace("T"," at ").replace("Z","")+", by {{noping|"+self.log[ind][2]+"}}]\n"

def generate_pqs():

res = [pwb.Page(site,"Template:Did you know")]

for i in range(1,8):

res.append(pwb.Page(site,"Template:Did you know/Preparation area "+str(i)))

res.append(pwb.Page(site,"Template:Did you know/Queue/"+str(i)))

return res

def main():

nominations = {}

pqs = generate_pqs() # preps and queues, as a list of Page objects

for page in pqs: #Populating

print(page)

for revision in page.revisions(endtime=timestamps[0]):

text = page.getOldVersion(revision.revid)

try:

hooktext = text[text.index(""):text.index("")].splitlines()[1:]

except ValueError as e:

continue

for hook in hooktext:

articles = [a[0].capitalize() + a[1:] for a in re.findall(r"'''\[\[([^\|\]]+)(?:\||\]\])",hook)]

for article in articles:

subpages = re.findall(r"\* {{DYKmake\|"+article+r"\|.+\|subpage=([^}]+)}}",text)

if len(subpages) == 0:

continue

if subpages[0] not in nominations:

nominations[subpages[0]] = Nomination(subpages[0])

nominations[subpages[0]].log.append((str(revision.timestamp),hook,revision.user,revision.revid))

break

latest_timestamp = str(timestamps[1])

for nom in nominations:

nominations[nom].log.sort(key=lambda x:x[0])

if nominations[nom].log[-1][0] <= timestamps[1]:

continue

for i in range(len(nominations[nom].log)):

if nominations[nom].log[i][0] > timestamps[1]:

nominations[nom].log = nominations[nom].log[max(i-1,0):]

break

log = nominations[nom].log

latest_timestamp = max(latest_timestamp,log[-1][0])

if log[0][1] != log[-1][1]:

output = "\n\n== Hook modifications ==\n"+nominations[nom].loglink(0)

for i in range(1,len(log)):

if log[i][1] != log[i-1][1]:

output += nominations[nom].loglink(i)

nomtalk = pwb.Page(site,"Template talk:Did you know nominations/"+nom)

nomtalk.text += output + "~~~~"

nomtalk.save(summary="logging detected modifications"+version)

time_page.text = timestamps[1]+"\n"+latest_timestamp

time_page.save(summary="updating time"+version)

main()