Created
April 5, 2016 00:37
-
-
Save 13steinj/ed33d10b27de61cee642e8d9cf5b227a to your computer and use it in GitHub Desktop.
A PRAW3 addon for reddit robin interaction
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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