EPIC5-0.1

*** News 01/26/2005 -- Notes for forward compatability
			*** /SET -CREATE DEPRECATED ***
	EPIC5-0.0.3 includes /SET -CREATE, but this is deprecated, and will
	be removed by EPIC5-0.0.5.  It is suggested that you start using
	$symbolctl() [see below] in scripts that support EPIC5-0.0.3 and up.

			*** THINGS ARE GOING TO BE CHANGING ***
	Starting before EPIC5-0.0.5, there will be a signficant shift to try
	to script as many /set's and builtin commands as possible.  This
	stuff is all intended to be put into the 'builtins' script which is
	loaded from 'global' (ie, it's automatically loaded).  Some of you do
	not load 'global' and so by EPIC5-0.0.5, if you do not load builtins,
	you will find a lot of features gone.  I won't consider this a "bug",
	but the natural progression of EPIC5's development...

	Builtin commands that will be moved to 'builtins'
		/BYE		/DATE		/EXIT
		/HOST		/IRCHOST	/IRCNAME
		/LEAVE		/REALNAME
		/SIGNOFF

	Builtin functions that will be moved to 'builtins'
		$serverhost()

	Builtin SETs that will be moved to 'builtins'
		AUTO_REJOIN	AUTO_REJOIN_DELAY	AUTO_UNMARK_AWAY
		AUTO_WHOWAS	NUM_OF_WHOWAS		BEEP_ON_MSG
		COMMAND_MODE	FULL_STATUS_LINE	REVERSE_STATUS_LINE
		SHOW_CHANNEL_NAMES		SHOW_END_OF_MSGS
		SHOW_WHO_HOPCOUNT		VERBOSE_CTCP

*** News 01/25/2005 -- New built in function, $symbolctl()
	Here's the plan.  An all-encompasing low-level symbol manipulation 
	thingee.  This interface is not intended to replace $aliasctl(), but 
	rather to supplement it.  No, $aliasctl() will never be removed.  
	Yes, much of its functionality (but not all) is duplicated here.

	$symbolctl(TYPES)
	     Return all of the types supported in this version of EPIC:
	     ALIAS		ASSIGN			BUILTIN_COMMAND
	     BUILTIN_FUNCTION	BUILTIN_EXPANDO		BUILTIN_VARIABLE

	$symbolctl(PMATCH <type> <pattern>)
	     Return all symbols of type <type> that match <pattern>.  You can 
	     use the special value "*" for <type> to get symbols of all types.

	$symbolctl(CREATE <symbol>)
	     Ensure that <symbol> exists in the global symbol table.  When 
	     symbols are first created, they do not contain any actual values, 
	     but rather act as a placeholder in case you want to set any.  
	     You must ensure that a symbol exists before you try to change 
	     its values.  CREATEing a symbol that already exists is harmless; 
	     feel free to do it.

	$symbolctl(DELETE <symbol>)
	$symbolctl(DELETE <symbol> <type>)
	     Delete all of the values of a particular symbol, or just one type.
	     Example: $symbolctl(DELETE booya ALIAS) is the same as 
				/alias -booya
	     Warning: You can delete built in variables/functions/etc with this!
		      There's no way to restore them back if you do!  Caution!

	$symbolctl(CHECK <symbol>)
	     Inspects <symbol> to see if it has any values left.  If there are 
	     no values left for <symbol>, it is removed from the global symbol 
	     table.  You must then CREATE it again if you want to use it later.

			*** IMPORTANT NOTE ABOUT "LEVELS" ****
	In order to "get" or "set" a symbol's values, the symbol needs to exist.
	If you try to "get" or "set" a symbol that doesn't exist, $symbolctl() 
	will return the empty string to tell you that it failed.  You need to 
	use the CREATE operation above to bootstrap a new symbol before using 
	it.

	Now, /STACK PUSH and /STACK POP work by manipulating "levels" in the 
	symbol table.  By rule, <level> == 1 always refers to the "current" 
	value of a symbol.  If you do /STACK PUSH, then the value you pushed 
	will be copied to <level> == 2.  If you /STACK PUSH something else, 
	that values moves to <level> == 3.  So what you can do is use 
	"GET x LEVELS" to find out how many levels a symbol has, and then use 
	"GET x <num>" to find out if there is a symbol type that interest you 
	at that level.  IN THIS WAY you can directly manipulate the /stack push
	values without having to actually use the /stack command.

	In general, <level> is always 1 for everything you want to do, unless 
	you are intentionally monkeying around with your /stack values.

		 *** NOW BACK TO YOUR REGULARLY SCHEDULED HELP ***
	$symbolctl(GET <symbol> LEVELS)
	     Return the number of levels of <symbol> that are /STACKed.  This
	     value is always 1 unless you have /STACK PUSHed something.
	$symbolctl(GET <symbol> <level>)
	     Return all of the <type>s that are defined for <symbol> at <level>.
	     If <level> is 1, it gets the current value(s).  If <level> is > 1,
	     it starts looking at the /STACK PUSHed values.

	$symbolctl(GET <symbol> <level> ALIAS VALUE)
	$symbolctl(GET <symbol> <level> ALIAS STUB)
	$symbolctl(GET <symbol> <level> ALIAS PACKAGE)
	$symbolctl(GET <symbol> <level> ALIAS ARGLIST)
	     Retrieve one of the values for one of your aliases

	$symbolctl(GET <symbol> <level> ASSIGN VALUE)
	$symbolctl(GET <symbol> <level> ASSIGN STUB)
	$symbolctl(GET <symbol> <level> ASSIGN PACKAGE)
	     Retrieve one of the values for one of your assigns

	$symbolctl(GET <symbol> <level> BUILTIN_COMMAND)
	$symbolctl(GET <symbol> <level> BUILTIN_FUNCTION)
	$symbolctl(GET <symbol> <level> BUILTIN_EXPANDO)
	     Returns 0 if these types are not in use (ie, if there is not a 
	     built in command), and returns non-zero if there is.  If you're 
	     smart, you won't try to do anything with the non-zero value.

	$symbolctl(GET <symbol> <level> BUILTIN_VARIABLE TYPE)
	$symbolctl(GET <symbol> <level> BUILTIN_VARIABLE DATA)
	$symbolctl(GET <symbol> <level> BUILTIN_VARIABLE BUILTIN)
	$symbolctl(GET <symbol> <level> BUILTIN_VARIABLE SCRIPT)
	$symbolctl(GET <symbol> <level> BUILTIN_VARIABLE FLAGS)
	     Retrieve information about a /SET.  
	     The "TYPE" is one of "STR", "INT", "BOOL", or "CHAR"
	     Generally, either "BUILTIN" or "SCRIPT" is set, but not both.

	$symbolctl(SET <symbol> <level> ALIAS VALUE <string>)
	$symbolctl(SET <symbol> <level> ALIAS STUB <string>)
	$symbolctl(SET <symbol> <level> ALIAS PACKAGE <string>)
	$symbolctl(SET <symbol> <level> ALIAS ARGLIST <string>)
	     Change one of the values for one of your aliases.  If you omit
	     the <string>, it will clear the value.

	$symbolctl(SET <symbol> <level> ASSIGN VALUE <string>)
	$symbolctl(SET <symbol> <level> ASSIGN STUB <string>)
	$symbolctl(SET <symbol> <level> ASSIGN PACKAGE <string>)
	     Change one of the values for one of your assigns.  If you omit
	     the <string>, it will clear the value.

	$symbolctl(SET <symbol> <level> BUILTIN_VARIABLE)
	     Create a new user-created /SET with default values (type == BOOL,
	     data == OFF, script is <empty>.)
	$symbolctl(SET <symbol> <level> BUILTIN_VARIABLE TYPE <set-type>)
	$symbolctl(SET <symbol> <level> BUILTIN_VARIABLE DATA <string>)
	$symbolctl(SET <symbol> <level> BUILTIN_VARIABLE BUILTIN)
	$symbolctl(SET <symbol> <level> BUILTIN_VARIABLE SCRIPT <code>)
	$symbolctl(SET <symbol> <level> BUILTIN_VARIABLE FLAGS)
	     Change one of the values for one of your /set's.  You cannot 
	     change values for system /set's, sorry.  Setting the TYPE value 
	     changes the DATA value to a default (<empty> for strings, 0 for 
	     everything else) so always set DATA after setting TYPE. 
	     Yes, you can change the TYPE of a /set after you create it!
	     It's probably a bad idea to set FLAGS for the present.

*** News 01/13/2005 -- New $logctl() feature, $logctl(CURRENT)
	$logctl(CURRENT) can return one of these values:

		-1	Nothing is being logged right now
		 0	Something is being logged to the global log, or to
			a window log
		>0	Something is being logged to the given log refnum.
			You can use this log refnum with $logctl().

*** News 01/11/2005 -- New /ON, /ON NEW_NICKNAME
	This allows you to create your own nickname mangler whenever EPIC
	is resetting your nickname to register to a server.  Remember that
	your nickname is (usually) not reset if /SET AUTO_NEW_NICK is ON, so
	you need to /SET that to OFF before this can be used.

	Each time that your nickname is "reset" (see next entry), the
	/ON NEW_NICKNAME hook will be thrown.
		$0 - Server whose nickname is being reset
		$1 - Your current nickname ("*" if you're unregistered)
		$2 - The nickname you tried to change to ("*" if none)
	You should somehow use this information to generate a new nickname
	and then do a /NICK <newnick> operation.  You should avoid trying
	to do anything else, particularly asynchronous things like /wait,
	because the status of the connection is unknown when this /ON is
	thrown (ie, you may not be connected).  Just stick to /NICK.

	If you do not hook the /ON, or you do not do a /NICK within the
	/ON, then epic will prompt you for a new nickname in the way it
	has always done (so this change is opt-in and backwards compatable).

*** News 01/11/2005 -- Changes to how nick change errors are handled
	Until this point, EPIC sometimes (rather aggressively) forced the
	user to provide a new nickname, when it wasn't necessary.  This 
	was called "resetting" the nickname.  The variable /SET AUTO_NEW_NICK
	existed to try to avoid needlessly annoying the user with requests
	for nicknames when a new one could be whipped up.

	Well, anyways, this has all been refactored.  If you are already 
	connected to the server, epic will no longer "reset" your nickname 
	when it recieves one of the many numerics that indicate that your 
	nickname is not acceptable.  "Resets" will only occur when you are
	unregistered (when you do not have a nickname yet).

	As with before, if you have /SET AUTO_NEW_NICK ON, then your nickname
	will never be "reset" unless the nickname mangler is unable to come
	up with an alternate nickname for you.

*** News 01/11/2005 -- Change to how /set new_server_lastlog_level works
	In EPIC4, when you do /window server, the window that is changing
	server has its window level changed to /SET NEW_SERVER_LASTLOG_LEVEL.
	This can result in two windows with level ALL if the new server can't
	be connected to.  Starting with now, this change will not occur until
	after we have registered with the server (when we get the 001 numeric).

	This means if you do /window new server foo.com, that the new window
	will be level NONE until the connection to "foo.com" is successful.
	Furthermore, only the "current window" for "foo.com" will be changed.
	If you move multiple windows to a new server at the same time, only
	one of them is the "current window" and only that window ever has
	its window levels changed.  The others stay at "NONE".

*** News 01/06/2005 -- Can now set ipv4/ipv6 vhosts separately
	The /hostname (/irchost) and -H command line option may now take 
	two hostnames, separated by a slash.  Example:

	/hostname foo.bar.com		Use "foo.bar.com" as the vhost for 
					both ipv4 and ipv6
	/hostname foo.bar.com/faz.bar.com
					Use "foo.bar.com" as the vhost for
					ipv4, and "faz.bar.com" as the vhost
					for ipv6.
	/hostname foo.bar.com/		Use "foo.bar.com" as the vhost for 
					ipv4 only -- don't change the ipv6
					vhost
	/hostname /foo.bar.com		Use "foo.bar.com" as the vhost for
					ipv6 only -- don't change the ipv4
					vhost

*** News 01/06/2005 -- New serverctl attr: $serverctl(GET <num> ADDRFAMILY)
	The $serverctl(GET <num> ADDRFAMILY) value returns either
		ipv4		if the server connection is ipv4
		ipv6		if the server connection is ipv6
		unix		if the server connection is a filename

*** News 01/06/2005 -- Old (undocumented) function: $servports()
	There has been a function $servports() around for a very long time,
	but it's never been documented.  It returns two values, the first
	one is the remote port (what you connected to the server with), and
	the second one is the local port (which is not always useful).

*** News 01/01/2005 -- Argument lists for hooks, and $fix_arglist() (howl)
	$fix_arglist(arglist) returns how argument list arglist will be parsed
	by epic.

	It is now possible to supply argument lists to hooks, just like
	one would do for aliases:
	/on hook "*" (a,b,...) {echo $a $b $*;};

	They are optional, of course.

	/ON lists the argument list as part of its output, and does also include
	the hook's userial (unique serial)

*** News 01/01/2005 -- New function: $hookctl() (howl)
    This function presents a low-level interface to the /on system

    === ADDING AND REMOVING HOOKS ===
    $hookctl(ADD [#][!][']<noise><TYPE> [<serial>] <pattern> 
							[(<arg list>)] <code>)
	Compare this to:
	   /ON [#]<noise><TYPE> [<serial>] [!]<pattern> [(<arglist>)] <code>

	Where [#] is used to indicate a <serial> number should be used,
	where [!] is used to indicate that the ON is a "negative" ON
	where ['] is used to indicate that the ON is a "flexible" ON
	where [<noise>] is one of "?", "^", "-", "+", "%", or nothing.
	where [<TYPE>] is one of the ON types (ACTION, MSG, PUBLIC, etc)
	where [<serial>] is the ON's serial number (NOT the refnum!)
	where [<pattern>] is the ON's wildcard pattern (the "nick") that is
		matched against $* each time the ON is checked
	where [<code>] is the ircII code that is executed each time the ON
		is run.

	ADD registers a new /ON and returns the /ON's new <refnum>.  This
	<refnum> can be used in other $hookctl() operations.

	Example: $hookctl(ADD ^MSG * (nick, msg) {echo msg from $nick: $msg})
	   is the same as
		/ON ^MSG * (nick, msg) {echo msg from $nick: $msg}
	   except it returns the new /on's <refnum> (of course).

    $hookctl(REMOVE <refnum>) 
	Delete the given /ON.  If <refnum> is -1, it removes the currently
	executing /ON.

    === WORKING WITH THE ONs YOU'VE CREATED ===
    -- In these GET HOOK operations, the values in <> are the values that
       were originally provided to the ADD operation (or the /ON command)
       <Refnum> is always allowed to be -1, and refers to the currently
       executing /ON.

    $hookctl(GET HOOK <refnum> ARGUMENT_LIST)
	Return an /ON's <arglist> if it has one.

    $hookctl(GET HOOK <refnum> FLEXIBLE)
	Return 1 if /ON was created with ['] (flexible -- <pattern> is 
		expanded each time the /ON is checked)
	Return 0 if not.

    $hookctl(GET HOOK <refnum> NICK)
	Return an /ON's <pattern>.

    $hookctl(GET HOOK <refnum> NOT)
	Return 1 if /ON was created with [!] (negative on)
	Return 0 if not.

    $hookctl(GET HOOK <refnum> NOISE)
    $hookctl(GET HOOK <refnum> NOISY)
	Return an /ON's <noise>.

    $hookctl(GET HOOK <refnum> PACKAGE)
	Return an /ON's </package> value.

    $hookctl(GET HOOK <refnum> SERIAL)
	Return an /ON's <serial>.  If one wasn't given, 0 is the default.

    $hookctl(GET HOOK <refnum> SKIP)
	Return 1 if the /ON is being "skipped" 
		("skipped" == ignored -- treated as if it had been deleted)

    $hookctl(GET HOOK <refnum> STUFF)
	Return an /ON's <stuff>
		("stuff" == the ircII code when the /ON goes off)

    $hookctl(GET HOOK <refnum> TYPE)
	Return an /ON's <TYPE>

    -- In these SET HOOK operations, if you attempt to change a value so it
       clobbers (duplicates) an existing ON's value, then the operation will
       either fail, or it will replace the existing ON.  I'll have to ask
       howl how he handled this.

    $hookctl(SET HOOK <refnum> ARGUMENT_LIST)
	Clear an /ON's argument list (so it no longer takes one)

    $hookctl(SET HOOK <refnum> ARGUMENT_LIST <list>)
	Replace an /ON's argument list

    $hookctl(SET HOOK <refnum> FLEXIBLE [0|1])
	Clear (or set) an /ON's flexible-pattern attribute

    $hookctl(SET HOOK <refnum> NICK <pattern>)
	Change an /ON's <pattern>.  Warning -- You can only have one /ON
	per serial number with the exact same <pattern>.

    $hookctl(SET HOOK <refnum> NOT [0|1])
	Clear (or set) an /ON's "negative on" attribute

    $hookctl(SET HOOK <refnum> NOISE <noiseref|noise>)
    $hookctl(SET HOOK <refnum> NOISY <noiseref|noise>)
	Change an /ON's <noise> value using either a noise-refnum or
	the noise's name itsself
	Example: $hookctl(SET HOOK 147 NOISE SILENT)
	     and $hookctl(SET HOOK 147 NOISE 1) do the same thing.
	
    $hookctl(SET HOOK <refnum> PACKAGE <string>)
	Change an /ON's </package> value.  This is used by /unload.

    $hookctl(SET HOOK <refnum> SERIAL <number>)
	Change an /ON's <serial> value.  Warning -- You can only have one 
	/ON per serial number with the exact same <pattern>.

    $hookctl(SET HOOK <refnum> SKIP [0|1])
	Clear (or set) an /ON's skippable attribute.  When an /ON is being
	"skipped", it cannot ever be executed; it is treated as if it were
	deleted. 

    $hookctl(SET HOOK <refnum> STUFF <ircII code>)
	Change the ircII commands executed when an /ON goes off.


    === GETTING INFORMATION ABOUT ON TYPES ===
    $hookctl(LIST)
    $hookctl(LIST LISTS)
	Return all of the valid <TYPE>s

    $hookctl(LIST LISTS <pattern>)
	Return all of the valie <TYPE>s that match the <pattern>
	Ex: $hookctl(LIST LISTS g*) returns "GENERAL_NOTICE GENERAL_PRIVMSG"

    $hookctl(LIST POPULATED_LISTS)
	Return all of the valid <TYPE>s that have an /ON registered for them.

    $hookctl(LIST POPULATED_LISTS <pattern>)
	Return all of the valid <TYPE>s that match the <pattern> that have an
	/ON registered for them.

    $hookctl(LIST HOOKS)
	Return all of the registered <refnum>s

    $hookctl(LIST HOOKS <pattern>)
	Return all registered <refnum>s for <TYPE>s that match <pattern>.
	Ex: $hookctl(LIST HOOKS MSG) returns the refnums of your /ON MSG's

    $hookctl(FIRST_NAMED_HOOK)
	Return the number such that
		$word($hookctl(FIRST_NAMED_HOOK) $hookctl(LIST))
	returns the first non-numeric /ON type.

    $hookctl(NUMBER_OF_LISTS)   
    $hookctl(COUNT)
    $hookctl(COUNT LISTS)
	Return the number of items in $hookctl(LIST)

    $hookctl(COUNT LISTS <pattern>)
	Return the number of items in $hookctl(LIST LISTS <pattern>)

    $hookctl(COUNT POPULATED_LISTS)
	Return the number of items in $hookctl(LIST POPULATED_LISTS)

    $hookctl(COUNT POPULATED_LISTS <pattern>)
	Return the number of items in $hookctl(LIST POPULATED_LISTS <pattern>)

    $hookctl(COUNT HOOKS)
	Return the number of items in $hookctl(LIST HOOKS)

    $hookctl(COUNT HOOKS <pattern>)
	Return the number of items in $hookctl(LIST HOOKS <pattern>)

    $hookctl(GET LIST <TYPE> NAME)
	This just returns <TYPE>, since the name of any <TYPE> is itsself.

    $hookctl(GET LIST <TYPE> PARAMS)
	Return the mininum number of words in $* for any /ON of this type.
	Remember that your <pattern> is expected to match a $* that has 
	AT LEAST this number of words.  If your <pattern> doesn't, the /ON
	will never go off.

    $hookctl(GET LIST <TYPE> MARK)
	Return the number of invocations of this /ON type are pending.
	For example, the first time an /ON MSG event is thrown, then 
	$hookctl(GET LIST MSG MARK) is 1.  If your /ON does something 
	funky like a /WAIT and another MSG comes in before your /ON is
	finished, then $hookctl(GET LIST MSG MARK) is 2.

    $hookctl(GET LIST <TYPE> FLAGS)
	This is an internal bitmask value.  The only defined bit is 1, which
	is used to prevent an /ON from going off recursively.  One such ON
	is /ON INPUT.  If $hookctl(GET LIST INPUT MARK) is 1, then another
	/ON INPUT event is thrown, no /ON's will actually be executed; the
	ON is considered unhooked.  This allows you do perform certain
	commands (like /sendline) from within certain /ON's (like /on input)
	where without this flag that would result in infinite recursion
	(and crash)

    === GETTING INFORMATION ABOUT NOISE TYPES ===
    $hookctl(DEFAULT_NOISE_LEVEL)
	This always returns "NORMAL" for now.  This is the <noisetype> whose
	VALUE (see below) is the null character.

    $hookctl(NOISE_LEVELS) 
	This returns all of the <noisetype> values.
	Ex: $hookctl(NOISE_LEVELS) returns "SILENT QUIET NORMAL NOISY SYSTEM"

    $hookctl(NOISE_LEVELS <pattern>)
	This returns all of the <noisetype> values that match <pattern>
	Ex: $hookctl(NOISE LEVELS s*) returns "SILENT SYSTEM"

    $hookctl(NOISE_LEVEL_NUM)   
	This returns the highest <noiseref> value.

    In the GET NOISE operations, <noisetype> is the name of a noise 
    flag.  This is one of "SILENT", "QUIET", "NORMAL", "NOISY", and 
    "SYSTEM".  <noiseref> is a refnum that uniquely identifies each
    of the noise types.  The above are numbered 1, 2, 3, 4, and 5 
    respectively.

    $hookctl(GET NOISE <noisetype|noiseref> NAME)
	Get the name of the noise type.  One of "SILENT", "QUIET", 
	"NORMAL", "NOISY", or "SYSTEM"

    $hookctl(GET NOISE <noisetype|noiseref> DISPLAY)
	Returns 0 if the noise type does a /SET DISPLAY OFF while
		executing the /ON body.
	Returns 1 if /SET DISPLAY is not changed when the /ON goes off.

    $hookctl(GET NOISE <noisetype|noiseref> ALERT)
	Returns 0 if you are not told when the /ON is executed.
	Returns 1 if you are told whenever the /ON is executed.

    $hookctl(GET NOISE <noisetype|noiseref> SUPPRESS)
	Preface:  With most /ON's, if you do not have any /ON's that 
		are appropriate to run, then some "default" action will
		be taken.
	Returns 0 if executing the /ON does not cause the "default" action
		to be suppressed.
	Returns 1 if executing the /ON causes the "default" action to be
		suppressed.

    $hookctl(GET NOISE <noisetype|noiseref> VALUE) 	(refnum)
	Returns the refnum of the noise type.
	Example: $hookctl(GET NOISE SILENT VALUE) returns "1".

    $hookctl(GET NOISE <noisetype|noiseref> IDENTIFIER)
	Returns the <noise> value to use when you want to use this noise type.
	Example: $hookctl(GET NOISE SILENT IDENTIFIER) returns "^".

    $hookctl(GET NOISE <noisetype|noiseref> CUSTOM)
	This always returns 0 for now.

    === MISCELLANEOUS OPERATIONS ===
    $hookctl(EXECUTING_HOOKS)
	This returns the refnums of all of the hooks that are currently 
	pending (executing).  Since /ONs work like a LIFO queue, the first
	word is the current /ON, and the second word is the /ON that is waiting
	for the first one to finish, etc.   Obviously you can use this to 
	operate on an /ON from within itsself whenever it goes off.

    $hookctl(HALTCHAIN <refnum>)
    $hookctl(DENY_ALL_HOOKS)
    $hookctl(DENY_ALL_HOOKS 1)
    $hookctl(DENY_ALL_HOOKS 0)
    $hookctl(EMPTY_SLOTS)
    $hookctl(HOOKLIST_SIZE)
    $hookctl(LAST_CREATED_HOOK)
    $hookctl(PACKAGE <package> [<type>])
    $hookctl(SERIAL <sernum> [<type>])
    $hookctl(RETVAL)
    $hookctl(RETVAL <value>)
    $hookctl(LOOKUP <type> <pattern> <serial>)
    $hookctl(MATCH <type> <pattern>) 

*** News 01/01/2005 -- New function: $hookctl() (howl)
    This new function, $hookctl(), lets the users do pretty much whatever
	they

	$hookctl() arguments:
   ADD <#!'[NOISETYPE]><list> [[#]<serial>] <nick> [(<argument list>)] <stuff>
       Argument list not yet implemented for $hookctl()
   ADD <#!'[NOISETYPE]><list> [[#]<serial>] <nick> <stuff>
       - Creates a new hook. Returns hook id.
   COUNT
       - See COUNT/LIST
   HALTCHAIN <recursive number>
       - Will set the haltflag for eventchain. May halt the current chain,
         or any chain currently being executed.
         Returns 1 on success, 0 otherwise.
   DEFAULT_NOISE_LEVEL
       - returns the 'default noise level'. It is not currently possible
         to change the current noise level, and probably never will be.
   DENY_ALL_HOOKS <arguments>
       - this sets the deny_all_hooks flag, or gets it's value. If set,
         to anything non negative, all hooks will be "ignored", and the
         default action of any event will be taken. Similar to a /DUMP ON
         but doens't actually remove any hooks.
   EMPTY_SLOTS
       - will return a list of empty slots in the hook-list.
   EXECUTING_HOOKS
       - will return a list of the current executing hooks. This is a
         'recursive' list, listing the current hook first.
   FIRST_NAMED_HOOK
       - returns FIRST_NAMED_HOOK
   HOOKLIST_SIZE
       - will returns HOOKLIST_SIZE
   LAST_CREATED_HOOK
       - returns the value of LAST_CREATED_HOOK
   LIST
       - See COUNT/LIST
   NOISE_LEVELS <pattern>
       - Returns a list of 'noise-types'. If <pattern> is specified only
         noise levels matching pattern will be returns.
   NOISE_LEVEL_NUM
       - Returns NOISE_LEVEL_NUM
   NUMBER_OF_LISTS
       - Returns NUBER_OF_LISTS
   PACKAGE <package> [<list>]
       - Returns a list of hooks of the given package. If <list> is
         specified, it will return only hooks in list <list>
   RETVAL <recursive number> [<new value>]
       - If recursve number isn't specified, 0 (the current) is specified.
         Will either return the value of retval for the given hook, or
         set it.
   SERIAL <serial> [<list>]
       - Works exactly like PACKAGE.

   GET <type> <arg>
       - See GET/SET
   LOOKUP <list> <nick> [<serial>]
       - Returns hook matching given parametres.
   MATCH <list> <pattern>
       - Returns a list of matching hooks.
   REMOVE <hook id>
       - Removes the hook with the given hook ID. Returns 1 on success,
         0 otherwise.
   SET <type> <arg>
       - See GET/SET

   * GET/SET usage
   GET gettype <arguments>
       - will return 'gettype'
   SET gettype <arguments>
       - will set 'gettype' or similar, and return 1 on success. Not all
         'gettypes' may be set, and not all gettypes will silently ignore
         being set.

   It is very important to remember that GET won't ever SET anything(!!!)
   Won't, and shouldn't.

   * GET/SET types:
   HOOK <argument>
       - More info on this under GET/SET HOOK
   LIST <arguments>
       - More info on this under GET/SET LIST
   NOISE <argument>
   NOISY <argument>
       - More info on this under GET/SET NOISE/NOISY
   MATCHES <argument>
       - More info on this under GET/SET MATCHES

   * GET/SET HOOK usage:
       GET HOOK <hook id> <prop> <arg>
       SET HOOK <hook id> <prop> <arg>

       <prop> may be one of the following:
       ARGUMENT_LIST
           - Returns or sets the argument list, if SET and <arg> is empty,
             it will be set to NULL, and therefore not used.
       FLEXIBLE
           - Returns or sets the value of flexible
       NICK
           - Sets or gets the hook's nick. The position of the hook will
             be changed if needed, and it is not possible to change this
             to a "crashing nick"
       NOT
           - Sets or gets the value of NOT.
       NOISE
       NOISY
           - Sets or returns the value of noisy.
       PACKAGE
           - Returns or sets the hook's packagename
       SERIAL
           - Returns or sets the serial for the hook. The hook's position
             in the list will be changed if necesarry, and it is not
             possible to set the serial to a crashing serial.
       SKIP
           - Returns or sets the value of skip.
       STUFF
           - Returns or sets the value of stuff.
       TYPE
           - Returns or sets the type.

   * GET/SET LIST usage:
       GET LIST <listname> <prop>
       SET LIST <listname> <prop> - not functional

       <prop> may be one of the following:
       COUNT
           - Returns count of hooks
       FLAGS
           - Returns flags
       MARK
           - Returns mark
       NAME
           - Returns name
       PARAMETERS
       PARAMS
           - Returns value of params



   * GET/SET NOISE/NOISY usage:
       GET NOISE <noisename> <prop>
       SET NOISE <noisename> <prop> - not functional

       <prop> may be one of the following:
           ALERT
               - returns value of alert.
           CUSTOM
               - returns value of custom.
           DISPLAY
               - returns value of display.
           IDENTIFIER
               - returns value of identifier.
           NAME
               - returns name.
           SUPPRESS
               - returns value of suppress.
           VALUE
               - returns value of value. d'oh!

   * GET/SET MATCHES:
       - This function is not ready yet, and will currently RETURN_NULL.

   * COUNT/LIST usage:
      COUNT / LIST work doing the same, the only difference is that
      COUNT will return the count of lists/hooks, while list will return
      a list

      The following options are permitted:

          LISTS <pattern>
          - Will either return all lists available, or only the
            matching ones.
          POPULATED_LISTS <pattern>
          - Works _just_ like LISTS, but will only return "populated"
            lists
          HOOKS <pattern>
          - Will either return all the hooks on the system, or all
            the hooks in the matching lists



*** News 10/29/2004 -- New /ison features.
	To go with the -d and -f switches, the following switches have been
	added to exploit the new queueing mechanism:

		-n                  # Prioritise this request.
		-s                  # Send the next ison request now.
		-len number         # Change the number of nicks per request.
		-oncmd {commands}   # Run these commands for online users.
		-offcmd {commands}  # Run these commands for offline users.

	The descriptions of these switches are simplistic and a little
	inaccurate.  Some clarifications follow.

	-len will change the maximum length of an ISON request from 500 to the
	given number.  This number will be used for _all_ requests from then on
	including those from the notify system.  In practice it may be
	necessary in some cases to tune this value downwards to avoid the
	server dropping some names off the list when they are all online.

	-oncmd and -offcmd will run the given lines of code with $* set to all
	the users that a reply indicates are online or offline, respectively.
	Note that a single /ison request can generate multiple replies.  Also
	note, that there is no guarantee that the code will or will not run if
	$* is empty.

	-n will place the current requests at the head of the queue.  This is
	useful when many requests are waiting to be sent and it is necessary to
	have this one replied to quickly.  Note that if the request isn't
	actually sent by the time the next -n is used, the newer request will
	always get the higher priority.

	-s will "kick" the ison system back into action in cases where
	something has gone wrong and it has become necessary to use the -f flag
	for eg.  This is more of a debugging tool.  It will not actually cause
	more than $serverctl(get $servernum() maxison) requests to be sent.

*** News 10/01/2004 -- New status format, %{3}W
	This is a compromise between %W and %{2}W.  %W only shows in the
	input window when there are split windows, and %{2}W shows in all
	split windows.  So %{3}W shows in the input window, even if it is
	the only visible window (ie, there are no split windows).

*** News 10/01/2004 -- New window option, "toplines"
	You may now reserve 0 to 9 lines at the top of every windows to be
	removed from the scrollable portion of the window, creating a place
	for you to put things like a channel topic, or channel users, or
	whatever.

	/WINDOW TOPLINES <N>    	
		Reserves and displays <N> lines at the top of the window, 
		which will not be part of the window's scrollable display.
		By default, toplines are blank until you set them with...
	/WINDOW TOPLINE <N> "<string>"	
		Sets the window's <N>th topline to <string>.  <N> must be 
		1 to 9.  You should put <string> in double quotes.  You can
		change toplines even if they aren't visible.

	$windowctl(GET <refnum> TOPLINES)
		Returns the number of toplines reserved at the top of the
		window.
	$windowctl(GET <refnum> TOPLINE <n>)
		Returns the <n>th topline for the window.

*** News 09/14/2004 -- Added Howls shebang script support.
	It is now possible to write epic scripts that run from the shell
	command line.  Yaaay..!  The nature of the epic binary itself made this
	a little difficult at the interface level, so a little hackery was
	required.  The form of the shebang line is this:

		#!/path/to/epic -S [command line options] -l

	Note that the -l switch must be the last on the line, and -S must be
	the first.  Also note that at this point in time, -S will only work as
	the first part of the first argument.  The results of the use of this
	switch anywhere else is currently undefined.

*** News 09/14/2004 -- Added some features to the commandqueues script.
	The first argument to /1cmd may now have a second number attached, with
	a coma.  This number if given, will cause any recurrences of the same
	command within that number of seconds to reset the last-executed time
	_without_ executing the command.

	Use of the 0 or 1 argument form of /qcmd will now cause the timer to be
	reset to 5 seconds, and if called as a function, the command will be
	returned without executing it.

*** News 08/25/2004 -- New target syntax, -<serverdesc>/<target>
	You can now send messages to the special message type:
		-<serverdesc>/<target>
	where <serverdesc> is a server description (see below) and <target>
	is obviously a nick or channel on that server.  This allows you to
	send a message to a nickname on a server other than your current
	window's server.  For example:
		@serverctl(SET 0 ALTNAME booya)		(set an altname)
		/msg -booya/hop hi there!
	Will send the message to "hop" on server 0.

*** News 08/25/2004 -- "Server descriptions"
	Anywhere EPIC expects you to give it a server, it now expects a 
	"server description" which is one of the following (in this order)

		1) A number, which is taken as a server refnum

		2) An "ourname" of an open server
		3) An "itsname" of an open server
		4) A "group" of an open server
		5) An "alternate name" of an open server

		6) An "ourname" of a closed server
		7) An "itsname" of a closed server
		8) A "group" of a closed server
		9) An "alternate name" of a closed server

	The server description may be a wildcard!  The first server 
	(starting with server 0) that matches is used.

	This means you can do something like this:
		@serverctl(SET 0 ALTNAME booya)		(set an altname)
		/server -0				(disconnect from 0)
		/server +booya				(reconnect to "booya")
	and it will connect to server 0, because server 0 has the alternate
	name of "booya"!

