mirror of
				https://github.com/Neocky/pluGET.git
				synced 2024-04-29 16:12:30 +00:00 
			
		
		
		
	Renamed main file and removed old src
This commit is contained in:
		| @@ -1,16 +0,0 @@ | ||||
| from utils.consoleoutput import consoleTitle, clearConsole, printMainMenu | ||||
| from utils.utilities import check_requirements | ||||
| from handlers.handle_input import createInputLists, getInput | ||||
| from handlers.handle_config import checkConfig | ||||
|  | ||||
|  | ||||
| def mainFunction(): | ||||
|     consoleTitle() | ||||
|     clearConsole() | ||||
|     checkConfig() | ||||
|     check_requirements() | ||||
|     createInputLists() | ||||
|     printMainMenu() | ||||
|     getInput() | ||||
|  | ||||
| mainFunction() | ||||
| @@ -1,26 +0,0 @@ | ||||
| [General] | ||||
| ; = If a local plugin folder exists (True/False) (If False SFTP/FTP will be used): | ||||
| uselocalpluginfolder = True | ||||
|  | ||||
| [Local - This Machine] | ||||
| pathtopluginfolder = C:/Users/USER/Desktop/plugins | ||||
| ; = For a different folder to store the updated plugins change to (True/False) and the path below | ||||
| seperatedownloadpath = False | ||||
| pathtoseperatedownloadpath = C:/Users/USER/Desktop/plugins | ||||
|  | ||||
| [SFTP - Remote Server] | ||||
| server = 0.0.0.0 | ||||
| username = user | ||||
| password = password | ||||
| ; = If a different Port for SFTP needs to be used (Default: 22) | ||||
| sftpport = 22 | ||||
| ;_ = If a different Port for FTP needs to be used (Default: 21) | ||||
| ftpport = 21 | ||||
| ;__ = Change the path below if the plugin folder path is different on the SFTP/FTP server (Change only if you know what you are doing) | ||||
| pluginfolderonserver = /plugins | ||||
| ;___ = If you want to use FTP instead of SFTP change to (False) else use (True) | ||||
| use_sftp = True | ||||
| ;____ = For a different folder to store the updated plugins (Only with the update command!) change to (True/False) and the path below | ||||
| seperatedownloadpath = False | ||||
| pathtoseperatedownloadpath = /plugins | ||||
|  | ||||
| @@ -1,91 +0,0 @@ | ||||
| import os | ||||
| import sys | ||||
| import configparser | ||||
| from pathlib import Path | ||||
|  | ||||
| from utils.consoleoutput import oColors | ||||
|  | ||||
|  | ||||
| class configurationValues: | ||||
|     def __init__(self): | ||||
|         config = configparser.ConfigParser() | ||||
|         config.sections() | ||||
|         config.read("config.ini") | ||||
|         localPluginFolder = config['General']['UseLocalPluginFolder'] | ||||
|         self.pathToPluginFolder = Path(config['Local - This Machine']['PathToPluginFolder']) | ||||
|         seperateDownloadPath = config['Local - This Machine']['SeperateDownloadPath'] | ||||
|         self.pathToSeperateDownloadPath = Path(config['Local - This Machine']['PathToSeperateDownloadPath']) | ||||
|  | ||||
|         self.sftp_server = config['SFTP - Remote Server']['Server'] | ||||
|         self.sftp_user = config['SFTP - Remote Server']['Username'] | ||||
|         self.sftp_password = config['SFTP - Remote Server']['Password'] | ||||
|         sftp_port = config['SFTP - Remote Server']['SFTPPort'] | ||||
|         ftp_port = config['SFTP - Remote Server']['FTPPort'] | ||||
|         self.sftp_folderPath = config['SFTP - Remote Server']['PluginFolderOnServer'] | ||||
|         sftp_useSftp = config['SFTP - Remote Server']['USE_SFTP'] | ||||
|         sftp_seperateDownloadPath = config['SFTP - Remote Server']['SeperateDownloadPath'] | ||||
|         self.sftp_pathToSeperateDownloadPath = config['SFTP - Remote Server']['PathToSeperateDownloadPath'] | ||||
|  | ||||
|         self.sftp_port = int(sftp_port) | ||||
|         self.ftp_port = int(ftp_port) | ||||
|         if localPluginFolder == 'True': | ||||
|             self.localPluginFolder = True | ||||
|         else: | ||||
|             self.localPluginFolder = False | ||||
|  | ||||
|         if seperateDownloadPath == 'True': | ||||
|             self.seperateDownloadPath = True | ||||
|         else: | ||||
|             self.seperateDownloadPath = False | ||||
|  | ||||
|         if sftp_seperateDownloadPath == 'True': | ||||
|             self.sftp_seperateDownloadPath = True | ||||
|         else: | ||||
|             self.sftp_seperateDownloadPath = False | ||||
|  | ||||
|         if sftp_useSftp == 'True': | ||||
|             self.sftp_useSftp = True | ||||
|         else: | ||||
|             self.sftp_useSftp = False | ||||
|  | ||||
|  | ||||
| def checkConfig(): | ||||
|     configAvailable = os.path.isfile("config.ini") | ||||
|     if not configAvailable: | ||||
|         createConfig() | ||||
|         print(oColors.brightRed + "Config created. Edit config before executing again!" + oColors.standardWhite) | ||||
|         input("Press any key + enter to exit...") | ||||
|         sys.exit() | ||||
|  | ||||
|  | ||||
| def createConfig(): | ||||
|     config = configparser.ConfigParser(allow_no_value=True) | ||||
|     config['General'] = {} | ||||
|     config['General'][';'] = 'If a local plugin folder exists (True/False) (If False SFTP/FTP will be used):' | ||||
|     config['General']['UseLocalPluginFolder'] = 'True' | ||||
|  | ||||
|     config['Local - This Machine'] = {} | ||||
|     config['Local - This Machine']['PathToPluginFolder'] = 'C:/Users/USER/Desktop/plugins' | ||||
|     config['Local - This Machine'][';'] = 'For a different folder to store the updated plugins change to (True/False) and the path below' | ||||
|     config['Local - This Machine']['SeperateDownloadPath'] = 'False' | ||||
|     config['Local - This Machine']['PathToSeperateDownloadPath'] = 'C:/Users/USER/Desktop/plugins' | ||||
|  | ||||
|     config['SFTP - Remote Server'] = {} | ||||
|     config['SFTP - Remote Server']['Server'] = '0.0.0.0' | ||||
|     config['SFTP - Remote Server']['Username'] = 'user' | ||||
|     config['SFTP - Remote Server']['Password'] = 'password' | ||||
|     config['SFTP - Remote Server'][';'] = 'If a different Port for SFTP needs to be used (Default: 22)' | ||||
|     config['SFTP - Remote Server']['SFTPPort'] = '22' | ||||
|     config['SFTP - Remote Server'][';_'] = 'If a different Port for FTP needs to be used (Default: 21)' | ||||
|     config['SFTP - Remote Server']['FTPPort'] = '21' | ||||
|     config['SFTP - Remote Server'][';__'] = 'Change the path below if the plugin folder path is different on the SFTP/FTP server (Change only if you know what you are doing)' | ||||
|     config['SFTP - Remote Server']['PluginFolderOnServer'] = '/plugins' | ||||
|     config['SFTP - Remote Server'][';___'] = 'If you want to use FTP instead of SFTP change to (False) else use (True)' | ||||
|     config['SFTP - Remote Server']['USE_SFTP'] = 'True' | ||||
|     config['SFTP - Remote Server'][';____'] = 'For a different folder to store the updated plugins (Only with the update command!) change to (True/False) and the path below' | ||||
|     config['SFTP - Remote Server']['SeperateDownloadPath'] = 'False' | ||||
|     config['SFTP - Remote Server']['PathToSeperateDownloadPath'] = '/plugins' | ||||
|  | ||||
|  | ||||
|     with open('config.ini', 'w') as configfile: | ||||
|         config.write(configfile) | ||||
| @@ -1,117 +0,0 @@ | ||||
| import os | ||||
| import sys | ||||
| import ftplib | ||||
| import stat | ||||
| import re | ||||
|  | ||||
| from utils.consoleoutput import oColors | ||||
| from handlers.handle_config import configurationValues | ||||
|  | ||||
|  | ||||
| def createFTPConnection(): | ||||
|     configValues = configurationValues() | ||||
|     try: | ||||
|         ftp = ftplib.FTP() | ||||
|         ftp.connect(configValues.sftp_server, configValues.ftp_port) | ||||
|         ftp.login(configValues.sftp_user, configValues.sftp_password) | ||||
|         return ftp | ||||
|     except UnboundLocalError: | ||||
|         print(oColors.brightRed + "[FTP]: Check your config.ini!" + oColors.standardWhite) | ||||
|         print(oColors.brightRed + "Exiting program..." + oColors.standardWhite) | ||||
|         sys.exit() | ||||
|  | ||||
|  | ||||
| def ftp_showPlugins(ftp): | ||||
|     configValues = configurationValues() | ||||
|     ftp.cwd(configValues.sftp_folderPath) | ||||
|     for attr in ftp.dir(): | ||||
|         print(attr.filename, attr) | ||||
|  | ||||
|  | ||||
| def ftp_upload_file(ftp, itemPath): | ||||
|     configValues = configurationValues() | ||||
|     if configValues.sftp_seperateDownloadPath is True: | ||||
|         uploadFolderPath = configValues.sftp_pathToSeperateDownloadPath | ||||
|     else: | ||||
|         uploadFolderPath = configValues.sftp_folderPath | ||||
|     try: | ||||
|         ftp.cwd(uploadFolderPath) | ||||
|         itemPath = os.path.relpath(itemPath, 'TempSFTPFolder/') | ||||
|         itemPath = str(itemPath) | ||||
|         currentDirectory = os.getcwd() | ||||
|         os.chdir('TempSFTPFolder') | ||||
|         with open (itemPath, 'rb') as plugin_file: | ||||
|             ftp.storbinary('STOR '+ str(itemPath), plugin_file) | ||||
|     except FileNotFoundError: | ||||
|         print(oColors.brightRed + "[FTP]: The 'plugins' folder couldn*t be found on the remote host!" + oColors.standardWhite) | ||||
|         print(oColors.brightRed + "[FTP]: Aborting uploading." + oColors.standardWhite) | ||||
|     os.chdir(currentDirectory) | ||||
|     ftp.close() | ||||
|  | ||||
|  | ||||
| def ftp_upload_server_jar(ftp, itemPath): | ||||
|     try: | ||||
|         ftp.cwd('.') | ||||
|         itemPath = os.path.relpath(itemPath, 'TempSFTPFolder/') | ||||
|         itemPath = str(itemPath) | ||||
|         currentDirectory = os.getcwd() | ||||
|         os.chdir('TempSFTPFolder') | ||||
|         with open (itemPath, 'rb') as server_jar: | ||||
|             ftp.storbinary('STOR '+ str(itemPath), server_jar) | ||||
|     except FileNotFoundError: | ||||
|         print(oColors.brightRed + "[FTP]: The 'root' folder couldn*t be found on the remote host!" + oColors.standardWhite) | ||||
|         print(oColors.brightRed + "[FTP]: Aborting uploading." + oColors.standardWhite) | ||||
|     os.chdir(currentDirectory) | ||||
|     ftp.close() | ||||
|  | ||||
|  | ||||
| def ftp_listAll(ftp): | ||||
|     configValues = configurationValues() | ||||
|     try: | ||||
|         ftp.cwd(configValues.sftp_folderPath) | ||||
|         installedPlugins = ftp.nlst() | ||||
|     except FileNotFoundError: | ||||
|         print(oColors.brightRed + "[FTP]: The 'plugins' folder couldn*t be found on the remote host!" + oColors.standardWhite) | ||||
|  | ||||
|     try: | ||||
|         return installedPlugins | ||||
|     except UnboundLocalError: | ||||
|         print(oColors.brightRed + "[FTP]: No plugins were found." + oColors.standardWhite) | ||||
|  | ||||
|  | ||||
| def ftp_listFilesInServerRoot(ftp): | ||||
|     try: | ||||
|         ftp.cwd('.') | ||||
|         filesInServerRoot = ftp.nlst() | ||||
|     except FileNotFoundError: | ||||
|         print(oColors.brightRed + "[FTP]: The 'root' folder couldn*t be found on the remote host!" + oColors.standardWhite) | ||||
|  | ||||
|     try: | ||||
|         return filesInServerRoot | ||||
|     except UnboundLocalError: | ||||
|         print(oColors.brightRed + "[FTP]: No Serverjar was found." + oColors.standardWhite) | ||||
|  | ||||
|  | ||||
| def ftp_downloadFile(ftp, downloadPath, fileToDownload): | ||||
|     configValues = configurationValues() | ||||
|     ftp.cwd(configValues.sftp_folderPath) | ||||
|     filedata = open(downloadPath,'wb') | ||||
|     ftp.retrbinary('RETR '+fileToDownload, filedata.write) | ||||
|     filedata.close() | ||||
|     ftp.quit() | ||||
|  | ||||
|  | ||||
| def ftp_is_file(ftp, pluginPath): | ||||
|     if ftp.nlst(pluginPath) == [pluginPath]: | ||||
|         return True | ||||
|     else: | ||||
|         return False | ||||
|  | ||||
|  | ||||
| def ftp_validateFileAttributes(ftp, pluginPath): | ||||
|     if ftp_is_file(ftp, pluginPath) is False: | ||||
|         return False | ||||
|     if re.search(r'.jar$', pluginPath): | ||||
|         return True | ||||
|     else: | ||||
|         return False | ||||
| @@ -1,105 +0,0 @@ | ||||
| import sys | ||||
|  | ||||
| from utils.consoleoutput import oColors | ||||
| from utils.utilities import getHelp, getCommandHelp | ||||
| from handlers.handle_config import configurationValues | ||||
| from plugin.plugin_downloader import searchPackage, getSpecificPackage | ||||
| from plugin.plugin_updatechecker import updateInstalledPackage, checkInstalledPackage | ||||
| from plugin.plugin_remover import removePlugin | ||||
| from serverjar.serverjar_checker import checkInstalledServerjar, updateServerjar | ||||
| from serverjar.serverjar_paper import papermc_downloader | ||||
|  | ||||
|  | ||||
| def createInputLists(): | ||||
|     global COMMANDLIST | ||||
|     COMMANDLIST = [ | ||||
|         'get', | ||||
|         'update', | ||||
|         'check', | ||||
|         'search', | ||||
|         'exit', | ||||
|         'help', | ||||
|         'remove', | ||||
|         'get-paper' | ||||
|     ] | ||||
|     global INPUTSELECTEDOBJECT | ||||
|     INPUTSELECTEDOBJECT = [ | ||||
|         'all', | ||||
|         '*' | ||||
|     ] | ||||
|  | ||||
|  | ||||
| def handleInput(inputCommand, inputSelectedObject, inputParams): | ||||
|     configValues = configurationValues() | ||||
|     while True: | ||||
|         if inputCommand == 'get': | ||||
|             if inputSelectedObject.isdigit(): | ||||
|                 if not configValues.localPluginFolder: | ||||
|                     if configValues.sftp_seperateDownloadPath is True: | ||||
|                         pluginPath = configValues.sftp_pathToSeperateDownloadPath | ||||
|                     else: | ||||
|                         pluginPath = configValues.sftp_folderPath | ||||
|                     getSpecificPackage(inputSelectedObject, pluginPath,  inputParams) | ||||
|                     break | ||||
|                 else: | ||||
|                     if configValues.seperateDownloadPath is True: | ||||
|                         pluginPath = configValues.pathToSeperateDownloadPath | ||||
|                     else: | ||||
|                         pluginPath = configValues.pathToPluginFolder | ||||
|                     getSpecificPackage(inputSelectedObject, pluginPath,  inputParams) | ||||
|                     break | ||||
|             else: | ||||
|                 searchPackage(inputSelectedObject) | ||||
|                 break | ||||
|         if inputCommand == 'update': | ||||
|             if inputSelectedObject == 'serverjar': | ||||
|                 updateServerjar(inputParams) | ||||
|             else: | ||||
|                 updateInstalledPackage(inputSelectedObject) | ||||
|             break | ||||
|         if inputCommand == 'check': | ||||
|             if inputSelectedObject == 'serverjar': | ||||
|                 checkInstalledServerjar() | ||||
|             else: | ||||
|                 checkInstalledPackage(inputSelectedObject, inputParams) | ||||
|             break | ||||
|         if inputCommand == 'search': | ||||
|             searchPackage(inputSelectedObject) | ||||
|             break | ||||
|         if inputCommand == 'exit': | ||||
|             sys.exit() | ||||
|         if inputCommand == 'help': | ||||
|             if inputSelectedObject == 'command' or inputSelectedObject == 'commands': | ||||
|                 getCommandHelp(inputParams) | ||||
|             else: | ||||
|                 getHelp() | ||||
|             break | ||||
|         if inputCommand == 'remove': | ||||
|             removePlugin(inputSelectedObject) | ||||
|             break | ||||
|         if inputCommand == 'get-paper': | ||||
|             papermc_downloader(inputSelectedObject, inputParams) | ||||
|             break | ||||
|         else: | ||||
|             print(oColors.brightRed + "Error: Command not found. Please try again. :(" + oColors.standardWhite) | ||||
|             print(oColors.brightRed + "Use: '" + oColors.standardWhite +"help command" + oColors.brightRed +"' to get all available commands" + oColors.standardWhite) | ||||
|             getInput() | ||||
|     getInput() | ||||
|  | ||||
|  | ||||
| def getInput(): | ||||
|     inputCommand = None | ||||
|     while True: | ||||
|         try: | ||||
|             inputCommand, inputSelectedObject, *inputParams = input("pluGET >> ").split() | ||||
|             break | ||||
|         except ValueError: | ||||
|             if inputCommand == None: | ||||
|                 continue | ||||
|             else: | ||||
|                 print(oColors.brightRed + "Wrong input! Use: > 'command' 'selectedObject' [optionalParams]" + oColors.standardWhite) | ||||
|                 print(oColors.brightRed + "Use: '" + oColors.standardWhite +"help command" + oColors.brightRed +"' to get all available commands" + oColors.standardWhite) | ||||
|         except KeyboardInterrupt: | ||||
|             sys.exit() | ||||
|     inputParams = inputParams[0] if inputParams else None | ||||
|     handleInput(inputCommand, inputSelectedObject, inputParams) | ||||
| @@ -1,107 +0,0 @@ | ||||
| import sys | ||||
| import os | ||||
| import pysftp | ||||
| import paramiko | ||||
| import stat | ||||
| import re | ||||
|  | ||||
| from utils.consoleoutput import oColors | ||||
| from handlers.handle_config import configurationValues | ||||
|  | ||||
|  | ||||
| def createSFTPConnection(): | ||||
|     configValues = configurationValues() | ||||
|     cnopts = pysftp.CnOpts() | ||||
|     cnopts.hostkeys = None # TODO fix this | ||||
|     try: | ||||
|         sftp = pysftp.Connection(configValues.sftp_server, username=configValues.sftp_user, \ | ||||
|                password=configValues.sftp_password, port=configValues.sftp_port, cnopts=cnopts) | ||||
|     except paramiko.ssh_exception.AuthenticationException: | ||||
|         print(oColors.brightRed + "[SFTP]: Wrong Username/Password" + oColors.standardWhite) | ||||
|     except paramiko.ssh_exception.SSHException: | ||||
|         print(oColors.brightRed + "[SFTP]: The SFTP server isn't available." + oColors.standardWhite) | ||||
|     try: | ||||
|         return sftp | ||||
|     except UnboundLocalError: | ||||
|         print(oColors.brightRed + "[SFTP]: Check your config.ini!" + oColors.standardWhite) | ||||
|         print(oColors.brightRed + "Exiting program..." + oColors.standardWhite) | ||||
|         sys.exit() | ||||
|  | ||||
|  | ||||
| def sftp_showPlugins(sftp): | ||||
|     configValues = configurationValues() | ||||
|     sftp.cd(configValues.sftp_folderPath) | ||||
|     for attr in sftp.listdir_attr(): | ||||
|         print(attr.filename, attr) | ||||
|  | ||||
|  | ||||
| def sftp_upload_file(sftp, itemPath): | ||||
|     configValues = configurationValues() | ||||
|     if configValues.sftp_seperateDownloadPath is True: | ||||
|         uploadFolderPath = configValues.sftp_pathToSeperateDownloadPath | ||||
|     else: | ||||
|         uploadFolderPath = configValues.sftp_folderPath | ||||
|     try: | ||||
|         sftp.chdir(uploadFolderPath) | ||||
|         sftp.put(itemPath) | ||||
|  | ||||
|     except FileNotFoundError: | ||||
|         print(oColors.brightRed + "[SFTP]: The 'plugins' folder couldn*t be found on the remote host!" + oColors.standardWhite) | ||||
|         print(oColors.brightRed + "[SFTP]: Aborting uploading." + oColors.standardWhite) | ||||
|     sftp.close() | ||||
|  | ||||
|  | ||||
| def sftp_upload_server_jar(sftp, itemPath): | ||||
|     try: | ||||
|         sftp.chdir('.') | ||||
|         sftp.put(itemPath) | ||||
|     except FileNotFoundError: | ||||
|         print(oColors.brightRed + "[SFTP]: The 'root' folder couldn*t be found on the remote host!" + oColors.standardWhite) | ||||
|         print(oColors.brightRed + "[SFTP]: Aborting uploading." + oColors.standardWhite) | ||||
|     sftp.close() | ||||
|  | ||||
|  | ||||
| def sftp_listAll(sftp): | ||||
|     configValues = configurationValues() | ||||
|     try: | ||||
|         sftp.chdir(configValues.sftp_folderPath) | ||||
|         installedPlugins = sftp.listdir() | ||||
|     except FileNotFoundError: | ||||
|         print(oColors.brightRed + "[SFTP]: The 'plugins' folder couldn*t be found on the remote host!" + oColors.standardWhite) | ||||
|  | ||||
|     try: | ||||
|         return installedPlugins | ||||
|     except UnboundLocalError: | ||||
|         print(oColors.brightRed + "[SFTP]: No plugins were found." + oColors.standardWhite) | ||||
|  | ||||
|  | ||||
| def sftp_listFilesInServerRoot(sftp): | ||||
|     try: | ||||
|         filesInServerRoot = sftp.listdir() | ||||
|     except FileNotFoundError: | ||||
|         print(oColors.brightRed + "[SFTP]: The 'root' folder couldn*t be found on the remote host!" + oColors.standardWhite) | ||||
|  | ||||
|     try: | ||||
|         return filesInServerRoot | ||||
|     except UnboundLocalError: | ||||
|         print(oColors.brightRed + "[SFTP]: No Serverjar was found." + oColors.standardWhite) | ||||
|  | ||||
|  | ||||
| def sftp_downloadFile(sftp, downloadPath, fileToDownload): | ||||
|     configValues = configurationValues() | ||||
|     sftp.cwd(configValues.sftp_folderPath) | ||||
|     currentDirectory = os.getcwd() | ||||
|     os.chdir('TempSFTPFolder') | ||||
|     sftp.get(fileToDownload) | ||||
|     sftp.close() | ||||
|     os.chdir(currentDirectory) | ||||
|  | ||||
|  | ||||
| def sftp_validateFileAttributes(sftp, pluginPath): | ||||
|     pluginSFTPAttribute = sftp.lstat(pluginPath) | ||||
|     if stat.S_ISDIR(pluginSFTPAttribute.st_mode): | ||||
|         return False | ||||
|     elif re.search(r'.jar$', pluginPath): | ||||
|         return True | ||||
|     else: | ||||
|         return False | ||||
| @@ -1,155 +0,0 @@ | ||||
| import re | ||||
| import urllib.request | ||||
| from urllib.error import HTTPError | ||||
| from pathlib import Path | ||||
|  | ||||
| from utils.consoleoutput import oColors | ||||
| from utils.web_request import doAPIRequest | ||||
| from utils.utilities import createTempPluginFolder, deleteTempPluginFolder, calculateFileSizeKb, calculateFileSizeMb | ||||
| from handlers.handle_config import configurationValues | ||||
| from handlers.handle_sftp import sftp_upload_file, createSFTPConnection | ||||
| from handlers.handle_ftp import ftp_upload_file, createFTPConnection | ||||
|  | ||||
|  | ||||
| def handleRegexPackageName(packageNameFull): | ||||
|     packageNameFull2 = packageNameFull | ||||
|     # trims the part of the package that has for example "[1.1 Off]" in it | ||||
|     unwantedpackageName = re.search(r'(^\[+[a-zA-Z0-9\s\W*\.*\-*\+*\%*\,]*\]+)', packageNameFull) | ||||
|     unwantedpackageNamematch = bool(unwantedpackageName) | ||||
|     if unwantedpackageNamematch: | ||||
|         unwantedpackageNameString = unwantedpackageName.group() | ||||
|         packageNameFull2 = packageNameFull.replace(unwantedpackageNameString, '') | ||||
|     # gets the real packagename "word1 & word2" is not supported only gets word 1 | ||||
|     packageName = re.search(r'([a-zA-Z]\d*)+(\s?\-*\_*[a-zA-Z]\d*\+*\-*\'*)+', packageNameFull2) | ||||
|     try: | ||||
|         packageNameFullString = packageName.group() | ||||
|         packageNameOnly = packageNameFullString.replace(' ', '') | ||||
|     except AttributeError: | ||||
|         packageNameOnly = unwantedpackageNameString | ||||
|     return packageNameOnly | ||||
|  | ||||
|  | ||||
| def getVersionID(packageId, packageVersion): | ||||
|     if packageVersion == None or packageVersion == 'latest': | ||||
|         url = f"https://api.spiget.org/v2/resources/{packageId}/versions/latest" | ||||
|         response = doAPIRequest(url) | ||||
|         versionId = response["id"] | ||||
|         return versionId | ||||
|  | ||||
|     url = f"https://api.spiget.org/v2/resources/{packageId}/versions?size=100&sort=-name" | ||||
|     versionList = doAPIRequest(url) | ||||
|  | ||||
|     for packages in versionList: | ||||
|         packageUpdate = packages["name"] | ||||
|         versionId = packages["id"] | ||||
|         if packageUpdate == packageVersion: | ||||
|             return versionId | ||||
|     return versionList[0]["id"] | ||||
|  | ||||
|  | ||||
| def getVersionName(packageId, versionId): | ||||
|     url = f"https://api.spiget.org/v2/resources/{packageId}/versions/{versionId}" | ||||
|     response = doAPIRequest(url) | ||||
|     versionName = response["name"] | ||||
|     return versionName | ||||
|  | ||||
|  | ||||
| def searchPackage(resourceName): | ||||
|     configValues = configurationValues() | ||||
|     url = f"https://api.spiget.org/v2/search/resources/{resourceName}?field=name&sort=-downloads" | ||||
|     packageName = doAPIRequest(url) | ||||
|     i = 1 | ||||
|     print(oColors.brightBlack + f"Searching: {resourceName}" + oColors.standardWhite) | ||||
|     print("┌─────┬─────────────────────────────┬───────────┬──────────────────────────────────────────────────────────────────────┐") | ||||
|     print("│ No. │ Name                        │ Downloads │ Description                                                          │") | ||||
|     print("└─────┴─────────────────────────────┴───────────┴──────────────────────────────────────────────────────────────────────┘") | ||||
|     for resource in packageName: | ||||
|         pName = resource["name"] | ||||
|         newName = handleRegexPackageName(pName) | ||||
|         pTag = resource["tag"] | ||||
|         pDownloads = resource["downloads"] | ||||
|         print(f" [{i}]".rjust(6), end='') | ||||
|         print("  ", end='') | ||||
|         print(f"{newName}".ljust(30), end='') | ||||
|         print(f"{pDownloads}".rjust(9), end='') | ||||
|         print("   ", end='') | ||||
|         print(f"{pTag}".ljust(120)) | ||||
|         i = i + 1 | ||||
|  | ||||
|     resourceSelected = int(input("Select your wanted resource (No.)(0 to exit): ")) | ||||
|     if resourceSelected != 0: | ||||
|         resourceSelected = resourceSelected - 1 | ||||
|         resourceId = packageName[resourceSelected]["id"] | ||||
|         if not configValues.localPluginFolder: | ||||
|             if configValues.sftp_seperateDownloadPath is True: | ||||
|                 pluginDownloadPath = configValues.sftp_pathToSeperateDownloadPath | ||||
|             else: | ||||
|                 pluginDownloadPath = configValues.sftp_folderPath | ||||
|         else: | ||||
|             if configValues.seperateDownloadPath is True: | ||||
|                 pluginDownloadPath = configValues.pathToSeperateDownloadPath | ||||
|             else: | ||||
|                 pluginDownloadPath = configValues.pathToPluginFolder | ||||
|         try: | ||||
|             getSpecificPackage(resourceId, pluginDownloadPath) | ||||
|         except HTTPError as err: | ||||
|             print(oColors.brightRed +  f"Error: {err.code} - {err.reason}" + oColors.standardWhite) | ||||
|  | ||||
|  | ||||
| def downloadSpecificVersion(resourceId, downloadPath, versionID='latest'): | ||||
|     configValues = configurationValues() | ||||
|     if versionID != 'latest': | ||||
|         #url = f"https://spigotmc.org/resources/{resourceId}/download?version={versionID}" | ||||
|         print(oColors.brightRed + "Sorry but specific version downloads aren't supported because of cloudflare protection. :(" + oColors.standardWhite) | ||||
|         print(oColors.brightRed + "Reverting to latest version." + oColors.standardWhite) | ||||
|  | ||||
|     url = f"https://api.spiget.org/v2/resources/{resourceId}/download" | ||||
|     #url = f"https://api.spiget.org/v2/resources/{resourceId}/versions/latest/download" #throws 403 forbidden error...cloudflare :( | ||||
|  | ||||
|     urrlib_opener = urllib.request.build_opener() | ||||
|     urrlib_opener.addheaders = [('User-agent', 'pluGET/1.0')] | ||||
|     urllib.request.install_opener(urrlib_opener) | ||||
|  | ||||
|     remotefile = urllib.request.urlopen(url) | ||||
|     filesize = remotefile.info()['Content-Length'] | ||||
|     urllib.request.urlretrieve(url, downloadPath) | ||||
|     filesize = int(filesize) | ||||
|     print("        ", end='') | ||||
|     if filesize >= 1000000: | ||||
|         filesizeData = calculateFileSizeMb(filesize) | ||||
|         print("Downloaded " + (str(filesizeData)).rjust(9) + f" MB here {downloadPath}") | ||||
|     else: | ||||
|         filesizeData = calculateFileSizeKb(filesize) | ||||
|         print("Downloaded " + (str(filesizeData)).rjust(9) + f" KB here {downloadPath}") | ||||
|     if not configValues.localPluginFolder: | ||||
|         if configValues.sftp_useSftp: | ||||
|             sftpSession = createSFTPConnection() | ||||
|             sftp_upload_file(sftpSession, downloadPath) | ||||
|         else: | ||||
|             ftpSession = createFTPConnection() | ||||
|             ftp_upload_file(ftpSession, downloadPath) | ||||
|  | ||||
|  | ||||
| def getSpecificPackage(resourceId, downloadPath, inputPackageVersion='latest'): | ||||
|     configValues = configurationValues() | ||||
|     if configValues.localPluginFolder == False: | ||||
|         downloadPath = createTempPluginFolder() | ||||
|     url = f"https://api.spiget.org/v2/resources/{resourceId}" | ||||
|     packageDetails = doAPIRequest(url) | ||||
|     try: | ||||
|         packageName = packageDetails["name"] | ||||
|     except KeyError: | ||||
|         print(oColors.brightRed +  "Error: Plugin ID couldn't be found" + oColors.standardWhite) | ||||
|         return None | ||||
|     packageNameNew = handleRegexPackageName(packageName) | ||||
|     versionId = getVersionID(resourceId, inputPackageVersion) | ||||
|     packageVersion = getVersionName(resourceId, versionId) | ||||
|     packageDownloadName = f"{packageNameNew}-{packageVersion}.jar" | ||||
|     downloadPackagePath = Path(f"{downloadPath}/{packageDownloadName}") | ||||
|     if inputPackageVersion is None or inputPackageVersion == 'latest': | ||||
|         downloadSpecificVersion(resourceId=resourceId, downloadPath=downloadPackagePath) | ||||
|     else: | ||||
|         downloadSpecificVersion(resourceId, downloadPackagePath, versionId) | ||||
|  | ||||
|     if not configValues.localPluginFolder: | ||||
|         deleteTempPluginFolder(downloadPath) | ||||
| @@ -1,59 +0,0 @@ | ||||
| import os | ||||
| import re | ||||
| from pathlib import Path | ||||
|  | ||||
| from utils.consoleoutput import oColors | ||||
| from handlers.handle_config import configurationValues | ||||
| from handlers.handle_sftp import createSFTPConnection, sftp_listAll | ||||
| from handlers.handle_ftp import createFTPConnection, ftp_listAll | ||||
| from plugin.plugin_updatechecker import getFileName, getFileVersion, getInstalledPlugin, createPluginList | ||||
|  | ||||
|  | ||||
| def removePlugin(pluginToRemove): | ||||
|     configValues = configurationValues() | ||||
|     createPluginList() | ||||
|     if not configValues.localPluginFolder: | ||||
|         if not configValues.sftp_useSftp: | ||||
|             ftp = createFTPConnection() | ||||
|             pluginList = ftp_listAll(ftp) | ||||
|         else: | ||||
|             sftp = createSFTPConnection() | ||||
|             pluginList = sftp_listAll(sftp) | ||||
|     else: | ||||
|         pluginList = os.listdir(configValues.pathToPluginFolder) | ||||
|     i = 0 | ||||
|     try: | ||||
|         for plugin in pluginList: | ||||
|             try: | ||||
|                 fileName = getFileName(plugin) | ||||
|                 fileVersion = getFileVersion(plugin) | ||||
|                 pluginId = getInstalledPlugin(fileName, fileVersion) | ||||
|             except TypeError: | ||||
|                 continue | ||||
|             pluginIdStr = str(pluginId) | ||||
|  | ||||
|             if pluginToRemove == pluginIdStr or re.search(pluginToRemove, fileName, re.IGNORECASE): | ||||
|                 print(f"Removing: {fileName}") | ||||
|                 if not configValues.localPluginFolder: | ||||
|                     pluginPath = configValues.sftp_folderPath | ||||
|                     pluginPath = f"{pluginPath}/{plugin}" | ||||
|                     if not configValues.sftp_useSftp: | ||||
|                         ftp = createFTPConnection() | ||||
|                         ftp.delete(pluginPath) | ||||
|                     else: | ||||
|                         sftp = createSFTPConnection() | ||||
|                         sftp.remove(pluginPath) | ||||
|                     print(f"Removed: {fileName}") | ||||
|                     i += 1 | ||||
|                     break | ||||
|                 else: | ||||
|                     pluginPath = configValues.pathToPluginFolder | ||||
|                     pluginPath = Path(f"{pluginPath}/{plugin}") | ||||
|                     os.remove(pluginPath) | ||||
|                     print(f"Removed: {fileName}") | ||||
|                     i += 1 | ||||
|                     break | ||||
|     except TypeError: | ||||
|         print(oColors.brightRed + f"Aborted removing of: {pluginToRemove}." + oColors.standardWhite) | ||||
|     if i == 0: | ||||
|         print(oColors.brightRed + f"Couldn't remove plugin: {pluginToRemove}" + oColors.standardWhite) | ||||
| @@ -1,482 +0,0 @@ | ||||
| import os | ||||
| import re | ||||
| import io | ||||
| import base64 | ||||
| from zipfile import ZipFile | ||||
| from urllib.error import HTTPError | ||||
| from pathlib import Path | ||||
| from rich.progress import track | ||||
|  | ||||
| from utils.consoleoutput import oColors | ||||
| from utils.web_request import doAPIRequest | ||||
| from handlers.handle_config import configurationValues | ||||
| from handlers.handle_sftp import createSFTPConnection, sftp_listAll, sftp_downloadFile, sftp_validateFileAttributes | ||||
| from handlers.handle_ftp import createFTPConnection, ftp_listAll, ftp_downloadFile, ftp_validateFileAttributes | ||||
| from plugin.plugin_downloader import getSpecificPackage | ||||
| from utils.utilities import createTempPluginFolder, deleteTempPluginFolder | ||||
|  | ||||
|  | ||||
| def createPluginList(): | ||||
|     global INSTALLEDPLUGINLIST | ||||
|     INSTALLEDPLUGINLIST = [] | ||||
|     return INSTALLEDPLUGINLIST | ||||
|  | ||||
|  | ||||
| def addToPluginList(localFileName, pluginId, versionId, plugin_latest_version, plugin_is_outdated): | ||||
|     INSTALLEDPLUGINLIST.append([localFileName, pluginId, versionId, plugin_latest_version, plugin_is_outdated]) | ||||
|  | ||||
|  | ||||
| def getFileName(pluginName): | ||||
|     pluginNameFull = pluginName | ||||
|     pluginVersion = re.search(r'([\d.]+[.jar]+)', pluginNameFull) | ||||
|     try: | ||||
|         pluginVersionFull = pluginVersion.group() | ||||
|     except AttributeError: | ||||
|         pluginVersionFull = pluginVersion | ||||
|     pluginNameOnlyy = pluginNameFull.replace(pluginVersionFull, '') | ||||
|     pluginNameOnly = re.sub(r'(\-$)', '', pluginNameOnlyy) | ||||
|     pluginNameOnlyy = re.sub(r'(\-v$)', '', pluginNameOnly) | ||||
|     return pluginNameOnlyy | ||||
|  | ||||
|  | ||||
| def getFileVersion(pluginName): | ||||
|     pluginNameFull = pluginName | ||||
|     pluginVersion = re.search(r'([\d.]+[.jar]+)', pluginNameFull) | ||||
|     pluginVersionFull = pluginVersion.group() | ||||
|     pluginVersionString = pluginVersionFull.replace('.jar', '') | ||||
|     if pluginVersionString.endswith('.'): | ||||
|         pluginVersionString = '' | ||||
|     if pluginVersionString == '': | ||||
|         pluginVersionString = eggCrackingJar(pluginNameFull, 'version') | ||||
|     return pluginVersionString | ||||
|  | ||||
|  | ||||
| def getLatestPluginVersion(pluginId): | ||||
|     url = f"https://api.spiget.org/v2/resources/{pluginId}/versions/latest" | ||||
|     latestUpdateSearch = doAPIRequest(url) | ||||
|     versionLatestUpdate = latestUpdateSearch["name"] | ||||
|     return versionLatestUpdate | ||||
|  | ||||
|  | ||||
| def getUpdateDescription(pluginId): | ||||
|     url = f"https://api.spiget.org/v2/resources/{pluginId}/updates?size=1&sort=-date" | ||||
|     latestDescriptionSearch = doAPIRequest(url) | ||||
|     versionLatestDescription = latestDescriptionSearch[0]["description"] | ||||
|     versionLatestDescription = base64.b64decode(versionLatestDescription) | ||||
|     versionLatestDescriptionText =versionLatestDescription.decode('utf-8') | ||||
|     htmlRegex = re.compile('<.*?>') | ||||
|     versionLatestDescriptionText = re.sub(htmlRegex, '', versionLatestDescriptionText) | ||||
|     linesChangelogDescription = versionLatestDescriptionText.split("\n") | ||||
|     nonEmptyLines = [line for line in linesChangelogDescription if line.strip() != ""] | ||||
|     stringnonEmptyLines = "" | ||||
|     for line in nonEmptyLines: | ||||
|         stringnonEmptyLines += line + "\n" | ||||
|     stringnonEmptyLines = stringnonEmptyLines[:-1] | ||||
|     return stringnonEmptyLines | ||||
|  | ||||
|  | ||||
| def versionTuple(versionString): | ||||
|     return tuple(map(int, (versionString.split(".")))) | ||||
|  | ||||
|  | ||||
| def getVersionWithoutLetters(versionString): | ||||
|     return re.sub(r'([A-Za-z]*)', '', versionString) | ||||
|  | ||||
|  | ||||
| def compareVersions(plugin_latest_version, pluginVersion): | ||||
|     try: | ||||
|         pluginVersionTuple = versionTuple(getVersionWithoutLetters(pluginVersion)) | ||||
|         plugin_latest_versionTuple = versionTuple(getVersionWithoutLetters(plugin_latest_version)) | ||||
|     except ValueError: | ||||
|         return False | ||||
|     if pluginVersionTuple < plugin_latest_versionTuple: | ||||
|         return True | ||||
|     else: | ||||
|         return False | ||||
|  | ||||
|  | ||||
| def eggCrackingJar(localJarFileName, searchMode): | ||||
|     configValues = configurationValues() | ||||
|     if not configValues.localPluginFolder: | ||||
|         tempPluginFolderPath = createTempPluginFolder() | ||||
|         if configValues.sftp_useSftp: | ||||
|             sftp = createSFTPConnection() | ||||
|             pathToPluginJar = Path(f"{tempPluginFolderPath}/{localJarFileName}") | ||||
|             sftp_downloadFile(sftp, pathToPluginJar, localJarFileName) | ||||
|         else: | ||||
|             ftp = createFTPConnection() | ||||
|             pathToPluginJar = Path(f"{tempPluginFolderPath}/{localJarFileName}") | ||||
|             ftp_downloadFile(ftp, pathToPluginJar, localJarFileName) | ||||
|     else: | ||||
|         pluginPath = configValues.pathToPluginFolder | ||||
|         pathToPluginJar = Path(f"{pluginPath}/{localJarFileName}") | ||||
|     pluginVersion = '' | ||||
|     pluginName = '' | ||||
|     with ZipFile(pathToPluginJar, 'r') as pluginJar: | ||||
|         try: | ||||
|             with io.TextIOWrapper(pluginJar.open('plugin.yml', 'r'), encoding="utf-8") as pluginYml: | ||||
|                 pluginYmlContentLine = pluginYml.readlines() | ||||
|                 for line in pluginYmlContentLine: | ||||
|                     if searchMode == 'version': | ||||
|                         if re.match(r'^\s*?version: ', line): | ||||
|                             pluginVersion = re.sub(r'^\s*?version: ', '', line) | ||||
|                             pluginVersion = pluginVersion.replace('\n', '') | ||||
|                             pluginVersion = pluginVersion.replace("'", '') | ||||
|                             pluginVersion = pluginVersion.replace('"', '') | ||||
|                     elif searchMode == 'name': | ||||
|                         if re.match(r'^\s*?name: ', line): | ||||
|                             pluginName = re.sub(r'^\s*?name: ', '', line) | ||||
|                             pluginName = pluginName.replace('\n', '') | ||||
|                             pluginName = pluginName.replace("'", '') | ||||
|                             pluginName = pluginName.replace('"', '') | ||||
|  | ||||
|         except FileNotFoundError: | ||||
|             pluginVersion = '' | ||||
|             pluginName = '' | ||||
|         except KeyError: | ||||
|             pluginVersion = '' | ||||
|             pluginName = '' | ||||
|     if not configValues.localPluginFolder: | ||||
|         deleteTempPluginFolder(tempPluginFolderPath) | ||||
|     if searchMode == 'version': | ||||
|         return pluginVersion | ||||
|     if searchMode == 'name': | ||||
|         return pluginName | ||||
|  | ||||
|  | ||||
| def checkInstalledPackage(inputSelectedObject="all", inputOptionalParam=None): | ||||
|     configValues = configurationValues() | ||||
|     createPluginList() | ||||
|     pluginFolderPath = configValues.pathToPluginFolder | ||||
|     if not configValues.localPluginFolder: | ||||
|         if configValues.sftp_useSftp: | ||||
|             connection = createSFTPConnection() | ||||
|             pluginList = sftp_listAll(connection) | ||||
|         else: | ||||
|             connection = createFTPConnection() | ||||
|             pluginList = ftp_listAll(connection) | ||||
|     else: | ||||
|         pluginList = os.listdir(pluginFolderPath) | ||||
|  | ||||
|     i = 0 | ||||
|     oldPlugins = 0 | ||||
|     print(oColors.brightBlack + f"Checking: {inputSelectedObject}" + oColors.standardWhite) | ||||
|     if inputOptionalParam != "changelog": | ||||
|         print(oColors.brightBlack + f"Use 'check {inputSelectedObject} changelog' to get the latest changelog from plugins" + oColors.standardWhite) | ||||
|     print("┌─────┬────────────────────────────────┬──────────────┬──────────────┐") | ||||
|     print("│ No. │ Name                           │ Installed V. │ Latest V.    │") | ||||
|     print("└─────┴────────────────────────────────┴──────────────┴──────────────┘") | ||||
|     try: | ||||
|         for plugin in track(pluginList, description="Checking for updates" ,transient=True, complete_style="bright_yellow"): | ||||
|             if not configValues.localPluginFolder: | ||||
|                 pluginFile = f"{configValues.sftp_folderPath}/{plugin}" | ||||
|                 if configValues.sftp_useSftp: | ||||
|                     pluginAttributes = sftp_validateFileAttributes(connection, pluginFile) | ||||
|                     if pluginAttributes == False: | ||||
|                         continue | ||||
|                 else: | ||||
|                     pluginAttributes = ftp_validateFileAttributes(connection, pluginFile) | ||||
|                     if pluginAttributes == False: | ||||
|                         continue | ||||
|             else: | ||||
|                 if not os.path.isfile(Path(f"{pluginFolderPath}/{plugin}")): | ||||
|                     continue | ||||
|                 if not re.search(r'.jar$', plugin): | ||||
|                     continue | ||||
|             try: | ||||
|                 fileName = getFileName(plugin) | ||||
|                 fileVersion = getFileVersion(plugin) | ||||
|                 pluginId = getInstalledPlugin(fileName, fileVersion, plugin) | ||||
|             except TypeError: | ||||
|                 continue | ||||
|  | ||||
|             pluginIdStr = str(pluginId) | ||||
|             if fileVersion == '': | ||||
|                 fileVersion = 'N/A' | ||||
|             try: | ||||
|                 pluginLatestVersion = INSTALLEDPLUGINLIST[i][3] | ||||
|             except IndexError: | ||||
|                 pluginLatestVersion = 'N/A' | ||||
|  | ||||
|             if pluginLatestVersion == None: | ||||
|                 pluginLatestVersion = 'N/A' | ||||
|  | ||||
|             try: | ||||
|                 pluginIsOutdated = INSTALLEDPLUGINLIST[i][4] | ||||
|             except IndexError: | ||||
|                 pluginIsOutdated = 'N/A' | ||||
|  | ||||
|             if pluginIsOutdated == None: | ||||
|                 pluginIsOutdated = 'N/A' | ||||
|  | ||||
|             if pluginIsOutdated == True: | ||||
|                 oldPlugins = oldPlugins + 1 | ||||
|  | ||||
|             if re.search(r'.jar$', fileName): | ||||
|                 fileName = eggCrackingJar(plugin, "name") | ||||
|  | ||||
|             if inputSelectedObject != "all" and inputSelectedObject != "*": | ||||
|                 if inputSelectedObject != pluginIdStr or not re.search(inputSelectedObject, fileName, re.IGNORECASE): | ||||
|                     i += 1 | ||||
|                     continue | ||||
|  | ||||
|             if inputSelectedObject == "all" or inputSelectedObject != "*" or inputSelectedObject != "all": | ||||
|                 if inputSelectedObject == pluginIdStr or re.search(inputSelectedObject, fileName, re.IGNORECASE): | ||||
|                     if pluginLatestVersion == 'N/A': | ||||
|                         print(oColors.brightBlack + f" [{1}]".rjust(6), end='') | ||||
|                     else: | ||||
|                         print(f" [{1}]".rjust(6), end='') | ||||
|                 else: | ||||
|                     if pluginLatestVersion == 'N/A': | ||||
|                         print(oColors.brightBlack + f" [{i+1}]".rjust(6), end='') | ||||
|                     else: | ||||
|                         print(f" [{i+1}]".rjust(6), end='') | ||||
|                 print("  ", end='') | ||||
|                 if pluginIsOutdated == True: | ||||
|                     print(oColors.brightRed + f"{fileName}".ljust(33) + oColors.standardWhite, end='') | ||||
|                 elif pluginIsOutdated == False: | ||||
|                     print(oColors.brightGreen + f"{fileName}".ljust(33) + oColors.standardWhite, end='') | ||||
|                 else: | ||||
|                     print(f"{fileName}".ljust(33), end='') | ||||
|  | ||||
|                 print(f"{fileVersion}".ljust(15), end='') | ||||
|                 print(f"{pluginLatestVersion}".ljust(15)) | ||||
|                 if (inputOptionalParam == "changelog" and pluginLatestVersion != 'N/A'): | ||||
|                     print(oColors.brightYellow + f"CHANGELOG {fileName}:" + oColors.standardWhite) | ||||
|                     description = getUpdateDescription(pluginId) | ||||
|                     print(description) | ||||
|                     print() | ||||
|                 if inputSelectedObject == pluginIdStr or re.search(inputSelectedObject, fileName, re.IGNORECASE): | ||||
|                     break | ||||
|             else: | ||||
|                 print(oColors.brightRed + "Wrong input! Use 'check all' to check every plugin for updates!" + oColors.standardWhite) | ||||
|                 break | ||||
|  | ||||
|             i += 1 | ||||
|     except TypeError: | ||||
|         print(oColors.brightRed + "Error occured: Aborted checking for updates." + oColors.standardWhite) | ||||
|     print(oColors.brightYellow + f"Outdated plugins: [{oldPlugins}/{i}]" + oColors.standardWhite) | ||||
|  | ||||
|  | ||||
| def updateInstalledPackage(inputSelectedObject='all'): | ||||
|     configValues = configurationValues() | ||||
|     if not configValues.localPluginFolder: | ||||
|         if configValues.sftp_useSftp: | ||||
|             connection = createSFTPConnection() | ||||
|         else: | ||||
|             connection = createFTPConnection() | ||||
|  | ||||
|     try: | ||||
|         print(oColors.brightBlack + "Selected plugins with available Updates:" + oColors.standardWhite) | ||||
|         if inputSelectedObject == "all" or inputSelectedObject == "*": | ||||
|             for pluginIndex in range(len(INSTALLEDPLUGINLIST)): | ||||
|                 if INSTALLEDPLUGINLIST[pluginIndex][4] == True: | ||||
|                     fileName = getFileName(INSTALLEDPLUGINLIST[pluginIndex][0]) | ||||
|                     print(fileName, end=' ') | ||||
|         else: | ||||
|             print(inputSelectedObject, end=' ') | ||||
|  | ||||
|         print() | ||||
|         updateConfirmation = input("Update these plugins [y/n] ? ") | ||||
|         if str.lower(updateConfirmation) != "y": | ||||
|             print(oColors.brightRed + "Aborting the update process."+ oColors.standardWhite) | ||||
|             return False | ||||
|  | ||||
|     except NameError: | ||||
|         print(oColors.brightRed + "Check for updates before updating plugins with: 'check all'" + oColors.standardWhite) | ||||
|         print(oColors.brightRed + "Started checking for updates..." + oColors.standardWhite) | ||||
|         checkInstalledPackage() | ||||
|         print(oColors.brightRed + f"Please input 'update {inputSelectedObject}' again!" + oColors.standardWhite) | ||||
|         return False | ||||
|  | ||||
|     i = 0 | ||||
|     pluginsUpdated = 0 | ||||
|     indexNumberUpdated = 0 | ||||
|     print(oColors.brightBlack + f"Updating: {inputSelectedObject}" + oColors.standardWhite) | ||||
|     print("┌─────┬────────────────────────────────┬────────────┬──────────┐") | ||||
|     print("│ No. │ Name                           │ Old V.     │ New V.   │") | ||||
|     print("└─────┴────────────────────────────────┴────────────┴──────────┘") | ||||
|     try: | ||||
|         for pluginArray in track(INSTALLEDPLUGINLIST, description="Updating" ,transient=True, complete_style="bright_magenta", ): | ||||
|             plugin = INSTALLEDPLUGINLIST[i][0] | ||||
|             if not configValues.localPluginFolder: | ||||
|                 pluginFile = f"{configValues.sftp_folderPath}/{plugin}" | ||||
|                 if configValues.sftp_useSftp: | ||||
|                     pluginAttributes = sftp_validateFileAttributes(connection, pluginFile) | ||||
|                     if pluginAttributes == False: | ||||
|                         i += 1 | ||||
|                         continue | ||||
|                 else: | ||||
|                     pluginAttributes = ftp_validateFileAttributes(connection, pluginFile) | ||||
|                     if pluginAttributes == False: | ||||
|                         i += 1 | ||||
|                         continue | ||||
|             else: | ||||
|                 pluginFolderPath = configValues.pathToPluginFolder | ||||
|                 if not os.path.isfile(Path(f"{pluginFolderPath}/{plugin}")): | ||||
|                     i += 1 | ||||
|                     continue | ||||
|                 if not re.search(r'.jar$', plugin): | ||||
|                     i += 1 | ||||
|                     continue | ||||
|  | ||||
|             try: | ||||
|                 fileName = getFileName(plugin) | ||||
|                 fileVersion = getFileVersion(plugin) | ||||
|                 pluginId = INSTALLEDPLUGINLIST[i][1] | ||||
|                 latestVersion = INSTALLEDPLUGINLIST[i][3] | ||||
|             except (TypeError, ValueError): | ||||
|                 i += 1 | ||||
|                 continue | ||||
|  | ||||
|             if re.search(r'.jar$', fileName): | ||||
|                 fileName = eggCrackingJar(plugin, "name") | ||||
|  | ||||
|             pluginIdStr = str(pluginId) | ||||
|             if pluginId == None or pluginId == '': | ||||
|                 i += 1 | ||||
|                 continue | ||||
|  | ||||
|             if inputSelectedObject != 'all' and inputSelectedObject != pluginIdStr and not re.search(inputSelectedObject, fileName, re.IGNORECASE): | ||||
|                 i += 1 | ||||
|                 continue | ||||
|             if INSTALLEDPLUGINLIST[i][4] != True: | ||||
|                 i += 1 | ||||
|                 continue | ||||
|             if INSTALLEDPLUGINLIST[i][4] == False and inputSelectedObject != 'all': | ||||
|                 print(oColors.brightGreen + f"{fileName} is already on {latestVersion}" + oColors.standardWhite) | ||||
|                 print(oColors.brightRed + "Aborting the update process."+ oColors.standardWhite) | ||||
|                 break | ||||
|  | ||||
|             print(f" [{indexNumberUpdated+1}]".rjust(6), end='') | ||||
|             print("  ", end='') | ||||
|             print(f"{fileName}".ljust(33), end='') | ||||
|             print(f"{fileVersion}".ljust(13), end='') | ||||
|             print(f"{latestVersion}".ljust(13)) | ||||
|             if not configValues.localPluginFolder: | ||||
|                 if configValues.sftp_seperateDownloadPath is True: | ||||
|                     pluginPath = configValues.sftp_pathToSeperateDownloadPath | ||||
|                 else: | ||||
|                     pluginPath = configValues.sftp_folderPath | ||||
|                 pluginPath = f"{pluginPath}/{plugin}" | ||||
|                 indexNumberUpdated += 1 | ||||
|                 pluginsUpdated += 1 | ||||
|                 if configValues.sftp_useSftp: | ||||
|                     sftp = createSFTPConnection() | ||||
|                     try: | ||||
|                         getSpecificPackage(pluginId, pluginPath) | ||||
|                         if configValues.sftp_seperateDownloadPath is False: | ||||
|                             sftp.remove(pluginPath) | ||||
|                     except HTTPError as err: | ||||
|                         print(oColors.brightRed +  f"HTTPError: {err.code} - {err.reason}" + oColors.standardWhite) | ||||
|                         pluginsUpdated -= 1 | ||||
|                     except TypeError: | ||||
|                         print(oColors.brightRed +  f"TypeError: Couldn't download new version. Is the file available on spigotmc?" + oColors.standardWhite) | ||||
|                         pluginsUpdated -= 1 | ||||
|                     except FileNotFoundError: | ||||
|                         print(oColors.brightRed +  f"FileNotFoundError: Old plugin file coulnd't be deleted" + oColors.standardWhite) | ||||
|  | ||||
|                 else: | ||||
|                     ftp = createFTPConnection() | ||||
|                     try: | ||||
|                         getSpecificPackage(pluginId, pluginPath) | ||||
|                         if configValues.sftp_seperateDownloadPath is False: | ||||
|                             ftp.delete(pluginPath) | ||||
|                     except HTTPError as err: | ||||
|                         print(oColors.brightRed +  f"HTTPError: {err.code} - {err.reason}" + oColors.standardWhite) | ||||
|                         pluginsUpdated -= 1 | ||||
|                     except TypeError: | ||||
|                         print(oColors.brightRed +  f"TypeError: Couldn't download new version. Is the file available on spigotmc?" + oColors.standardWhite) | ||||
|                         pluginsUpdated -= 1 | ||||
|                     except FileNotFoundError: | ||||
|                         print(oColors.brightRed +  f"FileNotFoundError: Old plugin file coulnd't be deleted" + oColors.standardWhite) | ||||
|  | ||||
|             else: | ||||
|                 if configValues.seperateDownloadPath is True: | ||||
|                     pluginPath = configValues.pathToSeperateDownloadPath | ||||
|                 else: | ||||
|                     pluginPath = configValues.pathToPluginFolder | ||||
|                 indexNumberUpdated += 1 | ||||
|                 pluginsUpdated += 1 | ||||
|                 try: | ||||
|                     getSpecificPackage(pluginId, pluginPath) | ||||
|                     if configValues.seperateDownloadPath is False: | ||||
|                         pluginPath = f"{pluginPath}/{plugin}" | ||||
|                         os.remove(pluginPath) | ||||
|                 except HTTPError as err: | ||||
|                     print(oColors.brightRed +  f"HTTPError: {err.code} - {err.reason}" + oColors.standardWhite) | ||||
|                     pluginsUpdated -= 1 | ||||
|                 except TypeError: | ||||
|                         print(oColors.brightRed +  f"TypeError: Couldn't download new version. Is the file available on spigotmc?" + oColors.standardWhite) | ||||
|                         pluginsUpdated -= 1 | ||||
|                 except FileNotFoundError: | ||||
|                     print(oColors.brightRed +  f"FileNotFoundError: Old plugin file coulnd't be deleted" + oColors.standardWhite) | ||||
|             if inputSelectedObject != 'all': | ||||
|                 break | ||||
|             elif inputSelectedObject != 'all': | ||||
|                 print(oColors.brightGreen + f"{fileName} is already on {latestVersion}" + oColors.standardWhite) | ||||
|                 print(oColors.brightRed + "Aborting the update process."+ oColors.standardWhite) | ||||
|                 break | ||||
|  | ||||
|             i += 1 | ||||
|     except TypeError: | ||||
|         print(oColors.brightRed + "Error occured: Aborted updating plugins." + oColors.standardWhite) | ||||
|     except NameError: | ||||
|         print(oColors.brightRed + "Check for updates before updating plugins with: 'check all'" + oColors.standardWhite) | ||||
|         print(oColors.brightRed + "Started checking for updates..." + oColors.standardWhite) | ||||
|         checkInstalledPackage() | ||||
|         print(oColors.brightRed + f"Please input 'update {inputSelectedObject}' again!" + oColors.standardWhite) | ||||
|     if i != 0: | ||||
|         print(oColors.brightYellow + f"Plugins updated: [{pluginsUpdated}/{i}]" + oColors.standardWhite) | ||||
|     if inputSelectedObject =='all' and pluginsUpdated == 0 and i != 0: | ||||
|         print(oColors.brightGreen + "All found plugins are on the latest version!" + oColors.standardWhite) | ||||
|  | ||||
|  | ||||
| def getInstalledPlugin(localFileName, localFileVersion, localPluginFullName): | ||||
|     url = "https://api.spiget.org/v2/search/resources/" + localFileName + "?field=name&sort=-downloads" | ||||
|     packageName = doAPIRequest(url) | ||||
|     plugin_match_found = False | ||||
|     pluginID = None | ||||
|     localFileVersionNew = localFileVersion | ||||
|     i = 0 | ||||
|     for i in range(0, 3): | ||||
|         if plugin_match_found == True: | ||||
|             break | ||||
|         if i == 1: | ||||
|             localFileVersionNew = re.sub(r'(\-\w*)', '', localFileVersion) | ||||
|         if i == 2: | ||||
|             pluginNameinYML = eggCrackingJar(localPluginFullName, 'name') | ||||
|             url = "https://api.spiget.org/v2/search/resources/" + pluginNameinYML + "?field=name&sort=-downloads" | ||||
|             try: | ||||
|                 packageName = doAPIRequest(url) | ||||
|             except ValueError: | ||||
|                 continue | ||||
|  | ||||
|             localFileVersion = localFileVersionNew | ||||
|  | ||||
|         for resource in packageName: | ||||
|             if plugin_match_found == True: | ||||
|                 continue | ||||
|             pID = resource["id"] | ||||
|             url2 = f"https://api.spiget.org/v2/resources/{pID}/versions?size=100&sort=-name" | ||||
|             try: | ||||
|                 packageVersions = doAPIRequest(url2) | ||||
|             except ValueError: | ||||
|                 continue | ||||
|             for updates in packageVersions: | ||||
|                 updateVersion = updates["name"] | ||||
|                 if localFileVersionNew in updateVersion: | ||||
|                     plugin_match_found = True | ||||
|                     pluginID = pID | ||||
|                     updateId = updates["id"] | ||||
|                     plugin_latest_version = getLatestPluginVersion(pID) | ||||
|                     plugin_is_outdated = compareVersions(plugin_latest_version, updateVersion) | ||||
|                     addToPluginList(localPluginFullName, pID, updateId,  plugin_latest_version , plugin_is_outdated) | ||||
|                     return pluginID | ||||
|  | ||||
|     else: | ||||
|         if plugin_match_found != True: | ||||
|             pID = updateId = plugin_latest_version = plugin_is_outdated = None | ||||
|             addToPluginList(localPluginFullName, pID, updateId,  plugin_latest_version , plugin_is_outdated) | ||||
|  | ||||
|     return pluginID | ||||
| @@ -1,114 +0,0 @@ | ||||
| import os | ||||
| import sys | ||||
| from urllib.error import HTTPError | ||||
| from pathlib import Path | ||||
|  | ||||
| from handlers.handle_sftp import createSFTPConnection, sftp_listFilesInServerRoot | ||||
| from handlers.handle_ftp import createFTPConnection, ftp_listFilesInServerRoot | ||||
| from handlers.handle_config import configurationValues | ||||
| from utils.consoleoutput import oColors | ||||
| from serverjar.serverjar_paper import paperCheckForUpdate, papermc_downloader | ||||
|  | ||||
|  | ||||
| def checkInstalledServerjar(): | ||||
|     configValues = configurationValues() | ||||
|     if not configValues.localPluginFolder: | ||||
|         if not configValues.sftp_useSftp: | ||||
|             ftp = createFTPConnection() | ||||
|             serverRootList = ftp_listFilesInServerRoot(ftp) | ||||
|         else: | ||||
|             sftp = createSFTPConnection() | ||||
|             serverRootList = sftp_listFilesInServerRoot(sftp) | ||||
|     else: | ||||
|         serverRootList = os.path.dirname(configValues.pathToPluginFolder) | ||||
|         serverRootList = os.listdir(serverRootList) | ||||
|     installedServerjarFullName = None | ||||
|     try: | ||||
|         for files in serverRootList: | ||||
|             try: | ||||
|                 if '.jar' in files: | ||||
|                     installedServerjarFullName = files | ||||
|                     break | ||||
|             except TypeError: | ||||
|                 continue | ||||
|     except TypeError: | ||||
|         print(oColors.brightRed + "Serverjar couldn't be found." + oColors.standardWhite) | ||||
|         print(oColors.brightRed + "Aborting the process." + oColors.standardWhite) | ||||
|  | ||||
|     if installedServerjarFullName == None: | ||||
|         print(oColors.brightRed + "Serverjar couldn't be found." + oColors.standardWhite) | ||||
|         print(oColors.brightRed + "Aborting the process." + oColors.standardWhite) | ||||
|         input("Press any key + enter to exit...") | ||||
|         sys.exit() | ||||
|     print(oColors.brightBlack + f"Checking: {installedServerjarFullName}" + oColors.standardWhite) | ||||
|     if 'paper' in installedServerjarFullName: | ||||
|         paperCheckForUpdate(installedServerjarFullName) | ||||
|  | ||||
|     else: | ||||
|         print(oColors.brightRed + f"{installedServerjarFullName} isn't supported.") | ||||
|         print(oColors.brightRed + "Aborting the process." + oColors.standardWhite) | ||||
|  | ||||
|  | ||||
| def updateServerjar(serverJarBuild='latest'): | ||||
|     configValues = configurationValues() | ||||
|     try: | ||||
|         if serverJarBuild == None: | ||||
|             serverJarBuild = 'latest' | ||||
|         if not configValues.localPluginFolder: | ||||
|             sftp = createSFTPConnection() | ||||
|             serverRootPath = configValues.sftp_folderPath | ||||
|             serverRootPath = Path(str(serverRootPath).replace(r'/plugins', '')) | ||||
|             serverRootList = sftp_listFilesInServerRoot(sftp) | ||||
|  | ||||
|         else: | ||||
|             serverRoot = os.path.dirname(configValues.pathToPluginFolder) | ||||
|             serverRootList = os.listdir(serverRoot) | ||||
|             serverRootPath = configValues.pathToPluginFolder | ||||
|             helpPath = Path('/plugins') | ||||
|             helpPathstr = str(helpPath) | ||||
|             serverRootPath = Path(str(serverRootPath).replace(helpPathstr, '')) | ||||
|             installedServerjarFullName = None | ||||
|  | ||||
|     except FileNotFoundError: | ||||
|         print(oColors.brightRed + "Path couldn't be found!" + oColors.standardWhite) | ||||
|         print(oColors.brightRed + "Check your config!" + oColors.standardWhite) | ||||
|         print(oColors.brightRed + "Aborting the process." + oColors.standardWhite) | ||||
|         input("Press any key + enter to exit...") | ||||
|         sys.exit() | ||||
|  | ||||
|     try: | ||||
|         for files in serverRootList: | ||||
|             try: | ||||
|                 if '.jar' in files: | ||||
|                     installedServerjarFullName = files | ||||
|                     break | ||||
|             except TypeError: | ||||
|                 continue | ||||
|     except TypeError: | ||||
|         print(oColors.brightRed + "Serverjar couldn't be found." + oColors.standardWhite) | ||||
|         print(oColors.brightRed + "Aborting the process." + oColors.standardWhite) | ||||
|  | ||||
|     if installedServerjarFullName == None: | ||||
|         print(oColors.brightRed + "Serverjar couldn't be found." + oColors.standardWhite) | ||||
|         print(oColors.brightRed + "Aborting the process." + oColors.standardWhite) | ||||
|         input("Press any key + enter to exit...") | ||||
|         sys.exit() | ||||
|  | ||||
|     serverJarPath = Path(f"{serverRootPath}/{installedServerjarFullName}") | ||||
|  | ||||
|     if 'paper' in installedServerjarFullName: | ||||
|         print(oColors.brightBlack + f"Updating Paper to build: {serverJarBuild}" + oColors.standardWhite) | ||||
|         try: | ||||
|             papermc_downloader(serverJarBuild, None, installedServerjarFullName) | ||||
|             if not configValues.localPluginFolder: | ||||
|                 sftp.remove(serverJarPath) | ||||
|             else: | ||||
|                 os.remove(serverJarPath) | ||||
|         except HTTPError as err: | ||||
|             print(oColors.brightRed +  f"Error: {err.code} - {err.reason}" + oColors.standardWhite) | ||||
|         except FileNotFoundError: | ||||
|             print(oColors.brightRed +  "Error: Old serverjar file coulnd't be deleted" + oColors.standardWhite) | ||||
|     else: | ||||
|         print(oColors.brightRed + f"{installedServerjarFullName} isn't supported.") | ||||
|         print(oColors.brightRed + "Aborting the process." + oColors.standardWhite) | ||||
|      | ||||
| @@ -1,218 +0,0 @@ | ||||
| import re | ||||
| import urllib.request | ||||
| from pathlib import Path | ||||
| from rich.console import Console | ||||
|  | ||||
| from utils.consoleoutput import oColors | ||||
| from utils.web_request import doAPIRequest | ||||
| from handlers.handle_sftp import createSFTPConnection, sftp_upload_server_jar | ||||
| from handlers.handle_ftp import createFTPConnection, ftp_upload_server_jar | ||||
| from handlers.handle_config import configurationValues | ||||
| from utils.utilities import createTempPluginFolder, deleteTempPluginFolder, calculateFileSizeMb | ||||
|  | ||||
|  | ||||
| def getInstalledPaperMinecraftVersion(localPaperName): | ||||
|     if localPaperName is None: | ||||
|         return False | ||||
|     mcVersionFull = re.search(r'(\d*\.*\d)+', localPaperName) | ||||
|     try: | ||||
|         mcVersion = mcVersionFull.group() | ||||
|     except AttributeError: | ||||
|         mcVersion = mcVersionFull | ||||
|     return mcVersion | ||||
|  | ||||
|  | ||||
| def getInstalledPaperVersion(localPaperName): | ||||
|     if localPaperName is None: | ||||
|         return False | ||||
|     paperBuildFull = re.search(r'([\d]*.jar)', localPaperName) | ||||
|     try: | ||||
|         paperBuild = paperBuildFull.group() | ||||
|     except AttributeError: | ||||
|         paperBuild = paperBuildFull | ||||
|     paperBuild = paperBuild.replace('.jar', '') | ||||
|     return paperBuild | ||||
|  | ||||
|  | ||||
| def findVersionGroup(mcVersion): | ||||
|     versionGroups = ['1.17', '1.16', '1.15'] | ||||
|     if mcVersion is None: | ||||
|         return False | ||||
|     for versionGroup in versionGroups: | ||||
|         url = f"https://papermc.io/api/v2/projects/paper/version_group/{versionGroup}/builds" | ||||
|         papermcdetails = doAPIRequest(url) | ||||
|         papermcVersionForMc = papermcdetails["versions"] | ||||
|         for versions in papermcVersionForMc: | ||||
|             if versions == mcVersion: | ||||
|                 paperVersionGroup = versionGroup | ||||
|                 return paperVersionGroup | ||||
|             if versionGroup == mcVersion: | ||||
|                 paperVersionGroup = versionGroup | ||||
|                 return paperVersionGroup | ||||
|     return False  # Not found | ||||
|  | ||||
|  | ||||
| def findBuildVersion(wantedPaperBuild): | ||||
|     versionGroups = ['1.17', '1.16', '1.15'] | ||||
|     if wantedPaperBuild is None: | ||||
|         return False | ||||
|     for versionGroup in versionGroups: | ||||
|         url = f"https://papermc.io/api/v2/projects/paper/version_group/{versionGroup}/builds" | ||||
|         papermcdetails = doAPIRequest(url) | ||||
|         paperMcBuilds = papermcdetails["builds"] | ||||
|         for build in paperMcBuilds: | ||||
|             paperBuild = str(build["build"]) | ||||
|             if paperBuild == wantedPaperBuild: | ||||
|                 paperVersionGroup = build["version"] | ||||
|                 return paperVersionGroup | ||||
|     return False  # Not found | ||||
|  | ||||
|  | ||||
| def findLatestBuild(paperVersionGroup): | ||||
|     if paperVersionGroup is None: | ||||
|         return False | ||||
|     url = f"https://papermc.io/api/v2/projects/paper/version_group/{paperVersionGroup}/builds" | ||||
|     papermcbuilds = doAPIRequest(url) | ||||
|     if "status" in papermcbuilds:  # Checks if the API returns a status. This means that there was an error. | ||||
|         return False | ||||
|     latestPaperBuild = papermcbuilds["builds"][-1]["build"] | ||||
|     return latestPaperBuild | ||||
|  | ||||
|  | ||||
| def findLatestBuildForVersion(mcVersion): | ||||
|     if mcVersion is None: | ||||
|         return False | ||||
|     url = f"https://papermc.io/api/v2/projects/paper/versions/{mcVersion}" | ||||
|     papermcbuilds = doAPIRequest(url) | ||||
|     latestPaperBuild = papermcbuilds["builds"][-1] | ||||
|     return latestPaperBuild | ||||
|  | ||||
|  | ||||
| def versionBehind(installedPaperBuild, latestPaperBuild): | ||||
|     if installedPaperBuild is None or latestPaperBuild is None: | ||||
|         return False | ||||
|     installedPaperBuildint = int(installedPaperBuild) | ||||
|     latestPaperBuildint = int(latestPaperBuild) | ||||
|     versionsBehind = latestPaperBuildint - installedPaperBuildint | ||||
|     return versionsBehind | ||||
|  | ||||
|  | ||||
| def getDownloadFileName(paperMcVersion, paperBuild): | ||||
|     if paperMcVersion is None or paperBuild is None: | ||||
|         return False | ||||
|     url = f"https://papermc.io/api/v2/projects/paper/versions/{paperMcVersion}/builds/{paperBuild}" | ||||
|     buildDetails = doAPIRequest(url) | ||||
|     downloadName = buildDetails["downloads"]["application"]["name"] | ||||
|     return downloadName | ||||
|  | ||||
|  | ||||
| def paperCheckForUpdate(installedServerjarFullName): | ||||
|     mcVersion = getInstalledPaperMinecraftVersion(installedServerjarFullName) | ||||
|  | ||||
|     # Report an error if getInstalledPaperMinecraftVersion encountered an issue. | ||||
|     if not mcVersion: | ||||
|         print(oColors.brightRed + "ERR: An error was encountered while detecting the server's Minecraft version." + | ||||
|               oColors.standardWhite) | ||||
|         return False | ||||
|  | ||||
|     paperInstalledBuild = getInstalledPaperVersion(installedServerjarFullName) | ||||
|     # Report an error if getInstalledPaperVersion encountered an issue. | ||||
|     if not paperInstalledBuild: | ||||
|         print(oColors.brightRed + "ERR: An error was encountered while detecting the server's Paper version." + | ||||
|               oColors.standardWhite) | ||||
|         return False | ||||
|  | ||||
|     versionGroup = findVersionGroup(mcVersion) | ||||
|     # Report an error if findVersionGroup encountered an issue. | ||||
|     if not versionGroup: | ||||
|         print(oColors.brightRed + "ERR: An error was encountered while fetching the server's version group." + | ||||
|               oColors.standardWhite) | ||||
|         return False | ||||
|  | ||||
|     paperLatestBuild = findLatestBuild(versionGroup) | ||||
|     # Report an error if findLatestBuild encountered an issue. | ||||
|     if not paperLatestBuild: | ||||
|         print(oColors.brightRed + "ERR: An error was encountered while fetching the latest version of PaperMC." + | ||||
|               oColors.standardWhite) | ||||
|         return False  # Not currently handled, but can be at a later date. Currently just stops the following from | ||||
|     #                   being printed. | ||||
|  | ||||
|     paperVersionBehind = versionBehind(paperInstalledBuild, paperLatestBuild) | ||||
|     # Report an error if getInstalledPaperVersion encountered an issue. | ||||
|     if not paperVersionBehind: | ||||
|         print(oColors.brightRed + "ERR: An error was encountered while detecting how many versions behind you are. " | ||||
|                                   f"Will display as 'N/A'." + oColors.standardWhite) | ||||
|         paperVersionBehind = "N/A"  # Sets paperVersionBehind to N/A while still letting the versionBehind check return | ||||
|                                     # False for error-handing reasons. | ||||
|  | ||||
|         # Does not return false as versions behind doesn't break things. It is just helpful information. | ||||
|         # paperVersionBehind will just display as "N/A" | ||||
|     print("┌─────┬────────────────────────────────┬──────────────┬──────────────┐") | ||||
|     print("│ No. │ Name                           │ Installed V. │ Latest V.    │") | ||||
|     print("└─────┴────────────────────────────────┴──────────────┴──────────────┘") | ||||
|     print("  [1]".rjust(6), end='') | ||||
|     print("  ", end='') | ||||
|     if paperVersionBehind != 0: | ||||
|         print(oColors.brightRed + "paper".ljust(33) + oColors.standardWhite, end='') | ||||
|     else: | ||||
|         print(oColors.brightGreen + "paper".ljust(33) + oColors.standardWhite, end='') | ||||
|     print(f"{paperInstalledBuild}".ljust(15), end='') | ||||
|     print(f"{paperLatestBuild}".ljust(15)) | ||||
|     print(oColors.brightYellow + f"Versions behind: [{paperVersionBehind}]" + oColors.standardWhite) | ||||
|  | ||||
|  | ||||
| # https://papermc.io/api/docs/swagger-ui/index.html?configUrl=/api/openapi/swagger-config#/ | ||||
| def papermc_downloader(paperBuild='latest', mcVersion=None, installedServerjarName=None): | ||||
|     configValues = configurationValues() | ||||
|     if configValues.localPluginFolder == False: | ||||
|         downloadPath = createTempPluginFolder() | ||||
|     else: | ||||
|         downloadPath = configValues.pathToPluginFolder | ||||
|         helpPath = Path('/plugins') | ||||
|         helpPathstr = str(helpPath) | ||||
|         downloadPath = Path(str(downloadPath).replace(helpPathstr, '')) | ||||
|  | ||||
|     if mcVersion == None: | ||||
|         if paperBuild == 'latest': | ||||
|             mcVersion = '1.17.1' | ||||
|         else: | ||||
|             mcVersion = findBuildVersion(paperBuild) | ||||
|  | ||||
|     if installedServerjarName != None: | ||||
|         mcVersion = getInstalledPaperMinecraftVersion(installedServerjarName) | ||||
|  | ||||
|     if paperBuild == 'latest': | ||||
|         paperBuild = findLatestBuildForVersion(mcVersion) | ||||
|     try: | ||||
|         downloadFileName = getDownloadFileName(mcVersion, paperBuild) | ||||
|     except KeyError: | ||||
|         print(oColors.brightRed + f"This version wasn't found for {mcVersion}" + oColors.standardWhite) | ||||
|         print(oColors.brightRed + f"Reverting to latest version for {mcVersion}" + oColors.standardWhite) | ||||
|         paperBuild = findLatestBuildForVersion(mcVersion) | ||||
|         downloadFileName = getDownloadFileName(mcVersion, paperBuild) | ||||
|  | ||||
|     downloadPackagePath = Path(f"{downloadPath}/{downloadFileName}") | ||||
|     if configValues.localPluginFolder == False: | ||||
|         downloadPath = createTempPluginFolder() | ||||
|  | ||||
|     url = f"https://papermc.io/api/v2/projects/paper/versions/{mcVersion}/builds/{paperBuild}/downloads/{downloadFileName}" | ||||
|     remotefile = urllib.request.urlopen(url) | ||||
|     filesize = remotefile.info()['Content-Length'] | ||||
|     print(f"Getting Paper {paperBuild} for {mcVersion}") | ||||
|     console = Console() | ||||
|     with console.status("Downloading...", spinner='line', spinner_style='bright_magenta') as status: | ||||
|         urllib.request.urlretrieve(url, downloadPackagePath) | ||||
|     filesizeData = calculateFileSizeMb(filesize) | ||||
|     print("Downloaded " + (str(filesizeData)).rjust(9) + f" MB here {downloadPackagePath}") | ||||
|     if not configValues.localPluginFolder: | ||||
|         if not configValues.sftp_useSftp: | ||||
|             ftpSession = createFTPConnection() | ||||
|             ftp_upload_server_jar(ftpSession, downloadPackagePath) | ||||
|         else: | ||||
|             sftpSession = createSFTPConnection() | ||||
|             sftp_upload_server_jar(sftpSession, downloadPackagePath) | ||||
|  | ||||
|         deleteTempPluginFolder(downloadPath) | ||||
|  | ||||
|     print(oColors.brightGreen + "Downloaded successfully " + oColors.standardWhite + f"Paper {paperBuild}" + \ | ||||
|           oColors.brightGreen + " for " + oColors.standardWhite + f"{mcVersion}" + oColors.standardWhite) | ||||
| @@ -1,89 +0,0 @@ | ||||
| from os import system | ||||
| from os import name | ||||
|  | ||||
|  | ||||
| def consoleTitle(): | ||||
|     system("title " + "pluGET │ By Neocky") | ||||
|  | ||||
|  | ||||
| def clearConsole(): | ||||
|     system('cls' if name=='nt' else 'clear') | ||||
|  | ||||
|  | ||||
| # https://docs.microsoft.com/en-us/windows/console/console-virtual-terminal-sequences | ||||
| class oColors: | ||||
|     standardWhite = "\033[0m" | ||||
|     brightBlack = "\033[90m" | ||||
|     brightRed = "\033[91m" | ||||
|     brightGreen = "\033[92m" | ||||
|     brightYellow = "\033[93m" | ||||
|     brightMagenta = "\033[95m" | ||||
|  | ||||
|  | ||||
| def printLogo(): | ||||
|     print() | ||||
|     print(oColors.brightYellow + r"          ___           ___       ___           ___           ___           ___     ") | ||||
|     print(oColors.brightMagenta + r"         /\  " + oColors.brightYellow + r"\         " + oColors.brightMagenta + r"/"'\\' + | ||||
|     oColors.brightYellow + r"__\     " + oColors.brightMagenta + r"/"'\\' + oColors.brightYellow + r"__\         " + | ||||
|     oColors.brightMagenta + r"/\  "+ oColors.brightYellow + r"\         " + oColors.brightMagenta + r"/\  "+ | ||||
|     oColors.brightYellow + r"\         " + oColors.brightMagenta + r"/\  "+ oColors.brightYellow + r""'\\    ') | ||||
|     print(oColors.brightMagenta + r"        /::\  "+ oColors.brightYellow + r"\       " + oColors.brightMagenta + r"/:/  " + | ||||
|     oColors.brightYellow + r"/    " + oColors.brightMagenta + r"/:/  "+ oColors.brightYellow + r"/        " + | ||||
|     oColors.brightMagenta + r"/::\  "+ oColors.brightYellow + r"\       " + oColors.brightMagenta + r"/::\  "+ | ||||
|     oColors.brightYellow + r"\        " + oColors.brightMagenta + r"\:\  "+ oColors.brightYellow + r""'\\   ') | ||||
|     print(oColors.brightMagenta + r"       /:/\:\  "+ oColors.brightYellow + r"\     " + oColors.brightMagenta + r"/:/  "+ | ||||
|     oColors.brightYellow + r"/    " + oColors.brightMagenta + r"/:/  "+ oColors.brightYellow + r"/        " + | ||||
|     oColors.brightMagenta + r"/:/\:\  "+ oColors.brightYellow + r"\     " + oColors.brightMagenta + r"/:/\:\  "+ | ||||
|     oColors.brightYellow + r"\        " + oColors.brightMagenta + r"\:\  "+ oColors.brightYellow + r""'\\  ') | ||||
|     print(oColors.brightMagenta + r"      /::"'\\' + oColors.brightYellow + r"~" + oColors.brightMagenta + r"\:\  "+ | ||||
|     oColors.brightYellow + r"\   " + oColors.brightMagenta + r"/:/  "+ oColors.brightYellow + r"/    " + | ||||
|     oColors.brightMagenta + r"/:/  "+ oColors.brightYellow + r"/  ___   " + oColors.brightMagenta + r"/:/  \:\  "+ | ||||
|     oColors.brightYellow + r"\   " + oColors.brightMagenta + r"/::"'\\'+ oColors.brightYellow + r"~" + | ||||
|     oColors.brightMagenta + r"\:\  "+ oColors.brightYellow + r"\       " + oColors.brightMagenta + r"/::\  "+ | ||||
|     oColors.brightYellow + r""'\\') | ||||
|     print(oColors.brightMagenta + r"     /:/\:\ \:"'\\'+ oColors.brightYellow + r"__\ " + oColors.brightMagenta + r"/:/"+ | ||||
|     oColors.brightYellow + r"__/    " + oColors.brightMagenta + r"/:/"+ oColors.brightYellow + r"__/  " + | ||||
|     oColors.brightMagenta + r"/"'\\'+ oColors.brightYellow + r"__\ " + oColors.brightMagenta + r"/:/"+ | ||||
|     oColors.brightYellow + r"__/_" + oColors.brightMagenta + r"\:"'\\'+ oColors.brightYellow + r"__\ " + | ||||
|     oColors.brightMagenta + r"/:/\:\ \:"'\\' + oColors.brightYellow + r"__\     " + | ||||
|     oColors.brightMagenta + r"/:/\:"'\\'+ oColors.brightYellow + r"__\ ") | ||||
|     print(oColors.brightMagenta + r"     " + oColors.brightMagenta + r"\/"+ oColors.brightYellow + r"__" + | ||||
|     oColors.brightMagenta + r"\:\/:/"+ oColors.brightYellow + r"  / " + oColors.brightMagenta + r"\:"'\\'+ | ||||
|     oColors.brightYellow + r"  \    " + oColors.brightMagenta + r"\:"'\\' + oColors.brightYellow + r"  \ " + | ||||
|     oColors.brightMagenta + r"/:/  "+ oColors.brightYellow + r"/ " + oColors.brightMagenta + r"\:\  /\ \/" + | ||||
|     oColors.brightYellow + r"__/ " + oColors.brightMagenta + r"\:"'\\' + oColors.brightYellow + r"~" + | ||||
|     oColors.brightMagenta + r"\:\ \/" + oColors.brightYellow + r"__/    " + oColors.brightMagenta + r"/:/  \/"+ | ||||
|     oColors.brightYellow + r"__/") | ||||
|     print(oColors.brightMagenta + r"          \::/  "+ oColors.brightYellow + r"/   " + oColors.brightMagenta + r"\:\  "+ | ||||
|     oColors.brightYellow + r"\    " + oColors.brightMagenta + r"\:\  /:/  "+ oColors.brightYellow + r"/   " + | ||||
|     oColors.brightMagenta + r"\:\ \:"'\\'+ oColors.brightYellow + r"__\    " + oColors.brightMagenta + r"\:\ \:"'\\'+ | ||||
|     oColors.brightYellow + r"__\     " + oColors.brightMagenta + r"/:/  "+ oColors.brightYellow + r"/     ") | ||||
|     print(oColors.brightMagenta + r"           \/"+ oColors.brightYellow + r"__/     " + | ||||
|     oColors.brightMagenta + r"\:\  " + oColors.brightYellow + r"\    " + oColors.brightMagenta + r"\:\/:/  "+ | ||||
|     oColors.brightYellow + r"/     " + oColors.brightMagenta + r"\:\/:/  "+ oColors.brightYellow + r"/     " + | ||||
|     oColors.brightMagenta + r"\:\ \/"+ oColors.brightYellow + r"__/     " + oColors.brightMagenta + r"\/"+ | ||||
|     oColors.brightYellow + r"__/      ") | ||||
|     print(oColors.brightMagenta + r"                      \:"'\\' + oColors.brightYellow + r"__\    " + | ||||
|     oColors.brightMagenta + r"\::/  " + oColors.brightYellow + r"/       " + oColors.brightMagenta + r"\::/  " + | ||||
|     oColors.brightYellow + r"/       " + oColors.brightMagenta + r"\:"'\\' + oColors.brightYellow + r"__\                  ") | ||||
|     print(oColors.brightMagenta + r"                       \/" + oColors.brightYellow + r"__/     " + | ||||
|     oColors.brightMagenta + r"\/" + oColors.brightYellow + r"__/         " + oColors.brightMagenta + r"\/" + | ||||
|     oColors.brightYellow + r"__/         " + oColors.brightMagenta + r"\/" + oColors.brightYellow + r"__/                  " + | ||||
|     oColors.standardWhite) | ||||
|     print() | ||||
|     print() | ||||
|     print(oColors.brightBlack + "                        ┌────────────────────────────────────┐" + oColors.standardWhite) | ||||
|     print(oColors.brightBlack + "                        │             [" + oColors.brightMagenta + "By Neocky" +oColors.brightBlack + | ||||
|      "]            │                                   " + oColors.standardWhite) | ||||
|     print(oColors.brightBlack + "                        │  " + oColors.brightMagenta + "https://github.com/Neocky/pluGET" + oColors.brightBlack + | ||||
|      "  │                                                  " + oColors.standardWhite) | ||||
|     print(oColors.brightBlack + "                        └────────────────────────────────────┘" + oColors.standardWhite) | ||||
|  | ||||
|  | ||||
| def printHorizontalLine(): | ||||
|     print("    ─────────────────────────────────────────────────────────────────────────────────") | ||||
|  | ||||
|  | ||||
| def printMainMenu(): | ||||
|     printLogo() | ||||
|     printHorizontalLine() | ||||
| @@ -1,175 +0,0 @@ | ||||
| # misc functions | ||||
| import os | ||||
| import sys | ||||
| import shutil | ||||
| import requests | ||||
| from pathlib import Path | ||||
|  | ||||
| from utils.consoleoutput import oColors | ||||
| from handlers.handle_config import configurationValues | ||||
| from handlers.handle_sftp import createSFTPConnection | ||||
| from handlers.handle_ftp import createFTPConnection | ||||
|  | ||||
|  | ||||
| def getHelp(): | ||||
|     print(oColors.brightYellow+ "Need help?" + oColors.standardWhite) | ||||
|     print("For a list of all commands: 'help command'") | ||||
|     print("Or check the docs here:") | ||||
|     print("https://github.com/Neocky/pluGET") | ||||
|     print("Or go to the official discord.") | ||||
|     print("The link for discord can also be found on Github!") | ||||
|  | ||||
|  | ||||
| def getCommandHelp(optionalParams): | ||||
|     if optionalParams == None: | ||||
|         optionalParams = 'all' | ||||
|     print(oColors.brightBlack + f"Help for command: {optionalParams}" +oColors.standardWhite) | ||||
|     print("┌────────────────┬─────────────────┬─────────────────┬────────────────────────────────────────────────────────┐") | ||||
|     print("│ Command        │ Selected Object │ Optional Params │ Function                                               │") | ||||
|     print("└────────────────┴─────────────────┴─────────────────┴────────────────────────────────────────────────────────┘") | ||||
|     while True: | ||||
|         if optionalParams == 'all': | ||||
|             print(oColors.brightBlack + " GENERAL:" + oColors.standardWhite) | ||||
|             print("  exit             ./anything                          Exit pluGET") | ||||
|             print("  help             ./anything                          Get general help") | ||||
|             print("  help             command           all/command       Get specific help to the commands of pluGET") | ||||
|             print(oColors.brightBlack + " PLUGIN MANAGEMENT:" + oColors.standardWhite) | ||||
|             print("  get              Name/ID           Version           Downloads the latest version of a plugin") | ||||
|             print("  check            Name/ID/all       changelog         Check for an update of an installed plugin") | ||||
|             print("  update           Name/ID/all                         Update installed plugins to the latest version") | ||||
|             print("  search           Name                                Search for a plugin and download the latest version") | ||||
|             print("  remove           Name/ID                             Delete an installed plugin") | ||||
|             print(oColors.brightBlack + " SERVER SOFTWARE MANAGEMENT:" + oColors.standardWhite) | ||||
|             print("  check            serverjar                           Check installed server software for an update") | ||||
|             print("  update           serverjar         Version/Latest    Update installed server software to a specific version") | ||||
|             print("  get-paper        PaperVersion      McVersion         Downloads a specific PaperMc version") | ||||
|             break | ||||
|  | ||||
|         if optionalParams == 'exit': | ||||
|             print(oColors.brightBlack + " GENERAL:" + oColors.standardWhite) | ||||
|             print("  exit             ./anything                          Exit pluGET") | ||||
|             break | ||||
|  | ||||
|         if optionalParams == 'help': | ||||
|             print(oColors.brightBlack + " GENERAL:" + oColors.standardWhite) | ||||
|             print("  help             ./anything                          Get general help") | ||||
|             print("  help             command           all/command       Get specific help to the commands of pluGET") | ||||
|             break | ||||
|  | ||||
|         if optionalParams == 'get': | ||||
|             print(oColors.brightBlack + " PLUGIN MANAGEMENT:" + oColors.standardWhite) | ||||
|             print(print("  get              Name/ID           Version           Downloads the latest version of a plugin")) | ||||
|             break | ||||
|  | ||||
|         if optionalParams == 'check': | ||||
|             print(oColors.brightBlack + " PLUGIN MANAGEMENT:" + oColors.standardWhite) | ||||
|             print("  check            Name/ID/all                         Check for an update of an installed plugin") | ||||
|             print(oColors.brightBlack + " SERVER SOFTWARE MANAGEMENT:" + oColors.standardWhite) | ||||
|             print("  check            serverjar                           Check installed server software for an update") | ||||
|             break | ||||
|  | ||||
|         if optionalParams == 'update': | ||||
|             print(oColors.brightBlack + " PLUGIN MANAGEMENT:" + oColors.standardWhite) | ||||
|             print("  update           Name/ID/all                         Update installed plugins to the latest version") | ||||
|             print(oColors.brightBlack + " SERVER SOFTWARE MANAGEMENT:" + oColors.standardWhite) | ||||
|             print("  update           serverjar         Version/Latest    Update installed server software to a specific version") | ||||
|             break | ||||
|  | ||||
|         if optionalParams == 'search': | ||||
|             print(oColors.brightBlack + " PLUGIN MANAGEMENT:" + oColors.standardWhite) | ||||
|             print("  search           Name                                Search for a plugin and download the latest version") | ||||
|             break | ||||
|  | ||||
|         if optionalParams == 'remove': | ||||
|             print(oColors.brightBlack + " PLUGIN MANAGEMENT:" + oColors.standardWhite) | ||||
|             print("  remove           Name/ID                             Delete an installed plugin") | ||||
|             break | ||||
|  | ||||
|         if optionalParams == 'get-paper': | ||||
|             print(oColors.brightBlack + " SERVER SOFTWARE MANAGEMENT:" + oColors.standardWhite) | ||||
|             print("  get-paper        PaperVersion      McVersion         Downloads a specific PaperMc version") | ||||
|             break | ||||
|  | ||||
|         else: | ||||
|             print(oColors.brightRed + "Error: Help for Command not found. Please try again. :(" + oColors.standardWhite) | ||||
|             break | ||||
|  | ||||
|  | ||||
| def check_local_plugin_folder(): | ||||
|     configValues = configurationValues() | ||||
|     if configValues.localPluginFolder: | ||||
|         if configValues.seperateDownloadPath: | ||||
|             pluginFolderPath = configValues.pathToSeperateDownloadPath | ||||
|         else: | ||||
|             pluginFolderPath = configValues.pathToPluginFolder | ||||
|  | ||||
|         if not os.path.isdir(pluginFolderPath): | ||||
|             print(oColors.brightRed + "Plugin folder coulnd*t be found. Creating one..." + oColors.standardWhite) | ||||
|             try: | ||||
|                 os.mkdir(pluginFolderPath) | ||||
|             except OSError: | ||||
|                 print(oColors.brightRed + "Creation of directory %s failed" % pluginFolderPath) | ||||
|                 print(oColors.brightRed + "Please check the config file!" + oColors.standardWhite) | ||||
|                 input("Press any key + enter to exit...") | ||||
|                 sys.exit() | ||||
|             else: | ||||
|                 print("Created directory %s" % pluginFolderPath) | ||||
|  | ||||
|  | ||||
| def apiTest(): | ||||
|     apiStatusUrl = 'https://api.spiget.org/v2/status' | ||||
|     try: | ||||
|         r = requests.get(apiStatusUrl) | ||||
|     except (requests.exceptions.HTTPError, requests.exceptions.ConnectionError): | ||||
|         print(oColors.brightRed + "Couldn't make a connection to the API. Check you connection to the internet!" + oColors.standardWhite) | ||||
|         input("Press any key + enter to exit...") | ||||
|         sys.exit() | ||||
|     if r.status_code != 200: | ||||
|         print(oColors.brightRed + "Problems with the API detected. Plese try it again later!" + oColors.standardWhite) | ||||
|         input("Press any key + enter to exit...") | ||||
|         sys.exit() | ||||
|  | ||||
|  | ||||
| def check_requirements(): | ||||
|     configValues = configurationValues() | ||||
|     apiTest() | ||||
|     check_local_plugin_folder() | ||||
|     if not configValues.localPluginFolder: | ||||
|         if configValues.sftp_useSftp: | ||||
|             createSFTPConnection() | ||||
|         else: | ||||
|             createFTPConnection() | ||||
|  | ||||
|  | ||||
| def createTempPluginFolder(): | ||||
|     configValues = configurationValues() | ||||
|     tempPluginFolder = Path("./TempSFTPFolder") | ||||
|     if not os.path.isdir(tempPluginFolder): | ||||
|         try: | ||||
|             os.mkdir(tempPluginFolder) | ||||
|         except OSError: | ||||
|             print(oColors.brightRed + "Creation of directory %s failed" % configValues.pathToPluginFolder) | ||||
|             print(oColors.brightRed + "Please check the config file!" + oColors.standardWhite) | ||||
|             input("Press any key + enter to exit...") | ||||
|             sys.exit() | ||||
|     return tempPluginFolder | ||||
|  | ||||
|  | ||||
| def deleteTempPluginFolder(tempPluginFolder): | ||||
|     try: | ||||
|         shutil.rmtree(tempPluginFolder) | ||||
|     except OSError as e: | ||||
|         print ("Error: %s - %s." % (e.filename, e.strerror)) | ||||
|  | ||||
|  | ||||
| def calculateFileSizeMb(downloadFileSize): | ||||
|     fileSizeDownload = int(downloadFileSize) | ||||
|     fileSizeMb = fileSizeDownload / 1024 / 1024 | ||||
|     roundedFileSize = round(fileSizeMb, 2) | ||||
|     return roundedFileSize | ||||
|  | ||||
| def calculateFileSizeKb(downloadFileSize): | ||||
|     fileSizeDownload = int(downloadFileSize) | ||||
|     fileSizeKb = fileSizeDownload / 1024 | ||||
|     roundedFileSize = round(fileSizeKb, 2) | ||||
|     return roundedFileSize | ||||
| @@ -1,9 +0,0 @@ | ||||
| # Handles the web requests | ||||
| import requests | ||||
|  | ||||
|  | ||||
| def doAPIRequest(url): | ||||
|     headers = {'user-agent': 'pluGET/1.0'} | ||||
|     response = requests.get(url, headers=headers) | ||||
|     packageDetails = response.json() | ||||
|     return packageDetails | ||||
| @@ -367,7 +367,7 @@ def check_installed_plugins(input_selected_object : str="all", input_parameter : | ||||
|     if plugins_with_udpates != 0: | ||||
|         rich_console.print( | ||||
|         "[not bold][bright_yellow]Plugins with available updates: [bright_green]" + | ||||
|         f"{plugins_with_udpates}[bright_yellow]/[bright_magenta]{plugin_count}" | ||||
|         f"{plugins_with_udpates}[bright_yellow]/[green]{plugin_count}" | ||||
|             ) | ||||
|     else: | ||||
|         rich_console.print(f"[bright_green]All found plugins are on the newest version!") | ||||
| @@ -423,7 +423,8 @@ def update_installed_plugins(input_selected_object : str="all", no_confirmation | ||||
|  | ||||
|         rich_console.print( | ||||
|             "\n [not bold][bright_white]● [bright_magenta]" + | ||||
|             f"{plugin.plugin_name} [green]{plugin.plugin_file_version} [cyan]→ [bright_green]{plugin.plugin_latest_version}" | ||||
|             f"{plugin.plugin_name} [green]{plugin.plugin_file_version}" + \ | ||||
|             f" [cyan]→ [bright_green]{plugin.plugin_latest_version}" | ||||
|         ) | ||||
|  | ||||
|         plugins_updated += 1 | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Neocky
					Neocky