2013-10-01 00:38:12 +13:00
from datetime import datetime
2012-07-13 00:55:10 +12:00
import re
2013-10-01 00:38:12 +13:00
import random
2012-07-13 00:55:10 +12:00
2014-02-14 16:21:00 +13:00
from util import hook , http , text , timesince
reddit_re = ( r ' .*(((www \ .)?reddit \ .com/r|redd \ .it)[^ ]+) ' , re . I )
2012-07-13 00:55:10 +12:00
2013-10-01 00:38:12 +13:00
base_url = " http://reddit.com/r/ {} /.json "
short_url = " http://redd.it/ {} "
2013-09-04 18:30:04 +08:00
2012-07-13 00:55:10 +12:00
@hook.regex ( * reddit_re )
def reddit_url ( match ) :
thread = http . get_html ( match . group ( 0 ) )
title = thread . xpath ( ' //title/text() ' ) [ 0 ]
upvotes = thread . xpath ( " //span[@class= ' upvotes ' ]/span[@class= ' number ' ]/text() " ) [ 0 ]
downvotes = thread . xpath ( " //span[@class= ' downvotes ' ]/span[@class= ' number ' ]/text() " ) [ 0 ]
author = thread . xpath ( " //div[@id= ' siteTable ' ]//a[contains(@class, ' author ' )]/text() " ) [ 0 ]
timeago = thread . xpath ( " //div[@id= ' siteTable ' ]//p[@class= ' tagline ' ]/time/text() " ) [ 0 ]
comments = thread . xpath ( " //div[@id= ' siteTable ' ]//a[@class= ' comments ' ]/text() " ) [ 0 ]
2013-10-08 11:33:00 +13:00
return u ' \x02 {} \x02 - posted by \x02 {} \x02 {} ago - {} upvotes, {} downvotes - {} ' . format (
2013-09-04 18:30:04 +08:00
title , author , timeago , upvotes , downvotes , comments )
2013-10-01 00:38:12 +13:00
2013-10-01 10:03:46 +13:00
@hook.command ( autohelp = False )
2013-10-01 00:38:12 +13:00
def reddit ( inp ) :
""" reddit <subreddit> [n] -- Gets a random post from <subreddit>, or gets the [n]th post in the subreddit. """
2013-10-01 03:06:53 +13:00
id_num = None
2013-10-01 00:38:12 +13:00
2013-10-01 10:03:46 +13:00
if inp :
# clean and split the input
parts = inp . lower ( ) . strip ( ) . split ( )
# find the requested post number (if any)
if len ( parts ) > 1 :
2013-10-01 11:53:15 +13:00
url = base_url . format ( parts [ 0 ] . strip ( ) )
2013-11-12 07:06:06 +01:00
try :
2013-10-01 10:03:46 +13:00
id_num = int ( parts [ 1 ] ) - 1
except ValueError :
2013-10-01 11:42:36 +13:00
return " Invalid post number. "
else :
2013-10-01 11:53:15 +13:00
url = base_url . format ( parts [ 0 ] . strip ( ) )
2013-10-01 10:03:46 +13:00
else :
2013-11-12 07:06:06 +01:00
url = " http://reddit.com/.json "
2013-10-01 00:38:12 +13:00
try :
2013-10-01 11:53:15 +13:00
data = http . get_json ( url , user_agent = http . ua_chrome )
2013-10-01 00:38:12 +13:00
except Exception as e :
return " Error: " + str ( e )
data = data [ " data " ] [ " children " ]
# get the requested/random post
2014-02-13 14:34:50 +13:00
if id_num is not None :
2013-10-01 00:38:12 +13:00
try :
item = data [ id_num ] [ " data " ]
except IndexError :
length = len ( data )
return " Invalid post number. Number must be between 1 and {} . " . format ( length )
else :
item = random . choice ( data ) [ " data " ]
item [ " title " ] = text . truncate_str ( item [ " title " ] , 50 )
item [ " link " ] = short_url . format ( item [ " id " ] )
2014-02-13 14:34:50 +13:00
raw_time = datetime . fromtimestamp ( int ( item [ " created_utc " ] ) )
item [ " timesince " ] = timesince . timesince ( raw_time )
2013-10-01 00:38:12 +13:00
2013-10-01 03:10:19 +13:00
if item [ " over_18 " ] :
item [ " warning " ] = " \x02 NSFW \x02 "
else :
item [ " warning " ] = " "
2014-02-13 14:34:50 +13:00
return u " \x02 {title} : {subreddit} \x02 - posted by \x02 {author} \x02 " \
" {timesince} ago - {ups} upvotes, {downs} downvotes - " \
" {link} {warning} " . format ( * * item )