# ============================================================================= API_HOST = "api.smash.gg" API_ENDPOINT = "gql/alpha" API_SCHEME = "https" API_URL = "{scheme}://{host}/{endpoint}".format( scheme = API_SCHEME, host = API_HOST, endpoint = API_ENDPOINT, ) # ============================================================================= # ----------------------------------------------------------------------------- class Player(): """A Player, as registered by the smash.gg API, and their characters choices and placement in a tournament""" CHARACTERS = { } # ------------------------------------------------------------------------- def __init__( self, id, prefix, gamerTag, placement, seeding, twitterHandle = None, chars = {} ) self.id = id self.prefix = prefix self.gamerTag = gamerTag self.placement = placement self.seeding = seeding self.twitterHandle = twitterHandle self.chars = chars # ------------------------------------------------------------------------- def add_character_selection(self, character, win): try: self.chars[character] += ( 1.01 if win else 1.00 ) # This 1.01 / 1.00 tricks should hold until the player loses 101 # matches with one character and wins 100 matches with another... # during one tournament. except KeyError: self.chars[character] = ( 1.01 if win else 1.00 ) # ------------------------------------------------------------------------- def conf(self): charslist = ", ".join( [ "{} ({:.2f})".format(c,self.chars[c]) for c in self.chars ] ) return """ [player {tag}] tag: {tag} team: {pfx} seeding: {seed} placement: {plc} twitter: {twi} characters: {charslist}""" \ .format( tag = self.gamerTag, pfx = self.prefix, seed = self.seeding, plc = self.placement, twi = self.twitterHandle, charslist = charslist, ) # ----------------------------------------------------------------------------- class Tournament(): """A Tournament, as registered by the smash.gg API""" # ------------------------------------------------------------------------- def __init__( self, id, name, slug, startAt, numEntrants, venueAddress = None, venueName = None, city = None, countryCode = None, hashtag = None, ): self.id = id self.name = name self.slug = slug self.startAt = startAt self.numEntrants = numEntrants self.venueAddress = venueAddress self.venueName = venueName self.city = city self.countryCode = countryCode self.hashtag = hashtag # ------------------------------------------------------------------------- def conf(self): return """ [Tournament] name: {name} date: {date} location: {loc} slug: {slug} numEntrants: {nbe}""" \ .format( id = self.id, name = self.name, date = self.startAt, loc = self.venueName, slug = self.slug, nbe = self.numEntrants, ) # ============================================================================= def run_query( query_name, variables = {}, query_dir = "queries", query_extension = "gql", api_url = API_URL, log = None, ): # Load query query_path = os.path.join( query_dir, "{}.{}".format( query_name, query_extension, ) ) query = "" with open(query_path, 'r') as query_file: query = query_file.read() # Build payload payload = { "query": query, "variables": json.dumps(variables), } # Build headers headers = { "Authorization": "Bearer {token}".format(token = args.token), "Accept": "application/json", "Content-Type": "application/json" } # Send the query try: log.debug("Sending query '{}' with variables:".format(query_name)) log.debug(json.dumps(variables)) except AttributeError: pass rv = requests.post( API_URL, json.dumps(payload).encode("utf-8"), headers = headers, proxies = {"http": args.proxy, "https": args.proxy}, ) try: rv_json = rv.json() except Exception as e: log.error("HTTP request failed") log.error(e) log.debug(e, exc_info=True) log.debug(rv) # Try to return the data, or log the error and return None try: log.debug("query complexity : {}" \ .format( rv_json["extensions"]["queryComplexity"], )) return rv_json["data"] except KeyError: try: log.error("GraphQL error") log.error(rv_json) except AttributeError: pass return None