import pickle,re D=pickle.load(open("data.pkl","rb")); mods=D["mods"] mods.setdefault("minecraft",[dict(jar="base",version="1.21.1",deps=[],nested=False)]) def vt(v): return [int(x) if x.isdigit() else x for x in re.split(r'[.\-+_]',v)] def cmp(a,b): a,b=vt(a),vt(b) for x,y in zip(a,b): if x==y: continue if type(x)==type(y): return -1 if xlen(b))-(len(a)=0 lo,_,hi=part[1:-1].partition(",") if "," not in part: if cmp(v,lo)==0: return True continue ok=True if lo.strip(): c=cmp(v,lo.strip()); ok&= c>0 or (c==0 and part[0]=="[") if hi.strip(): c=cmp(v,hi.strip()); ok&= c<0 or (c==0 and part[-1]=="]") if ok: return True return False # duplicate modids among top-level jars for mid,l in mods.items(): top=[x for x in l if not x["nested"]] if len(top)>1: print("DUP-MODID",mid,[x["jar"] for x in top]) for mid,l in sorted(mods.items()): e=[x for x in l if not x["nested"]] or l for d in e[0]["deps"]: t=str(d.get("type",d.get("mandatory") and "required" or "optional")).lower() if d.get("mandatory") is True: t="required" did=d.get("modId"); side=d.get("side","BOTH") if t not in("required","incompatible","discouraged"): continue if did not in mods: if t=="required": print("MISSING",mid,"->",did,d.get("versionRange"),side) continue v=mods[did][0]["version"]; r=d.get("versionRange","") if t=="required" and not v.startswith("$") and not inrange(v,r): print("VERSION",mid,"->",did,"needs",r,"have",v) if t in("incompatible","discouraged") and (not r or inrange(v,r)): print(t.upper(),mid,"->",did,r,"have",v)