Revision: 8320
Author:   xqt
Date:     2010-06-24 17:35:26 +0000 (Thu, 24 Jun 2010)

Log Message:
-----------
First step of a block review bot for de and pt-wiki. Must be adopted. Do not 
use it!

Added Paths:
-----------
    trunk/pywikipedia/blockreview.py

Added: trunk/pywikipedia/blockreview.py
===================================================================
--- trunk/pywikipedia/blockreview.py                            (rev 0)
+++ trunk/pywikipedia/blockreview.py    2010-06-24 17:35:26 UTC (rev 8320)
@@ -0,0 +1,256 @@
+#!/usr/bin/python
+# -*- coding: utf-8  -*-
+"""
+This is not a complete bot; rather, it is a template from which simple
+bots can be made. You can rename it to mybot.py, then edit it in
+whatever way you want.
+
+The following parameters are supported:
+
+-dry              If given, doesn't do any real changes, but only shows
+                  what would have been changed.
+
+All other parameters will be regarded as part of the title of a single page,
+and the bot will only work on that single page.
+"""
+#
+# (C) xqt, 2010
+#
+__version__ = '$Id: basic.py 7845 2009-12-30 17:02:05Z xqt $'
+#
+import wikipedia as pywikibot
+import userlib
+
+# This is required for the text that is shown when you run this script
+# with the parameter -help.
+
+class BlockreviewBot:
+    # notes
+    note_admin = {
+        'de': u"\n\n== Sperrprüfungswunsch ==\nHallo %(admin)s, 
\n\n[[%(user)s]] wünscht diePrüfung seiner/ihrer Sperre vom %(time)s über die 
Dauer von %(duration)s. Kommentar war ''%(comment)s''. Bitte äußere Dich dazu 
auf der [[%(usertalk)s#%(section)s|Diskussionsseite]]. -~~~~"
+    }
+    
+    note_project = {
+        'de': u"\n\n== [[%(user)s]] ==\n* gesperrt am %(time)s durch 
{{Benutzer|%(admin)s}} für eine Dauer von %(duration)s.\n* Kommentar war 
''%(comment)s''.\n* [[Benutzer:%(admin)s]] wurde [[Benutzer 
Diskussion:%(admin)s#Sperrprüfungswunsch|benachrichtigt]].\n* 
[[%(usertalk)s#%(section)s|Link zur 
Diskussion]]\n:<small>-~~~~</small>\n;Antrag entgegengenommen"
+    }
+
+    # edit summary
+    msg_admin = {
+        'de': u'Bot-Benachrichtigung: Sperrprüfungswunsch von [[%(user)s]]',
+    }
+
+    unblock_tpl = {
+        'de' : u'Benutzer:TAXman/Sperrprüfungsverfahren',
+    }
+
+    project_name = {
+        'de' : u'Benutzer:TAXman/Sperrprüfung Neu'
+        'pt' : u'Wikipedia:Pedidos a administradores/Discussão de bloqueio'
+    }
+
+    def __init__(self, dry):
+        """
+        Constructor. Parameters:
+            * generator - The page generator that determines on which pages
+                          to work on.
+            * dry       - If True, doesn't do any real changes, but only shows
+                          what would have been changed.
+        """
+        self.site = pywikibot.getSite()
+        self.dry = dry
+        self.info = None
+        self.parts = None
+
+    def run(self):
+        try:
+            genPage = pywikibot.Page(self.site,
+                                     self.unblock_tpl[self.site.lang],
+                                     defaultNamespace=10)
+        except KeyError:
+            pywikibot.output(u'ERROR: Language "%s" not supported by this bot.'
+                             % self.site.lang)
+        else:
+            for page in genPage.getReferences(follow_redirects=False,
+                                              withTemplateInclusion=True,
+                                              onlyTemplateInclusion=True):
+                if page.namespace() == 3:
+                    self.treat(page)
+                else:
+                    pywikibot.output(u'Ignoring %s, user namespace required'
+                                     % page.aslink())
+
+    def treat(self, userPage):
+        """
+        Loads the given page, does some changes, and saves it.
+        """
+        talkText = self.load(userPage)
+        if not talkText:
+            return
+        unblock_tpl = self.unblock_tpl[self.site.lang]
+        project_name = self.project_name[self.site.lang]
+        user = userlib.User(self.site, userPage.titleWithoutNamespace())
+        saveAdmin = saveProject = False
+        talkComment = None
+        for templates in userPage.templatesWithParams():
+            if templates[0] == unblock_tpl:
+                self.getInfo(user)
+                # Sperrprüfung ist neu eingetragen.
+                # Sperrenden Admin benachrichtigen.
+                if templates[1]==[] or templates[1][0]==u'1':
+                    if self.info['action'] == 'block' or user.isBlocked():
+                        admin = userlib.User(self.site, self.info['user'])
+                        adminPage = admin.getUserTalkPage()
+                        adminText = adminPage.get()
+                        note = pywikibot.translate(self.site.lang,
+                                                   self.note_admin) % 
self.parts
+                        comment = pywikibot.translate(self.site.lang,
+                                                      self.msg_admin) % 
self.parts
+                        adminText += note
+                        self.save(adminText, adminPage, comment, False)
+                        talkText = talkText.replace(u'{{%s}}'   % unblock_tpl,
+                                                    u'{{%s|2}}' % unblock_tpl)
+                        talkText = talkText.replace(u'{{%s|1}}' % unblock_tpl,
+                                                    u'{{%s|2}}' % unblock_tpl)
+                        talkComment = u'Bot: Administrator 
[[Benutzer:%(admin)s|%(admin)s]] für Sperrprüfung benachrichtigt' \
+                                      % self.parts
+    
+                        #testPage = pywikibot.Page(self.site, 
'Benutzer:Xqt/Test')
+                        #test = testPage.get()
+                        #test += note
+                        #self.save(test, testPage, 
'[[WP:BA#SPP-Bot|SPPB-Test]]')
+                    else:
+                        # nicht blockiert. Fall auf DS abschließen
+                        talkText = talkText.replace(u'{{%s}}'   % unblock_tpl,
+                                                    u'{{%s|4}}' % unblock_tpl)
+                        talkText = talkText.replace(u'{{%s|1}}' % unblock_tpl,
+                                                    u'{{%s|4}}' % unblock_tpl)
+                        talkComment = u'Bot: Sperrprüfung abgeschlossen. 
Benutzer ist entsperrt.'
+                # Admin ist benachrichtigt.
+                # 2 Stunden warten, dann eintrag auf Projektseite
+                elif templates[1][0]==u'2':
+                    if self.info['action'] == 'block' or user.isBlocked():
+                        # todo: Wartezeit einplanen
+                        #       prüfen, ob Eintrag schon vorhanden
+                        project = pywikibot.Page(self.site, project_name)
+                        projText = project.get()
+                        note = pywikibot.translate(self.site.lang,
+                                                   self.note_project) % 
self.parts
+                        comment = pywikibot.translate(self.site.lang,
+                                                      self.msg_admin) % 
self.parts
+                        projText += note
+                        self.save(projText, project, comment, botflag = False)
+                        talkText = talkText.replace(u'{{%s|2}}' % unblock_tpl,
+                                                    u'{{%s|3}}' % unblock_tpl)
+                        talkComment = u'Bot: [[%s|Wikipedia:Sperrprüfung]] 
eingetragen' \
+                                      % project_name
+                    else:
+                        # nicht blockiert. Fall auf DS abschließen
+                        talkText = talkText.replace(u'{{%s|2}}' % unblock_tpl,
+                                                    u'{{%s|4}}' % unblock_tpl)
+                        talkComment = u'Bot: Sperrprüfung abgeschlossen. 
Benutzer ist entsperrt.'
+                elif templates[1][0]==u'3':
+                    if self.info['action'] == 'block' or user.isBlocked():
+                        pass
+                    else:
+                        # nicht blockiert. Fall auf DS abschließen
+                        talkText = talkText.replace(u'{{%s|3}}' % unblock_tpl,
+                                                    u'{{%s|4}}' % unblock_tpl)
+                        talkComment = u'Bot: Sperrprüfung abgeschlossen. 
Benutzer ist entsperrt.'
+                elif templates[1][0]==u'4':
+                    # nothing left to do
+                    pass
+            else:
+                # wrong template found
+                pass
+            
+        if talkComment:
+            self.save(talkText, userPage, talkComment)
+
+    def getInfo(self, user):
+        if not self.info:
+            self.info = self.site.logpages(1, mode='block',
+                                           title=user.getUserPage().title(),
+                                           dump=True).next()
+            self.parts = {
+                'admin'    : self.info['user'],
+                'user'     : self.info['title'],
+                'usertalk' : user.getUserTalkPage().title(),
+                'section'  : u'Sperrprüfung',
+                'time'     : self.info['timestamp'],
+                'duration' : self.info['block']['duration'],
+                'comment'  : self.info['comment'],
+            }
+        
+
+    def load(self, page):
+        """
+        Loads the given page, does some changes, and saves it.
+        """
+        try:
+            # Load the page
+            text = page.get()
+        except pywikibot.NoPage:
+            pywikibot.output(u"Page %s does not exist; skipping."
+                             % page.aslink())
+        except pywikibot.IsRedirectPage:
+            pywikibot.output(u"Page %s is a redirect; skipping."
+                             % page.aslink())
+        else:
+            return text
+        return None
+
+    def save(self, text, page, comment, minorEdit=True, botflag=True):
+        if text != page.get():
+            # Show the title of the page we're working on.
+            # Highlight the title in purple.
+            pywikibot.output(u"\n\n>>> \03{lightpurple}%s\03{default} <<<"
+                             % page.title())
+            # show what was changed
+            pywikibot.showDiff(page.get(), text)
+            pywikibot.output(u'Comment: %s' %comment)
+            if not self.dry:
+                choice = pywikibot.inputChoice(u'Do you want to accept these 
changes?', ['Yes', 'No'], ['y', 'N'], 'N')
+                if choice == 'y':
+                    try:
+                        # Save the page
+                        page.put(text, comment=comment, minorEdit=minorEdit, 
botflag=botflag)
+                    except pywikibot.LockedPage:
+                        pywikibot.output(u"Page %s is locked; skipping."
+                                         % page.aslink())
+                    except pywikibot.EditConflict:
+                        pywikibot.output(
+                            u'Skipping %s because of edit conflict'
+                            % (page.title()))
+                    except pywikibot.SpamfilterError, error:
+                        pywikibot.output(
+u'Cannot change %s because of spam blacklist entry %s'
+                            % (page.title(), error.url))
+                    else:
+                        return True
+        return False
+
+def main():
+    # If dry is True, doesn't do any real changes, but only show
+    # what would have been changed.
+    dry = show = False
+
+    # Parse command line arguments
+    for arg in pywikibot.handleArgs():
+        if arg == "-dry":
+            dry = True
+        else:
+            show = True
+
+    if not show:
+        # The preloading generator is responsible for downloading multiple
+        # pages from the wiki simultaneously.
+        bot = BlockreviewBot(dry)
+        bot.run()
+    else:
+        pywikibot.showHelp()
+
+if __name__ == "__main__":
+    try:
+        main()
+    finally:
+        pywikibot.stopme()


Property changes on: trunk/pywikipedia/blockreview.py
___________________________________________________________________
Added: svn:eol-style
   + native



_______________________________________________
Pywikipedia-svn mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/pywikipedia-svn

Reply via email to