8 import profanity_filter
10 import renderer_catalog
12 class reddit_renderer(renderer.debuggable_abstaining_renderer):
13 """A renderer to pull text content from reddit."""
15 def __init__(self, name_to_timeout_dict, subreddit_list, min_votes, font_size):
16 super(reddit_renderer, self).__init__(name_to_timeout_dict, True)
17 self.subreddit_list = subreddit_list
18 self.praw = praw.Reddit(client_id=secrets.reddit_client_id,
19 client_secret=secrets.reddit_client_secret,
20 user_agent=secrets.reddit_user_agent)
21 self.min_votes = min_votes
22 self.font_size = font_size
23 self.messages = grab_bag.grab_bag()
24 self.filter = profanity_filter.profanity_filter()
27 def debug_prefix(self):
29 for subreddit in self.subreddit_list:
30 x += ("%s " % subreddit)
31 return "reddit(%s)" % x.strip()
33 def periodic_render(self, key):
34 self.debug_print('called for "%s"' % key)
36 return self.scrape_reddit()
37 elif key == "Shuffle":
38 return self.shuffle_messages()
40 raise error('Unexpected operation')
42 def append_message(self, messages):
44 if (not self.filter.contains_bad_words(msg.title)
45 and msg.ups > self.min_votes
46 and not msg.title in self.deduper):
48 self.deduper.add(msg.title)
49 content = "%d" % msg.ups
50 if (msg.thumbnail != "self" and
51 msg.thumbnail != "default" and
53 content = '<IMG SRC="%s">' % msg.thumbnail
55 <TABLE STYLE="font-size:%dpt;">
57 <!-- The number of upvotes or item image: -->
58 <TD STYLE="font-weight:900; padding:8px;">
59 <FONT COLOR="maroon" SIZE=40>%s</FONT>
62 <!-- The content and author: -->
64 <B>%s</B><BR><FONT COLOR=#bbbbbb>(%s)</FONT>
67 </TABLE>""" % (self.font_size, content, msg.title, msg.author)
70 self.debug_print('Unexpected exception, skipping message.')
72 self.debug_print('skipped message "%s" for profanity or low score' % (
75 def scrape_reddit(self):
78 for subreddit in self.subreddit_list:
80 msg = self.praw.subreddit(subreddit).hot()
81 self.append_message(msg)
85 msg = self.praw.subreddit(subreddit).new()
86 self.append_message(msg)
90 msg = self.praw.subreddit(subreddit).rising()
91 self.append_message(msg)
95 msg = self.praw.subreddit(subreddit).controversial('week')
96 self.append_message(msg)
100 msg = self.praw.subreddit(subreddit).top('day')
101 self.append_message(msg)
104 self.debug_print("There are now %d messages" % self.messages.size())
107 def shuffle_messages(self):
108 layout = page_builder.page_builder()
109 layout.set_layout(page_builder.page_builder.LAYOUT_FOUR_ITEMS)
111 for subreddit in self.subreddit_list:
112 x += ("%s " % subreddit)
115 x = "[local interests]"
118 layout.set_title("Reddit /r/%s" % x.strip())
119 subset = self.messages.subset(4)
121 self.debug_print("Not enough messages to pick from.")
125 f = file_writer.file_writer("%s_4_10800.html" % self.subreddit_list[0])
126 layout.render_html(f)
130 class til_reddit_renderer(reddit_renderer):
131 def __init__(self, name_to_timeout_dict):
132 super(til_reddit_renderer, self).__init__(
133 name_to_timeout_dict, ["todayilearned"], 200, 20)
135 class quotes_reddit_renderer(reddit_renderer):
136 def __init__(self, name_to_timeout_dict):
137 super(quotes_reddit_renderer, self).__init__(
138 name_to_timeout_dict, ["quotes"], 200, 20)
140 class showerthoughts_reddit_renderer(reddit_renderer):
141 def __init__(self, name_to_timeout_dict):
142 super(showerthoughts_reddit_renderer, self).__init__(
143 name_to_timeout_dict, ["showerthoughts"], 350, 24)
145 class seattle_reddit_renderer(reddit_renderer):
146 def __init__(self, name_to_timeout_dict):
147 super(seattle_reddit_renderer, self).__init__(
148 name_to_timeout_dict, ["seattle","seattleWA","SeaWA","bellevue","kirkland", "CoronavirusWA"], 50, 24)
150 class lifeprotips_reddit_renderer(reddit_renderer):
151 def __init__(self, name_to_timeout_dict):
152 super(lifeprotips_reddit_renderer, self).__init__(
153 name_to_timeout_dict, ["lifeprotips"], 100, 24)
155 #x = reddit_renderer({"Test", 1234}, ["seattle","bellevue"], 50, 24)
156 #x.periodic_render("Scrape")
157 #x.periodic_render("Shuffle")