*** News 08/25/2004 -- Alternate server names
	You may now give a server a list of "alternate names".  There is no
	limit.  You add a new alternate name with:
		$serverctl(SET <refnum> ALTNAME <name>)
	You can totaly replace the list with:
		$serverctl(SET <refnum> ALTNAMES <names>)
	<name> and <names> should be space-separated list of words.

	You can get the list of alternate names with
		$serverctl(GET <refnum> ALTNAMES)

*** News 08/25/2004 -- Aliases now shown with their argument lists
	When you do /alias, you now see the argument list along with all
	of the other stuff.

*** News 08/25/2004 -- Mangling now supports "ALT_CHAR"
	How did this ever get missed?

*** News 08/25/2004 -- New function, $mktime()
	Usage: $mktime(year month day hour minute second DST)
	The first six arguments are required.  Returns -1 on error.
	Returns whatever mktime(3) on your system would return, usually
	the number of seconds since the epoch represented by the arguments.

*** News 08/25/2004 -- Support for ircnet's "unique id" nicknames
	You can now always use your "unique id" as your nickname, and also
	the "0" shortcut nickname, on ircnet.

*** News 08/25/2004 -- New status expando, %{1}F
	This is just like %F, it displays all of the "notified" windows,
	except it uses the window's "notify_name" instead of its refnum.

