changelog

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: