X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~matthewv/git?p=irc.git;a=blobdiff_plain;f=commands.py;h=5a7cc94cdac1165910175f136cb1959afb9bd09b;hp=1d29fd7f28fa0b39f13c6fe1d250c47e1fa65144;hb=refs%2Fheads%2Fmaster;hpb=b2b8e312bcdcc7a65e57f3db168983e328a8e06a diff --git a/commands.py b/commands.py index 1d29fd7..eec69e7 100755 --- a/commands.py +++ b/commands.py @@ -2,6 +2,7 @@ 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 +import json try: from blame_filter import bfd @@ -55,14 +56,13 @@ def infoq(bot, cmd, nick, conn, public, karma): class FishPond: def __init__(fishpond): - fishpond.last="" - fishpond.last_cfg=None + fishpond.last=[] fishpond.DoS=0 fishpond.quotatime=0 def note_last(fishpond, msg, cfg): - fishpond.last=msg - fishpond.last_cfg=cfg + fishpond.last.insert(0,(msg,cfg)) + fishpond.last = fishpond.last[0:10] # Check on fish stocks def fish_quota(pond): @@ -334,11 +334,19 @@ def blameq(bot,cmd,nick,conn,public,fishpond,cfgs): cwhat=' '.join(clist[2:]) kindsfile = "fish?" if clist[1]=="#last": - if fishpond.last_cfg is None: + try: + n = abs(int(clist[2]))-1 + if n < 0: raise ValueError + except IndexError: n = 0 + except ValueError: + bot.automsg(public,nick,"Huh?") + return + try: lmsg, lcfg = fishpond.last[n] + except IndexError: bot.automsg(public,nick,"Nothing") return - xdb,xdbk,kindsfile = fishpond.last_cfg[7] - ans=__getcommits(xdb,xdbk,fishpond.last) + xdb,xdbk,kindsfile = lcfg[7] + ans=__getcommits(xdb,xdbk,lmsg) elif clist[1]=="#trouts" or clist[1]=="#trout": ans=__getcommits(tdb,tdbk,cwhat) elif clist[1]=="#flirts" or clist[1]=="#flirt": @@ -564,13 +572,38 @@ def getTweet(urlstring,twitapi,inclusion=False,recurlvl=0): tweeter_name = tweeter_name + " RTing " + status.user.name #.encode('UTF-8', 'replace') tweetText = status.full_text if status.media: - replacements = defaultdict( list ) + replacements = defaultdict(list) + for medium in status.media: replacements[medium.url].append(medium.media_url_https) - for k,v in replacements.items(): + # The twitter-api 'conveniently' parses this for you and + # throws away the actual video URLs, so we have to take the + # JSON and reparse it :sadpanda: + # This is particularly annoying because we don't know + # for sure that status.media and the JSON 'media' entry + # have the same elements in the same order. Probably they + # do but maybe twitter-api randomly reorganised things or + # filtered the list or something. So instead we go through + # the JSON and handle the media urls, discarding whatever + # unfortunate thing we have put in replacements already. + parsed_tweet = json.loads(status.AsJsonString()) + for medium in parsed_tweet.get('media', []): + if medium['type'] == 'video': + best = { 'bitrate': -1 } + for vt in medium['video_info']['variants']: + if (vt.get('content_type') == 'video/mp4' and + vt.get('bitrate', -1) > best['bitrate']): + best = vt + if 'url' in best: + video_url = best['url'].split('?',1)[0] + duration = medium['video_info']['duration_millis'] + # ^ duration_millis is a string + duration = "%.1f" % (float(duration)/1000.) + video_desc = "%s (%ss)" % (video_url, duration) + replacements[medium['url']] = [video_desc] - v = [re.sub(r"/tweet_video_thumb/([\w\-]+).jpg", r"/tweet_video/\1.mp4", link) for link in v] + for k,v in replacements.items(): if len(v) > 1: replacementstring = "[" + " ; ".join(v) +"]" else: