summaryrefslogtreecommitdiff
path: root/asciifarm/client/inputhandler.py
diff options
context:
space:
mode:
authortroido <troido@hotmail.com>2018-04-18 23:27:34 +0200
committertroido <troido@hotmail.com>2018-04-18 23:27:34 +0200
commit757ad925b47d24b1d0714671b8f04147a5748480 (patch)
treebc67553d76ac3301db7d2c20881448afc411221d /asciifarm/client/inputhandler.py
parentc0eb8ed32d53030de5b75b49a8e0f64e7c4a05ff (diff)
improved input handling
renamed InputHandler to CommandHandler. made InputHandler for input code that used to be in gameclient also started my own getstr() replacement.
Diffstat (limited to 'asciifarm/client/inputhandler.py')
-rw-r--r--asciifarm/client/inputhandler.py129
1 files changed, 53 insertions, 76 deletions
diff --git a/asciifarm/client/inputhandler.py b/asciifarm/client/inputhandler.py
index 7fb18ad..1d907e9 100644
--- a/asciifarm/client/inputhandler.py
+++ b/asciifarm/client/inputhandler.py
@@ -1,96 +1,73 @@
-import shlex
-
-class InvalidCommandException(Exception):
- pass
-
+from commandhandler import CommandHandler
+from .keynames import nameFromKey
+import curses
+import curses.ascii
class InputHandler:
- def __init__(self, client, display, connection):
+ def __init__(self, client, keybindings):
self.client = client
- self.display = display
- self.connection = connection
+ self.keybindings = keybindings
+ self.commandHandler = CommandHandler(self.client)
- self.commands = {
- "send": self.send,
- "input": self.input,
- "move": self.move,
- "say": self.say,
- "chat": self.chat,
- "log": self.log,
- "do": self.do,
- "runinput": self.runInput,
- "select": self.select,
- "inputwithselected": self.actWithSelected,
- "eval": self.eval,
- "exec": self.exec,
- "scrollchat": self.scrollChat
- }
-
- def execute(self, action):
- if isinstance(action[0], str):
- command = action[0]
- if command in self.commands:
- self.commands[command](*action[1:])
- else:
- raise InvalidCommandException("Invalid command '{}'".format(command))
- else:
- raise Exception("Command should be a string")
-
-
-
- def send(self, data):
- self.client.send(data)
-
- def input(self, action):
- self.send(["input", action])
-
- def move(self, direction):
- self.input(["move", direction])
+ self.typing = False
+ self.string = ""
+ self.cursor = 0
- def say(self, text):
- self.input(["say", text])
- def chat(self, text):
- self.send(["chat", text])
-
- def log(self, text):
- self.client.log(text)
+ def onInput(self, key):
+ if not self.typing:
+ keyName = nameFromKey(key)
+ if keyName in self.keybindings:
+ self.commandHandler.execute(self.keybindings[keyName])
+ else:
+ self.addKey(key)
- def do(self, actions):
- for action in actions:
- self.execute(action)
- def runInput(self):
- message = self.display.getString()
+ def processString(self, message):
if message:
if message[0] == '/':
if message[1] == '/':
- self.chat(message[1:])
+ self.commandHandler.chat(message[1:])
else:
try:
- self.execute(shlex.split(message[1:]))
+ self.commandHandler.execute(shlex.split(message[1:]))
except InvalidCommandException as e:
- self.log(", ".join(e.args))
+ self.client.log(", ".join(e.args))
else:
- self.chat(message)
-
- def select(self, widget, value, relative=False, modular=False):
- self.display.getWidget(widget).select(value, relative, modular)
-
- def actWithSelected(self, action, widget):
- self.input([action, self.display.getWidget(widget).getSelected()])
-
- def eval(self, *texts):
- text = " ".join(texts)
- self.log(eval(text, {"self": self, "client": self.client, "connection": self.connection, "display": self.display}))
-
- def exec(self, *texts):
- text = " ".join(texts)
- exec(text, {"self": self, "client": self.client, "connection": self.connection, "display": self.display})
+ self.commandHandler.chat(message)
+
+
+ def addKey(self, key):
+ if curses.ascii.isprint(key):
+ self.string = self.string[:self.cursor] + chr(key) + self.string[self.cursor:]
+ self.cursor += 1
+ elif key == curses.KEY_BACKSPACE or key == curses.ascii.BS or key == curses.ascii.DEL:
+ self.string = self.string[:self.cursor-1] + self.string[self.cursor:]
+ self.cursor = max(self.cursor - 1, 0)
+ elif key == curses.KEY_RIGHT:
+ self.cursor = max(self.cursor + 1, len(self.string))
+ elif key == curses.KEY_LEFT:
+ self.cursor = max(self.cursor - 1, 0)
+ elif key == curses.KEY_DC:
+ self.string = self.string[:self.cursor] + self.string[self.cursor+1:]
+ elif key == curses.KEY_HOME:
+ self.cursor = 0
+ elif key == curses.KEY_END:
+ self.cursor = len(self.string)
+
+ elif key == curses.ascii.ESC or key == curses.KEY_DL:
+ self.typing = False
+ self.string = ""
+ self.cursor = 0
+ elif key == curses.ascii.LF or key == curses.ascii.CR:
+ message = self.string
+ self.string = ""
+ self.cursor = 0
+ self.typing = False
+ self.processString(message)
+
- def scrollChat(self, lines):
- self.display.scrollBack(lines)