1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
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)
|