TermPY/main.py
ousmblueninja e905832868 modified: main.py
modified:   packages/vault.py
2023-09-21 19:48:54 -05:00

369 lines
9.8 KiB
Python

#!/usr/bin/env python3
import json
import os
import sys
import importlib
from inspect import isfunction
import random
import time
import ast
if os.name != "nt":
import readline
import threading
import signal
import requests
import subprocess
helper = '''import ast
class color:
green = "\033[1;32m"
blue = "\033[1;34m"
white = "\033[0m"
green = "\033[1;32m"
red = "\033[1;31m"
white = "\033[0m"
blue = "\033[1;34m"
orange = "\033[1;33m"
def update(self, packages):
with open(("./packages/pakk.conf"), "w") as f:
f.write(str(packages))
def toList(List: str) -> list:
newList = ast.literal_eval(List)
if isinstance(newList, list):
return newList
def install(name:str, Packages:list):
try:
if name in [row[0] for row in Packages.packages]:
return
with open(("./packages/"+name+".py"), "r") as f:
line = f.readline()
line = line.strip("#")
# ... (existing code)
print("Installing Package")
Packages.packages.append(toList(line))
Packages.update(Packages.packages)
print(f"{color.green}Success:{color.white} Successfully installed {name}.")
except Exception as e:
raise Exception(f"{color.red}{e}")'''
class color:
green = "\033[1;32m"
blue = "\033[1;34m"
white = "\033[0m"
red = "\033[1;31m"
orange = "\033[1;33m"
def restart_program():
python = sys.executable
subprocess.call([python, __file__])
clear()
sys.exit()
try:
try:
os.mkdir("./helper/")
try:
with open(f"./helper/helper.py", "w") as f:
f.write(helper)
except:
print("err")
except:
pass
os.mkdir("./packages/")
with open(f"./packages/pakk.conf", "x") as f:
f.close()
except:
pass
def clear():
os.system('cls' if os.name == 'nt' else 'clear')
def call(full_module_name, func_name, *args, **kwargs):
module = importlib.import_module(full_module_name)
if func_name in dir(module):
for attribute_name in dir(module):
attribute = getattr(module, attribute_name)
if isfunction(attribute) and attribute_name == func_name:
attribute(*args, **kwargs)
else:
raise Exception("Command Not Found")
def download(name: str, Packages: list):
url = f"https://raw.githubusercontent.com/OusmBlueNinja/TermPY/main/packages/{name}.py"
r = requests.get(url)
#print(r.text)
fileInstallingCreator = os.path.join(os.path.dirname(os.path.realpath(__file__)), "packages", name+".py")
print("Saving file to disk")
with open(fileInstallingCreator, "w") as newFile:
newFile.write(r.text)
time.sleep(1)
def getPrompt():
path = "USERNAME" if os.name == "nt" else "USER"
username = os.environ.get(path)
if username is None:
username = ""
path = os.getcwd()
# Set up tab completion for file and directory names
if os.name != "nt":
completer = readline.get_completer()
readline.set_completer_delims(' \t\n')
readline.parse_and_bind("tab: complete")
prompt = color.white + "" + color.green + username + color.white + ":" + color.blue + path + color.white + "\n└ $ "
return prompt
def getInput():
print(getPrompt(), end="")
return input()
def getIndex( packages:list, package: str) -> str:
for key in packages:
if packages[key] == package:
return key
def toList(List: str) -> list:
newList = ast.literal_eval(List)
if isinstance(newList, list):
return newList
class packages:
def __init__(self):
try:
with open(("./packages/pakk.conf"), "r") as f:
self.packages = toList(f.readline())
except Exception as e:
print(e)
try:
with open(("./packages/builtin.py"), "r") as f:
f.close()
self.packages = [["builtin", "packages.builtin", ["echo", "ls", "rm", "clear", "cd", "ll"]]]
except:
self.packages = []
download("builtin", self.packages)
self.packages = [["builtin", "packages.builtin", ["echo", "ls", "rm", "clear", "cd", "ll"]]]
self.update(self.packages)
def update(self, packages):
with open(("./packages/pakk.conf"), "w") as f:
f.write(str(packages))
Packages = packages()
class packagemanager:
def __init__(self, args):
if len(args) <= 1:
print("""Options:
install <package name> | installs package
list | lists installed packages
remove <package name> | uninstall packages
available | lists available commands""")
elif args[1] == "install":
self.install(args[2])
elif args[1] == "list":
self.List()
elif args[1] == "remove":
self.uninstall(args[2:])
elif args[1] == "available":
self.commands("./packages")
else:
print("""Options:
install <package name> | installs package
list | lists installed packages
remove <package name> | uninstall packages
available | lists available commands""")
return
def commands(self, directory):
with os.scandir(directory) as entries:
for entry in entries:
if entry.name.endswith(".py"):
package_name = entry.name[:-3] # Remove the ".py" extension
if package_name not in [row[0] for row in Packages.packages]:
print(f"Package '{package_name}' is not installed.")
def install(self, name: str) -> int:
if name in [row[0] for row in Packages.packages]:
raise Exception("Package already installed")
try:
if not os.path.exists(f"./packages/{name}.py"):
raise FileNotFoundError(name)
except FileNotFoundError:
print("Downloading File from Source")
download(name, Packages)
call("helper.helper", "install", name, Packages)
print(f"{color.orange}WARNING: {color.white}Restarting Program")
restart_program()
except Exception as e:
raise Exception(f"Package could not be found, make sure package source is in [ packages ] folder. {e}")
try:
if name in [row[0] for row in Packages.packages]:
raise Exception("Package already installed")
with open(("./packages/"+name+".py"), "r") as f:
line = f.readline()
line = line.strip("#")
# ... (existing code)
print("Installing Package")
Packages.packages.append(toList(line))
Packages.update(Packages.packages)
print(f"\n{color.green}Success:{color.white} Successfully installed {name}.")
except Exception as e:
raise Exception(f"{color.red}{e}")
def List(self):
print("Installed Packages: \n"+ "\n".join([row[0] for row in Packages.packages]))
def uninstall(self, package: list):
for name in package:
#print(Packages.packages)
print(f"Uninstalling {name}")
for package in Packages.packages:
if name in package[0]:
Packages.packages.remove(package)
Packages.update(Packages.packages)
print(f"{color.green}Sucess:{color.white} Uninstalled {name}.")
#print(Packages.packages)
def handleCommands(command: list) -> list:
try:
if command[0] == "exit":
quit()
if command[0] == "help":
print("Type pakk for more help installing packages" )
return [0,None]
if command[0] == "pakk":
try:
PackageManager = packagemanager(command)
except Exception as e:
print(e)
return [0,None]
except Exception as e:
raise Exception(e)
try:
ran = False
for package in Packages.packages:
if command[0] in package[2]:
call(package[1], command[0], command[1:])
ran = True
return [0,None]
return [1, 'Command not Found']
except Exception as e:
print(e)
return [1, "A Faital error has acured while running commmand"]
def main():
while True:
command = getInput()
if command == "":
pass
else:
command = command.split(" ")
error = handleCommands(command)
if error[0]==1:
print(f"{color.red}ERROR{color.white}:{color.red} {error[1]}{color.white}")
def start():
try:
print("")
main()
except (KeyboardInterrupt, EOFError):
try:
restart_program()
except (KeyboardInterrupt, EOFError):
restart_program()
if __name__ == '__main__':
start()