X-Git-Url: https://projects.mako.cc/source/backwash/blobdiff_plain/dfc0b520a1cbd590a3bf2941c66e3b7556a6cb2d..HEAD:/backwash.py diff --git a/backwash.py b/backwash.py index c712028..7373e22 100644 --- a/backwash.py +++ b/backwash.py @@ -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', ' (e-mail)'), - (' 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()) + +