#!/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"]}')