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:]))