| @@ -27,6 +27,7 @@ from time import sleep, time | |||||
| import oursql | import oursql | ||||
| from earwigbot import exceptions | |||||
| from earwigbot.tasks import Task | from earwigbot.tasks import Task | ||||
| class DRNClerkBot(Task): | class DRNClerkBot(Task): | ||||
| @@ -50,7 +51,8 @@ class DRNClerkBot(Task): | |||||
| cfg = self.config.tasks.get(self.name, {}) | cfg = self.config.tasks.get(self.name, {}) | ||||
| # Set some wiki-related attributes: | # Set some wiki-related attributes: | ||||
| self.title = cfg.get("page", "Wikipedia:Dispute resolution noticeboard") | |||||
| self.title = cfg.get("title", "Wikipedia:Dispute resolution noticeboard") | |||||
| self.talk = cfg.get("talk", "Wikipedia talk:Dispute resolution noticeboard") | |||||
| default_summary = "Updating $3 cases for the [[WP:DRN|dispute resolution noticeboard]]." | default_summary = "Updating $3 cases for the [[WP:DRN|dispute resolution noticeboard]]." | ||||
| self.summary = self.make_summary(cfg.get("summary", default_summary)) | self.summary = self.make_summary(cfg.get("summary", default_summary)) | ||||
| @@ -79,23 +81,26 @@ class DRNClerkBot(Task): | |||||
| self.logger.info(u"Starting update to [[{0}]]".format(self.title)) | self.logger.info(u"Starting update to [[{0}]]".format(self.title)) | ||||
| start = time() | start = time() | ||||
| conn = oursql.connect(**self.conn_data) | conn = oursql.connect(**self.conn_data) | ||||
| cases = read_database(conn) | |||||
| page = self.bot.wiki.get_site().get_page(self.title) | |||||
| cases = self.read_database(conn) | |||||
| site = self.bot.wiki.get_site() | |||||
| page = site.get_page(self.title) | |||||
| text = page.get() | text = page.get() | ||||
| read_page(conn, cases, text) | |||||
| # Work! | |||||
| # Send messages! | |||||
| self.read_page(conn, cases, text) | |||||
| noticies = self.clerk(cases) | |||||
| self.save(page, cases) | self.save(page, cases) | ||||
| self.send_notices(site, notices) | |||||
| def save(self, page, cases): | def save(self, page, cases): | ||||
| """Save any changes to the noticeboard.""" | |||||
| newtext = text = page.get() | newtext = text = page.get() | ||||
| counter = 0 | counter = 0 | ||||
| for case in cases: | for case in cases: | ||||
| if case.old != case.body: | if case.old != case.body: | ||||
| newtext = newtext.replace(case.old, case.body) | newtext = newtext.replace(case.old, case.body) | ||||
| counter += 1 | counter += 1 | ||||
| if newtext == text: | |||||
| self.logger.info(u"Nothing to edit on [[{0}]]".format(page.title)) | |||||
| return | |||||
| worktime = time() - start | worktime = time() - start | ||||
| if worktime < 60: | if worktime < 60: | ||||
| @@ -106,9 +111,36 @@ class DRNClerkBot(Task): | |||||
| self.logger.warn(log) | self.logger.warn(log) | ||||
| return self.run() | return self.run() | ||||
| summary = self.summary.replace("$3", str(counter)) | summary = self.summary.replace("$3", str(counter)) | ||||
| page.edit(text, summary, minor=False, bot=True) | |||||
| page.edit(text, summary, minor=True, bot=True) | |||||
| self.logger.info(u"Saved page [[{0}]]".format(page.title)) | self.logger.info(u"Saved page [[{0}]]".format(page.title)) | ||||
| def send_notices(self, site, notices): | |||||
| """Send out any templated notices to users or pages.""" | |||||
| if not notices: | |||||
| self.logger.info("No notices to send; finishing") | |||||
| return | |||||
| for notice in notices: | |||||
| target, template = notice.target, notice.template | |||||
| log = u"Notifying [[{0}]] with {1}".format(target, template) | |||||
| self.logger.info(log) | |||||
| page = site.get_page(target) | |||||
| try: | |||||
| text = page.get() | |||||
| except exceptions.PageNotFoundError: | |||||
| text = "" | |||||
| if notice.too_late in text: | |||||
| log = u"Skipping [[{0}]]; was already notified".format(target) | |||||
| self.logger.info(log) | |||||
| text += ("\n" if text else "") + template | |||||
| try: | |||||
| page.edit(text, summary, minor=False, bot=True) | |||||
| except exceptions.EditError as error: | |||||
| name, msg = type(error).name, error.message | |||||
| log = u"Couldn't leave notice on {0} because of {1}: {2}" | |||||
| self.logger.error(log.format(page.title, name, msg)) | |||||
| self.logger.info("Done sending notices") | |||||
| def read_database(self, conn): | def read_database(self, conn): | ||||
| """Return a list of _Cases from the database.""" | """Return a list of _Cases from the database.""" | ||||
| cases = [] | cases = [] | ||||
| @@ -176,9 +208,14 @@ class DRNClerkBot(Task): | |||||
| return option | return option | ||||
| return self.STATUS_UNKNOWN | return self.STATUS_UNKNOWN | ||||
| def clerk(self): | |||||
| """Actually go through cases and modify those to be updated.""" | |||||
| notices = [] | |||||
| return notices | |||||
| class _Case(object): | class _Case(object): | ||||
| """A simple object representing a dispute resolution case.""" | |||||
| """A object representing a dispute resolution case.""" | |||||
| def __init__(self, id_, title, status): | def __init__(self, id_, title, status): | ||||
| self.id = id_ | self.id = id_ | ||||
| self.title = title | self.title = title | ||||
| @@ -186,3 +223,11 @@ class _Case(object): | |||||
| self.body = None | self.body = None | ||||
| self.old = None | self.old = None | ||||
| class _Notice(object): | |||||
| """An object representing a notice to be sent to a user or a page.""" | |||||
| def __init__(self, target, template, too_late): | |||||
| self.target = target | |||||
| self.template = template | |||||
| self.too_late = too_late | |||||