浏览代码

copy a prunplanner empire to another account

raylu 2 周之前
父节点
当前提交
75dcf2d112
共有 1 个文件被更改,包括 42 次插入0 次删除
  1. 42 0
      prunplanner/copy_empire.py

+ 42 - 0
prunplanner/copy_empire.py

@@ -0,0 +1,42 @@
+import sys
+import typing
+
+import httpx
+
+def main():
+	from_jwt, empire_uuid, to_jwt = sys.argv[1:]
+	from_headers = {'Authorization': 'Bearer ' + from_jwt}
+
+	with httpx.Client(headers=from_headers) as from_client:
+		empire: typing.Sequence[EmpirePlan] = from_client.get('https://api.prunplanner.org/baseplanner/empire/' + empire_uuid).raise_for_status().json()
+		shared: typing.Mapping[str, str] = {s['plan_uuid']: s['shared_uuid']
+				for s in from_client.get('https://api.prunplanner.org/shared/list').raise_for_status().json()}
+		for plan in empire:
+			if plan['uuid'] not in shared:
+				print('sharing', plan['uuid'], plan['name'])
+				from_client.put('https://api.prunplanner.org/shared/baseplanner/' + plan['uuid']).raise_for_status()
+		# refresh shared UUIDs
+		shared: typing.Mapping[str, str] = {s['plan_uuid']: s['shared_uuid']
+				for s in from_client.get('https://api.prunplanner.org/shared/list').raise_for_status().json()}
+
+	to_client = httpx.Client(headers={'Authorization': 'Bearer ' + to_jwt})
+	for plan in empire:
+		print('cloning', plan['uuid'], plan['name'])
+		shared_uuid = shared[plan['uuid']]
+		to_client.put(f'https://api.prunplanner.org/shared/baseplanner/{shared_uuid}/clone').raise_for_status()
+		cloned_plan, = (p for p in to_client.get('https://api.prunplanner.org/baseplanner/').raise_for_status().json() if p['name'].startswith('(Shared) '))
+		rename_plan(to_client, cloned_plan['uuid'], plan['name'])
+
+def rename_plan(client: httpx.Client, uuid: str, new_name: str) -> None:
+	plan = client.get('https://api.prunplanner.org/baseplanner/' + uuid).raise_for_status().json()
+	plan['name'] = new_name
+	plan.update(plan.pop('baseplanner_data'))
+	del plan['empires']
+	client.patch('https://api.prunplanner.org/baseplanner/' + uuid, json=plan).raise_for_status()
+
+class EmpirePlan(typing.TypedDict):
+	uuid: str
+	name: str
+
+if __name__ == '__main__':
+	main()