*** News 08/25/2004 -- New window command, /WINDOW NOTIFY_NAME
	If you change the /WINDOW NOTIFY_NAME, and use the %{1}F status
	expando, then the notify_name, and not the window's refnum, will
	show up.  Howl wanted to colorize the refnum up, and this is how
	you should do it.

*** News 08/25/2004 -- Support for +I channel mode (ratbox)
	Because adm asked me to

*** News 08/25/2004 -- User-created /SETs, /SET -CREATE   -- WARNING
			*** DEPRECATED ***
	You can create your own /set's for now with 
		/SET -CREATE <name> <type> {<code>}
	where <type> is one of BOOL, STR, or INT.  <code> is code that 
	will be run any time the user does /SET <name> <newval>.  You can
	/SET the value within <code> to override the user's value.  

	*** WARNING *** This interface is temporary and will go away in 
	the future.  It will be replaced by $symbolctl() which has not
	yet been written, so stay tuned for more information!
			*** DEPRECATED ***
	This feature only existed in EPIC5-0.0.3 and was/will be removed
	in EPIC5-0.0.4.  Do not use this feature.
			*** DEPRECATED ***

*** News 08/25/2004 -- Unification of symbol namespaces
	There is now one big table that holds all of the symbol names for
	aliases, assigns, built in commands, built in functions, sets, and
	inline expandos.  You should not notice any changes at all, except
	maybe epic runs faster.  This was done to pave the path towards
	plugins, which will need to be able to add their own commands and
	functions on the fly!

