Esempio n. 1
0
    def getHeader(self):
        if len(self.replayHeader) <= 0:
            # Read the protocol header, this can be read with any protocol
            self.replayHeader = protocol15405.decode_replay_header(
                self.mpqArchive.header['user_data_header']['content'])

        return self.replayHeader
Esempio n. 2
0
def handleMessage(message):
  print "handleMessage from " + message.author.name

  savedReplayName = "tmp/working.SC2Replay"

  replayLink = funcs.isMessageBodyValidLink(message)

  if not replayLink:
    funcs.messageReply(message, "replay link not found in message")
    return False

  urllib.urlretrieve(replayLink, savedReplayName)

  archive = mpyq.MPQArchive(savedReplayName)
  # Read the protocol header, this can be read with any protocol
  contents = archive.header['user_data_header']['content']
  header = protocol15405.decode_replay_header(contents)


  # The header's baseBuild determines which protocol to use
  baseBuild = header['m_version']['m_baseBuild']
  try:
    _temp = __import__('s2protocol', globals(), locals(), ['protocol%s' % (baseBuild,)])
    protocol = getattr(_temp, 'protocol%s' % (baseBuild,))
  except:
    print >> sys.stderr, 'Unsupported base build: %d' % baseBuild
    sys.exit(1)


  contents = archive.read_file('replay.details')
  details = protocol.decode_replay_details(contents)
  events = protocol.decode_replay_message_events(archive.read_file('replay.message.events'))
  return handleReplayDetails(details, message, events)
Esempio n. 3
0
    def getHeader(self):
        if len(self.replayHeader) <= 0:
            # Read the protocol header, this can be read with any protocol
            self.replayHeader = protocol15405.decode_replay_header(
                self.mpqArchive.header["user_data_header"]["content"]
            )

        return self.replayHeader
Esempio n. 4
0
 def _get_replay_reader(self):
     # Read the protocol header, this can be read with any protocol
     contents = self.archive.header['user_data_header']['content']
     header = protocol15405.decode_replay_header(contents)
     # The header's baseBuild determines which protocol to use
     baseBuild = header['m_version']['m_baseBuild']
     protocol_name = 'protocol%s' % (baseBuild, )
     module = __import__('s2protocol', globals(), locals(), [protocol_name],
                         -1)
     return getattr(module, protocol_name)
    def __init__(self, replayFile):

        # The replayFile can be either the name of a file or any object that has a 'read()' method.
        self.mpq = mpyq.MPQArchive(replayFile)

        self.buildStormReplay = protocol15405.decode_replay_header(self.mpq.header['user_data_header']['content'])['m_version']['m_baseBuild']

        try:
            self.protocol = __import__('s2protocol' + '.protocol%s' % self.buildStormReplay, fromlist=['protocol2'])
        except ImportError:
            raise Exception('Unsupported build number: %i' % self.buildStormReplay)
Esempio n. 6
0
 def __init__(self, replay_path):
     self.__archive = mpyq.MPQArchive(replay_path)
     
     # Read the protocol header, this can be read with any protocol
     contents = self.__archive.header['user_data_header']['content']
     self.__header = initial_protocol.decode_replay_header(contents)
     
     # The header's baseBuild determines which protocol to use
     self.__base_build = self.__header['m_version']['m_baseBuild']
     try:
         self.__protocol = __import__('s2protocol'+'.protocol%s' % self.__base_build,fromlist=['protocol2'])
     except:
         print >> sys.stderr, 'Unsupported base build: %d' % self.__base_build
         sys.exit(1)
Esempio n. 7
0
    def __init__(self, replay_path):
        self.__archive = mpyq.MPQArchive(replay_path)

        # Read the protocol header, this can be read with any protocol
        contents = self.__archive.header['user_data_header']['content']
        self.__header = initial_protocol.decode_replay_header(contents)

        # The header's baseBuild determines which protocol to use
        self.__base_build = self.__header['m_version']['m_baseBuild']
        try:
            self.__protocol = __import__('s2protocol' +
                                         '.protocol%s' % self.__base_build,
                                         fromlist=['protocol2'])
        except:
            print >> sys.stderr, 'Unsupported base build: %d' % self.__base_build
            sys.exit(1)
