cleaned up code and removed debugging statements
[backwash] / backwash.py
index c712028b1d01f793dc584c79c30568c950eff81d..7373e22173a9712eac04ab6063e0bdbecfb05653 100644 (file)
@@ -1,19 +1,22 @@
 #!/usr/bin/env python
 # -*- coding: utf-8 -*-
 
-# http://pywikipediabot.sourceforge.net/
-# svn co http://svn.wikimedia.org/svnroot/pywikipedia/trunk/pywikipedia pywikipedia
-
-
 import sys
 import re
-import iso8601
 from simplemediawiki import MediaWiki
+import interwiki
+
+# TODO/bugs:
 
-# TODO:
-# - any space names in page names need to be turned into '_'s 
-# - we need to de-interwikify any interwiki links given to Wiki:
+# - the bot should loginto the system. the simplemediawiki library
+#   should help us with that
+# - we need to de-interwikify any interwiki links given to Wiki
+# - the interwiki stuff isn't working for a few reason. i think we should turn it off
+#   we should only add interwiki links to the api
+#   we should only do it when we create an account on the wiki for the bot
 # - normalize messages for non-unix linebreaks
+# - get_revid_for_date is not being called at the moment a date w/o a
+#   a revision is not showing up
 
 class Wiki:
     def __init__(self, url):
@@ -36,21 +39,33 @@ class Wiki:
     def get_edit_token(self, page):
         wc = self.wiki.call({
             'action' : 'query',
-            'prop': 'info',
-            'page': page,
+            'prop': 'info|revisions',
+            'titles': page,
             'intoken' : 'edit'})
-        import pprint
-        pprint.pprint(wc)
         pages = wc['query']['pages']
         page = pages[pages.keys()[0]]
+
         return page['edittoken']
 
+    def normalize_title(self, page):
+        wc = self.wiki.call({
+            'action': 'query',
+            'prop': 'info',
+            'titles': page,
+            'redirects': 'true'})
+        pages = wc['query']['pages']
+        page = pages[pages.keys()[0]]
+
+        return page['title'].replace(" ", "_")
+        
     def get_talk_page(self, page):
-        if ':' in page:
-            (namespace, rest) = page.split(':', 1)
-            return '%s_talk:%s' % (namespace, rest)
-        else:
-            return 'Talk:%s' % page
+       normalized = self.normalize_title(page)
+       
+       if ':' in normalized:
+          (namespace, rest) = normalized.split(':', 1)
+          return '%s_talk:%s' % (namespace, rest)
+       else:
+          return 'Talk:%s' % page
 
     def get_page_text(self, page):
         wc = self.wiki.call({
@@ -60,58 +75,69 @@ class Wiki:
             'redirects': 'true',
             'rvprop' : 'content'})
         pages = wc['query']['pages']
-        return pages[pages.keys()[0]]['revisions'][0]['revid']
-
-        #query&prop=revisions&rvprop=content&format=xml&titles=Main%20Page
-        pass
+        # something here:LP
+        page = pages[pages.keys()[0]]
+        return page['revisions'][0]['*']
         
-    def append_to_talk_page(self, page):
+    def append_to_talk_page(self, page, text):
         talk_page = self.get_talk_page(page)
-        edit_token = self.get_edit_token(page)
+        edit_token = self.get_edit_token(talk_page)
 
         wc = self.wiki.call({
             'action' : 'edit',
             'title': talk_page,
             'bot' : 'true',
-            'token' : self.get_edit_token(page)})
-        import pprint
-        pprint.pprint(wc)
-        pages = wc['query']['pages']
-        page = pages[pages.keys()[0]]
-        return page['edittoken']
-
-        
+            'token' : edit_token,
+            'notminor': 'true',
+            'section' : 'new',
+            'summary': 'Suggestion from an offline user (via [[User:BackWashBot|BackWashBot]])',
+            'text': text })
 
 def make_link(wiki, page, revision):
-    return '%s/index.php?title=%s&oldid=%s' % (wiki, page, revision)
+    return '%sindex.php?title=%s&oldid=%s' % (wiki, page.replace(' ', '_'), revision)
 
 class WikiEdit:
     fields = ['page', 'date', 'e-mail', 'export-date', 'redirect', 'page-revision', 'user-agent', 'username', 'wiki']
     datefields = ['date', 'export-date']
 
-    def __init__(self, headers={}, body=''):
+    def __init__(self, headers={}, body='', normalize=True):
         self.headers = headers
        self.body = body
 
+        if normalize:
+            self.normalize_headers()
+
+    def normalize_headers(self):
+        self.headers.setdefault('wiki', 'http://en.wikipedia.org/wiki/')
+        if self.headers['wiki'] in interwiki.mapping.keys():
+            self.headers['wiki'] = interwiki.mapping[self.headers['wiki']]
+
     def to_comment(self):
-        assembly = [('date', 'On %s,'),
-                    ('username', ' [[User:%s]]'), 
-                    (' an anonymous user'),
-                    ('e-mail', ' (<a href="mailto:%s">e-mail</a>)'),
-                    (' made a comment',),
+        assembly = [('date', ' on %s,'),
+                    ('username', ' [[User:%s]]', ' an anonymous user'),
+                    ('e-mail', ' (e-mail: %s)'),
+                    (' made the following comment',),
+                    ('page-revision', 
+        lambda x: ' on [' + make_link(self.headers['wiki'], self.headers['page'], self.headers['page-revision']) + ' this revision]'),
                     ('user-agent', ' (using %s)')
                     ]
 
-        comment = ""
+        comment = ""
         for stage in assembly:
             if len(stage) == 1:
                 comment += stage[0]
             elif self.headers.has_key(stage[0]):
-                comment += stage[1] % (self.headers[stage[0]])
+                if isinstance(stage[1], str):
+                    comment += stage[1] % (self.headers[stage[0]])
+                else:
+                    comment += stage[1](stage[0])
             elif len(stage) == 3:
                 comment += stage[2]
 
-        return comment + ":\n\n" + self.body
+        comment = comment.strip()
+        return ":''" + comment[0].capitalize() + comment[1:] + \
+               " using an offline wikireader:''\n\n" + self.body.strip() + \
+               "\n\n—via [[User:BackWashBot|BackWashBot]] ~~~~~"
 
     @classmethod
     def from_string(cls, s):
@@ -122,52 +148,21 @@ class WikiEdit:
         body = s[body_index+2:]
         return cls(headers, body)
 
-
-    
-    # @classmethod
-    # defomrom_string(cls, s):
-    #     body_index = s.index('\n\n')
-    # ders = dict([(X[:X.index(':')], X[X.index(':')+1:].strip()) for X in s[:body_index].split('\n')])
-    #     kvs = [re.split(': *', key_value, 1) for key_value in s[:body_index].splitlines()]
-    #     headers = dict([(key.lower(), value) for (key, value) in kvs])
-    #     print headers
-    #     body = s[body_index+2:]
-    #     return cls(headers, body)
-
-
 def parse_edits(lines):
     edits = []
-    #cur = WikiEdit()
-    #message_body = False
     acc = ""
     for line in lines:
-        if line.startswith('Page:'):
-            if '\n\n' in acc:
-                we = WikiEdit.from_string(acc)
-                edits.append(we)
-                print we, we.headers, we.body
-                #sys.exit(0)
-                acc = ""
+        if '\n\n' in acc and line.startswith('Page:'):
+            we = WikiEdit.from_string(acc)
+            edits.append(we)
+            #print we, we.headers, we.body
+            acc = ""
         acc += line
     
-        #     cur = WikiEdit()
-        #     edits.append(cur)
-        #     message_body = False
-
-        # if line == '\n':
-        #     message_body = True
-
-        # elif message_body:
-        #     cur.body += line
-
-        # else:
-        #     key_end = line.index(':')
-        #     cur.headers[line[:key_end]] = line[key_end+1:].strip()
-
     if acc != '':
         we = WikiEdit.from_string(acc)
         edits.append(we)
-        print (we, we.headers, we.body)
+        #print (we, we.headers, we.body)
 
     return edits
 
@@ -176,19 +171,7 @@ if __name__ =='__main__':
     edits = parse_edits(sys.stdin)
 
     for edit in edits:
-        # if there is an export date but no revision, lets go to wiki an
-        # find out what the revision id is
-        if edit.headers.has_key("export-date") and \
-                not edit.headers.has_key("page-revision"):
-            wiki = Wiki(edit.headers['wiki'])
-            revid = wiki.get_revid_for_date(edit.headers["page"], edit.headers["export-date"])
-        else:
-            revid = edit.headers['page-revision']
-
-        print revid
-        # rvdir=newer&rvprop=timestamp|ids
-
-        edit_msg = edit.to_comment()
-        print edit_msg
-
-# iso8601.parse_date("2007-06-20T12:34:40+03:00")
+        wiki = Wiki(edit.headers['wiki'])
+        wiki.append_to_talk_page(edit.headers['page'], edit.to_comment())
+
+                     

Benjamin Mako Hill || Want to submit a patch?