pytron/upload

109 lines
2.8 KiB
Python
Executable File

#!/usr/bin/env python3
import os
import sys
import zipfile
import subprocess
import getpass
AIS_DIR = "ais"
API_URL = "https://pytron.tforgione.fr/upload-target/"
class Ai:
def __init__(self, path):
self.path = path
self.name = path.split('/')[-1]
def print_green(param):
print("\033[32;1m" + str(param) + "\033[0m", file=sys.stderr)
def print_red(param):
print("\033[31;1m" + str(param) + "\033[0m", file=sys.stderr)
def print_yellow(param):
print("\033[33;1m" + str(param) + "\033[0m", file=sys.stderr)
def find_ais(path):
return [Ai(x) for x in os.listdir(path) if not x.startswith('__') and not x.startswith('.')]
def upload_ai(ai):
return_code = 0
print_yellow("Please enter the password corresponding to " + ai.name);
password = getpass.getpass()
print_yellow("Zipping the AI...")
zip = zipfile.ZipFile('.archive.zip', mode = 'w')
try:
for file in os.listdir(AIS_DIR + "/" + ai.path):
zip.write(AIS_DIR + "/" + ai.path + "/" + file, arcname=file)
finally:
zip.close()
print_yellow("Uploading the AI...")
curl = subprocess.Popen([
'curl', '-X', 'POST',
'-F', 'archive=@.archive.zip',
'-F', 'name=' + ai.name,
'-F', 'password=' + password,
API_URL],
stderr = subprocess.PIPE,
stdout = subprocess.PIPE)
code = curl.wait()
if code != 0:
return_code = 1
response = "curl request failed"
else:
response = curl.stdout.read().decode()
if response == 'Success':
print_green("Upload finished!")
else:
print_red("Upload failed: " + str(response).lower())
return_code = 1
os.remove(".archive.zip")
sys.exit(return_code)
def main():
print_green("Welcome to the pytron uploader!")
ais = find_ais(AIS_DIR)
if len(ais) == 0:
print_red("No AI have been found. Please put your AIs as directories inside the ais directory")
sys.exit(1)
elif len(ais) == 1:
print_yellow("Only one AI has been found: " + ais[0].name)
print_yellow("Would you like to upload it ? [Y/n]")
response = input().lower()
if response == '' or response == 'y' or response == 'yes':
upload_ai(ais[0])
else:
print_yellow("Many AIs have been found, which one would you like to upload ?")
for (id, ai) in enumerate(ais):
print("\033[34;1m[" + str(id + 1) + "]\033[0m \033[33m" + ai.name + "\033[0m", file=sys.stderr)
response = input()
try:
response = int(response) - 1
if response < 0 or response >= len(ais):
raise ValueError
except ValueError:
print_red('I was expecting an integer in [1,' + str(len(ais)) + ']')
sys.exit(1)
upload_ai(ais[response])
if __name__ == '__main__':
main()