2010-07-06 20:23:08 UTC Jeremy Stanley <fungi@yuggoth.org> * doc/coder.txt: Adjusted sections referencing literal backslashes to use inline literal syntax rather than double-backslash syntax, for improved clarity. 2010-06-23 00:28:38 UTC Jeremy Stanley <fungi@yuggoth.org> * doc/coder.txt: Found and replaced a non-ASCII UTF-8 apostrophe. 2010-06-18 00:44:54 UTC Jeremy Stanley <fungi@yuggoth.org> * lib/mudpy/password.py (create): Corrected docstring format so that epydoc -v will run clean of errors again. 2010-06-18 00:23:26 UTC Jeremy Stanley <fungi@yuggoth.org> * lib/mudpy/password.py (create): Corrected two minor typographical errors in the function's docstring. 2010-06-17 23:49:58 UTC Jeremy Stanley <fungi@yuggoth.org> * lib/mudpy/__init__.py (modules): Added the new password module to the list. * lib/mudpy/misc.py (handler_checking_password) (handler_entering_new_password, handler_verifying_new_password): Replaced existing md5 usage with calls to the new password functions. * lib/mudpy/password.py: Implemented a new module to handle creating and verifying account password hashes. The functions and format are forward-compatable to new hashing algorithms, and can be scaled to allow tuning for CPU utilization/brute-force mitigation trade-offs. The new functions are not directly backward-compatable with the old format, but a utility function (upgrade_legacy_hash) is included to upgrade those hexdigests if needed. 2010-05-31 14:15:35 UTC Jeremy Stanley <fungi@yuggoth.org> * README: Switched from 79 columns to 72 columns in accordance with the style guide in the doc/coder.txt coder guide. 2010-05-31 14:12:28 UTC Jeremy Stanley <fungi@yuggoth.org> * README: Updated the URL for the on-line documentation reference and reworded the last sentence for clarity. 2010-05-31 02:59:38 UTC Jeremy Stanley <fungi@yuggoth.org> * doc/coder.txt: New document focused on topics of interest to anyone wishing to modify the mudpy engine or get involved with the project's development process. 2010-05-29 14:46:52 UTC Jeremy Stanley <fungi@yuggoth.org> * bin/git2gch: New executable script for generating GNU-format ChangeLog files from the Git commit log. 2010-05-07 00:59:56 UTC Jeremy Stanley <fungi@yuggoth.org> * bin/test: New executable script for regression testing against all future commits to the mudpy core engine, modules and sample data. 2010-05-04 03:39:43 UTC Jeremy Stanley <fungi@yuggoth.org> * share/menu.mpy (menu:disconnecting): Appended a newline to separate the disconnect message from any lines which the client might add thereafter, and switched from description to prompt. 2010-05-04 03:01:14 UTC Jeremy Stanley <fungi@yuggoth.org> * lib/mudpy/__init__.py: Added telnet to the modules list. * lib/mudpy/misc.py (Element.send, User.__init__) (User.adjust_echoing, User.enqueue_input, User.flush) (User.replace_old_connections, User.send, check_for_connection) (get_echo_sequence, handle_user_input): Minor adjustments to accomodate new code in telnet.py. (User.negotiate_telnet_options, telnet_proto): Moved to telnet.py and reworked option negotiation stack to eliminate a possible loop, bringing the code fully in compliance with the "Q" method described in IETF RFC 1143. * lib/mudpy/telnet.py: New file for constants and functions related to support of the Telnet protocol. 2010-03-26 18:30:33 UTC Jeremy Stanley <fungi@yuggoth.org> * README: Adjusted indentention for the copyright metadata block and added references to additional available documentation. 2010-01-31 00:58:49 UTC Jeremy Stanley <fungi@yuggoth.org> * README: New file containing basic information on the project along with pointers to additional documentation. 2010-01-30 23:36:11 UTC Jeremy Stanley <fungi@yuggoth.org> * doc/LICENSE: Added a brief summary and reformatted for aesthetics. 2010-01-30 17:25:08 UTC Jeremy Stanley <fungi@yuggoth.org> * (all): Updated copyright notices for 2010. 2009-12-25 20:15:24 UTC Jeremy Stanley <fungi@yuggoth.org> * LICENSE: Moved to doc subdirectory, indicating it's a documentation file. * archetype, command, menu: Moved to share subdirectory, indicating it's generally read-only data. Also appended .mpy extention to file names, to indicate they're mudpy data. * banner.txt, login.txt, mudpy.conf: Moved to etc subdirectory, indicating they're generally hand-edited configuration data. * lib/mudpy/__init__.py: Created a new Python module package, to begin the process of splitting up the old monolithic module. * mudpy: Moved to bin subdirectory, indicating it's directly executable. * mudpy.conf (__control__, internal:storage), mudpy.py (DataFile.load, find_file, replace_macros): New functionality allows arbitrary location of data files from relative or absolute paths out of a prioritized series of potential directory trees. * mudpy.conf (internal:network): Changed host to the IPv6 localhost address of ::1 instead of the old IPv4 127.0.0.1 equivalent. * mudpy.py: Renamed to misc.py and added to the new lib/mudpy Python module package. (Universe.initialize_server_socket): If local IPv6 support is present default to listening on ::, otherwise fall back to 0.0.0.0 like before. (command_say): Instead of denying parameters which look like replacement macros, they are simply escaped before being processed. Messages enclosed in quotation marks no longer get language fix-ups applied. Fixed a bug where a type exception could be triggered if an actor provided parameters to the say command which evaluated to an empty string; reported by Mark Kolloros, a.k.a. Colourful. * sample/index: Renamed to __init__.mpy in an effort to emulate Python module package structure for groups of mudpy data files. * sample/location, sample/prop: Appended .mpy extention to file names, to indicate they're mudpy data. 2009-10-06 21:11:08 UTC Jeremy Stanley <fungi@yuggoth.org> * mudpy: Changed shebang line to invoke the interpreter through /usr/bin/env instead of directly. * mudpy, mudpy.py (daemonize): Rename the process to the same as the script's file name, and add some additional descriptive comments. 2009-10-02 23:58:09 UTC Jeremy Stanley <fungi@yuggoth.org> * (all): Updated copyright notices for 2009. * mudpy, mudpy.py: Changed all Python module references to be explicit rather than importing their contents into the local namespace, and moved all the import statements into the objects requiring them. Made all code Unicode clean, UTF-8 encoded, and marked relevant byte-oriented code in preparation for later Python 2to3 migration. Wrapped all code at 79 columns and changed to three-space/non-tab indents with K&R-style bracketing. Moved more code from the mudpy executable into mudpy.py instead. * mudpy.py (User.flush): Added some verbose logging when an exception is raised sending to a socket. (User.negotiate_telnet_options): Reworked the Telnet stack into an RFC 1143 option negotiation queue. Implemented support for binary mode input and output RFC 856 and made the UTF-8 decoding and encoding/substitution dependent on it. Implemented support for negotiate about windows size RFC 1073 and changed the word-wrapping routines to use the client's terminal width if available. (glyph_columns, wrap_ansi_text): Improved word-wrapping to support East Asian Width characters, which occupy two columns instead of just one. * katarsis, sample: Replaced Katarsis data with more generic sample data. 2008-06-10 22:42:56 UTC Jeremy Stanley <fungi@yuggoth.org> * (all): Updated copyright notices for 2008, and added references to the included LICENSE file. Added similar copyright notices to all data/document files. * LICENSE: Switched the project from modified 2-clause BSD license to the simpler and equivalent ISC license. * banner.txt, login.txt, menu (menu:entering_account_name) (menu:main_utility): Implemented text file inclusion using a file replacement macro, and relocated the ASCII/ANSI art from the login/lobby menu descriptions into separate login.txt and banner.txt files. * command (command:show): Renamed parameter to option in the help. * menu (menu:delete_avatar): Corrected a misleading typo in the desription. * mudpy.conf (internal:time), mudpy.py (User.__init__) (User.check_idle, User.pulse, handle_user_input): Added idle and linkdead dict facets, indicating how long users can idle in various states before they're warned and ultimately disconnected. * mudpy.py (replace_macros): Performance enhancement, moving unnecessary declarations outside the processing loop. (wrap_ansi_text): Refactored the word-wrapping routines to solve a bug where lines explicitly terminated at the wrap column got wrapped early. 2006-07-15 18:11:46 UTC Jeremy Stanley <fungi@yuggoth.org> * mudpy.py (User.replace_old_connections): Bug fix to make sure old_user.account actually exists during socket replacement, and is not merely a dangling reference. 2006-07-10 03:30:46 UTC Jeremy Stanley <fungi@yuggoth.org> * LICENSE, mudpy, mudpy.py: Altered the copyright statements to correctly mention all years instead of only the most recent. * command (command:chat, command:say), mydpy.py (User.send) (command_chat, first_word, handler_active): Added a chat command which toggles the avatar in and out of a mode where all further lines of input are passed as parameters to the say command. * command (command:quit): Minor clarifications to several command help texts. * command (command:say), mudpy.conf (internal:language), mudpy.py (command_say): Moved the capitalize_words list facet to a more flexible typos dict, and condensed punctuation_* facets into an actions dict facet. * mudpy.py (User.deactivate_avatar): Fixed a bug where avatars without a location could trigger an exception. (command_help): Added a see_also list facet for menu elements, which allow help output to suggest other related commands. (create_pidfile, remove_pidfile): Minor adjustments to assure file path canonicalization. (get_loglines): Aesthetic tweaks to the show log output. (on_pulse): Create internal:counters if it doesn't exist, to avoid throwing an exception. 2006-03-15 19:37:25 UTC Jeremy Stanley <fungi@yuggoth.org> * command (command:move): Minor cosmetic fix for the move command help text. * mudpy.py (User.replace_old_connections): Fixed a crash in connection replacement detection where stale sockets without an associated account would trigger an exception. 2006-02-05 04:40:52 UTC Jeremy Stanley <fungi@yuggoth.org> * mudpy.py (User.send): Reduced the word-wrap column count from 80 to 79, to deal with some clients which will themselves wrap at, rather than after, the last column. 2006-01-31 04:44:42 UTC Jeremy Stanley <fungi@yuggoth.org> * mudpy.py (check_time): Removed unused function. 2006-01-30 02:44:48 UTC Jeremy Stanley <fungi@yuggoth.org> * command (command:reload), mudpy.py (DataFile.load, DataFile.save): More work on data file reloading * mudpy, mudpy.py (Universe.new): Moved more code out of the mudpy executable into the mudpy.py Python module. (Universe.__init__, command_halt, command_reload): Renamed the reload_modules and terminate_world bools to reload_flag and terminate_flag respectively. * mudpy.conf (internal:limits), mudpy.py (DataFile.save): Implemented a data file rotation/backup scheme, configurable through the default_backup_count int facet. * mudpy.conf (internal:network): Example recommended config binds only to 127.0.0.1 initially, for added security. * mudpy.py (daemonize): More work on daemonization. 2006-01-24 06:31:39 UTC Jeremy Stanley <fungi@yuggoth.org> * LICENSE, mudpy, mudpy.py: Updated copyright notices for 2006. * mudpy, mudpy.conf (internal:process), mudpy.py (create_pidfile) (daemonize, remove_pidfile): Implemented optional fork-and-disassociate daemon capability. * mudpy.conf (internal:network), mudpy.py (Universe.initialize_server_socket): Now, if the host facet is unset, it defaults to 0.0.0.0 (listen on all available IP interfaces). * mudpy.py (Element.clean_contents, Element.reload) (Element.update_location, Universe.load, reload_data): Additional Element methods to clean up data file reloading. (sighook): Added a signal handler to interpret hangup as if an admin had executed the reload command, and term as if the halt command had been issued. 2005-11-26 22:55:44 UTC Jeremy Stanley <fungi@yuggoth.org> * command (command:show), mudpy.py (command_show): Improved parameter descriptions in the help text for the administrative show command, and added a file parameter to allow listing of elements included within a known data file. * command (command:show), mudpy.py (command_show, get_loglines): Modified the administrative show log command to take parameters for filtering and start/stop entry ranges. * mudpy.py (DataFile.load, Universe.load, command_reload) (reload_data): The administrative reload command now re-reads data from read-only data files and updates the corresponding elements. (command_show): Refactored if/then spaghetti logic to be easier to follow. 2005-11-24 00:06:25 UTC Jeremy Stanley <fungi@yuggoth.org> * mudpy.py (Element.can_run, User.can_run): Moved this method from the User class to the Element class, allowing for future flexibility. (Element.new_event, Universe.get_time): Began adding framework for event elements and queues. (command_create, command_delete, command_destroy, command_error) (command_halt, command_help, command_look, command_move) (command_quit, command_reload, command_say, command_set) (command_show): Adjusted commands and messaging to be relative to an actor element instead of a user object. 2005-11-18 21:03:52 UTC Jeremy Stanley <fungi@yuggoth.org> * archetype, mudpy.conf (__control), mudpy.py (User.new_avatar), template: Retermed template as archetype. * mudpy.py: Added more code commentary, and refactored some sections of the source to improve readability. (DataFile.is_writeable, DataFile.save): Abstracted out the writeable check from the save method into a separate method. (DataFile.save): Adjusted to only write when elements within that file have been modified. (Element.delete): Removed obsolete method, recently implemented more cleanly as remove_facet. 2005-09-30 19:44:23 UTC Jeremy Stanley <fungi@yuggoth.org> * command (command:show), mudpy.py (command_show): Added a log parameter to the admin command show, allowing administrative users to review recent log entries. * mudpy.conf (internal:logging), mudpy.py (log): Added an in-memory ring buffer for logging, configurable via the max_log_lines facet. * mudpy.py (excepthook): Attempt to log any Python interpreter exceptions. (log): Implemented a log priority mechanism to allow filtering logs by importance. Log entries above an administrative account's loglevel int facet in will be echoed to their owner's socket if connected. 2005-09-28 23:14:53 UTC Jeremy Stanley <fungi@yuggoth.org> * command (command:look), mudpy.py (command_look): New command allowing avatars to view the description and contents of their location. * mudpy.conf (internal:directions), mudpy.py (Element.move_direction, Element.portals): Made direction vectors for actor movement configurable. * mudpy.conf (internal:logging), mudpy.py (log): Made logging configurable to write to a particular file, toggle printing to stdout, and added the ability to specify a syslog tag. * mudpy.py (Element.go_home, Element.move_direction): Added a feedback message to notify the user when their avatar moves between locations, and inform other users when actors depart from or arrive at their location. (User.send): Avoid unnecessarily duplicating prompts following unsolicited/notification messages. 2005-09-22 23:34:49 UTC Jeremy Stanley <fungi@yuggoth.org> * command, menu, mudpy.conf, template, mudpy.py (DataFile.__init__) (DataFile.save): Changed the control meta-element to __control__ so as to avoid namespace collisions later. * command (menu:active), mudpy.py (User.send): Removed the prompt facet to enable more dynamic prompt generation. * command (command:move), mudpy.py (Element.go_home, Element.go_to) (Element.move_direction, command_move): Implemented a move command and associated backend functions/methods allowing avatars to move between interconnected locations. * command (command:show), mudpy.py (command_show): Added a result parameter to the admin show command, allowing administrative users to eval arbitrary Python statements. * menu (menu:activate_avatar), mudpy.py (User.activate_avatar_by_index): New convenience function to simplify this menu's action. * mudpy.conf (internal:limits), mudpy.py (User.authenticate): Added a default_admins list facet, for use in identifying user names which should automatically be granted administrative privileges--dangerous and therefore commented out of the config by default. * mudpy.py (DataFile.save): When writing new files, any necessary parent directories in the specified path will be created automatically. Since the ConfigParser module doesn't make an effort to sort its contents, replacement code has been added to do this. (Element.ancestry, Element.append, Element.has_facet) (Element.remove_facet): Implemented sieve-style recursive facet inheritence for elements using an inherit meta-facet. (User.send): Refactored how newlines are added/removed/replaced in the output queue, to avoid chaining an ugly number of them. Added a flush flag, allowing urgent output to be pushed through immediately. 2005-09-18 23:42:03 UTC Jeremy Stanley <fungi@yuggoth.org> * mudpy.py (User.negotiate_telnet_options): Added support for RFC 1184 linemode and RFC 858 go ahead suppression. Automated end of record/go ahead prompt terminator selection via Telnet option negotiation. Added support for Telnet suboption negotiation. Fixed a double-IAC escape matching error. (User.send): Refactored away some spaghetti logic for better readability. (log): Added syslog support. 2005-09-13 02:41:30 UTC Jeremy Stanley <fungi@yuggoth.org> * mudpy.py (User.enqueue_input, User.negotiate_telnet_options): Implemented a real Telnet option negotiation stack, paving the way for more robust client integration. (get_echo_sequence): Refactored echo handling in password prompts to rely on Telnet option negotiation. (get_menu): Added an RFC 885 end of record prompt terminator for improved MUD client support. 2005-09-11 20:45:34 UTC Jeremy Stanley <fungi@yuggoth.org> * command (command:create, command:delete, command:destroy) (command:set), mudpy.py (command_create, command_delete) (command_destroy, command_set): Added the admin commands create, delete, destroy and set, as a foundation for future on-line creation/World-building systems. * katarsis: Included sample data from the Katarsis project. * mudpy.py (Element.delete): Renamed to destroy and added a new delete method used for removing individual facets, making them consistent with the new admin commands. (User.delete): Renamed to destroy for consistency with the Element class' method names. (User.can_run): New method acting as a rudimentary access control system for commands flagged with an administrative bool facet in command elements. (command_help): Modified to filter out commands the user is disallowed from running, and now highlights administrative command names when they're available. (handler_active): Standardized on command_name instead of command. 2005-09-05 03:43:11 UTC Jeremy Stanley <fungi@yuggoth.org> * menu (menu:activate_avatar): Add a default of the first avatar in the list. (menu:choose_name): Change the generate more names choice from m to g and make it the default. (menu:delete_avatar): Make abort the default choice and correct a misleading copy/paste error in the prompt. * menu (menu:delete_account), mudpy.py (User.delete): New menu and supporting method to allow deletion of an existing account. * mudpy.py (Element.get, Element.getboolean, Element.getdict) (Element.getfloat, Element.getint, Element.getlist): Reworked default parameter handling to fall back to the None type and then replace it with the appropriate type of empty variable if not overridden, solving obscure bugs arising from mutable sequence reuse. (get_choice_action, get_choice_branch, generic_menu_handler): Consolidated default choice fallback into generic_menu_handler. * testdata: Removed pending something better. 2005-09-02 02:51:15 UTC Jeremy Stanley <fungi@yuggoth.org> * menu (menu:activate_avatar): New menu to delete an existing avatar. * menu (menu:delete_avatar), mudpy.py (User.delete_avatar): New menu and supporting method to select an existing avatar. 2005-08-31 03:28:44 UTC Jeremy Stanley <fungi@yuggoth.org> * command (control), menu (control): Locked these files to be read-only, for added security. * mudpy.conf (categories, control, include): Moved categories and include elements to be control meta-element list facets called default_files and include_files respectively, allowing them to be utilized in multiple files within the data tree. (control): Added a list facet called private_files which works like default_files but creates them mode 0600, and moved the accounts file to this list to prevent leaking MD5 password hashes for accounts. (internal:general): Renamed to internal:limits and added a max_avatars int facet providing the means to cap the number an account is allowed to have. * mudpy.py (Element.get, Element.getdict, Element.getfloat) (Element.getint, Element.getlist): Reworked to provide a means to override the default values through a function parameter, similar to getboolean. (Element.set): Strip trailing L off long ints. (handler_checking_new_account_name): Abstracted this entire function out into the checking_new_account_name menu configuration. 2005-08-30 00:03:05 UTC Jeremy Stanley <fungi@yuggoth.org> * all files: Lower-cased any MUDpy references to mudpy throughout the code. * muff: Collapsed the Python module package directory into a single mudpy.py module for now, to simplify on-the-fly source code reloading functionality (this will be re-split in a more effective fashion later). * testdata: New example data file with generic contents. 2005-08-28 18:36:46 UTC Jeremy Stanley <fungi@yuggoth.org> * data/commands: Renamed to command and moved into the top-level directory. * data/universe, lib/index: Removed this sample data. * lib/menus: Collapsed the contents of the directory into a menu file within the top-level directory. * lib/muff: Moved into the top-level directory. * lib/muff, mudpy.py: Assorted minor code readability fixes and additional comments. Replaced several more vague try/except constructs with more specific if/then/else checks. * lib/muff/muffcmds.py (command_time, command_show): Changed the admin command time to be a parameter to the admin command show instead. (handler_checking_new_account_name, handler_entering_new_password) (handler_verifying_new_password): Adjusted the fix for stray empty accounts to create them upon entry but delete them again if no password is successfully added, avoiding a potential race and exception where two sockets start to create a user with the same name. (handler_entering_account_name): Disallow non-alphanumeric characters in account names. * lib/muff/muffconf.py: Replaced with object methods in class definitions within muffuniv.py. * mud.py: Renamed to mudpy matching, the executable to the project name. 2005-08-25 21:23:07 UTC Jeremy Stanley <fungi@yuggoth.org> * data/universe/rooms: Added a few example locations. * lib/commands: Collapsed this directory into a single file. * lib/muff/muffcmds.py, lib/muff/muffmisc.py, lib/muff/muffvars.py: Replaced some risky try/except constructs with if/then/else clauses. * lib/muff/muffcmds.py (command_show): Added files and universe parameter options. * lib/muff/muffmisc.py (getlong, repr_long, setlong): Folded into getint and friends. * lib/muff/muffvars.py (save): Finished migrating into the muffuniv.Universe.save method. (variable_data): Moved to muffuniv.Universe.internals dict. 2005-08-25 02:25:34 UTC Jeremy Stanley <fungi@yuggoth.org> * lib/menus/active: Merged into lib/menus/miscellaneous and removed. * lib/menus/miscellaneous (choose_gender, choose_name) (main_utility): Added menus to enter/exit the game, select gender and pick a randomly-generated avatar name from a list. * lib/muff/muffcmds.py: Changed user state names to employ underscores instead of spaces. (command_show): New admin command to ease debugging of data relationships. (generic_menu_handler): New function abstract out common routines from typical menu state handlers. (handle_user_input): For aesthetics, user input is now followed by a blank line of output if we expect the client isn't echoing. * lib/muff/muffmain.py (main): The main loop is now followed by a muffiniv.universe.save during shutdown, in case any changes have occurred since the last save. * lib/muff/muffmenu.py (get_menu): Refactored to be more modular, and broke out a lot of its pieces into additional functions. (get_choice_action, get_choice_branch, get_default_action) (get_default_branch, get_default_menu_choice) (get_formatted_default_menu_choice, get_formatted_menu_choices) (get_menu_actions, get_menu_branches, get_menu_choices) (get_menu_description, get_menu_prompt): New functions abstracted out of the previously spaghetti-like get_menu function. (get_echo_message, get_echo_sequence, menu_echo_on): New functions to take care of enabling and disabling echo for password prompts. * lib/muff/muffmisc.py (replace_macros): Implemented gender-specific pronoun replacement macros, to make English-language messages less awkward. * lib/muff/muffuniv.py: New module implementing DataFile, Element and Universe classes, for a more object-oriented approach. * muff: Renamed to mud.py. * muff.conf: Renamed to mudpy.conf. 2005-08-05 15:54:48 UTC Jeremy Stanley <fungi@yuggoth.org> * lib/menus/login (disconnecting duplicates), lib/menus/miscellaneous (disconnecting), lib/muff/muffcmds.py (handler_checking_password): Messages are now colored in ANSI red. * lib/muff/muffcmds.py (command_halt): Added a reason message parameter which gets logged and broadcast to all connected users. (command_reload): Now gets logged when run. (command_say): Disallowed replacement macro sequences and refactored the correction routines, abstracting the punctuation and typo maps out into configuration. (command_time): New admin command to report current world time in elapsed increments. (handle_user_input): Switched to a generic caller based dynamically based on the user state names. (handler_disconnecting, handler_disconnecting_duplicates): Added code to handle disconnecting an existing socket for a user who successfully authenticates on a new socket. (handler_entering_account_name): Now adds a log entry when a user logs into an account. (handler_fallthrough): Removed. * lib/muff/muffconf.py: Refactored the initial config file finding routines to be more robust. (get, getfloat, getint, set): New convenience functions for calling the corresponding Data class methods. * lib/muff/muffmain.py (main): Ammended the loop to continue, giving the next pulse an opportunity to more courteously disconnect active user sockets. * lib/muff/muffmain.py (main), lib/muff/muffmisc.py (on_pulse): Relocated more loop content. * lib/muff/muffmisc.py (broadcast): For aesthetics, an additional blank line is now prepended to output. (getlong, repr_long, setlong): Additional functions implemented to deal with Python's long integer representation format. (reload_data): New function allowing the admin reload command to refreshe already instantiated objects by migrating their contents to new ones and deleting the originals. * lib/muff/muffuser.py (User.save): The account file is now unconditionally set to 0600 permissions for additional protection of the MD5 password hashes. 2005-07-30 17:04:00 UTC Jeremy Stanley <fungi@yuggoth.org> * lib/muff/muffcmds.py (command_quit): Replaced with a disconnecting state. (handle_user_input): Reorganized the user state handlers. (handler_entering_account_name): Fixed a race condition where empty accounts would be created even if the user never got around to entering a password before disconnecting. * lib/muff/muffmisc.py (log): New function to abstract logging of arbitrary information, for later flexibility. (random_name, weighted_choice): Added a random name generator function for later use. 2005-07-21 20:19:02 UTC Jeremy Stanley <fungi@yuggoth.org> * bin/muff, lib/muff: Replaced the embedded license copies with pointers to the LICENSE file. Added lots of in-line code commentary and docstrings. Refactored some blocks of code for improved readability. * bin/muff, etc/mudpy.conf: Moved to the top-level directory. * doc/license: Renamed to LICENSE and moved it to the top-level directory. * lib/muff/muffcmds.py (command_null): Removed. (command_say): Additional output cleanup. * lib/muff/muffmain.py (main): More robust handling for variable files. * lib/muff/muffmisc.py (wrap_ansi_text): Minor word-wrapping fix. (User.__init__): Added tracking of last login address. 2005-07-18 22:24:29 UTC Jeremy Stanley <fungi@yuggoth.org> * Initial commit of working project files. 2005-07-16 22:22:13 UTC Jeremy Stanley <fungi@yuggoth.org> * New project. Copyright (c) 2004-2010 Jeremy Stanley <fungi@yuggoth.org>. Permission to use, copy, modify, and distribute this software is granted under terms provided in the LICENSE file distributed with this software. Local Variables: mode: change-log coding: utf-8 left-margin: 8 fill-column: 76 version-control: never End: