# RiddleAPI # --------- # By Chris Proctor # The Riddle API takes care of connecting to the server. import requests from random import choice class APIError(Exception): "A custom error we'll use when something goes wrong with the API" pass 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().get('riddles', []) else: raise APIError(response.json().get('errors', 'Unknown API error')) 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() else: raise APIError(response.json().get('errors', 'Unknown API error')) 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, params=params) if not response.ok: raise APIError(response.json().get('errors', 'Unknown API error')) data = response.json() # Handle either 'riddles' list or 'riddle' key if 'riddles' in data and len(data['riddles']) > 0: return data['riddles'][0] elif 'riddle' in data: return data['riddle'] else: raise APIError(f"No riddle found with id {riddle_id}") def get_random_riddle(self): "Fetches all riddles from the server and then randomly returns one" riddles = self.get_all_riddles() if riddles: return choice(riddles) else: raise APIError("No riddles available to choose from") 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() # usually returns the new riddle info else: raise APIError(response.json().get('errors', 'Unknown API error'))