Esempio n. 8
0
    def __init__(self, replayFile):

        # The replayFile can be either the name of a file or any object that has a 'read()' method.
        self.mpq = mpyq.MPQArchive(replayFile)

        self.buildStormReplay = protocol15405.decode_replay_header(
            self.mpq.header['user_data_header']
            ['content'])['m_version']['m_baseBuild']

        try:
            self.protocol = __import__('s2protocol' +
                                       '.protocol%s' % self.buildStormReplay,
                                       fromlist=['protocol2'])
        except ImportError:
            raise Exception('Unsupported build number: %i' %
                            self.buildStormReplay)
Esempio n. 9
0
def parse_replay(args):
    """
    Parse replay for build order related events
    """
    archive = mpyq.MPQArchive(args.replay_file)

    contents = archive.header['user_data_header']['content']
    header = protocol15405.decode_replay_header(contents)

    base_build = header['m_version']['m_baseBuild']
    parsed_data = {'build': base_build}

    protocol = get_protocol(base_build)
    if not protocol:
        raise ReplayFormatError('Could locate the replay version')

    contents = archive.read_file('replay.details')
    details = protocol.decode_replay_details(contents)
    parsed_data['numPlayers'] = len(details["m_playerList"])
    parsed_data['map'] = details['m_title']
    parsed_data['players'] = [
        {
            'name': raw_data['m_name'],
            'race': raw_data['m_race'],
            'is_winner': raw_data['m_result'] == 1,
            'supply': [[0, 6]]
        } for raw_data in details['m_playerList']
    ]

    return parse_events(
        archive, 
        args.cutoff_time, 
        header, 
        parsed_data, 
        protocol
    )
Esempio n. 10
0
def load(load_args):
    parser = argparse.ArgumentParser()
    parser.add_argument('replay_file', help='.SC2Replay file to load')
    parser.add_argument("--gameevents", help="print game events",
                        action="store_true")
    parser.add_argument("--messageevents", help="print message events",
                        action="store_true")
    parser.add_argument("--trackerevents", help="print tracker events",
                        action="store_true")
    parser.add_argument("--attributeevents", help="print attributes events",
                        action="store_true")
    parser.add_argument("--header", help="print protocol header",
                        action="store_true")
    parser.add_argument("--details", help="print protocol details",
                        action="store_true")
    parser.add_argument("--initdata", help="print protocol initdata",
                        action="store_true")
    parser.add_argument("--stats", help="print stats",
                        action="store_true")
    args = parser.parse_args(load_args)
	
    archive = mpyq.MPQArchive(args.replay_file)
    
    logger = EventLogger()

    # Read the protocol header, this can be read with any protocol
    contents = archive.header['user_data_header']['content']
    header = protocol15405.decode_replay_header(contents)
    if args.header:
        logger.log(sys.stdout, header)

    # The header's baseBuild determines which protocol to use
    baseBuild = header['m_version']['m_baseBuild']
    sys.path.append('s2protocol/')
    try:
        protocol = __import__('protocol%s' % (baseBuild,))
    except:
        print >> sys.stderr, 'Unsupported base build: %d' % baseBuild
        sys.exit(1)
	
    # Print protocol details
    if args.details:
        contents = archive.read_file('replay.details')
        details = protocol.decode_replay_details(contents)
        logger.log(sys.stdout, details)

    # Print protocol init data
    if args.initdata:
        contents = archive.read_file('replay.initData')
        initdata = protocol.decode_replay_initdata(contents)
        logger.log(sys.stdout, initdata['m_syncLobbyState']['m_gameDescription']['m_cacheHandles'])
        logger.log(sys.stdout, initdata)

    # Print game events and/or game events stats
    if args.gameevents:
        contents = archive.read_file('replay.game.events')
        for event in protocol.decode_replay_game_events(contents):
            logger.log(sys.stdout, event)

    # Print message events
    if args.messageevents:
        contents = archive.read_file('replay.message.events')
        for event in protocol.decode_replay_message_events(contents):
            logger.log(sys.stdout, event)

    # Print tracker events
    if args.trackerevents:
        if hasattr(protocol, 'decode_replay_tracker_events'):
            contents = archive.read_file('replay.tracker.events')
            for event in protocol.decode_replay_tracker_events(contents):
                logger.log(sys.stdout, event)

    # Print attributes events
    if args.attributeevents:
        contents = archive.read_file('replay.attributes.events')
        attributes = protocol.decode_replay_attributes_events(contents)
        logger.log(sys.stdout, attributes)
        
    # Print stats
    if args.stats:
        logger.log_stats(sys.stderr)
	
	return logger
Esempio n. 11
0
from s2protocol.mpyq import mpyq
from s2protocol import protocol15405
import argparse
import sys

# Unarchive the file

parser = argparse.ArgumentParser()
parser.add_argument('replay_file', help='.SC2Replay file to load')
args = parser.parse_args()
archive = mpyq.MPQArchive(args.replay_file)

# Import the correct build protocol

contents = archive.header['user_data_header']['content']
header = protocol15405.decode_replay_header(contents)
baseBuild = header['m_version']['m_baseBuild']
print baseBuild

try:
    protocol = 'protocol%s' % baseBuild
    module = __import__('s2protocol',globals(),locals(),[protocol],-1)
    protocol = getattr(module, protocol)

except:
    print >> sys.stderr, 'Unsupported base build: %d' % baseBuild
    sys.exit(1)

# Extract initdata
contents = archive.read_file('replay.initData')
initdata = protocol.decode_replay_initdata(contents)
Esempio n. 12
0
def load(load_args):
    parser = argparse.ArgumentParser()
    parser.add_argument('replay_file', help='.SC2Replay file to load')
    parser.add_argument("--gameevents",
                        help="print game events",
                        action="store_true")
    parser.add_argument("--messageevents",
                        help="print message events",
                        action="store_true")
    parser.add_argument("--trackerevents",
                        help="print tracker events",
                        action="store_true")
    parser.add_argument("--attributeevents",
                        help="print attributes events",
                        action="store_true")
    parser.add_argument("--header",
                        help="print protocol header",
                        action="store_true")
    parser.add_argument("--details",
                        help="print protocol details",
                        action="store_true")
    parser.add_argument("--initdata",
                        help="print protocol initdata",
                        action="store_true")
    parser.add_argument("--stats", help="print stats", action="store_true")
    args = parser.parse_args(load_args)

    archive = mpyq.MPQArchive(args.replay_file)

    logger = EventLogger()

    # Read the protocol header, this can be read with any protocol
    contents = archive.header['user_data_header']['content']
    header = protocol15405.decode_replay_header(contents)
    if args.header:
        logger.log(sys.stdout, header)

    # The header's baseBuild determines which protocol to use
    baseBuild = header['m_version']['m_baseBuild']
    sys.path.append('s2protocol/')
    try:
        protocol = __import__('protocol%s' % (baseBuild, ))
    except:
        print >> sys.stderr, 'Unsupported base build: %d' % baseBuild
        sys.exit(1)

    # Print protocol details
    if args.details:
        contents = archive.read_file('replay.details')
        details = protocol.decode_replay_details(contents)
        logger.log(sys.stdout, details)

    # Print protocol init data
    if args.initdata:
        contents = archive.read_file('replay.initData')
        initdata = protocol.decode_replay_initdata(contents)
        logger.log(
            sys.stdout, initdata['m_syncLobbyState']['m_gameDescription']
            ['m_cacheHandles'])
        logger.log(sys.stdout, initdata)

    # Print game events and/or game events stats
    if args.gameevents:
        contents = archive.read_file('replay.game.events')
        for event in protocol.decode_replay_game_events(contents):
            logger.log(sys.stdout, event)

    # Print message events
    if args.messageevents:
        contents = archive.read_file('replay.message.events')
        for event in protocol.decode_replay_message_events(contents):
            logger.log(sys.stdout, event)

    # Print tracker events
    if args.trackerevents:
        if hasattr(protocol, 'decode_replay_tracker_events'):
            contents = archive.read_file('replay.tracker.events')
            for event in protocol.decode_replay_tracker_events(contents):
                logger.log(sys.stdout, event)

    # Print attributes events
    if args.attributeevents:
        contents = archive.read_file('replay.attributes.events')
        attributes = protocol.decode_replay_attributes_events(contents)
        logger.log(sys.stdout, attributes)

    # Print stats
    if args.stats:
        logger.log_stats(sys.stderr)

        return logger
