Asciifarm/asciifarm/client/commandhandler.py

160 lines
4.3 KiB
Python

import json
try:
import hy
except ImportError as e:
hy = None
hyErr = e
class InvalidCommandException(Exception):
pass
class CommandHandler:
def __init__(self, client):
self.client = client
self.commands = {
"send": self.send,
"input": self.input,
"move": self.move,
"say": self.say,
"pick": self.pick,
"chat": self.chat,
"log": self.log,
"do": self.do,
"runinput": self.runInput,
"selectwidget": self.selectWidget,
"selectitem": self.selectItem,
"inputwithselected": self.actWithSelected,
"use": self.useSelected,
"unuse": self.unUseSelected,
"take": self.takeSelected,
"eval": self.eval,
"exec": self.exec,
"scrollchat": self.scrollChat,
"json": self.json,
"j": self.json,
"ijson": self.ijson,
"ij": self.ijson,
"hy": self.hy
}
self.evalArgs = {
"self": self,
"client": self.client,
"connection": self.client.connection,
"display": self.client.display,
"print": self.log
}
def execute(self, action):
if action is None:
return
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")
# Commands
def send(self, data):
self.client.send(data)
def input(self, action):
self.send(["input", action])
def move(self, direction):
self.input(["move", direction])
def say(self, text):
self.input(["say", text])
def pick(self, option):
self.input(["pick", option])
def chat(self, text):
self.send(["chat", text])
def log(self, text):
self.client.log(text)
def do(self, actions):
for action in actions:
self.execute(action)
def runInput(self, startText=""):
self.client.inputHandler.startTyping(startText)
def selectWidget(self, value, relative=False, modular=False):
self.client.display.selectMenu(value, relative, modular)
def selectItem(self, value, relative=False, modular=False):
self.client.display.selectItem(None, value, relative, modular)
def actWithSelected(self, action, menu):
self.input([action, self.client.display.getSelectedItem(menu).getSelected()])
def useSelected(self):
menu = self.client.display.getSelectedMenu()
selected = self.client.display.getSelectedItem(menu)
if menu in ("inventory", "equipment"):
action = "use"
elif menu == "ground":
action = "interact",
else:
return
self.input([action, selected])
def unUseSelected(self):
menu = self.client.display.getSelectedMenu()
selected = self.client.display.getSelectedItem(menu)
if menu == "inventory":
action = "drop"
elif menu == "equipment":
action = "unequip"
else:
return
self.input([action, selected])
def takeSelected(self):
menu = self.client.display.getSelectedMenu()
selected = self.client.display.getSelectedItem(menu)
if menu == "ground":
action = "take"
else:
return
self.input([action, selected])
def eval(self, text):
self.log(eval(text, self.evalArgs))
def exec(self, text):
exec(text, self.evalArgs)
def hy(self, code):
if hy is None:
self.log(hyErr)
return
expr = hy.read_str(code)
self.log(hy.eval(expr, self.evalArgs))
def scrollChat(self, lines):
self.client.display.scrollBack(lines)
def json(self, text):
self.execute(json.loads(text))
def ijson(self, text):
self.input(json.loads(text))