Nemubot had now a shell.
server.py extends now Thread
This commit is contained in:
parent
3aaa4446b4
commit
d7b4e198a5
5 changed files with 235 additions and 67 deletions
149
prompt.py
Normal file
149
prompt.py
Normal file
|
|
@ -0,0 +1,149 @@
|
|||
import sys
|
||||
import shlex
|
||||
import traceback
|
||||
import _thread
|
||||
from xml.dom.minidom import parse
|
||||
|
||||
import server
|
||||
|
||||
selectedServer = None
|
||||
MODS = list()
|
||||
|
||||
def parsecmd(msg):
|
||||
"""Parse the command line"""
|
||||
try:
|
||||
cmds = shlex.split(msg)
|
||||
if len(cmds) > 0:
|
||||
cmds[0] = cmds[0].lower()
|
||||
return cmds
|
||||
except:
|
||||
exc_type, exc_value, exc_traceback = sys.exc_info()
|
||||
sys.stdout.write (traceback.format_exception_only(exc_type, exc_value)[0])
|
||||
return None
|
||||
|
||||
def run(cmds, servers):
|
||||
"""Launch the command"""
|
||||
if cmds[0] in CAPS:
|
||||
return CAPS[cmds[0]](cmds, servers)
|
||||
else:
|
||||
print ("Unknown command: `%s'" % cmds[0])
|
||||
return ""
|
||||
|
||||
def getPS1():
|
||||
"""Get the PS1 associated to the selected server"""
|
||||
if selectedServer is None:
|
||||
return "nemubot"
|
||||
else:
|
||||
return selectedServer.id
|
||||
|
||||
def launch(servers):
|
||||
"""Launch the prompt"""
|
||||
ret = ""
|
||||
cmds = list()
|
||||
while ret != "quit" and ret != "reset":
|
||||
sys.stdout.write("\033[0;33m%s§\033[0m " % getPS1())
|
||||
sys.stdout.flush()
|
||||
try:
|
||||
cmds = parsecmd(sys.stdin.readline().strip())
|
||||
except KeyboardInterrupt:
|
||||
cmds = parsecmd("quit")
|
||||
if cmds is not None and len(cmds) > 0:
|
||||
try:
|
||||
ret = run(cmds, servers)
|
||||
except:
|
||||
exc_type, exc_value, exc_traceback = sys.exc_info()
|
||||
sys.stdout.write (traceback.format_exception_only(exc_type, exc_value)[0])
|
||||
return ret == "reset"
|
||||
|
||||
|
||||
##########################
|
||||
# #
|
||||
# Permorming functions #
|
||||
# #
|
||||
##########################
|
||||
|
||||
def load(cmds, servers):
|
||||
if len(cmds) > 1:
|
||||
for f in cmds[1:]:
|
||||
dom = parse(f)
|
||||
config = dom.getElementsByTagName('config')[0]
|
||||
for serveur in config.getElementsByTagName('server'):
|
||||
srv = server.Server(serveur, config.getAttribute('nick'), config.getAttribute('owner'), config.getAttribute('realname'))
|
||||
if srv.id not in servers:
|
||||
servers[srv.id] = srv
|
||||
print (" Server `%s' successfully added." % srv.id)
|
||||
else:
|
||||
print (" Server `%s' already added, skiped." % srv.id)
|
||||
else:
|
||||
print ("Not enough arguments. `load' takes an filename.")
|
||||
return
|
||||
|
||||
def select(cmds, servers):
|
||||
global selectedServer
|
||||
if len(cmds) == 2 and cmds[1] != "None" and cmds[1] != "nemubot" and cmds[1] != "none":
|
||||
if cmds[1] in servers:
|
||||
selectedServer = servers[cmds[1]]
|
||||
else:
|
||||
print ("select: server `%s' not found." % cmds[1])
|
||||
else:
|
||||
selectedServer = None
|
||||
return
|
||||
|
||||
def liste(cmds, servers):
|
||||
if len(cmds) > 1:
|
||||
for l in cmds[1:]:
|
||||
l = l.lower()
|
||||
if l == "server" or l == "servers":
|
||||
for srv in servers.keys():
|
||||
print (" - %s ;" % srv)
|
||||
else:
|
||||
print (" Unknown list `%s'" % l)
|
||||
else:
|
||||
print (" Please give a list to show: servers, ...")
|
||||
|
||||
def connect(cmds, servers):
|
||||
if len(cmds) > 1:
|
||||
for s in cmds[1:]:
|
||||
if s in servers:
|
||||
servers[s].launch(MODS)
|
||||
else:
|
||||
print ("connect: server `%s' not found." % s)
|
||||
|
||||
elif selectedServer is not None:
|
||||
selectedServer.launch(MODS)
|
||||
else:
|
||||
print (" Please SELECT a server or give its name in argument.")
|
||||
|
||||
def disconnect(cmds, servers):
|
||||
if len(cmds) > 1:
|
||||
for s in cmds[1:]:
|
||||
if s in servers:
|
||||
if not servers[s].disconnect():
|
||||
print ("disconnect: server `%s' already disconnected." % s)
|
||||
else:
|
||||
print ("disconnect: server `%s' not found." % s)
|
||||
elif selectedServer is not None:
|
||||
if not selectedServer.disconnect():
|
||||
print ("disconnect: server `%s' already disconnected." % selectedServer.id)
|
||||
else:
|
||||
print (" Please SELECT a server or give its name in argument.")
|
||||
|
||||
def end(cmds, servers):
|
||||
if cmds[0] == "reset":
|
||||
return "reset"
|
||||
else:
|
||||
for srv in servers.keys():
|
||||
servers[srv].disconnect()
|
||||
return "quit"
|
||||
|
||||
#Register build-ins
|
||||
CAPS = {
|
||||
'quit': end,
|
||||
'exit': end,
|
||||
'reset': end,
|
||||
'load': load,
|
||||
'select': select,
|
||||
'list': liste,
|
||||
'connect': connect,
|
||||
'disconnect': disconnect,
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue