132 lines
3.8 KiB
Python
132 lines
3.8 KiB
Python
|
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:]))
|