chiark / gitweb /
new flirt from Emperor (apropos remarks made about a cyclist)
[irc.git] / commands.py
index 491ab3c7254840f476270abd60f8c6f33e478004..5f436c63fd2b41f95a62399a5893a294939517db 100755 (executable)
@@ -1,8 +1,13 @@
 # Part of Acrobat.
-import string, cPickle, random, urllib, sys, time, re, os, twitter, subprocess, datetime, urlparse
+import string, cPickle, random, urllib, sys, time, re, os, twitter, subprocess, datetime, urlparse, hashlib
 from collections import defaultdict
 from irclib import irc_lower, nm_to_n
 
+try:
+    from blame_filter import bfd
+except ImportError:
+    bfd = None
+
 # query karma
 def karmaq(bot, cmd, nick, conn, public, karma):
     try:
@@ -279,8 +284,12 @@ def __getcommitinfo(commit):
        return(err)
 
     ts,mes=out.split('|')
+    mes=mes.strip()
+    md5mes=hashlib.md5(mes).hexdigest()
+    if bfd and md5mes in bfd:
+        mes=bfd[md5mes]
     when=datetime.date.fromtimestamp(float(ts))
-    return mes.strip(), when
+    return mes, when
 
 ###Return an array of commit messages and timestamps for lines in db that match what
 def __getcommits(db,keys,what):
@@ -393,23 +402,33 @@ class UrlLog:
         self.nick=nick
         self.url=url
         self.first=time.time()
+        self.localfirst=time.localtime(self.first)
         self.count=1
         self.lastseen=time.time()
         self.lastasked=time.time()
     def recenttime(self):
         return max(self.lastseen,self.lastasked)
     def firstmen(self):
-        return nicetime(time.time()-self.first)
+        n=time.localtime(time.time())
+        s="%02d:%02d" % (self.localfirst.tm_hour,self.localfirst.tm_min)
+        if n.tm_yday != self.localfirst.tm_yday:
+            s+=time.strftime(" on %d %B", self.localfirst)
+        return s
     def urltype(self):
-        z=min(len(urlcomplaints)-1, self.count-1)
-        return urlcomplaints[z]
+        z=min(len(urlinfos)-1, self.count-1)
+        return urlinfos[z]
 
 #(?:) is a regexp that doesn't group        
 urlre = re.compile(r"((?:(?:http)|(?:nsfw))s?://[^ ]+)( |$)")
 hturlre= re.compile(r"(http)(s?://[^ ]+)( |$)")
 #matches \bre\:?\s+ before a regexp; (?i)==case insensitive match
 shibboleth = re.compile(r"(?i)\bre\:?\s+((?:(?:http)|(?:nsfw))s?://[^ ]+)( |$)")
-urlcomplaints = ["a contemporary","an interesting","a fascinating","an overused","a vastly overused"]
+#How long (in s) to wait since the most recent mention before commenting
+url_repeat_time = 300
+urlinfos = ["a new",
+            "a fascinating",
+            "an interesting",
+            "a popular"]
 
 ### Deal with /msg bot url or ~url in channel
 def urlq(bot, cmd, nick, conn, public,urldb):
@@ -421,12 +440,12 @@ def urlq(bot, cmd, nick, conn, public,urldb):
   url=canonical_url(urlstring)
   if (url in urldb):
     T = urldb[url]
-    complaint="That's %s URL that was first mentioned %s by %s" % \
-               (T.urltype(),T.firstmen(),T.nick)
+    comment="I saw that URL in scrool, first mentioned by %s at %s" % \
+               (T.nick,T.firstmen())
     if (public):
-      complaint=complaint+". Furthermore it defeats the point of this command to use it other than via /msg."
+      comment=comment+". Furthermore it defeats the point of this command to use it other than via /msg."
       T.count+=1
-    bot.automsg(False,nick,complaint)
+    bot.automsg(False,nick,comment)
     T.lastasked=time.time()
     #URL suppressed, so mention in #urls
     if urlstring != cmd.split()[1]: #first argument to URL was not the url
