import constants import file_writer import grab_bag import renderer import secrets import page_builder import praw import profanity_filter import random import renderer_catalog class reddit_renderer(renderer.debuggable_abstaining_renderer): """A renderer to pull text content from reddit.""" def __init__(self, name_to_timeout_dict, subreddit_list, min_votes, font_size): super(reddit_renderer, self).__init__(name_to_timeout_dict, True) self.subreddit_list = subreddit_list self.praw = praw.Reddit( client_id=secrets.reddit_client_id, client_secret=secrets.reddit_client_secret, user_agent=secrets.reddit_user_agent, ) self.min_votes = min_votes self.font_size = font_size self.messages = grab_bag.grab_bag() self.filter = profanity_filter.profanity_filter() self.deduper = set() def debug_prefix(self): x = "" for subreddit in self.subreddit_list: x += "%s " % subreddit return "reddit(%s)" % x.strip() def periodic_render(self, key): self.debug_print('called for "%s"' % key) if key == "Scrape": return self.scrape_reddit() elif key == "Shuffle": return self.shuffle_messages() else: raise error("Unexpected operation") def append_message(self, messages): for msg in messages: if ( not self.filter.contains_bad_words(msg.title) and msg.ups > self.min_votes and not msg.title in self.deduper ): try: self.deduper.add(msg.title) content = "%d" % msg.ups if ( msg.thumbnail != "self" and msg.thumbnail != "default" and msg.thumbnail != "" ): content = '' % msg.thumbnail x = """
%s %s
(%s)
""" % ( self.font_size, content, msg.title, msg.author, ) self.messages.add(x) except: self.debug_print("Unexpected exception, skipping message.") else: self.debug_print( 'skipped message "%s" for profanity or low score' % (msg.title) ) def scrape_reddit(self): self.deduper.clear() self.messages.clear() for subreddit in self.subreddit_list: try: msg = self.praw.subreddit(subreddit).hot() self.append_message(msg) except: pass try: msg = self.praw.subreddit(subreddit).new() self.append_message(msg) except: pass try: msg = self.praw.subreddit(subreddit).rising() self.append_message(msg) except: pass try: msg = self.praw.subreddit(subreddit).controversial("week") self.append_message(msg) except: pass try: msg = self.praw.subreddit(subreddit).top("day") self.append_message(msg) except: pass self.debug_print("There are now %d messages" % self.messages.size()) return True def shuffle_messages(self): layout = page_builder.page_builder() layout.set_layout(page_builder.page_builder.LAYOUT_FOUR_ITEMS) x = "" for subreddit in self.subreddit_list: x += "%s " % subreddit if len(x) > 30: if "SeaWA" in x: x = "[local interests]" else: x = "Unknown, fixme" layout.set_title("Reddit /r/%s" % x.strip()) subset = self.messages.subset(4) if subset is None: self.debug_print("Not enough messages to pick from.") return False for msg in subset: layout.add_item(msg) f = file_writer.file_writer("%s_4_10800.html" % self.subreddit_list[0]) layout.render_html(f) f.close() return True class til_reddit_renderer(reddit_renderer): def __init__(self, name_to_timeout_dict): super(til_reddit_renderer, self).__init__( name_to_timeout_dict, ["todayilearned"], 200, 20 ) class quotes_reddit_renderer(reddit_renderer): def __init__(self, name_to_timeout_dict): super(quotes_reddit_renderer, self).__init__( name_to_timeout_dict, ["quotes"], 200, 20 ) class showerthoughts_reddit_renderer(reddit_renderer): def __init__(self, name_to_timeout_dict): super(showerthoughts_reddit_renderer, self).__init__( name_to_timeout_dict, ["showerthoughts"], 350, 24 ) class seattle_reddit_renderer(reddit_renderer): def __init__(self, name_to_timeout_dict): super(seattle_reddit_renderer, self).__init__( name_to_timeout_dict, ["seattle", "seattleWA", "SeaWA", "bellevue", "kirkland", "CoronavirusWA"], 50, 24, ) class lifeprotips_reddit_renderer(reddit_renderer): def __init__(self, name_to_timeout_dict): super(lifeprotips_reddit_renderer, self).__init__( name_to_timeout_dict, ["lifeprotips"], 100, 24 ) # x = reddit_renderer({"Test", 1234}, ["seattle","bellevue"], 50, 24) # x.periodic_render("Scrape") # x.periodic_render("Shuffle")