chiark / gitweb /
Found in /home/matthew/programming/irc/bot - live version, all files as found
[irc.git] / define.patch
1 --- servus-orig/commands.py     Thu Nov 21 01:26:06 2002
2 +++ servus/commands.py  Sat Jan 29 18:13:37 2005
3 @@ -1,5 +1,5 @@
4  # Part of Acrobat.
5 -import string, cPickle, random, urllib, sys, time
6 +import string, cPickle, random, urllib, sys, time, re
7  from irclib import irc_lower, nm_to_n
8
9  # query karma
10 @@ -133,6 +133,33 @@
11              bot.automsg(public,nick,str(gsearch))
12          else: # we haven't found anything.
13             bot.automsg(public,nick,"No pages found.")
14 +    except IOError: # if the connection times out. This blocks. :(
15 +       bot.automsg(public,nick,"The web's broken. Waah!")
16 +
17 +# Look up the definition of something using google
18 +def defineq(bot, cmd, nick, conn, public):
19 +    cmdrest = string.join(cmd.split()[1:])
20 +    targ = ("http://www.google.com/search?q=define%%3A%s&ie=utf-8&oe=utf-8"
21 +            % urllib.quote_plus(cmdrest))
22 +    try:
23 +        # Just slurp everything into a string
24 +        defnpage = urllib.urlopen(targ).read()
25 +        # For definitions we really do have to parse the HTML, sadly.
26 +        # This is of course going to be a bit fragile. We first look for
27 +        # 'Definitions of %s on the Web' -- if this isn't present we
28 +        # assume we have the 'no definitions found page'.
29 +        # The first defn starts after the following <p> tag.
30 +        # Following that we assume that each definition is all the non-markup
31 +        # before a <br> tag. Currently we just dump out the first definition.
32 +        match = re.search(r"Definitions of <b>.*?</b> on the Web.*?<p>\s*([^>]*)<br>",defnpage,re.MULTILINE)
33 +        if match == None:
34 +           bot.automsg(public,nick,"Some things defy definition.")
35 +        else:
36 +           # We assume google has truncated the definition for us so this
37 +           # won't flood the channel with text...
38 +           defn = " ".join(match.group(1).split("\n"));
39 +           bot.automsg(public,nick,defn)
40 +
41      except IOError: # if the connection times out. This blocks. :(
42         bot.automsg(public,nick,"The web's broken. Waah!")
43