From 58ebd3bc0f00c532e97e9a5571471ffab87934ba Mon Sep 17 00:00:00 2001 From: AL-LCL Date: Fri, 19 May 2023 10:39:49 +0200 Subject: GOD-VIEW --- server/parse.py | 127 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 server/parse.py (limited to 'server/parse.py') diff --git a/server/parse.py b/server/parse.py new file mode 100644 index 0000000..93e07f6 --- /dev/null +++ b/server/parse.py @@ -0,0 +1,127 @@ +''' + A core class handling the standard input loop, + parsing the data & translating aliases. It + also takes care of directing the execution + of actions of the program. + + Verified: 2021 February 7 + * Follows PEP8 + * Tested Platforms + * Windows 10 + * Third Party Modules + * eel +''' + +from server.state import ServerStatic, Dynamic +from server.controller import Controller +from server.settings import Settings +from server.console import Console +from shared.helper import Helper +from shared.state import Static +from server.alias import Alias +from shared.data import Data +import server.action + +import traceback +import inspect + +if not ServerStatic.TERMINAL: + import eel + + +class Parse: + + @staticmethod + def stdin(): + while True: + result = Parse.parse_string(Parse.parse_alias(input())) + message, lower = Data.lower(result) + + if Dynamic.SESSION: + if lower in ServerStatic.UNIVERSAL \ + or lower in ServerStatic.SESSION: + Parse.execute(lower, result, False) + else: + if Settings.AUTO_SHELL: + Controller.message(False, result) + else: + Parse.__default_message(lower, message) + elif lower in ServerStatic.UNIVERSAL: + Parse.execute(lower, result, False) + else: + Parse.__default_message(lower, message) + + @staticmethod + def parse_string(message): + arguments = message.split(ServerStatic.ARG_SEPARATOR) + arguments_dict = Data.message(arguments[0].strip()) + + for argument in arguments[1:]: + key_value_list = [el for el in argument.split() if el] + key_value_list_len = len(key_value_list) + + if key_value_list_len == 0: + break + + key, value = key_value_list[0], key_value_list[1:] + + if key_value_list_len == 1: + arguments_dict[key] = True + else: + arguments_dict[key] = ' '.join(value) + + return arguments_dict + + @staticmethod + def parse_alias(message): + alias = Alias(True).alias_exists(message, True) + + if alias: + return alias + else: + return message + + @staticmethod + def execute(lower, request, gui_call, custom=None): + try: + if gui_call: + lower = Data.lower(request, False) + + assert ((lower in ServerStatic.SESSION and Dynamic.SESSION) + or lower in ServerStatic.UNIVERSAL), \ + 'No Active Session / Request Type Not Found' + + method = getattr(server.action, lower) + params = len(inspect.signature(method).parameters) + + if params == 0: + return method() + if params == 1: + return method(request) + if params == 2: + return method(request, gui_call) + else: + return method(request, gui_call, custom) + except SystemExit: + raise + except Exception: + Console.log('Request Execution Failed\n', + Static.DANGER, ServerStatic.ACTION) + Console.log(traceback.format_exc(), + log_type=ServerStatic.TRACEBACK) + + @staticmethod + def __default_message(lower, message): + if lower: + Console.printf(Helper.join( + f'"{message}" request type could not be found', + 'Use "help" request type for assistance' + ), Static.WARNING) + else: + Console.printf(raw=True) + + if not ServerStatic.TERMINAL: + @staticmethod + @eel.expose + def execute_eel(request): + return Parse.execute(None, request, True) -- cgit v1.2.3