                     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?

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

    fs.readFile path.join(__dirname, DOTA_HEROES_DATA_PATH), (err, data) ->
        return robot.logger.error(err) if err
        DOTA_HEROES = msgpack.unpack data

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

            if err or res.statusCode isnt 200
                err = "Bad request (invalid Steam web API key)" if res.statusCode is 400
                msg.reply "An error occurred while attempting to process your request. Please try again later."
                log = if msg.logger? then msg.logger else msg.robot.logger
                return log.error err
            handler JSON.parse(body)

#
