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
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}
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
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
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
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
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