def get_player_info(player_tag: str, api_key: str): endpoint = "/players/%23" + player_tag # may do a little more with info info = make_request(endpoint, api_key) if "reason" in info: handle_error(info['reason']) return info
def request(address, api, method, params={}, cookies={}): """Makes a request to the DiskStation API""" api_path = apis.get(api).get('path') url = f'http://{address}/webapi/{api_path}' params = urllib.parse.urlencode( { 'api': apis.get(api).get('name'), 'version': apis.get(api).get('version'), 'method': method, **params }, quote_via=urllib.parse.quote) try: response_obj = requests.get(url, params=params, cookies=cookies) try: response = response_obj.json() if not response['success']: error_code = response['error']['code'] errors.handle_error(error_code, api) if api == 'auth': errors.handle_auth_error(error_code) if api == 'dsTask': errors.handle_ds_task_error(error_code) return response except json.decoder.JSONDecodeError: print('Invalid request URL') sys.exit() except requests.exceptions.ConnectionError: print('Could not connect to provided address') sys.exit()
def create_service(): if not os.path.exists('credentials.json'): handle_error('no_credentials') scopes = ['https://www.googleapis.com/auth/spreadsheets'] creds = None if os.path.exists('token.pickle'): with open('token.pickle', 'rb') as token: creds = pickle.load(token) try: if not creds or not creds.valid: if creds and creds.expired and creds.refresh_token: creds.refresh(Request()) else: flow = InstalledAppFlow.from_client_secrets_file( 'credentials.json', scopes) creds = flow.run_local_server(port=0) with open('token.pickle', 'wb') as token: pickle.dump(creds, token) service = build('sheets', 'v4', cache_discovery=False, credentials=creds) return service.spreadsheets() except HttpError as error: handle_error('sheets_api', val=error._get_reason())
def get_clan_info(clan_tag: str, api_key: str): endpoint = "/clans/%23" + clan_tag info = make_request(endpoint, api_key) if "reason" in info: handle_error(info['reason']) print(info['reason']) return info
def get_clan_currentwar(clan_tag: str, api_key: str): endpoint = "/clans/%23" + clan_tag + "/currentwar" info = make_request(endpoint, api_key) if "reason" in info: handle_error(info['reason']) if "err" in info: pass return info
def write_to_cell(api, id, cell, val): try: api.values().update(spreadsheetId=id, range=cell, valueInputOption='RAW', body={'values': [[val]]}).execute() except HttpError as error: handle_error('sheets_api', val=error._get_reason())
def cells_from_sheet_ranges(ranges: str): for r in ranges: m = validate_sheet_range(r) if m.group('col1') == m.group('col2'): if m.group('row2'): for i in range(int(m.group('row1')), int(m.group('row2')) + 1): yield f'{m.group("sheet")}!{m.group("col1")}{i}' else: yield r else: handle_error('range', val=r)
def init_scenario_data_kovaaks( config: dict, sheet_api: googleapiclient.discovery.Resource) -> dict: hs_cells_iter = cells_from_sheet_ranges(config['highscore_ranges']) if config["calculate_averages"]: avg_cells_iter = cells_from_sheet_ranges(config['average_ranges']) scens = {} i = 0 for r in config['scenario_name_ranges']: for s in read_sheet_range(sheet_api, config["sheet_id_kovaaks"], r): if s not in scens: scens[s] = Scenario() scens[s].hs_cells.append(next(hs_cells_iter)) if config["calculate_averages"]: try: scens[s].avg_cells.append(next(avg_cells_iter)) except AttributeError as err: handle_error("averages") scens[s].ids.append(i) i += 1 highscores = [] for r in config['highscore_ranges']: highscores += map( lambda x: float(x), read_sheet_range(sheet_api, config["sheet_id_kovaaks"], r)) if config["calculate_averages"]: averages = [] for r in config['average_ranges']: averages += map( lambda x: float(x), read_sheet_range(sheet_api, config["sheet_id_kovaaks"], r)) if len(highscores) < len( scens): # Require highscore cells but not averages handle_error('range_size') for s in scens: scens[s].hs = min([highscores[i] for i in scens[s].ids]) if config["calculate_averages"]: scens[s].avg = min([averages[i] for i in scens[s].ids]) return scens
def read_sheet_range(api, id, sheet_range): try: response = (api.values().get(spreadsheetId=id, range=sheet_range).execute().get( 'values', [['0']])) # responses trim blank cells, act as if they are 0-filled m = validate_sheet_range(sheet_range) length = int(m.group('row2')) - int(m.group('row1')) + 1 for lst in response: if len(lst) < 1: lst.append('0') flat = [val.strip().lower() for row in response for val in row] while len(flat) < length: flat.append('0') return flat except HttpError as error: handle_error('sheets_api', val=error._get_reason())
if len(sys.argv) > 1: config_file = sys.argv[1] if not os.path.isfile(config_file): logging.error("Failed to find config file: %s", config_file) sys.exit(1) config = json.load(open(config_file, 'r')) gui = Gui(**config) gui.main() try: config = json.load(open(config_file, 'r')) logging.debug(json.dumps(config, indent=2)) except Exception as err: logging.debug(json.dumps(config, indent=2)) handle_error('no_credentials') logging.debug("Creating service...") sheet_api = create_service() logging.debug("Initializing version blacklist...") blacklist = init_version_blacklist() logging.debug("Initializing scenario data...") scenarios = init_scenario_data(config, sheet_api) stats = list(sorted(os.listdir(config['stats_path']))) update(config, scenarios, stats, blacklist) if config['run_mode'] == 'once': logging.info("Finished Updating, program will close in 3 seconds...") time.sleep(3)
def get_locations(api_key): endpoint = "/locations" info = make_request(endpoint, api_key) if "reason" in info: handle_error(info['reason']) return info
def get_tournament_info(tournament_tag, api_key): endpoint = "/tournaments/%23" + tournament_tag info = make_request(endpoint, api_key) if "reason" in info: handle_error(info['reason']) return info
def get_player_battlelog(player_tag, api_key): endpoint = "/players/%23" + player_tag + "/battlelog" info = make_request(endpoint, api_key) if "reason" in info: handle_error(info['reason']) return info
def get_player_upcomingchests(player_tag: str, api_key: str): endpoint = "/players/%23" + player_tag + "/upcomingchests" info = make_request(endpoint, api_key) if "reason" in info: handle_error(info['reason']) return info
def get_clan_warlog(clan_tag, api_key): endpoint = "/clans/%23" + clan_tag + "/warlog" info = make_request(endpoint, api_key) if "reason" in info: handle_error(info['reason']) return info
def get_cards(api_key): info = make_request("/cards", api_key) if "reason" in info: handle_error(info['reason']) return info