コード例 #1
0
ファイル: serverutil.py プロジェクト: katerberg-zz/blockBox
	@admin_only
	def commandIRCReload(self, parts, fromloc, overriderank):
		"/irc_cpr - Admin\nRehashes the IRC Bot."
		self.client.factory.irc_relay.disconnect()
		self.client.factory.irc_relay = None
		self.client.factory.irc_relay = ChatBotFactory(self.server)
		reactor.connectTCP(self.client.factory.conf_irc.get("irc", "server"), self.client.factory.conf_irc.getint("irc", "port"), self.client.factory.irc_relay)
コード例 #2
0
ファイル: serverutil.py プロジェクト: katerberg-zz/blockBox
	@admin_only
	def commandIRCLoad(self, parts, fromloc, overriderank):
		"/icr_load - Admin\nLoads the IRC bot."
		if self.irc_relay:
			self.client.factory.sendServerMessage("IRC Bot already loaded. If it failed please use /irc_cpr!")
			return
		self.client.factory.irc_relay = ChatBotFactory(self.server)
		reactor.connectTCP(self.client.factory.conf_irc.get("irc", "server"), self.client.factory.conf_irc.getint("irc", "port"), self.client.factory.irc_relay)
コード例 #3
0
ファイル: dict.py プロジェクト: samis/blockBox
def define(host, port, database, word):
    """Look up a word using a dict server"""
    d = defer.Deferred()
    factory = DictLookupFactory("define", (database, word), d)

    from lib.twisted.internet import reactor
    reactor.connectTCP(host, port, factory)
    return d
コード例 #4
0
ファイル: dict.py プロジェクト: samis/blockBox
def match(host, port, database, strategy, word):
    """Match a word using a dict server"""
    d = defer.Deferred()
    factory = DictLookupFactory("match", (database, strategy, word), d)

    from lib.twisted.internet import reactor
    reactor.connectTCP(host, port, factory)
    return d
コード例 #5
0
ファイル: dict.py プロジェクト: TheArchives/blockBox
def match(host, port, database, strategy, word):
	"""Match a word using a dict server"""
	d = defer.Deferred()
	factory = DictLookupFactory("match", (database, strategy, word), d)

	from lib.twisted.internet import reactor
	reactor.connectTCP(host, port, factory)
	return d
コード例 #6
0
ファイル: dict.py プロジェクト: TheArchives/blockBox
def define(host, port, database, word):
	"""Look up a word using a dict server"""
	d = defer.Deferred()
	factory = DictLookupFactory("define", (database, word), d)
	
	from lib.twisted.internet import reactor
	reactor.connectTCP(host, port, factory)
	return d
コード例 #7
0
ファイル: portforward.py プロジェクト: samis/blockBox
    def connectionMade(self):
        # Don't read anything from the connecting client until we have
        # somewhere to send it to.
        self.transport.pauseProducing()

        client = self.clientProtocolFactory()
        client.setServer(self)

        from lib.twisted.internet import reactor
        reactor.connectTCP(self.factory.host, self.factory.port, client)
コード例 #8
0
ファイル: portforward.py プロジェクト: TheArchives/blockBox
	def connectionMade(self):
		# Don't read anything from the connecting client until we have
		# somewhere to send it to.
		self.transport.pauseProducing()

		client = self.clientProtocolFactory()
		client.setServer(self)

		from lib.twisted.internet import reactor
		reactor.connectTCP(self.factory.host, self.factory.port, client)
コード例 #9
0
ファイル: loopback.py プロジェクト: TheArchives/blockBox
def loopbackTCP(server, client, port=0, noisy=True):
	"""Run session between server and client protocol instances over TCP."""
	from lib.twisted.internet import reactor
	f = policies.WrappingFactory(protocol.Factory())
	serverWrapper = _FireOnClose(f, server)
	f.noisy = noisy
	f.buildProtocol = lambda addr: serverWrapper
	serverPort = reactor.listenTCP(port, f, interface='127.0.0.1')
	clientF = LoopbackClientFactory(client)
	clientF.noisy = noisy
	reactor.connectTCP('127.0.0.1', serverPort.getHost().port, clientF)
	d = clientF.deferred
	d.addCallback(lambda x: serverWrapper.deferred)
	d.addCallback(lambda x: serverPort.stopListening())
	return d
