User:Surjection/probotector.py

Hello, you have come here looking for the meaning of the word User:Surjection/probotector.py. In DICTIOUS you will not only get to know all the dictionary meanings for the word User:Surjection/probotector.py, but we will also tell you about its etymology, its characteristics and you will know how to say User:Surjection/probotector.py in singular and plural. Everything you need to know about the word User:Surjection/probotector.py you have here. The definition of the word User:Surjection/probotector.py will help you to be more precise and correct when speaking or writing your texts. Knowing the definition ofUser:Surjection/probotector.py, as well as those of other words, enriches your vocabulary and provides you with more and better linguistic resources.

from pywikibot import Site, Page, Category, Timestamp
from datetime import datetime, timedelta


enwikt = Site('en', fam='wiktionary')
enwikt.login()


NAMESPACES = (
    828,    # Module
    10,     # Template
)
SCORE_TO_PROTECT = 1000
TRANSCLUDED_MULTIPLIER = {
    # content pages (mainspace, reconstruction) count two-fold
    0: 2,
    118: 2
}


DEBUG = False
LOG_ONLY = True
LOG_ALL = False
LEVELS = 
PROTECT_EDIT_AT = "autoconfirmed"
PROTECT_MOVE_AT = "autoconfirmed"


def insufficient_protection(page):
    edit_level = page.protection().get('edit', None)
    if not edit_level:
        return True
    if edit_level == 'all':
        return True
    return edit_level in LEVELS and LEVELS.index(edit_level) < LEVELS.index(PROTECT_EDIT_AT)


def do_protect(page, score):
    reason = f'(bot) automatically protect highly visible templates/modules (reference score: {score}+ >= {SCORE_TO_PROTECT})'
    edit_level = page.protection().get('edit', 'all') or 'all'
    move_level = page.protection().get('move', 'all') or 'all'

    if edit_level in LEVELS and LEVELS.index(edit_level) < LEVELS.index(PROTECT_EDIT_AT):
        edit_level = PROTECT_EDIT_AT
    if move_level in LEVELS and LEVELS.index(move_level) < LEVELS.index(PROTECT_MOVE_AT):
        move_level = PROTECT_MOVE_AT

    protections = {'edit': edit_level, 'move': move_level}

    if DEBUG or LOG_ONLY:
        print('\t', dict(page=page, reason=reason, protections=protections))
    else:
        page.protect(reason=reason, protections=protections)


def ignore_page_by_title(title):
    if '/' not in title:
        return False
    last_token = title.split('/')
    if last_token in {'documentation', 'sandbox', 'testcases'}:
        # don't mess with documentations, sandboxes or testcases
        return True
    if title.startswith('Template:User:') or title.startswith('Module:User:'):
        # don't mess with user templates/modules
        return True
    if title in ('Template:sandbox', 'Module:sandbox'):
        # don't mess with sandboxes
        return True
    if title.startswith('Template:sandbox/') or title.startswith('Module:sandbox/'):
        # don't mess with sandboxes
        return True
    if ":zh/data/" in title:
        # literally thousands of these - just skip them all
        return True
    if ":User " in title and "-" in title:
        # literally thousands of these - just skip them all
        return True
    return False


for namespace in NAMESPACES:
    print(namespace)
    for page in enwikt.allpages(namespace=namespace):  # , start='a'):
        try:
            if LOG_ALL:
                print(page.title())
            if not ignore_page_by_title(page.title()) and insufficient_protection(page):
                backlink_iterator = page.getReferences(follow_redirects=True, with_template_inclusion=True, only_template_inclusion=True, filter_redirects=False, total=SCORE_TO_PROTECT, content=False)
                score = 0
                for backlinker in backlink_iterator:
                    score += TRANSCLUDED_MULTIPLIER.get(backlinker.namespace().id, 1)
                if score >= SCORE_TO_PROTECT:
                    do_protect(page, score)
        except KeyboardInterrupt:
            print(page.title())
            raise