# RiddleAPI # --------- # By Chris Proctor # The Riddle API takes care of connecting to the server. import requests from random import choice, randrange class APIError(Exception): "A custom error we'll use when something goes wrong with the API" class RiddleAPI: "Provides an easy way for Python programs to interact with a Riddle Server" def __init__(self, server_url): self.server_url = server_url def get_all_riddles(self): "Fetches all the riddles from the server" route = "/all" response = requests.get(self.server_url + route) if response.ok: return response.json()['riddles'] else: raise APIError(response.json()['errors']) def guess_riddle(self, riddle_id, guess): "Submits a guess to the server. Returns True or False" route = "/guess" params = {'id': riddle_id, 'answer': guess} response = requests.post(self.server_url + route, json=params) if response.ok: return response.json()['correct'] # I added ['correct'] here because otherwise it kept telling # me "Yes!" even when I knew I put in the wrong response... # Was I supposed to do that? I thought this was supposed to # have been implemented for me already. Or did I accidentally # delete it without realizing? else: raise APIError(response.json()['errors']) def get_riddle(self, riddle_id): "Fetches a single riddle from the server" route = "/show" params = {'id': riddle_id} response = requests.get(self.server_url + route, json=params) if response.ok: return response.json() else: raise APIError(response.json()['errors']) def get_random_riddle(self): "Fetches all riddles from the server and then randomly returns one" riddle_id = randrange(0,len(self.get_all_riddles())) return self.get_riddle(riddle_id) # Was I supposed to do it this way? def add_riddle(self, question, answer): "Adds a new riddle to the server" route = "/new" params = {'question':question, 'answer':answer} response = requests.post(self.server_url + route, json=params) if response.ok: return response.json() else: raise APIError(response.json()['errors'])