*** News 08/25/2004 -- The /IRCNAME and /REALNAME commands removed here...
	because they are duplicates of /SET REALNAME.  Use the /SET now.

*** News 08/25/2004 -- $stripcrap(ALL) no longer strips "ALL_OFF"...
	because the crap-mangler makes liberal use of ALL_OFFs and it is of
	no harm to leave them in there, and it does great harm to take them
	out. ;-)  If you want to remove them, do $stripcrap(ALL,ALL_OFF)

*** News 08/25/2004 -- New script 'builtins' loaded from global
	Some things are starting to migrate from hardcoded builtins to 
	script features.  They are not "being removed", their implementation
	is just changing.  This script will contain backwards compatability
	stuff for epic4.  You really do need this script!  Do 'make install'!

*** News 08/25/2004 -- Automatic command completion removed
	You can no longer do /whoi as a replacement for /whois.  You'll have
	to spell out the command name in full now.

*** News 08/25/2004 -- Using your nickname as a command removed here
	You can no longer do /<mynick> as an alias for /me.  Just use /me.

*** News 08/25/2004 -- The COMMAND_COMPLETION keybinding removed here
	A new script replacement is forthcoming -- stand by!

*** News 08/25/2004 -- New serverctl, $serverctl(GET <refnum> STATUS)
	This returns the server's current status, which is described below
	in the /on server_status stuff.

