迁移前提交
This commit is contained in:
parent
b0d4c8976e
commit
ac9679e522
BIN
._requirement.txt
Executable file
BIN
._requirement.txt
Executable file
Binary file not shown.
0
.gmclcore/env/aria2c64.exe
vendored
Normal file → Executable file
0
.gmclcore/env/aria2c64.exe
vendored
Normal file → Executable file
BIN
.gmclcore/env/aria2cdarwin
vendored
Executable file
BIN
.gmclcore/env/aria2cdarwin
vendored
Executable file
Binary file not shown.
@ -1,6 +0,0 @@
|
||||
[2022-01-09 12:32:21] [INFO] Initing running env...
|
||||
[2022-01-09 12:32:24] [INFO] Creating daemon thread...
|
||||
[2022-01-09 12:39:35] [INFO] Initing running env...
|
||||
[2022-01-09 12:39:36] [INFO] Creating daemon thread...
|
||||
[2022-01-09 12:43:55] [INFO] Initing running env...
|
||||
[2022-01-09 12:43:56] [INFO] Creating daemon thread...
|
BIN
.gmclcore/logs/2022-02-04.zip
Executable file
BIN
.gmclcore/logs/2022-02-04.zip
Executable file
Binary file not shown.
53
.gmclcore/logs/2022-02-05.logs
Executable file
53
.gmclcore/logs/2022-02-05.logs
Executable file
@ -0,0 +1,53 @@
|
||||
[2022-02-05 22:40:51] [INFO] Initing running env...
|
||||
[2022-02-05 22:40:51] [INFO] Archiving logs.
|
||||
[2022-02-05 22:41:22] [INFO] Initing running env...
|
||||
[2022-02-05 22:41:22] [INFO] Archiving logs.
|
||||
[2022-02-05 22:41:34] [INFO] Initing running env...
|
||||
[2022-02-05 22:41:34] [INFO] Archiving logs.
|
||||
[2022-02-05 22:42:40] [INFO] Initing running env...
|
||||
[2022-02-05 22:42:40] [INFO] Archiving logs.
|
||||
[2022-02-05 22:42:59] [INFO] Initing running env...
|
||||
[2022-02-05 22:42:59] [INFO] Archiving logs.
|
||||
[2022-02-05 22:44:35] [INFO] Initing running env...
|
||||
[2022-02-05 22:44:35] [INFO] Creating daemon thread...
|
||||
[2022-02-05 22:46:59] [INFO] Initing running env...
|
||||
[2022-02-05 22:46:59] [INFO] Creating daemon thread...
|
||||
[2022-02-05 22:47:17] [INFO] Initing running env...
|
||||
[2022-02-05 22:47:17] [INFO] Creating daemon thread...
|
||||
[2022-02-05 22:47:48] [INFO] Initing running env...
|
||||
[2022-02-05 22:47:48] [INFO] Creating daemon thread...
|
||||
[2022-02-05 22:47:58] [INFO] Initing running env...
|
||||
[2022-02-05 22:47:58] [INFO] Creating daemon thread...
|
||||
[2022-02-05 22:48:36] [INFO] Initing running env...
|
||||
[2022-02-05 22:48:36] [INFO] Creating daemon thread...
|
||||
[2022-02-05 22:49:11] [INFO] Initing running env...
|
||||
[2022-02-05 22:49:11] [INFO] Creating daemon thread...
|
||||
[2022-02-05 22:50:17] [INFO] Initing running env...
|
||||
[2022-02-05 22:50:17] [INFO] Creating daemon thread...
|
||||
[2022-02-05 22:50:31] [INFO] Initing running env...
|
||||
[2022-02-05 22:50:31] [INFO] Creating daemon thread...
|
||||
[2022-02-05 22:55:18] [INFO] Initing running env...
|
||||
[2022-02-05 22:55:18] [INFO] Creating daemon thread...
|
||||
[2022-02-05 23:03:44] [INFO] Initing running env...
|
||||
[2022-02-05 23:03:46] [INFO] Creating daemon thread...
|
||||
[2022-02-05 23:04:35] [INFO] Initing running env...
|
||||
[2022-02-05 23:04:35] [INFO] Creating daemon thread...
|
||||
[2022-02-05 23:04:39] [INFO] Initing running env...
|
||||
[2022-02-05 23:04:39] [INFO] Creating daemon thread...
|
||||
[2022-02-05 23:04:52] [INFO] Initing running env...
|
||||
[2022-02-05 23:05:13] [INFO] Initing running env...
|
||||
[2022-02-05 23:05:13] [INFO] Creating daemon thread...
|
||||
[2022-02-05 23:05:23] [INFO] Initing running env...
|
||||
[2022-02-05 23:05:23] [INFO] Creating daemon thread...
|
||||
[2022-02-05 23:08:12] [INFO] Initing running env...
|
||||
[2022-02-05 23:08:12] [INFO] Creating daemon thread...
|
||||
[2022-02-05 23:08:20] [INFO] Initing running env...
|
||||
[2022-02-05 23:08:20] [INFO] Creating daemon thread...
|
||||
[2022-02-05 23:09:55] [INFO] Initing running env...
|
||||
[2022-02-05 23:09:55] [INFO] Creating daemon thread...
|
||||
[2022-02-05 23:10:30] [INFO] Initing running env...
|
||||
[2022-02-05 23:10:30] [INFO] Creating daemon thread...
|
||||
[2022-02-05 23:11:14] [INFO] Initing running env...
|
||||
[2022-02-05 23:11:14] [INFO] Creating daemon thread...
|
||||
[2022-02-05 23:17:36] [INFO] Initing running env...
|
||||
[2022-02-05 23:17:36] [INFO] Creating daemon thread...
|
0
GMCLCore/__init__.py
Normal file → Executable file
0
GMCLCore/__init__.py
Normal file → Executable file
0
GMCLCore/__main__.py
Normal file → Executable file
0
GMCLCore/__main__.py
Normal file → Executable file
BIN
GMCLCore/__pycache__/__init__.cpython-37.pyc
Normal file → Executable file
BIN
GMCLCore/__pycache__/__init__.cpython-37.pyc
Normal file → Executable file
Binary file not shown.
BIN
GMCLCore/__pycache__/__init__.cpython-38.pyc
Executable file
BIN
GMCLCore/__pycache__/__init__.cpython-38.pyc
Executable file
Binary file not shown.
0
GMCLCore/__pycache__/config.cpython-37.pyc
Normal file → Executable file
0
GMCLCore/__pycache__/config.cpython-37.pyc
Normal file → Executable file
BIN
GMCLCore/__pycache__/config.cpython-38.pyc
Executable file
BIN
GMCLCore/__pycache__/config.cpython-38.pyc
Executable file
Binary file not shown.
0
GMCLCore/__pycache__/gaming.cpython-37.pyc
Normal file → Executable file
0
GMCLCore/__pycache__/gaming.cpython-37.pyc
Normal file → Executable file
0
GMCLCore/__pycache__/log4py.cpython-37.pyc
Normal file → Executable file
0
GMCLCore/__pycache__/log4py.cpython-37.pyc
Normal file → Executable file
BIN
GMCLCore/__pycache__/log4py.cpython-38.pyc
Executable file
BIN
GMCLCore/__pycache__/log4py.cpython-38.pyc
Executable file
Binary file not shown.
0
GMCLCore/__pycache__/main.cpython-37.pyc
Normal file → Executable file
0
GMCLCore/__pycache__/main.cpython-37.pyc
Normal file → Executable file
BIN
GMCLCore/__pycache__/main.cpython-38.pyc
Executable file
BIN
GMCLCore/__pycache__/main.cpython-38.pyc
Executable file
Binary file not shown.
0
GMCLCore/config.py
Normal file → Executable file
0
GMCLCore/config.py
Normal file → Executable file
BIN
GMCLCore/libs/._log4py.py
Executable file
BIN
GMCLCore/libs/._log4py.py
Executable file
Binary file not shown.
BIN
GMCLCore/libs/__pycache__/ariaAdapter.cpython-38.pyc
Executable file
BIN
GMCLCore/libs/__pycache__/ariaAdapter.cpython-38.pyc
Executable file
Binary file not shown.
BIN
GMCLCore/libs/__pycache__/log4py.cpython-38.pyc
Executable file
BIN
GMCLCore/libs/__pycache__/log4py.cpython-38.pyc
Executable file
Binary file not shown.
13
GMCLCore/libs/ariaAdapter.py
Executable file
13
GMCLCore/libs/ariaAdapter.py
Executable file
@ -0,0 +1,13 @@
|
||||
from asyncio import subprocess
|
||||
from matplotlib.pyplot import subplot
|
||||
|
||||
|
||||
import os, subprocess
|
||||
|
||||
class adapter(object):
|
||||
def __init__(self, path : str):
|
||||
if not os.path.exists(path):
|
||||
raise FileNotFoundError
|
||||
if not os.path.isfile(path):
|
||||
raise TypeError
|
||||
self.__path = path
|
33
GMCLCore/log4py.py → GMCLCore/libs/log4py.py
Normal file → Executable file
33
GMCLCore/log4py.py → GMCLCore/libs/log4py.py
Normal file → Executable file
@ -20,13 +20,14 @@ class log(object):
|
||||
raise TypeError("Wrong type for param @workdir")
|
||||
self.workdir = workdir
|
||||
self.__logs = []
|
||||
if os.path.exists("{}\\logs".format(workdir)) and os.path.isfile("{}\\logs".format(workdir)):
|
||||
guard = Thread(target = self.__daemon)
|
||||
guard.start()
|
||||
if os.path.exists(os.path.join(workdir, "logs")) and os.path.isdir(os.path.join(workdir, "logs")):
|
||||
daemon = Thread(target = self.__daemon, name = "log4py-daemon")
|
||||
daemon.daemon = True
|
||||
daemon.start()
|
||||
else:
|
||||
try:
|
||||
os.makedirs("{}\\logs".format(workdir), exist_ok = True)
|
||||
daemon = Thread(target = self.__daemon)
|
||||
os.makedirs(os.path.join(workdir, "logs"), exist_ok = True)
|
||||
daemon = Thread(target = self.__daemon, name = "log4py-daemon")
|
||||
daemon.daemon = True
|
||||
daemon.start()
|
||||
except:
|
||||
@ -35,14 +36,14 @@ class log(object):
|
||||
'''
|
||||
Guard thread for recording logs and archiving.
|
||||
'''
|
||||
workdir = "{}\\logs".format(self.workdir)
|
||||
workdir = os.path.abspath(os.path.join(self.workdir, "logs"))
|
||||
self.__suicide = False
|
||||
def archive(workdir):
|
||||
timeStamp = time.time()
|
||||
logsList = []
|
||||
for fname in os.listdir(workdir):
|
||||
if os.path.isfile("{}\\{}".format(workdir, fname)):
|
||||
logsList.append("{}\\{}".format(workdir, fname))
|
||||
if os.path.isfile(os.path.join(workdir, fname)):
|
||||
logsList.append(os.path.join(workdir, fname))
|
||||
archiveList = []
|
||||
today = time.strftime("%Y-%m-%d", time.localtime(timeStamp))
|
||||
# yesterday = time.strftime("%Y-%m-%d", time.localtime(timeStamp - 86400))
|
||||
@ -53,29 +54,21 @@ class log(object):
|
||||
flag = True
|
||||
if flag:
|
||||
self.info("Archiving logs.")
|
||||
'''
|
||||
#Archive all logs before today in a single zip file
|
||||
os.makedirs("{}\\{}".format(workdir,yesterday),exist_ok=True)
|
||||
for fname in archiveList:
|
||||
shutil.move(fname,"{}\\{}".format(workdir,yesterday))
|
||||
shutil.make_archive("{}\\{}".format(workdir,yesterday),"zip",workdir,yesterday)
|
||||
shutil.rmtree("{}\\{}".format(workdir,yesterday))
|
||||
'''
|
||||
# Archive each log in independence zip file
|
||||
for fname in archiveList:
|
||||
basename = os.path.basename(fname)
|
||||
shutil.make_archive("{}\\{}".format(workdir, os.path.splitext(basename)[0]), "zip", workdir, basename)
|
||||
shutil.make_archive(os.path.join(workdir, os.path.splitext(basename)[0]), "zip", workdir, basename)
|
||||
try:
|
||||
os.remove("{}\\{}".format(workdir, basename))
|
||||
os.remove(os.path.join(workdir, basename))
|
||||
except:
|
||||
pass
|
||||
|
||||
Thread(target = archive, args = (workdir,)).start()
|
||||
Thread(target = archive, args = (workdir,), name = "log4py-archive").start()
|
||||
while True:
|
||||
timeStamp = time.time()
|
||||
today = time.strftime("%Y-%m-%d", time.localtime(timeStamp))
|
||||
while True:
|
||||
with open("{}\\{}.logs".format(workdir,today),"a+") as fb:
|
||||
with open(os.path.join(workdir, "{}.logs".format(today)),"a+") as fb:
|
||||
data, self.__logs = self.__logs, []
|
||||
for log in data:
|
||||
fb.write("[{}] [{}] {}\n".format(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(log[0])), log[1], log[2]))
|
147
GMCLCore/main.py
Normal file → Executable file
147
GMCLCore/main.py
Normal file → Executable file
@ -14,23 +14,32 @@
|
||||
#
|
||||
|
||||
# Standard
|
||||
import os, platform, hashlib, requests
|
||||
import os, platform, hashlib, requests, json, time
|
||||
import urllib.request, urllib.parse
|
||||
from threading import Thread
|
||||
from subprocess import Popen, PIPE
|
||||
# Extend
|
||||
import psutil
|
||||
# Self
|
||||
import GMCLCore.log4py as log4py
|
||||
import GMCLCore.libs.log4py as log4py
|
||||
import GMCLCore.libs.ariaAdapter as aria
|
||||
from GMCLCore.config import *
|
||||
|
||||
class Core(object):
|
||||
|
||||
# Define constant
|
||||
|
||||
# Debug logs output switcher
|
||||
DEBUG = True
|
||||
|
||||
# Downloader Mode
|
||||
ARIA = "ARIA"
|
||||
|
||||
# Source Mode
|
||||
OFFICIAL = "OFFICIAL"
|
||||
BMCLAPI = "BMCLAPI"
|
||||
|
||||
# Auth Mode
|
||||
OFFLINE = "OFFLINE"
|
||||
MOJANG = "MOJANG"
|
||||
MICROSOFT = "MICROSOFT"
|
||||
@ -59,7 +68,7 @@ class Core(object):
|
||||
|
||||
# Define default game vars
|
||||
self.gameDir = os.path.join(os.path.dirname(__file__), ".minecraft")
|
||||
self.javaPath = self.searchJava()
|
||||
self.java = [[], None]
|
||||
self.gameMem = self.autoMemory()
|
||||
self.authType = self.OFFLINE
|
||||
self.id = "Steve"
|
||||
@ -67,16 +76,19 @@ class Core(object):
|
||||
|
||||
# Prepare running env
|
||||
self.l.info("Initing running env...")
|
||||
os.makedirs(os.path.join(self.__workDir, "env"), exist_ok = True)
|
||||
os.makedirs(os.path.join(self.__workDir, "config"), exist_ok = True)
|
||||
self.initEnv()
|
||||
|
||||
# Create daemon thread
|
||||
self.l.info("Creating daemon thread...")
|
||||
self.__daemonThread = Thread(target = self.__daemon)
|
||||
self.__daemonThread = Thread(target = self.__daemon, name = "Daemon")
|
||||
self.__daemonThread.daemon = True
|
||||
self.__daemonThread.start()
|
||||
|
||||
# Prepare the launcher runnning env
|
||||
def initEnv(self):
|
||||
os.makedirs(os.path.join(self.__workDir, "env"), exist_ok = True)
|
||||
# Aria2c
|
||||
if self.networkTest():
|
||||
source = self.urljoin(self.ENV_SOURCE, "aria2c")
|
||||
if self.__system == "Windows":
|
||||
@ -96,7 +108,7 @@ class Core(object):
|
||||
except Exception as e:
|
||||
self.l.warn("Failed to install running env aria2c! System return: {}".format(e))
|
||||
elif self.__system == "Linux":
|
||||
self.__ariaPath = self.urljoin(self.__workDir, "env", "aria2c")
|
||||
self.__ariaPath = self.urljoin(self.__workDir, "env", "aria2clinux")
|
||||
source = self.urljoin(source, "linux")
|
||||
if not os.path.exists(self.__ariaPath):
|
||||
with open(self.__ariaPath, "wb") as fb:
|
||||
@ -106,7 +118,7 @@ class Core(object):
|
||||
except Exception as e:
|
||||
self.l.warn("Failed to install running env aria2c! System return: {}".format(e))
|
||||
elif self.__system == "Darwin":
|
||||
self.__ariaPath = self.urljoin(self.__workDir, "env", "aria2c")
|
||||
self.__ariaPath = self.urljoin(self.__workDir, "env", "aria2cdarwin")
|
||||
source = self.urljoin(source, "darwin")
|
||||
if not os.path.exists(self.__ariaPath):
|
||||
with open(self.__ariaPath, "wb") as fb:
|
||||
@ -115,47 +127,124 @@ class Core(object):
|
||||
fb.write(content)
|
||||
except Exception as e:
|
||||
self.l.warn("Failed to install running env aria2c! System return: {}".format(e))
|
||||
try:
|
||||
self.aria = aria.adapter(self.__ariaPath)
|
||||
except FileNotFoundError as e:
|
||||
self.l.warn("Failed to find running env aria2c! System return: {}".format(e))
|
||||
except TypeError as e:
|
||||
self.l.warn("Failed to find running env aria2c! System return: {}".format(e))
|
||||
else:
|
||||
self.aria = False
|
||||
|
||||
# The daemon thread function
|
||||
def __daemon(self):
|
||||
while True:
|
||||
pass
|
||||
|
||||
def urljoin(self, *args: str):
|
||||
# Start some sub-daemon-thread
|
||||
threadPool = []
|
||||
for t in threadPool:
|
||||
t.daemon = True
|
||||
t.start()
|
||||
|
||||
while True: ...
|
||||
|
||||
# Debug logs output
|
||||
def __debug(self, *args) -> None :
|
||||
self.l.info(*args)
|
||||
|
||||
# Determin wheather the @content is a legal json
|
||||
def isJson(self, content: str) -> bool:
|
||||
try:
|
||||
json.loads(content)
|
||||
except json.decoder.JSONDecodeError:
|
||||
return False
|
||||
else:
|
||||
return True
|
||||
|
||||
# Merge the url
|
||||
def urljoin(self, *args: str) -> str:
|
||||
result = os.path.join(*args)
|
||||
for i in range(result.count("\\")):
|
||||
for _ in range(result.count("\\")):
|
||||
result = result.replace("\\", "/")
|
||||
return result
|
||||
|
||||
def networkTest(self, source = r"https://www.baidu.com", retry = 3):
|
||||
# Test the network working
|
||||
def networkTest(self, source : str = r"http://www.baidu.com", retry : int = 3) -> bool:
|
||||
flag = False
|
||||
for i in range(retry):
|
||||
for _ in range(retry):
|
||||
try:
|
||||
fp = urllib.request.urlopen(source)
|
||||
fp.read(100).decode()
|
||||
fp.close()
|
||||
except:
|
||||
pass
|
||||
except Exception as e:
|
||||
self.__debug("networkTest Error:", str(e))
|
||||
else:
|
||||
flag = True
|
||||
break
|
||||
return flag
|
||||
|
||||
# Scan java in the Path and whole disk
|
||||
def searchJava(self) -> None:
|
||||
keywords = ("javaw", "java", "javaw.exe", "java.exe")
|
||||
# Search in Env Vars
|
||||
def env() -> None :
|
||||
while True:
|
||||
javaEnv = os.environ.get("Path", None) if self.__system == "Windows" else os.environ.get("PATH", None)
|
||||
if javaEnv:
|
||||
javaEnv = javaEnv.split(";") if self.__system == "Windows" else javaEnv.split(":")
|
||||
for j in javaEnv:
|
||||
for name in keywords:
|
||||
if name == os.path.basename(j) and "jdk" not in j:
|
||||
if os.path.exists(j):
|
||||
version = self.javaVersion(j)
|
||||
if not version:
|
||||
self.java[0].append((j, version))
|
||||
time.sleep(0.5)
|
||||
# Scan in whole disk
|
||||
def disk() -> None:
|
||||
while True:
|
||||
disks = []
|
||||
if self.__system == "Windows":
|
||||
partitions = psutil.disk_partitions()
|
||||
for p in partitions:
|
||||
disks.append(p.mountpoint)
|
||||
else:
|
||||
disks.append("/")
|
||||
for d in disks:
|
||||
for root, _, file in os.walk(d):
|
||||
for f in file:
|
||||
filePath = os.path.join(root, f)
|
||||
for name in keywords:
|
||||
if name == os.path.basename(filePath) and "jdk" not in filePath:
|
||||
if os.path.exists(filePath):
|
||||
version = self.javaVersion(filePath)
|
||||
if not version:
|
||||
self.java[0].append((filePath, version))
|
||||
time.sleep(0.5)
|
||||
envThread = Thread(target = env, name = "scanJavaEnv")
|
||||
diskThread = Thread(target = disk, name = "scanJavaDisk")
|
||||
envThread.daemon = True
|
||||
diskThread.daemon = True
|
||||
envThread.start()
|
||||
diskThread.start()
|
||||
|
||||
def searchJava(self):
|
||||
javaEnv = os.environ.get("Path", None) if self.__system == "Windows" else os.environ.get("PATH", None)
|
||||
if javaEnv:
|
||||
javaEnv = javaEnv.split(";") if self.__system == "Windows" else javaEnv.split(":")
|
||||
for j in javaEnv:
|
||||
for name in ("Java", "java", "JAVA", "Jre", "jre", "JRE"):
|
||||
if name in j:
|
||||
java = j
|
||||
merge = os.path.join(java, "javaw.exe" if self.__system == "Windows" else "java")
|
||||
if os.path.exists(merge):
|
||||
return merge
|
||||
# Read the version of the java
|
||||
def javaVersion(self, path : str):
|
||||
p = Popen((path, "--version"), shell = True, stdout = PIPE)
|
||||
out = p.communicate()[0]
|
||||
try:
|
||||
result = int(out.splitlines()[0].decode().split()[1].split(".")[0])
|
||||
except (UnicodeDecodeError, ValueError):
|
||||
return False
|
||||
else:
|
||||
return result
|
||||
|
||||
def autoMemory(self):
|
||||
# Return a auto-determined memory value for game
|
||||
def autoMemory(self) -> float:
|
||||
return 0.8 * (psutil.virtual_memory().free / 1024 ** 2)
|
||||
|
||||
def generateUUID(self, id):
|
||||
# Generate a offline player UUID
|
||||
def generateUUID(self, id : str) -> str:
|
||||
result = hashlib.md5()
|
||||
result.update("".join(('OfflinePlayer:', id)).encode())
|
||||
result = result.hexdigest()
|
||||
return result
|
||||
return result
|
||||
|
7
Test.py
Normal file → Executable file
7
Test.py
Normal file → Executable file
@ -1,5 +1,8 @@
|
||||
|
||||
import platform, subprocess, urllib.parse, os, requests
|
||||
import platform, subprocess, urllib.parse, os, requests, asyncio, time
|
||||
import GMCLCore
|
||||
|
||||
Core = GMCLCore.Core()
|
||||
Core = GMCLCore.Core()
|
||||
|
||||
while True:
|
||||
exec(input())
|
0
icon.ico
Normal file → Executable file
0
icon.ico
Normal file → Executable file
Before Width: | Height: | Size: 66 KiB After Width: | Height: | Size: 66 KiB |
0
old/0.1.0/config.json
Normal file → Executable file
0
old/0.1.0/config.json
Normal file → Executable file
0
old/0.1.0/gmclc.py
Normal file → Executable file
0
old/0.1.0/gmclc.py
Normal file → Executable file
0
old/other/GMCLCore.py
Normal file → Executable file
0
old/other/GMCLCore.py
Normal file → Executable file
0
old/other/requirement.txt
Normal file → Executable file
0
old/other/requirement.txt
Normal file → Executable file
3
requirement.txt
Executable file
3
requirement.txt
Executable file
@ -0,0 +1,3 @@
|
||||
psutil
|
||||
tencentcloud-sdk-python
|
||||
pywin32; platform_system == "Windows"
|
Reference in New Issue
Block a user