Esempio n. 13
0
def parse_replay(file_name):
    archive = mpyq.MPQArchive(file_name)

    contents = archive.header['user_data_header']['content']
    header = protocol15405.decode_replay_header(contents)

    baseBuild = header['m_version']['m_baseBuild']
    try:
        protocol_name = 'protocol%s' % (baseBuild,)
        _temp = __import__('s2protocol', globals(), locals(), [protocol_name])
        protocol = getattr(_temp, protocol_name)
    except:
        return False

    builds = [GameTimeline() for i in range(2)]
    supplies = [[[0, 6]] for i in range(2)]

    if hasattr(protocol, 'decode_replay_tracker_events'):
        contents = archive.read_file('replay.tracker.events')

        for event in protocol.decode_replay_tracker_events(contents):
            event_type = event['_event']
            if event['_gameloop'] == 0:
                continue
            if event_type == 'NNet.Replay.Tracker.SPlayerStatsEvent':
                supplies[event['m_playerId'] - 1].append(
                        [event['_gameloop'], event['m_stats']['m_scoreValueFoodUsed'] / 4096])
            elif event_type == 'NNet.Replay.Tracker.SUnitBornEvent':  # need to reverse this
                player = event['m_controlPlayerId']
                unit_name = event['m_unitTypeName']
                if unit_name in BO_EXCLUDED or player == 0:
                    continue
                try:
                    gameloop = event['_gameloop'] - BUILD_TIMES[unit_name]
                except KeyError:
                    gameloop = event['_gameloop']
                    unit_name += ' (Error on time)'
                supply = get_supply(supplies[player - 1], gameloop)
                builds[player - 1].add_event(BuildEvent(unit_name, gameloop, supply))
            elif event_type == 'NNet.Replay.Tracker.SUnitInitEvent':
                player = event['m_controlPlayerId']
                unit_name = event['m_unitTypeName']
                if unit_name in BO_EXCLUDED or player == 0:
                    continue
                gameloop = event['_gameloop']
                supply = supplies[player - 1][-1][1]
                builds[player - 1].add_event(BuildEvent(unit_name, gameloop, supply))
            elif event_type == 'NNet.Replay.Tracker.SUpgradeEvent':  # need to reverse this
                player = event['m_playerId']
                if player == 0:
                    continue
                unit_name = event['m_upgradeTypeName']
                try:
                    gameloop = event['_gameloop'] - BUILD_TIMES[unit_name]
                except KeyError:
                    gameloop = event['_gameloop']
                    unit_name += ' (Error on time)'
                supply = get_supply(supplies[player - 1], gameloop)
                builds[player - 1].add_event(BuildEvent(unit_name, gameloop, supply))

        for build in builds:
            build.sort()

        return [unicode(build) for build in builds]

    return False