コード例 #10
0
def loopbackTCP(server, client, port=0, noisy=True):
    """Run session between server and client protocol instances over TCP."""
    from lib.twisted.internet import reactor
    f = policies.WrappingFactory(protocol.Factory())
    serverWrapper = _FireOnClose(f, server)
    f.noisy = noisy
    f.buildProtocol = lambda addr: serverWrapper
    serverPort = reactor.listenTCP(port, f, interface='127.0.0.1')
    clientF = LoopbackClientFactory(client)
    clientF.noisy = noisy
    reactor.connectTCP('127.0.0.1', serverPort.getHost().port, clientF)
    d = clientF.deferred
    d.addCallback(lambda x: serverWrapper.deferred)
    d.addCallback(lambda x: serverPort.stopListening())
    return d
コード例 #11
0
ファイル: archive.py プロジェクト: katerberg-zz/blockBox
def rip(key, username, password):
	login_url = 'http://minecraft.net/login.jsp'
	play_url = 'http://minecraft.net/play.jsp?server=%s'
	cj = cookielib.CookieJar()
	opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
	login_data = urllib.urlencode({'username': username, 'password': password})
	print ("Logging in...")
	opener.open(login_url, login_data)
	print ("Fetching server info...")
	html = opener.open(play_url % key).read()
	ip = re.search(r'param name\="server" value="([0-9.]+)"', html).groups()[0]
	port = int(re.search(r'param name\="port" value="([0-9]+)"', html).groups()[0])
	mppass = re.search(r'param name\="mppass" value="([0-9a-zA-Z]+)"', html).groups()[0]
	print ("Got details. Connecting...")
	f = RipFactory(username, mppass)
	reactor.connectTCP(ip, port, f)
	reactor.run()
