mudpy.git
18 years agoImported from archive.
Jeremy Stanley [Mon, 10 Jul 2006 03:30:46 +0000 (03:30 +0000)]
Imported from archive.

* 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.

18 years agoImported from archive.
Jeremy Stanley [Wed, 15 Mar 2006 19:37:25 +0000 (19:37 +0000)]
Imported from archive.

* 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.

18 years agoImported from archive.
Jeremy Stanley [Sun, 5 Feb 2006 04:40:52 +0000 (04:40 +0000)]
Imported from archive.

* 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.

18 years agoImported from archive.
Jeremy Stanley [Tue, 31 Jan 2006 04:44:42 +0000 (04:44 +0000)]
Imported from archive.

* mudpy.py (check_time): Removed unused function.

18 years agoImported from archive.
Jeremy Stanley [Mon, 30 Jan 2006 02:44:48 +0000 (02:44 +0000)]
Imported from archive.

* 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.

18 years agoImported from archive.
Jeremy Stanley [Tue, 24 Jan 2006 06:31:39 +0000 (06:31 +0000)]
Imported from archive.

* 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.

19 years agoImported from archive.
Jeremy Stanley [Sat, 26 Nov 2005 22:55:44 +0000 (22:55 +0000)]
Imported from archive.

* 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.

19 years agoImported from archive.
Jeremy Stanley [Thu, 24 Nov 2005 00:06:25 +0000 (00:06 +0000)]
Imported from archive.

* 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.

19 years agoImported from archive.
Jeremy Stanley [Fri, 18 Nov 2005 21:03:52 +0000 (21:03 +0000)]
Imported from archive.

* 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.

19 years agoImported from archive.
Jeremy Stanley [Fri, 30 Sep 2005 19:44:23 +0000 (19:44 +0000)]
Imported from archive.

* 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.

19 years agoImported from archive.
Jeremy Stanley [Wed, 28 Sep 2005 23:14:53 +0000 (23:14 +0000)]
Imported from archive.

* 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.

19 years agoImported from archive.
Jeremy Stanley [Thu, 22 Sep 2005 23:34:49 +0000 (23:34 +0000)]
Imported from archive.

* 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.

19 years agoImported from archive.
Jeremy Stanley [Sun, 18 Sep 2005 23:42:03 +0000 (23:42 +0000)]
Imported from archive.

* 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.

19 years agoImported from archive.
Jeremy Stanley [Tue, 13 Sep 2005 02:41:30 +0000 (02:41 +0000)]
Imported from archive.

* 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.

19 years agoImported from archive.
Jeremy Stanley [Sun, 11 Sep 2005 20:45:34 +0000 (20:45 +0000)]
Imported from archive.

* 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.

* example: Included sample data from the Example 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.

19 years agoImported from archive.
Jeremy Stanley [Mon, 5 Sep 2005 03:43:11 +0000 (03:43 +0000)]
Imported from archive.

* 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.

19 years agoImported from archive.
Jeremy Stanley [Fri, 2 Sep 2005 02:51:15 +0000 (02:51 +0000)]
Imported from archive.

* 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.

19 years agoImported from archive.
Jeremy Stanley [Wed, 31 Aug 2005 03:28:44 +0000 (03:28 +0000)]
Imported from archive.

* 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.

19 years agoImported from archive.
Jeremy Stanley [Tue, 30 Aug 2005 00:03:05 +0000 (00:03 +0000)]
Imported from archive.

* 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.

19 years agoImported from archive.
Jeremy Stanley [Sun, 28 Aug 2005 18:36:46 +0000 (18:36 +0000)]
Imported from archive.

* 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.

19 years agoImported from archive.
Jeremy Stanley [Thu, 25 Aug 2005 21:23:07 +0000 (21:23 +0000)]
Imported from archive.

* 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.

19 years agoImported from archive.
Jeremy Stanley [Thu, 25 Aug 2005 02:25:34 +0000 (02:25 +0000)]
Imported from archive.

* 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.

19 years agoImported from archive.
Jeremy Stanley [Fri, 5 Aug 2005 15:54:48 +0000 (15:54 +0000)]
Imported from archive.

* 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.

19 years agoImported from archive.
Jeremy Stanley [Sat, 30 Jul 2005 17:04:00 +0000 (17:04 +0000)]
Imported from archive.

* 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.

19 years agoImported from archive.
Jeremy Stanley [Thu, 21 Jul 2005 20:19:02 +0000 (20:19 +0000)]
Imported from archive.

* 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.

19 years agoImported from archive.
Jeremy Stanley [Mon, 18 Jul 2005 22:24:29 +0000 (22:24 +0000)]
Imported from archive.

* Initial commit of working project files.

19 years agoImported from archive.
Jeremy Stanley [Sat, 16 Jul 2005 22:22:13 +0000 (22:22 +0000)]
Imported from archive.

* New project.