Implement #success command in statusbot

Add simple unprivileged "#success" command that adds small
success snippets to a celebration wiki page.

NB: this adds a couple of configuration options, but fails
gracefully if they are not present.

Change-Id: Ib113fa2b55e47759003a84850c0c85a2f883814e
This commit is contained in:
Thierry Carrez 2015-09-07 17:36:27 +02:00
parent 5a27f181ac
commit d58d5456c7
1 changed files with 52 additions and 3 deletions

View File

@ -30,6 +30,10 @@ username=StatusBot
password=password password=password
url=https://wiki.example.com/w/api.php url=https://wiki.example.com/w/api.php
pageid=1781 pageid=1781
successpageid=2434
[irclogs]
url=http://eavesdrop.example.com/irclogs/%(chan)s/%(chan)s.%(date)s.log.html
""" """
import argparse import argparse
@ -45,6 +49,7 @@ import simplemediawiki
import datetime import datetime
import re import re
import ssl import ssl
import urllib
try: try:
import daemon.pidlockfile import daemon.pidlockfile
@ -100,6 +105,36 @@ class WikiPage(object):
token=token)) token=token))
class SuccessPage(WikiPage):
def __init__(self, config):
super(SuccessPage, self).__init__(config)
if config.has_option('wiki', 'successpageid'):
self.pageid = config.get('wiki', 'successpageid')
else:
self.pageid = None
if config.has_option('irclogs', 'url'):
self.irclogs_url = config.get('irclogs', 'url')
else:
self.irclogs_url = None
def log(self, channel, nick, msg):
if self.pageid:
self.login()
ts = self.timestamp()
if self.irclogs_url:
url = self.irclogs_url % {
'chan': urllib.quote(channel),
'date': ts[0:10]}
onchan = "[%s %s]" % (url, channel)
else:
onchan = channel
data = self.load()
current = data.split("\n")
newtext = "%s\n|-\n| %s || %s (on %s) || %s\n%s" % (
current[0], ts, nick, onchan, msg, '\n'.join(current[1:]))
self.save(newtext)
class UpdateInterface(object): class UpdateInterface(object):
def alert(self, msg=None): def alert(self, msg=None):
pass pass
@ -202,7 +237,7 @@ class AlertFile(UpdateInterface):
class StatusBot(irc.bot.SingleServerIRCBot): class StatusBot(irc.bot.SingleServerIRCBot):
log = logging.getLogger("statusbot.bot") log = logging.getLogger("statusbot.bot")
def __init__(self, channels, nicks, publishers, def __init__(self, channels, nicks, publishers, successlog,
nickname, password, server, port=6667): nickname, password, server, port=6667):
if port == 6697: if port == 6697:
factory = irc.connection.Factory(wrapper=ssl.wrap_socket) factory = irc.connection.Factory(wrapper=ssl.wrap_socket)
@ -222,6 +257,7 @@ class StatusBot(irc.bot.SingleServerIRCBot):
self.topics = {} self.topics = {}
self.current_topic = None self.current_topic = None
self.publishers = publishers self.publishers = publishers
self.successlog = successlog
def on_nicknameinuse(self, c, e): def on_nicknameinuse(self, c, e):
self.log.debug("Nickname in use, releasing") self.log.debug("Nickname in use, releasing")
@ -258,6 +294,11 @@ class StatusBot(irc.bot.SingleServerIRCBot):
nick = e.source.split('!')[0] nick = e.source.split('!')[0]
auth = e.arguments[0][0] auth = e.arguments[0][0]
msg = e.arguments[0][1:] msg = e.arguments[0][1:]
# Unprivileged commands
if msg.startswith('#success'):
self.handle_success_command(e.target, nick, msg)
return
# Privileged commands
if not msg.startswith('#status'): if not msg.startswith('#status'):
return return
if auth != '+': if auth != '+':
@ -272,6 +313,13 @@ class StatusBot(irc.bot.SingleServerIRCBot):
except: except:
self.log.exception("Exception handling command %s" % msg) self.log.exception("Exception handling command %s" % msg)
def handle_success_command(self, channel, nick, msg):
parts = msg.split()
text = ' '.join(parts[1:])
self.log.info("Processing success from %s: %s" % (nick, text))
self.successlog.log(channel, nick, text)
self.send(channel, "%s: Added success to Success page" % (nick,))
def handle_status_command(self, channel, nick, msg): def handle_status_command(self, channel, nick, msg):
parts = msg.split() parts = msg.split()
command = parts[1].lower() command = parts[1].lower()
@ -352,7 +400,7 @@ class StatusBot(irc.bot.SingleServerIRCBot):
def _main(configpath): def _main(configpath):
config = ConfigParser.ConfigParser() config = ConfigParser.RawConfigParser()
config.read(configpath) config.read(configpath)
setup_logging(config) setup_logging(config)
@ -362,8 +410,9 @@ def _main(configpath):
config.get('ircbot', 'nicks').split(',')] config.get('ircbot', 'nicks').split(',')]
publishers = [StatusPage(config), publishers = [StatusPage(config),
AlertFile(config)] AlertFile(config)]
successlog = SuccessPage(config)
bot = StatusBot(channels, nicks, publishers, bot = StatusBot(channels, nicks, publishers, successlog,
config.get('ircbot', 'nick'), config.get('ircbot', 'nick'),
config.get('ircbot', 'pass'), config.get('ircbot', 'pass'),
config.get('ircbot', 'server'), config.get('ircbot', 'server'),