Example #1
0
    def open_file(self):
        self.file = open(self.path, "rb")

        # skips the file identifier and revision ID
        self.file.seek(7)
        self.length = utils.decode_number(self.file.read(2))
        self.file.seek(1, 1)
        self.position = 1
Example #2
0
def decode_filter(filter_dict, block):
    """Decodes a filter as expected by eth_newFilter or eth_getLogs to a :class:`Filter`."""
    if not isinstance(filter_dict, dict):
        raise Exception('Filter must be an object')
    address = filter_dict.get('address', None)
    if utils.is_string(address):
        addresses = [decode_hex(strip_0x(address))]
    elif isinstance(address, Iterable):
        addresses = [decode_hex(strip_0x(addr)) for addr in address]
    elif address is None:
        addresses = None
    else:
        raise Exception('Parameter must be address or list of addresses')
    if 'topics' in filter_dict:
        topics = []
        for topic in filter_dict['topics']:
            if topic is not None:
                topics.append(utils.big_endian_to_int(decode_hex(strip_0x(topic))))
            else:
                topics.append(None)
    else:
        topics = None

    from_block = filter_dict.get('fromBlock') or 'latest'
    to_block = filter_dict.get('toBlock') or 'latest'

    if from_block not in ('earliest', 'latest', 'pending'):
        from_block = decode_number(from_block)

    if to_block not in ('earliest', 'latest', 'pending'):
        to_block = decode_number(to_block)

    # check order
    block_id_dict = {
        'earliest': 0,
        'latest': block.number,
        'pending': block.number+1
    }
    range_ = [b if utils.is_numeric(b) else block_id_dict[b] for b in (from_block, to_block)]
    if range_[0] > range_[1]:
        raise Exception('fromBlock must be newer or equal to toBlock')

    return {"from_block": from_block, "to_block": to_block, "addresses": addresses, "topics": topics}
Example #3
0
    def getChanges(self):
        block_hashes = []
        current_block_number = evm.block.number

        for block_number in range(decode_number(self.last_check), current_block_number):
            block = self.evm.blocks[block_number]
            block_hashes.append('0x' + encode_hex(block.hash))

            if block_number >= len(self._hash_log):
                self._hash_log.append(block_hashes[-1])

        self.last_check = current_block_number
        return block_hashes
Example #4
0
    def read(self):
        if self.file is None:
            self.open_file()

        if self.position > self.length:
            return False

        spell = Spell()
        spell.id = self.position
        name_size = utils.decode_number(self.file.read(1))
        shout_size = utils.decode_number(self.file.read(1))
        spell.name = self.file.read(name_size).decode("utf-8")
        spell.shout = self.file.read(shout_size).decode("utf-8")

        if spell.name == "eof":
            return False

        buf = self.file.read(self.data_size)
        spell.icon = utils.decode_number([buf[0], buf[1]])
        spell.graphic = utils.decode_number([buf[2], buf[3]])
        spell.tp = utils.decode_number([buf[4], buf[5]])
        spell.sp = utils.decode_number([buf[6], buf[7]])
        spell.cast_time = utils.decode_number([buf[8]])
        spell.type = Type(utils.decode_number([buf[11]]))
        spell.target_restrict = TargetRestrict(utils.decode_number([buf[17]]))
        spell.target = Target(utils.decode_number([buf[18]]))
        spell.min_damage = utils.decode_number([buf[23], buf[24]])
        spell.max_damage = utils.decode_number([buf[25], buf[26]])
        spell.accuracy = utils.decode_number([buf[27], buf[28]])
        spell.hp = utils.decode_number([buf[34], buf[35]])

        self._spell = spell
        self.position += 1
        return True
Example #5
0
 def open_file(self):
     self.file = open(self.path, "rb")
     self.file.seek(7)
     self.length = utils.decode_number(self.file.read(2))
     self.file.seek(1, 1)
     self.position = 1
Example #6
0
    def read(self):
        if self.file is None:
            self.open_file()

        if self.position > self.length:
            return False

        item = Item()
        item.id = self.position
        name_size = utils.decode_number(self.file.read(1))
        item.name = self.file.read(name_size).decode("utf-8")

        if item.name == "eof":
            return False

        buf = self.file.read(self.data_size)
        item.graphic = utils.decode_number([buf[0], buf[1]])
        item.type = Type(utils.decode_number([buf[2]]))
        item.sub_type = SubType(utils.decode_number([buf[3]]))
        item.special = Special(utils.decode_number([buf[4]]))

        item.hp = utils.decode_number([buf[5], buf[6]])
        item.tp = utils.decode_number([buf[7], buf[8]])

        item.min_damage = utils.decode_number([buf[9], buf[10]])
        item.max_damage = utils.decode_number([buf[11], buf[12]])
        item.accuracy = utils.decode_number([buf[13], buf[14]])
        item.evade = utils.decode_number([buf[15], buf[16]])
        item.armor = utils.decode_number([buf[17], buf[18]])

        item.str = utils.decode_number([buf[20]])
        item.int = utils.decode_number([buf[21]])
        item.wis = utils.decode_number([buf[22]])
        item.agi = utils.decode_number([buf[23]])
        item.con = utils.decode_number([buf[24]])
        item.cha = utils.decode_number([buf[25]])

        item.light = utils.decode_number([buf[26]])
        item.dark = utils.decode_number([buf[27]])
        item.earth = utils.decode_number([buf[28]])
        item.air = utils.decode_number([buf[29]])
        item.water = utils.decode_number([buf[30]])
        item.fire = utils.decode_number([buf[31]])

        temp = utils.decode_number([buf[32], buf[33], buf[34]])
        if item.type == Type.Teleport:
            item.scroll_map = temp
        elif item.type == Type.EXPReward:
            item.exp_reward = temp
        elif item.type == Type.HairDye:
            item.hair_color = temp
        elif item.type == Type.EffectPotion:
            item.effect = temp
        elif item.type == Type.Key:
            item.key = temp
        else:
            item.doll_graphic = temp

        temp = utils.decode_number([buf[35]])
        if item.type == Type.Teleport:
            item.scroll_x = temp
        else:
            item.gender = temp

        temp = utils.decode_number([buf[36]])
        if item.type == Type.Teleport:
            item.scroll_y = temp
        else:
            item.dual_wield_doll_graphic = temp

        if item.is_equipable():
            item.level_req = utils.decode_number([buf[37], buf[38]])
            item.class_req = utils.decode_number([buf[39], buf[40]])
            item.str_req = utils.decode_number([buf[41], buf[42]])
            item.int_req = utils.decode_number([buf[43], buf[44]])
            item.wis_req = utils.decode_number([buf[45], buf[46]])
            item.agi_req = utils.decode_number([buf[47], buf[48]])
            item.con_req = utils.decode_number([buf[49], buf[50]])
            item.cha_req = utils.decode_number([buf[51], buf[52]])

        item.weight = utils.decode_number([buf[55]])
        item.size = Size(utils.decode_number([buf[57]]))

        self._item = item
        self.position += 1
        return True
Example #7
0
    def read(self):
        if self.file is None:
            self.open_file()

        # kills the loop if we've reached the end of the file
        if self.position > self.length:
            return False

        npc = Npc()
        npc.id = self.position

        # name is dynamic, so we need to find the size each time
        name_size = utils.decode_number(self.file.read(1))
        npc.name = self.file.read(name_size).decode("utf-8")

        # eof means end of file. It should be the last "record"
        # and we can safely ignore it.
        if npc.name == "eof":
            return False

        buf = self.file.read(self.data_size)
        npc.graphic = utils.decode_number([buf[0], buf[1]])
        npc.boss = utils.decode_number([buf[3], buf[4]])
        npc.child = utils.decode_number([buf[5], buf[6]])
        npc.type = Type(utils.decode_number([buf[7], buf[8]]))
        npc.vendor_id = utils.decode_number([buf[9], buf[10]])
        npc.hp = utils.decode_number([buf[11], buf[12], buf[13]])
        npc.min_damage = utils.decode_number([buf[16], buf[17]])
        npc.max_damage = utils.decode_number([buf[18], buf[19]])
        npc.accuracy = utils.decode_number([buf[20], buf[21]])
        npc.evade = utils.decode_number([buf[22], buf[23]])
        npc.armor = utils.decode_number([buf[24], buf[25]])
        npc.exp = utils.decode_number([buf[36], buf[37]])

        self._npc = npc
        self.position += 1
        return True