*** News 08/25/2004 -- New script, 'slowcat'
	This script cats a file to your current target, 2 lines per second
	to avoid triggering flood control.  
		/load slowcat
		/slowcat filename

*** News 08/25/2004 -- New status expando, %{2}W
	This acts just like %W, but it shows in every window, and not just 
	the current window.

*** News 08/25/2004 -- New /SET, /SET OLD_SERVER_LASTLOG_LEVEL
	When you /WINDOW SERVER to move a window to a server that is already
	connected, the window's level will be set to this /set value.  This
	is important, because of the following situation:
		Window 1, server 0, level ALL
		Window 2, server 1, level ALL
	If you do /window 1 server 1  then you have two servers connected
	to server 1 with level "ALL".  Who wins?  Not you. ;-)  This defaults
	to NONE, which is probably the only sensible value.

*** News 08/25/2004 -- /WINDOW KILL_ALL_HIDDEN kills your hidden windows.
	After you run this, you will be left with only your visible windows.

*** News 08/25/2004 -- /ON TYPE !"PATTERN" acts as an exception.
	If you use this syntax, then the default action will occurs whenever
	the pattern is matched.  This is how ircII's /ON TYPE ^PATTERN works.
	For example:
			on ^msg * echo msg from $0: $1-
			on ^msg !"hop" 
	In this case, if anyone but hop sends you a msg, it is echoed as
	in the first /on.  But if hop sends you a message, it will be
	displayed in the "default" way by epic, as though you did not have
	an on at all.

