Files
sanctuary-beta/scripts/resource_pack.py
T
2026-09-16 11:41:27 +02:00

46 lines
2.4 KiB
Python

#!/usr/bin/env python3
"""Check immutable texture-release hashes using only Python's standard library."""
import hashlib
import json
from pathlib import Path
import struct
import zlib
ROOT = Path(__file__).resolve().parents[1]
SOURCE = ROOT / 'ressources-pack/sanctuary'
properties = dict(line.split('=', 1) for line in (ROOT / 'gradle.properties').read_text().splitlines()
if line.strip() and not line.lstrip().startswith('#'))
version = properties['resource_pack_version']
release = json.loads((SOURCE / f'releases/{version}.json').read_text())
assert release['version'] == version
assert release['minecraft'] == properties['minecraft_version']
assert release['format'] == [97, 1]
assert release['builtinId'] == 'sanctuary:textures' and release['activation'] == 'DEFAULT_ENABLED'
files = {str(p.relative_to(SOURCE)): p for p in SOURCE.rglob('*') if p.is_file()
and (str(p.relative_to(SOURCE)).startswith('assets/') or p.name in ('pack.mcmeta', 'pack.png'))
and p.name != '.DS_Store'}
assert set(files) == set(release['files']), 'Resource list changed: create a new texture release manifest'
for name, path in files.items():
data = path.read_bytes()
assert hashlib.sha256(data).hexdigest() == release['files'][name], f'Texture release drift: {name}'
if name.endswith(('.json', '.mcmeta')):
json.loads(data)
if name.endswith('.png'):
assert data[:8] == b'\x89PNG\r\n\x1a\n', name
offset = 8
kind = None
while offset < len(data):
length = struct.unpack_from('>I', data, offset)[0]
kind = data[offset + 4:offset + 8]
chunk = data[offset + 4:offset + 8 + length]
assert zlib.crc32(chunk) == struct.unpack_from('>I', data, offset + 8 + length)[0], name
offset += 12 + length
assert offset == len(data) and kind == b'IEND', name
for name, digest in release['import']['files'].items():
if name.startswith('assets/') or name == 'pack.png':
assert hashlib.sha256(files[name].read_bytes()).hexdigest() == digest, f'Imported asset altered: {name}'
metadata = json.loads(files['pack.mcmeta'].read_text())['pack']
assert metadata['min_format'] == metadata['max_format'] == release['format']
assert metadata['description']['with'] == [version]
print(f'Sanctuary textures {version}: {len(files)} files, imported assets, PNG CRCs and format 97.1 verified.')