150 lines
3.9 KiB
Python
150 lines
3.9 KiB
Python
|
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,
|
||
|
}
|