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 = """
""" % (
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")