             direTowers = _GetTowers(match.tower_status_dire).join(", ") or "None"
 
             msg.send "Match ID #{match.match_id} is a #{DOTA_LOBBIES[match.lobby_type].toLowerCase()} game that took place #{date}. The #{victor} won the game in #{duration} minutes. First blood was drawn #{firstBlood} into the game."
+
+            # Generate map image and graphs?
             msg.send "Radiant towers remaining: #{radiantTowers} | Dire towers remaining: #{direTowers}"
+            msg.send "Dotabuff: http://www.dotabuff.com/matches/#{match.match_id}"
 
             additionalInfo = (steamID, type = "Steam ID") ->
                 communityID = _GetCommunityID steamID

                    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}"
                # 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 = DOTA_HEROES[target.hero_id] or "No hero"
                # TODO: W / L TBA
                msg.send "Match ID: #{match.match_id} | Lobby: #{DOTA_LOBBIES[match.lobby_type]} | Hero: #{hero} | #{date}"

