def test_get_events(self): add_match(0,0) add_event(0,0) rv = self.app.get('/getEventsForMatchId/0') data = json.loads(rv.get_data(as_text=True)) self.assertEqual(len(data),1) self.assertEqual(data[0][0], 0) self.assertEqual(data[0][1], 'Sat, 21 Jan 2017 10:10:10 GMT') self.assertEqual(data[0][2], 'Arsenal') self.assertEqual(data[0][3], 'Hull') self.assertEqual(data[0][4], 'BPL') self.assertEqual(data[0][5], 0) self.assertEqual(data[0][6], 0) self.assertEqual(data[0][7], 'Sample description') self.assertEqual(data[0][8], 'Sample question') add_event(1,0) add_match(1,0) update(1, 'events') rv = self.app.get('/getEventsForMatchId/1') data = json.loads(rv.get_data(as_text=True)) #print(data) self.assertEqual(len(data),1) self.assertEqual(data[0][0], 1) self.assertEqual(data[0][1], 'Sat, 21 Jan 2017 10:10:10 GMT') self.assertEqual(data[0][2], 'Arsenal') self.assertEqual(data[0][3], 'Hull') self.assertEqual(data[0][4], 'BPL') self.assertEqual(data[0][5], 0) self.assertEqual(data[0][6], 1) self.assertEqual(data[0][7], 'Changed description') self.assertEqual(data[0][8], 'Changed question')
def database_calls(): req_type = request.json['request_type'] if req_type == "get top user scores": return database.get_top_user_scores() elif req_type == "get top bot scores": return database.get_top_bot_scores() elif req_type == "add match": try: return database.add_match(request.json['HumanUsername'], request.json['BotUsername'], request.json['MatchType']) except Exception as e: logf = open("appErrors.log", "a") logf.write(err) logf.close() return 0 elif req_type == "update human score": return database.update_human_score(request.json["HumanScore"], request.json["SessionID"]) elif req_type == "update bot score": return database.update_bot_score(request.json["BotScore"], request.json["SessionID"]) elif req_type == "delete old scores": return database.delete_old_scores() elif req_type == "get QA": return database.get_bot_QA()
def test_get_votes(self): create_role() add_user(0) add_match(0,0) add_event(0,0) vote(0,0,0) rv = self.app.get('/getVotesForEventId/0') # returns vote id , user id, vote, event id / vote is always 1 data = json.loads(rv.get_data(as_text=True)) self.assertEqual(len(data),1) self.assertEqual(data[0][0], 0) self.assertEqual(data[0][1], 0) self.assertEqual(data[0][2], 1) self.assertEqual(data[0][3], 0) add_user(1) vote(1,1,0) rv = self.app.get('/getVotesForEventId/0') data = json.loads(rv.get_data(as_text=True)) self.assertEqual(len(data),2)
def test_media(self): add_match(0,0) add_event(0,0) add_media(0,0) rv = self.app.get('/getMediaForEventId/0') # returns media id, event id , media type, media url / media type for test is always 0 data = json.loads(rv.get_data(as_text=True)) self.assertEqual(len(data),1) self.assertEqual(data[0][0], 0) self.assertEqual(data[0][1], 0) self.assertEqual(data[0][2], 0) self.assertEqual(data[0][3], 'Sample url') add_event(1,0) update(0,'media') rv = self.app.get('/getMediaForEventId/1') data = json.loads(rv.get_data(as_text=True)) self.assertEqual(len(data),1) self.assertEqual(data[0][0], 0) self.assertEqual(data[0][1], 1) self.assertEqual(data[0][2], 1) self.assertEqual(data[0][3], 'Changed url')
def test_get_active(self): add_match(0,0) add_match(1,1) rv = self.app.get('/getActiveMatches') #print(rv.data) data = json.loads(rv.get_data(as_text=True)) self.assertEqual(len(data), 1) self.assertEqual(data[0][0], 1) self.assertEqual(data[0][1], 'Sat, 21 Jan 2017 10:10:10 GMT') self.assertEqual(data[0][2], 'Arsenal') self.assertEqual(data[0][3], 'Hull') self.assertEqual(data[0][4], 'BPL') self.assertEqual(data[0][5], 1) update(0,'matches') rv = self.app.get('/getActiveMatches') data = json.loads(rv.get_data(as_text=True)) #print(data) self.assertEqual(len(data), 2) self.assertEqual(data[0][0], 0) self.assertEqual(data[0][1], 'Sun, 21 Jan 2018 10:10:10 GMT') self.assertEqual(data[0][2], 'Changed team a') self.assertEqual(data[0][3], 'Changed team b') self.assertEqual(data[0][4], 'Changed competition') self.assertEqual(data[0][5], 1)
def get_match_details(match_id): url = "http://api.steampowered.com/IDOTA2Match_570/GetMatchDetails/V001/" querystring = {"match_id": match_id, "key": WebAPIKey} try: time.sleep(1) parsed_data = requests.request("GET", url, params=querystring, timeout=3).json() except TimeoutError: print('The request timed out') else: if debug: print('Request Received') # Check if data has expired yet from valve if 'hero_damage' not in parsed_data['result']['players'][0]: if debug: print('Match Data Expired') return radiant_win = int(parsed_data['result']['radiant_win']) match_date_time = parsed_data['result']['start_time'] match_duration = parsed_data['result']['duration'] match_seq_num = parsed_data['result']['match_seq_num'] first_blood_time = parsed_data['result']['first_blood_time'] game_mode = parsed_data['result']['game_mode'] match_id = match_id if debug: print("====== Match Number: " + str(match_id) + " ======") print('radiant win:', radiant_win) print('date and time of match:', match_date_time) print('match_duration:', match_duration) print('match_seq_num:', match_seq_num) print('first_blood:', first_blood_time) print('game_mode:', game_mode) print('match id:', match_id) for player in parsed_data['result']['players']: if player['account_id'] == steam_id: hero_id = player['hero_id'] kills = player['kills'] deaths = player['deaths'] assists = player['assists'] leaver_status = player['leaver_status'] last_hits = player['last_hits'] denies = player['denies'] gold_per_min = player['gold_per_min'] xp_per_min = player['xp_per_min'] hero_level = player['level'] hero_damage = player['hero_damage'] tower_damage = player['tower_damage'] hero_healing = player['hero_healing'] remaining_gold = player['gold'] gold_spent = player['gold_spent'] dire_team = bin(player['player_slot'])[2:].zfill(8)[0] item_list = [] item_list.append(player['item_0']) item_list.append(player['item_1']) item_list.append(player['item_2']) item_list.append(player['item_3']) item_list.append(player['item_4']) item_list.append(player['item_5']) backpack_list = [] backpack_list.append(player['backpack_0']) backpack_list.append(player['backpack_1']) backpack_list.append(player['backpack_2']) # convert list to string to store in database items_json = json.dumps(item_list) backpack_json = json.dumps(backpack_list) hero_abilities = json.dumps(player['ability_upgrades']) # check if match exists otherwise INSERT data if not check_match_exists(match_id): add_match(match_id, game_mode, radiant_win, dire_team, hero_id, hero_level, kills, deaths, assists, last_hits, denies, gold_per_min, xp_per_min, hero_damage, tower_damage, hero_healing, remaining_gold, gold_spent, items_json, backpack_json, hero_abilities, first_blood_time, match_duration, match_seq_num, leaver_status, match_date_time) # Output if debug: print('Match ID', match_id) print('Hero ID:', hero_id) print('Kills:', kills) print('Deaths:', deaths) print('Assists:', assists) print('Leaver Status:', leaver_status) print('last_hits:', last_hits) print('Denies:', denies) print('Gold Per Minute:', gold_per_min) print('XP Per Minute:', xp_per_min) print('Hero Level:', hero_level) print('Hero Damage:', hero_damage) print('Tower Damage:', tower_damage) print('Hero Healing:', hero_healing) print('Remaining gold:', remaining_gold) print('Gold Spent:', gold_spent) print('Item List:', item_list) print('Backpack List:', backpack_list) print('Radiant Team:', dire_team)
def main(): # Read the config file config = configparser.ConfigParser() config.read('config.ini') # Setup progress logger progress_log = setup_logger('progress', str(config['PARMS']['s_logfile']) + '.log') # Init database connection and API manager database_connection = db.create_connection( (config['DATABASE']['name'] + '.db')) API = APIManager(config['API']['key']) summoner_info = API.get_summoner_info(name=config['PARMS']['summoner']) time.sleep(1.4) end = False if not summoner_info is None: b_index = int(config['PARMS']['bIndex']) e_index = int(config['PARMS']['eIndex']) i = 1 summoner = db.get_summoner(database_connection, summoner_info['id']) if summoner == -1: summoner_data = get_summoner_data(summoner_info) summoner = db.add_summoner(database_connection, summoner_data) if bool(int(config['PARMS']['t_override'])): max_timestamp = 0 else: max_timestamp = db.get_max_of(database_connection, ('timestamp', 'matches')) # Clamp max_timestamp if max_timestamp < SEASON10: max_timestamp = SEASON10 total_matches = 0 # Main loop starts here while not end: progress_log.info("Getting matches between {} and {}.".format( b_index, e_index)) data = API.get_match_history(summoner_info['accountId'], queue='420', beginIndex=str(b_index), endIndex=str(e_index), season='13') time.sleep(1.4) if data is None: progress_log.error( "Getting matches between {} and {} failed!".format( b_index, e_index)) break else: matches = data['matches'] for match in matches: progress_log.info("Working on match {}...".format( match['gameId'])) if int(match['timestamp']) < max_timestamp: progress_log.info("Timestamp limit reached! Exiting.") end = True break if db.get_match(database_connection, match['gameId']) != (-1): progress_log.info( "Skipping match {}, already exists".format( match['gameId'])) else: match_details = API.get_match_details(match['gameId']) time.sleep(1.4) match_timeline = API.get_match_timeline( match['gameId']) time.sleep(1.4) if match_timeline is None: progress_log.warning( "Getting match timeline for matchId {} failed!" .format(match['gameId'])) match_timeline = "Unavailable" if match_details is None: progress_log.warning( "Getting match details for matchId {} failed!". format(match['gameId'])) continue else: match_data = get_match_data( match, match_details, match_timeline, summoner[0][0]) if match_data is None: progress_log.error("Match data empty!") end = True break participants = get_participants_data(match_details) db.add_match(database_connection, match_data) total_matches += 1 progress_log.info( "Adding participants for match {}...".format( match['gameId'])) for participant_data in participants: participant = API.get_summoner_info( summonerId=participant_data[8]) time.sleep(1.3) if participant is None: progress_log.warning( "Summoner info empty!") participant_data += (999, ) else: participant_data += (int( participant['summonerLevel']), ) ranked_info = API.get_summoner_ranked_info( participant_data[8]) time.sleep(1.35) participant_data += (int( round(time.time() * 1000)), ) if ranked_info is None: progress_log.warning( "Ranked info not available!") participant_data += ("Unavailable", ) participant_data += (-1, ) participant_data += (-1, ) elif len(ranked_info) == 0: participant_data += ("Unranked", ) participant_data += (-1, ) participant_data += (-1, ) else: flag = False for ranked in ranked_info: if ranked[ 'queueType'] == "RANKED_SOLO_5x5": participant_data += ( str(ranked['tier']) + " " + str(ranked['rank']), ) participant_data += (int( ranked['wins']), ) participant_data += (int( ranked['losses']), ) flag = True if not flag: progress_log.info( "Soloqueue rank for summoner {} not found, treating as unranked..." .format(participant_data[8])) participant_data += ("Unranked", ) participant_data += (-1, ) participant_data += (-1, ) if db.get_summoner( database_connection, participant_data[8]) == (-1): db.add_summoner( database_connection, get_summoner_data(participant)) db.add_participant(database_connection, participant_data) progress_log.info("Cycle {} finished, END = {}".format(i, end)) progress_log.info("Total matches loaded: {}".format(total_matches)) b_index += 100 e_index += 100 i += 1 db.close_connection(database_connection)