home · contact · privacy
Handle mobile twitter status URLs properly.
[plomlombot-irc.git] / plomlombot.py
index 3e4734fa2ec2403aa093768623e1ca9b189d5cd8..0f738f0003e5c8dca674e97b2df0bde7c9b9c460 100755 (executable)
@@ -8,6 +8,9 @@ import time
 import re
 import requests
 import bs4
+import random
+import hashlib
+import os
 
 # Defaults, may be overwritten by command line arguments.
 SERVER = "irc.freenode.net"
@@ -102,27 +105,85 @@ def lineparser_loop(io, nickname):
 
     def act_on_privmsg(tokens):
 
+        def notice(msg):
+            io.send_line("NOTICE " + target + " :" + msg)
+
         def url_check(msg):
 
-            def notice(msg):
-                io.send_line("NOTICE " + target + " :" + msg)
+            def handle_url(url):
+
+                def mobile_twitter_hack(url):
+                    re1 = '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)
+                        return True
 
-            matches = re.findall("(https?://[^\s>]+)", msg)
-            for i in range(len(matches)):
-                url = matches[i]
                 try:
                     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
+                    return
+                if mobile_twitter_hack(url):
+                    return
                 title = bs4.BeautifulSoup(r.text).title
                 if title:
-                    notice("PAGE TITLE FOR URL: " + title.string)
+                    notice("PAGE TITLE: " + title.string.strip())
                 else:
                     notice("PAGE HAS NO TITLE TAG")
 
+            matches = re.findall("(https?://[^\s>]+)", msg)
+            for i in range(len(matches)):
+                handle_url(matches[i])
+
+        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 len(tokens) > 2 or \
+                    (len(tokens) == 2 and not tokens[1].isdigit()):
+                    notice("SYNTAX: !quote [int]")
+                    return
+                if not os.access(quotesfile_name, os.F_OK):
+                    notice("NO QUOTES AVAILABLE")
+                    return
+                quotesfile = open(quotesfile_name, "r")
+                lines = quotesfile.readlines()
+                quotesfile.close()
+                lines = lines[1:]
+                if len(tokens) == 2:
+                    i = int(tokens[1])
+                    if i == 0 or i > len(lines):
+                        notice("THERE'S NO QUOTE OF THAT INDEX")
+                        return
+                    i = i - 1
+                else:
+                    i = random.randrange(len(lines))
+                notice("QUOTE #" + str(i + 1) + ": " + lines[i])
+
         sender = ""
         for rune in tokens[0]:
             if rune == "!":
@@ -139,6 +200,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: