                     msg.reply "The #{type} you have entered (\"#{genericID}\") was not found in Match ID #{match.match_id}."
                     return
                 faction = _GetFaction target.player_slot
-                msg.reply "#{faction} - #{_GetHero(target.hero_id).localized_name} (Lvl #{target.level}) | KDA: #{target.kills}/#{target.deaths}/#{target.assists} | LH: #{target.last_hits} | GPM: #{target.gold_per_min} | XPM: #{target.xp_per_min} | HD: #{target.hero_damage} | TD: #{target.tower_damage} | TGE: #{target.gold_per_min*duration}"
+                hero = DOTA_HEROES[target.hero_id] or "No hero"
+                msg.reply "#{faction} - #{hero} (Lvl #{target.level}) | KDA: #{target.kills}/#{target.deaths}/#{target.assists} | LH: #{target.last_hits} | GPM: #{target.gold_per_min} | XPM: #{target.xp_per_min} | HD: #{target.hero_damage} | TD: #{target.tower_damage} | TGE: #{target.gold_per_min*duration}"
                 # Future (TODO): Team fight contribution? Overall contribution algo.
 
             if genericID?

            for match in history.matches
                date = moment.unix(match.start_time).fromNow()
                target = _GetPlayer communityID, match.players
                hero = _GetHero(target.hero_id)?.localized_name or "No hero"
                # TODO: W / L TBA
                msg.send "Match ID: #{match.match_id} | Lobby: #{DOTA_LOBBIES[match.lobby_type]} | Hero: #{hero} | #{date}"


    if not STEAM_API_KEY?
        return robot.logger.error "Missing STEAM_API_KEY in environment. Please set and try again."

    robot.logger.debug "Loading heroes..."
    GetHeroes robot, (heroes) ->
        DOTA_HEROES = heroes

_PossessionModifier = (noun) ->
    noun += if noun.slice(-1) is "s" then "'" else "'s"