*** News 08/25/2004 -- It is now always safe to delete ONs from within ONs
	Up until now, you needed to /defer the removal of any /ONs from
	within other /ONs, or you risked crashing epic.  This meant you 
	could not safely stop an /ON with a higher serial number from
	running by deleting it.  All of this has been fixed now.  You can
	delete /ONs without restriction and the change takes place 
	immediately.

*** News 08/25/2004 -- ONs no longer compile patterns to regexes
	This was fraught with peril, so ONs no longer compile their
	patterns to regexes, and now we do things like we have always
	done with ONs

*** News 08/25/2004 -- In /ON DCC_RAW "* E *", $3 is the port number
	Previously it held the "othername", which wasn't terribly useful.

*** News 08/25/2004 -- /WAIT =<fd> waits for a dcc connection to complete
	If you do $connect(), it is nonblocking and returns before the
	connection is ready to be used.  If you need to wait until the
	connection completes, like it did in epic4, do this:
			@fd = connect(host port)
			wait =$fd
	and it's pretty much the same.  This wait is of course recursive
	(and does not block the client)

*** News 08/25/2004 -- Level names are always plural, except for CRAP
	The levels have these names now, and they're gonna stay this way:

		CRAP	PUBLICS	MSGS	NOTICES	WALLS	WALLOPS
		OPNOTES	SNOTES	ACTIONS	DCCS	CTCPS
		INVITES	JOINS	NICKS	TOPICS	PARTS	QUITS
		KICKS	MODES	USER1	USER2	USER3	USER4
		USER5	USER6	USER7	USER8	USER9	USER10
		ALL (special)	NONE (special)

*** News 08/18/2004 -- Overloadable function aliases.
	When an alias name "collides" with a built in function, the built in
	function has traditionally been called.  This update changes this
	behaviour to calling the alias first.

	NOTE:  This will cause recursive loops in scripts that rely on this
	behaviour.  To fix this the aliases in question need to be renamed or
	rewritten to use the following ::function() feature.

	It is possible to call the built in with the :: notation used for
	global variables, as in $::function().  $:function() will explicitly
	call the alias.

	NOTE:  Do not use the $::function() and $:function() features just yet,
	as they will crash epic if the alias or the built in doesn't exist.  It
	is safe to use if you are sure they do though.

*** News 08/02/2004 -- New commands for $dccctl().
	$dccctl(readables) will return the refnums of DCCs that have data
	waiting to be read and $dccctl(get [refnum] readable) will return a 1
	or 0 depending on whether the given refnum is readable or not.

	Since epic will automatically read data from all unheld DCCs, this
	feature is expected to be useful only for DCCs in the "held" state.

*** News 08/02/2004 -- General improvements to the flood detection system.
	Flood detection now works for channel PARTS and for ctcp replies, which
	is bound to the NOTICES flood.

	Also, the first argument from each flood returned from $floodinfo()
	when flood_maskuser is set to 1 or 2 is now a valid user@host mask for
	the flooder in question, suitable for putting in a ban or kline.

*** News 08/02/2004 -- New argument for /on flood.
	The fourth argument ($3) in the flood hook is now the number of repeats
	of the flood in question.  This makes it easy to deal with particular
	kinds of floods in different ways, as they occur.  For example:

	/on "% parts % 5" mode $2 +b *!*@$after(@ $userhost())
	/on "% ctcps % 5" mode $2 +b *!*@$after(@ $userhost())
	/on "% % % 50" mode $2 +b *!*@$after(@ $userhost())

*** News 08/02/2004 -- Improvements to $floodinfo().
	$floodinfo() will now accept as input the same list of lists it
	outputs.  The lists themselves don't have to be complete.  Any
	unspecified arguments will match all records.  For example:

	$floodinfo("% #chan joins")  # Return all join records for #chan.
	$floodinfo(*)                # This still works.
	$floodinfo($floodinfo(*))    # Same output as above.

	Feeding $floodinfo() output back into its input is useful for tuning
	the flood /sets by seeing which non-flooders are being caught long term
	in the system.

	The fields are these:

	u@h mask that matches the flooder.  Defaults to "*".
	channel mask.  Defaults to "*".
	flood type mask.  Defaults to "*".
	Server number.  Defaults to -1, which matches all.
	Numeric minimum number of flood hits.
	Numeric minimum duration of flood.
	Numeric minimum flood rate.

	The last three numeric arguments may be negative, in which case, they
	specify the _maximum_ values.  These fields make it possible to deal
	with different kinds of floods in different ways _after_ they occur.
	For example, a join flood may be falsely triggered by a net join, but
	it is reasonable to expect that if you have join and part flood records
	for the same u@h, then it is participating in a join/part flood.

	/on "% parts % 5" {
		if (floodinfo("$userhost() $2 joins $servernum() 5")) {
			mode $2 +b *!*@$after(@ $userhost())
		}
	}

	Or alternately:

	/on "% joins % 5" {
		if (floodinfo("$userhost() $2 parts $servernum() 5")) {
			mode $2 +b *!*@$after(@ $userhost())
		}
	}

*** News 08/02/2004 -- Changes to /userhost and notify.
	The changes to the ison back end mentioned in the previous entry now
	also apply to the userhost back end, along with the caveats relating to
	/wait and flush.  This applies to the /userhost, /userip and /usrip
	commands.

	A new option has been added to these commands.  /userhost -count
	[number] will change the number of items that epic will put into each
	USERHOST request.  This isn't a particularly significant change since
	this number is already tuned to a number that works on all servers.

	To change the number of USERHOST requests sent at one time, use
	$serverctl(set [servernum] maxuserhost [number]).  Set it to 0 to turn
	the new behaviour off.

*** News 07/08/2004 -- Changes to /ison and notify.
	The back end of the notify system and the /ison command has been
	changed to permit only a certain number of ISONs to be sent to a server
	at one time.  The benefit of this is that it will typically prevent a
	large notify list flooding the client off the server.

	The down side is that it will cause scripts like $is_on() in script/guh
	that use "/wait for ison .." to fail until they have been fixed.  The
	fix is to put "@ serverctl(set $servernum() maxison 0)" at the top of
	any alias that uses it.  This will turn the new behaviour off.

	The notify system itself will not queue an ISON to be sent if there are
	any ISONs waiting to be sent, but the /ison command will.

	One final note is that the "waiting to be sent" queue won't be flushed
	when the client reconnects to the server or when "/ison -f" is run.
	This won't cause any particular damage, but it's not nice and will
	probably change soon.

