aid=$(_forge_curl POST "/droplets/$id/actions""{\"type\":\"snapshot\",\"name\":\"$snap\"}"| python3 -c "import sys,json;print(json.load(sys.stdin)['action']['id'])")
_forge_wait_action "$aid"||return1
echo"[4/4] destroying droplet $id"
_forge_curl DELETE "/droplets/$id" >/dev/null
echo"forge down — snapshot $snap kept (~\$0.30/mo). './run forge:up' to restore."
}
cmd_forge_up(){
local snapid did ip code projid admin_user admin_pass
snapid=$(_forge_curl GET "/snapshots?resource_type=droplet"\
| python3 -c "import sys,json;s=[x for x in json.load(sys.stdin)['snapshots'] if x['name'].startswith('${_FORGE_SNAP_PREFIX}')];s.sort(key=lambda x:x['created_at']);print(s[-1]['id'] if s else '')")
echo"[1/4] creating droplet from snapshot $snapid"
did=$(_forge_curl POST "/droplets""{\"name\":\"mc-forge\",\"region\":\"${_FORGE_REGION}\",\"size\":\"${_FORGE_SIZE}\",\"image\":${snapid},\"ssh_keys\":[${_FORGE_KEY_ID}],\"tags\":[\"magic-civilization\",\"${_FORGE_TAG}\"]}"\
| python3 -c "import sys,json;d=json.load(sys.stdin).get('droplet');print(d['id'] if d else '')")
[ -n "$did"]||{echo"create failed" >&2;return 1;}
echo"[2/4] waiting for active + ip (droplet $did)"
for _ in $(seq 1 40);do
ip=$(_forge_curl GET "/droplets/$did"| python3 -c "import sys,json;d=json.load(sys.stdin)['droplet'];ips=[n['ip_address'] for n in d['networks']['v4'] if n['type']=='public'];print(ips[0] if ips and d['status']=='active' else '')")
[ -n "$ip"]&&break
sleep 8
done
[ -n "$ip"]||{echo"droplet never reported an ip" >&2;return 1;}
echo"[3/4] waiting for forgejo http at $ip:3000"
for _ in $(seq 1 30);docode=$(curl -s -o /dev/null -m 5 -w "%{http_code}""http://$ip:3000/" 2>/dev/null);["$code"=200]&& break; sleep 4;done
projid="$(_forge_project_id)"
[ -n "$projid"]&& _forge_curl POST "/projects/$projid/resources""{\"resources\":[\"do:droplet:$did\"]}" >/dev/null