8 import profanity_filter
10 import renderer_catalog
13 class reddit_renderer(renderer.debuggable_abstaining_renderer):
14 """A renderer to pull text content from reddit."""
16 def __init__(self, name_to_timeout_dict, subreddit_list, min_votes, font_size):
17 super(reddit_renderer, self).__init__(name_to_timeout_dict, True)
18 self.subreddit_list = subreddit_list
19 self.praw = praw.Reddit(
20 client_id=secrets.reddit_client_id,
21 client_secret=secrets.reddit_client_secret,
22 user_agent=secrets.reddit_user_agent,
24 self.min_votes = min_votes
25 self.font_size = font_size
26 self.messages = grab_bag.grab_bag()
27 self.filter = profanity_filter.profanity_filter()
30 def debug_prefix(self):
32 for subreddit in self.subreddit_list:
33 x += "%s " % subreddit
34 return "reddit(%s)" % x.strip()
36 def periodic_render(self, key):
37 self.debug_print('called for "%s"' % key)
39 return self.scrape_reddit()
40 elif key == "Shuffle":
41 return self.shuffle_messages()
43 raise error("Unexpected operation")
45 def append_message(self, messages):
48 not self.filter.contains_bad_words(msg.title)
49 and msg.ups > self.min_votes
50 and not msg.title in self.deduper
53 self.deduper.add(msg.title)
54 content = "%d" % msg.ups
56 msg.thumbnail != "self"
57 and msg.thumbnail != "default"
58 and msg.thumbnail != ""
60 content = '<IMG SRC="%s">' % msg.thumbnail
62 <TABLE STYLE="font-size:%dpt;">
64 <!-- The number of upvotes or item image: -->
65 <TD STYLE="font-weight:900; padding:8px;">
66 <FONT COLOR="maroon" SIZE=40>%s</FONT>
69 <!-- The content and author: -->
71 <B>%s</B><BR><FONT COLOR=#bbbbbb>(%s)</FONT>
82 self.debug_print("Unexpected exception, skipping message.")
85 'skipped message "%s" for profanity or low score' % (msg.title)
88 def scrape_reddit(self):
91 for subreddit in self.subreddit_list:
93 msg = self.praw.subreddit(subreddit).hot()
94 self.append_message(msg)
98 msg = self.praw.subreddit(subreddit).new()
99 self.append_message(msg)
103 msg = self.praw.subreddit(subreddit).rising()
104 self.append_message(msg)
108 msg = self.praw.subreddit(subreddit).controversial("week")
109 self.append_message(msg)
113 msg = self.praw.subreddit(subreddit).top("day")
114 self.append_message(msg)
117 self.debug_print("There are now %d messages" % self.messages.size())
120 def shuffle_messages(self):
121 layout = page_builder.page_builder()
122 layout.set_layout(page_builder.page_builder.LAYOUT_FOUR_ITEMS)
124 for subreddit in self.subreddit_list:
125 x += "%s " % subreddit
128 x = "[local interests]"
131 layout.set_title("Reddit /r/%s" % x.strip())
132 subset = self.messages.subset(4)
134 self.debug_print("Not enough messages to pick from.")
138 f = file_writer.file_writer("%s_4_10800.html" % self.subreddit_list[0])
139 layout.render_html(f)
144 class til_reddit_renderer(reddit_renderer):
145 def __init__(self, name_to_timeout_dict):
146 super(til_reddit_renderer, self).__init__(
147 name_to_timeout_dict, ["todayilearned"], 200, 20
151 class quotes_reddit_renderer(reddit_renderer):
152 def __init__(self, name_to_timeout_dict):
153 super(quotes_reddit_renderer, self).__init__(
154 name_to_timeout_dict, ["quotes"], 200, 20
158 class showerthoughts_reddit_renderer(reddit_renderer):
159 def __init__(self, name_to_timeout_dict):
160 super(showerthoughts_reddit_renderer, self).__init__(
161 name_to_timeout_dict, ["showerthoughts"], 350, 24
165 class seattle_reddit_renderer(reddit_renderer):
166 def __init__(self, name_to_timeout_dict):
167 super(seattle_reddit_renderer, self).__init__(
168 name_to_timeout_dict,
169 ["seattle", "seattleWA", "SeaWA", "bellevue", "kirkland", "CoronavirusWA"],
175 class lifeprotips_reddit_renderer(reddit_renderer):
176 def __init__(self, name_to_timeout_dict):
177 super(lifeprotips_reddit_renderer, self).__init__(
178 name_to_timeout_dict, ["lifeprotips"], 100, 24
182 # x = reddit_renderer({"Test", 1234}, ["seattle","bellevue"], 50, 24)
183 # x.periodic_render("Scrape")
184 # x.periodic_render("Shuffle")