*** News 07/08/2004 -- Userhost updating in NICK changes.
	This is relevant to those who use the $serverctl() maxcache feature,
	which, if in effect, will prevent a /who message being sent to a
	server, and thereby make $userhost() fail for every nick that joined
	the channel before the client did.

	This patch will grab the userhost information for these users from the
	NICK message itself, and help to rebuild the $userhost() database
	faster.  It also makes it possible to manually get it into the database
	by /pretend'ing a NICK message with a userhost obtained from other
	sources such as the /userhost command.

*** News 03/19/2004 -- New built in function, $tobase(<base> <num>) [howl]
	This function converts <num>, a number in base 10, to base <base>.
	For example, $tobase(16 65536) returns "10000"

*** News 03/19/2004 -- New built in function, $strtol(<base> <num>) [howl]
	This function converts <num>, a number in base <base> to base 10.
	For example, $strtol(16 10000) returns "65536"

*** News 03/19/2004 -- Changes to /WINDOW NOTIFY, /WINDOW NOTIFIED
	These two /WINDOW operations now take ON, OFF, or TOGGLE arguments,
	instead of taking no arguments and behaving as toggle switches.
	If you do not provide an argument, they show you their current
	values as the other /WINDOW boolean values do.

*** News 03/19/2004 -- Addition and changes to $windowctl()
	$windowctl(GET <refnum> MISCFLAGS) always returns 0, and
	$windowctl(GET <refnum> NOTIFY) returns 1 if /window notify is on
	$windowctl(GET <refnum> NOTIFIED) returns 1 if /window notified is on.
	NOTIFY and NOTIFIED replace MISCFLAGS.

*** News 03/19/2004 -- New key binding, SWITCH_QUERY
	Whenever a window has multple nicknames in its nickname list,
	and one of those nicknames is active as the window's query, it
	is possible to use this binding to switch between all of the 
	nicks in the nick list, just in the same way you can switch
	between channels using SWITCH_CHANNELS.  If the window does not
	have an active query, this key binding will have no effect, even
	if the window has nicks in its nicklist!

*** News 03/19/2004 -- Unification of /WINDOW QUERY and /WINDOW ADD
	Historically, when you /WINDOW QUERY (or just /QUERY) <NICK>, then
	it would add <NICK> to the window's "NICK LIST".  The "NICK LIST" 
	is a list of nicknames for which output goes to that window, just
	like output to channels go to windows.  Output to or from a nick
	that is not on any window's "nick list" goes to the LEVEL_MSG level.
	When you used /WINDOW QUERY <NICK2> to change the query, it would
	remove the old query from the nick list, and messages to and from
	the original query went back to LEVEL_MSG.

	Well, this has been unified somewhat.  Now the following rules apply:
	1) When you /WINDOW QUERY <NICK>, then <NICK> is added to the 
	   window's nick list.
	2) If the window already has a query, then the old query nickname
	   is NO LONGER REMOVED from the window's nick list.  Output to 
	   that nick will continue to go to the window as it had before.
	3) When you use /WINDOW QUERY to cancel a query, then the current
	   query IS STILL REMOVED from the window's nick list, and output
	   to or from that nick will go to LEVEL_MSGS.

	It is no longer possible to have a window query that is not on the
	window's nicklist, because the query is selected from the members of
	the window's nicklist, rather than being a separate thing.

*** News 03/17/2004 -- Change to how /SET INDENT behaves
	Historically, if you have /SET INDENT ON, and the first word of the
	first line of output is wider than 1/3 of your screen, then the
	second (and subsequent) line(s) of output are NOT INDENTED.  This 
	has been changed so subsequent lines are indented 1/3 of the window's
	width.  To understand this change, think about how /set indent usually
	works, and if it would indent more than 1/3 of your screen, then it 
	will indent 1/3 instead of not at all.

*** News 03/17/2004 -- New flag to /XECHO , /XECHO -F
	If you use the /XECHO -F flag, "hidden window output notification"
	will not occur for any hidden windows that receive the output. 
	
*** News 03/16/2004 -- You can now bind the 255 character ()
	There has been a problem with the new key binding system that
	made it difficult for Russian language speakers to bind the 255
	character which is in their alphabet.  This should be fixed now.

*** News 03/16/2004 -- Can now join channels simultaneously per window
	Previously, if you attempted to join multiple channels in the same
	window simultaneously, you were not assured that all of the channels
	would go to that window.  Now you can be assured of this.  This should
	make reconnection/rejoin scripts much more sane.

*** News 03/16/2004 -- New built in function, $startupfile()
	This expands to the file that the client loaded at startup as your
	"startup file".  Usually this is ~/.ircrc or ~/.epicrc or whatever
	you specified as the IRCRC environment variable or the argument to
	-l or -L on the command line.

*** News 03/16/2004 -- Unknown CTCP requests offered via /ON CTCP_REQUEST
	It was pointed out that unknown/unhandled CTCP requests were only
	being hooked through /on ctcp, so it wasn't possible to use 
	/on ctcp_request to handle EVERY request.  Well, now unhandled CTCPs
	are hooked through both /on's just like handled CTCPs are.

*** News 03/16/2004 -- Semantic changes to $connect()
	You used to be able to depend on /ON DCC_RAW "% % E %" or 
	/ON DCC_RAW "% % C" hooking before $connect() returned.  Now that
	$connect() is nonblocking, YOU CAN NO LONGER DEPEND ON THIS.  You
	must set up your script to assume that /ON DCC_RAW will be hooked
	asynchronously, after at least the next sequence point.  Think of 
	it as being like not being able to depend on /WHOIS returning the
	numerics.  I'll probably add a way to /wait for a connection in the
	future.  Stay tuned.

*** News 03/16/2004 -- DCC connections are now nonblocking
	All connect()ions for DCC, including /DCC GET, /DCC CHAT, /DCC RESUME
	and $connect() are all fully nonblocking.  This means all connects
	in EPIC are now fully nonblocking! HUZZAH!

*** News 03/15/2004 -- /HELP command now handled by script
	The built in /HELP command has been replaced by a script that
	was written by howl for our use.  Much thanks to him!

*** News 03/14/2004 -- Six new USER lastlog levels
	You may now use USER5, USER6, USER7, USER8, USER9, and USER10
	as levels with your window, lastlog, flood, and ignore.  Just 
	use /xecho -l USER5 for example to send to your USER5 window.

*** News 01/20/2004 -- kqueue() support
	You can uncomment #define USE_FREEBSD_KQUEUE in newio.h if you
	want to play around with this experimental feature.

*** News 01/15/2004 -- /WINDOW DISCON and /WINDOW NOSERV now the same
	There was a subtle semantic difference between /WINDOW DISCON 
	and /WINDOW NOSERV that had to do with the window's "last server"
	that was used for reconnects.  Because the client no longer does
	reconnections, this difference is moot.  These two commands now 
	always do the same thing, which is to disassociate the window
	with any server.  The window becomes "server-less".

*** News 01/15/2004 -- Changes to /SERVER command
	/SERVER
	     Show the server list.
	/SERVER -DELETE <refnum|desc>
	     Remove server <refnum> (or <desc>) from server list.
	     Fails if you do not give it a refnum or desc.
	     Fails if server does not exist.
	     Fails if server is open.
	/SERVER -ADD <desc>
	     Add server <desc> to server list.
	     Fails if you do not give it a <desc>
	/SERVER +<refnum|desc>
	     If the server's state is "CLOSED", change it to "RECONNECT".  
	     This allows the server to reconnect if windows are pointed to it.
	     Note: server reconnection is asynchronous
	/SERVER -<refnum|desc>
	     Unconditionally close a server connection
	     Note: server disconnection is synchronous!
	/SERVER +
	     Switch windows from current server to next server in same group
	/SERVER -
	     Switch windows from current server to previous server in same group
	/SERVER <refnum|desc>
	     Switch windows from current server to another server.

*** News 01/08/2004 -- /ON WIDELIST went away here
	This /ON hasn't been hooked in many a year, and here it officially
	passed into the void.

