Skip to content
This repository was archived by the owner on Aug 26, 2022. It is now read-only.

Commit 6475016

Browse files
Add files via upload
1 parent 0075c2d commit 6475016

File tree

2 files changed

+84
-65
lines changed

2 files changed

+84
-65
lines changed

APLauncher.pyw

Lines changed: 62 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from tkinter import *
22
from tkinter.ttk import *
33
from tkinter.scrolledtext import ScrolledText
4-
from tkinter import messagebox
4+
from tkinter import messagebox, filedialog
55
from PIL import ImageTk, Image
66
from urllib.request import urlretrieve
77
from zipfile import ZipFile
@@ -12,6 +12,8 @@ import requests
1212
import subprocess
1313
import threading
1414
import re
15+
import shutil
16+
import datetime
1517

1618
class SettingsPage(Frame):
1719

@@ -62,6 +64,8 @@ class App:
6264
self.tabs.add(self.mainframe, text="Versions", sticky="nsew")
6365
if not os.path.isdir("assets"):
6466
os.mkdir("assets")
67+
if not os.path.isdir("temp"):
68+
os.mkdir("temp")
6569
urlretrieve("https://raw.github.com/SpacePython12/AP-Launcher/main/assets/background.png", "assets/background.png")
6670
self.background = ImageTk.PhotoImage(Image.open("assets/background.png"))
6771
self.background2 = Label(self.mainframe, image=self.background)
@@ -83,12 +87,16 @@ class App:
8387
"id": None,
8488
"expiresAt": None
8589
},
86-
"premium": True
90+
"premium": True,
91+
"selectedVersion": None
8792
}
88-
try:
93+
if type(self.cache["selectedVersion"]) is type(list()):
8994
self.versionvar.set(f'{self.cache["selectedVersion"][0]} ({self.cache["selectedVersion"][1]})')
90-
except KeyError:
91-
self.versionvar.set(self.versions[0])
95+
elif type(self.cache["selectedVersion"]) is type(None):
96+
try:
97+
self.versionvar.set(self.versions[0])
98+
except IndexError:
99+
pass
92100
self.versionlabel = Label(self.buttonframe, text="Version: ")
93101
self.versionlabel.grid(column=3, row=0)
94102
self.versionlist = Combobox(self.buttonframe, textvariable=self.versionvar, width=30)
@@ -105,15 +113,18 @@ class App:
105113
self.processtext = ScrolledText(self.processframe, state="disabled", height=35, width=120)
106114
self.processtext.grid(column=0, row=2, sticky="nsew")
107115
self.profileframe = Frame(self.win)
108-
self.tabs.add(self.profileframe, text="Edit Profiles")
116+
self.tabs.add(self.profileframe, text="Profiles")
109117
self.profileselect = Frame(self.profileframe)
110118
self.profileselect.grid(column=0, row=0, sticky="nsew")
111119
self.profilelabel = Label(self.profileselect, text="Profile: ")
112120
self.profilelabel.grid(column=0, row=0, sticky="nsew")
113121
self.profilelist = Combobox(self.profileselect, textvariable=self.versionvar)
114122
self.profilelist.grid(column=1, row=0, sticky="nsew")
115123
self.profilelist["values"] = self.versions
116-
self.profname = LabeledEntry(self.profileframe, "Name: ", self.accounts["profiles"][self.nametoprofile[self.versionvar.get()]]["name"])
124+
try:
125+
self.profname = LabeledEntry(self.profileframe, "Name: ", self.accounts["profiles"][self.nametoprofile[self.versionvar.get()]]["name"])
126+
except KeyError:
127+
self.profname = LabeledEntry(self.profileframe, "Name: ", "N/A")
117128
self.profname.grid(column=0, row=1, sticky="nsew")
118129
self.profgamedir = LabeledEntry(self.profileframe, "Game Directory: ", os.path.join(os.getenv('APPDATA'), '.minecraft'), elength=30)
119130
self.profgamedir.grid(column=0, row=2, sticky="nsew")
@@ -128,6 +139,10 @@ class App:
128139
self.profjavargs.grid(column=0, row=4, sticky="nsew")
129140
self.profsave = Button(self.profileframe, text="Save")
130141
self.profsave.grid(column=0, row=5, sticky="nsew")
142+
self.proftrans = Label(self.profileframe, text="OR")
143+
self.proftrans.grid(column=0, row=6, sticky="nsew")
144+
self.profadd = Button(self.profileframe, text="Import new version", command=lambda: self.open_install_archive())
145+
self.profadd.grid(column=0, row=7, sticky="nsew")
131146
self.update_profiles(self.versionvar.get())
132147
self.profilelist.bind("<<ComboboxSelected>>", lambda x: self.update_profiles(self.versionvar.get()))
133148
self.accesstoken = self.cache["accessid"]["id"]
@@ -171,7 +186,6 @@ class App:
171186

172187
def on_closing(self):
173188
"""Saves info before the window is closed"""
174-
self.accounts["selectedProfile"] = self.versionvar.get()
175189
json.dump(self.accounts, open(os.path.join(self.minecraftdir, "launcher_profiles.json"), "w"), indent=2)
176190
json.dump(self.cache, open("cache.json", "w"), indent=2)
177191
self.win.withdraw()
@@ -248,7 +262,10 @@ class App:
248262

249263
def update_profiles(self, name):
250264
"""Updates special game arguments"""
251-
self.profname.set(self.accounts["profiles"][self.nametoprofile[name]]["name"])
265+
try:
266+
self.profname.set(self.accounts["profiles"][self.nametoprofile[name]]["name"])
267+
except:
268+
pass
252269
try:
253270
self.profgamedir.set(self.accounts["profiles"][self.nametoprofile[name]]["gameDir"])
254271
except:
@@ -312,6 +329,7 @@ class App:
312329
self.currentversion = self.get_latest_version("snapshot")
313330
else:
314331
self.currentversion = self.accounts["profiles"][self.nametoprofile[self.versionvar.get()]]["lastVersionId"]
332+
self.accounts["profiles"][self.nametoprofile[self.versionvar.get()]]["lastUsed"] = datetime.datetime.now().strftime("%Y-%m-%dT%H:%M:%S.%f")[:-3] + "Z"
315333
thread = threading.Thread(None, lambda: self.sbloop())
316334
thread.start()
317335

@@ -341,29 +359,13 @@ class App:
341359
shell=True,
342360
text=True,
343361
stdout=subprocess.PIPE,
344-
stderr=subprocess.DEVNULL,
362+
stderr=subprocess.STDOUT,
345363
stdin=subprocess.DEVNULL
346364
)
347-
line = sb.stdout.readline().rstrip()
348-
while True:
349-
if sb.poll() is None:
350-
if line.startswith("\t"):
351-
self.update_procscreen(line)
352-
else:
353-
try:
354-
title, text = line.split(": ", 1)
355-
title = title.replace("[", "")
356-
title = title.replace("]", "")
357-
text = text.replace("ERROR : ", "")
358-
time, rinfo = title.split(" ", 1)
359-
name, info = rinfo.split("/")
360-
self.update_procscreen(f"[{time}] {info} from {name}: {text}")
361-
except ValueError:
362-
if not line.startswith("ERROR : "):
363-
self.update_procscreen(line)
364-
line = sb.stdout.readline().rstrip()
365-
else:
366-
break
365+
while sb.poll() is None:
366+
line = sb.stdout.readline().rstrip()
367+
if not line == "":
368+
self.update_procscreen(line)
367369
print("Process finished")
368370
self.playbutton.config(state="normal", text="\nPlay\n")
369371
self.playcontext.entryconfigure(0, state="disabled")
@@ -408,6 +410,36 @@ class App:
408410
zf.close()
409411
os.remove("java/java.zip")
410412

413+
def open_install_archive(self):
414+
filepath = filedialog.askopenfilename(master=self.win, title="Open version file", filetypes=[("ZIP files", "*.zip")])
415+
if filepath == "":
416+
return
417+
with ZipFile(open(filepath, "rb")) as zf:
418+
folders = list(set([os.path.dirname(x).split("/")[0] for x in zf.namelist()]))
419+
folders.remove("indexes")
420+
for folder in folders:
421+
infofile = zf.open(f"{folder}/manifest.json")
422+
info = json.load(infofile)
423+
if os.path.isdir(os.path.join(self.minecraftdir, "versions", folder)):
424+
if not messagebox.askyesno("Confirm", "There is already a version by this name. Would you like to overwrite it?"):
425+
zf.close()
426+
return
427+
else:
428+
shutil.rmtree(os.path.join(self.minecraftdir, "versions", folder))
429+
os.mkdir(os.path.join(self.minecraftdir, "versions", folder))
430+
for file_ in zf.namelist():
431+
if file_.startswith(folder) and not file_.endswith("manifest.json"):
432+
zf.extract(file_, os.path.join(self.minecraftdir, "versions"))
433+
info["profile"][list(info["profile"].keys())[0]]["created"] = datetime.datetime.now().strftime("%Y-%m-%dT%H:%M:%S.%f")[:-3] + "Z"
434+
self.accounts["profiles"][list(info["profile"].keys())[0]] = info["profile"][list(info["profile"].keys())[0]]
435+
for file_ in zf.namelist():
436+
if file_.startswith("indexes"):
437+
zf.extract(file_, os.path.join(self.minecraftdir, "assets"))
438+
messagebox.showinfo("Success", "The version was successfully imported. Restart AP Launcher to see changes.")
439+
zf.close()
440+
return
441+
442+
411443
if __name__ == "__main__":
412444
main = App()
413445
main.win.mainloop()

launcher_process.py

Lines changed: 22 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
import uuid as uuidlib
99
from urllib.request import urlretrieve
1010
import shutil
11-
import logging
1211
import datetime
1312

1413
# Base program derived from https://stackoverflow.com/questions/14531917/launch-minecraft-from-command-line-username-and-password-as-prefix
@@ -111,34 +110,25 @@ def get_classpath(lib, mcDir):
111110

112111
return os.pathsep.join(cp)
113112

114-
def move_libraries(cp, dest, libjson):
113+
def move_libraries(mcdir, dest, libjson, cp, version):
115114
"""Moves libraries to natives path"""
116115
index = 0
117-
for p in cp.split(";"):
118-
name = p.split("\\")[-1]
119-
try:
120-
shutil.copyfile(p, os.path.join(dest, name))
121-
except FileNotFoundError:
122-
name2 = libjson[index]["name"].replace(":", "/").split("/")
123-
urlretrieve(f"https://libraries.minecraft.net/{name2[0].replace('.', '/')}/{name2[1]}/{name2[2]}/{name2[1]}-{name2[2]}.jar", p)
124-
shutil.copyfile(p, os.path.join(dest, name))
125-
except FileExistsError:
126-
os.remove(os.path.join(dest, name))
127-
shutil.copyfile(p, os.path.join(dest, name))
116+
shutil.copyfile(f"{mcDir}/versions/{version}/{version}.jar", os.path.join(dest, f"{version}.jar"))
117+
for c in cp.split(";"):
118+
name = c.split("\\")[-1]
119+
print(f"Looking for {name}...")
120+
if not os.path.isfile(os.path.join(dest, name)) and os.path.isfile(c):
121+
print(f"{name} is already cached, moving to natives folder")
122+
shutil.copyfile(os.path.join(mcDir, "libraries", c.replace("\\", "/")), os.path.join(dest, name))
123+
elif not os.path.isfile(c):
124+
print(f"{name} is not cached, trying to download")
125+
os.makedirs(os.path.join(mcDir, "libraries", *c.replace(f"{mcDir}\\libraries\\", "").split("\\")[:-1]), exist_ok=True)
126+
url = "https://libraries.minecraft.net/" + c.replace(f"{mcDir}\\libraries\\", "").replace("\\", "/")
127+
urlretrieve(url, os.path.join(mcDir, "libraries", c.replace("\\", "/")))
128+
shutil.copyfile(os.path.join(mcDir, "libraries", c.replace("\\", "/")), os.path.join(dest, name))
129+
print(f"{name} successfully moved to natives folder.")
128130
index += 1
129131

130-
if not os.path.isdir("launcher_logs"):
131-
os.mkdir("launcher_logs")
132-
133-
num = 1
134-
date = datetime.datetime.today().strftime("%Y-%m-%d")
135-
while os.path.isfile(os.path.join("launcher_logs", f"{date}-{num}.log")):
136-
num += 1
137-
fp = os.path.join("launcher_logs", f"{date}-{num}")
138-
139-
logging.basicConfig(format="[%(asctime)s] [%(name)s/%(levelname)s]: %(message)s", level=logging.INFO)
140-
handler = logging.FileHandler(fp, "a")
141-
logging.getLogger('').addHandler(handler)
142132
try:
143133
username = sys.argv[sys.argv.index("-username")+1]
144134
version = sys.argv[sys.argv.index("-version")+1]
@@ -149,7 +139,7 @@ def move_libraries(cp, dest, libjson):
149139
javaArgs = sys.argv[sys.argv.index("-javaArgs")+1]
150140
except ValueError:
151141
print("Invalid syntax.")
152-
quit()
142+
sys.exit()
153143

154144
accountJson = json.load(
155145
open(os.path.join(mcDir, "launcher_accounts.json"))
@@ -175,11 +165,10 @@ def move_libraries(cp, dest, libjson):
175165

176166
try:
177167
nativesDir = os.path.join(mcDir, 'versions', version, 'natives')
178-
move_libraries(classPath, nativesDir, clientJson["libraries"])
179168
except FileNotFoundError:
180169
os.mkdir(os.path.join(mcDir, 'versions', version, 'natives'))
181170
nativesDir = os.path.join(mcDir, 'versions', version, 'natives')
182-
move_libraries(classPath, nativesDir, clientJson["libraries"])
171+
move_libraries(classPath, nativesDir, clientJson["libraries"], classPath, version)
183172
if inheritor is None:
184173
mainClass = clientJson['mainClass']
185174
assetIndex = clientJson['assetIndex']['id']
@@ -204,6 +193,7 @@ def move_libraries(cp, dest, libjson):
204193
f'-Djava-args={javaArgs}',
205194
'-Dminecraft.launcher.brand=custom-launcher',
206195
'-Dminecraft.launcher.version=2.1',
196+
'-Dorg.lwjgl.util.DebugLoader=true',
207197
'-cp',
208198
classPath,
209199
'net.minecraft.client.main.Main',
@@ -235,11 +225,8 @@ def move_libraries(cp, dest, libjson):
235225
stderr=subprocess.STDOUT,
236226
stdin=subprocess.DEVNULL
237227
)
238-
line = sb.stdout.readline().rstrip()
239228
isfirstpass = True
240-
while True:
241-
if sb.poll() is None and line != "":
242-
print(line)
243-
line = sb.stdout.readline().rstrip()
244-
else:
245-
break
229+
while sb.poll() is None:
230+
line = sb.stdout.readline().rstrip()
231+
if not line == "":
232+
print(line)

0 commit comments

Comments
 (0)