2009-03-15 04:14:07 +00:00
|
|
|
"""
|
|
|
|
twitter.py: written by Scaevolus 2009
|
|
|
|
retrieves most recent tweets
|
|
|
|
"""
|
|
|
|
|
2009-07-10 06:41:09 +00:00
|
|
|
import re
|
|
|
|
import urllib2
|
2009-03-17 00:55:54 +00:00
|
|
|
from lxml import etree
|
2009-03-15 04:14:07 +00:00
|
|
|
|
2009-07-08 17:04:30 +00:00
|
|
|
from util import hook
|
2009-03-16 04:30:46 +00:00
|
|
|
|
2009-04-18 00:57:18 +00:00
|
|
|
|
2009-06-23 06:45:58 +00:00
|
|
|
def unescape_xml(string):
|
|
|
|
# unescape the 5 chars that might be escaped in xml
|
|
|
|
|
|
|
|
# gratuitously functional
|
2009-07-08 17:28:15 +00:00
|
|
|
# return reduce(lambda x, y: x.replace(*y), (string,
|
2009-06-23 06:45:58 +00:00
|
|
|
# zip('> < ' "e; &'.split(), '> < \' " &'.split()))
|
|
|
|
|
|
|
|
# boring, normal
|
2009-07-08 17:28:15 +00:00
|
|
|
return string.replace('>', '>').replace('<', '<').replace(''',
|
|
|
|
"'").replace('"e;', '"').replace('&', '&')
|
|
|
|
|
2009-06-23 06:45:58 +00:00
|
|
|
|
2009-03-16 04:30:46 +00:00
|
|
|
@hook.command
|
2009-07-10 06:41:09 +00:00
|
|
|
def twitter(inp):
|
|
|
|
".twitter <user>/<id> - gets last tweet from <user>/gets tweet <id>"
|
|
|
|
inp = inp.strip()
|
|
|
|
if not inp:
|
2009-03-15 04:14:07 +00:00
|
|
|
return twitter.__doc__
|
|
|
|
|
2009-07-10 06:41:09 +00:00
|
|
|
getting_id = False
|
|
|
|
if re.match('^\d+$', inp):
|
|
|
|
getting_id = True
|
|
|
|
url = 'http://twitter.com/statuses/show/%s.xml' % inp
|
|
|
|
elif re.match('^\w{,15}$', inp):
|
|
|
|
url = 'http://twitter.com/statuses/user_timeline/%s.xml?count=1' % inp
|
|
|
|
else:
|
|
|
|
return 'error: invalid username'
|
|
|
|
|
2009-03-24 22:53:56 +00:00
|
|
|
try:
|
2009-07-10 06:41:09 +00:00
|
|
|
xml = urllib2.urlopen(url).read()
|
|
|
|
except urllib2.HTTPError, e:
|
|
|
|
errors = {400 : 'bad request (ratelimited?)',
|
|
|
|
401: 'tweet is private',
|
|
|
|
404: 'invalid user/id',
|
|
|
|
500: 'twitter is broken',
|
|
|
|
502: 'twitter is down ("getting upgraded")',
|
|
|
|
503: 'twitter is overloaded (lol, RoR)'}
|
|
|
|
if e.code == 404:
|
|
|
|
return 'error: invalid ' + ['username', 'tweet id'][getting_id]
|
|
|
|
if e.code in errors:
|
|
|
|
return 'error: ' + errors[e.code]
|
|
|
|
return 'error: unknown'
|
|
|
|
|
|
|
|
tweet = etree.fromstring(xml)
|
2009-03-15 04:14:07 +00:00
|
|
|
|
2009-07-10 06:41:09 +00:00
|
|
|
if not getting_id:
|
|
|
|
tweet = tweet.find('status')
|
|
|
|
if tweet is None:
|
|
|
|
return 'error: user has no tweets'
|
2009-04-18 00:57:18 +00:00
|
|
|
|
2009-11-18 00:38:48 +00:00
|
|
|
return unescape_xml(': '.join(tweet.find(x).text.replace('\n', '') for x in
|
2009-03-15 20:04:02 +00:00
|
|
|
'created_at user/screen_name text'.split()))
|