Ejemplo n.º 1
0
 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')
Ejemplo n.º 2
0
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()
Ejemplo n.º 3
0
 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)
Ejemplo n.º 4
0
 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')
Ejemplo n.º 5
0
 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)   
Ejemplo n.º 6
0
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)
Ejemplo n.º 7
0
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)