Files
sanctuary-beta/scripts/compile_solar_references.py
2026-09-15 09:29:11 +02:00

30 lines
1.8 KiB
Python

#!/usr/bin/env python3
"""Pin public IANA reference locations. No network access is used by the game."""
from pathlib import Path
import hashlib,io,json,tarfile,urllib.request
ROOT=Path(__file__).resolve().parents[1]
VERSION='2026d'
URL=f'https://data.iana.org/time-zones/releases/tzdata{VERSION}.tar.gz'
archive=ROOT/'build'/f'tzdata{VERSION}.tar.gz'
if not archive.exists():archive.write_bytes(urllib.request.urlopen(URL,timeout=30).read())
def coord(s):
sign=-1 if s[0]=='-' else 1;n=s[1:];degrees=2 if len(n) in (4,6) else 3
return sign*(int(n[:degrees])+int(n[degrees:degrees+2])/60+(int(n[degrees+2:])/3600 if len(n)>degrees+2 else 0))
with tarfile.open(fileobj=io.BytesIO(archive.read_bytes()),mode='r:gz') as t:
assert t.extractfile('version').read().decode().strip()==VERSION
zones={}
for row in t.extractfile('zone.tab').read().decode().splitlines():
if not row or row.startswith('#'):continue
_,xy,zone,*_=row.split('\t');split=next(i for i in range(1,len(xy)) if xy[i] in '+-')
zones[zone]={'reference':zone,'latitude':round(coord(xy[:split]),4),'longitude':round(coord(xy[split:]),4)}
links={}
for row in t.extractfile('backward').read().decode().splitlines():
fields=row.split()
if fields and fields[0]=='Link':links[fields[2]]=fields[1]
for _ in range(10):
for alias,target in links.items():
if alias not in zones and target in zones:zones[alias]=zones[target]
output={'source':URL,'version':VERSION,'license':'Public domain (IANA tzdb zone.tab and backward)','archiveSha256':hashlib.sha256(archive.read_bytes()).hexdigest(),'zones':dict(sorted(zones.items()))}
dest=ROOT/'mods/sanctuary/src/main/resources/data/sanctuary/realtime/zone-references.json';dest.parent.mkdir(parents=True,exist_ok=True);dest.write_text(json.dumps(output,indent=2)+'\n')
print(f'{len(zones)} public reference locations/aliases; {output["archiveSha256"]}')