@@ -450,9 +469,10 @@ def dourl(bot,conn,nick,command,urldb):
 
   if urlstring in urldb:
     T=urldb[urlstring]
-    message="observes %s URL, first mentioned %s by %s" % \
-             (T.urltype(),T.firstmen(),T.nick)
-    if shibboleth.search(command)==None:
+    message="saw that URL in scrool, first mentioned by %s at %s" % \
+             (T.nick,T.firstmen())
+    if shibboleth.search(command)==None and \
+       time.time() - T.lastseen > url_repeat_time:
         conn.action(bot.channel, message)
     T.lastseen=time.time()
     T.count+=1
@@ -498,15 +518,17 @@ def twitterq(bot,cmd,nick,conn,public,twitapi):
 
   urlstring = urlre.search(cmd).group(1)
   if (urlstring.find("twitter.com") !=-1):
-    stringout = getTweet(urlstring,twitapi)
-    bot.automsg(public, nick, stringout)
+    stringsout = getTweet(urlstring,twitapi)
+    for stringout in stringsout:
+        bot.automsg(public, nick, stringout)
   
-def getTweet(urlstring,twitapi,inclusion=False):
+def getTweet(urlstring,twitapi,inclusion=False,recurlvl=0):
   unobfuscate_urls=True
   expand_included_tweets=True
+  stringsout=[]
 
-  parts = string.split(urlstring,'/')
-  tweetID = parts[-1]
+  path = urlparse.urlparse(urlstring).path
+  tweetID = path.split('/')[-1]
   try:
     status = twitapi.GetStatus(tweetID)
     if status == {}:
@@ -521,7 +543,7 @@ def getTweet(urlstring,twitapi,inclusion=False):
     else:
         tweeter_screen = "[not returned]" ; tweeter_name = "[not returned]"
         tweeter_name = tweeter_name + " RTing " + status.user.name #.encode('UTF-8', 'replace')
-    tweetText = status.text
+    tweetText = status.full_text
     if status.media:
         replacements = defaultdict( list )
         for medium in status.media:
@@ -574,10 +596,18 @@ def getTweet(urlstring,twitapi,inclusion=False):
             else:
                 toReplace = '%s://%s%s' % (rv.scheme, rv.hostname, rv.path) # leave off the final '?'
 
-        if expand_included_tweets and not inclusion:
+        if expand_included_tweets:
             if rv.hostname == 'twitter.com' and re.search(r'status/\d+',rv.path):
-                quotedtweet = getTweet(toReplace, twitapi, inclusion=True) # inclusion parameter limits recursion.
-                tweetText += " Q{" + quotedtweet +  "}"
+                if recurlvl > 2:
+                  stringsout = [ "{{ Recursion level too high }}" ] + stringsout
+                else:
+                  quotedtweet = getTweet(toReplace, twitapi, inclusion=True, recurlvl=recurlvl+1) # inclusion parameter limits recursion.
+                  if not quotedtweet:
+                      quotedtweet = [""]
+                  quotedtweet[0] = "Q{ " + quotedtweet[0]
+                  quotedtweet[-1] += " }"
+                  stringsout = quotedtweet + stringsout
+
         tweetText = tweetText.replace(url.url, toReplace)
 
     tweetText = tweetText.replace(">",">")
@@ -591,7 +621,8 @@ def getTweet(urlstring,twitapi,inclusion=False):
   except Exception:
     terror = sys.exc_info()
     stringout = "Error: %s" % terror[1].__str__()
+  stringsout = [stringout] + stringsout
   if inclusion:
-      return stringout # don't want to double-encode it, so just pass it on for now and encode later
-  print stringout.encode('UTF-8', 'replace')
-  return stringout.encode('UTF-8', 'replace')
+      return stringsout # don't want to double-encode it, so just pass it on for now and encode later
+
+  return map(lambda x: x.encode('UTF-8', 'replace'), stringsout)