User:RonBot/6/Source1
RSconfig.py
mydate=0
validuser=False
archive=False
nameprefix=""
movetab=False
origpage=""
pagename=""
pagepage=""
pagetext=""
pagezise=0
destpagename=""
destpagepage=""
destpagetext=""
destpagesize=0
insert=0
changed=0
Main Program
from wikitools import *
import time
import urllib
import json
import userpassbot #Bot password
import warnings
import re
import mwparserfromhell
import datetime
import sys
import RSconfig
site = wiki.Wiki() #Tell Python to use the English Wikipedia's API
site.login(userpassbot.username, userpassbot.password) #login
#routine to autoswitch some of the output - as filenames have accented chars!
def pnt(s):
try:
print(s)
except UnicodeEncodeError:
print(s.encode('utf-8'))
def startAllowed():
textpage = page.Page(site, "User:RonBot/6/Run").getWikiText()
if textpage == "Run":
return "run"
else:
return "no"
def allow_bots(text, user):
user = user.lower().strip()
text = mwparserfromhell.parse(text)
for tl in text.filter_templates():
if tl.name.matches(['bots', 'nobots']):
break
else:
return True
print "template found" #Have we found one
for param in tl.params:
bots = [x.lower().strip() for x in param.value.split(",")]
if param.name == 'allow':
print "We have an ALLOW" # allow found
if ''.join(bots) == 'none': return False
for bot in bots:
if bot in (user, 'all'):
return True
elif param.name == 'deny':
print "We have a DENY" # deny found
if ''.join(bots) == 'none':
print "none - true"
return True
for bot in bots:
if bot in (user, 'all'):
pnt(bot)
pnt(user)
print "all - false"
return False
if (tl.name.matches('nobots') and len(tl.params) == 0):
print "match - false"
return False
return True
def StrToDate(datestr):
timestamp = datetime.datetime.strptime(datestr, '%Y-%m-%dT%H:%M:%SZ')
return timestamp
def YoungestDate(datein):
datein=StrToDate(datein)
if datein>RSconfig.mydate:
RSconfig.mydate=datein
RSconfig.validuser=True
return
def GetLastContrib(user):
params = {'action':'query',
'list':'usercontribs',
'uclimit':1,
'ucuser':user,
'ucdir':"older"
}
#print "GLC.params"
request = api.APIRequest(site, params) #Set the API request
#print "GLC.request"
result = request.query(False)
#print result, len(result)
if len(result)>2:
founddate=date=result['query']['usercontribs'][0]['timestamp']
print "Last Normal Edit", StrToDate(founddate)
YoungestDate(founddate)
else:
print "No normal contrib"
return
def GetLastDeleted(user):
params = {'action':'query',
'list':'alldeletedrevisions',
'adrprop':'timestamp',
'adrlimit':1,
'adruser':user,
'adrdir':"older"
}
#print "GLD.params"
request = api.APIRequest(site, params) #Set the API request
#print "GLD.request"
result = request.query(False)
#print result, len(result)
if len(result)>2:
founddate=result['query']['alldeletedrevisions'][0]['revisions'][0]['timestamp']
print "Last Deleted Edit", StrToDate(founddate)
YoungestDate(founddate)
else:
print "No deleted contrib"
return
def ExamineUser(user):
if len(user)>0:
GetLastContrib(user)
GetLastDeleted(user)
return
def FindUsers(text):
RSconfig.movetab=False
RSconfig.mydate=StrToDate("2000-01-01T00:00:00Z") #new lot of user, set mydate to way back.
RSconfig.validuser=False
usertext=re.sub(r'![\s]*?[Ss]cope="row"[\s\S]*?\|',"",text) #remove column 1
bracket=0 #now find end of column 2
for x in range(0,len(usertext)-1):
s=usertext[x]
found=1
if s=="|":
found=0
if bracket+found==0:
enduser=x
break
if s=="[":
bracket=bracket+1
if s=="]":
bracket=bracket-1
if s=="{":
bracket=bracket+1
if s=="}":
bracket=bracket-1
textcol2=usertext[0:enduser] # this is all column 2 - above code ignores "|" inside [|] or {|}
expirydate=datetime.datetime.utcnow()+datetime.timedelta(days=365)
for match in re.finditer(r'\[\[[Uu]ser:[\s\S]*?[\|\]]',textcol2): #[User:XXXX]
user=textcol2[match.start()+2:match.end()-1]
colon=user.index(":")
user=user[colon+1:]
pnt("UserA =" + user)
if "username" not in user.lower():
ExamineUser(user)
for match in re.finditer(r'\{\{[Uu]\|[\s\S]*?\}\}',textcol2): #{{U:XXXX}}
user="User:"+textcol2[match.start()+4:match.end()-2]
colon=user.index(":")
user=user[colon+1:]
pnt("UserB =" + user)
if "username" not in user.lower():
ExamineUser(user)
for match in re.finditer(r'\{\{[Nn]oping\|[\s\S]*?\}\}',textcol2):#{{noping|XXXX}}
user="User:"+textcol2[match.start()+9:match.end()-2]
colon=user.index(":")
user=user[colon+1:]
pnt("UserC =" + user)
if "username" not in user.lower():
ExamineUser(user)
if "dynamic" in textcol2.lower(): #Dynamic
print "DYNAMIC FLAG"
RSconfig.mydate=datetime.datetime.utcnow()
if RSconfig.validuser:
mylist=[]
textlen=len(usertext)-1
print"textlen",textlen
for x in range(textlen,0,-1):
if usertext[x]=="|":
mylist.append(x)
print mylist # mylist[1] to end is final column
textlastcol=usertext[mylist[1]:]
textlastcollow=textlastcol.lower()
if textlastcollow.find("indefinite")>=0:
print expirydate
else:
datefound=re.findall(r'20\d\d[\s-]\d\d[\s-]\d\d',textlastcol)
if len(datefound)>0:
expirydate=StrToDate(datefound[0]+"T00:00:00Z")
print"Last Group Edit", RSconfig.mydate
print"ExpiryDate", expirydate
if not RSconfig.archive:
if RSconfig.mydate < datetime.datetime.utcnow()-datetime.timedelta(days=730):
print "THIS ROW TO BE ARCHIVED - EDITS TWO YEARS OLD"
RSconfig.movetab=True
if expirydate < datetime.datetime.utcnow():
print "THIS ROW TO BE ARCHIVED - EXPIRED DATE"
RSconfig.movetab=True
else:
if expirydate > datetime.datetime.utcnow():
if RSconfig.mydate > datetime.datetime.utcnow()-datetime.timedelta(days=730):
print "THIS ROW TO BE UN ARCHIVED - NOT EXPIRED, and NEW EDITS"
RSconfig.movetab=True
return
def MoveToDest(startp,endp,text):
print "MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM"
print len(text)
print len(RSconfig.pagetext)
#tabline1=text[startp:endp]
tabline=RSconfig.pagetext[startp:endp]
print tabline
print"****************"
pagetext=RSconfig.pagetext[0:startp-1]+"\n\n"+RSconfig.pagetext[endp+1:]
RSconfig.pagetext=pagetext
print repr(tabline)
print "MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM"
pagetext=RSconfig.destpagetext[0:RSconfig.insert]+"\n\n"+tabline+"\n\n"+RSconfig.destpagetext[RSconfig.insert+1:]
RSconfig.destpagetext=pagetext
return
def CheckTab(start, end, text):
RSconfig.movetab=False
print start, end
tabline=text[start:end]
print repr(tabline)
print "++++++++++++++++++++++++++Start of Table Section+++++++++++++++++++++++++++++++++++++++"
print repr(tabline)
print "++++++++++++++++++++++++++End of Table Section+++++++++++++++++++++++++++++++++++++++"
FindUsers(tabline)
print "==========================End of Section Data======================================="
if RSconfig.movetab:
print "Eliminate", start, end
MoveToDest(start, end, text)
RSconfig.changed=+1
return
def ProcessPage(subpage):
RSconfig.changed=0
RSconfig.origpage=subpage
#set to get the two pages
if RSconfig.archive:
RSconfig.pagename = RSconfig.namprefix+"/Archive/"+subpage
RSconfig.destpagename = RSconfig.namprefix+"/"+RSconfig.origpage
editsum="(Task 6) Active Users - Remove from Archive to go to "+RSconfig.destpagename
editsumdest="(Task 6) Active Users - Returning from Archive ("+RSconfig.pagename+"}"
else:
RSconfig.pagename = RSconfig.namprefix+"/"+RSconfig.origpage
RSconfig.destpagename = RSconfig.namprefix+"/Archive/"+subpage
editsum="(Task 6) Inactive Users - Remove to archive ("+RSconfig.destpagename+")"
editsumdest="(Task 6) Inactive Users - Add to Archive from "+RSconfig.pagename
print RSconfig.pagename
print RSconfig.destpagename
RSconfig.pagepage = page.Page(site, RSconfig.pagename)
RSconfig.pagetext = RSconfig.pagepage.getWikiText()
RSconfig.pagesize=len(RSconfig.pagetext)
RSconfig.destpagepage = page.Page(site, RSconfig.destpagename)
RSconfig.destpagetext = RSconfig.destpagepage.getWikiText()
RSconfig.destpagesize=len(RSconfig.destpagetext)
print "Page Sizes from and to", RSconfig.pagesize, RSconfig.destpagesize
#Check pages for nobots - unlikly to be here
stop = allow_bots(RSconfig.pagetext, "RonBot")
if not stop:
return
stop = allow_bots(RSconfig.destpagetext, "RonBot")
if not stop:
return
#find the table start and the table end
tabtop=RSconfig.pagetext.find('{|')-1
tabbot=RSconfig.pagetext.rfind('|}')-1
desttabtop=RSconfig.destpagetext.find('{|')-1
desttabbot=RSconfig.destpagetext.rfind('|}')-1
#Fix the table end to a new row start and space out the table rows
RSconfig.pagetext=RSconfig.pagetext[0:tabbot]+'\n|-\n! scope="row"\nBOTEND'+RSconfig.pagetext[tabbot+1:]
RSconfig.destpagetext=RSconfig.destpagetext[0:desttabbot]+'\n|-\n! scope="row"\nBOTEND'+RSconfig.destpagetext[desttabbot+1:]
RSconfig.pagetext=re.sub(r'\|-\n!','|-\n\n!',RSconfig.pagetext)
RSconfig.destpagetext=re.sub(r'\|-\n!','|-\n\n!',RSconfig.destpagetext)
#Get the table row starts
destpositionlist=[]
for match in re.finditer(r'(!)[\s]*?[Ss]cope="row"',RSconfig.destpagetext):
end = match.start()-1
if end>desttabtop:
destpositionlist.append(end)
RSconfig.insert=destpositionlist[0]-1 # Insert point is everything before the first "!"
positionlist=[]
for match in re.finditer(r'(!)[\s]*?[Ss]cope="row"',RSconfig.pagetext):
end = match.start()-1
if end>tabtop:
positionlist.append(end)
#Final match is positionlist[len(positionlist)-1]
rows=len(positionlist)
end = positionlist[rows-1]#end of table marker (dummy row start put in earlier)
print end
for a in range(rows-2,0,-1): # MAIN Loop to check each tabline in reverse order
start=positionlist[a]
print start,RSconfig.pagetext[start] # all are "!"
CheckTab(start,end,RSconfig.pagetext)
end=start-1
RSconfig.lastrow=False
if RSconfig.changed>0:
#Need to restore the correct table end, and remove excess blank lines added
print "===================="
RSconfig.pagetext=re.sub(r'\|-\n*?! scope="row"\nBOTEND\|\}','|}',RSconfig.pagetext)
RSconfig.pagetext=re.sub(r'\|-\n*?\!','|-\n!',RSconfig.pagetext)
print RSconfig.pagetext
RSconfig.destpagetext=re.sub(r'\|-\n*?! scope="row"\nBOTEND\|\}','|}',RSconfig.destpagetext)
RSconfig.destpagetext=re.sub(r'\|-\n*?\!','|-\n!',RSconfig.destpagetext)
print RSconfig.destpagetext
print "TIME TO CHECK FROM PAGE"
#Get current page sizes - has someone edited while processing? - check with saved size on first load
pagepage = page.Page(site, RSconfig.pagename)
pagetext = pagepage.getWikiText()
pagesize=len(pagetext)
if pagesize<>RSconfig.pagesize:
print "Page Has been edited - aborting"
return
print "TIME TO CHECK DEST PAGE"
destpagepage = page.Page(site, RSconfig.destpagename)
destpagetext = destpagepage.getWikiText()
destpagesize=len(destpagetext)
if destpagesize<>RSconfig.destpagesize:
print "Page Has been edited abort"
return
RSconfig.pagepage.edit(text=RSconfig.pagetext, bot=True, summary=editsum) #(DO NOT UNCOMMENT UNTIL BOT IS APPROVED)
RSconfig.destpagepage.edit(text=RSconfig.destpagetext, bot=True, summary=editsumdest) #(DO NOT UNCOMMENT UNTIL BOT IS APPROVED)
print "===================="
else:
print "NO CHANGES TO PAGE NEEDED"
return
def main():
RSconfig.namprefix="Wikipedia:Editing restrictions"
go = startAllowed() #Check if task is enabled
if go == "no":
sys.exit('Disabled Task')
#parameters for API request
print "main is go"
#Send each subpage in turn
RSconfig.archive=False
print "####################################################################"
print "Process - Wikipedia:Editing restrictions/Placed by the Arbitration Committee"
ProcessPage('Placed by the Arbitration Committee')
print "####################################################################"
print "Wikipedia:Editing restrictions/Placed by the Wikipedia community"
ProcessPage('Placed by the Wikipedia community')
print "####################################################################"
print "Wikipedia:Editing restrictions/Voluntary"
ProcessPage('Voluntary')
print "####################################################################"
print "Wikipedia:Editing restrictions/Unblock conditions"
ProcessPage('Unblock conditions')
RSconfig.archive=True
print "####################################################################"
print "Process - Wikipedia:Editing restrictions/Archive/Placed by the Arbitration Committee"
ProcessPage('Placed by the Arbitration Committee')
print "####################################################################"
print "Wikipedia:Editing restrictions/Archive/Placed by the Wikipedia community"
ProcessPage('Placed by the Wikipedia community')
print "####################################################################"
print "Wikipedia:Editing restrictions/Archive/Voluntary"
ProcessPage('Voluntary')
print "####################################################################"
print "Wikipedia:Editing restrictions/Archive/Unblock conditions"
ProcessPage('Unblock conditions')
if __name__ == "__main__":
with warnings.catch_warnings():
warnings.simplefilter("ignore", FutureWarning)
main()
Content Disclaimer
Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.
- The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
- There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
- It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
- Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
- Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.