Skip to content

Instantly share code, notes, and snippets.

@TheEnigmaBlade
Created March 13, 2016 19:42
Show Gist options
  • Save TheEnigmaBlade/593921fe2e3c40e8eeec to your computer and use it in GitHub Desktop.
Save TheEnigmaBlade/593921fe2e3c40e8eeec to your computer and use it in GitHub Desktop.
Framework for injecting a script-generated section into a subreddit sidebar.
#!/usr/bin/env python3
##########
# Config #
##########
oauth_key = ""
oauth_secret = ""
username = ""
password = ""
useragent = ""
subreddit = ""
delimiter = "######"
cache_file = "old_sidebar.md"
force_update = False
def create_sidebar_insert():
return ""
##############
# Code stuff #
##############
import config as c
import praw_script_oauth as reddit
from praw.errors import *
import html
from requests.exceptions import HTTPError
# Reddit interaction
def get_sidebar(sub):
try:
settings = sub.get_settings()
if "description" in settings:
return html.unescape(settings["description"])
except (ModeratorRequired, ModeratorOrScopeRequired):
print("Error: Mod authorization required")
except HTTPError as e:
code = e.response.status_code
if code == 403:
print("Error: Mod authorization required (HTTP 403)")
else:
print("Error: Failed to load page, {} ({}) returned by server".format(code, e.response))
return None
def set_sidebar(sub, sidebar):
try:
sub.update_settings(description=sidebar)
return True
except (ModeratorRequired, ModeratorOrScopeRequired):
print("Error: Mod authorization required")
except HTTPError as e:
code = e.response.status_code
if code == 403:
print("Error: Mod authorization required (HTTP 403)")
else:
print("Error: Failed to load page, {} ({}) returned by server".format(code, e.response))
return False
def sidebar_inject(sidebar, to_inject):
inject_start = sidebar.find(delimiter)
inject_end = sidebar.rfind(delimiter)
inject_end = sidebar.find("\n", inject_end)
inject_end = len(sidebar) if inject_end == -1 else inject_end + 2
if inject_start == -1 or inject_start == inject_end:
return sidebar
sidebar_1 = sidebar[:inject_start]
sidebar_2 = sidebar[inject_end:]
return sidebar_1 + \
delimiter+" START AUTO-GENERATION, DO NOT TOUCH\n\n" + \
to_inject + "\n\n" + \
delimiter+" END AUTO-GENERATION\n\n" + \
sidebar_2
# Caching
def load_local_sidebar():
try:
with open(cache_file, "r") as f:
return f.read()
except:
print("Sidebar save failed or none exists")
return None
def save_local_sidebar(sidebar):
with open(cache_file, "w") as f:
f.write(sidebar)
# Main
def main():
print("Generating sidebar")
sidebar_insert = create_sidebar_insert()
if not sidebar_insert:
print(" No insert provided")
return
# Check for local changes
old_sidebar_insert = load_local_sidebar()
if not force_update and sidebar_insert == old_sidebar_insert:
print(" No change!")
return
# Update sidebar
print("Connecting to Reddit")
r = reddit.connect(oauth_key, oauth_secret, username, password, useragent=useragent, oauth_scopes={"read", "modconfig"})
if r is None:
print(" Instance creation failed")
return
sub = r.get_subreddit(subreddit, fetch=False)
sidebar = get_sidebar(sub)
if sidebar is None:
return
print("Updating sidebar")
new_sidebar = sidebar_inject(sidebar, sidebar_insert)
if force_update or new_sidebar != sidebar:
if set_sidebar(sub, new_sidebar):
save_local_sidebar(sidebar_insert)
else:
print(" No change!")
if __name__ == "__main__":
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment