rrb-common 0.1.2 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/rune/common.rb +4 -3
- data/lib/rune/core/archive.rb +116 -0
- data/lib/rune/core/constants.rb +16 -0
- data/lib/rune/core/writeable_buffer.rb +1 -1
- metadata +3 -2
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 8830b14ecfcf37cc6afb5779915d9beeaf84a137d38ca984d832d588ca7ecc1b
         | 
| 4 | 
            +
              data.tar.gz: 8b4e8eced92a7c05e6161d9886c6f11e02614d82f9c0257b5ba9342834118867
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 6b350710235c41abad111df718f214c408a4ae69b223a7fbfb4f477ea1611720ce072429e8ebc19d6aa198e3d0f5a18c10f469ef5d5e4d988b98c25781ced03d
         | 
| 7 | 
            +
              data.tar.gz: 9e83c03b05779b74f959689d8b5709dc83dbcb0ec2cc6f0ce43a90a6bfc90402cd54ff2334cd5b37e007d70f7eff3b6ac4612ee73706f20c2aad8ffa95d23079
         | 
    
        data/lib/rune/common.rb
    CHANGED
    
    | @@ -15,13 +15,14 @@ module RuneRb | |
| 15 15 |  | 
| 16 16 | 
             
              # The Core module contains the core classes and modules of the Rune.rb framework.
         | 
| 17 17 | 
             
              module Core
         | 
| 18 | 
            -
                autoload : | 
| 19 | 
            -
                autoload :Logging,            'rune/core/logging'
         | 
| 20 | 
            -
                autoload :Unit,               'rune/core/unit'
         | 
| 18 | 
            +
                autoload :Archive,            'rune/core/archive'
         | 
| 21 19 | 
             
                autoload :Buffer,             'rune/core/buffer'
         | 
| 22 20 | 
             
                autoload :Constants,          'rune/core/constants'
         | 
| 21 | 
            +
                autoload :Identifiable,       'rune/core/identifiable'
         | 
| 23 22 | 
             
                autoload :ISAAC,              'rune/core/isaac'
         | 
| 23 | 
            +
                autoload :Logging,            'rune/core/logging'
         | 
| 24 24 | 
             
                autoload :ReadableBuffer,     'rune/core/readable_buffer'
         | 
| 25 | 
            +
                autoload :Unit,               'rune/core/unit'
         | 
| 25 26 | 
             
                autoload :WriteableBuffer,    'rune/core/writeable_buffer'
         | 
| 26 27 |  | 
| 27 28 | 
             
                include Constants
         | 
| @@ -0,0 +1,116 @@ | |
| 1 | 
            +
            module RuneRb::Core
         | 
| 2 | 
            +
              class Archive
         | 
| 3 | 
            +
                include RuneRb::Core::Logging
         | 
| 4 | 
            +
             | 
| 5 | 
            +
                # Constructs a new Archive object.
         | 
| 6 | 
            +
                # @param path [String] the path to the cache directory.
         | 
| 7 | 
            +
                def initialize(path = 'cache/')
         | 
| 8 | 
            +
                  unless check_for_archives(path)
         | 
| 9 | 
            +
                    error "Cache archive not found. Please install them into the #{path} directory."
         | 
| 10 | 
            +
                    return
         | 
| 11 | 
            +
                  end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                  # Find how many index files exist
         | 
| 14 | 
            +
                  count = 0.upto(255).each do |i|
         | 
| 15 | 
            +
                    break i unless File.exist?(File.join(path, "main_file_cache.idx#{i}"))
         | 
| 16 | 
            +
                  end
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                  # Gather file objects
         | 
| 19 | 
            +
                  @data_file = File.open(File.join(path, "main_file_cache.dat"), "r")
         | 
| 20 | 
            +
                  @index_files = []
         | 
| 21 | 
            +
                  
         | 
| 22 | 
            +
                  count.times do |i|
         | 
| 23 | 
            +
                    @index_files << File.open(File.join(path, "main_file_cache.idx#{i}"), "r")
         | 
| 24 | 
            +
                  end
         | 
| 25 | 
            +
                end
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                # Gets a file from the cache.
         | 
| 28 | 
            +
                # @param cache [Integer] the cache archive to get the file from.
         | 
| 29 | 
            +
                # @param file [Integer] the file to get.
         | 
| 30 | 
            +
                def get(cache, file)
         | 
| 31 | 
            +
                  # then convert crc table stuff (easy with array pack)
         | 
| 32 | 
            +
                  # then make server send data back to the client
         | 
| 33 | 
            +
                  
         | 
| 34 | 
            +
                  index_file = @index_files[cache]
         | 
| 35 | 
            +
                  cache += 1
         | 
| 36 | 
            +
                  
         | 
| 37 | 
            +
                  index = IO.read(index_file.path, RuneRb::Core::INDEX_SIZE, RuneRb::Core::INDEX_SIZE * file)
         | 
| 38 | 
            +
                  idx_buffer = RuneRb::Core::Buffer.new(mode: 'r')
         | 
| 39 | 
            +
                  idx_buffer << index
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                  file_size  = (idx_buffer.read(type: :byte, signed: false) << 16) | (idx_buffer.read(type: :byte, signed: false) << 8) | idx_buffer.read(type: :byte, signed: false)
         | 
| 42 | 
            +
                  file_block = (idx_buffer.read(type: :byte, signed: false) << 16) | (idx_buffer.read(type: :byte, signed: false) << 8) | idx_buffer.read(type: :byte, signed: false)
         | 
| 43 | 
            +
                  
         | 
| 44 | 
            +
                  remaining_bytes = file_size
         | 
| 45 | 
            +
                  current_block = file_block
         | 
| 46 | 
            +
                  payload = ""
         | 
| 47 | 
            +
                  cycles = 0
         | 
| 48 | 
            +
                  
         | 
| 49 | 
            +
                  while remaining_bytes > 0
         | 
| 50 | 
            +
                    size = RuneRb::Core::DATA_SIZE
         | 
| 51 | 
            +
                    rem = @data_file.size - current_block * RuneRb::Core::DATA_SIZE
         | 
| 52 | 
            +
                    size = rem if rem < RuneRb::Core::DATA_SIZE
         | 
| 53 | 
            +
                    
         | 
| 54 | 
            +
                    header = IO.read(@data_file.path, RuneRb::Core::DATA_HEADER_SIZE, current_block * RuneRb::Core::DATA_SIZE)
         | 
| 55 | 
            +
                    header_buffer = RuneRb::Core::Buffer.new(mode: 'r')
         | 
| 56 | 
            +
                    header_buffer << header
         | 
| 57 | 
            +
             | 
| 58 | 
            +
                    next_file_id = header_buffer.read(type: :short, signed: false)
         | 
| 59 | 
            +
                    current_part_id = header_buffer.read(type: :short, signed: false)
         | 
| 60 | 
            +
                    next_block_id = (header_buffer.read(type: :byte, signed: false)  << 16) | (header_buffer.read(type: :byte, signed: false) << 8) | header_buffer.read(type: :byte, signed: false)
         | 
| 61 | 
            +
                    next_cache_id = header_buffer.read(type: :byte, signed: false)
         | 
| 62 | 
            +
             | 
| 63 | 
            +
                    size -= 8
         | 
| 64 | 
            +
                    
         | 
| 65 | 
            +
                    cycle_bytes = remaining_bytes > RuneRb::Core::DATA_BLOCK_SIZE ? RuneRb::Core::DATA_BLOCK_SIZE : remaining_bytes
         | 
| 66 | 
            +
                    
         | 
| 67 | 
            +
                    payload << IO.read(@data_file.path, cycle_bytes, current_block * RuneRb::Core::DATA_SIZE + RuneRb::Core::DATA_HEADER_SIZE)
         | 
| 68 | 
            +
             | 
| 69 | 
            +
                    remaining_bytes -= cycle_bytes
         | 
| 70 | 
            +
             | 
| 71 | 
            +
                    raise "Cycle does not match part id." if cycles != current_part_id
         | 
| 72 | 
            +
             | 
| 73 | 
            +
                    if remaining_bytes > 0
         | 
| 74 | 
            +
                      raise "Unexpected next cache id." if next_cache_id != cache
         | 
| 75 | 
            +
                      raise "Unexpected next file id." if next_file_id != file
         | 
| 76 | 
            +
                    end
         | 
| 77 | 
            +
             | 
| 78 | 
            +
                    cycles += 1
         | 
| 79 | 
            +
                    current_block = next_block_id
         | 
| 80 | 
            +
                  end
         | 
| 81 | 
            +
                  
         | 
| 82 | 
            +
                  payload
         | 
| 83 | 
            +
                end
         | 
| 84 | 
            +
             | 
| 85 | 
            +
                # Closes the archive file streams.
         | 
| 86 | 
            +
                def close
         | 
| 87 | 
            +
                  @data_file.close
         | 
| 88 | 
            +
                  @index_files.each {|file| file.close }
         | 
| 89 | 
            +
                end
         | 
| 90 | 
            +
             | 
| 91 | 
            +
                # The number of index files in the cache.
         | 
| 92 | 
            +
                # @return [Integer] the number of index files in the cache.
         | 
| 93 | 
            +
                def cache_count
         | 
| 94 | 
            +
                  @index_files.size
         | 
| 95 | 
            +
                end
         | 
| 96 | 
            +
             | 
| 97 | 
            +
                # The number of files in a cache.
         | 
| 98 | 
            +
                # @param cache [Integer] the cache to check.
         | 
| 99 | 
            +
                def file_count(cache)
         | 
| 100 | 
            +
                  (@index_files[cache].size / RuneRb::Core::INDEX_SIZE) - 1
         | 
| 101 | 
            +
                end
         | 
| 102 | 
            +
                
         | 
| 103 | 
            +
                private
         | 
| 104 | 
            +
             | 
| 105 | 
            +
                # Checks for the existence of cache archives in a path.
         | 
| 106 | 
            +
                # @param path [String] the path to the cache directory.
         | 
| 107 | 
            +
                def check_for_archives(path)
         | 
| 108 | 
            +
                  return false if path.nil?
         | 
| 109 | 
            +
                  return false if !File.directory?(path)
         | 
| 110 | 
            +
                  return false if !File.exist?(path)
         | 
| 111 | 
            +
                  return false if !File.readable?(path)
         | 
| 112 | 
            +
                  return false if Dir.empty?(path)
         | 
| 113 | 
            +
                  true
         | 
| 114 | 
            +
                end
         | 
| 115 | 
            +
              end
         | 
| 116 | 
            +
            end
         | 
    
        data/lib/rune/core/constants.rb
    CHANGED
    
    | @@ -18,4 +18,20 @@ module RuneRb::Core::Constants | |
| 18 18 | 
             
              # Bit masks for bit packing
         | 
| 19 19 | 
             
              # @return [Array<Integer>]
         | 
| 20 20 | 
             
              BIT_MASK_OUT = (0...32).collect { (1 << _1) - 1 }.freeze
         | 
| 21 | 
            +
             | 
| 22 | 
            +
              # The size of a single index
         | 
| 23 | 
            +
              # @return [Integer]
         | 
| 24 | 
            +
              INDEX_SIZE = 0x6
         | 
| 25 | 
            +
             | 
| 26 | 
            +
              # The size of a single data block
         | 
| 27 | 
            +
              # @return [Integer]
         | 
| 28 | 
            +
              DATA_BLOCK_SIZE = 0x200
         | 
| 29 | 
            +
             | 
| 30 | 
            +
              # The size of a single data header
         | 
| 31 | 
            +
              # @return [Integer]
         | 
| 32 | 
            +
              DATA_HEADER_SIZE = 0x8
         | 
| 33 | 
            +
             | 
| 34 | 
            +
              # The size of a chunk of data
         | 
| 35 | 
            +
              # @return [Integer]
         | 
| 36 | 
            +
              DATA_SIZE = DATA_BLOCK_SIZE + DATA_HEADER_SIZE
         | 
| 21 37 | 
             
            end
         | 
| @@ -141,7 +141,7 @@ module RuneRb::Core::WriteableBuffer | |
| 141 141 | 
             
              def write_bytes(values)
         | 
| 142 142 | 
             
                case values
         | 
| 143 143 | 
             
                when Array then values.each { |byte| write_byte(byte.to_i) }
         | 
| 144 | 
            -
                when RuneRb::Core::Buffer then  | 
| 144 | 
            +
                when RuneRb::Core::Buffer then @data.concat(values.instance_variable_get(:@data))
         | 
| 145 145 | 
             
                when String then send(:<<, values)
         | 
| 146 146 | 
             
                end
         | 
| 147 147 | 
             
              end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: rrb-common
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.1. | 
| 4 | 
            +
              version: 0.1.4
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Patrick W.
         | 
| 8 8 | 
             
            autorequire:
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2023-11- | 
| 11 | 
            +
            date: 2023-11-12 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: dotenv
         | 
| @@ -157,6 +157,7 @@ extensions: [] | |
| 157 157 | 
             
            extra_rdoc_files: []
         | 
| 158 158 | 
             
            files:
         | 
| 159 159 | 
             
            - lib/rune/common.rb
         | 
| 160 | 
            +
            - lib/rune/core/archive.rb
         | 
| 160 161 | 
             
            - lib/rune/core/buffer.rb
         | 
| 161 162 | 
             
            - lib/rune/core/constants.rb
         | 
| 162 163 | 
             
            - lib/rune/core/identifiable.rb
         |