コード例 #12
0
	def run(self):
		try:
			try:
				while not self.stop:
					try:
						line = sys.stdin.readline()
					except:
						return
					message = line
					if len(line)>1:
						goodchars = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", " ", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", " ", "!", "@", "#", "$", "%", "*", "(", ")", "-", "_", "+", "=", "{", "[", "}", "]", ":", ";", "\"", "\'", "<", ",", ">", ".", "?", "/", "\\", "|"]
						for character in message:
							if not character.lower() in goodchars:
								message = message.replace(character, "*")
						message = message.replace("%0", "&0")
						message = message.replace("%1", "&1")
						message = message.replace("%2", "&2")
						message = message.replace("%3", "&3")
						message = message.replace("%4", "&4")
						message = message.replace("%5", "&5")
						message = message.replace("%6", "&6")
						message = message.replace("%7", "&7")
						message = message.replace("%8", "&8")
						message = message.replace("%9", "&9")
						message = message.replace("%a", "&a")
						message = message.replace("%b", "&b")
						message = message.replace("%c", "&c")
						message = message.replace("%d", "&d")
						message = message.replace("%e", "&e")
						message = message.replace("%f", "&f")
						message = message.replace("&0", "&0")
						message = message.replace("&1", "&1")
						message = message.replace("&2", "&2")
						message = message.replace("&3", "&3")
						message = message.replace("&4", "&4")
						message = message.replace("&5", "&5")
						message = message.replace("&6", "&6")
						message = message.replace("&7", "&7")
						message = message.replace("&8", "&8")
						message = message.replace("&9", "&9")
						message = message.replace("&a", "&a")
						message = message.replace("&b", "&b")
						message = message.replace("&c", "&c")
						message = message.replace("&d", "&d")
						message = message.replace("&e", "&e")
						message = message.replace("&f", "&f")
						message = message.replace("./", " /")
						message = message.replace(".!", " !")
						message = message.replace(".@", " @")
						message = message.replace(".#", " #")
						if message[len(message)-3] == "&":
							print ("You cannot use a color at the end of a message.")
							return
						if message.startswith("/"):
							message = message.split(" ")
							message[0] = message[0][1:]
							message[len(message)-1] = message[len(message)-1][:len(message[len(message)-1])-1]
							# It's a command
							if message[0] == "kick":
								if len(message) == 1:
									print ("Please specify a username.")
								else:
									for client in self.server.clients.values():
										if client.username==message[1]:
											client.sendError("You were kicked!")
											print (message[1]+" has been kicked from the server.")
											pass
										else:
											print ("User "+str(message[1])+" is not online.")
											pass
							elif message[0] == "ban":
								if len(message) == 1:
									print ("Please specify a username.")
								else:
									username = message[1]
									if self.server.isBanned(username):
										print ("%s is already Banned." % username)
									else:
										if len(message) < 2:
											print ("Please give a reason.")
										else:
											self.server.addBan(username, " ".join(message[2:]))
											if username in self.server.usernames:
												ip = self.server.usernames[username].transport.getPeer().host
												self.server.usernames[username].sendError("You got Banned!")
												self.server.addIpBan(ip, " ".join(message[2:]))
												if username in self.server.usernames:
													self.server.usernames[username].sendError("You got Banned!")
												print ("%s has been IPBanned." % ip)
											print ("%s has been Banned." % username)
							elif message[0] == "rank":
								if len(message) == 1:
									print ("Please specify a username.")
								else:
									try:
										print Rank(self, message, 'console', True, self.server)
									except:
										print ("You must specify a rank and username.")
							elif message[0] == "derank":
								if len(message) == 1:
									print ("Please specify a username.")
								else:
									try:
										print DeRank(self, message, 'console', True, self.server)
									except:
										print ("You must specify a rank and username.")
							elif message[0] == "spec":
								if len(message) == 1:
									print ("Please specify a username.")
								else:
									try:
										print Spec(self, message[1], 'console', True, self.server)
									except:
										print ("Please specify a username.")
							elif message[0] == "spec":
								if len(message) == 1:
									print ("Please specify a username.")
								else:
									try:
										print DeSpec(self, message[1], 'console', True, self.server)
									except:
										print ("Please specify a username.")
							elif message[0] == ("boot"):
								try:
									world = str(message[1]).lower()
								except:
									print ("Please specify a worldname.")
									continue
								try:
									self.server.loadWorld("mapdata/worlds/"+world, world)
								except AssertionError:
									print ("World '%s' does not exist." % world)
									continue
								print ("World '"+world+"' booted.")
							elif message[0] == ("shutdown"):
								try:
									world = str(message[1]).lower()
								except:
									print ("Please specify a worldname.")
									continue
								try:
									self.server.unloadWorld(world)
								except KeyError:
									print ("World '%s' does not exist." % world)
									continue
								print ("World '"+world+"' shutdown.")
							elif message[0] == ("new"):
								if len(message) == 1:
									print ("Please specify a new worldname.")
								elif self.server.world_exists(message[1]):
									print ("World name in use.")
								else:
									if len(message) == 2:
										template = "default"
									elif len(message) == 3 or len(message) == 4:
										template = message[2]
									world_id = message[1].lower()
									try:
										self.server.newWorld(world_id, template)
									except TemplateDoesNotExist:
										print ("Template '%s' does not exist." % template)
									self.server.loadWorld("mapdata/worlds/%s" % world_id, world_id)
									self.server.worlds[world_id].all_write = False
									if len(message) < 4:
										self.client.sendServerMessage("World '%s' made and booted." % world_id)
							elif message[0] == ("me"):
								if len(message) == 1:
									print ("Please type an action.")
								else:
									self.server.queue.put((self, TASK_ACTION, (1, "&2", "Console", " ".join(message[1:]))))
							elif message[0] == ("srb"):
								if len(message) == 1:
									self.server.queue.put((self, TASK_SERVERURGENTMESSAGE, ("[Server Reboot] Be back very soon.")))
								else:
									self.server.queue.put((self, TASK_SERVERURGENTMESSAGE, ("[Server Reboot] Be back very soon: "+(" ".join(message[1:])))))
							elif message[0] == ("srs"):
								if len(message) == 1:
									self.server.queue.put((self, TASK_SERVERURGENTMESSAGE, ("[Server Shutdown] See you later.")))
								else:
									self.server.queue.put((self, TASK_SERVERURGENTMESSAGE, ("[Server Shutdown] See you later: "+(" ".join(message[1:])))))
							elif message[0] == ("help"):
								print ("Whispers: @username message")
								print ("WorldChat: !worldname message")
								print ("StaffChat: #message")
								print ("Commands: /cmdlist")
							elif message[0] == ("cmdlist"):
								print ("about boot ban cmdlist cpr derank despec irc_cpr help kick me new pll plr plu rank say shutdown spec srb srs u")
							elif message[0] == ("about"):
								print ("About The Server")
								print ("Powered by blockBox %s - http://blockbox.hk-diy.net/"% VERSION )
								print ("Name: "+self.server.server_name)
								try:
									print ("URL: "+self.server.heartbeat.url)
								except:
									print ("URL: N/A (minecraft.net is probably offline)")
							elif message[0] == ("say"):
								if len(message) == 1:
									print ("Please type a message.")
								else:
									self.server.queue.put((self, TASK_SERVERMESSAGE, ("[MSG] "+(" ".join(message[1:])))))
							elif message[0] == ("gc"):
								#ManualGarbageMe
								count = gc.collect()
								self.logger.info("%i garbage objects collected, %i could not be collected." % (count, len(gc.garbage)))
							elif message[0] == ("u"):
								if len(message) == 1:
									print ("Please type a message.")
								else:
									self.server.queue.put((self, TASK_SERVERURGENTMESSAGE, "[URGENT] "+(" ".join(message[1:]))))
							elif message[0] == ("plr"):
								if len(message) == 1:
									print ("Please provide a plugin name.")
								else:
									try:
										self.server.unloadPlugin(message[1])
										self.server.loadPlugin(message[1])
									except ImportError:
										print ("No such plugin '%s'." % message[1])
									else:
										print ("Plugin '%s' reloaded." % message[1])
							elif message[0] == ("plu"):
								if len(message) == 1:
									print ("Please provide a plugin name.")
								else:
									try:
										self.server.unloadPlugin(message[1])
									except KeyError:
										print ("No such plugin '%s'." % message[1])
									else:
										print ("Plugin '%s' unloaded." % message[1])
							elif message[0] == ("pll"):
								if len(message) == 1:
									print ("Please provide a plugin name.")
								else:
									try:
										self.server.loadPlugin(message[1])
									except ImportError:
										print ("No such plugin '%s'." % message[1])
									else:
										print ("Plugin '%s' loaded." % message[1])
							elif message[0] == ("cpr"):
								self.server.heartbeat.turl()
							elif message[0] == ("irc_cpr"):
								self.server.irc_relay.quit("Reloading the IRC Bot...")
								self.server.irc_relay = None
								self.server.irc_relay = ChatBotFactory(self.server)
								reactor.connectTCP(self.server.conf_irc.get("irc", "server"), self.server.conf_irc.getint("irc", "port"), self.server.irc_relay)
							#elif message[0] == ("irc_unload"):
							#	if not self.irc_relay:
							#		print ("IRC bot is not loaded.")
							#	else:
							#		self.server.irc_relay.connectionLost("IRC Bot disabled.")
							#		self.server.irc_relay = None
							#		print ("IRC Bot unloaded.")
							#elif message[0] == ("irc_load"):
							#	if self.irc_relay:
							#		print ("IRC bot is already loaded. If it failed please use /irc_cpr!")
							#	else:
							#		self.server.irc_relay = ChatBotFactory(self.server)
							#		reactor.connectTCP(self.server.conf_irc.get("irc", "server"), self.server.conf_irc.getint("irc", "port"), self.server.irc_relay)
							#		print ("IRC Bot loaded.")
							else:
								print ("There is no " + message[0] + " command.")
						elif message.startswith("@"):
							# It's a whisper
							try:
								username, text = message[1:].strip().split(" ", 1)
							except ValueError:
								print ("Please include a username and a message to send.")
							else:
								username = username.lower()
								if username in self.server.usernames:
									self.server.usernames[username].sendWhisper("Console", text)
									self.logger.info("@Console to "+username+": "+text)
									self.whisperlog.write(datetime.datetime.utcnow().strftime("%Y/%m/%d %H:%M")+" | @Console to "+username+": "+text+"\n")
									self.whisperlog.flush()
								else:
									print ("%s is currently offline." % username)
						elif message.startswith("!"):
							#It's a world message.
							if len(message) == 1:
								print ("Please include a message to send.")
							else:
								try:
									world, out = message[1:len(message)-1].split(" ")
									text = COLOUR_YELLOW+"!"+COLOUR_DARKGREEN+"Console:"+COLOUR_WHITE+" "+out
								except ValueError:
									print ("Please include a message to send.")
								else:
									if world in self.server.worlds:
										self.server.queue.put ((self.server.worlds[world],TASK_WORLDMESSAGE,(255, self.server.worlds[world], text),))
										if self.server.irc_relay:
											self.server.irc_relay.sendServerMessage("!Console in "+str(world)+": "+out)
										self.logger.info("!Console in "+str(self.server.worlds[world].id)+": "+out)
										self.wclog.write(datetime.datetime.utcnow().strftime("%Y/%m/%d %H:%M")+" | !Console in "+str(self.server.worlds[world].id)+": "+out+"\n")
										self.wclog.flush()
									else:
										print ("That world does not exist. Try !world message")
						elif message.startswith("#"):
							#It's an staff-only message.
							if len(message) <= 2:
								print ("Please include a message to send.")
							else:
								try:
									text = message[1:]
								except ValueError:
									self.server.queue.put((self, TASK_MESSAGE, (0, COLOUR_DARKGREEN,"Console", message)))
								else:
									text = text[:len(text)-1]
									self.server.queue.put((self, TASK_STAFFMESSAGE, (0, COLOUR_DARKGREEN,"Console", text,False)))
									self.logger.info("#Console: "+text)
									self.adlog.write(datetime.datetime.utcnow().strftime("%Y/%m/%d %H:%M")+" | #Console: "+text+"\n")
									self.adlog.flush()
						else:
							self.server.queue.put((self, TASK_MESSAGE, (0, COLOUR_DARKGREEN,"Console", message[0:len(message)-1])))
							#self.server.queue.put((self, TASK_MESSAGE, (255, "", COLOUR_DARKGREEN+"Console", message[0:len(message)-1])))
			except:
				print traceback.format_exc()
				self.logger.error(traceback.format_exc())
		finally:
			time.sleep(0.1)
