From a6f7dc99b734218461c5e728acadc1cc651e8ed1 Mon Sep 17 00:00:00 2001 From: Jeremy Fincher Date: Wed, 29 Sep 2004 04:40:25 +0000 Subject: [PATCH] Moved tinyurl stuff out to the ShrinkUrl plugin. --- plugins/ShrinkUrl.py | 147 +++++++++++++++++++++++++++++++++++++++++ plugins/URL.py | 84 +---------------------- test/test_ShrinkUrl.py | 82 +++++++++++++++++++++++ test/test_URL.py | 41 ------------ 4 files changed, 230 insertions(+), 124 deletions(-) create mode 100644 plugins/ShrinkUrl.py create mode 100644 test/test_ShrinkUrl.py diff --git a/plugins/ShrinkUrl.py b/plugins/ShrinkUrl.py new file mode 100644 index 000000000..90f1d3a2e --- /dev/null +++ b/plugins/ShrinkUrl.py @@ -0,0 +1,147 @@ +### +# Copyright (c) 2002-2004, Jeremiah Fincher +# 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. +### + +""" +Keeps track of URLs posted to a channel, along with relevant context. Allows +searching for URLs and returning random URLs. Also provides statistics on the +URLs in the database. +""" + +__revision__ = "$Id$" + +import supybot.plugins as plugins + +import os +import re +import sets +import time +import getopt +import urlparse +import itertools + +import supybot.dbi as dbi +import supybot.conf as conf +import supybot.utils as utils +import supybot.ircmsgs as ircmsgs +import supybot.webutils as webutils +import supybot.ircutils as ircutils +import supybot.commands as commands +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('ShrinkUrl', True) + if yn("""This plugin offers a snarfer that will go to tinyurl.com and get + a shorter version of long URLs that are sent to the channel. + Would you like this snarfer to be enabled?""", default=False): + conf.supybot.plugins.ShrinkUrl.tinyurlSnarfer.setValue(True) + +conf.registerPlugin('ShrinkUrl') +conf.registerChannelValue(conf.supybot.plugins.ShrinkUrl, 'tinyurlSnarfer', + registry.Boolean(False, """Determines whether the + tinyurl snarfer is enabled. This snarfer will watch for URLs in the + channel, and if they're sufficiently long (as determined by + supybot.plugins.ShrinkUrl.tinyurlSnarfer.minimumLength) it will post a smaller + from tinyurl.com.""")) +conf.registerChannelValue(conf.supybot.plugins.ShrinkUrl.tinyurlSnarfer, + 'minimumLength', + registry.PositiveInteger(48, """The minimum length a URL must be before the + tinyurl snarfer will snarf it.""")) +conf.registerChannelValue(conf.supybot.plugins.ShrinkUrl, 'nonSnarfingRegexp', + registry.Regexp(None, """Determines what URLs are to be snarfed and stored + in the database in the channel; URLs matching the regexp given will not be + snarfed. Give the empty string if you have no URLs that you'd like to + exclude from being snarfed.""")) + +class ShrinkUrl(callbacks.PrivmsgCommandAndRegexp): + regexps = ['tinyurlSnarfer'] + def callCommand(self, name, irc, msg, *L, **kwargs): + try: + super(ShrinkUrl, self).callCommand(name, irc, msg, *L, **kwargs) + except webutils.WebError, e: + irc = callbacks.SimpleProxy(irc, msg) + irc.error(str(e)) + + def tinyurlSnarfer(self, irc, msg, match): + r"https?://[^\])>\s]{13,}" + channel = msg.args[0] + if not ircutils.isChannel(channel): + return + if self.registryValue('tinyurlSnarfer', channel): + url = match.group(0) + r = self.registryValue('nonSnarfingRegexp', channel) + if r and r.search(url) is not None: + self.log.debug('Matched nonSnarfingRegexp: %r', url) + return + minlen = self.registryValue('tinyurlSnarfer.minimumLength',channel) + if len(url) >= minlen: + tinyurl = self._getTinyUrl(url) + if tinyurl is None: + self.log.info('Couldn\'t get tinyurl for %r', url) + return + domain = webutils.getDomain(url) + s = '%s (at %s)' % (ircutils.bold(tinyurl), domain) + irc.reply(s, prefixName=False) + tinyurlSnarfer = privmsgs.urlSnarfer(tinyurlSnarfer) + + _tinyRe = re.compile(r'
(http://tinyurl\.com/\w+)') + def _getTinyUrl(self, url): + s = webutils.getUrl('http://tinyurl.com/create.php?url=%s' % url) + m = self._tinyRe.search(s) + if m is None: + tinyurl = None + else: + tinyurl = m.group(1) + return tinyurl + + def tiny(self, irc, msg, args): + """ + + Returns a TinyURL.com version of + """ + url = privmsgs.getArgs(args) + if len(url) < 20: + irc.error('Stop being a lazy-biotch and type the URL yourself.') + return + tinyurl = self._getTinyUrl(url) + domain = webutils.getDomain(url) + s = '%s (at %s)' % (ircutils.bold(tinyurl), domain) + if tinyurl is not None: + irc.reply(s) + else: + s = 'Could not parse the TinyURL.com results page.' + irc.errorPossibleBug(s) + tiny = commands.wrap(tiny, decorators=['thread']) + + +Class = ShrinkUrl + +# vim:set shiftwidth=4 tabstop=8 expandtab textwidth=78: diff --git a/plugins/URL.py b/plugins/URL.py index 68d48f736..6d85bfa13 100644 --- a/plugins/URL.py +++ b/plugins/URL.py @@ -58,26 +58,12 @@ import supybot.callbacks as callbacks def configure(advanced): from supybot.questions import output, expect, anything, something, yn conf.registerPlugin('URL', True) - if yn("""This plugin offers a snarfer that will go to tinyurl.com and get - a shorter version of long URLs that are sent to the channel. - Would you like this snarfer to be enabled?""", default=False): - conf.supybot.plugins.URL.tinyurlSnarfer.setValue(True) if yn("""This plugin also offers a snarfer that will try to fetch the title of URLs that it sees in the channel. Would like you this snarfer to be enabled?""", default=False): conf.supybot.plugins.URL.titleSnarfer.setValue(True) conf.registerPlugin('URL') -conf.registerChannelValue(conf.supybot.plugins.URL, 'tinyurlSnarfer', - registry.Boolean(False, """Determines whether the - tinyurl snarfer is enabled. This snarfer will watch for URLs in the - channel, and if they're sufficiently long (as determined by - supybot.plugins.URL.tinyurlSnarfer.minimumLength) it will post a smaller - from tinyurl.com.""")) -conf.registerChannelValue(conf.supybot.plugins.URL.tinyurlSnarfer, - 'minimumLength', - registry.PositiveInteger(48, """The minimum length a URL must be before the - tinyurl snarfer will snarf it.""")) conf.registerChannelValue(conf.supybot.plugins.URL, 'titleSnarfer', registry.Boolean(False, """Determines whether the bot will output the HTML title of URLs it sees in the channel.""")) @@ -111,7 +97,7 @@ URLDB = plugins.DB('URL', {'flat': DbiUrlDB}) class URL(callbacks.PrivmsgCommandAndRegexp): priority = 100 # lower than 99, the normal priority. - regexps = ['titleSnarfer', 'tinyurlSnarfer'] + regexps = ['titleSnarfer'] _titleRe = re.compile('(.*?)', re.I | re.S) def __init__(self): self.__parent = super(URL, self) @@ -134,28 +120,6 @@ class URL(callbacks.PrivmsgCommandAndRegexp): self.db.add(channel, url, msg) self.__parent.doPrivmsg(irc, msg) - def tinyurlSnarfer(self, irc, msg, match): - r"https?://[^\])>\s]{13,}" - channel = msg.args[0] - if not ircutils.isChannel(channel): - return - r = self.registryValue('nonSnarfingRegexp', channel) - if self.registryValue('tinyurlSnarfer', channel): - url = match.group(0) - if r and r.search(url) is not None: - self.log.debug('Not tinyUrlSnarfing %r', url) - return - minlen = self.registryValue('tinyurlSnarfer.minimumLength',channel) - if len(url) >= minlen: - tinyurl = self._getTinyUrl(url, channel) - if tinyurl is None: - self.log.info('Couldn\'t get tinyurl for %r', url) - return - domain = webutils.getDomain(url) - s = '%s (at %s)' % (ircutils.bold(tinyurl), domain) - irc.reply(s, prefixName=False) - tinyurlSnarfer = privmsgs.urlSnarfer(tinyurlSnarfer) - def titleSnarfer(self, irc, msg, match): r"https?://[^\])>\s]+" channel = msg.args[0] @@ -183,52 +147,6 @@ class URL(callbacks.PrivmsgCommandAndRegexp): irc.reply(s, prefixName=False) titleSnarfer = privmsgs.urlSnarfer(titleSnarfer) - _tinyRe = re.compile(r'
(http://tinyurl\.com/\w+)') - def _getTinyUrl(self, url, channel, cmd=False): - try: - s = webutils.getUrl('http://tinyurl.com/create.php?url=%s' % url) - m = self._tinyRe.search(s) - if m is None: - tinyurl = None - else: - tinyurl = m.group(1) - return tinyurl - except webutils.WebError, e: - if cmd: - raise callbacks.Error, e - else: - self.log.info(str(e)) - - def tiny(self, irc, msg, args): - """ - - Returns a TinyURL.com version of - """ - url = privmsgs.getArgs(args) - if len(url) < 20: - irc.error('Stop being a lazy-biotch and type the URL yourself.') - return - channel = msg.args[0] - snarf = self.registryValue('tinyurlSnarfer', channel) - minlen = self.registryValue('tinyurlSnarfer.minimumLength', channel) - dontSnarf = False - r = self.registryValue('nonSnarfingRegexp', channel) - if r is not None: - dontSnarf = r.search(url) - dontSnarf = not dontSnarf - if snarf and len(url) >= minlen and dontSnarf: - self.log.debug('Not applying tiny command, snarfer is active.') - return - tinyurl = self._getTinyUrl(url, channel, cmd=True) - domain = webutils.getDomain(url) - s = '%s (at %s)' % (ircutils.bold(tinyurl), domain) - if tinyurl is not None: - irc.reply(s) - else: - s = 'Could not parse the TinyURL.com results page.' - irc.errorPossibleBug(s) - tiny = privmsgs.thread(tiny) - def stats(self, irc, msg, args): """[] diff --git a/test/test_ShrinkUrl.py b/test/test_ShrinkUrl.py new file mode 100644 index 000000000..27265bd07 --- /dev/null +++ b/test/test_ShrinkUrl.py @@ -0,0 +1,82 @@ +### +# Copyright (c) 2002-2004, Jeremiah Fincher +# 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. +### + +from testsupport import * + +class ShrinkUrlTestCase(ChannelPluginTestCase): + plugins = ('ShrinkUrl',) + if network: + def testTinyurl(self): + try: + conf.supybot.plugins.ShrinkUrl.tinyurlSnarfer.setValue(False) + self.assertRegexp( + 'url tiny http://sourceforge.net/tracker/?' + 'func=add&group_id=58965&atid=489447', + r'http://tinyurl.com/rqac') + conf.supybot.plugins.ShrinkUrl.tinyurlSnarfer.setValue(True) + self.assertRegexp( + 'url tiny http://sourceforge.net/tracker/?' + 'func=add&group_id=58965&atid=489447', + r'http://tinyurl.com/rqac') + finally: + conf.supybot.plugins.ShrinkUrl.tinyurlSnarfer.setValue(False) + + def testTinysnarf(self): + try: + conf.supybot.plugins.ShrinkUrl.tinyurlSnarfer.setValue(True) + self.assertSnarfRegexp( + 'http://sourceforge.net/tracker/?func=add&' + 'group_id=58965&atid=489447', + r'http://tinyurl.com/rqac.* \(at') + self.assertSnarfRegexp( + 'http://www.urbandictionary.com/define.php?' + 'term=all+your+base+are+belong+to+us', + r'http://tinyurl.com/u479.* \(at') + finally: + conf.supybot.plugins.ShrinkUrl.tinyurlSnarfer.setValue(False) + + def testNonSnarfing(self): + tiny = conf.supybot.plugins.ShrinkUrl.tinyurlSnarfer() + snarf = conf.supybot.plugins.ShrinkUrl.nonSnarfingRegexp() + try: + conf.supybot.plugins.ShrinkUrl.nonSnarfingRegexp.set('m/sf/') + try: + conf.supybot.plugins.ShrinkUrl.tinyurlSnarfer.setValue(True) + self.assertSnarfNoResponse('http://sf.net/', 2) + self.assertSnarfResponse('http://www.sourceforge.net/', + 'http://tinyurl.com/2cnkf') + finally: + conf.supybot.plugins.ShrinkUrl.tinyurlSnarfer.setValue(tiny) + finally: + conf.supybot.plugins.ShrinkUrl.nonSnarfingRegexp.setValue(snarf) + + + +# vim:set shiftwidth=4 tabstop=8 expandtab textwidth=78: + diff --git a/test/test_URL.py b/test/test_URL.py index 5e1b03a97..d097d3808 100644 --- a/test/test_URL.py +++ b/test/test_URL.py @@ -59,10 +59,6 @@ http://gameknot.com/tsignup.pl class URLTestCase(ChannelPluginTestCase, PluginDocumentation): plugins = ('URL',) - def setUp(self): - ChannelPluginTestCase.setUp(self) - conf.supybot.plugins.URL.tinyurlSnarfer.setValue(False) - def test(self): counter = 0 #self.assertNotError('url random') @@ -98,35 +94,6 @@ class URLTestCase(ChannelPluginTestCase, PluginDocumentation): conf.supybot.plugins.URL.nonSnarfingRegexp.set('') if network: - def testTinyurl(self): - try: - conf.supybot.plugins.URL.tinyurlSnarfer.setValue(False) - self.assertRegexp( - 'url tiny http://sourceforge.net/tracker/?' - 'func=add&group_id=58965&atid=489447', - r'http://tinyurl.com/rqac') - conf.supybot.plugins.URL.tinyurlSnarfer.setValue(True) - self.assertRegexp( - 'url tiny http://sourceforge.net/tracker/?' - 'func=add&group_id=58965&atid=489447', - r'http://tinyurl.com/rqac') - finally: - conf.supybot.plugins.URL.tinyurlSnarfer.setValue(False) - - def testTinysnarf(self): - try: - conf.supybot.plugins.URL.tinyurlSnarfer.setValue(True) - self.assertSnarfRegexp( - 'http://sourceforge.net/tracker/?func=add&' - 'group_id=58965&atid=489447', - r'http://tinyurl.com/rqac.* \(at') - self.assertSnarfRegexp( - 'http://www.urbandictionary.com/define.php?' - 'term=all+your+base+are+belong+to+us', - r'http://tinyurl.com/u479.* \(at') - finally: - conf.supybot.plugins.URL.tinyurlSnarfer.setValue(False) - def testTitleSnarfer(self): try: conf.supybot.plugins.URL.titleSnarfer.setValue(True) @@ -137,18 +104,10 @@ class URLTestCase(ChannelPluginTestCase, PluginDocumentation): conf.supybot.plugins.URL.titleSnarfer.setValue(False) def testNonSnarfing(self): - tiny = conf.supybot.plugins.URL.tinyurlSnarfer() snarf = conf.supybot.plugins.URL.nonSnarfingRegexp() title = conf.supybot.plugins.URL.titleSnarfer() try: conf.supybot.plugins.URL.nonSnarfingRegexp.set('m/sf/') - try: - conf.supybot.plugins.URL.tinyurlSnarfer.setValue(True) - self.assertSnarfNoResponse('http://sf.net/', 2) - self.assertSnarfResponse('http://www.sourceforge.net/', - 'http://tinyurl.com/2cnkf') - finally: - conf.supybot.plugins.URL.tinyurlSnarfer.setValue(tiny) try: conf.supybot.plugins.URL.titleSnarfer.setValue(True) self.assertSnarfNoResponse('http://sf.net/', 2)