diff --git a/plugins/Geekquote.py b/plugins/Geekquote.py new file mode 100644 index 000000000..6313c478b --- /dev/null +++ b/plugins/Geekquote.py @@ -0,0 +1,137 @@ +#!/usr/bin/env python + +### +# Copyright (c) 2004, Kevin Murphy +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions, and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions, and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of the author of this software nor the name of +# contributors to this software may be used to endorse or promote products +# derived from this software without specific prior written consent. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +### + +""" +Provides commands and snarfers for the various different Geekquote-based sites +out there +""" + +import supybot + +__author__ = supybot.authors.skorobeus +__contributors__ = { + supybot.authors.skorobeus: ['geekquote snarfer', 'qdb'], + } + +import supybot.plugins as plugins + +import re +import sets +import getopt +import socket +import urllib +import xml.dom.minidom +from itertools import imap, ifilter + +import supybot.conf as conf +import supybot.utils as utils +import supybot.webutils as webutils +import supybot.privmsgs as privmsgs +import supybot.registry as registry +import supybot.callbacks as callbacks + +def configure(advanced): + from supybot.questions import output, expect, anything, something, yn + conf.registerPlugin('Geekquote', True) + output("""The Http plugin has the ability to watch for geekquote + (bash.org / qdb.us) URLs and respond to them as though the user + had asked for the geekquote by ID""") + if yn('Do you want the Geekquote snarfer enabled by default?'): + conf.supybot.plugins.Geekquote.geekSnarfer.setValue(True) + +conf.registerPlugin('Geekquote') +conf.registerChannelValue(conf.supybot.plugins.Geekquote, 'geekSnarfer', + registry.Boolean(False, """Determines whether the bot will automatically + 'snarf' Geekquote auction URLs and print information about them.""")) + +class Geekquote(callbacks.PrivmsgCommandAndRegexp): + threaded = True + regexps = ['geekSnarfer'] + + def callCommand(self, method, irc, msg, *L, **kwargs): + try: + super(Geekquote, self).callCommand(method, irc, msg, *L, **kwargs) + except webutils.WebError, e: + irc.error(str(e)) + + _gkREDict = {'bash.org':re.compile('

(?P.*?)

', re.M | re.DOTALL), + 'qdb.us':re.compile('.*

(?P.*?)

', re.M | re.DOTALL)} + def _gkBackend(self, irc, msg, site, id): + if id: + try: + id = int(id) + except ValueError: + irc.error('Invalid id: %s' % id, Raise=True) + #id = 'quote=%s' % id + else: + id = 'random' + html = webutils.getUrl('http://%s/?%s' % (site, id)) + m = self._gkREDict[site].search(html) + if m is None: + irc.error('No quote found on %s. %s' % (site, id)) + return + quote = utils.htmlToText(m.group(1)) + quote = ' // '.join(quote.splitlines()) + irc.reply(quote) + + def geekSnarfer(self, irc, msg, match): + r"http://(?:www\.)?(?Pbash\.org|qdb\.us)/\?(?P\d+)" + if not self.registryValue('geekSnarfer', msg.args[0]): + return + id = match.groupdict()['id'] + site = match.groupdict()['site'] + self.log.info('Snarfing geekquote %s from %s.' % (id, site)) + self._gkBackend(irc, msg, site, id) + geekSnarfer = privmsgs.urlSnarfer(geekSnarfer) + + def geekquote(self, irc, msg, args): + """[] + + Returns a random geek quote from bash.org; the optional argument + id specifies which quote to retrieve. + """ + id = privmsgs.getArgs(args, required=0, optional=1) + site = 'bash.org' + self._gkBackend(irc, msg, site, id) + + def qdb(self, irc, msg, args): + """[] + + Returns a random geek quote from qdb.us; the optional argument + id specifies which quote to retrieve. + """ + id = privmsgs.getArgs(args, required=0, optional=1) + site = 'qdb.us' + self._gkBackend(irc, msg, site, id) + +Class = Geekquote + +# vim:set shiftwidth=4 tabstop=8 expandtab textwidth=78: diff --git a/plugins/Http.py b/plugins/Http.py index 6e9740fc5..f5c9d08e2 100644 --- a/plugins/Http.py +++ b/plugins/Http.py @@ -39,7 +39,6 @@ __revision__ = "$Id$" __contributors__ = { supybot.authors.jemfinch: ['bender', 'cyborg', 'doctype', 'freshmeat', 'headers', 'netcraft', 'size', 'title'], - supybot.authors.skorobeus: ['geekquote snarfer'], supybot.authors.jamessan: ['pgpkey', 'kernel', 'filext', 'zipinfo', 'acronym'], } @@ -61,26 +60,13 @@ import supybot.privmsgs as privmsgs import supybot.registry as registry import supybot.callbacks as callbacks -def configure(advanced): - from supybot.questions import output, expect, anything, something, yn - conf.registerPlugin('Http', True) - output("""The Http plugin has the ability to watch for geekquote - (bash.org) URLs and respond to them as though the user had - asked for the geekquote by ID""") - if yn('Do you want the Geekquote snarfer enabled by default?'): - conf.supybot.plugins.Http.geekSnarfer.setValue(True) - conf.registerPlugin('Http') -conf.registerChannelValue(conf.supybot.plugins.Http, 'geekSnarfer', - registry.Boolean(False, """Determines whether the bot will automatically - 'snarf' Geekquote auction URLs and print information about them.""")) class FreshmeatException(Exception): pass -class Http(callbacks.PrivmsgCommandAndRegexp): +class Http(callbacks.PrivmsgCommand): threaded = True - regexps = ['geekSnarfer'] _titleRe = re.compile(r'(.*?)', re.I | re.S) @@ -220,40 +206,6 @@ class Http(callbacks.PrivmsgCommandAndRegexp): m = 'I couldn\'t find a listing for %s' % symbol irc.error(m) - _mlgeekquotere = re.compile('

(.*?)

', re.M | re.DOTALL) - def geekquote(self, irc, msg, args): - """[] - - Returns a random geek quote from bash.org; the optional argument - id specifies which quote to retrieve. - """ - id = privmsgs.getArgs(args, required=0, optional=1) - if id: - try: - id = int(id) - except ValueError: - irc.error('Invalid id: %s' % id, Raise=True) - id = 'quote=%s' % id - else: - id = 'random' - html = webutils.getUrl('http://bash.org/?%s' % id) - m = self._mlgeekquotere.search(html) - if m is None: - irc.error('No quote found on bash.org.') - return - quote = utils.htmlToText(m.group(1)) - quote = ' // '.join(quote.splitlines()) - irc.reply(quote) - - def geekSnarfer(self, irc, msg, match): - r"http://(?:www\.)?bash\.org/\?(\d+)" - if not self.registryValue('geekSnarfer', msg.args[0]): - return - id = match.group(1) - self.log.info('Snarfing geekquote %s.', id) - self.geekquote(irc, msg, [id]) - geekSnarfer = privmsgs.urlSnarfer(geekSnarfer) - _cyborgRe = re.compile(r'

(.*?)

', re.I) def cyborg(self, irc, msg, args): """[]