conf: use shutil.move instead of os.rename for saving
[urk.git] / scripts / console.py
blobbe2de0f9c71a6f08338fe1a9124b26ed6822652e
1 import sys
2 import traceback
4 import urk
5 import events
6 import windows
7 from conf import conf
9 class ConsoleWriter:
10 __slots__ = ['window']
11 def __init__(self, window):
12 self.window = window
13 def write(self, text):
14 try:
15 self.window.write(text, line_ending='')
16 except:
17 self.window.write(traceback.format_exc())
19 class ConsoleWindow(windows.SimpleWindow):
20 def __init__(self, network, id):
21 windows.SimpleWindow.__init__(self, network, id)
23 writer = ConsoleWriter(self)
25 if urk.platform != 'stdio':
26 sys.stdout = writer
27 sys.stderr = writer
29 self.globals = {'window': self}
30 self.locals = {}
32 #this prevents problems (and updates an open console window) on reload
33 window = None
34 for window in windows.manager:
35 if type(window).__name__ == "ConsoleWindow":
36 window.mutate(ConsoleWindow, window.network, window.id)
37 del window
39 def onClose(e):
40 if isinstance(e.window, ConsoleWindow):
41 sys.stdout = sys.__stdout__
42 sys.stderr = sys.__stderr__
44 def onCommandConsole(e):
45 windows.new(ConsoleWindow, None, "console").activate()
47 def onCommandSay(e):
48 if isinstance(e.window, ConsoleWindow):
49 import pydoc #fix nonresponsive help() command
50 old_pager, pydoc.pager = pydoc.pager, pydoc.plainpager
51 e.window.globals.update(sys.modules)
52 text = ' '.join(e.args)
53 try:
54 e.window.write(">>> %s" % text)
55 result = eval(text, e.window.globals, e.window.locals)
56 if result is not None:
57 e.window.write(repr(result))
58 e.window.globals['_'] = result
59 except SyntaxError:
60 try:
61 exec text in e.window.globals, e.window.locals
62 except:
63 traceback.print_exc()
64 except:
65 traceback.print_exc()
66 pydoc.pager = old_pager
67 else:
68 raise events.CommandError("There's no one here to speak to.")
70 def onStart(e):
71 if conf.get('start-console'):
72 windows.new(ConsoleWindow, None, "console")