This repository has been archived on 2022-12-28. You can view files and clone it, but cannot push or open issues or pull requests.
gmclcore/main.py

152 lines
5.4 KiB
Python
Raw Normal View History

2020-10-23 05:25:17 +00:00
#------------------#
import os,requests,json,time,sys,psutil,string,platform,glob,getpass,shutil,hashlib,random,subprocess,math,zipfile,threading
2020-10-23 05:25:17 +00:00
#------------------#
class MultiThreadDownload(threading.Thread):
'''class for Multi-Thread Download'''
def __init__(self,url,startpos,endpos,f):
super(MultiThreadDownload,self).__init__()
self.url = url
self.startpos = startpos
self.endpos = endpos
self.fd = f
def download(self):
headers = {"Range":"bytes=%s-%s"%(self.startpos,self.endpos)}
res = requests.get(self.url,headers=headers)
self.fd.seek(self.startpos)
self.fd.write(res.content)
def run(self):
self.download()
2020-10-23 05:25:17 +00:00
class GMCLCore(object):
'''The Main Class of the Launcher Core'''
'''
2020-10-23 05:25:17 +00:00
self.__GamePath=GamePath
self.__Version=Version
'''
def __init__(self,LauncherName="GMCLCore",LauncherVersion="A0.2.0"):
self.__LauncherName=LauncherName
self.__LauncherVersion=LauncherVersion
2020-10-23 05:25:17 +00:00
self.__UserAgent={'User-Agent':LauncherName+'/'+LauncherVersion+' ((GMCL Core Alpha 0.2.0;Alpha))'}
def GetAuthWay(self,AuthWay):
if(AuthWay=="offline"):
self.__AuthWay="offline"
elif(AuthWay=="online"):
self.__AuthWay="online"
else:
return "Error:Wrong Auth Way."
2020-10-30 12:00:43 +00:00
def GetAccount(self,Account="Steve"):
2020-10-30 08:04:26 +00:00
if(self.__AuthWay=="online"):
if(Account.count("@")==1):
self.OnlineAuth(Account,self._Password)
else:
return "Error:Wrong Account."
elif(self.__AuthWay=="offline"):
if(Account.count("@")==1):
return "Error:Wrong Account."
else:
self.OfflineAuth(Account)
else:
pass
2020-10-30 12:00:43 +00:00
def GetUUID(self,Account="Steve"):
2020-10-30 08:04:26 +00:00
if(self.__AuthWay=="offline"):
result="OfflinePlayer:"+Account
md5=hashlib.md5()
md5.update(result.encode(encoding='utf-8'))
return md5.hexdigest()
else:
return "Error:Wrong Auth Way."
def OnlineAuth(self,Account,Password):
if(json.loads(requests.get("https://authserver.mojang.com/",headers=self.__UserAgent).text)['status']=="OK"):
result=json.loads(requests.post("https://authserver.mojang.com/authenticate",'{"agent":{"name":"Minecraft","Version":1},"username":"'+Account+'","password":"'+Password+'"}',headers=self.__UserAgent).text)
self.__Token=result['accessToken']
self.__UUID=result['selectedProfile']['id']
self.__ID=result['selectedProfile']['name']
else:
2020-10-30 08:06:35 +00:00
return "Error:Fail to request Mojang\'s Auth Server."
2020-10-30 12:00:43 +00:00
def OfflineAuth(self,Account="Steve"):
2020-10-30 08:04:26 +00:00
self.__ID=Account
self.__UUID=self.GetUUID(Account)
self.__Token=""
2020-10-30 12:00:43 +00:00
def GetJavaPath(self,Num=1):
if(platform.system()=="Windows"):
path="C:/"
elif(platform.system()=="Linux"):
path="/"
else:
path="/"
i=0
for ipath in os.listdir(Path):
FullDir=os.path.join(path,ipath)
if(os.path.isfile(FullDir)):
if("javaw.exe" in os.path.split(FullDir)[1]):
return FullDir
i+=1
if(i==Num):
break
def SetRecomMem(self):
2020-10-30 08:04:26 +00:00
if(platform.system()=="Windows"):
path="C:/"
elif(platform.system()=="Linux"):
path="/"
else:
path="/"
i=0
for ipath in os.listdir(Path):
FullDir=os.path.join(path,ipath)
if(os.path.isfile(FullDir)):
if("javaw.exe" in os.path.split(FullDir)[1]):
return FullDir
i+=1
if(i==1):
2020-10-30 08:04:26 +00:00
break
2020-10-30 12:00:43 +00:00
def SetRecomMem(self):
self.__Memory = float(psutil.virtual_memory().free / 1024 ** 3) * 0.8
def SetJavaPath(self,path):
if(path==None):
return "Error:Wrong local address for java."
else:
2020-10-30 12:00:43 +00:00
if(os.path.exists(path)):
self.__JAVA=path
else:
return "Error:Wrong local address for java."
def SetGameMem(self,Memory):
try:
self.__Memory=float(Memory)
except:
return "Error:Wrong parameter for game memory."
def Download(self,DownloadFrom,DownloadTo,ThreadNum=3):
2020-10-30 08:04:26 +00:00
if(DownloadFrom=="" or DownloadTo==""):
return "Error:Wrong online address or local address for download."
2020-10-30 08:04:26 +00:00
else:
url = DownloadFrom
filename = DownloadTo
filesize = int(requests.head(url).headers['Content-Length'])
threadnum = ThreadNum
threading.BoundedSemaphore(threadnum)
step = filesize // threadnum
mtd_list = []
start = 0
end = -1
tempf = open(filename,'w')
tempf.close()
with open(filename,'rb+') as f:
fileno = f.fileno()
while end < filesize -1:
start = end +1
end = start + step -1
if end > filesize:
end = filesize
dup = os.dup(fileno)
fd = os.fdopen(dup,'rb+',-1)
t = MultiThreadDownload(url,start,end,fd)
t.start()
mtd_list.append(t)
for i in mtd_list:
i.join()