ktane/src/shell.py

132 lines
3.8 KiB
Python
Raw Permalink Normal View History

from constants import modules, indicators, ports
from prompt_toolkit import PromptSession
from prompt_toolkit.completion import NestedCompleter
maincompleter = NestedCompleter.from_nested_dict({
'help': None,
'mark': None,
'serial': None,
'strike': None,
'batteries': None,
'eval': None,
'indicator': {*[indicator for indicator in indicators]},
'ports': {*[port for port in ports]},
'mod': {*["mod {}".format(module) for module in modules.keys()]},
})
class Serial:
def __init__(self, serial):
self.serial = serial.lower()
@property
def is_even(self):
if int(self.serial[-1]) % 2 == 0:
return True
return False
@property
def is_odd(self):
return not self.is_even
@property
def vowel(self):
for vowel in ['a', 'e', 'i', 'o', 'u']:
if vowel in self.serial:
return True
return False
@property
def no_vowel(self):
return not self.vowel
@property
def text(self):
return self.serial
class GlobalBombState:
def __init__(self):
self.indicators = {}
self.ports = []
self._serial = None
self.batteries = 0
self.modulecount = 0
self.strikes = 0
@property
def serial(self):
return self._serial
@serial.setter
def serial(self, serial):
self._serial = Serial(serial)
def update_toolbar(self):
return "help for help, ports: {}, ind: {}, batt: {}, serial: {}, strikes {}".format(
self.ports, self.indicators, str(self.batteries), self.serial.text if self.serial else "?", str(self.strikes)
)
session = PromptSession(completer=maincompleter)
state = GlobalBombState()
while True:
userinput = session.prompt("ktane> ", bottom_toolbar=state.update_toolbar(), complete_while_typing=True)
splitted = userinput.split(' ')
tokens = len(splitted)
command = splitted[0]
if command == "mod":
if tokens == 1:
print(modules.keys())
elif tokens > 1:
if splitted[1].isnumeric():
state.modulecount = int(splitted[1])
print("module count set to {}".format(str(state.modulecount)))
else:
try:
selectedmodule = modules[splitted[1]]
if selectedmodule:
selectedmodule.interactive(state, splitted[2:])
else:
print("this module doesn't exist!")
except IndexError:
print("you didn't specify a module")
elif command == "serial": # set the serial number
try:
state.serial = splitted[1]
print("serial number set to {}".format(state.serial.text))
except IndexError:
print("specify a serial number, perhaps?")
elif command == "batteries":
try:
state.batteries = int(splitted[1])
print("battery count set to {}".format(str(state.batteries)))
except IndexError:
print("specify a number of batteries, perhaps?")
elif command == "strike":
state.strikes += 1
print("strike given")
elif command == "ports":
try:
state.ports.append(splitted[1])
print("appeneded port {}".format(splitted[1]))
except IndexError:
print("specify a port type")
elif command == "indicator":
try:
state.indicators[splitted[1]] = True if splitted[2] == 't' else False
print("added indicator {} with state {}".format(
splitted[1], state.indicators[splitted[1]]
))
except IndexError: print("specify an indicator and a state")
elif command == "eval":
eval(' '.join(splitted[1:]))