From 22c47c75d6845e251a0e6bfb9bb3d2b942ab7dda Mon Sep 17 00:00:00 2001 From: Bigsk Date: Wed, 25 Mar 2020 10:43:38 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- synchronize/synchronize.py | 315 +++++++++++++++++++++++++++++++++++++ 1 file changed, 315 insertions(+) create mode 100644 synchronize/synchronize.py diff --git a/synchronize/synchronize.py b/synchronize/synchronize.py new file mode 100644 index 0000000..ea0e9f8 --- /dev/null +++ b/synchronize/synchronize.py @@ -0,0 +1,315 @@ +import requests +import os +import time +import json + +print('[' + time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) + ']' + '[INFO]:Starting the synchronizing system.') +#------------------------------------------------------------------------# +print('------------------------------------------------------------------------') + +#Part Of All Kinds Of Global Variables + +print('[' + time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) + ']' + '[INFO]:Starting to specify global variables.') +SystemName='GeMC API Synchronize Tool' +SavePath='gemcapi/' +Log='[' + time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) + ']' + '[INFO]:Starting the synchronizing system.\n' + '------------------------------------------------------------------------\n' + '[' + time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) + ']' + '[INFO]:Starting to specify global variables.\n' + '[' + time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) + ']' + '[INFO]:Specifying global variables successful.\n' +print('[' + time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) + ']' + '[INFO]:Specifying global variables successful.') + +#------------------------------------------------------------------------# +print('------------------------------------------------------------------------') +Log=Log + '------------------------------------------------------------------------' + '\n' + +#The Part Of All Kinds Of Modules. + +print('[' + time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) + ']' + '[INFO]:Starting to load all kinds of modules.') +Log=Log + '[' + time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) + ']' + '[INFO]:Starting to load all kinds of modules.' + '\n' +#Module Which Be Used To Print And Save Logs. +def log(logvar): + global Log + print('[' + time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) + ']' + logvar) + Log=Log + '[' + time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) + ']' + logvar + '\n' +#Module Which Be Used To Synchronize Single File. +def synchronize(url, filepath): + global Log + log('[INFO]:The ' + SystemName + ' is synchronizing the file ' + SavePath + filepath + '.') + try: + synchronize=requests.get(url) + with open(SavePath + filepath,"wb") as code: + code.write(synchronize.content) + except: + log('[ERROR]:There has a error in task of synchronizing the file ' + SavePath + filepath + '.Don\'t report this to Ghink Network Studio.This is not a bug.') + else: + log('[INFO]:The file ' + SavePath + filepath + ' has been synchronized successfully.') +#Module Which Be Used To Determine Whether The Dir Exists. +def make_sure_dir_exists(dirpath): + global Log + if os.path.exists(SavePath + dirpath): + log('[INFO]:The dir ' + SavePath + dirpath + ' has already existed.Nothing to do.') + else: + log('[INFO]:The dir ' + SavePath + dirpath + ' does not exist.The ' + SystemName + ' will create one.') + os.makedirs(SavePath + dirpath) +#Module Which Be Used To Print Dividing Line. +def dividingline(): + global Log + print('------------------------------------------------------------------------') + Log=Log + '------------------------------------------------------------------------' + '\n' +log('[INFO]:Loading all kinds of modules successfully.') + +#------------------------------------------------------------------------# +dividingline() + +#Save JSON In Global Variables + +#Save MC Versions List Json In Global Variables +log('[INFO]:Starting to get the json of MC versions list.') +mcversionsjson=requests.get(url='http://launchermeta.mojang.com/mc/game/version_manifest.json') +log('[INFO]:Get the json of MC versions successfully.') +#Save Liteloader Versions List Json In Global Variables +log('[INFO]:Starting to get the json of Liteloader Versions list.') +liteloaderversionsjson=requests.get(url='http://dl.liteloader.com/versions/versions.json') +log('[INFO]:Get the json of Liteloader Versions successfully.') +#Save authlib-injector List Json In Global Variables +authlibinjectorbuildsjson=requests.get(url='http://authlib-injector.yushi.moe/index.json') +log('[INFO]:Get the json of authlib-injector successfully.') + +#------------------------------------------------------------------------# +dividingline() + +#The Part of Determining Whether The Dir Exists. + +#Determining Whether The Log Dir Exists. +log('[INFO]:Starting to determine whether the log dir exists.') +dirpath='log' +if os.path.exists(dirpath): + log('[INFO]:The dir ' + dirpath + ' has already existed.Nothing to do.') +else: + log('[INFO]:The dir ' + dirpath + ' does not exist.The ' + SystemName + ' will create one.') + os.makedirs(dirpath) +log('[INFO]:Determining whether the log dir exists successfully.') +log('[INFO]:Starting to determine whether all of dirs exists.') +#Determining Whether The MC Versions Dir Exists. +log('[INFO]:Starting to determine whether the MC versions dir exists.') +make_sure_dir_exists('mojang/launchermeta/mc/game') +log('[INFO]:Determining whether the MC versions dir exists successfully.') +#Determining Whether The Liteloader Versions Dir Exists. +log('[INFO]:Starting to determine whether the Liteloader versions dir exists.') +make_sure_dir_exists('liteloader/dl/versions') +log('[INFO]:Determining whether the Liteloader versions dir exists successfully.') +#Determining Whether The authlib-injector Builds Dir Exists. +log('[INFO]:Starting to determine whether the authlib-injector builds dir exists.') +make_sure_dir_exists('yushi/authlib-injector/artifact') +log('[INFO]:Determining whether the authlib-injector builds dir exists successfully.') +log('[INFO]:Determining whether all of dirs exists successfully.') + +#------------------------------------------------------------------------# +dividingline() + +#The Part of Synchronizing Single Files. + +log('[INFO]:Starting to synchronize single files.') +#Synchronizing The Minecraft Versions List File. +log('[INFO]:Starting to synchronize MC versions files.') +synchronize('http://launchermeta.mojang.com/mc/game/version_manifest.json', 'mojang/launchermeta/mc/game/version_manifest.json') +log('[INFO]:Synchronizing MC versions files successfully.') +#Synchronizing The Liteloader Versions List File. +log('[INFO]:Starting to synchronize Liteloader versions files.') +synchronize('http://dl.liteloader.com/versions/versions.json', 'liteloader/dl/versions/versions.json') +log('[INFO]:Synchronizing Liteloader versions files successfully.') +#Synchronizing The authlib-injector Builds List File. +log('[INFO]:Starting to synchronize authlib-injector builds files.') +synchronize('http://authlib-injector.yushi.moe/index.json', 'yushi/authlib-injector/index.json') +log('[INFO]:Synchronizing authlib-injector builds files successfully.') + +#------------------------------------------------------------------------# +dividingline() + +#authlib-injector Builds Synchronizing Part. +log('[INFO]:Starting to synchronize all of authlib-injector builds.') +log('[INFO]:Starting to synchronize the latest authlib-injector builds.') +synchronize('http://authlib-injector.yushi.moe/artifact/latest.json', 'yushi/authlib-injector/artifact/latest.json') +log('[INFO]:Synchronizing the latest authlib-injector builds successfully.') +log('[INFO]:Starting to synchronize the list of authlib-injector builds.') +synchronize('http://authlib-injector.yushi.moe/artifacts.json', 'yushi/authlib-injector/artifacts.json') +log('[INFO]:Synchronizing the list of authlib-injector builds successfully.') +log('[INFO]:Starting to get the list json of builds.') +try: + authlibinjectorbuildsjson=requests.get(url='https://authlib-injector.yushi.moe/artifacts.json') + authlibinjectorbuildstext=authlibinjectorbuildsjson.text +except: + log('[ERROR]:There has a error in task of synchronizing files in list json of builds.Don\'t report this to Ghink Network Studio.This is not a bug.') +else: + log('[INFO]:Get the list json of builds successfully.') +log('[INFO]:Starting to synchronize jsons of old builds.') +log('[INFO]:Starting to get list json of builds.') +authlibinjectorbuildstextjson = eval(authlibinjectorbuildstext, type('Dummy', (dict,), dict(__getitem__=lambda s,n:n))()) +authlibinjectorbuildsnumber=authlibinjectorbuildstextjson['latest_build_number'] +log('[INFO]:Geting list json of builds successfully.') +log('[INFO]:Starting to count how many authlib-injector builds in total.') +log('[INFO]:There has ' + str(authlibinjectorbuildsnumber) + ' authlib-injector builds in total .') +log('[INFO]:Counting how many how many authlib-injector builds in total successfully.') +log('[INFO]:Start to synchronize jsons of other builds.') +whiletimes=0#Set Var whiletimes To Avoid Error. +while(whiletimes < authlibinjectorbuildsnumber): + whiletimes=whiletimes + 1 + synchronize('http://authlib-injector.yushi.moe/artifact/' + str(whiletimes) + '.json', 'yushi/authlib-injector/artifact/' + str(whiletimes) + '.json') +log('[INFO]:Synchronizing jsons of other builds successfully.') + +#------------------------------------------------------------------------# +dividingline() + +#MC Versions Synchronizing Part. + +log('[INFO]:Starting to synchronize all of MC versions.') +log('[INFO]:Starting to count how many MC versions in total.') +#Count How Many MC Versions in total. +mcversionsjsontext=mcversionsjson.text +mcversionsnumber=mcversionsjsontext.count('"url":') +log('[INFO]:There has ' + str(mcversionsnumber) + ' MC versions in total .') +log('[INFO]:Counting how many MC versions in total successfully.') +#Starting To Synchronize More Files And Dirs. +#Auto Synchronize Files And Dirs on https://launchermeta.mojang.com/. +log('[INFO]:Starting to synchronize files and dirs on https://launchermeta.mojang.com/.') +whiletimes=0#Set Var whiletimes To Avoid Error. +while(whiletimes < mcversionsnumber): + #Count While Times. + whiletimes=whiletimes + 1 + #Read Json Of MC Versions List. + downloadurlload=json.loads(mcversionsjsontext) + whiletimesload=whiletimes - 1 + onlineurl=downloadurlload['versions'][whiletimesload]['url'] + onlineurlwithouthttps=onlineurl.replace('https://', 'http://')#Avoid Https Connetion Errors + fileurl='mojang/launchermeta/' + onlineurl.replace('https://launchermeta.mojang.com/','') + filetosync=fileurl[::-1].split('/', 1)[-1][::-1] + #Synchronize. + make_sure_dir_exists(filetosync) + synchronize(onlineurlwithouthttps, fileurl) +log('[INFO]:Synchronizing files and dirs on https://launchermeta.mojang.com/ successfully.') +#Auto Synchronize Files And Dirs on https://libraries.minecraft.net/. +log('[INFO]:Starting to synchronize files and dirs on https://libraries.minecraft.net/.') +#Part Of 'downloads'. +whiletimes=0#Set Var whiletimes To Avoid Error. +while(whiletimes < mcversionsnumber): + #Count While Times. + whiletimes=whiletimes + 1 + #Read Json Of MC Versions List. + downloadurlload=json.loads(mcversionsjsontext) + whiletimesload=whiletimes - 1 + onlineurl=downloadurlload['versions'][whiletimesload]['url'] + onlineurlwithouthttps=onlineurl.replace('https://', 'http://')#Avoid Https Connetion Errors + log('[INFO]:Starting to get the json of MC libraries ' + onlineurl +' list.') + #Save MC Libraries Json In Global Variables + try:#Avoid Http/Httos Connection Errors Making Whole Synchronize Stop. + mclibrariesjson=requests.get(url=onlineurlwithouthttps) + except: + log('[ERROR]:There has a error in task of getting json of MC libraries ' + onlineurl + '.Don\'t report this to Ghink Network Studio.This is not a bug.') + else: + log('[INFO]:Get json of MC libraries ' + onlineurl + ' successfully.') + #Read Json Of MC Libraries. + mclibrariesload=json.loads(mclibrariesjson.text) + #Synchronize Files In "downloads". + log('[INFO]:Starting to synchronize files in ”downloads".') + try:#Avoid Http/Httos Connection Errors Or Synchronize Module Download Failed Errors Making Whole Synchronize Stop. + #Synchronize Files In "downloads". + onlineurl2=mclibrariesload['downloads']['client']['url'] + fileurl2='mojang/launcher/' + onlineurl2.replace('https://launcher.mojang.com/','') + filetosync2=fileurl2[::-1].split('/', 1)[-1][::-1] + make_sure_dir_exists(filetosync2) + synchronize(onlineurl2, fileurl2) + onlineurl2=mclibrariesload['downloads']['client_mappings']['url'] + fileurl2='mojang/launcher/' + onlineurl2.replace('https://launcher.mojang.com/','') + filetosync2=fileurl2[::-1].split('/', 1)[-1][::-1] + make_sure_dir_exists(filetosync2) + synchronize(onlineurl2, fileurl2) + onlineurl2=mclibrariesload['downloads']['server']['url'] + fileurl2='mojang/launcher/' + onlineurl2.replace('https://launcher.mojang.com/','') + filetosync2=fileurl2[::-1].split('/', 1)[-1][::-1] + make_sure_dir_exists(filetosync2) + synchronize(onlineurl2, fileurl2) + onlineurl2=mclibrariesload['downloads']['server_mappings']['url'] + fileurl2='mojang/launcher/' + onlineurl2.replace('https://launcher.mojang.com/','') + filetosync2=fileurl2[::-1].split('/', 1)[-1][::-1] + make_sure_dir_exists(filetosync2) + synchronize(onlineurl2, fileurl2) + #Synchronize Files In "loggin". + onlineurl2=mclibrariesload['loggin']['client']['file']['url'] + fileurl2='mojang/launcher/' + onlineurl2.replace('https://launcher.mojang.com/','') + filetosync2=fileurl2[::-1].split('/', 1)[-1][::-1] + make_sure_dir_exists(filetosync2) + synchronize(onlineurl2, fileurl2) + except: + log('[ERROR]:There has a error in task of synchronizing files in "downloads" or "loggin".Don\'t report this to Ghink Network Studio.This is not a bug.') + else: + log('[INFO]:Synchronizing files in "downloads" successfully.') + log('[INFO]:Starting to count how many MC libraries files in ' + onlineurl + ' in total.') + #Count How Many MC Libraries Files in total. + mclibrariesjsontext=mclibrariesjson.text + mclibrariesnumber=mclibrariesjsontext.count('"url":') - 6 + log('[INFO]:There has ' + str(mclibrariesnumber) + ' MC libraries files in ' + onlineurl + ' in total.') + log('[INFO]:Counting how many MC libraries files in ' + onlineurl + ' in total successfully.') + whiletimes3=0#Set Var whiletimes To Avoid Error. + while(whiletimes3 < mclibrariesnumber): + #Count While Times. + whiletimes3=whiletimes3 + 1 + whiletimesload3=whiletimes3 - 1 + #Synchronize Files In "libraries". + log('[INFO]:Starting to synchronize Files In "libraries".') + try:#Avoid Http/Httos Connection Errors Or Synchronize Module Download Failed Errors Making Whole Synchronize Stop. + #Synchronize Files In "libraries/.../downloads/artifact". + onlineurl3=mclibrariesload['libraries'][whiletimesload3]['downloads']['artifact']['url'] + onlineurlwithouthttps3=onlineurl3.replace('https://', 'http://') + fileurl3='mojang/libraries/' + onlineurl3.replace('https://libraries.minecraft.net/','') + filetosync3=fileurl3[::-1].split('/', 1)[-1][::-1] + make_sure_dir_exists(filetosync3) + synchronize(onlineurlwithouthttps3, fileurl3) + #Synchronize Files In "libraries/.../downloads/classifiers/javadoc". + onlineurl3=mclibrariesload['libraries'][whiletimesload3]['downloads']['classifiers']['javadoc']['url'] + onlineurlwithouthttps3=onlineurl3.replace('https://', 'http://') + fileurl3='mojang/libraries/' + onlineurl3.replace('https://libraries.minecraft.net/','') + filetosync3=fileurl3[::-1].split('/', 1)[-1][::-1] + make_sure_dir_exists(filetosync3) + synchronize(onlineurlwithouthttps3, fileurl3) + #Synchronize Files In "libraries/.../downloads/classifiers/natives-linux". + onlineurl3=mclibrariesload['libraries'][whiletimesload3]['downloads']['classifiers']['natives-linux']['url'] + onlineurlwithouthttps3=onlineurl3.replace('https://', 'http://') + fileurl3='mojang/libraries/' + onlineurl3.replace('https://libraries.minecraft.net/','') + filetosync3=fileurl3[::-1].split('/', 1)[-1][::-1] + make_sure_dir_exists(filetosync3) + synchronize(onlineurlwithouthttps3, fileurl3) + #Synchronize Files In "libraries/.../downloads/classifiers/natives-macos". + onlineurl3=mclibrariesload['libraries'][whiletimesload3]['downloads']['classifiers']['natives-macos']['url'] + onlineurlwithouthttps3=onlineurl3.replace('https://', 'http://') + fileurl3='mojang/libraries/' + onlineurl3.replace('https://libraries.minecraft.net/','') + filetosync3=fileurl3[::-1].split('/', 1)[-1][::-1] + make_sure_dir_exists(filetosync3) + synchronize(onlineurlwithouthttps3, fileurl3) + #Synchronize Files In "libraries/.../downloads/classifiers/natives-windows". + onlineurl3=mclibrariesload['libraries'][whiletimesload3]['downloads']['classifiers']['natives-windows']['url'] + onlineurlwithouthttps3=onlineurl3.replace('https://', 'http://') + fileurl3='mojang/libraries/' + onlineurl3.replace('https://libraries.minecraft.net/','') + filetosync3=fileurl3[::-1].split('/', 1)[-1][::-1] + make_sure_dir_exists(filetosync3) + synchronize(onlineurlwithouthttps3, fileurl3) + #Synchronize Files In "libraries/.../downloads/artifact/classifiers/sources". + onlineurl3=mclibrariesload['libraries'][whiletimesload3]['downloads']['classifiers']['sources']['url'] + onlineurlwithouthttps3=onlineurl3.replace('https://', 'http://') + fileurl3='mojang/libraries/' + onlineurl3.replace('https://libraries.minecraft.net/','') + filetosync3=fileurl3[::-1].split('/', 1)[-1][::-1] + make_sure_dir_exists(filetosync3) + synchronize(onlineurlwithouthttps3, fileurl3) + except: + log('[ERROR]:There has a error in task of synchronizing files in ”libraries".Don\'t report this to Ghink Network Studio.This is not a bug.') + else: + log('[INFO]:Synchronizing files in "libraries" successfully.') + +log('[INFO]:Synchronizing files and dirs on https://libraries.minecraft.net/ successfully.') +log('[INFO]:Synchronizing all of MC Versions successfully.') + +#------------------------------------------------------------------------# +dividingline() + +#Starting To Save Logs. +log('[INFO]:Starting to save logs.') +logwrite=open('log/' + str(time.strftime("%Y-%m-%d-%H-%M-%S", time.localtime()) + '.txt'),mode='w') +logwrite.write(Log + '[' + time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) + ']' + '[INFO]:Save logs successfully.' + '\n' + '[' + time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) + ']' + '[INFO]:All tasks of synchronizing have done successfully.') +print('[' + time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) + ']' + '[INFO]:Save logs successfully.' + '\n' + '[' + time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) + ']' + '[INFO]:All tasks of synchronizing have done successfully.') +logwrite.close()