@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)
@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)
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
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
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)
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
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()
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)
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)