コード例 #13
0
ファイル: server.py プロジェクト: TheArchives/blockBox
	def initVariables(self):
		if  (os.path.exists("conf/options.dist.ini") and not os.path.exists("conf/options.ini")) or \
			(os.path.exists("conf/plugins.dist.ini") and not os.path.exists("conf/plugins.ini")) or \
			(os.path.exists("conf/server.dist.ini") and not os.path.exists("conf/server.ini")) or \
			(os.path.exists("conf/wordfilter.dist.ini") and not os.path.exists("conf/wordfilter.ini")):
			raise NotConfigured
		self.logger = logging.getLogger("Server")
		self.loops = recursive_default()
		self.timers = recursive_default()
		self.ServerVars = dict()
		self.specs = ConfigParser()
		self.last_heartbeat = time.time()
		self.config = ConfigParser()
		self.conf_options = ConfigParser()
		self.conf_plugins = ConfigParser()
		self.wordfilter = ConfigParser()
		self.save_count = 1
		self.delay_count = 1
		self.config.read("conf/server.ini")
		self.conf_options.read("conf/options.ini")
		self.conf_plugins.read("conf/plugins.ini")
		# Initialise internal datastructures
		self.worlds = {}
		self.directors = set()
		self.admins = set()
		self.mods = set()
		self.worldowners = set()
		self.advbuilders = set()
		self.spectators = set()
		self.silenced = set()
		self.banned = {}
		self.ipbanned = {}
		self.lastseen = {}

		self.use_irc = False
		if  (os.path.exists("conf/irc.ini")):
			self.use_irc = True
			self.conf_irc = ConfigParser()
			self.conf_irc.read("conf/irc.ini")

		self.use_email = False
		if  (os.path.exists("conf/email.ini")):
			self.use_email = True
			self.conf_email = ConfigParser()
			self.conf_email.read("conf/email.ini")

		self.saving = False
		self.blblimit = defaultdict()
		self.max_clients = self.config.getint("main", "max_clients")
		self.server_name = self.config.get("main", "name")
		self.server_message = self.config.get("main", "description")
		self.initial_greeting = self.config.get("main", "greeting").replace("\\n", "\n")
		self.public = self.config.getboolean("main", "public")
		self.isDebugging = self.config.getboolean("main", "debug_mode")
		self.enable_archives = self.conf_options.getboolean("worlds", "enable_archives")
		self.duplicate_logins = self.config.getboolean("options", "duplicate_logins")
		self.verify_names = self.config.getboolean("options", "verify_names")
		self.asd_delay = self.conf_options.getint("worlds", "asd_delay")
		self.api_password = self.config.get("network", "api_password")
		self.physics_limit = self.conf_options.getint("worlds", "physics_limit")
		self.console_delay = self.config.getint("options", "console_delay")
		self.info_url = self.config.get("info", "info_url")
		self.credit_name = self.conf_options.get("bank", "credit_name")
		self.initial_amount = self.conf_options.get("bank", "initial_amount")
		self.info_store = self.config.get("options", "info_store")
		self.table_prefix = self.config.get("options", "table_prefix")
		self.main_backup = self.conf_options.get("worlds", "main_backup")
		self.owner = self.config.get("info", "owner").lower()
		self.backup_freq = self.conf_options.getint("backup", "backup_freq")
		self.backup_main = self.conf_options.getboolean("backup", "backup_main")
		self.backup_max = self.conf_options.getint("backup", "backup_max")
		self.backup_auto = self.conf_options.getboolean("backup", "backup_auto")
		self.useblblimit = self.conf_options.getboolean("blb", "use_blb_limiter")
		if self.useblblimit:
			self.blblimit["player"] = self.conf_options.getint("blb", "player")
			self.blblimit["builder"] = self.conf_options.getint("blb", "builder")
			self.blblimit["advbuilder"] = self.conf_options.getint("blb", "advbuilder")
			self.blblimit["op"] = self.conf_options.getint("blb", "op")
			self.blblimit["worldowner"] = self.conf_options.getint("blb", "worldowner")
			self.blblimit["mod"] = self.conf_options.getint("blb", "mod")
			self.blblimit["admin"] = self.conf_options.getint("blb", "admin")
			self.blblimit["director"] = self.conf_options.getint("blb", "director")
			self.blblimit["owner"] = self.conf_options.getint("blb", "owner")

		# Parse IRC section
		if self.use_irc:
			self.irc_nick = self.conf_irc.get("irc", "nick")
			self.irc_pass = self.conf_irc.get("irc", "password")
			self.irc_channel = self.conf_irc.get("irc", "channel")
			self.irc_cmdlogs = self.conf_irc.getboolean("irc", "cmdlogs")
			self.irc_relay = ChatBotFactory(self)
			reactor.connectTCP(self.conf_irc.get("irc", "server"), self.conf_irc.getint("irc", "port"), self.irc_relay)
		else:
			self.irc_relay = None
		self.main_loaded = False
		# Word Filter
		self.wordfilter.read("conf/wordfilter.ini")
		self.filter = []
		number = self.wordfilter.getint("filter","count")
		for x in range(number):
			self.filter = self.filter + [[self.wordfilter.get("filter","s"+str(x)),self.wordfilter.get("filter","r"+str(x))]]
		# Salt, for the heartbeat server/verify-names
		self.salt = hashlib.md5(hashlib.md5(str(random.getrandbits(128))).digest()).hexdigest()[-32:].strip("0")
		# Load up the plugins specified
		plugins = self.conf_plugins.options("plugins")
		self.logger.info("Loading %i plugins..." % len(plugins))
		load_plugins(plugins)
		# Open the chat log, ready for appending
		create_if_not("logs/server.log")
		create_if_not("logs/chat.log")
		create_if_not("data/balances.sql")
		self.chatlog = open("logs/server.log", "a")
		self.chatlog = open("logs/chat.log", "a")
		self.balancesqllog = open("data/balances.sql", "a")

		# Create a default world, if there isn't one.
		if not os.path.isdir("mapdata/worlds/main"):
			self.logger.info("Generating main world...")
			sx, sy, sz = 64, 64, 64
			grass_to = (sy // 2)
			world = World.create(
				"mapdata/worlds/main",
				sx, sy, sz, # Size
				sx//2,grass_to+2, sz//2, 0, # Spawn
				([BLOCK_DIRT]*(grass_to-1) + [BLOCK_GRASS] + [BLOCK_AIR]*(sy-grass_to)) # Levels
			)
			self.logger.info("Generated.")
		# Load up the contents of data.
		self.loadMeta()
		# Set up a few more things.
		self.queue = Queue()
		self.clients = {}
		self.usernames = {}
		self.console = StdinPlugin(self)
		self.console.start()
		self.heartbeat = Heartbeat(self)
		# Boot worlds that got loaded
		for world in self.worlds:
			self.loadWorld("mapdata/worlds/%s" % world, world)