Done in pre-release version. 1.7.4-alpha - added dotspeeddial for .p foo going to last number .p'd - fixed yell mode bugs stage (poses and escaped (>) stage poses to channel.) - added help text for > escape in Yell mode enabled msg. - fixed hilite status messages, especially empty case for "none" - fixed annoying wrap bug when line breaks are at wrap column. - added wrap width to player struct, .r# sets to width, .r toggles on and off, .r0 toggles off. - help system no longer crashes when a record with no | separator is encountered. - fixed parse bug that prevented .Pold=new from changing passwords. (1.7.4-beta) Done in pre-release 1.7.4b1 - added new ring_buffer struct for formatted pmsg histories but decided not to add histories due to privacy issues. - added testring and testhelp targets to test the ring buffer and help modules. - streamlined flags handling using token pasting - changed permissions and mode flag values to enums - added default enum value for player flags and removed explicit flag setting on player join. - minor parser simplification changes. - added testring and testhelp targets to test the ring buffer and help modules. - fixed buffer overflow in idle time formatting for 64-bit time_t implementations, would have triggered at hrs>999,999 (114+ years) - Rewrite parse.c for greater clarity and efficiency, implementing dynamic parser. - Fixed a bug whereby dynamic parser contexts were not marked as dynamic. (Corollary: dynamic contexts were never free'd) - Fixed a bug whereby restoring default parser only worked when active parser was dynamic. - Fixed a bug in default Parse table where CMD_BROADCAST2 selected broadcast instead of broadcast2 - Fixed a parser bug: set_max and set_main were swapped in the command table. - Fixed a bug in trie_collapse whereby the free_payloads flag was ignored. - Altered semantics of trie_match. - Merged trie_preorder/trie_postorder from an a side project. - Streamlined parser so that all non-speech actions (i.e., pose, stage pose) are commands In order of importance: - verify that all commands are in default parse table. - re-generate default lorien.commands - re-work yell mode and prelogon to use static parser contexts instead of custom parse logic. - verify that select() needread/etc. fd's are handled iteratively on each wakeup, not lowest line only then select again. - need a way to determine dead sockets? presently, sockets that have timed out hang around until the next time they are written. probably waking up from select periodically and, with nothing to do, attempting a non-blocking read from each socket will fix this. - consider adding channel feature where each channel can have a board enabled with an admin command that touches a rw history file, i.e. channels/Main enable will re-read the history file if it exists disabled with an admin command that mods file to ro on boot, lorien loads the rw files to initialize the ring buffer first line in the history file is the ring buffer size. no delete read command must allow to spwecify a range of msgs to read - fix HELP bug 20080903 whereby lines without | crash in sprintf. - warm reboot - per player toggle for timetimestamp output mode - .J to re-read motd - ops to list players' gags in finger info - ops to find who has a player gagged (.g#) - players to list own gags (.G no args) - .time ZONE tells time in ZONE - configurable flavor stuff and params - configurable periodic messages and interval - configurable quit msg array - ' to do automatic :'+s possessive pose, add s unless name ends in s. - multi-port listen - multi-channel membership? - registered users bypass bans? - open up registration (needs throttle to prevent abuse?) - save original hostname for admins to view. - put flags and privs printouts in .f info similar to hermit's. - timestamp mode (messages are stamped) - zmail? (use dbm?) send, list all, read all, erase all, delete one, read one - zmail sends to email address if one is registered (hidden from other users) so that they can get updates if they haven't logged in last 24 hours. vammy - message board? would need a ban list for abusers, or only allow registered users with permissions set. would require persistent user db. - persistent user db w/ ability for ops to modify user db, and saves state when users quit, disconnect or change names. o probably need to cache user record offsets with player struct for random access. o or, use mmap / munmap on an sorted idx file. o saving of all player settings, flags (and level) with password info. also creation date/host/uid, last login date/host/uid, last mod data/host/uid o consider using md5crypt with password info. o [don't!] change player database to dbm o if old file format found (by name) o create or open read/write new files. o if success, rename old file o if success, add old entries to new file. - "station identification" (random message file) - authd lookup (automatic) [ authd is out of vogue, probably should strike this] - Scripting language for feature configuration and re-load at runtime o dynamic parser configuration, using tree or trie for completion, accept any unambiguous truncation of full command name o turn most compile time options into scripted configuration settings with sane defaults. o command to interpret config commands over wire (req privilege) - command to turn off hostname completion? (instead of compile time option) - Asynchronous hostname completion per recommendation of Mike Long, establish socket without gethostybyname() command to turn off hostname completion (instead of compile time?) prefer async, risk is that the player will be gone before hostname completes. 1) on connect, zero a flag in the player struct (hostname_resolved) 1.5) consider searching current players by IP address address for a resolved hostname. 2) send the request to the resolver thread with the FD number of the player. 3) when a player leaves, send a cancel request for the lookup, keyed by fd. 4) when the resolver completes, send the response with the fd number ofthe player. 5) compare the player fd in the response against the (shadowed) readfds? 6) if not present in (shadowed) readfds, discard response. 7) otherwise, find the player whose fd matches and if (hostname_resolved) discard. 8) otherwise, apply the hostname and set the resolved flag. 9) *** consider using the IP address as series of words as a flag/key instead of hostname_resolved to avoid race conditions where a resolution is obtained as the main thread is issueing a cancel, and a new player has acquired the same fd but isn't resolved. - doing poll - doing (if onfromany enabled) - regex searching - dark fortress mode, change listener - mandatory comment in banlist as to why? i.e.: .banadd host=because so-and-so can't behave - change bans to be a tree? (performance) - change players to be an (dynamically allocated) array? (beware out of bounds) (performance) - mithlond-style clustering. - open up some ranges of ascii above 127 for international chars. - jabber gateway?