??/??/?? : 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

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

           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

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

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

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

            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

            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

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  

6/7/19      Ministry database can now be imported into the database
            Fixed up the reading of locks to be more accurate when

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

            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

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

            form action="post_cmd" name="confirmationForm" method="post">
               textarea name="post_data" class="text">Data
               input type="submit" value="Update" class="submitButton">

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

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

6/18/20     added @o for 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

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

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

             Implimented changes from mec project for formating of mushcode

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.