??/??/?? : Started changes file. Implimented ascii() and rewrote functions to be handle ansi escape sequences correctly. Implimented @mail Rewrote @find for memorydb. Searches are done are not single threaded, so the mush doesn't wait for the @find to finish before continueing on. The mush now caculates the cost of $commands and functions. Cost of running commands is 1 penny per 128 commands and 1 penny per 1280 functions. Manually typed in commands are free. evaluate() is no longer called on function arguements before calling the function. The function is now in charge of when/how evaluate() is called. While this will provide more consistent results, all functions will need to now be modified to call evaluate... and some will be missed. 12/01/18 : Implimented url() for use in @while. This will allow http/https connections. 12/10/18 : Removed honeypot code Removed code to split code into multiple files and patch back together again. 12/18/18 : Disconnects from websockets no longer crash the server sometimes. Implimented reloading of code at a subroutine level. Re-loading the whole file was taking 3-8 seconds. Implimented entities() for converting text to HTML entities and back again. 12/20/18 : Security has been tightened a little in respect to web and non-interactive websocket sessions. These sessions may only run $commands carried by othe webobject. You may now @trigger attributes with $commands. You do not need to control the object if you are @triggering a $command. This was implimented to help with the web/weboscket restrictions. ex/command has been implimented to just list $commands on an object. mget() should now work with mysqldb in a limited fashion. Implimenting @bad command. This will eventually be a db consistency check. 12/21/18 : Since the code only-reloads those subroutines that changed, line numbers for stack traces are now wrong. The code now figures out the correct line number in code() so don't call carp() directly. Cleaned up loading of perl modules. A mush $command may not call itself. Aka: infinite loops. @force is probably working better. 12/24/18 : Invalid web requests are now tracked and banned after 3 or conf.httpd_invalid times in an hour. 12/31/18 : Re-wrote the mush's scheduler to help tackle the problems with the invoker of commands being wrong. Luckily, this only broke everything. 01/02/19 : More fixing of the new scheduler. Commands can no be added to the top of the stack, next command, or at the end. 01/07/19 : setunion / setdiff added logoff time is now stored for memorydb 01/08/19 : ansi() wasn't evaluating its arguements. *.html page loads out of the txt folder now are prefixed with the standard httpd template. The exception is those files named *_notemplate.html. This allows me to use the template on more things like my online connect 4 game. 01/09/19 : Added lit() after Oleo pointed out it didn't exist. 01/10/19 : @trigger no longer evaluates args before splitting the parameter list. 01/11/19 : Rewrote @set and &attribute commands. Removed non-compatible '@set object/attribute = value' support and intentionally didn't add '@set object = attribute:value" support. Use &attribute version. balanced_split() should be used to parse text more accurately. Using regexps could match the wrong text when functions() are being used. @set, &attribute, @trigger have been updated. More to come Commands that a GUEST can use have been made more restrictive. @list flags has been updated to work on memorydb. Flags definitions should be removed from mysqldb. No need to duplicate functionality. @mail has been re-written to be mysql friendly. 01/14/19 : Logs are now written out to teenymush.web.log and teenymush.log for standard and web logs. Use conf.conlog and conf.weblog to specify the name for these files. 01/15/19 : balanced_split will now split a string in two at the specified delimiter. This will prevent the splitting of text into more then 2 segments and then re-joining the text via max_arg(). max_arg() has been removed. 01/16/19 : Fixed load issue by escaping out ":" when writing the glob pattern to a flat file to prevent truncating of the pattern during re-load. Sections of the database is no longer mime encoded. Keeping the database in "plain text" will make the file more readable. Returns and semi-colons are now converted into dec 23 and 24. 01/25/19 : A mush flat file database can now be loaded into an existing TeenyMUSH database. Dbref's will be re-numbered as needed but not within the softcode. I may go further on this but the interest was to load an old 1994 database from a MUCK/MUSH called QuartzParadice. 01/29/19 : @bad fixes a few more things @toad now loops through the db in 100 object segments to be nicer to things still running. @toading and @destroying now does more then just deleting the object in question. Such as moving things out of destroyed rooms, deleting exits, etc. @boot supports dbrefs now. v() no longer evaluates what it returns. &attribute sets were not being evaluated when coming from mush code after the rewrite, fixed. 01/30/19 : -28F is to cold to code 01/31/19 : Implimented @wait. This required spin() to be updated to allow "backgrounding" a command. Commands after the @wait will be run right away instead of waiting (like @sleep does). Implimented semaphores (@dolist/notify, @notify, @drain). Currently, semaphores may not be triggered on other objects. @dolist was running commands in the wrong order again, fixed. validate_switches() and verify_switches() were doing the same thing. Removed validate_switches(). 02/03/19 : Implimented stat() and mod(). 02/04/19 : Implimented @wipe. Commands that result in a huh? are now echoed if the object is set VERBOSE. 02/05/19 : Implimented the follow functions: trim, escape, fullname, strmatch, stats, mod, filter Fixes to @dig and @link. The previous 5 days of coding allowed my mush coded implimentation of dijkstra's shortest path algorithm to work. Yay! This should also include the work done on importing an old database which gave me enough rooms to need to get shortest paths. 02/06/19 : Fixed bug in find_in_list() when nothing is given to look for. 02/17/19 : Removed the old help from the definition of @commands. 02/26/19 : Removed wttr.in specific character translation used in url(). The character translation is now handled by edit(), and chr(). Implimented null(), args(), shift(), ord, asc() and chr(). Say/Pose now convert Farenheit <-> Celcus on the fly. 02/27/19 : Implimented pop(), push(), and unshift() Matching on partial names improved. 3/18/19 : Optimized @while so it will only run if there is pending socket data if there is a open socket. Implimented pid(), and lpid() 3/19/19 : Minor tweaks to find_in_list() 3/25/19 : u() was incorrectly converting multiple line text into single line text and was eating spaces at the end of lines that it shouldn't have been. Changed to use single_line() function. Edit() now trims some of it's input variables. 3/29/19 : @info{socket_buffer} is supposed to contain the last mush based socket transaction for debuging purposes. Unfortunately, it was containing *ALL* transactions. This has been fixed. 4/01/19 : Don't run commands/functions if the object has been destroyed. Edit() was trimming the to variable to make up for poorly formated code. This has been removed. 4/15/19 : You may now rename yourself to the same name but with a different case. Minor tweeks to examine to show less information when your examining objects in other locations. Changed how used dbrefs are found in a memory based db. @delete now keeps track of dbrefs and this list is only redone at startup and reload of code. Searching for dbrefs are no longer done on a routine basis. @quota has been written. Wow, thought this one already existed. @bad does simple sanity checks on quota now. create_object now sets quota properly for players 4/16/19 Only dump valid objects, "obj_" attributes are now dumped first leaving user defined attributes last for readability. Implimented %p / %P. All new players get locked to themselves. @toad wasn't removing the player name from @player. 4/17/19 Removed non-printable characters from the log. 4/25/19 Implimented html_strip(), which should remove all/some html tags from a string while leaving the normally readable text. hostnames are now 30% more fuzzy if the domain name only has two elements. %K is now supported 4/26/19 obj_lastsite is now limited to 20 entries 4/29/19 Implimented say/noeval, fdiv() 4/30/19 Implimented round(), if(), ifelse() 5/2/19 @dolist needs a new "environment" when invoked by a player. @dolist when invoked from a $command/^listen should use the same environment. Thanks Oleo for pointing this out. 5/3/19 If a $command is issued, only one match will be made. Search order is now: object, object contents, master room, and object's location's contents. However, Multiple matches will be allowed in the player's location's contents. This departs from standard TinyMUSH behavior but is i believe the more secure and efficient answer. This will prevent players snooping in on commands sent to global room objects or commands on a player or its contents. The search order will allow players to over-ride master room commands unless conf.master_room_override is set to no. 5/8/19 Expanded ansi() to support rgb values for 256 colors balanced_split fixed to not split in the middle of an escape sequence. Implimented %q and %! substitution, pickrand(), lrand() last() was not evaluating its arguements correctly. iter() now supports @@ as an output delimiter to match mux behavior. 5/9/19 Implimented inum, itext, and ilev functions Functions: inum, itext, ilev Substitutions: %%i0 .. %%i9 5/10/19 Multiple C -> F (vice versa) are now done instead of just one as suggested by Kilgore. Code reloading problems: 1. Reloading all code can take to long for a single command. TeenyMUSH gets around this by only reloading subroutines that have changed. 2. Selectively reloading code causes line numbers in stack traces be wrong for any function not reloaded. TeenyMUSH gets around this doing math on output from code() so they're correct. 3. Non-reloaded subroutines will show up as tinymush.pl and the little math trick in #2 won't work. Problem #3 was never caught as the line numbers coming from code() were usually right and only sometimes wrong. The fix for this is to reload all code at startup so all future code reloads will be right. There is a slight performace hit but the real performance issue that was trying to be solved was only during the running of mushcode. I.e. the call of @reload. Fixed invoker error when using the go command. An extra space was introduced on single character commands as pointed out by Kilgore. This has been fixed. 5/13/19 Added listinter() @dolist was looking at the $prog level for where the source of a command came from but it should have been looking one level lower at the command level. Fixed. trim() now supports trim type and chars to be trimmed as per MUX/Rhost. This also now supports triming of ansi sequences. Fixed Celcius to Fahrenheit converter typo of 31 instead of 32. A substr() was starting at 1 instead of 0 as well. Fixed some space eating issues in several functions. 5/14/19 Implimented an internal function called ansi_match. This will allow the preservation of escape codes when matching using glob patterns. Switch() now uses this. Added full lnum() compat. 5/20/19 Added ldelete() Extract is now word based to be more complient with TinyMUSH. 5/21/19 Fixed bug in ansi_match(). Looked at wrong variable to say when to quit matching. Extract now strips leading/trailing spaces to be more compatible with TinyMUSH. Edit() now follows rhost syntax. 5/22/19 Implimented: setr() add,sub,div,mul support taking in simple hex values 5/23/19 Implimented $@ in iter()/citer() Implimented global functions via @function. Setting attribute flags were set in the wrong case, fixed. The last few days of changes allows Ashen-Shugar's gradient function to work. yay! Outside of printf(). 5/29/19 #0/conf.hostmask now controls how hostnames are displayed. Values are mask, colormask, or color. 6/3/19 edit() now preserves escape sequences when editing. It will only preserve the initial sequence and not any changes after wards. 6/4/19 escape() is now escape sequence friendly. @set and @var now allow appending: ie: @set me/attr += text say will now pull in people's name() if a person's name is said. This will result in correct capitization and any escape sequences. ## in iter / @dolist is now handled at the evaluate_subsitution level. This might be bad? mush escape() function is now escape code friendly space_split now optionally takes a flag which prevents filtering out of spaces. ansi_remove() is now called on the results from conf.httpd_template. 6/7/19 Ministry database can now be imported into the database Fixed up the reading of locks to be more accurate when importing. 6/11/19 Added /var switch to @ps Fixed up attr.h definition by specifying VA - VZ and ZA - ZZ Removed attribute flags? from the import db processes I.e. ^A60:0:Text Implimented @big to tell you which are the biggest objects. 7/1/19 Removed extra messages when going home. Removed initial "\" character when command comes from a mush command. Fixed crash when a single non-existant command was issued. 7/25/19 Implimented @capture to capture the output from command(s) and then @trigger a user defined attribute with %1 as the output from the command. 9/30/19 I haven't been updating this, so I'm trying to get back into the habbit. Mysql is out. This section of the code hasn't been updated as often as it should be... so it has been removed. That eliminated roughly 3k lines of code. Starting up now uses absolutely no config files. This really is only bad for which ports are being used as ports are never re-initialized. Use './teenymush.pl -Doption=value' to set these before starting up. Config options are now handled via conf() instead of @info. The data no longer needs to be cached for mysql. 10/1/19 Escaped out commas in escape(). Player lookups on @player now remove ansi text. 10/3/19 Help now correctly deals with different case when reading it's help file. Ansi characters are now stripped when looking up a topic. Player is now notified of invalid entries. Added @wall. home no longer quietly ignores arguements. 10/7/19 Attributes now record creation and modification times. Added attr_created(), atr_modified() and ex/detail to provide access to the times. 10/8/19 Reworked how ## and others are handled for more consistent behavor. ## seems to be replaced when @dolist/iter hands off to be run/evaluated in standard MUSH. This causes problems when there are special characters within the output of ##. My new answer is to put ## into a variable and handle it when evaluate_ substitutions() is called. This seems to make @dolist / iter() do what you'd expect and may not break much? Lets see. @dolist now completes after all commands have been run, not after it has submitted the last one. 10/9/19 Implimented passwordless running of MUSH commands from the command line. See god.sh for details. 10/14/19 Added hash table support to attributes via: &attribute.subattribute object = value get(object,attribute.subattribute) keys(object,attribute) 10/18/19 Implimented simplistic http HEAD requests 10/21/19 pose now does colorization of names. 10/22/19 If a http call invokes a command, all commands are run as the webuser object. All name() looksup of the webobject for those commands will return the hostname of http caller. This should provide a little more information to connected players. Player names within say/pose will only be colorized if they are in the same room and are connected or last connect was within the last 7 days. 10/29/19 @search, @big players 10/31/19 #master will now match the master room. Example: ex #master 11/7/19 @ps now lists the object running the command instead of just the owner. 11/12/19 Hash table support has been changed to: &attribute:subattribute object = value get(object,attribute:subattribute) keys(object,attribute) lattr(object) ex object/attribute:subattribute Fixed storing hash table attributes as hashtables instead of plain old attributes. @function has been fixed. Fixed a crash when a single character command is issued. 11/13/19 You may only enter objects you own or are set ENTER_OK even if you are a wizard/god. All calls to mush commands/functions are now passed in the dbref of the object instead of a hash table of data which also contains the dbref. This will expose the dbref of the object running the command in stack traces. Fixes to necho() and cmd_doing were needed to correctly handle this. 11/20/19 Split off verbose echoing into its own function. Variables can now be set without using @var. ex: %{variable} = test 12/5/19 Implimented safemode to prevent all mushcode from being run. This can be enabled at startup via -Dsafemode or by setting the conf.safemode attribute on #0. safemode will stay in effect until the restart of the server or the attribute is removed unless safemode is set to anything other then 1. Otherwise it will persist till the attribute is removed. 12/10/19 Implimented help() and lhelp() 1/13/20 parse_switch was dropping switches when it ran against a command more then once. Looping commands like @dolist, @while, etc run more then once. parse_switch now exits before running twice with previous results. @dolist wasn't evaluating ## when invoked by a player when typing in the command. Fixed. 1/15/20 Support for POSTing data back to the MUSH via the web server is complete. Form data will be availible via an %{variable}. Below is a simple html and mushcode to tie into the form. Each line of html will require a "<" prefixed to allow proper functioning. form action="post_cmd" name="confirmationForm" method="post"> textarea name="post_data" class="text">Data input type="submit" value="Update" class="submitButton"> /form> &post webobject = $post_cmd:@pemit %#=%{post_data} 1/15/20 - Added safemode startup option to prevent running of any 4/29/20 commnds coming from objects. Added master_override configuration option. This causes the master room to be searched first to allow the master room to override any in game commands. Added Graph() function to display the connected users per day over time. @parent was added. functions added variables() / lvariable() - list those variables set by the @variable command. password() - god/wizard only function to check checks to see if a password is correct or not. This is needed to allow admin type configuration in the web server. list() s() default() Various big fixes 5/01/20 Added @restore Added info() to return data out of @info 5/04/20 calculate_login_stats() now stores data in #0/stat_login to allow it to survived reboots. 5/20/20 Added basic framework for auditing interesting commands to a teenymush.audit.log for later review. Auditing can be turned off with the conf.auditlog attribute on #0. More auditing will be added later. Audited commands: @toad, @boot, @nuke, @perl, @shutdown, @force of objects not owned by the owner. You can now examine player/lastsite ansi_substr() can now substr strings and return the text of the result minus any ansi codes. This should be faster then calling an ansi_remove() on the result. Code has been added to prevent setting of flags on objects that shouldn't have the flag. I.e. Players can be wizards but not objects. This should be expanded later for all those flags that need it. 5/27/20 DOING now evalates a person's @doing in readonly mode. I.e. No changes to the DB are allowed. Readonly mode can also be invoked with the readonly() function. This may be later removed. Added @ping for determing what is running a $command. 5/28/20 Added encrypt() and decrypt(). These are functionally the same as TinyMUSH/Rhost. default() was written but not callable. center() was not evaluating its arguements at the right location. Added inc(), starttime(), orflags(), strtrunc() 5/29/20 Added findable(), power(), dec(), conn() 5/30/20 Added bor(). List was echo()ing to $self instead of the enactor. Fixed. lwho() now sorts dbrefs via connect time to be consistent with TinyMUSH. Added zone() and haspower() place holder function. 6/7/20 Add convtime() 6/10/20 Added full switch to @last and fixed issue formating caused by ansi color sequences. 6/12/20 Destroying object gives money back. Rewrote/simplied @dig 6/13/20 Rewrote how obj_quota is handled. Format is max_quota,used_quota. @bad will recalculate used_quota. 6/14/20 Fixed initial db wasn't creating the initial room. 6/15/20 @dig/quota rewrite was buggy, fixed. ansi_trim() was passing the end position to ansi_substr() instead of the number of characters. 6/16/20 Added alias for #web (conf.weboject), #starting (conf.starting_room). Updated default login screen to correct syntax. 6/17/20 Startup db now setups up the httpd objects to allow a very simple default web page. HTTP still needs to be enabled with &conf.httpd #0 = port. The webuser no longer needs any money to run anything and may not be logged into. The motd is now evaluated by #0 in readonly mode. This should prevent any bad wizards from putting in something questionable. 6/18/20 added @ofor take, drop, move, and look. Added xget alias for get. god.sh now grabs port number from dump directory and verifies that it is in the right directory to prevent accidently running against the wrong instance. Added @missing command to help determine missing functions and commands. Turned off the echoing of missing functions to the console. Added @motd 6/19/20 Database dumps are now incremental. 6/22/20 Incremental backup fixes Startup db fixes when a new database is created. The mush port can now be given a list of ports to try. Useful when having two instances and starting up without a DB. Reworked how multiline attributes are set. 6/29/20 host_filter may now contain wild cards Added module_enabled() for readability when checking if modules are enabled. 7/04/20 Impliemented adisconnect. 7/08/20 @reload now takes an argument on which subroutine to reload. Connecting twice no longer sends the output from all commands to all sockets. The exception is commands which should go to both like says, takes, drops, etc. Implimented create() and reworked @dig, @create, @link for non-duplication of code. Added more tests. Added empty() for testing for empty strings. When is an empty string not empty? When it contains ansi color sequences. find() now searches for all exact matches and then falls to the first partial match. 7/09/20 Implimented @edit 7/13/20 find() no longer is confused by ansi strings preventing valid matches. @switch updated to use newer bsplit instead of get_segment2. get_segment2 removed. Implimented edefault() rewrote cat(). Now uses ansi_trim to trim spaces. 7/14/20 Implimented tmshell. If teenymush is renamed to tmshell, the script will run any command provided via the command line and then exit. This allows you to run mushcode via the command line. This does not allow you to run code against an already running server. Use god.sh for that. Keep in mind that the server will still maitain its database. The initial db is now created and instantly @dumped. Originally it was created and then later @dumped when the server was fully running. This should resolve some issues with the incremental backups. 7/15/20 Implimented map(), secure(), ulocal(). Mush_address() is no longer cached on startup for tmshell for a speed increase. Various bug fixes. 7/16/20 Implimented variable memory limits on anything that touches $$prog{var}. This is controled by conf.memory_prog_limit. 7/23/20 Implimented regedit() 7/24/20 @halt now takes a pid or dbref. 7/22/20 Implimented brief as per Kilgore 7/28/20 Implimented @debug Duplicated code for ansi_match() in @switch 7/31/20 Incramenetal backups are now always appened to the last full backup. Changes are: No seperate process for loading "archive" logs. remove single_dirty_dump configuration item. load_db process will now read the single co-mingled file. @dirty now appends only to the last backup file. tmshell - no longer writes or reads from dump folder, only reads from the current directory. This should be more consistent with an even smaller footprint that tmshell needs. @bad now fixes the obj_contents with the object's current location if it some how is out of sync. 8/1-8/14 Dumps of incramental backups are now done in the background and do not pause the MUSH. It probably wouldn't have before but now it will have an even harder time. Missing Modules no longer give warning when running as tmshell. Any modules that are missing are probably not needed when run without any real networking. 8/16/20 tmshell has been changed. TeenyMUSH now supports storing the db at the end of the script. The only requirement is that a "__END__" needs to be between the code and the appended database. Once the code detects the database inside the script, the script will enable tmshell. Any data changes within the database will be appended to the end of the script using @dirty_dump. @dump will load the script into memory, erase the script, and then write a full database dump after the script. These changes will allow single file mushcoded scripts with the script name of your choosing. finding free dbrefs can now be done in the background as needed without pausing the db. 1/8/21 Rewrote balanced_split. Differences are: 1. If a parse error is detected after scanning to the end of the string, balanced_split will now go back to the last unpaired ( or } and reset itself to its state before it hit the ( or { and ignore the character as well. If this does not end up resolving the error, it will try this procedure again. This should result in splitting strings up that is more in line with TinyMUSH. 2. Balanced split is now ansi aware. Various other fixes 1/12/21 ansi_init() no longer does character by character escape code searches if the string doesn't contain any escapes. This should be a decent performance increase on strings without escape codes. 1/13/21 Re-wrote ansi_init() to loop through the escape sequences instead of character by character. This made a modest improvement in speed. A loop in which a file was processed 1000 times went from 19 seconds to 9 seconds. This change invalidates the need for my previous changes the day before. Balances_split now uses % as an escape character unless its part of a %{variable}. 1/21/21 Fixed websocket disconnect issue on login. If statement was incorrectly testing for if it was a websocket and sending websocket regular data. Fixed evaluation and return issue on login screen. Login screen should always be evalated to allow for adding functions(). Code now verify there is a return or not at the end of the login txt. Renamed txt folder to files as the folder could contain non-txt files. Moved grapenut's websocket client inside the database and allowed gets of .css/js/_raw.html to bypass the standard template. This is in promotion of the theory that if its not in the database, its not being backed up. Next move 99% of the code inside the database? 1/26/21 Ban hacking RDP mstshash requests. 1/27/21 Rewrote the complicated mess that was necho. Its a effort saver to have a single echo() that can just figure out where stuff goes but it got to be to much of a hot mess. echo() is/will be the replacement and doesn't seem to suffer from all the messy oddities of where things go if the wind is blowing one way or the moon is a frog. 1/29/21 Close SOCKET_INPUT @telnet sockets if they've been open for more then a minute. These should be short duration connections. SOCKET_PUPPET should be used for long duratino connections? 2/2/21 The good_args() function now allows an zero as a valid arguement count. The ballanced_split function always returns at least an empty array which was confusing good_args(). @switch/regexp has been fixed. Ansi sequences will not be supported and will be removed from %{m0} - %{m9}. Matching on a string that containing ansi squences is beyond what i'm willing to code at this point. The files function now caches file reads. Files not read for three days will be deleted upon the next call of the files function. 2/3/21 http_reply_simple now takes an argument of FILE & filename to send out the data inside the file. This allows the last-modified date to be accurately passed. created http_timestamp which returns time in a http friendly format. Implimented changes from mec project for formating of mushcode attributes. 2/10/21 Removed the http banning code as it didn't seem to be working and went with a much simplier version that just bans based upon script scanning based hacking attempt. Bans are now inplace till the server restarts. 2/11/21 Fixed WHO not working when not connected. echo didn't allow for sending output to non-connected non-http connections. 2/20/21 Sockets that have connected but not logged in or in the process of disconnecting were getting all output instead of just the input directed to them. I.e. all "has disconnected" messages were going to the person disconnecting instead of each thing in the room. 'Fix' on 2/11/21 caused the problem. Fixed. [ Didn't update this file, stuff skipped ] 11/15/21 TeenyMUSH now runs the process queue all the way through instead of however far it gets before restarting at the begining. Eventually everything should have gotten run but in theory it may not. 11/16/21 TeenyMUSH now runs programs in order to protect against spaming the queue. Take this simple example: &foo me=$+command: &funky me=1; @switch 1= 1,{ @pemit %#=Funky: [v(funky)]; &funky me = 2 } The intent of this $command is to do a @pemit of Funky: 1. But if you do a @dolist lnum(3)=+command with TinyMUSH, you get: Funky: 1 Funky: 2 Funky: 2 TeenyMUSH will now always give an answer of: Funky: 1 Funky: 1 Funky: 1 This will cause the MUSH to do what is expected by the user and not have to worry about writing nasty mushcode to fix this. 11/22/21 The fixes against spamming the queue only partially worked. Reworked them using a centralized locking routinues. i.e. serial_canuse, and serial_delete 11/29/21 Introduced an initial --standby mode. This will allow the creation of a standby instance that will stay in sync with the original db. This is a work in progress. 12/3/21 eval() is evaluating strings twice and i don't believe that is the correct behavior. Its now only evaluating it once. 12/12/31 Introduced conf.talker. This will prevent the running of mush- code and evaluation of strings. The exception is when you look at an object as to allow descriptions to still be useable if they are coming from a non-talker instance.