X-Git-Url: https://mudpy.org/gitweb?p=mudpy.git;a=blobdiff_plain;f=muff%2Fmuffcmds.py;fp=lib%2Fmuff%2Fmuffcmds.py;h=da061fa30d3d616aee0bb71083c08357aefdec3f;hp=8f1562c90d686010e5deec8310915b3ece654587;hb=fecd4c0fc49593052697b8cf199603cf1fac2b61;hpb=724736a86ae223448f90a6d3a15adacd035feaa5 diff --git a/lib/muff/muffcmds.py b/muff/muffcmds.py similarity index 79% rename from lib/muff/muffcmds.py rename to muff/muffcmds.py index 8f1562c..da061fa 100644 --- a/lib/muff/muffcmds.py +++ b/muff/muffcmds.py @@ -68,18 +68,22 @@ def handler_entering_account_name(user): if input_data: # keep only the first word and convert to lower-case - user.proposed_name = string.split(input_data)[0].lower() + name = input_data.lower() - # if we have a password hash, time to request a password - if user.get_passhash(): + # fail if there are non-alphanumeric characters + if name != filter(lambda x: x>="0" and x<="9" or x>="a" and x<="z", name): + user.error = "bad_name" + + # if that account exists, time to request a password + elif name in muffuniv.universe.categories["account"]: + user.account = muffuniv.universe.categories["account"][name] user.state = "checking_password" # otherwise, this could be a brand new user else: - user.name = user.proposed_name - user.proposed_name = None - user.load() - muffmisc.log("New user: " + user.name) + user.account = muffuniv.Element("account:" + name, muffuniv.universe) + user.account.set("name", name) + muffmisc.log("New user: " + name) user.state = "checking_new_account_name" # if the user entered nothing for a name, then buhbye @@ -93,18 +97,15 @@ def handler_checking_password(user): input_data = user.input_queue.pop(0) # does the hashed input equal the stored hash? - if md5.new(user.proposed_name + input_data).hexdigest() == user.passhash: + if md5.new(user.account.get("name") + input_data).hexdigest() == user.account.get("passhash"): # if so, set the username and load from cold storage - user.name = user.proposed_name - del(user.proposed_name) if not user.replace_old_connections(): - user.load() user.authenticate() user.state = "main_utility" # if at first your hashes don't match, try, try again - elif user.password_tries < muffconf.getint("general", "password_tries"): + elif user.password_tries < muffuniv.universe.categories["internal"]["general"].getint("password_tries"): user.password_tries += 1 user.error = "incorrect" @@ -129,10 +130,12 @@ def handler_checking_new_account_name(user): # user selected to disconnect if choice == "d": + user.account.delete() user.state = "disconnecting" # go back to the login screen elif choice == "g": + user.account.delete() user.state = "entering_account_name" # new user, so ask for a password @@ -154,17 +157,18 @@ def handler_entering_new_password(user): if len(input_data) > 6 and len(filter(lambda x: x>="0" and x<="9", input_data)) and len(filter(lambda x: x>="A" and x<="Z", input_data)) and len(filter(lambda x: x>="a" and x<="z", input_data)): # hash and store it, then move on to verification - user.passhash = md5.new(user.name + input_data).hexdigest() + user.account.set("passhash", md5.new(user.account.get("name") + input_data).hexdigest()) user.state = "verifying_new_password" # the password was weak, try again if you haven't tried too many times - elif user.password_tries < muffconf.getint("general", "password_tries"): + elif user.password_tries < muffuniv.universe.categories["internal"]["general"].getint("password_tries"): user.password_tries += 1 user.error = "weak" # too many tries, so adios else: user.send("$(eol)$(red)Too many failed password attempts...$(nrm)$(eol)") + user.account.delete() user.state = "disconnecting" def handler_verifying_new_password(user): @@ -174,16 +178,15 @@ def handler_verifying_new_password(user): input_data = user.input_queue.pop(0) # hash the input and match it to storage - if md5.new(user.name + input_data).hexdigest() == user.passhash: + if md5.new(user.account.get("name") + input_data).hexdigest() == user.account.get("passhash"): user.authenticate() - user.save() # the hashes matched, so go active if not user.replace_old_connections(): user.state = "main_utility" # go back to entering the new password as long as you haven't tried # too many times - elif user.password_tries < muffconf.getint("general", "password_tries"): + elif user.password_tries < muffuniv.universe.categories["internal"]["general"].getint("password_tries"): user.password_tries += 1 user.error = "differs" user.state = "entering_new_password" @@ -191,6 +194,7 @@ def handler_verifying_new_password(user): # otherwise, sayonara else: user.send("$(eol)$(red)Too many failed password attempts...$(nrm)$(eol)") + user.account.delete() user.state = "disconnecting" def handler_active(user): @@ -200,23 +204,18 @@ def handler_active(user): input_data = user.input_queue.pop(0) # split out the command (first word) and parameters (everything else) - try: - inputlist = string.split(input_data, None, 1) - command = inputlist[0] - except: + if input_data.find(" ") > 0: + command, parameters = input_data.split(" ", 1) + else: command = input_data - try: - parameters = inputlist[1] - except: parameters = "" - del(inputlist) # lowercase the command command = command.lower() # the command matches a command word for which we have data - if command in muffuniv.universe.commands.keys(): - exec(muffuniv.universe.commands[command].get("action")) + if command in muffuniv.universe.categories["command"]: + exec(muffuniv.universe.categories["command"][command].get("action")) # no data matching the entered command word elif command: command_error(user, command, parameters) @@ -226,7 +225,7 @@ def command_halt(user, command="", parameters=""): # see if there's a message or use a generic one if parameters: message = "Halting: " + parameters - else: message = "User " + user.name + " halted the world." + else: message = "User " + user.account.get("name") + " halted the world." # let everyone know muffmisc.broadcast(message) @@ -240,7 +239,7 @@ def command_reload(user, command="", parameters=""): # let the user know and log user.send("Reloading all code modules, configs and data.") - muffmisc.log("User " + user.name + " reloaded the world.") + muffmisc.log("User " + user.account.get("name") + " reloaded the world.") # set a flag to reload muffvars.reload_modules = True @@ -249,10 +248,6 @@ def command_quit(user, command="", parameters=""): """Quit the world.""" user.state = "disconnecting" -def command_time(user, command="", parameters=""): - """Show the current world time in elapsed increments.""" - user.send(muffuniv.universe.internals["counters"].get("elapsed") + " increments elapsed since the world was created.") - def command_help(user, command="", parameters=""): """List available commands and provide help for commands.""" @@ -260,16 +255,16 @@ def command_help(user, command="", parameters=""): if parameters: # is the command word one for which we have data? - if parameters in muffuniv.universe.commands.keys(): + if parameters in muffuniv.universe.categories["command"]: # add a description if provided - description = muffuniv.universe.commands[parameters].get("description") + description = muffuniv.universe.categories["command"][parameters].get("description") if not description: description = "(no short description provided)" output = "$(grn)" + parameters + "$(nrm) - " + description + "$(eol)$(eol)" # add the help text if provided - help_text = muffuniv.universe.commands[parameters].get("help") + help_text = muffuniv.universe.categories["command"][parameters].get("help") if not help_text: help_text = "No help is provided for this command." output += help_text @@ -283,10 +278,10 @@ def command_help(user, command="", parameters=""): # give a sorted list of commands with descriptions if provided output = "These are the commands available to you:$(eol)$(eol)" - sorted_commands = muffuniv.universe.commands.keys() + sorted_commands = muffuniv.universe.categories["command"].keys() sorted_commands.sort() for item in sorted_commands: - description = muffuniv.universe.commands[item].get("description") + description = muffuniv.universe.categories["command"][item].get("description") if not description: description = "(no short description provided)" output += " $(grn)" + item + "$(nrm) - " + description + "$(eol)" @@ -311,17 +306,15 @@ def command_say(user, command="", parameters=""): # a dictionary of punctuation:action pairs actions = {} - for option in muffconf.config_data.options("language"): - if option.startswith("punctuation_"): - action = option.split("_")[1] - for mark in muffconf.config_data.get("language", option).split(): + for facet in muffuniv.universe.categories["internal"]["language"].facets(): + if facet.startswith("punctuation_"): + action = facet.split("_")[1] + for mark in muffuniv.universe.categories["internal"]["language"].get(facet).split(): actions[mark] = action - # set the default action - action = actions[muffconf.config_data.get("language", "default_punctuation")] - # match the punctuation used, if any, to an action - default_punctuation = muffconf.config_data.get("language", "default_punctuation") + default_punctuation = muffuniv.universe.categories["internal"]["language"].get("default_punctuation") + action = actions[default_punctuation] for mark in actions.keys(): if message.endswith(mark) and mark != default_punctuation: action = actions[mark] @@ -332,13 +325,13 @@ def command_say(user, command="", parameters=""): message += default_punctuation # capitalize a list of words within the message - capitalize = muffconf.get("language", "capitalize").split() + capitalize = muffuniv.universe.categories["internal"]["language"].get("capitalize").split() for word in capitalize: message = message.replace(" " + word + " ", " " + word.capitalize() + " ") # tell the room # TODO: we won't be using broadcast once there are actual rooms - muffmisc.broadcast(user.name + " " + action + "s, \"" + message + "\"") + muffmisc.broadcast(user.account.get("name") + " " + action + "s, \"" + message + "\"") # there was no message else: @@ -361,6 +354,8 @@ def command_show(user, command="", parameters=""): keys = muffuniv.universe.contents.keys() keys.sort() for key in keys: message += "$(eol) $(grn)" + key + "$(nrm)" + elif parameters == "time": + message = muffuniv.universe.categories["internal"]["counters"].get("elapsed") + " increments elapsed since the world was created." elif parameters: message = "I don't know what \"" + parameters + "\" is." else: message = "What do you want to show?" user.send(message)