From 0f4a78dc2df09a9c54344e8c0652edb26e82752d Mon Sep 17 00:00:00 2001 From: Jeremy Fincher Date: Sun, 17 Aug 2003 22:01:26 +0000 Subject: [PATCH] Added a snarfer for stats links and refactored. --- plugins/Gameknot.py | 47 ++++++++++++++++++++++++--------------- test/test_Gameknot.py | 51 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 80 insertions(+), 18 deletions(-) create mode 100644 test/test_Gameknot.py diff --git a/plugins/Gameknot.py b/plugins/Gameknot.py index c023369b7..0f1d1323d 100644 --- a/plugins/Gameknot.py +++ b/plugins/Gameknot.py @@ -55,21 +55,14 @@ def configure(onStart, afterConnect, advanced): class Gameknot(callbacks.PrivmsgCommandAndRegexp): threaded = True - regexps = sets.Set(['gameknotSnarfer']) + regexps = sets.Set(['gameknotSnarfer', 'gameknotStatsSnarfer']) _gkrating = re.compile(r'(\d+)') _gkgames = re.compile(r's:  (\d+)') _gkrecord = re.compile(r'"#FFFF00">(\d+)[^"]+"#FFFF00">(\d+)[^"]+'\ '"#FFFF00">(\d+)') _gkteam = re.compile(r'Team:(<.*?>)+(?P.*?)') _gkseen = re.compile(r'(seen on GK:\s+([^[]+)\s+|.*?is hiding.*?)') - def gkstats(self, irc, msg, args): - """ - - Returns the stats Gameknot keeps on . Gameknot is an online - website for playing chess (rather similar to correspondence chess, just - somewhat faster) against players from all over the world. - """ - name = privmsgs.getArgs(args) + def getStats(self, name): gkprofile = 'http://www.gameknot.com/stats.pl?%s' % name try: fd = urllib2.urlopen(gkprofile) @@ -92,20 +85,32 @@ class Gameknot(callbacks.PrivmsgCommandAndRegexp): games = '%s active games' % games if 'Team:' in profile: team = self._gkteam.search(profile).group('name') - irc.reply(msg, '%s (team: %s) is rated %s and has %s ' \ - 'and a record of W-%s, L-%s, D-%s. %s' % \ - (name, team, rating, games, w, l, d, seen)) + s = '%s (team: %s) is rated %s and has %s ' \ + 'and a record of W-%s, L-%s, D-%s. %s' % \ + (name, team, rating, games, w, l, d, seen) else: - irc.reply(msg, '%s is rated %s and has %s ' \ - 'and a record of W-%s, L-%s, D-%s. %s' % \ - (name, rating, games, w, l, d, seen)) + s = '%s is rated %s and has %s ' \ + 'and a record of W-%s, L-%s, D-%s. %s' % \ + (name, rating, games, w, l, d, seen) + return s except AttributeError: if ('User %s not found!' % name) in profile: - irc.error(msg, 'No user %s exists.' % name) + raise callbacks.Error, 'No user %s exists.' % name else: - irc.error(msg, 'The format of the page was odd.') + raise callbacks.Error, 'The format of the page was odd.' except urllib2.URLError: - irc.error(msg, 'Couldn\'t connect to gameknot.com.') + raise callbacks.Error, 'Couldn\'t connect to gameknot.com' + + + def gkstats(self, irc, msg, args): + """ + + Returns the stats Gameknot keeps on . Gameknot is an online + website for playing chess (rather similar to correspondence chess, just + somewhat faster) against players from all over the world. + """ + name = privmsgs.getArgs(args) + irc.reply(msg, self.getStats(name)) _gkPlayer = re.compile(r"popd\('(Rating[^']+)'\).*?>([^<]+)<") _gkRating = re.compile(r": (\d+)[^:]+:
(\d+)[^,]+, (\d+)[^,]+, (\d+)") @@ -140,6 +145,12 @@ class Gameknot(callbacks.PrivmsgCommandAndRegexp): except Exception, e: irc.error(msg, debug.exnToString(e)) + def gameknotStatsSnarfer(self, irc, msg, match): + r"http://gameknot\.com/stats\.pl\?([^&]+)" + name = match.group(1) + s = self.getStats(name) + irc.queueMsg(ircmsgs.privmsg(msg.args[0], s)) + Class = Gameknot # vim:set shiftwidth=4 tabstop=8 expandtab textwidth=78: diff --git a/test/test_Gameknot.py b/test/test_Gameknot.py new file mode 100644 index 000000000..5a31ab4ee --- /dev/null +++ b/test/test_Gameknot.py @@ -0,0 +1,51 @@ +#!/usr/bin/env python + +### +# Copyright (c) 2002, 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 test import * + +class GameknotTestCase(PluginTestCase): + plugins = ('Gameknot',) + def testGkstats(self): + self.assertNotError('gkstats jemfinch') + self.assertError('gkstats %s' % mktemp()) + + def testUrlSnarfer(self): + self.assertNotError('http://gameknot.com/chess.pl?bd=1019508') + + def testStatsUrlSnarfer(self): + self.assertNotError('http://gameknot.com/stats.pl?ironchefchess') + self.assertRegexp('http://gameknot.com/stats.pl?ddipaolo&1', + r'^[^&]+$') + + + +# vim:set shiftwidth=4 tabstop=8 expandtab textwidth=78: +