*** News 01/07/2004 -- Removal of WINDOW BIND feature
	As part of the larger project to decouple windows from channels,
	the "window bind" feature has been removed.  This means you can 
	no longer /WINDOW BIND, /WINDOW REBIND, /WINDOW UNBIND, and you 
	cannot use $windowctl(* BIND_CHANNEL *) or $winbound().  It is 
	expected that eventually scripts will take over the job of routing 
	channels to the appropriate windows and EPIC will stay entirely 
	out of the way.

*** News 01/07/2004 -- New /ON, /ON SERVER_STATUS
	This /ON is thrown every time a server changes its "state".
	The states are listed below in "Server States" and I won't
	go into that again here.
		$0 - The server changing state
		$1 - The old status (a string, not a number)
		$2 - The new status
	If you find that you do something particularly onerous in 
	this /ON and EPIC panics or crashes, try /DEFERing it, and
	if that doesn't work either, let me know.

*** News 01/07/2004 -- Removal of NOTE support
	I doubt anyone will notice this, and if you do, bummer.

*** News 01/07/2004 -- Server states
	Servers now exist in one of several "states" each time it connects
	to the server.  It moves through each of the states from start to
	end, and stays at the end until manually reset by the user (or script)

	RECONNECT	As soon as a window is attached to the server, the 
			server should be connected to.
	CONNECTING	A connection to the server is in progress.  The server 
			is not ready to be used.
	REGISTERING	We are attempting protocol registration (NICK/USER) 
			with the server.  The server is open, but we cannot 
			really use it yet.
	SYNCING		Our registration has been accepted and we're doing 
			whatever meta-tasks are needed to get the connection 
			fully active
	ACTIVE		The connection is fully ready for all use.
	EOF		An End Of File (EOF) has been detected from the server.
			The connection was closed by the server and cannot be 
			used any longer.
	CLOSING		The connection to the server is being shut down.  If 
			the previous state was "ACTIVE" then you can still 
			send something to the server.  If the previous state
			was "EOF" then it's too late.  You cannot stop the
			closing of a server.
	CLOSED		The server is disconnected and cannot be used.  The
			server (and any windows connected to this server) stay
			in this state until the user resets the state to 
			RECONNECT.

*** News 01/07/2004 -- Channels are not tracked across disconnects
	When you are disconnected from a server for *any* reason, EPIC
	will not retain knowledge of the channels for the next connection
	and will not rejoin them.  It is expected that scripts will use
	this to their advantage to fully control the semantics you will
	have governing "auto-rejoin-on-reconnect".

*** News 01/07/2004 -- Server connections are now brought up asynchronously
	When you do /WINDOW SERVER or /SERVER or otherwise change the
	server of a window, the server is not immediately connected or
	disconnected, and the change will not take effect until the
	next time through the event looper.  This means that all server
	connections are "asychronous" (they don't interrupt the current
	flow of the script).  This means you most definitely cannot
	do /WINDOW SERVER <host> CHANNEL <channel> any more.  So please
	stop doing that. ;-)  Use /ON SERVER_STATUS to join channels.

*** News 01/07/2004 -- /XDEBUG SERVER_CONNECT a lot more interesting
	If you want to watch epic work its gory nonblocking connects,
	you can turn on this /xdebug and see everything in its glory.

*** News 01/07/2004 -- Nonblocking server connects
	EPIC now does all server connections using asynchronous, 
	nonrecursive, nonblocking connections.  And yes, it still 
	supports multiple protocols and multiple addresses (ie, 
	"us.undernet.org"), and *yes*, it will try another address if 
	a server refuses us registration ("You do not have access to 
	this server").

*** News 01/07/2004 -- EPIC no longer tracks server "dialect" per se
	The $version() string now always returns "2.8" since all 
	servers are nominally 2.8 class (rfc1459) servers, and epic
	does not attempt to determine if it's an undernet, ircnet,
	efnet, or dalnet server, etc.  This is mostly because scripts
	can hook /on 004 if they care, and the 005 numeric (ISUPPORT)
	is making dependance on the server's version much less important.

*** News 01/07/2004 -- EPIC loads ~/.ircrc (or ~/.epicrc) on 001 now
	Traditionally, ircII has loaded your ircrc when it received 
	the 002 numeric, and traditionally, epic has done it when it
	received the 004 numeric.  Due to some refactoring in epic,
	it is now possible for epic to load your ircrc when it receives
	the 001 numeric *and before it hooks /on 001*  This means you 
	shouldn't have to suffer the default epic output for any of
	the numerics from the server.

*** News 01/07/2004 -- Usermodes now tracked as strings instead of bits
	Before this change, ircII clients had always tracked your user
	and channel modes as bits, and the valid (supported) modes were
	hardcoded into the client at compile time.  With this change, 
	EPIC will no longer track your modes using bits, but instead 
	using strings.  This means that epic won't need source code
	changes to support new modes from your server.  You can't do
	$serverctl(SET|GET <refnum> UMODES) any more (but the old
	"UMODE" still works)

*** News 01/07/2004 -- /ON wildcard patterns now compiled into regexes
			*** OBSOLETE ***
	At or around this date, EPIC started converting wildcard patterns
	used by /ON into extended POSIX regexes and compiling them, and
	using the regexes instead of the pattern matcher.  In the future,
	epic will allow you to specify your own regexes.  "Flexible"
	/on hooks are still wildcard pattern matched (for now) because
	recompiling the pattern every time the /on is thrown is senseless.
			*** OBSOLETE ***
	This feature was removed (see note above for 08/25/2004)
			*** OBSOLETE ***

*** News -- 12/16/2003 -- New levels, KICK, QUIT, and MODE
	So just for a canonical list, here are all of the levels supported
	by flood, ignore, lastlog, and windows:
		CRAP	PUBLIC	MSG	NOTICE	WALL	WALLOP
		NOTE	OPNOTE	SNOTE	ACTION	DCC	CTCP
		INVITE	JOIN	NICK	TOPIC	PART	QUIT
		KICK	MODE	USER1	USER2	USER3	USER4
		ALL (special)	NONE (special)	HELP (special)

*** News -- 12/16/2003 -- Unification of ignore, flood, and lastlog levels
	Previously, the ignore, flood, and lastlog levels used the same
	names, but they had different meanings in each subsystem (ie, CRAP 
	in flood was different from CRAP in ignore, and CRAP in lastlog).
	Now all three subsystems use the same levels, all named the same,
	and (more or less) all defined the same.  There are some holes in
	this conversion cause I didn't check every possible combination.
	Report any odd behavior to me so I can fix it.

*** News -- 12/16/2003 -- New noise type for /ON, /ON %TYPE
	The /ON %TYPE modifier acts just like /ON ^TYPE, because it
	suppresses the default action, but it is unlike /ON ^TYPE
	because it does not turn off the display (what /ON ^TYPE
	does is it prefixes all the commands in the ON body with 
	the ^ modifier, which turns off output for that command.)
	This new modifer does not prefix each command with ^, so any
	commands not so prefixed will generate their normal output.	
	The idea is you can use this for /on set's
		/ON %SET "HOLD_MODE *" {WINDOW HOLD_MODE $*}

*** News -- 12/16/2003 -- Removed /SET BEEP_WHEN_AWAY
	This feature can be re-implemented in one line of script:
		/ON #MSG 617 * {IF (A) {BEEP}}

*** News -- 12/16/2003 -- Removed /SET BEEP_ON_MSG
	The /SET BEEP_ON_MSG feature has been removed because it was only
	half-implemented, and even that half didn't work right.  Keep an
	eye out for a scripted re-implementation of this in the future.

*** News -- 12/16/2003 -- Runtime auto-append-of-$* removed
	Historically, the ircII language has allowed you to auto-append
	$* onto the end of an alias at runtime by creating an alias that
	does not refer to any of the command line arguments.  For example,
		/alias m msg
	behaves at runtime as
		/alias m msg $*
	but with a performance penalty.  This behavior has now been removed
	and if you wish to have $* appended to your aliases, you need to 
	change them.  This change would be backwards compatable with epic4.

# End of file
