Minecraft-Updater/mcUp.py

97 lines
4.4 KiB
Python

2021-12-14 18:09:16 +07:00
#!/bin/python
# Setup Parser
2021-12-19 23:42:31 +07:00
import requests
from re import sub
2021-12-14 18:09:16 +07:00
import parsers.paperMC
2021-12-19 18:00:57 +07:00
import parsers.modrinth
2021-12-14 18:09:16 +07:00
import argparse
2021-12-14 20:02:16 +07:00
import shutil
import hashlib
from os import error
2021-12-14 18:09:16 +07:00
parser = argparse.ArgumentParser(description='A command-line tool to update a Minecraft Server.')
parser.add_argument('api', metavar='api', help='which API to use')
parser.add_argument('project', metavar='project', help='which project to query for')
parser.add_argument('action', metavar='action', help='what action to execute')
parser.add_argument('subAction', metavar='subAction', help='what sub action to execute')
parser.add_argument('-o', nargs="?", help='Optional: Specify output filepath')
2021-12-14 18:09:16 +07:00
args = parser.parse_args()
print("mcUp.py, written by Caleb Fontenot")
print(args.o)
2021-12-14 18:09:16 +07:00
# PaperMC command functions
def paperMC(project, action, subAction):
if action == "get":
if subAction == "versions":
print(parsers.paperMC.getVersions(project))
elif subAction == "latest":
latestVersion = parsers.paperMC.getLatest(project)
buildNumber = parsers.paperMC.getBuildNumber(project, latestVersion)
print("Latest version of "+project+" is "+latestVersion+" build #"+str(buildNumber[-1]))
2021-12-14 20:02:16 +07:00
if action == "download":
if subAction == "latest":
latestVersion = parsers.paperMC.getLatest(project)
output = parsers.paperMC.getJarInfo(project, latestVersion)
if args.o != None: # Check if user set an output filepath
output_file = args.o
else:
output_file = output["name"]
2021-12-14 20:02:16 +07:00
with parsers.paperMC.downloadVersion(project, latestVersion) as raw:
with open(output_file, 'wb') as file_object:
2021-12-14 20:02:16 +07:00
shutil.copyfileobj(raw.raw, file_object)
print("Downloaded "+latestVersion+" to "+output_file)
#Calculate hash, compare with API given hash
h_sha256 = hashlib.sha256()
with open(output_file, 'rb') as file_object:
chunk = 0
while chunk != b'':
chunk = file_object.read(1024)
h_sha256.update(chunk)
if h_sha256.hexdigest() == output["sha256"]:
print("sha256sum of downloaded file matches the sum that the API gave, jar is safe to use")
else:
raise error
2021-12-19 18:00:57 +07:00
# modrinth command functions
def modrinth(project, action, subAction):
2021-12-19 23:42:31 +07:00
if action == "get":
2021-12-19 18:00:57 +07:00
if subAction == "info":
print(parsers.modrinth.modInfo(project))
2021-12-19 23:42:31 +07:00
if subAction == "version_info":
2021-12-19 18:00:57 +07:00
print(parsers.modrinth.getAllModVersionInfo(project))
2021-12-19 23:42:31 +07:00
if subAction == "versions":
print(parsers.modrinth.determine(project, "version_number"))
if subAction == "latest":
print(parsers.modrinth.getLatestVersion(project))
if subAction == "get_URL":
print(parsers.modrinth.getDownloadURL(project, parsers.modrinth.getLatestVersion(project)))
2021-12-14 18:09:16 +07:00
2021-12-19 23:42:31 +07:00
if action == "download":
if subAction == "latest":
latestVersion = parsers.modrinth.getLatestVersion(project)
output = parsers.modrinth.getDownloadURL(project, parsers.modrinth.getLatestVersion(project))
response = requests.get(output[0], stream=True, timeout=1)
if args.o != None: # Check if user set an output filepath
output_file = args.o
else:
output_file = output[2]
with response as raw:
with open(output_file, 'wb') as file_object:
shutil.copyfileobj(raw.raw, file_object)
print("Downloaded "+latestVersion+" to "+output_file)
#Calculate hash, compare with API given hash
h_sha1 = hashlib.sha1()
with open(output_file, 'rb') as file_object:
chunk = 0
while chunk != b'':
chunk = file_object.read(1024)
h_sha1.update(chunk)
if h_sha1.hexdigest() == output[1]:
print("sha1sum of downloaded file matches the sum that the API gave, jar is safe to use")
else:
raise error
2021-12-14 18:09:16 +07:00
2021-12-19 18:00:57 +07:00
# Determine which API parser to use:
2021-12-14 18:09:16 +07:00
if args.api == "paperMC":
paperMC(args.project, args.action, args.subAction)
2021-12-19 18:00:57 +07:00
elif args.api == "modrinth":
modrinth(args.project, args.action, args.subAction)
2021-12-14 18:09:16 +07:00
else:
print("Error: Unknown API: "+args.api)