Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/services/console/lib/purk/scripts/console.py
diff options
context:
space:
mode:
Diffstat (limited to 'services/console/lib/purk/scripts/console.py')
-rwxr-xr-xservices/console/lib/purk/scripts/console.py68
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")