home · contact · privacy
Add quote searching.
[plomlombot-irc.git] / plomlombot.py
index 0f738f0003e5c8dca674e97b2df0bde7c9b9c460..c32b6dd3c0c42b79f86bb00c96d6f8b7d9017fd2 100755 (executable)
@@ -11,6 +11,7 @@ import bs4
 import random
 import hashlib
 import os
+import plomsearch
 
 # Defaults, may be overwritten by command line arguments.
 SERVER = "irc.freenode.net"
@@ -110,18 +111,19 @@ def lineparser_loop(io, nickname):
 
         def url_check(msg):
 
-            def handle_url(url):
+            def handle_url(url, show_url=False):
 
                 def mobile_twitter_hack(url):
                     re1 = 'https?://(mobile.twitter.com/)[^/]+(/status/)'
-                    re2 = 'https?://mobile.twitter.com/([^/]+)/status/([^\?]+)'
+                    re2 = 'https?://mobile.twitter.com/([^/]+)/status/' \
+                        + '([^\?/]+)'
                     m = re.search(re1, url)
                     if m and m.group(1) == 'mobile.twitter.com/' \
                             and m.group(2) == '/status/':
                         m = re.search(re2, url)
                         url = 'https://twitter.com/' + m.group(1) + '/status/' \
                                 + m.group(2)
-                        handle_url(url)
+                        handle_url(url, True)
                         return True
 
                 try:
@@ -136,7 +138,10 @@ def lineparser_loop(io, nickname):
                     return
                 title = bs4.BeautifulSoup(r.text).title
                 if title:
-                    notice("PAGE TITLE: " + title.string.strip())
+                    prefix = "PAGE TITLE: "
+                    if show_url:
+                        prefix = "PAGE TITLE FOR <" + url + ">: "
+                    notice(prefix + title.string.strip())
                 else:
                     notice("PAGE HAS NO TITLE TAG")
 
@@ -163,9 +168,16 @@ def lineparser_loop(io, nickname):
                 quotesfile.close()
                 notice("ADDED QUOTE #" + str(len(lines) - 1))
             elif tokens[0] == "quote":
-                if len(tokens) > 2 or \
+                if (len(tokens) > 2 and tokens[1] != "search") or \
+                    (len(tokens) < 3 and tokens[1] == "search") or \
                     (len(tokens) == 2 and not tokens[1].isdigit()):
-                    notice("SYNTAX: !quote [int]")
+                    notice("SYNTAX: !quote [int] OR !quote search QUERY")
+                    notice("QUERY may be a boolean grouping of quoted or "\
+                        + "unquoted search terms, examples:")
+                    notice("!quote search foo")
+                    notice("!quote search foo AND (bar OR NOT baz)")
+                    notice("!quote search \"foo\\\"bar\" AND "\
+                            + "('NOT\"' AND \"'foo'\" OR 'bar\\'baz')")
                     return
                 if not os.access(quotesfile_name, os.F_OK):
                     notice("NO QUOTES AVAILABLE")
@@ -180,6 +192,20 @@ def lineparser_loop(io, nickname):
                         notice("THERE'S NO QUOTE OF THAT INDEX")
                         return
                     i = i - 1
+                elif len(tokens) > 2:
+                    query = str.join(" ", tokens[2:])
+                    try:
+                        results = plomsearch.search(query, lines)
+                    except plomsearch.LogicParserError as err:
+                        notice("FAILED QUERY PARSING: " + str(err))
+                        return
+                    if len(results) == 0:
+                        notice("NO QUOTES MATCHING QUERY")
+                    else:
+                        for result in results:
+                            notice("QUOTE #" + str(result[0] + 1) + " : "
+                                + result[1])
+                    return
                 else:
                     i = random.randrange(len(lines))
                 notice("QUOTE #" + str(i + 1) + ": " + lines[i])