[ This file contains all of the UPDATES for all the work I've ever done ] EPIC4-2.2 *** News -- 11/09/2004 -- Changes to way spaces are handled *** IMPORTANT *** Up until this point, the technical definition of what is a "space" (the term used for an Internal Field Separator (IFS), that is, the thing that separates one word from another word) EPIC has always had three sets of IFSs 1) Character 32 only ("space") 2) Characters 9, 10, 11, 12, 13, and 32 ("my_isspace()") 3) Whatever your locale says is a space ("isspace") In the C locale (the default for unix users), sets #2 and #3 are exactly the same. I don't know about other locales. Now we are going to only use set #3. Changing Set #2 to Set #3 is easy, and nobody should notice any difference there. The one that is going to cause pain is Set #1. Consider this situation: OneTwo Is this one word, or two words? In some places in epic, it is one word, and in other places it is two words. As a result of this change, it will now always be two words every place. Here is a list of the places that were using Set #1 that will change to use Set #3, and you should be on the lookout for changes! *) /AWAY separated the end of its flags with spaces. This means /AWAY -ALLHi there! will now work properly. *) $pop(....) removes the last word from the argument list. Whereas $pop(one twothree) used to return "twothree" is will now only return "three" *) Commands are separated from the argument list by a "space". Whereas /onetwo blah blah blah parsed "onetwo" as the command, now "one" is the command and "two" is part of the argument list. *) In expressions, a variable name may be separated from an operator with a space. Whereas things like @var =foo might have failed because is not a valid character in a variable name, it will now treat the same as a space. *) Places that expect a number did not accept a string that contained a so that things like 9 was not accepted as a number. Now it will be. *) The /IGNORE command used to consider a string containing a to not be empty. This means that /IGNORE would not list the ignorance list, but rather would try to show the ban value for an ignore matching which isn't reasonable. *) The % wildcard pattern stopped matching only when it saw char 32. Now it will stop whenever it seems a Set 3 type space. So whereas before "%" matched "onetwo" now it won't, because "onetwo" is two words, not one word. *) In /xdebug extractw mode, tabs before or after double quotes were not considered to start or end a double quoted word. So previously this string: one "two three" four contained four words, because the before "two nullified the double quoting. Now that is treated like any other space, the above word has three words, not four. Places that use Set 1 and will NOT be changing to Set 3, because they are parsing IRC protocol data, which stipulates that the IFS MUST be a space solely: *) CTCP requests and replies are formatted only with spaces *) Words in protocol messages are separated only with spaces *** News -- 11/09/2004 -- You may now mangle ALT_CHAR characters And ALT_CHAR mangling is included in ALL. This was an oversight that was fixed in epic5. *** News -- 11/02/2004 -- Mangling "ALL,-BOLD" no longer mangles "ALL_OFF" In general, if you use ANSI (ALL includes ANSI), the mangled string has its six attributes (COLOR, REVERSE, UNDERLINE, BOLD, BLINK, ALT_CHAR) rewritten into canonical form. This will add some ALL_OFFs to your string that weren't there originally. So if you strip all of the attributes (as ALL does), then epic will strip ALL_OFF off as well. This retains backwards compatability with ALL. But if you use ANSI and don't want to strip all 6 of the attributes, then it's important that ALL_OFFs are not removed, otherwise your string will not appear as it should (the ANSInator uses ALL_OFFs to turn off attributes). So EPIC automatically will not strip ALL_OFFs if you use ANSI and do not mangle one of the 6 attributes. Examples: $stripcrap(ALL this is ^B^_bold underline^_ not bold) will strip everything as it has always done. $stripcrap(ALL,-BOLD this is ^B^_bold underline^_^B not bold) will strip everything but not bold and all_offs, because if all_offs are stripped, then "not bold" will be in bold! The entire point of this is to allow /set mangle_logfile ALL to work the way it has always worked, and $stripcrap(ALL,-BOLD ...) to work the way it *should* work. *** News -- 10/06/2004 -- Support for +e and +I numerics from efnet EFNet has +e and +I channel modes, which act like +b does. These numerics are now handled by epic like +b is. *** News -- 10/06/2004 -- New status bar expandos, %{2}W and %{3}W These two new expandos expand to the same value as %W. %W Expands on each input window on each screen that has two or more visible windows. %{2}W Expands on all visible windows on all screens. %{3}W Expands on each input window on each screen, even on screens that have only one visible window. *** News -- 10/06/2004 -- Support for ircnet's "numeric nick" feature On ircnet, each user is given a unique numeric identifier, which is their one true nickname. In addition to this numeric id, they can have a rfc1459 nickname, but they are not required to have one. Further, the special numeric id 0 is reserved and refers to the user's own numeric id. EPIC now fully supports all of this, particularly in the following ways: /NICK /NICK 0 To turn off your rfc1459 nickname. $serverctl(GET UNIQUE_ID) $serverctl(SET UNIQUE_ID) To retrieve and change your unique nickname. Changing your unique id is probably a bad idea. /USERHOST You may USERHOST unique id's now. 'epic 0' You may now use the nickname 0 on the epic command line if you don't want to use an rfc1459 nickname on an ircnet server. Using unique numeric id's on non-ircnet servers is probably fraught with peril. Try to avoid that. *** News -- 10/06/2004 -- /SET INDENT maxes out at 1/3 screen width Previously, if you did /set indent on, and the width of the first word on the first line was > 1/3 of the screen's width, then the second (and subsequent) lines were not indented at all. This was the historical ircII behavior. It seems more sensible to cap the indent level at 1/3 of the screen's width and indent it to there. EPIC4-2.0 *** News -- 02/03/2004 -- ERASE_LINE behavior slightly modified The ERASE_LINE input function has been modified to not overwrite the input buffer when it is called on an empty input line. EPIC4-1.2.9 *** News -- 01/25/2004 -- Slight changes to /ON SSL_SERVER_CERT |Rain| pointed out that /ON SSL_SERVER_CERT was not terribly useful because $1 (cert subject) and $2 (cert issuer) could contain spaces, and so you couldn't really use $1 and $2 to fetch them. He proposed that we hook a url-encoded version of the subject and issuer (so they won't contain any spaces) and you can use $urldecode($1) to get the subject and $urldecode($2) to get the issuer. EPIC4-1.2.7 *** News -- 01/18/2004 -- New functions $cofilter() and $corfilter(). These are compliments of $copattern(). *** News -- 12/27/2003 -- New $dccctl() modes. Added $dccctl(get [ref] writable) and $dccctl(writables). This is useful for sending lots of data out on a raw or chat dcc. Epic will (iirc) normally drop the data in such cases rather than blocking or buffering. This isn't a complete solution. Writable means that a certain amount of data can be written, so data can still be lost. *** News -- 12/27/2003 -- Added /SET DCC_DEQUOTE_FILENAMES This turns the double quoted space decoding feature added recently for received DCC SEND requests on and off. *** News -- 12/27/2003 -- $rest() also removes chars from the right. Using a negative first arg causes $rest() to strip chars from the right hand side of the string. This makes it a compliment to $right() as well as $left(), but if a script relies on it returning the original string the way it did before, it may now cause compatibility problems. If it does, talk to CrazyEddy on #epic efnet. *** News -- 12/27/2003 -- Added $splicec() in functions script. This works much the same way as $splice(), but on characters, not words. It won't work seemlessly on local vars though. EPIC4-1.2.5 *** News -- 12/13/2003 -- Default of AUTO_REJOIN is now OFF Per the poll taken on the epic mailing list, the preponderance of opinion being in favor of changing the default value of AUTO_REJOIN to OFF, as of commit 672, the default value is changed. You will want to put /SET AUTO_REJOIN ON in your ~/.epicrc to get the old value. *** News -- 12/11/2003 -- Command parser ignores spaces after semicolons Since the dawn of the modern ircII syntax, the following syntax has caused consternation with scripters: /eval {two; three} because it runs the /two alias, and then outputs the text "three" to the current target (channel-or-query). This is because the command parser does not ignore spaces after semicolons; a leading space results in ircII assuming you are wanting to run the empty command (yes, there is actually an empty command), which just happens to be the /say command. Well, enough is enough. I'm putting a stop to this. If you depend on this horrifically broken behavior, then the time has come to switch to using /SAY. The rest of us will enjoy not having to freak out about spaces after semicolons. *** News -- 12/11/2003 -- New /WINDOW verb, /WINDOW SCROLLADJ [ON|OFF] When the default value of ON is used, when you "GROW" a window, or otherwise cause the size of a window to be increased, the top of the scrollable view is moved back so you can see more of the lines that have recently scrolled off the screen. If you change this to OFF, the behavior is more like ircII, where when something scrolls off the window, nothing will bring it back unless you go into scrollback mode. *** News -- 12/11/2003 -- New /ON, /ON WINDOW_BEFOREKILL The value of $* is the window refnum (number) of the window that is about to be killed. You cannot stop the kill from happening, but you do get this opportunity to save any information about the window that you might want. *DANGER*DANGER*DANGER* EPIC does not try to stop you from doing something really dumb in this /ON, and if you try to change the window being killed, or you affect the visibility or invisibility of any window, you run the definite chance of confusing EPIC and causing a panic. This is not a bug, this is just your peril if you ignore this warning. Use /DEFER to run commands safely from within /ONs. EPIC4-1.2.3 *** News -- 12/05/2003 -- New built in function $numlines() (fudd) The first argument to $numlines() is the width of a line (which you can get from $geom() if you want to use that), and the rest of the text is some text. The return value is the number of screen lines that will be taken up if you were to /echo the text to a window of the given number of columns. *** News -- 12/03/2003 -- New command line arguments, -o and -O POSIX termios allowed systems to define "extended characters" (IEXTEN) which are interpreted by the kernel and are not passed onto the application. In 4.4BSD in particular, these "extended characters" are ^V and ^O. This means that by default, you cannot use these two characters in a binding. By using the -o option, you ask EPIC to specifically turn these extended characters on, and by using the -O option, you ask epic to specifically turn these extended characters OFF. If you do not specify either option, epic does not change the current default value. EPIC4-1.2.2 *** News -- 12/03/2003 -- New /WINDOW verb, /WINDOW SWAPPABLE [ON|OFF] You may now control whether your windows are "swappable". The default (backwards-compatable) value is ON. If you set this to OFF on a visible window, then that visible window cannot be made hidden, via /WINDOW HIDE or /WINDOW SWAP. If you set this to OFF on a hidden window, then that hidden window cannot be made visible, via /WINDOW SHOW, /WINDOW SWAP, /WINDOW BACK or /WINDOW NEXT. You must reset this value back to ON before you try to swap the window back in or out. *** News -- 12/03/2003 -- New /SET, /SET STATUS_NOSWAP Whenever a window has /WINDOW SWAPPABLE OFF, the %{1}W status expando will expand to the value of this /SET *** News -- 12/03/2003 -- SWAPPABLE accessable via $windowctl() You can now $windowctl(GET SWAPPABLE) to get the window 's current swappable status. EPIC4-1.2.0 *** News -- 12/01/2003 -- Double quoted filenames via dcc from other clients is now supported. Please note that I object to this, but I am not oblivious to necessity. *** News -- 12/01/2003 -- New $windowctl() value, "DOUBLE" You can now $windowctl(GET DOUBLE) to get the value of the window's double status bar. It's 0 if the double status bar is off, and 1 if it is on. *** News -- 11/30/2003 -- /XECHO -L now overrides "target window" I had a request from a couple of people who pointed out that in epic4-1.1.*, numeric replies were now being sent to the target's window (ie, a channel's window) if the numeric was for the target/channel. They were perplexed that /XECHO -L CRAP couldn't override this. This is because /XECHO -L does not reset the "target" and the "target" has higher priority than the lastlog level. This means that it's impossible to send output from an /ON for a channel to a window other than that channel's window using /XECHO -L. It seems more sensible that /XECHO -L would override the channel's window, because if you weren't expecting it to do that, you wouldn't have used /XECHO -L in the first place, right? *** News -- 11/30/2003 -- "Fixed" and "skipped" windows now special If a window is marked as both "fixed" (cannot change size) and "skipped" (cannot be made the input window indirectly), then it is now "frozen" -- it does not count towards the number of windows on a screen for the purposes of /WINDOW KILL and /WINDOW HIDE. To be more plain: you cannot kill or hide the last "non-frozen" window on a screen. It is probably not a good idea to "freeze" all of the windows on the screen. Leave one of them "not frozen". I didn't test this extensively, so if you try to break this, you probably will! *** News -- 11/30/2003 -- New /ON , /ON WINDOW_COMMAND This /ON is hooked after each time a successful window command is executed. The value of $0 is the refnum of the current window before the command was executed (ie, the window the command started with or operated upon), and $1 is the refnum of the current window after the command was executed. If $0 and $1 are the same, then the command executed upon that window. If $0 and $1 are different then some command was run that changed the current window (ala, /WINDOW SWAP or HIDE or REFNUM) This /ON is hooked even if the command does not change any state of the window. When a command fails, the value of $1 is the number -1. Example: /on ^window_command * {echo Window $* command!} /window 2 size 5 hide might output Window 2 2 command! Window 2 1 command! *DANGER*DANGER*DANGER* EPIC does not try to stop you from doing something really dumb in this /ON, and if you try to change the window being killed, or you affect the visibility or invisibility of any window, you run the definite chance of confusing EPIC and causing a panic. This is not a bug, this is just your peril if you ignore this warning. Use /DEFER to run commands safely from within /ONs. *DANGER*DANGER*DANGER* *** News -- 11/24/2003 -- New built in function, $windowctl() You can now fetch much of the low-level information about your windows using this function. You cannot set them (yet), nor is this expected for the upcoming production release. You can still always use the /window command to change things around. $windowctl(REFNUMS) - Return all window refnums currently in use. $windowctl(REFNUM [number|name]) - Given a window refnum or a window name, return the window's refnum, suitable for use with $windowctl(GET ...) $windowctl(GET [item]) - Where [ITEM] is one of: REFNUM The value of /WINDOW NUMBER NAME The value of /WINDOW NAME SERVER The server refnum this window is connected to. LAST_SERVER When SERVER is -1 (disconnected), this is the refnum of the last server this window was connected to. PRIORITY Each time you change the current input window, this value is incremented. The window with the highest priority value on a server is the server's "current window" VISIBLE 1 if the window is visible, 0 if it is hidden TOP The line on the screen where the window starts, if it is visible BOTTOM The line on the screen where the window ends, if it is visible CURSOR How many lines from the top of the window the cursor should be put for the next line of output. NOSCROLLCURSOR This is always -1. FIXED The integer value of /WINDOW FIXED SCROLL The integer value of /WINDOW SCROLL (always 1) CHANGE_LINE The next line to be changed by changed by /xecho -l OLD_SIZE The size of the window the last time that we checked; usually the same as DISPLAY_SIZE UPDATE Some non-zero value if the window needs to be updated, either by redrawing it's body or its status bar MISCFLAGS 1 if /WINDOW NOTIFY is on, 3 if a /WINDOW NOTIFY window has had output since the last time it was visible (ie, included in %F) BEEP_ALWAYS Integer value of /WINDOW BEEP_ALWAYS NOTIFY_LEVEL The value of /WINDOW NOTIFY_LEVEL WINDOW_LEVEL The value of /WINDOW LEVEL SKIP Integer value of /WINDOW SKIP COLUMNS How many vertical columns wide the window is PROMPT The current input prompt for this window. STATUS_FORMAT The value of /WINDOW STATUS_FORMAT STATUS_FORMAT1 The value of /WINDOW STATUS_FORMAT1 STATUS_FORMAT2 The value of /WINDOW STATUS_FORMAT2 STATUS_LINE The actual status bar when /window double off STATUS_LINE1 The actual 1st status bar when /window double on STATUS_LINE2 The actual 2nd status bar when /window double on DISPLAY_BUFFER_SIZE How many items are in the scrollback (display) buffer DISPLAY_BUFFER_MAX The value of /WINDOW SCROLLBACK or /SET SCROLLBACK SCROLLING_DISTANCE How far away the top of the standard view is from the bottom of the scrollback buffer. HOLDING_DISTANCE How far away the top of the hold view is from the bottom of the scrollback buffer. SCROLBACK_DISTANCE How far away the top of the scrollback view is from the bottom of the scrollback buffer DISPLAY_COUNTER The serial number to be used by the next item put into the scrollback buffer. HOLD_SLIDER How much the hold view "slides" up every time you hit . Value of /SET HOLD_SLIDER HOLD_INTERVAL The value of /SET HOLD_INTERVAL LAST_LINES_HELD How many lines are beind held, as seen in %H. WAITING_CHANNEL The last channel you /JOINed in this window. You can only have one waiting channel per window. BIND_CHANNEL The value of /WINDOW BIND QUERY_NICK The value of /WINDOW QUERY NICKLIST The nicks you added with /WINDOW ADD LASTLOG_LEVEL The levels of output that the window should put into its lastlog, value of /WINDOW LASTLOG_LEVEL LASTLOG_SIZE How many items are in the window's lastlog. LASTLOG_MAX How big the window's lastlog can be; value of /WINDOW LASTLOG or /SET LASTLOG LOGGING The integer value of /WINDOW LOG LOGFILE The current filename used by the window's log. DECEASED Should always be 0, but may be 1 if the window is "dying" but this would be quite exceptional. *** News -- 11/21/2003 -- /SERVER now honors server groups Whenever EPIC tries to connect to a new server, particularly when you do /SERVER it will honor the server group of the new server; if you cannot connect to it will only try to connect to other servers in the same group as . *** News -- 11/21/2003 -- New math parser can now use 64 bit integers The new experimental math parser (which you can turn on via /xdebug new_math) can now support 64 bit integers. This is auto-detected when you run 'configure' and $info(o) will include the letter 'l' for you scripters who want to be able to tell when the host client can do big math and when it can't. EPIC4-1.1.14 *** News -- 10/31/2003 -- Most file $functions() now use the "" hack. This hack works by allowing you to specify the empty filename "" in a function call, and have the function read the remaining arg list as a single word which is the filename. This is useful for dealing with wierd filenames. *** News -- 10/31/2003 -- Tuned the DCC receive packet size. The receive packet size is now 64k. This may at first appear to break the protocol, but the read reqest will return immediately if it doesn't have all the data, so the responses will tend to repace themselves to the senders window size, especially under cpu or network load where a read call can't always be made immediately. The benefits of doing this are that we don't clobber the sender with quite so many un-necessary acks, and we don't have to spend so much cpu time in the select loop under load. *** News -- 10/31/2003 -- Fixed dcc_lost to be called in more cases. This still needs work. There are certain cases for which it isn't called. *** News -- 10/31/2003 -- Added dcc_spacefix script. When this is loaded, it will automatically translate the double quoted spaced filename dcc requests that some clients send into url encoded ones that epic can understand. *** News -- 10/31/2003 -- Added $dccctl(refbase). This will change the number from which new dccs get given new refnums. It probably isn't terribly significant except that it will almost definitely disappear the day that refnums become fixed in the system. *** News -- 10/31/2003 -- Added $dccctl(set [ref] quoted) This is good for 8 bit clean comms over raw dccs. While it is on, the line by line mode that raw dccs are usually in will be turned off, and i/o by way of "/dcc raw", "/msg =[fd]", and the DCC_RAW hook will instead have dangerous characters backslashed, and can be used with $asciiq(), $chrq(), $writeb(), etc. It may on occasions be neccessary to have input be quoted and output be line-by-line or vice versa. This can be done by leaving quoted mode set to the desired read mode, and flipping it for write. With this change, epic moves a step closer to being able to process 8 bit clean data. One of the last remaining parts that can't is /exec. *** News -- 10/31/2003 -- /away has a new flag, "--" to stop reading flags. *** News -- 10/31/2003 -- Added $sedcrypt(). Don't use this. It was put in there for playing around with sed encryption. *** News -- 10/31/2003 -- Added $tell(). This is a compliment of $seek(). *** News -- 10/31/2003 -- Added $ftruncate(). This will truncate a file $1- to size $0. Note that $1- is not a quoted word, and unlike some other file functions, it doesn't operate on fds. This function may be changed or withdrawn. *** News -- 10/31/2003 -- $listarray() takes an extra arg. $listarray() returns all values in an array joined by spaces. Given a second arg, it will use that as a joining string. *** News 10/31/2003 -- Added $wwordtoindex() to functions script. This may be un-necessary given the recent changes to the word parsing rules. *** News 10/31/2003 -- New $open() modes, potential incompatibility. $open() can now open using all the modes available to libcs fopen(3) except "w", which has traditionally been translated to "a". The incompatibility is in the way the mode argument is read. I have seen some scripts that append extra chars for no apparent reason. If a script did this it would work under the old scheme, but under the new, the entire word must match one of the modes, or the open will fail. *** News 10/31/2003 -- $aliasctl(maxret), rpmatch, rmatch. This whole thing is a hack which will probably be withdrawn in future when a more stable variable storage system is implemented. Therefore it probably won't be documented anywhere else. It is designed to be memory overflow protection for $aliasctl(), which can at times cause a coredump on itself when the variable space is excessively large. The way maxret works is that you call $aliasctl(maxret [number]), and from then on, $aliasctl(assign pmatch [...]) will return a maximum of [number] variables. This is great for purge aliases, because you can call it again once the first [number] are gone and get the next lot. To use it for anything else, a starting range is needed, and this can be specified with $aliasctl(assign [start] pmatch). Note that [start] must be numeric and _non_zero_. This isn't a bug. It means that all scripts using this feature must be written in a future proof way. As for rpmatch and rmatch, these are exactly like pmatch and match, but they work through the list in reverse. This is very useful for performance. The data_struct script has been rewritten to use these features as an example of the use of these features. *** News 10/28/2003 -- Cross-family /DCC issues. You can't ordinarily do cross-family /DCC. Cross-family DCC is when you're connected to an IPv4 server and try to do IPv6 DCC, or when you're connected to an IPv6 server and try to do IPv4 DCC. The reason this doesn't normally work is because EPIC doesn't know what your IP address is (or even if you have one) in the "other" family. Normally you tell EPIC what your address is by giving it a virtual hostname with /HOSTNAME and it looks up your address in all of the families it supports and uses that. But if you don't give it a vhost, and you try to do a cross-family DCC, it will fail and remind you to use /HOSTNAME first. *** News 10/28/2003 -- New /ON, /ON DCC_ACTIVITY This hook is activated each time some activity occurs on a /DCC GET or /DCC SEND, particularly whenever the %D status bar expando is updated. The idea is that scripters can stop using %D and use the /SET STATUS_USER* expandos to craft their own custom %D-like expandos. The value of $* is the refnum of the dcc that had the activity. You can use this value with $dccctl(). When a DCC closes, it throws /on dcc_lost, and then /on dcc_activity will be thrown with the -1 refnum. *** News 10/28/2003 -- Everything should support /xdebug extractw now If you turn on the experimental feature /xdebug extractw, then everything in epic that works on word lists should start supporting extended ("double quoted") words. This includes numeric expandos, built in functions, and so on. Furthermore, anything that outputs a word list should surround words with double quotes if they have space in them. Since double quoted words are not honored unless you have /xdebug extractw, this is an all-or-nothing thing. This will break some scripts becase of changes like this: Old: $sort(one "two three" four) -> [four one two three] New: $sort(one "two three" four) -> [four one "two three"] See the doc/word-lists file in the epic source for a very detailed list of exactly what does and does not output double-quoted words. *** News 10/28/2003 -- New /SET, /SET WSERV_TYPE [XTERM|SCREEN] When you are running EPIC under both screen and X at the same time and you do /window create, some people want epic to start up a new xterm and some people want epic to start up a new screen window. The previous default has been a screen window. Now you can either /SET WSERV_TYPE XTERM or /SET WSERV_TYPE SCREEN to explicitly state your preference, if you have one. Obviously this only matters when you're running epic under BOTH. *** News 10/19/2003 -- $serverctl(SET UMODES) now supported To work around an unfortunate problem with ratbox, you are now permitted to change the "valid user modes" for a particular server. You may want to set this in an /on 005 or some such thing. EPIC4-1.1.13 *** News 10/19/2003 -- You can now /SET DEBUG 7 and /SET OUTPUT_REWRITE at the same time. I fixed it with a technical workaround the details of which would probably bore you. ;-) *** News 10/19/2003 -- /XEVAL -- now ends option processing If you do /XEVAL -- then will be executed as a command and no further options will be parsed. This came up becuase /XECHO -- does this, and someone figured out that '/' was also an option argument and that got in the way of doing a built in command, for example: /XEVAL -- //MSG hop testing! *** News 10/10/2003 -- New built in script, 'hold_mode' This script implements the /set hold_mode and /set hold_mode_interval semantics of ircII. Particularly, when you create a new window, the current global values of these /set's are set for the new window. Those who want ircII-like hold_mode behavior should definitely /load this script in their .ircrc! *** News 10/10/2003 -- New setting, /SET HOLD_SLIDER, /WINDOW HOLD_SLIDER The "HOLD_SLIDER" controls what percentage of your window must scroll by before the window starts holding further output; and how much held output is displayed each time you use the SEND_LINE keybinding (the key). Traditional ircII semantics would use a value of 100 (a full window is scrolled by each time you hit ), and the more recent epic behavior would use a value of 0 (the window always holds new output, and you must use SCROLL_FORWARD () to see the new output. This can be set on a window-by-window basis or set globally. The default is 100 (traditional ircII hold_mode) *** News 10/10/2003 -- Modifications to /WINDOW HOLD_MODE system When a window is in hold_mode, it allows some number of lines to be displayed and then any further lines are "held" or not displayed until the user takes some definite action to display them. The user can display ("unhold") held lines by using the SCROLL_FORWARD keybind () or the SEND_LINE keybind (). For SCROLL_FORWARD, the number of lines unheld is controlled by /SET SCROLLBACK_RATIO, and for SEND_LINE, it is controlled by /SET HOLD_SLIDER. The traditional ircII behavior for hold_mode is simulated by using /set hold_slider 100 and /load hold_mode. Each time you hit a full window of output is unheld, and if no data was unheld, then a full window of output will appear before new output gets held. The more recent epic behavior for hold_mode is simulated by using /set hold_slider 0. All new output is always held, and hitting does not unhold output, but rather you must use to scroll forward through the held output until you hit the bottom. *** News 10/10/2003 -- No more "half blank window" If you don't know what I'm explaining here, don't worry about it. If you do know, then you'll be happy to hear about this. Previously, If you did then a line of output occured and you hit twice, then half the window would be empty. It seemed a lot of people hated this so I "fixed" it as part of the hold_mode stuff. *** News 10/10/2003 -- Per-DCC store paths (sort of) You can now /DCC RENAME to override the /SET DCC_STORE_PATH for a particular DCC. For example: /SET DCC_STORE_PATH ~/downloads/ /DCC RENAME hop myfile.txt /tmp/myfile.txt /DCC GET hop Before this change, the file would be saved as: ~/downloads/_tmp_myfile.txt but now it will be properly saved to /tmp/myfile.txt *** News 10/10/2003 -- Servers now track their own current windows As you probably know, EPIC has a "global current window" and each of your screens has its own "current window". Now each server will track its "current window". Each time you set a new current window in one of your screens, that window will become its server's current window. This information will be used for /SET CURRENT_WINDOW_LEVEL. This means that when output to a level in /SET CURRENT_WINDOW_LEVEL occurs from servers that are not the current window's server, it will now go to that server's "current window" instead of being ignored like it has up until now. *** News 10/10/2003 -- EPIC now uses 004 and 005 numeric values There are many different networks out there who use usermodes and channel modes for different things. Sometimes, a mode may take an argument on one server but not on another server. In order to allow clients to do the sensible thing, servers are supposed to send right and proper values in the 004 and 005 numerics to tell the client what modes are available and whether they take an argument or not. EPIC now will use these values. Occasionally, a server will be in error and fail to report a usermode it supports, or will falsely report it as taking an argument when it doesn't, or vice versa. Whenever a problem like this occurs, EPIC will output a warning message telling you that it had to assume something about your server that the server did not relay correctly to EPIC. These messages are harmless and you can usually ignore them, but if you get a message and EPIC does do something weird, the mode change may be at fault. You can talk to your friendly server administrator about the problem. *** News 09/25/2003 -- $servernick() now returns global nickname I just know I'm going to regret this... If you want to get the client's global current nickname (which is used for new servers added to your server list), you can pass the literal string to the $servernick() function to get it. *** News 08/30/2003 -- New function $randomread() in the files script. It works much like the $randread() builtin, but it avoids certain potential bugs, and will return one line from each specified file. *** News 08/30/2003 -- commandqueues script updates. q1cmd now permits you to specify multiple comma separated queues to test against for the specific purpose of blocking. The command will only be queued on the first. qcmd now makes reference to a non-existant function called $islagged(). If this returns a true value, qcmd will stop right there so that the server doesn't get mistakenly flooded. *** News 08/30/2003 -- Autoget script enhanced. A new autoclobber mode for those occasions when your transfer just keeps failing. "/autoclobber resume close" (the default) means that if the request is for a file larger than the one you have, the transfer will resume, otherwise the request will be rejected. *** News 08/20/2003 -- You cannot do /TIMER -REPEAT -1 0 Because this would busy loop. You need *some* sort of interval, even if it is very small. *** News 08/20/2003 -- You can no longer do /WINDOW NUMBER on channel windows Windows have traditionally tracked their current channel by holding the current channel name as a string. This has been a huge hassle since it's possible for the window to think its current channel is a channel you're not on, and there was no way to fix that short of doing brute force sanity checks. Now EPIC tracks your current channels by having each channel hold a "priority" number, and the refnum of its window. Whenever you remove a channel from its window by whatever reason, the channel that has the next highest priority is made the current channel. This means EPIC can remember all of your previous current channels and unwind them sensibly. But this all comes with a price. Because channels track their windows by refnum now, you can no longer change a window's refnum if it has channels in it. If you try, EPIC will refuse to comply. *** News 08/15/2003 -- You can now /RETURN from a /LOADing script If you /RETURN from within a /LOADing script, the /LOAD will end. This can be useful if you want to protect against /LOADing a script twice, or if it's a pre-formatted script and you don't want it to be /LOADed by the standard loader. *** News 08/15/2003 -- Improvements to how EPIC handles words Up until this point, EPIC's word handling was more "ad hoc" than anything. Some places honored double quoted words, other places did not, and even then not every place did the same thing with double quoted words. In some places, words would include leading spaces, and in others they would not. Same thing with trailing spaces. It was just a total mess. We made a concerted effort to clean up all of this so that there is only one set of rules for all words in EPIC. I would document the new set of rules, except I don't want to hold up this release by writing a big old document. Stay tuned. Basically the point is everything should be sensible and consistent now. *** News 08/15/2003 -- Improvements to EPIC's source code At or around this timeframe, EPIC's source code was audited and fixed so that no "unsafe" C functions are used. This was used to satisfy the pedants who worry that any use of an unsafe C function, even if it is carefully checked, is a security risk. Also, EPIC was compiled with some of the stricter FreeBSD "WARNS" compiler flags, and many hundreds of changes were made to improve the quality and conformance of EPIC's source code. *** News 07/19/2003 -- New argument to /LASTLOG, /LASTLOG -TARGET Items are stored in your lastlog along with the "display target". If the message has anything to do with a channel, the target is that channel. If it is a msg, notice, or dcc you sent, or someone sent to you, then the target is the other nick. You can select only output pertaining to certain targets with /LASTLOG -TARGET. For example, to see only public messages to #epic, /LASTLOG -TARGET #epic -PUBLIC *** News 07/14/2003 -- New /SET, /SET MAIL_INTERVAL Previously, the client checked your mbox at the top of every minute and whenever the status bar was redrawn. For some people, this was far too often, and for others, it was not nearly often enough. Now you can control exactly how often your mbox is checked with this set. Please remember that redrawing your status bar no longer rechecks your mail; what you see on your status bar is cached and recreated by a recurring timer that runs as often as this /set directs. The default value is 60 (at the top of every minute). When CPU_SAVER mode is active, /SET CPU_SAVER_EVERY overrides this value. *** News 07/14/2003 -- New /SET, /SET CLOCK_INTERVAL Previously, the client updated the status bar clock (and $T inline expando, and /on timer, and /on idle) at the top of every minute. For some people, this was not nearly often enough. Now you can control exactly how often the clock is updated with this set. As an example, if you /SET CLOCK_INTERVAL 1 and /SET CLOCK_FORMAT %H:%M:%S the status bar clock will show seconds and update every second! The default value is 60 (the top of every minute). When CPU_SAVER mode is active, /SET CPU_SAVER_EVERY overrides this value. *** News 07/04/2003 -- New interface to $dccctl() You may not get or set the "offered address" of a dcc offer by someone else. Resetting the remote offered address may be necessary if the remote peer's client mangled the handshake. $dccctl(GET OFFERADDR) - Returns the address that the remote peer offered to make the dcc available at. It will be a p-addr (ie, "127.0.0.1") and a port number. $dccctl(SET OFFERADDR
) - Sets the address that the remote peer offered to make the dcc available at. It may be either a p-addr (ie, "127.0.0.1") or a hostname (ie, "remote.peer.icann.com"), and a port number. The empty string is returned if the connection is already open (it doesn't make any sense to change it at that point), or if the address you provide doesn't make sense. It returns 1 if the change was successful. *** News 07/04/2003 -- More interfaces to $ignorectl() You can now query and set the ignore's creation time, its last-used time, and the number of times it's been used: $ignorectl(GET CREATION) - Return the time the ignore was created. The first integer is in seconds and the second number is in milliseconds. This is the same format that $utime() uses. $ignorectl(GET LAST_USED) - Return the time the ignore was used (triggered). The first integer is in seconds and the second number is in milliseconds. This is the same format that $utime() uses. $ignorectl(GET COUNTER) - Return the number of times the ignore has been used (triggered). $ignorectl(SET CREATION ) - Set the time the ignore was created. The two values shall be system clock time, that is, the number of seconds after the epoch when the ignore was created. Why you would want to change this is beyond me, but you know, whatever. The ignore's refnum is returned. $ignorectl(SET LAST_USED ) - Set the time the ignore was last used (triggered). The two values shall be system clock time, that is, the number of seconds after the epoch when the ignore was last used (triggered). The ignore's refnum is returned. $ignorectl(SET COUNTER ) - Set the number of times the ignore has been used (triggered). This is probably most useful to reset to 0 if you want to see if an ignore is still being triggered or not. The ignore's refnum is returned. *** News 06/30/2003 -- Revamped /IGNORE support. The /IGNORE support for epic has been mostly rewritten, but the user-interface has tried to say the same. Several new features have been added: 1) Refnum support -- You can refer to an ignore by either its mask or its refnum. Output from /IGNORE includes the refnum. 2) Timeout support -- You can set an amount of time an ignore should be in force before it is automatically expired. At the end of the timeout, the ignore is removed and you are notified. 3) Ignore reasons -- You can attach to each ignore a reason string why you are ignoring the reason. This can help you in case you want to know when you set it or why the person is bothering you... Refnum support should be pretty easy to use -- wheerever you would normally give an ignore mask, you just use a refnum, for example: /ignore *!*really@long.address.com all *** Now ignoring ALL from *!*really@long.address.com (refnum 1) /ignore 1 none *** *!*really@long.address.com removed from ignorance list (ignore + refnum 1) /ignore *!*@foo.com all timeout 10 *** Now ignoring ALL from *!*@foo.com (refnum 2) [ after 10 seconds pass ] *** *!*@foo.com removed from ignorance list (ignore refnum 2) /ignore *!*@booya.com all reason "getting on my nerves" *** Now ignoring ALL from *!*@booya.com (refnum 3) because getting + on my nerves *** News 06/30/2003 -- New built in function, $ignorectl() This is a low-level interface to the ignore system $ignorectl(REFNUMS) - Return all integer refnums for all active ignores. $ignorectl(REFNUM ) - Given an exact ignore pattern, return that ignore's refnum. $ignorectl(ADD [level-desc]) - Add a new ignore, ala /IGNORE and return the refnum for the new ignore. is taken literally and should not contain spaces or commas. $ignorectl(CHANGE [level-desc]) - Change the ignore by adding or subtracting levels as indicated by [level-desc]. If is not a number or does not represent a valid ignore, the empty string is returned. Otherwise, is returned. $ignorectl(DELETE ) - Remove the ignore numbered $ignorectl(PATTERN ) - The effect of $igmask(): treating each ignore pattern as a literal string, return all refnums whose ignore masks are matched by the . $ignorectl(RPATTERN ) - The effect of $rigmask(): treating the argument as a nick!user@host string, return all refnums whose ignore masks match the nick!user@host string, that is, each ignore which would "cover" the nick!user@host. $ignorectl(WITH_TYPES [level-desc]) - The effect of $rigtype([level-desc]): return the refnums of all ignores which contain at least all of the levels indicated. It is possible for an ignore to have MORE levels set, but of those levels which are requested, all of them must be present. If you attempt to get a value but is not valid, the empty string is returned. $ignorectl(GET NICK) - Return the ignore-pattern for the ignore refnum $ignorectl(GET LEVELS) - Like $igtype(), but better: return a space separated list of all of the ignore levels that are active for this ignore, each level prefixed with exactly one character which indicates that level's disposition: / Suppressive ignore + Highlight ignore ^ Exceptive ignore $ignorectl(GET SUPPRESS) - Return an integer value that contains a bitwise representation of all of the suppressed levels for this ignore. The exact layout of this value is epic-version-dependant and may change in the future. If you use this value in a script, make sure you are using a layout compatable with the version of epic the user is using. $ignorectl(GET EXCEPT) - Return an integer value that contains a bitwise representation of all of the excepted levels for this ignore. See above for warning about trying to use this value. $ignorectl(GET HIGHLIGHT) - Return an integer value that contains a bitwise representation of all of the highlighted levels for this ignore. See above for warning about trying to use this value. $ignorectl(GET EXPIRATION) - Return the time the ignore is to expire as two integers. The first integer is the seconds and the second number is the milliseconds. This is the same format that $utime() uses. If the ignore does not expire, both values are 0. $ignorectl(GET REASON) - Return the reason the user set the ignore, if any. If you attempt to set a value but is not valid, then the empty string is returned. $ignorectl(SET NICK ) - Set the ignore-pattern for the ignore refnum. *** WARNING *** The ignore list is usually sorted, and changing this value may de-sort the ignore list. The result of this is uncertain and could destabilize epic. It is probably not a good idea to change an ignore's pattern. The ignore's refnum is returned. $ignorectl(SET LEVELS ) - Unconditionally set the ignore levels to . All levels previously in use are cleared and replaced with the new levels. You should prefix each level with one character to indicate it's disposition: / Suppressive ignore + Highlight ignore ^ Exceptive ignore The ignore's refnum is returned. $ignorectl(SET SUPPRESS ) - Unconditionally set the integer value corresopnding to the suppressive ignores for this ignore item. *** WARNING *** The exact layout of this value is version dependant on epic and may change in the future, so changing this value directly like this could corrupt the ignore if you don't know what version of epic you are using. You Have Been Warned. The ignore's refnum is returned. $ignorectl(SET EXCEPT ) - Unconditionally set the integer value corresopnding to the exceptive ignores for this ignore item. See above warning The ignore's refnum is returned. $ignorectl(SET HIGHLIGHT ) - Unconditionally set the integer value corresopnding to the highlighted ignores for this ignore item. See above warning The ignore's refnum is returned. $ignorectl(SET EXPIRATION ) - Set the time an ignore shall expire. The two values shall be system clock time, that is, the number of seconds after the epoch when the ignore shall be removed. This is not the expiration interval (the number of seconds from now it should be removed) but rather the absolute system clock time it should be removed. You can add the expiration interval to $utime() to get this value. If both values are 0, the ignore will not expire. The ignore's refnum is returned. $ignorectl(SET REASON [reason]) - Set the reason the user set the ignore. The return value is the reason. If no reason is given, the ignore's reason is removed. The ignore's refnum is returned. *** News 06/21/2003 -- New built in script, 'paste', /SET PASTE ON|OFF The 'paste' script implements three new sets and one keybinding: 1) /SET PASTE (ON|OFF) 2) /SET PASTE_STRIP (ON|OFF) 3) /SET PASTE_DELAY 4) Binds key ^P to /SET PASTE TOGGLE When you /SET PASTE ON, everything you type at the input prompt is taken to be literal text that you're pasting and it is sent to your current target without any interpretation by epic. This means you can paste things like C code with comments, or ircII code without EPIC interpreting your paste as commands. When you /SET PASTE OFF, everything goes back to normal. The default is OFF. Because it is theoretically possible for you to get stuck into paste mode, where you would be unable to /SET PASTE OFF, there are two ways out of "paste mode". The ^P (control-P) key binding will toggle the paste mode, turning it off if it is on (and turning it on if it is off...). The "paste mode" feature also turns itself off after a short delay, which you can control with /SET PASTE_DELAY. The default paste delay is 30 seconds. Anguzhawk, who asked me for this script originally, also wanted to able to strip off leading whitespace on pre-formatted text that he was pasting. If you /SET PASTE_STRIP ON, then epic will remove all leading whitespace from any text you paste. If you /SET PASTE_STRIP OFF, everything goes back to normal. The default is OFF. EPIC4-1.1.12 *** News 06/12/2003 -- New built in function, $serverwin([]) Given an optional server refnum (the current server is the default) this function returns the last window connected to the server to be made the client's global current window. The idea of this is to give you a window you can use with /xeval to run a command, or /xecho some text in the context of the correct server. If you want the "current channel" in an /on, you should do something like $winchan($serverwin()) instead of $C. *** News 06/12/2003 -- Improvements to epic's source code A lot of changes have happened internally to EPIC to improve the quality of its source code. For those of you who know about C, the types of things we fixed were: 1) Const correctness 2) Bad comparisons of integers of different sign and size. 3) Used valgrind to find a lot of uninitialized variables 4) Stopped using all ``unsafe'' functions 5) Treat all string literals as (const char *) [like #1] 6) Remove "shadow" variables 7) Prototype all extern functions, 'static' the rest. *** News 06/12/2003 -- New configure option, --with-warns On some systems (at least on freebsd), the gcc you're using has a lot of extra helpful warning flags which you can use to point out low-quality code. If you pass the --with-warns flag to configure, it will turn on most of the useful ones. If your compiler does not support these warnings, do not use this. *** News 06/12/2003 -- New: $dccctl(GET FLAGS) This returns an epic internal integer value that indicates some values that may be of interest. The composition of this value is undefined and is subject to change. See dcc.c for more info. At the time I wrote this, these are the flags: 1 dcc is DCC CHAT 2 dcc is DCC SEND 3 dcc is DCC GET 4 dcc is DCC RAW 5 dcc is DCC LISTEN 16 The dcc is inbound (other connects to us) 32 The dcc is open and active 64 The dcc is outbound (connect to other) 128 The dcc is pending deletion 256 The dcc is bi-directionally open 512 The dcc has been rejected by either peer. *** News 06/12/2003 -- New: $dccctl(GET [HELDTIME|HOLDTIME]) HELDTIME gives you a floating point value for how much time the dcc has spent in "hold mode". When you want to calculate kb/s, you want to subtract this number of seconds from the total open time. HOLDTIME gives you the time that the dcc was last held or unheld, depending on the value of $dccctl(GET HOLD). *** News 06/12/2003 -- New arg list qualifier, "QWORD" If you do alias foobar (arg1 qword 2, ...) { ... } it takes "double quoted words" but does not remove any double quotes around the words. This is in contrast to "DWORD" which does remove them. Example: alias foo1 (arg1 dword 2, ...) {echo $arg1} alias foo2 (arg1 qword 2, ...) {echo $arg1} /foo1 "one two" "three four" five six outputs one two three four /foo2 "one two" "three four" five six outputs "one two" "three four" *** News 06/12/2003 -- Overhaul of dcc code, full ipv6 support The DCC code has been largely rewritten, and should be a lot more stable (less prone to crashes) especially when you delete or close a DCC connection. IPv6 support has been fully added and it should work completely now with no exceptions. If you have any problems, let me know! *** News 06/12/2003 -- Changes to channel<->window handling Previously, each window was responsible for keeping track of what it's current channel was. This could be a problem if you wanted to reconnect, and each channel would rejoin its window, but you could never be sure which channel would be the current window. Now, each channel keeps track of whether it is the "current channel", and when you reconnect, all of the current channels should stay the same and not change around. *** News 05/04/2003 -- Change default of /set new_server_lastlog_level The new default for /SET NEW_SERVER_LASTLOG_LEVEL is now ALL,-DCC. *** News 05/04/2003 -- New built in function: $levelwindow() Given a server refnum and a lastlog level description, it returns a window for that server that claims any of the specified levels. If no windows for the server claim the level, -1 is returned. Since the DCC level is global to the entire client, that is handled specially. *** News 05/04/2003 -- New built in function: $outputinfo() The $outputinfo() function returns either one or two words: $0 Current output window level $1 Current output target (if any) The current output window level may be "NONE" which has the same meaning as "CURRENT". *** News 05/01/2003 -- New command in commandqueues, /timer.ue This functions the same as /timer, but won't expand the command when it is executed. It's not quite 100% clean yet. Don't try to execute numbers as commands. Also cleaned up /q1cmd to work properly with any input. *** News 04/10/2003 -- New status expando, %{1}+ The %+ status expandos returns the empty string (ie, it ignores the /set status_mode value) if a channel does not have a mode. The %{1}+ status expando will honor /set status_mode, and will substitute the empty string for %+. Example: Current channel is #epic, it does not have a mode /set status_channel [%C /set status_mode +%+] Then using %C%+ yeilds [#epic And %C%{1}+ yields [#epic +] *** News 03/29/2003 -- New /SET, /SET SWITCH_CHANNELS_BETWEEN_WINDOWS When this set is ON (default) the SWITCH_CHANNELS key binding will have its traditional (legacy) behavior, and will allow you to switch a window's current channel between all of the non-current channel windows in all windows connected to the same server. When this set is OFF, the SWITCH_CHANNELS key binding will have more sensible behavior, allowing you to switch between a window's channel list, but without grabbing channels from other windows. EPIC4-1.1.11 *** News 03/26/2003 -- Enhancements to $fsize(), $fexist(), $stat() If the first word passed to any of these three functions is the empty string, then the rest of the argument list ($1-) is taken as a single filename without any funny business from epic. This might be useful if you want to work with a file that has a space in it. Example: $fexist("" This song has spaces.mp3) $fsize("" one two three.jpg) *** News 03/23/2003 -- /DEFER now server sensitive When you do /DEFER , it will remember the current server and it will restore to that server when the commands are executed. At execution time, the commands will be run in the server's "current window" (see immediately below) which may or may not be the current window when you did the /defer, but it will definitely be a window connected to the server! *** News 03/23/2003 -- "Current window" tracking by server A new experimental feature is being added whereby each time you change the current window, it becomes its server's "current window". Since you can only have one current window per screen, but you can have more than one server connected per screen, epic may need to know what the "current window" is for a server other than the current window's server. Is this confusing enough yet? Well, think of it this way. EPIC will keep track of the last window that was the current window for all of your servers. Whenever EPIC needs to get a "current window" that is connected to a specific server, it can use this feature to find the last window that was a "current window" that is connected to the server. This is not an automatic thing; features will have to be converted to use this. Watch for updates. *** News 03/23/2003 -- New /TIMER verb, /TIMER -DELETE_FOR_WINDOW If you do /TIMER -DELETE_FOR_WINDOW then all of the pending timers for window will be deleted. You may want to do this before you destroy a window to make sure it's timers do not go off in another window! *** News 03/23/2003 -- New $serverctl() value, "MAXCACHESIZE" This value allows you to set the size of the largest channel for which userhost caching will be done. If you set this to a non-negative number, only channels with up to this many values will do userhost caching. If you set this value to 0, you will turn off userhost caching for this server, and if you set the value to a negative number you will enable userhost caching for all channels. You may need to tweak this value on servers where doing a WHO #chan for a channel with an extremely large number of users will cause the server to flood you off. Or if you just hate userhost caching. Examples: $serverctl(SET 0 MAXCACHESIZE 100) Don't do userhost caching for channels with more than 100 users when you join on server 0. $serverctl(SET 2 MAXCACHESIZE 0) Don't do userhost caching for any channels on server 2. $serverctl(SET 2 MAXCACHESIZE -1) Turn userhost caching on for all channels on server 2. $serverctl(GET 2 MAXCACHESIZE) Return the maximum size of a channel on server 2 for which userhost caching will be done. *** News 03/23/2003 -- New window verbs to control scrollback Now you can scroll around in windows without needing to use the key bindings. /WINDOW SCROLL_BACKWARD /WINDOW SCROLL_BACKWARD If is 0 or is not provided, scroll back the default number of lines, otherwise scroll back the given number of lines. Similar to SCROLL_BACKWARD keybinding. /WINDOW SCROLL_FORWARD /WINDOW SCROLL_FORWARD If is 0 or is not provided, scroll forward the default number of lines, otherwise scroll back the given number of lines. Similar to SCROLL_FORWARD keybinding. /WINDOW SCROLL_START Go to the start (oldest line) of the scrollback buffer. Similar to SCROLL_START keybinding /WINDOW SCROLL_END Go to the end (newest line) of the scrollback buffer. Similar to SCROLL_END keybinding *** News 03/23/2003 -- $loadinfo() extended The $loadinfo() function now returns the current loader as $2. You could use this to make sure that your script is being handled by the correct loader. At the top of every PF script, put the following line: if (word(2 $loadinfo()) != [pf]) {LOAD -pf $word(1 $loadinfo())} This will resubmit your script to the PF loader if it is loaded with some other (incompatable) loader. *** News 03/23/2003 -- New /LOADer, the Pre-Formatted Loader The new PF Loader can load pre-formatted scripts. You can load a preformatted script with: /LOAD -PF filename The PF Loader is a high-performance, low-overhead loader that does not do any tasks for you. It does not support C-like comments, it does not add semicolons for you at the ends of lines between commands, and it does not try to match up {'s and }'s to warn you of syntax errors. Files that are preformatted and loaded with the PF loader should load significantly faster. See the doc/pf-loader file for a tutorial on how to convert your standard scripts to PF scripts. *** News 03/23/2003 -- Changes to /LOAD On this date, the /LOAD command was reorganized. The new LOADer is generalized and can use different loaders. The following new arguments to /LOAD are supported: -STD (default) Load using the Standard EPIC loader -PF Load using the Pre-Formatted Loader (see above for more info) More loaders will be added in the future. *** News 03/18/2003 -- $dccctl() changes. Added $dccctl(xxx), where xxx is one of HELD, UNHELD, USERHOSTMATCH. Added $dccctl(get [ref] xxx) where xxx is one of USERHOST, SIZE. Added $dccctl(set [ref] xxx) where xxx is one of DESCRIPTION, FILENAME, USER, USERHOST, OTHERNAME, ENCRYPT. DCCs will record the current userhost taken from $userhost() (no args). This will be used to set the same variable for message processing under dcc chats. This isn't entirely useful at this point because if you initiate a dcc request from within any privmsg hook, where the userhost variable is correctly set, the request will be translated to a notice. This is true even for dcc chats. *** News 02/25/2003 -- Added %{1}D status variable. This acts exactly like %D, but is present on all windows where %D is present only on the window that has the DCC lastlog level. *** News 02/25/2003 -- Added DCC hold mode. $dccctl(set [ref] held 1) puts a dcc session on hold. $dccctl(set [ref] held 0) releases the hold. When a dcc session is on hold, no data is sent to it or received from it until the hold is released. This might be useful for bandwidth control or for granting priority to other unheld dccs. *** News 02/17/2003 -- New function $findws(). Similar to $findw() but returns _all_ matching words. *** News 02/17/2003 -- New functions ${no}chhops() in the functions script. Returns halfops in a channel (or not) like $chops() and $nochops(). *** News 02/17/2003 -- New functions $finditems() and $ifinditems() These functions work much like $finditem() and $ifinditem() but they perform substring searches. If the substring is found in the Karll array, then _a_ matching item/index number is returned. If the substring is not found, the twos compliment (negative minus 1) of the (index) insertion point is returned. *** News 02/17/2003 -- New function $dccctl() Introducing the newest member of our nice little family of bolt-ons, $dccctl(), which does many of the things related to DCC that are otherwise extremely difficult. $dccctl(refnums) returns all open DCCs. $dccctl(get [refnum] [element]) $dccctl(set [refnum] [element]) $dccctl(typematch [pattern]) $dccctl(descmatch [pattern]) $dccctl(filematch [pattern]) $dccctl(usermatch [pattern]) $dccctl(othermatch [pattern]) $dccctl(locked) returns all locked dccs. [element] can be one of: refnum $dccctl() reference number type (get only) description (get only) filename (get only) user (get only) othername (get only) encrypt (get only) (unused) filesize size of the transfer (get only) resumesize size that the transfer was resumed at (get only) readbytes number of bytes xfered (get only) sentbytes number of bytes xfered (get only) server from which the dcc was triggered (get only) locked (get only) (see below) remaddr remote address (get only) locaddr local address (get only) starttime of the transfer (get only) lasttime ? (get only) Note that the refnum concept is new to DCC and applies only to $dccctl(). This is necessary to nail down exactly which DCC is being refered to, but it is no help trying to find the current dcc in a DCC_LIST hook for eg. The best way to work with this is to use the "locked" keyword since epic locks a dcc before calling any hook refering to it. The *match sub-functions return the refnums of all matching DCCs. *** News 02/06/2003 -- New functions in script/functions Did to $timerctl() what was done to $serverctl() a few pages down. As with that command, this will change the way that subcommands are selected in ambiguous cases. *** News 02/06/2003 -- New functions in script/functions $min() and $max() (implemented elsewhere) $regpattern() simulates $pattern() with regexes. $regfilter() simulates $filter() with regexes. $index2wword() simulates $index2word() but ignores quotes. $jotm() for $jot()ing multiple ranges. $jotc() for $jot()ing character ranges. $maskm() simulates $mask() with multiple n!u@h args. $randn() returns multiple random numbers. $replace(xy y 1 2 3) returns "x1 x2 x3". $shuffle*() returns all arguments shuffled randomly. $uniqd() simulates the shell command "uniq -d". $wordn() emulates $word() but permits multiple word specs. $cut() simulates the "cut" shell command". $chvoices() returns voiced nicks on a channel. $chnovoices() returns unvoiced nicks on a channel. *** News 02/03/2003 -- Implement /SET SUPPRESS_SERVER_MOTD in script If you were a previous user of /SET SUPPRESS_SERVER_MOTD ON, then you will want to add load suppressmotd to your ~/.ircrc. This re-implements this /SET. And hopefully this script actually works, unlike the /SET. If you have any problems, let me know, and I'll try to fix it. If you want to try to improve it, please feel free and send me patches. Make sure you do a 'make install' before you report not being able to load this script as a bug! *** News 02/03/2003 -- $logctl(REFNUMS [ACTIVE|INACTIVE|ALL]) You can now do the following things with logfiles: $logctl(REFNUMS ACTIVE) returns all ACTIVE (on) logfiles $logctl(REFNUMS INACTIVE) returns all INACTIVE (off) logfiles $logctl(REFNUMS ALL) returns all logfiles *** News 02/03/2003 -- Logs now keep track of "last written time" Each logfile now has an "activity timer" which is reset when you first create the logfile, when you turn it on, or when you turn it off, or when any output is written to the logfile. You can work with this timer in the following ways: $logctl(GET ACTIVITY) returns the last time the logfile was written to $logctl(SET ACTIVITY) resets the log file's activity timer to current time /LOG ACTIVITY resets the log file's activity timer to current time *** News 02/03/2003 -- "Larnifications" to epic's server handling code Traditionally, ircII clients have trusted the server to send well formed data. If messages from the server were badly formed (for example, if arguments were missing or in the wrong order), ircII clients (including epic of course) would crash. Due to the repeated requests of some server developers, and particularly because of larne, who used to make sport of epic by modifying his server to send numeric garbage at epic to make it crash, a long and substantial project to rewrite all of the code that handles messages from the server has been undertaken. This marks the end of the first stage of the project, which protects epic from the server sending not enough arguments, which would cause a crash. Internally, I have referred to this as the "larnification project" in honor of larne, the person who pushed me over the edge into doing this sooner rather than later. I got his consent to use his nickname like this, so please don't think I'm making fun of him. For history's sake, this is an offshoot of the previous project which was called "Larneproofing" which was a band-aid to prevent most of the obvious problems caused by server's sending bad data. This was a full rewrite of the protocol-handling code. *** News 02/03/2003 -- Changes to how and when notifies are done Previously, NOTIFY events always occured at the top of every minute, along with other things like the updating of the system clock and /on timer. But now NOTIFY has been broken off into its own separate timer whose interval is controlled by /SET NOTIFY_INTERVAL (see below). How this will work is that each notify event will occur precisely /SET NOTIFY_INTERVAL seconds apart, except for the following cases! *) When the client starts up, the first notify event occurs at the top of the next minute *without regard to whatever the original value of /SET NOTIFY_INTERVAL is!* After this first notify event, the normal rules apply. *) When you enter CPU_SAVER mode, the next notify event will occur at its regular scheduled time, but subsequent notify events will occur at /SET CPU_SAVER_EVERY intervals! (IE, /SET CPU_SAVER_EVERY overrides /SET NOTIFY_INTERVAL when you're in cpu saver mode) *) When you leave CPU_SAVER mode, the next notify event will occur at the top of the next minute *without regard to whatever value of /set notify_interval! After the top of the next minute, the regular rules apply. These rules are needed to maintain as much backwards compatability as much as possible for most users, who will not change anything. *** News 02/03/2003 -- Changes to /SET NOTIFY_INTERVAL There is a new #define in config.h, #define MINIMUM_NOTIFY_INTERVAL which is an integer value that sets the minimum permissable value of /SET NOTIFY_INTERVAL. If you attempt to /SET to a lower value, it will be change to the minimum value. The default value is 60, and you can change it in config.h if you wish. *** News 02/03/2003 -- Changes to /ON WINDOW_KILL Previously, /ON WINDOW_KILL provided the window's "name or refnum" as $0. But if you wanted to get the refnum, you couldn't because the window had already been destroyed. So /ON WINDOW_KILL has been extended so $1 is always the window's refnum: $0 Window's "name or refnum" $1 Window's refnum *** News 01/30/2003 -- $serverctl() general cleanup. subcommands will be matched against as many characters as are supplied. This means that $serverctl(get 4 007) will not call the 005 subcommand for eg, but also that in ambiguous cases, the first matching subcommand is used where they may not have been before. *** News 01/30/2003 -- $serverctl(?match *pattern*) does wildcard matching. gmatch will return all servers matching group *pattern*. imatch will return all servers matching (its) server name *pattern*. omatch will return all servers matching (our) server name *pattern*. match was never implemented and has been removed. pmatch was never implemented and has been removed. *** News 01/30/2003 -- $serverctl(max) $serverctl(max) now returns the number of _slots_ in the server list. Note that this currently equates to the largest number of servers in the list at any one time. It doesn't shrink if you delete servers. *** News 01/30/2003 -- $afterw(), $beforew(), $fromw(), $tow().. WARNING: Incompatible change. If you experience problems because of this change, you should notify #epic on efnet. These functions will now do fixed string matching rather than pattern matching. I figure that the old method of implementing these functions is fundamentally flawed, and not useful for real world applications. Examination of many publicly available scripts seems to indicate that these functions are avoided and that where they are used, they constitute latent bugs since text matching is desired. *** News 01/30/2003 -- $writeb() dequotes data. This makes it capable of writing binary data. $writeb($writefd $read($readfd $numbytes)) will copy $numbytes of binary data from one FD to the other faithfully. *** News 01/30/2003 -- Subsecond /sleep. /sleep now accepts floating point arguments. This makes it much the same as /usleep which accepts integer microsecond values, but not entirely. *** News 12/23/2002 -- /exec options tuned. -line, -linepart, -error and -errorpart can now be changed for a process on the fly, using %process like the other options. Using the -window option will now nail the process to the server too. *** News 12/23/2002 -- $xdebug() now accepts masks. *** News 12/23/2002 -- /redir tuned /redir now permits raw dccs to be used. Also, when used outside of the command line script, the $* arguments will now be available. *** News 12/23/2002 -- New /set, /set FLOATING_POINT_PRECISION This sets the number of decimal places of the results of floating point math. Note that this makes FLOATING_POINT_MATH redundant. EPIC4-1.1.8 *** News 12/23/2002 -- Document /SET KEY_INTERVAL This hadn't been documented anywhere yet. Whoops. When you have two competing key bindings, /bind ^H backspace /bind ^H^H parse_command {echo hi!} Then when you press ^H, epic does not know whether you want to do the backspace, or if you will be pressing ^H again to get the parse_command. So EPIC waits for /SET KEY_INTERVAL milliseconds to see what you do. If you press ^H again within the timeout, it does the parse_command. If you do not press any key before the timeout, it does the backspace. If you press any other key than ^H (which would yield an unbound sequence), then epic immediately does the backspace and treats the second character as the start of a new sequence. Do not set this value too low, or you will have problems with your cursor keys on low telnet links. *** News 12/18/2002 -- New function $timerctl() - control /TIMERs Usage: ------ $timerctl(REFNUMS) $timerctl(REFNUM ) $timerctl(ADD \ ) (NOT IMPLEMENTED YET) $timerctl(DELETE ) $timerctl(GET ) $timerctl(SET ) Where is one of the following: TIMEOUT Returns " " representing when the timer is scheduled to go off. COMMAND What commands shall be executed. SUBARGS What the value of $* shall be REPEATS The number of times that this timer shall execute (usually 1 for one-shot timers) INTERVAL The interval to wait between executions (takes effect the next time timer executed) SERVER The server the timer is connected to WINDOW The window the timer is connected to REFNUMS returns all active timer refnums, including system timers. REFNUM returns the refnum for the timer if it is a valid refnum. ADD is not implemented yet. Use /TIMER for now. DELETE removes a timer, natch GET returns one of the attributes of the timer SET changes one of the attributes of the timer. SET is dangerous. You can really confuse epic by changing values to nonsensical or conflicting values. In exchange for giving you total flexibility, you must suffer the peril of any mistakes you make stomping on your own timers. You are not allowed to change attributes for system timers. You are not allowed to delete system timers. *** News 12/11/2002 -- Nick fudger now uses NICKLEN 005. If your server's nickname length is other than 9, epic will extend with _'s your nickname to the permitted length to find you a nickname that is available for use. *** News 12/11/2002 -- /on DCC_RAW mask change The remote-port field of this hook in the "connection accepted" mode (where field 2 is "N") has changed. Field 3 is now the _local_ port rather than the remote. This probably won't be a problem for anyone, since the remote port is rather useless information on its own, and examination of some popular scripts bears this out. If this _is_ causing a problem for you, then you should contact #epic on efnet. *** News 12/11/2002 -- /exec "-closein %proc" flag - better pipe control. This should make /exec much more useful for things like sort and md5sum which will only start "working" when their input closes. *** News 12/11/2002 -- /alias arguments list "improvement". The "alias [alias] (arg, arg, args) { [body] }" form of /alias has been changed to work more like the documentation says it does. This means that (args words 2) will actually take 2 words from the args list. In addition, if /xdebug extractw is on, then "double quoted words" will be treated as such too. There is a slight performance penalty for this and it can probably be improved. It would be nice to be able to specify how double quoted words should be treated in the args list too. *** News 12/11/2002 -- Enhanced autoget script. Autoget has three new commands: /autoreget, /autoreject and /autoclobber. The first two take masks for arguments, and the third is used to specify how autoreget will work. Also, the masks have changed. You can still specify *.ext, but the mask will be matched against nick!user@host,IP,file. This only matters if you currently use file* as a mask, in which case you need to specify *,*,file* or *file* now. *** News 12/11/2002 -- String length limits on /pretend removed. The string length is now limited by the limits epic puts on a message received from the server. *** News 12/11/2002 -- $tcl() - Tcl support. $tcl() will take a Tcl expression and evaluate it much like $perl() does with Perl expressions. In addition, the tcl interpreter has an epic command which works like this: * "epic cmd [epic command]" runs the epic command. * "epic eval [epic command]" evaluates the epic command. * "epic expr [epic expression]" returns whatever the epic expression returns. There is no equivalent to $perlcall() just yet, and it may never come, so to escape quoting hell it is necessary to pull any data the expression requires into Tclspace via the epic command described above. Don't even bother trying this out just yet as the configure script hasn't quite been finished for this. You need to specify --with-tcl when you run configure to get it working. *** News 12/11/2002 -- Slightly enhanced flood detection New features: * /SET FLOOD_RATE_PER acts as a divisor for FLOOD_RATE. * /set FLOOD_MASKUSER to values 0, 1 or 2. * $floodinfo(*) returns the internal counters that match *. * Improved algorithm which will hopefully retain the flooders longer when the buffer is too small to hold all of them. * Returning 1 from the FLOOD hook will now cause the counters for the user to be reset. When FLOOD_MASKUSER is set to 2, the internal counters apply to hosts only. When it is 0, they apply to the user@host, which is the old behaviour. When it is 1, the user@host is used if the user begins with an alphanumeric character, and only the host otherwise. A value of 1 will probably catch most drones more effectively but the default is 0. The values returned by $floodinfo() are "lists of lists" and the fields for each list are: * USER@HOST or @HOST * Channel or * * Message type * Server * Message count * Seconds since first message This flood detection is still far from perfect or complete. It is necessary for FLOOD_USERS to be at least as large as the number of flooders for it to work effectively. If it is half that number, it will be struggling to keep up with half of them. *** News 12/11/2002 -- New function $winline() - read window lines Like $line() but reads from the scrollback instead of the lastlog buffer. *** News 12/11/2002 -- New function $exec() $exec() runs the command given and returns three pipes for STDIN, STDOUT and STDERR of the process. These can be used with $read() and $write(), however reading from a pipe that is empty or writing to one that is full will cause epic to block and perhaps deadlock, so the semantics can be tricky. This is not designed to be a replacement for /exec. *** News 12/11/2002 -- $read($fd $bytes) now returns quoted strings. $read($fd $bytes) will now quote the dangerous characters listed below in the return value. With the new function $asciiq() below, this gives the scripter the ability to read (but not yet write) binary data. *** News 12/11/2002 -- New functions $asciiq and $chrq() These are designed to more easily handle binary data. $asciiq() will translate \r, \n, \0, \a and \\ to CR, LF, NULL, 0x01 and "\" prior to returning the ascii values of the string. $chrq() is the compliment of $asciiq(). *** News 11/26/2002 -- Restrictions on /TIMER within a /TIMER removed There are now no restrictions whatsoever about where and when you can use /TIMER. Until now, you could not update/change/delete a timer while another TIMER was executing. This was particularly troublesome for people who wanted to be able to have a recurring timer and then be able to deactivated it; the only way to do this was with /defer. Now you can /TIMER -delete it from within itself. *** News 11/07/2002 -- /XECHO -W now takes channel argument Until now, the argument to /XECHO -W had to be a window refnum. Now you can provide a channel as the argument, and epic will output to that channel's window. Please be aware that the channel you provide will be looked for in the "current server", so make sure that is really what you want. This is useful in /ONs when you want to output something but you can't be bothered to look up the channel's refnum. For example: on join * { xecho -w $1 BOOYA BOOYA BOOYA BOO! } *** News 11/07/2002 -- $center() improved $center() was rewritten here, so if you see any problems, this is probably when they were introduced. *** News 11/07/2002 -- $geom() can now take a window reference Until now, $geom() returned the size of the screen as reported by your TERM setting. This was not always entirely useful. The size returned is now always the 'true size' of the screen. You can also give it a window reference (eg, on another screen) to get the geometry of a secondary screen. This is important now that screens can be independantly sized. *** News 11/07/2002 -- /WINDOW NAME now takes extended words as arguments You can now give a window a name with spaces in it by surrounding the entire name with double quotes. For example: /window name "My Window #1" *** News 09/27/2002 -- New function $logctl() - control logfiles This has actually existed since 09/03/2002, but I forgot to document it, so here goes! Usage: ------ $logctl(REFNUM log-desc) $logctl(ADD log-desc [target]) $logctl(DELETE log-desc [target]) $logctl(GET [ITEM]) $logctl(SET [ITEM] [VALUE]) $logctl(MATCH [pattern]) $logctl(PMATCH [pattern]) where [ITEM] is one of the following REFNUM The refnum for the log (GET only) NAME The logical name for the log FILENAME The filename this log writes to SERVER The server this log associates with (-1 for any) TARGETS All of the targets for this log LEVEL The Lastlog Level for this log REWRITE The rewrite rule for this log MANGLE The mangle rule for this log STATUS 1 if log is on, 0 if log is off. TYPE The type of the log (SERVERS, WINDOWS, TARGETS) *** News 09/26/2002 -- New /WINDOW verbs, SEARCH_BACK and SEARCH_FORWARD These two window verbs take a regular expression (regex) and scroll backward or scroll forward to the previous or next line which matches the regex, and makes that matching line the top of the screen. For example: /WINDOW SEARCH_BACK foo will scroll your window backwards until it finds a line that contains the string "foo"; that line will be put at the top of the window. If you search backwards or forwards, and there are no matches in the direction you're going, then this operation will beep and will not change your display. Please remember that these operations put you into scrollback mode, so you will need to use the SCROLL_END keybinding to see any new output that arrives. *** News 09/26/2002 -- Decoupling of /FLUSH and /WINDOW FLUSH Previously, if you did /FLUSH, it threw away data from the server and also threw away your hold buffer. Now that there is no hold buffer, it becomes less sensible for /FLUSH to force you to throw away something that doesn't really exist. So /FLUSH now only throws away data from the server but does not mess with your scrollback buffer. If you want to mess with your scrollback buffer you can of course always do /WINDOW FLUSH. *** News 09/26/2002 -- Refinement of /WINDOW FLUSH Now that there is no distinction between the scrollback buffer and the hold buffer, it is not possible for /WINDOW FLUSH to remove the hold buffer. So /WINDOW FLUSH has changed; what it does now is throw away everything in your scrollback buffer below whatever is currently on your screen, and it turns off /WINDOW HOLD_MODE and it turns of scrollback mode. *** News 09/26/2002 -- Mostly broken feature /WINDOW SCROLL now totaly broken The /WINDOW SCROLL feature which did not work properly now is completely useless. The value of /WINDOW SCROLL is ignored; all windows must scroll. *** News 09/26/2002 -- Refinement of meaning of /WINDOW HOLD_MODE ON When you have /WINDOW HOLD_MODE on, the top of the window is fixed; it is held; it will not move unless you move it. Now that the hold buffer and scrollback buffer are fully integrated, you can move forward through the hold buffer by using the SCROLL_FORWARD keybinding, just as if you were being scrolled back. Please remember that if you have /WINDOW HOLD_MODE ON, it does not act like normal scrollback functionality; when you reach the bottom of the hold buffer, it will never automatically turn HOLD_MODE off. You must do that yourself. This is to maintain backwards compatability. *** News 09/26/2002 -- /SET HOLD_MODE and /SET HOLD_MODE_INTERVAL now scripted The /SET HOLD_MODE and /SET HOLD_MODE_INTERVAL sets have always been aliases for /WINDOW HOLD_MODE and /WINDOW HOLD_MODE_INTERVAL. So the hardcoded /SETs have been removed from EPIC and script compatability shims have been put into the 'basical' script which is loaded when you start EPIC. Unless you don't use epic's scripts, you will not notice any change. *** News 09/26/2002 -- Remove /WINDOW SCRATCH (unnecessary) As part of the integration of scrollback and hold buffers, every window was made capable of supporting /XECHO -LINE. In simple terms, every window is now a scratch window, so you no longer need to /WINDOW SCRATCH ON before you use /XECHO -LINE. *** News 09/26/2002 -- Finished integration of scrollback and hold buffers The primary change you will notice is when you are using scrollback and you reach the "scrollback point", you will no longer turbo-scroll to the end of the hold buffer. This annoying "feature" was due to the incomplete integration of the scollback and hold buffers. You are now able to scroll back and forth freely through both the scroll back and hold buffers, and you do not leave scrollback mode until you reach the end of the hold buffer. *** News 09/11/2002 -- New window verb, /WINDOW MOVE_TO The /WINDOW MOVE_TO verb makes the operative window the Nth window on the screen (counting from 1, just as /WINDOW GOTO does) For example, if your screen has five windows, (A B C D E), and you go to window D and do /WINDOW MOVE_TO 2 then your screen will be re-ordered to (A D B C E). If is less than 1, then this command does nothing. If is greater than the number of windows on the screen, the operative window is made the last window on the screen. Nothing about the content of any window changes -- only the order they appear on the screen. *** News 09/03/2002 -- New built in command, /LOG, general purpose log files General Purpose Log Files work quite a bit like windows, but instead of displaying to your screen, they write to a file. Each /LOG command works by choosing a logfile, and then performing one or more actions upon it -- just like the /WINDOW command. However, there is no concept as a "current logfile" so each time you use the /LOG command you need to re-specify the log you want to use. These are the operations currently supported by /LOG Options that modify the log's configuration ------------------------------------------- NEW Create a new logfile to work on. REFNUM Work on the specified log file, using either it's name (see below) or its refnum. NAME Change the logical name of the logfile to . You can use in /LOG REFNUM later. FILENAME Change the filename that this log writes to. You MUST specify a filename before you can turn a log ON! TYPE Each logfile can log one of three different "types" of things; either a list of nicks or channels ("TARGETS"), a list of windows ("WINDOWS") or a list of servers ("SERVERS"). The default type is TARGETS. WARNING! If you use /LOG TYPE, all of the current targets you have added to the log will be destroyed, even if you don't change the type! This is how you can destroy the target list if you want to start over. SERVER Change the server this logfile belongs to. By default the log belongs to whatever the current server was when it was created. If you use the special server refnum -1, then the log works for all servers. LEVEL The lastlog levels to send to this log. ALL is the default. Options that modify the log's state ----------------------------------- ON Turn the logfile on. OFF Turn the logfile off. Options that modify the log's target list ----------------------------------------- ADD [,...] If the log is of "TARGET" type, then add a list of one or more nicks or channels to the current target list. If the log is of "WINDOW" or "SERVER" type, then add a list of one or more window or server refnums to the list. REMOVE [,...] If the log is of "TARGET" type, then remove a list of one or more nicks or channels to the current target list. If the log is of "WINDOW" or "SERVER" type, then remove a list of one or more window or server refnums to the list. Options that modify how the log writes to the logfile ----------------------------------------------------- MANGLE Change how stuff written to the log will be "mangled". By default, the logfile will be mangled with /SET MANGLE_LOGFILES. REWRITE Change how stuff written to the log will be "rewritten". By default, the logfile is rewritten with /SET LOG_REWRITE. Other options ------------- KILL Irreversably destroy a logfile. Once you kill a logfile, you cannot operate on it again. DESCRIBE Give detailed information about the current state of the logfile. LIST Give brief information about all logfiles. Examples: --------- If you wanted to log #epic, you could do something like this: /LOG NEW NAME epic-log FILENAME ~/logs/#epic ADD #epic ON Then if you wanted to close that log later you could do /LOG REFNUM epic-log OFF or /LOG REFNUM epic-log KILL If you wanted to log anything that went to windows 2 or 3: /LOG NEW NAME mywinlog FILENAME ~/logs/win23 TYPE windows /LOG REFNUM mywinlog ADD 2,3 ON If you wanted to log anything that happened on server 2: /LOG NEW NAME servlog FILENAME ~/logs/serv2 TYPE servers /LOG REFNUM servlog ADD 2 ON EPIC4-1.1.7 *** News 08/12/2002 -- New keybindings system in place (wd) The old keybinding system (keys.c) has been completely rewritten to add support for various new functionalities. It is now possible to bind arbitrarily long strings of arbitrary values to binding functions, as well as to bind substrings of these to other functions. The META system has been removed as a result of this, so you can no longer bind to any META*_* functions. Also, there is no longer a META_STATES set. *** News 08/12/2002 -- New function $bindctl(...) (wd) Another side effect of the new keys system, a bindctl function has been added which allows for the creation of new binding functions, the retrieval of all currently available functions, and other low-level interfaces to the binding system. "FUNCTIONS" are particular keybindings. You can create your own keybinding which will run arbitrary ircII code, and you may bind SEQUENCES to it. $bindctl(FUNCTION CREATE ) Create a new keybinding named that will run whenever it is invoked. $bindctl(FUNCTION DESTROY) Destroy the keybinding named . You may only destroy keybindings that you created with $bindctl(FUNCTION CREATE ...) $bindctl(FUNCTION EXISTS) Returns 1 if is a valid keybinding of any type (built-in or user-created), and returns 0 if it is not a valid keybinding. $bindctl(FUNCTION GET) If is not a valid keybinding, then this function returns the empty string. If is a valid built-in keybinding, it returns the string "internal " where is a pointer to a function in memory and cannot be used by the scripter. If is a user-created keybinding, then it will return the string "alias " where is whatever was passed to $bindctl(FUNCTION CREATE ) $bindctl(FUNCTION MATCH) $bindctl(FUNCTION PMATCH) $bindctl(FUNCTION GETPACKAGE) $bindctl(FUNCTION SETPACKAGE ) A "SEQUENCE" is a string of one or more characters which, when pressed in succession, result in the execution of a FUNCTION. $bindctl(SEQUENCE GET) $bindctl(SEQUENCE SET [extra]) $bindctl(SEQUENCE GETPACKAGE) $bindctl(SEQUENCE SETPACKAGE ) A "MAP" is a string of one or more characters which are the leading substring to one or more SEQUENCEs. MAPs are not bound to FUNCTIONs. $bindctl(MAP CLEAR) EPIC4-1.1.6 *** News 07/29/2002 -- New function $killpid( [ ...]) This function sends a signal to another process. may either be a signal name (ie, HUP, KILL) or a signal number (ie, 1, 9, 15), and is a list of one or more pids that you want to kill. All of the processes are kill(2)ed with the given signal. The return value is the number of processes that were sucessfully signaled. *** News 07/29/2002 -- Casualties of IPv6 support The following features did not survive the addition of IPv6 to EPIC. Please do not ask for these features to be restored. Such requests will not be honored. /SET RANDOM_LOCAL_PORTS This feature was IPv4 specific. *** News 07/29/2002 -- (Nearly) Complete IPv6 support EPIC now fully supports IPv6 in server descriptions, server connections, $connect(), $listen(), /DCC GET, Virtual Hostnames, $iptoname(). Here are the particulars: Server descriptions Surround the ipv6 p-addr with square brackets: /server [1:2::3]:... Server connections You can now connect to servers via IPv6! $connect( ) where is "4", "6", "v4" or "v6" and is optional. $listen( ) where is "4", "6", "v4" or "v6" and is optional. /DCC GET If you receive a DCC SEND handshake from someone else and it uses an IPv6 hostname, you will be able to /DCC GET that file. This is forward compatability. Nobody can do /DCC SEND via IPv6 yet. Virtual Hostnames If the hostname that you choose as your virtual hostname has an IPv6 address, then that IPv6 address will be used as your virtual host if you connect to a server via IPv6. $iptoname() Both IPv4 and IPv6 "p-addrs" (ie, A.B.C.D or A::B:C) are now supported. *** News 07/03/2002 -- /STACK now supports keybindings (wd) The /STACK command now has added support for keybindings (/BIND). The system works in the same manner as the other /STACK types, you can push, pop, or list on the bind stack by doing one of /STACK (push|pop|list) BIND *** News 05/26/2002 -- The beginnings of support for IPv6 On this date I commited the very first set of changes adding infrastructure for IPv6. If you do not have IPv6 support, EPIC may not compile for you until we add compatability shims. There is no timeframe for this -- you may need to stick with EPIC4-1.1.5 until this conversion is cleared up. *** News 05/20/2002 -- New functionality to /FE and /FEC CrazyEddy needs to document this. =) Keep a look out in the future for updates to this item. *** News 05/20/2002 -- Clarify distinction between /WINDOW NOSERV and DISCON If you do /WINDOW NOSERV, the window is not connected to a server and will not be considered connected to a server if you later reconnect. This window should (hopefully) never try to reconnect to a server. If you a /WINDOW DISCON then the window is not connected to a server, but it is considered to be disconnected from the server so if you later do a reconnect for that server, the window will be picked up and re-attached to that server. *** News 05/20/2002 -- EPIC beginning to move towards protocol independance At some point very soon EPIC will start supporting IPv6. A great deal of networking code has been cleaned up in anticipation of this. EPIC4-1.1.3 *** News 03/12/2002 -- New built in function, $servertype() This returns the protocol being used to talk to server . It's generally either "IRC" or "IRC-SSL". *** News 03/12/2002 -- The -SSL option removed from /server and /window server Don't use this flag any more: specific ssl connections in the server-spec or use $serverctl(SET SSL 1) (see below) *** News 03/12/2002 -- New built in function, $getcommands() This function works just like $getsets(), except that it returns built in command names instead of set names. ;-) *** News 03/12/2002 -- The -p flag to /DCC is working again. If you've noticed things like /DCC SEND nick -p file haven't worked, this is just a heads-up to let you know that (I think) we fixed that. *** News 03/12/2002 -- /IGNORE #channel CRAP now ignores QUITs This seems pretty straightforward, no? *** News 03/12/2002 -- "Server-spec" changed, expanded: Review: "server-spec" is host:port:pass:nick:group:protocol, and everything but 'host' is optional. Fields are separated by colons. The "protocol" field has been added. For now, the only supported protocols are "irc" for normal irc connections, and "irc-ssl" for SSL-enabled irc connections. If one of your fields contains a colon (like the host field, for IPv6 addresses, or maybe the password field), you can surround that field with double quotes, and the colons inside will not be considered the end-of-field. Example: /server -add irc.epicsol.org:6667:"my:pass":hop *** News 03/11/2002 -- New built in function, $serverctl() The $serverctl() function is a low-level interface to the server list and server objects. With this function you can retrieve and reset specific information about a server refnum. $serverctl(REFNUM host:port:pass:nick:...) $serverctl(REFNUM host port pass nick ...) This function looks up the server description given and returns that server's refnum. If the description you give is not in the list, then it is added to the list (ala /SERVER -ADD) and its new refnum is returned. $serverctl(REFNUM number) If "number" refers to a valid server refnum, then it will return "number". If "number" is not valid, it returns the empty string. $serverctl(GET AWAY) Get server 's away message, if applicable. $serverctl(GET CONNECTED) Returns 1 if you are connected and registered to server and 0 if you are not. $serverctl(GET COOKIE) Returns the TS/4 "cookie" for our connection, if we have one. $serverctl(GET GROUP) Returns the server group affiliation. $serverctl(GET ITSNAME) Returns the server's notion of its own name. (This is specified by the server's administrator in the ircd.conf file and reflects the server's logical target name on irc.) $serverctl(GET NAME) Returns our notion of the server's name (this is what you provided as the "host" field in the server description, and represents the internet hostname that we use to connect to the server.) $serverctl(GET NICKNAME) Returns your current authoritative nickname. $serverctl(GET PASSWORD) Returns the password that we use to connect to the server. $serverctl(GET PORT) Returns the port number we use to connect to the server. $serverctl(GET QUIT_MESSAGE) Returns the default QUIT message for this server, if any. $serverctl(GET SSL) Returns 1 if this server tries to establish an SSL connection to the server, and 0 if it does not. $serverctl(GET UMODE) Returns your "user mode" on the server. $serverctl(GET USERHOST) Returns what the server thinks your userhost is. $serverctl(GET VERSION) Returns the server's raw version id string (eg. "2.8/hybrid-5.3p8") $serverctl(SET AWAY ) Sets server 's away message. Takes effect immediately. Returns 1 to indicate success. $serverctl(SET CONNECTED ) You cannot change the CONNECTED status; always fails. $serverctl(SET COOKIE ) Sets server 's TS/4 cookie. DANGER! Changing the cookie may result in revocation of saved priveleges. Use with caution. Returns 1 to indicate success. $serverctl(SET GROUP ) Sets server 's server group affiliation. Returns 1 to indicate success. $serverctl(SET ITSNAME ) Sets our notion of the server's own name. !!!DANGER!!! Changing this value will result in undefined behavior; at the very least EPIC will most certainly malfunction when connected to a real irc server. Use with EXTREME caution. Returns 1 to indicate success. $serverctl(SET NAME ) Sets the hostname that we use to connect to the server. This does not take effect until you reconnect. Returns 1 to indicate success. $serverctl(SET NICKNAME ) Changes your nickname to . This takes effect immediately. Returns 1 to indicate success. $serverctl(SET PASSWORD) Changes the password used to connect to the server. This does not take effect until you reconnect. Returns 1 to indicate success. $serverctl(SET PORT) Changes the port number we use to connect to the server. This does not take effect until you reconnect. Returns 1 to indicate success. $serverctl(SET QUIT_MESSAGE) Sets the default QUIT message for this server. $serverctl(SET SSL) Set the "SSL enable" flag; if set to 1, epic treats this server as an SSL server and tries to connect to it with an SSL connection. If 0, then it treats it as a normal irc server. Returns 1 to indicate success. $serverctl(SET UMODE) You cannot change your user mode using this just yet. Always returns the empty string to indicate failure. $serverctl(SET USERHOST) Changes epic's notion of what the server thinks your userhost is. This is the value used if /SET DCC_USE_GATEWAY_ADDR is set to ON. !!!CAUTION!!! Changing this value could totaly break your ability to use /DCC if /SET DCC_USE_GATEWAY_ADDR is ON. Use with caution. $serverctl(SET VERSION) Sets epic's notion of what the server's raw version id string is. Returns the server's raw version id string (eg. "2.8/hybrid-5.3p8") $serverctl(GMATCH ) "Group match" -- Returns a space separated list of all server refnums that belong to the server group . *** News 02/13/2002 -- Completely redesigned /QUEUE command The /QUEUE command has been completely revamped and redesigned. The old quirky bugs and mis-features and poor design have been removed and replaced with a better system. Forget about how /QUEUE used to work, here is how it works now. =) /QUEUE List the name and size of all pending queues /QUEUE -SHOW List the name and contents of all pending queues /QUEUE -LIST List the contents of the d queue /QUEUE -FLUSH Delete the queue and all of its contents /QUEUE -DELETE Delete the th entry in the d queue; all entries are moved down one position. Entries are counted from number 1. /QUEUE -DO Run the contents of the d queue and delete the queue when done. /QUEUE -DO -NO_FLUSH Run the contents of the d queue but do not delete the contents. /QUEUE -EXPAND_NOW { } Expand now, and then add the result as a new entry to the d queue. SEE NOTES BELOW. /QUEUE { } Add as a new entry to the d queue. /QUEUE -HELP Syntax information for /QUEUE. In general, queues are created when you first add a command to them. Queues are destroyed when they are run, or when you flush them. It is not an error and you will not get a message if you try to flush a queue that does not exist. If you try to operate on a queue that does not have any commands, you will get an error message. While you may be able to get away with specifying flags in combinations other than the ones listed above, it is not recommended. With that out of the way, you may be asking, "What are /QUEUEs?" Queues are named entities into which you can put an arbitrary number of commands, which you want to execute all of at some later time. The absolutely most obvious use of this is to programmatically create an "unload" feature for a script pack. Every file can add an entry into some named queue to un-do the effects of that script. This can be much more effective than /unload, which is rather primitive. The old /QUEUE had some big problems; it always expanded your twice -- once when you added them to the /queue and then once again when they were executed. This subjected your commands to "quoting hell" and made using /QUEUE awkward since you had to make sure none of your expandos contained more expandos. Now /QUEUE will only expand your once: just before they are executed. Now, you might be thinking "what about $* and $0 and $1 and so forth?" The good news is that /QUEUE saves $* and uses it when is executed. This means that you _can_ use $* and $0 and $1 and so on in your , and they will expand to whatever they would have been when you added them to the /queue. However, any OTHER expandos (such as $N or $C or function calls) will all be expanded with their values _just before the command is run_ and NOT with the values they had at the time you added the command to the /queue! THIS BREAKS BACKWARDS COMPATABILITY. If you need backwards compatable behavior for some bizarre reason, the -EXPAND_NOW flag is available to simulate the original behavior of /QUEUE. I would urge you to only use this as a crutch and to stop using it as soon as you can arrange it. *** News 02/02/2002 -- New special /MSG target, target 0 If you send a message to target 0 (/msg 0) then EPIC will just silently drop the message with no output. This was done, because /REDIRECT 0 is already a "sink"; but now you can use target 0 as a "sink" anywhere you might want to go through the motions of sending a message but don't actually want messages to be sent. For example, /query 0 would accept and discard all "target text" Target 0 was chosen because it is an illegal irc target, and because /REDIRECT 0 already has these semantics. Hopefully this should not break anybody. *** News 02/02/2002 -- New special /MSG targets, @ and @w Files that you have opened with $open() may now be /msg'd using the special syntax /MSG @ where is the return value of $open. You can of course /query @ or /redirect to it; anything that sends a message can use @ to send to an $open() file. Since infers by inclusion the ability to write to a window or global logfile (see below), you can also /MSG, /QUERY, /REDIRECT, or in any other way send a "message" to a window's logfile or to the global logfile, with /MSG @w where is the window's refnum, or -1 for the global logfile. *** News 02/01/2002 -- New /WINDOW verb, /WINDOW NOTIFIED This window action manually toggles a window's "notified" state. A window that is "notified" shows up in the %F status line expando. Normally, the "notified" state is set and reset automatically by EPIC, but you can change it manually now with this if you wish. *** News 02/01/2002 -- /SET NOTIFY_INTERVAL 0 now suspends notify. If you want to turn off NOTIFY for a while, but you don't want to clear your notify list, you can /SET NOTIFY_INTERVAL 0 and no NOTIFY activity will occur until you /SET NOTIFY_INTERVAL to some non-zero value. Remember that the value is in seconds and the default is 60 (every minute). *** News 02/01/2002 -- $channel() value now includes half-op information If a user is known to be a half-op, then the '%' character will be present in the first position before their nick. This is the position where you would normally see a @ for a channel operator. Example: $channel() might return %.NICKNAME if "NICKNAME" were a half-op on your current channel. *** News 02/01/2002 -- New flag to /LASTLOG, /LASTLOG -FILE If you want to dump the results of the /LASTLOG command to a file, you can now specify a filename with the -FILE flag. Example: /LASTLOG -FILE myfile booya will output all lines in your lastlog matching "booya" to the file "myfile" This is similar in principle to: @fd = open(myfile W) redirect @$fd lastlog booya @close($fd) *** News 02/01/2002 -- /IF command supports "elif" and "else if" clauses In addition to the following supported forms: if (expr) ...... if (expr) {......} if (expr) {......} {......} if (expr) {......} else {......} if (expr) {......} elsif (expr2) {......} the following two forms are now supported: if (expr) {......} elif (expr2) {......} if (expr) {......} else if (expr2) {......} *** News 02/01/2002 -- New built in functions, $serverourname() EPIC keeps track of two different names for every server in your server list: "ourname" and "itsname". "Ourname" is the name that you give to EPIC in the /SERVER or /WINDOW SERVER command or in the server file list. When we are officially registered and accepted by the server, the server tells us what "itsname" is, this is the name given in the server's M: configuration line. This is the name it uses when it refers to itself. $servername() already returns "itsname" [if we know "itsname"] or "ourname" if we don't know "itsname" yet. This function lets you get "ourname" at any time, even after registration. *** News 02/01/2002 -- New built in functions, $servergroup() This returns the server's group name that you specified in the /SERVER or /WINDOW SERVER command or in the server file list. *** News 02/01/2002 -- New built in function, $regmatches() This is a (slightly) more useful copy of the $regexec() function. It takes an extra argument between complied-pattern and string indicating the number of matches to return. Returned matches are _not_ expressed as strings, but pairs of numbers which can be applied to $mid() to extract the matched substring. Please note that substrings do not refer to multiple occurences of strings. At least, not in the glibc implementation I'm using. *** News 02/01/2002 -- New built in function, $corpattern() Whereas $copattern( ) treats $ as a list of words, which are matched against and whereas the corresponding words from $ are returned for each word in $ that is matched by ... $corpattern( ) treats $ as a list of patterns, which are matched against , and the corresponding words in $ are returned for each pattern in $ that matches *** News 02/01/2002 -- /ON CTCP_REPLY HAS CHANGED! VERY IMPORTANT! Prior to this release, /ON CTCP_REPLY looked like this: $0 - Nick who sent the CTCP reply $1 - The CTCP command $2- - The arguments to the CTCP THIS HAS CHANGED AND YOU WILL NEED TO CHANGE YOUR /ON CTCP_REPLY's! Now /ON CTCP_REPLY looks like this: $0 - Nick who sent the CTCP REPLY $1 - Target (nick or channel) to whom the CTCP was sent $2 - The CTCP command $3- - The arguments to the CTCP *** News 02/01/2002 -- New flag to /XQUOTE, /XQUOTE -U Usage: /XQUOTE -U A is a normal string that may also contain %'s followed by two hexidecimal digits. For each such instance of %, the instance is replaced with the corresponding ascii character. For example, "%20" would be replaced with a space. The resulting decoded string is sent to the server as-is. This function is useful if you need to send binary or other arbitrary data to the server. *** News 02/01/2002 -- New built in script, 'commandqueues' This uses several clever tricks to evade ircII's "quoting hell". The following commands are available: /1cmd