def sendMessage(self, message): if(self.proxy is not None): try: if self.settings["cols"] != 0: message = wrap(message, cols=self.settings["cols"]) self.proxy.socket.send(message + "\n") except: print "Server: Exception thrown while sending " + self.name + " a message." self.proxy.kill()
def run(self): try: player = None self.running = True reconnected = False username = "" self.socket.send("-- Welcome to Mushy --\n") while len(username) < 1 or len(username.split()) != 1: self.socket.send("What will you use for a name?\n") username = self.socket.recv(4096).strip() self.socket.send("\n") # validate username if len(username) < 1: self.socket.send("Choose a REAL name!\n") if len(username.split()) > 1: self.socket.send("Only use your first name!\n") username = username[0].upper() + username[1:] # see if it is a new user or not already_exists = persist.profileExists(username) # Grab the password password = "" # player already has a profile if already_exists: tries = 0 self.socket.send("Enter in your password:\n") validated = False while tries < 3 and not validated: password = self.socket.recv(4096).strip() self.socket.send("\n") validated = persist.validate(username, password) if not validated and tries < 2: self.socket.send("Incorrect, try again:\n") tries += 1 if not validated: self.socket.send("Tried too many times. Disconnected.\n") self.kill() return # sanity check to make sure the player is not already connected if username in self.session: choice = '' while not choice in ('y', 'n'): self.socket.send("Another instance of you is already connected. Kick it and take its place? (y/n)\n") choice = self.socket.recv(4096).strip() self.socket.send("\n") if choice.lower() == 'y': reconnected = True self.killClone(username) elif choice.lower() == 'n': self.kill() self.socket.send("Disconnecting.\n") return self.socket.send("Welcome back, " + username + ".\n") player = persist.loadEntity(username) # player does not have a profile else: self.socket.send("User " + username + " does not yet exist, creating a new user.\n") while len(password) < 4: self.socket.send("Enter in your password:\n") password = self.socket.recv(4096).strip() self.socket.send("\n") # length check if len(password) < 4: self.socket.send("Passwords must be at least 4 characters long.\n") continue repeat = "" self.socket.send("Enter again to verify:\n") repeat = self.socket.recv(4096).strip() self.socket.send("\n") # repeat check if repeat != password: self.socket.send("Password mis-match. Reconnect and try again.\n") self.kill() return # create a new entity and save it salt, hcode = persist.hashPassword(password) player = entity.Entity(name=username, hcode=hcode, salt=salt) self.socket.send("Are you the DM for the group (y if yes)?\n") choice = self.socket.recv(4096).strip() self.socket.send("\n") dm = False if choice.lower() == 'y': dm = True player.dm = dm self.socket.send("Are you a spectator (y if yes)?\n") choice = self.socket.recv(4096).strip() self.socket.send("\n") spectator = False if choice.lower() == 'y': spectator = True player.spectator = spectator self.socket.send("Profile created. Saving...\n") persist.saveEntity(player) # hook up the proxy stuff proxy = entity.ClientProxy(self.socket) player.hookProxy(proxy) # connect player to the session player.session = self.session self.session.add(player) # start the proxy and notify everyone of the new connection player.proxy.start() player.sendMessage("") if reconnected: self.session.broadcastExclude(colorfy("[SERVER] " + player.name + " has reconnected.", "bright yellow"), player) player.sendMessage(colorfy("[SERVER] You have reconnected.", "bright yellow")) else: self.session.broadcastExclude(colorfy("[SERVER] " + player.name + " has joined the session.", "bright yellow"), player) player.sendMessage(colorfy("[SERVER] You have joined the session.", "bright yellow")) player.sendMessage(colorfy("[SERVER] You may type 'help' at any time for a list of commands.", 'bright green')) # Send them the newest changes as dictaded by the banner.txt file try: banner_file = open("banner.txt") banner = banner_file.read() if banner: player.sendMessage(colorfy("*"*80, "bright yellow")) player.sendMessage(wrap(banner)) player.sendMessage(colorfy("*"*80, "bright yellow")) banner_file.close() except IOError: pass except: exc_type, exc_value, exc_traceback = sys.exc_info() traceback.print_exception(exc_type, exc_value, exc_traceback, limit=None, file=sys.stdout) self.running = False self.socket.close() print "Server: Client connection closed. Exception during login." finally: if self in self.proxy_pool: self.proxy_pool.remove(self)