All pastes #2128316 Raw Edit

Something

public text v1 · immutable
#2128316 ·published 2012-03-15 05:51 UTC
rendered paste body
#!/usr/bin/python
# -*- coding: utf-8 -*-

__version__ = '$Id: ISS-Dockingbays.py$'

import wikipedia, sys
import pagegenerators
import re, os, codecs, catlib, time

# SETTING
update_template = '{{update PALZ9000}}'
data_page_name = 'Template:ISS-Dockingbays/Data'
transl_data_page_name = 'Template:ISS-Dockingbays/Translation data'
title_in_lang = {
'ru': u'User:ZxxZxxZ/sandbox',
'de': u'User:ZxxZxxZ/sandbox',
'ja': u'User:ZxxZxxZ/sandbox'
}
updating_comment_in_lang = {
'en': 'Bot: updating table',
'ru': u'Bot: updating table',
'de': u'Bot: updating table',
'ja': u'Bot: updating table'
}
tables_page_title = 'Template:ISS-Dockingbays/Tables' # the page in en.wikipedia which cantains all updated tables in all langs

class issBot:

  def run(self):
    while True:
      page = wikipedia.Page(wikipedia.getSite('en'), data_page_name)
      text = self.load(page)
      if not update_template in text:
        time.sleep(3600*2) # sleep for two hours
        continue
      try:
        data = re.search(r'\<pre\>[\s\n\r]*(.+?)[\s\n\r]*\<\/pre\>', text, re.S).group(1)
      except AttributeError:
        # Someone has removed our data, I must kill him
        target_user = page.getLatestEditors(limit=1)
        target_user_talk_page = wikipedia.Page(wikipedia.getSite('en'), 'User talk:'+target_user)
        target_user_text = self.load(target_user_talk_page)
        target_user_text += '''
== BOT: ALERT ==
Don't do that again. --~~~~
'''
        if not self.save(target_user_text, target_user_talk_page, comment='Alert'):
          wikipedia.output('ERROR: Killing failed; page not saved.')
        self.error_report(error_text=u'The data has been {{diff|%s|%s|removed}} by %s.' % (page.title(), page.latestRevision(), target_user)) ###
        wikipedia.stopme()
      data = re.sub(r'[ \t]*\n[\s\n\r]*', r'\n', data)
      data = re.sub(r'[ \t]+', ' ', data)
      rows = re.split(r'\n', data) ### '\n'.split(data)
      raw_data = list()
      for row in rows:
        try:
          ref = re.search(r'<ref>(.*?)<\/ref>', row).group(1)
          row = row.replace(ref, '')
        except AttributeError:
          ref = ''
        row = re.sub(u'[\s\t ]*<ref>.*$', '', row)
        raw_data.append(list())
        raw_data[-1] = re.split(' ', row)
        if raw_data[-1] < 5: # Less that 5 columns in this row
          self.error_report(error_text='Data in line #%d seems corrupt, take a look. There was only %d. I will skip that line.' % (len(raw_data), len(raw_data[-1])))
          raw_data[-1] = []
      transl_data_page = wikipedia.Page(wikipedia.getSite('en'), transl_data_page_name)
      transl_data = self.load(transl_data_page)
      for lang in title_in_lang.keys():
        translated_data = list()
        wikipedia.output('INFO: working on %s.wikipedia' % lang)
        for i in range(0, len(raw_data)):
          translated_data.append(list())
          for j in range(0, len(raw_data[i])):
            wikipedia.output('INFO: raw_data[%s][%s]: %s' % (i, j, raw_data[i][j])) ### v
            try:
              tr_section = re.search(ur'\<%s\>(.*?)\<\/%s\>' % (raw_data[i][j], raw_data[i][j]), transl_data, re.S).group(1)
            except AttributeError:
              if j == 0: # SPACECRAFT
                try:
                  default_craft_name = re.search('(.+?)_', raw_data[i][j]).group(1)
                except AttributeError:
                  wikipedia.output(u'ERROR: Cannot get default value for "%s".' % raw_data[i][j])
                else:
                  try:
                    tr_section = re.search(ur'\<%s\>(.*?)\<\/%s\>' % (default_craft_name, default_craft_name), transl_data, re.S).group(1)
                  except AttributeError:
                    wikipedia.output(u'ERROR: Cannot fetch translation data for neither "%s" nor its default value "%s".' % (raw_data[i][j], default_craft_name))
              else:
                wikipedia.output(u'INFO: Cannot fetch translation data for "%s".' % raw_data[i][j])
                ##pageIW = wikipedia.Page(wikipedia.getSite('en'), data_page_name)
                translated_word = raw_data[i][j].replace('_', ' ') # use untranslated word
            else:
              try:
                translated_word = re.search(ur'\[\[ *:%s: *(.*?)\]\]' % lang, tr_section).group(1)
              except:
                wikipedia.output(u'ERROR: Cannot fetch translation data for "%s" in language "%s".' % (raw_data[i][j], lang))
                translated_word = raw_data[i][j].replace('_', ' ') # use untranslated word
            translated_word = '[[%s]]' % translated_word
            translated_data[i].append(translated_word)
        wikipedia.output(u'Translating done. Trying to update the table in [[:%s:%s]]...' % (lang, title_in_lang[lang]))
        table = '{|'
        table2 = '{|'
        for i in range(0, len(translated_data)):
          table += '\n|-'
          table2 += '\n|-'
          for j in range(0, len(translated_data[i])):
            table += u'\n| %s' % translated_data[i][j]
            try:
              translated_data_linktitle = re.search(ur'(?:\[\[(?:.*?\||)|)(.*?)(?=\]\]|)', translated_data[i][j]).group(1)
            except AttributeError:
              wikipedia.output(u'ERROR: Cannot fetch link title from "%s".' % translated_data[i][j])
              translated_data_linktitle = translated_data[i][j]
            table2 += u'\n| [[%s#%s|%s]]' % (tables_page_title, raw_data[i][j], translated_data_linktitle)
        table += '\n|}'
        table2 += '\n|}'
        page_in_lang = wikipedia.Page(wikipedia.getSite(lang), title_in_lang[lang])
        text_in_lang = self.load(page_in_lang)
        text_in_lang = re.sub(ur'.*?(?=\<noinclude\>)', table, text_in_lang, re.S)
        if not self.save(text_in_lang, page_in_lang, comment=updating_comment_in_lang[lang]):
          wikipedia.output('ERROR: Updating failed; page not saved.')
          self.error_report(error_text='ERROR: Can not update %s.' % page_in_lang.title(asLink=True))
        else:
          tables_page = wikipedia.Page(wikipedia.getSite('en'), tables_page_title)
          tables_page_text = self.load(tables_page)
          tables_page_text = re.sub(ur'\n\=+ *%s *\=+\n(.*?)(?=\n\=+.*?\=+\n|$)' % lang, ur'\n== %s ==\n%s' % (lang, table2), tables_page_text, re.S)
          if not self.save(tables_page_text, tables_page, comment=updating_comment_in_lang['en']):
            self.error_report(error_text='ERROR: Can not update %s.' % tables_page.title(asLink=True))
      
  def load(self, page):
    try:
      text = page.get()
    except wikipedia.NoPage:
      wikipedia.output(u'ERROR: Page %s does not exist.' % page.title(asLink=True))
      wikipedia.stopme()
    except wikipedia.IsRedirectPage:
      wikipedia.output(u'ERROR: Page %s is a redirect.' % page.title(asLink=True))
    else:
      return text
    return None

  def save(self, text, page, comment=''):
    try:
      page.put(text, comment=comment, minorEdit=True, botflag=True)
    except wikipedia.LockedPage:
      wikipedia.output(u'ERROR: Page %s is locked.' % page.title(asLink=True))
    except wikipedia.EditConflict:
      wikipedia.output(u'ERROR: Skipping %s because of edit conflict' % page.title())
    except wikipedia.SpamfilterError, error:
      wikipedia.output(u'ERROR: Cannot change %s because of spam blacklist entry %s' % (page.title(), error.url))
    else:
      return True
    return False

  def error_report(self, error_title='Bot: error', error_text='something went wrong', comment='Bot: reporting error', user='ZxxZxxZ', site='en', user2='Penyulap', site2='en'):
    wikipedia.output(u'Reporting error, title: %s, text: %s' % (error_title, error_text))
    talk_page = wikipedia.Page(wikipedia.getSite(site), user)
    text = self.load(talk_page)
    text += u'''
== %s ==
Hi %s! %s. --~~~~
''' % (error_title, user, error_text)
    if not self.save(text, talk_page, comment=comment):
      talk_page2 = wikipedia.Page(wikipedia.getSite(site2), user2)
      text2 = self.load(talk_page2)
      text2 += u'''
== %s ==
Hi %s! %s --~~~~
''' % (error_title, user2, error_text)
      if not self.save(text2, talk_page2, comment=comment):
        wikipedia.output('ERROR: Error reporting failed; pages not saved.')
        wikipedia.stopme()

def main():
  bot = issBot()
  bot.run()

if __name__ == '__main__':
  try:
    main()
  finally:
    wikipedia.stopme()