diff options
Diffstat (limited to 'services/console/lib/purk/scripts/console.py')
-rwxr-xr-x | services/console/lib/purk/scripts/console.py | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/services/console/lib/purk/scripts/console.py b/services/console/lib/purk/scripts/console.py new file mode 100755 index 0000000..bef8e0e --- /dev/null +++ b/services/console/lib/purk/scripts/console.py @@ -0,0 +1,68 @@ +import sys +import traceback +import windows +from conf import conf + +class ConsoleWriter: + __slots__ = ['window'] + def __init__(self, window): + self.window = window + def write(self, text): + try: + self.window.write(text, line_ending='') + except: + self.window.write(traceback.format_exc()) + +class ConsoleWindow(windows.SimpleWindow): + def __init__(self, network, id): + windows.SimpleWindow.__init__(self, network, id) + + writer = ConsoleWriter(self) + + sys.stdout = writer + sys.stderr = writer + + self.globals = {'window': self} + self.locals = {} + +#this prevents problems (and updates an open console window) on reload +#window = None +#for window in manager: +# if type(window).__name__ == "ConsoleWindow": +# window.mutate(ConsoleWindow, window.network, window.id) +#del window + +def onClose(e): + if isinstance(e.window, ConsoleWindow): + sys.stdout = sys.__stdout__ + sys.stderr = sys.__stderr__ + +def onCommandConsole(e): + windows.new(ConsoleWindow, None, "console").activate() + +def onCommandSay(e): + if isinstance(e.window, ConsoleWindow): + import pydoc #fix nonresponsive help() command + old_pager, pydoc.pager = pydoc.pager, pydoc.plainpager + e.window.globals.update(sys.modules) + text = ' '.join(e.args) + try: + e.window.write(">>> %s" % text) + result = eval(text, e.window.globals, e.window.locals) + if result is not None: + e.window.write(repr(result)) + e.window.globals['_'] = result + except SyntaxError: + try: + exec text in e.window.globals, e.window.locals + except: + traceback.print_exc() + except: + traceback.print_exc() + pydoc.pager = old_pager + else: + raise core.events.CommandError("There's no one here to speak to.") + +def onStart(e): + if conf.get('start-console'): + windows.new(ConsoleWindow, None, "console") |