96 lines
2.5 KiB
Python
96 lines
2.5 KiB
Python
#!/usr/bin/env python3
|
|
|
|
import os
|
|
import re
|
|
import shutil
|
|
import sys
|
|
import urllib.request
|
|
from datetime import datetime
|
|
import hypy_utils
|
|
|
|
import requests
|
|
import select
|
|
|
|
JAVA = '/usr/local/opt/openjdk@17/bin/java'
|
|
MAX_RAM = '4096M'
|
|
MIN_RAM = MAX_RAM
|
|
TIME = 5
|
|
|
|
version_re = re.compile('[0-9]\.[0-9]+\.[0-9]+')
|
|
|
|
|
|
def download_latest_purpur() -> str:
|
|
latest = requests.get(f'https://api.purpurmc.org/v2/purpur/{ver}/latest').json()
|
|
|
|
# Download update
|
|
print(f'- Downloading...')
|
|
new_f = f"purpur-{ver}-{latest['build']}.jar"
|
|
urllib.request.urlretrieve(f"https://api.purpurmc.org/v2/purpur/{ver}/latest/download", new_f)
|
|
|
|
# Check md5
|
|
print(f'- Checking md5... ({latest["md5"]})')
|
|
if hypy_utils.md5(new_f) == latest['md5']:
|
|
print(f'- Checksum passed!')
|
|
else:
|
|
raise AssertionError('Checksum didn\'t pass.')
|
|
|
|
return new_f
|
|
|
|
|
|
def update(f: str, ver: list[str]) -> str:
|
|
# If no jar found, download latest purpur
|
|
if f == '':
|
|
print(f'No jar found, downloading latest purpur...')
|
|
|
|
|
|
# Fetch latest purpur build
|
|
if f.startswith('purpur'):
|
|
ver = ver[0]
|
|
build = int(re.findall('[0-9]{3,5}', f)[0])
|
|
|
|
print(f'Checking release update for version {ver}... Current build: {build}')
|
|
latest = requests.get(f'https://api.purpurmc.org/v2/purpur/{ver}/latest').json()
|
|
latest_build = int(latest['build'])
|
|
|
|
# Update
|
|
if latest_build <= build:
|
|
print('Already on latest version, nothing to do.')
|
|
return f
|
|
|
|
print(f'Updating from {build} to {latest_build}')
|
|
|
|
new_f = download_latest_purpur()
|
|
|
|
# Remove old file
|
|
log_jar = f'logs/{datetime.today().strftime("%Y-%m-%d")}-{f}'
|
|
shutil.move(f, log_jar)
|
|
print(f'Old jar {f} moved to {log_jar}')
|
|
|
|
return new_f
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
# Find server jar
|
|
jar = ''
|
|
for f in os.listdir('.'):
|
|
if not f.endswith('.jar'):
|
|
continue
|
|
|
|
ver = version_re.findall(f)
|
|
if any(k in f for k in ['craftbukkit', 'spigot', 'paper', 'purpur']) or len(ver) != 0:
|
|
jar = f
|
|
break
|
|
|
|
jar = update(jar, version_re.findall(jar))
|
|
|
|
# Auto Restart
|
|
while True:
|
|
os.system(f'{JAVA} -Xmx{MAX_RAM} -Xms{MIN_RAM} -jar {jar} nogui')
|
|
|
|
print('Server stopped, restarting in 5s\nPress any key to stop the server.')
|
|
i, o, e = select.select([sys.stdin], [], [], 5)
|
|
if i:
|
|
print('Server stops.')
|
|
exit(0)
|