Skip to content

Instantly share code, notes, and snippets.

@13steinj
Created April 5, 2016 00:37
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save 13steinj/ed33d10b27de61cee642e8d9cf5b227a to your computer and use it in GitHub Desktop.
Save 13steinj/ed33d10b27de61cee642e8d9cf5b227a to your computer and use it in GitHub Desktop.
A PRAW3 addon for reddit robin interaction
import json
from praw import Reddit
from praw.objects import RedditContentObject, Redditor
class Reddit(Reddit):
def __init__(self, *args, **kwargs):
super(Reddit, self).__init__(*args, **kwargs)
self.__inject_config()
def __inject_config(self):
type(self.config).API_PATHS['robin_join'] = 'api/join_room'
type(self.config).API_PATHS['robin_assignment'] = 'api/room_assignment'
type(self.config).API_PATHS['robin_vote'] = 'api/robin/{room_id}/vote'
type(self.config).API_PATHS['robin_leave'] = 'api/robin/{room_id}/leave_room'
type(self.config).API_PATHS['robin_message'] = 'api/robin/{room_id}/message'
type(self.config).API_PATHS['robin'] = 'robin'
type(self.config).WWW_PATHS.add('robin')
def join_robin(self, return_room=True, **kwargs):
resp = self.request(self.config['robin_join'], data={'api_type': 'json'})
if return_room:
resp = self.get_robin_room(**kwargs)
else:
resp = self.request_json(self.config['robin_assignment'])
return resp
def get_robin_room(self, **kwargs):
ret = RobinRoom._fetch_raw(self, **kwargs)
if not kwargs.get('as_objects', True):
return ret
return RobinRoom.from_api_response(self, ret)
class RobinRoom(RedditContentObject):
votemap = {
"NOVOTE" : "NOVOTE",
"ABANDON" : "ABANDON",
"STAY" : "CONTINUE",
"GROW" : "INCREASE",
}
def _get_json_dict(self):
return self._fetch_raw(self.reddit_session)
@classmethod
def _fetch_raw(cls, reddit_session, **kwargs):
resp = reddit_session.request(reddit_session.config['robin'], **kwargs)
ret = json.loads(resp.text.split('<script type="text/javascript" id="config">r.setup(')[1].split(')</script>')[0])
reddit_session.modhash = ret.pop('modhash', reddit_session.modhash)
data = {k: ret["robin_"+k] for k in ["room_id", "room_name", "room_reap_time", "room_date",
"room_is_continued", "websocket_url", "user_list"]}
data['room_date'] = int(data['room_date']) / 1000
data['room_reap_time'] = int(data['room_reap_time']) / 1000
for userdict in data['user_list']:
userdict['user'] = Redditor(reddit_session, userdict.pop('name'))
return data
@classmethod
def _validate_vote(cls, vote):
vote = vote.upper()
vote = cls.votemap.get(vote, vote)
if vote not in cls.votemap.values():
votes = set(cls.votemap.keys()).union(set(cls.votemap.values()))
raise ValueError("vote must be one of {0}".format(votes))
return vote
def vote(self, vote):
vote = self._validate_vote(vote)
data = {
"winning_vote": "NOVOTE",
"vote": vote,
"room_name": self.room_name,
"room_id": self.room_id
}
return self.reddit_session.request_json(
self.reddit_session.config['robin_vote'].format(room_id=self.room_id), data=data)
def leave(self):
return self.reddit_session.request_json(
self.reddit_session.config['robin_leave'].format(room_id=self.room_id), data={'api_type': 'json'})
def send_message(self, message):
return self.reddit_session.request_json(
self.reddit_session.config['robin_message'].format(room_id=self.room_id), data={'message': message})
def refresh(self):
unique = self.reddit_session._unique_count
self.reddit_session._unique_count += 1
self.__dict__ = self.reddit_session.get_robin_room(params={'uniq': unique}).__dict__
return self
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment