home · contact · privacy
Shorten prefix for page title retrieval message.
[plomlombot-irc.git] / plomlombot.py
index 0b605e9946b04f79a8f3e843da56eee2b59b0169..9da116646679d15cb582a18e21ffb6026512361e 100755 (executable)
@@ -6,9 +6,11 @@ import datetime
 import select
 import time
 import re
-import urllib.request
-import http.client
-import html
+import requests
+import bs4
+import random
+import hashlib
+import os
 
 # Defaults, may be overwritten by command line arguments.
 SERVER = "irc.freenode.net"
@@ -103,36 +105,54 @@ def lineparser_loop(io, nickname):
 
     def act_on_privmsg(tokens):
 
-        def url_check(msg):
-
-            def notice(msg):
-                io.send_line("NOTICE " + target + " :" + msg)
+        def notice(msg):
+            io.send_line("NOTICE " + target + " :" + msg)
 
+        def url_check(msg):
             matches = re.findall("(https?://[^\s>]+)", msg)
             for i in range(len(matches)):
                 url = matches[i]
-                request = urllib.request.Request(url, headers={
-                    "User-Agent": "plomlombot"
-                })
                 try:
-                    webpage = urllib.request.urlopen(request, timeout=15)
-                except (urllib.error.HTTPError, urllib.error.URLError,
-                        UnicodeError, http.client.BadStatusLine) as error:
+                    r = requests.get(url, timeout=15)
+                except (requests.exceptions.TooManyRedirects,
+                        requests.exceptions.ConnectionError,
+                        requests.exceptions.InvalidURL,
+                        requests.exceptions.InvalidSchema) as error:
                     notice("TROUBLE FOLLOWING URL: " + str(error))
                     continue
-                charset = webpage.info().get_content_charset()
-                if not charset:
-                    charset = "utf-8"
-                content_type = webpage.info().get_content_type()
-                if content_type not in ('text/html', 'text/xml',
-                                        'application/xhtml+xml'):
-                    notice("TROUBLE READING PAGE TITLE: bad content type "
-                           + content_type)
-                    continue
-                content = webpage.read().decode(charset)
-                title = str(content).split('<title>')[1].split('</title>')[0]
-                title = html.unescape(title)
-                notice("PAGE TITLE FOR URL: " + title)
+                title = bs4.BeautifulSoup(r.text).title
+                if title:
+                    notice("PAGE TITLE: " + title.string.strip())
+                else:
+                    notice("PAGE HAS NO TITLE TAG")
+
+        def command_check(msg):
+            if msg[0] != "!":
+                return
+            tokens = msg[1:].split()
+            hash_string = hashlib.md5(target.encode("utf-8")).hexdigest()
+            quotesfile_name = "quotes_" + hash_string
+            if tokens[0] == "addquote":
+                if not os.access(quotesfile_name, os.F_OK):
+                    quotesfile = open(quotesfile_name, "w")
+                    quotesfile.write("QUOTES FOR " + target + ":\n")
+                    quotesfile.close()
+                quotesfile = open(quotesfile_name, "a")
+                quotesfile.write(str.join(" ", tokens[1:]) + "\n")
+                quotesfile.close()
+                quotesfile = open(quotesfile_name, "r")
+                lines = quotesfile.readlines()
+                quotesfile.close()
+                notice("ADDED QUOTE #" + str(len(lines) - 1))
+            elif tokens[0] == "quote":
+                if not os.access(quotesfile_name, os.F_OK):
+                    notice("NO QUOTES AVAILABLE")
+                    return
+                quotesfile = open(quotesfile_name, "r")
+                lines = quotesfile.readlines()
+                quotesfile.close()
+                i = random.randrange(len(lines) - 1) + 1
+                notice("QUOTE #" + str(i) + ": " + lines[i])
 
         sender = ""
         for rune in tokens[0]:
@@ -150,6 +170,7 @@ def lineparser_loop(io, nickname):
         if receiver != nickname:
             target = receiver
         msg = str.join(" ", tokens[3:])[1:]
+        command_check(msg)
         url_check(msg)
 
     while True: