'''
Created on 24.04.2010

@author: Orbital
'''
import socket as _socket
import sys as _sys
import atexit as _atexit

class CMD( object ):
	
	def __init__( self ):
		
		self.servers = dict()
		self.log = str()
		self.header = "\xFF\xFF\xFF\xFF"
		self.functions = [
						"server",
						"send",
						"info",
						"save",
						"exit"
						]
		_atexit.register( self.save )
	
	def initserver( self, ip, port ):
		
		newsock = _socket.socket( _socket.AF_INET, _socket.SOCK_DGRAM, _socket.IPPROTO_UDP )
		newsock.connect( ( ip, port ) )
		self.servers[ len( self.servers ) ] = newsock
		self.output( "Initialized new server object with the number %i" % ( len( self.servers ) - 1 ) )
		
	def send( self, server, msg, verbose = False ):
		
		if type( server ) == tuple:
			
			newsock = _socket.socket( _socket.AF_INET, _socket.SOCK_DGRAM, _socket.IPPROTO_UDP )
			newsock.connect( server )
			newsock.send( self.header + msg )
			if not verbose: return self.recv( newsock )
			else: self.output( self.recv( newsock ) )
			newsock.close()
			
		else:
			
			self.servers[server].send( self.header + msg )
			if not verbose: return self.recv( server )
			else: self.output( self.recv( server ) )
			
	def recv( self, server = None ):
		
		if type( server ) != int:
			
			return "\n".join( server.recv( 4096 ).split( "\n" )[1:] )
			
		else:
			
			return "\n".join( self.servers[server].recv( 4096 ).split( "\n" )[1:] )
		
	def getinfo( self, server, info ):
		
		if type( server ) == tuple:
			data = self.send( server, "getstatus" ).split( "\\" )[1:]
		else:
			data = self.send( server, "getstatus" ).split( "\\" )[1:]
		vars = dict()
		for i in xrange( 0, len( data ), 2 ):
			if data[i] == "clients":
				vars[data[i]] = data[i + 1].split( "\n" )[0], data[i + 1].split( "\n" )[1:] 
			else:
				vars[data[i]] = data[i + 1]
		if info:
			self.output( str( vars[info] ) )
		else:
			self.output( str( vars ) )
		
	def output( self, msg ):
		
		_sys.stdout.write( msg + "\n" )
		self.log += msg + "\n"
		
	def save( self ):
		
		fileobj = open( "warsowserver.log", "w" )
		fileobj.write( self.log )
		fileobj.close()
	
	def handle( self, msg ):
		
		self.log += "//\t" + msg + "\n"
		for keyword in self.functions:
			if msg.startswith( keyword ):
				new_msg = msg[len( keyword ):]
				if new_msg.startswith( "(" ) and new_msg.endswith( ")" ):
					vars = new_msg[1:-1].strip().split( "," )
					self.funchandle( keyword, vars )
				else:
					self.output( "arguements should be sorounded by ()" )
					
	def funchandle( self, func, vars ):
		
		try:
			
			if func == "exit":
			
				_sys.exit( "Closed by user" )
		
			elif func == "server":
			
				ip, port = vars[0].split( ":" )
				port = int( port )
				self.initserver( ip, port )
		
			elif func == "send":
			
				server, msg = vars
				if ":" in server:
					self.send( ( server.split( ":" )[0], int( server.split( ":" )[1] ) ) , msg )
				else:
					self.send( int( server ), msg, True )
				
			elif func == "info":
			
				try: server, info = vars
				except: server = vars[0]; info = None
				if ":" in server:
					self.getinfo( ( server.split( ":" )[0], int( server.split( ":" )[1] ) ), info )
				else:
					self.getinfo( int( server ), info )
		
			elif func == "save":
			
				self.save()
				
		except StandardError, error:
			self.output( str( error ) )
			
if __name__ == "__main__":
	
	main = CMD()
	while True:
		main.handle( raw_input() )

