69 lines
2.0 KiB
Python
69 lines
2.0 KiB
Python
|
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")
|