[ 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:
One<tab>Two
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 -ALL<tab>Hi there!
will now work properly.
*) $pop(....) removes the last word from the argument list.
Whereas $pop(one two<tab>three) used to return "two<tab>three"
is will now only return "three"
*) Commands are separated from the argument list by a "space".
Whereas
/one<tab>two blah blah blah
parsed "one<tab>two" 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<tab> =foo
might have failed because <tab> is not a valid character in
a variable name, it will now treat <tab> the same as a space.
*) Places that expect a number did not accept a string that contained
a <tab> so that things like
<tab><tab>9
was not accepted as a number. Now it will be.
*) The /IGNORE command used to consider a string containing a <tab>
to not be empty. This means that
/IGNORE <tab>
would not list the ignorance list, but rather would try to show
the ban value for an ignore matching <tab> 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 "one<tab>two" now it won't,
because "one<tab>two" 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 <tab>"two three" four
contained four words, because the <tab> before "two nullified
the double quoting. Now that <tab> 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 <unique id>
/NICK 0
To turn off your rfc1459 nickname.
$serverctl(GET <refnum> UNIQUE_ID)
$serverctl(SET <refnum> UNIQUE_ID)
To retrieve and change your unique nickname.
Changing your unique id is probably a bad idea.
/USERHOST <unique id>
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 <refnum> SWAPPABLE) to get the window
<refnum>'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 <refnum> 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 <refnum> [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 <enter>. 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 <host> now honors server groups
Whenever EPIC tries to connect to a new server, particularly
when you do /SERVER <host> it will honor the server group of
the new server; if you cannot connect to <host> it will only
try to connect to other servers in the same group as <host>.
*** 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 <name> 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 <refnum> 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 -- <whatever> then <whatever> 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
<enter> key). Traditional ircII semantics would use a value of 100
(a full window is scrolled by each time you hit <enter>), and the
more recent epic behavior would use a value of 0 (the window always
holds new output, and you must use SCROLL_FORWARD (<page down>) 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
(<page down>) or the SEND_LINE keybind (<enter>). 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 <enter>
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
<enter> does not unhold output, but rather you must use <page down>
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 <page up> then a line of output occured and you hit
<page down> 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 <nick> <file> <absolute path> 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(<global>) 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 <global>
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 <refnum> 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 <refnum> OFFERADDR <address> <port>)
- 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 <refnum> 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 <refnum> 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 <refnum> COUNTER)
- Return the number of times the ignore has been used (triggered).
$ignorectl(SET <refnum> CREATION <seconds> <milliseconds>)
- 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 <refnum> LAST_USED <seconds> <milliseconds>)
- 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 <refnum> COUNTER <number>)
- 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 <ignore-pattern>)
- Given an exact ignore pattern, return that ignore's refnum.
$ignorectl(ADD <ignore-pattern> [level-desc])
- Add a new ignore, ala /IGNORE <ignore-pattern> <level-desc>
and return the refnum for the new ignore. <ignore-pattern> is
taken literally and should not contain spaces or commas.
$ignorectl(CHANGE <refnum> [level-desc])
- Change the <refnum> ignore by adding or subtracting levels as
indicated by [level-desc]. If <refnum> is not a number or does
not represent a valid ignore, the empty string is returned.
Otherwise, <refnum> is returned.
$ignorectl(DELETE <refnum>)
- Remove the ignore numbered <refnum>
$ignorectl(PATTERN <wildcard pattern>)
- The effect of $igmask(<wildcard pattern>): treating each ignore
pattern as a literal string, return all refnums whose ignore masks
are matched by the <wildcard pattern>.
$ignorectl(RPATTERN <nick!user@host>)
- The effect of $rigmask(<nick!user@host>): 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 <refnum> is not valid, the
empty string is returned.
$ignorectl(GET <refnum> NICK)
- Return the ignore-pattern for the ignore refnum
$ignorectl(GET <refnum> 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:
/<level> Suppressive ignore
+<level> Highlight ignore
^<level> Exceptive ignore
$ignorectl(GET <refnum> 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 <refnum> 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 <refnum> 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 <refnum> 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 <refnum> REASON)
- Return the reason the user set the ignore, if any.
If you attempt to set a value but <refnum> is not valid, then
the empty string is returned.
$ignorectl(SET <refnum> NICK <ignore-pattern>)
- 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 <refnum> LEVELS <level-desc>)
- Unconditionally set the ignore levels to <level-desc>. 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:
/<level> Suppressive ignore
+<level> Highlight ignore
^<level> Exceptive ignore
The ignore's refnum is returned.
$ignorectl(SET <refnum> SUPPRESS <integer>)
- 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 <refnum> EXCEPT <integer>)
- 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 <refnum> HIGHLIGHT <integer>)
- 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 <refnum> EXPIRATION <seconds> <milliseconds>)
- 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 <refnum> 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 <number>
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([<server refnum>])
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 <refnum> 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 <refnum> [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 <refnum> 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 <commands>, 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 <winref>
If you do /TIMER -DELETE_FOR_WINDOW <winref> then all of the pending
timers for window <winref> 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 <lines>
If <lines> 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 <lines>
If <lines> 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 <refnum> ACTIVITY)
returns the last time the logfile was written to
$logctl(SET <refnum> ACTIVITY)
resets the log file's activity timer to current time
/LOG <refnum> 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 <refnum>)
$timerctl(ADD <refnum> <interval> <events> <commands> \
<subargs> <window>) (NOT IMPLEMENTED YET)
$timerctl(DELETE <refnum>)
$timerctl(GET <refnum> <item>)
$timerctl(SET <refnum> <item> <value>)
Where <item> is one of the following:
TIMEOUT Returns "<seconds> <useconds>" 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 <refnum> [ITEM])
$logctl(SET <refnum> [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 <N> 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 <N> is less than 1, then this
command does nothing. If <N> 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 <name|number> Work on the specified log file, using either
it's name (see below) or its refnum.
NAME <name> Change the logical name of the logfile to
<name>. You can use <name> in /LOG REFNUM
later.
FILENAME <name> 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 <server refnum> 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 <levels> 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 <nick|channel|refnum>[,<nick|channel|refnum>...]
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 <nick|channel|refnum>[,<nick|channel|refnum>...]
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 <name> CREATE <code>)
Create a new keybinding named <name> that will
run <code> whenever it is invoked.
$bindctl(FUNCTION <name> DESTROY)
Destroy the keybinding named <name>. You may only
destroy keybindings that you created with
$bindctl(FUNCTION <name> CREATE ...)
$bindctl(FUNCTION <name> EXISTS)
Returns 1 if <name> is a valid keybinding of
any type (built-in or user-created), and returns
0 if it is not a valid keybinding.
$bindctl(FUNCTION <name> GET)
If <name> is not a valid keybinding, then this
function returns the empty string. If <name> is
a valid built-in keybinding, it returns the
string "internal <addr>" where <addr> is a pointer
to a function in memory and cannot be used by the
scripter. If <name> is a user-created keybinding,
then it will return the string "alias <code>" where
<code> is whatever was passed to
$bindctl(FUNCTION <name> CREATE <code>)
$bindctl(FUNCTION <name> MATCH)
$bindctl(FUNCTION <name> PMATCH)
$bindctl(FUNCTION <name> GETPACKAGE)
$bindctl(FUNCTION <name> SETPACKAGE <package>)
A "SEQUENCE" is a string of one or more characters which, when
pressed in succession, result in the execution of a FUNCTION.
$bindctl(SEQUENCE <string> GET)
$bindctl(SEQUENCE <string> SET <function> [extra])
$bindctl(SEQUENCE <string> GETPACKAGE)
$bindctl(SEQUENCE <string> SETPACKAGE <package>)
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 <string> CLEAR)
EPIC4-1.1.6
*** News 07/29/2002 -- New function $killpid(<signal> <pid> [<pid> ...])
This function sends a signal to another process. <signal> may either
be a signal name (ie, HUP, KILL) or a signal number (ie, 1, 9, 15),
and <pid> 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(<host> <port> <family>)
where <family> is "4", "6", "v4" or "v6"
and <family> is optional.
$listen(<port> <family>)
where <family> is "4", "6", "v4" or "v6"
and <family> 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(<p-addr>)
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 <keybinding>
*** 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(<refnum>)
This returns the protocol being used to talk to server <refnum>.
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 <refnum> 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 <port> 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 <refnum> AWAY)
Get server <refnum>'s away message, if applicable.
$serverctl(GET <refnum> CONNECTED)
Returns 1 if you are connected and registered to server <refnum>
and 0 if you are not.
$serverctl(GET <refnum> COOKIE)
Returns the TS/4 "cookie" for our connection, if we have one.
$serverctl(GET <refnum> GROUP)
Returns the server group affiliation.
$serverctl(GET <refnum> 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 <refnum> 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 <refnum> NICKNAME)
Returns your current authoritative nickname.
$serverctl(GET <refnum> PASSWORD)
Returns the password that we use to connect to the server.
$serverctl(GET <refnum> PORT)
Returns the port number we use to connect to the server.
$serverctl(GET <refnum> QUIT_MESSAGE)
Returns the default QUIT message for this server, if any.
$serverctl(GET <refnum> SSL)
Returns 1 if this server tries to establish an SSL connection
to the server, and 0 if it does not.
$serverctl(GET <refnum> UMODE)
Returns your "user mode" on the server.
$serverctl(GET <refnum> USERHOST)
Returns what the server thinks your userhost is.
$serverctl(GET <refnum> VERSION)
Returns the server's raw version id string (eg. "2.8/hybrid-5.3p8")
$serverctl(SET <refnum> AWAY <message>)
Sets server <refnum>'s away message. Takes effect immediately.
Returns 1 to indicate success.
$serverctl(SET <refnum> CONNECTED <ignored>)
You cannot change the CONNECTED status; always fails.
$serverctl(SET <refnum> COOKIE <cookie>)
Sets server <refnum>'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 <refnum> GROUP <groupname>)
Sets server <refnum>'s server group affiliation. Returns 1 to
indicate success.
$serverctl(SET <refnum> ITSNAME <servername>)
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 <refnum> NAME <hostname>)
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 <refnum> NICKNAME <nickname>)
Changes your nickname to <nickname>. This takes effect immediately.
Returns 1 to indicate success.
$serverctl(SET <refnum> 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 <refnum> 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 <refnum> QUIT_MESSAGE)
Sets the default QUIT message for this server.
$serverctl(SET <refnum> 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 <refnum> UMODE)
You cannot change your user mode using this just yet. Always
returns the empty string to indicate failure.
$serverctl(SET <refnum> 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 <refnum> 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 name>)
"Group match" -- Returns a space separated list of all server
refnums that belong to the server group <group name>.
*** 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 <name> List the contents of the <name>d queue
/QUEUE -FLUSH <name> Delete the queue and all of its contents
/QUEUE -DELETE <name> <number> Delete the <number>th entry in the
<name>d queue; all entries are moved
down one position. Entries are
counted from number 1.
/QUEUE -DO <name> Run the contents of the <name>d queue
and delete the queue when done.
/QUEUE -DO -NO_FLUSH <name> Run the contents of the <name>d queue
but do not delete the contents.
/QUEUE -EXPAND_NOW <name> { <commands> }
Expand <commands> now, and then add
the result as a new entry to the
<named>d queue. SEE NOTES BELOW.
/QUEUE <name> { <commands> } Add <commands> as a new entry to the
<name>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
<commands> 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 <commands> 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 <commands> is executed. This means that you _can_ use $* and $0
and $1 and so on in your <commands>, 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, @<fileref> and @w<winref>
Files that you have opened with $open() may now be /msg'd using the
special syntax /MSG @<fileref> where <fileref> is the return value
of $open. You can of course /query @<fileref> or /redirect to it;
anything that sends a message can use @<fileref> to send to an
$open() file.
Since <fileref> 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<winref> where
<winref> 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(<pattern> <var1> <var2>) treats $<var1> as a
list of words, which are matched against <pattern> and whereas
the corresponding words from $<var2> are returned for each word
in $<var1> that is matched by <pattern>...
$corpattern(<string> <var1> <var2>) treats $<var1> as a list of
patterns, which are matched against <string>, and the corresponding
words in $<var2> are returned for each pattern in $<var1> that
matches <string>
*** 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 <url encoded string>
A <url encoded string> is a normal string that may also contain
%'s followed by two hexidecimal digits. For each such instance of
%<hexdigit><hexdigit>, 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 <time> <command>
Execute <command>, but only if <command> has not been executed
already by /1cmd in the previous <time> seconds.
/qcmd <queue> <command>
Add <command> to the end of queue <queue>, which will be
executed sequentially in 5 second intervals. Queues with a
lower alphanumerical value will be drawn from first, and hence
have a higher priority.
/fqcmd <queue> <command>
Add <command> to the beginning of queue <queue>, which will
be executed sequentially in 5 second intervals.
/q1cmd <time> <queue> <command>
Equivalent to: /1cmd <time> qcmd <queue> <command>
as long as <command> is not already queued in <queue>
/fq1cmd <time> <queue> <command>
Equivalent to: /1cmd <time> fqcmd <queue> <command>
as long as <command> is not already queued in <queue>
Commands are executed in "literal" form (not subject to "quoting hell")
*** News 02/01/2002 -- $uhc(), $mask(), and /ignore handle userhosts different
It is a bug for these to behave any differently from before except in
the case of a hostname with no dot in it, in which case they behave
more appropriately by not inserting eroneous dots and stars into said
hostname, as before.
*** News 02/01/2002 -- SSL support merged from the EPIC4-SSL project
Read the "README.SSL" file for some more information about the
particulars of SSL support, but here is a general overview:
When configuring EPIC before building it, to include SSL support:
./configure --with-ssl=/path/to/your/ssl/stuff
If you want to use SSLv2 instead of SSLv3 (the default), use:
./configure --with-ssl-ver=v2
To connect to a server using SSL:
/WINDOW SERVER -SSL <SERVERNAME>
(You cannot currently connect to an SSL server at startup time.)
New built in functions:
$ssl()
Returns 1 if SSL server connections are available, 0 if not.
$isencrypted()
$isencrypted(<servref>)
These return 1 if the server refnum (or current server)
are SSL server connections, 0 if they are not.
$cipher()
Returns cipher information for an SSL server connection.
New hook:
/ON SSL_SERVER_CERT
$0 - server name
$1 - certificate subject (urlencoded)
$2 - certificate issuer (urlencoded)
It is up to the scripter to accept or reject server certificates.
New status bar expando:
The %| status bar expando will expand to either the value of
/SET STATUS_SSL_ON or /SET STATUS_SSL_OFF depending on whether
the connection is SSL-enabled or not.
New built in /SETs:
SSL_CERTFILE - Path to certificate for SSL-enabled connections
SSL_KEYFILE - Path to key file for SSL-enabled connections
SSL_PATH - <I don't know what this does>
These sets do not do anything at the current time but probably will
be used in the future.
STATUS_SSL_ON - What %| will be for SSL server connections
STATUS_SSL_OFF - What %| will be for non-SSL server connections
*** News 02/01/2002 -- /ENCRYPT command takes additional argument
The /ENCRYPT command may now be used in a couple of new ways:
/ENCRYPT <target> <password>
/ENCRYPT <target>,<sender> <password>
/ENCRYPT <target> <password> <program>
/ENCRYPT <target>,<sender> <password> <program>
The nickname argument may now be a wildcard pattern; but only if it
is in the format:
<target>,<sender>
where <target> is a channel, or your own nickname, and <sender> is
a full <nick>!<user>@<host> prefix.
The /encrypt command can take an additional <program> argument after
nick and key, which will be run to encrypt and decrypt your messages.
Two usable example scripts have been supplied which use GNU Privacy
Guard in symetric encryption mode.
Example:
/encrypt #epic,*!*@epicsol.org keypass mycrypto
Would decrypt any messages sent to #epic by anyone at *!*@epicsol.org
with the "mycrypto" program using the password "keypass"
*** News 02/01/2002 -- New built in function, $encryptparm()
The $encryptparm(<nick>) function will return the command line
argument that was passed to the /ENCRYPT command when you first
established the encrypted conversaion with <nick>
Example:
$encryptparm(#epic,hop!jnelson@epicsol.org)
might return, using the above example...
#epic,*!*@epicsol.org keypass mycrypto
This is likely to be useful for public key crypto scripts.
*** News 02/01/2002 -- Change to $trunc(0 <num>) : it now returns an integer
$trunc(0 <num>) returns the integer <retval> with the largest absolute
value that lays between <num> and 0. In other words, $trunc(0 <num>)
returns <num> with the decimal point and anything after it removed.
*** News 02/01/2002 -- New math built in functions $ceil(), $floor(), $abs().
$ceil(<num>) -- Returns the smallest integer that is greater than or
equal to <num>
$floor(<num>) -- Returns the largest integer that is less than or
equal to <num>
$abs(<num>) -- Returns the absolute value of <num>
*** News 02/01/2002 -- Ability to use $write(), $writeb() to logfiles
Currently, you can use $write(<fd> <text>) to write a line of <text>
to the file <fd> where <fd> was previously returned by $open().
But if you want to write to a window's logfile, you can do that by
replacing <fd> with the literal character "w" followed by the window
refnum. As a special case, "w-1" refers to the global logfile.
Please remember that window refnum 0 is always the current window.
Example:
@ write(w-1 This text will go to the global logfile)
@ write(w3 This text will go window 3's logfile)
*** News 02/01/2002 -- New /ON, /ON GENERAL_PRIVMSG
Arguments:
$0 - Nickname who sent the privmsg
$1 - Target (nickname/channel) the privmsg was sent to
$2- - The privmsg itself.
If you catch this hook silently (/ON ^GENERAL_PRIVMSG), then
/ON PUBLIC_MSG, /ON MSG_GROUP, /ON MSG, /ON PUBLIC, and
/ON PUBLIC_OTHER will not be hooked for the same privmsg.
*** News 02/01/2002 -- New /ON, /ON GENERAL_NOTICE
Arguments:
$0 - Nickname/server who sent the notice
$1 - Target (nickname/channel) the notice was sent to
$2- - The notice itself.
This hook is offered after /ON KILL or /ON OPER_NOTICE (if they
apply), but before /ON SERVER_NOTICE, /ON NOTICE, and /ON PUBLIC_NOTICE
are offered.
*** News 12/19/2001 -- New /SET, /SET ALLOW_C1_CHARS (defaults to OFF)
The ascii characters 128 to 159 on many terminal emulators
(especially GNU Screen and XTerm) have special control meanings
which can be disasterous for users. EPIC has traditionally allowed
you to output characters in this range without question. However,
due to many requests, a /SET has been added. Characters in this
range will be stripped out if this /SET is off. Otherwise, the
traditional behavior will be retained. This is a deviation from
traditional practice, but it is an important deviation, as it will
protect most users from rogue users.
*** News 12/19/2001 -- ROM_CHAR functionality removed
A little known feature of EPIC, the ^R attribute, could be followed
by three ascii digits, and the decimal number following the ^R
attribute would be inserted into the output at that point. It was
vulnerable to exploitation by outside attackers, and is very
difficult to secure against exploitation. For this reason, the
feature has been removed until we can figure out how to properly
implement it. If you used this feature, I apologize, but it is for
the greater good that we must remove this feature for now.
*** News 12/19/2001 -- New option to $info(), $info(i)
The $info(i) built in function will return the "commit_id" value
for the version of epic you're using, which is a monotonically
increasing integer value which changes every time a changes is
made to epic's source. This value is important whenever you
report a bug about epic.
*** News 11/14/2001 -- Final conversion to the new epic mailing list
For a while now we have been using list@epicsol.org, but
the epic sources still refered to ircii-epic@concentric.net.
That old list is now officially deceased and is no longer in
operation and should not be used. Eventually it will go away.
*** News 11/14/2001 -- Support for ~/.epicrc file
LET ME JUST START BY SAYING THIS IS NOT MODELED AFTER BX.
Some of you use both epic and ircII and you would like to be
able to keep separate .ircrc files and .epicrc files. Now you
can do that. If you have a ~/.epicrc file, then epic will load
that and WILL NOT LOAD your ~/.ircrc. If you do not have a
~/.epicrc file, then epic will load your ~/.ircrc as it always
has. The EPICRC environment variable is accepted; it behaves
in the same way as the IRCRC environment variable.
*** News 11/14/2001 -- Color support has changed somewhat
Before this date, color handling was done by reacting to each
attribute change. For example, a ^B either turned bold on, or
it turned it off. But EPIC didn't keep track of ther attributes,
and on some systems, turning bold off turned reverse and color off.
Also, turning on color turned off reverse and bold. Many scripts
have come to kludge around this by "assuming" that turning certain
things on (like color) or off (like bold) had side effects on other
attributes. This was never intentional and it is certainly confusing.
On this date, a new attribute parser was introduced that does not
impose *any side effects whatsoever* on attribute changes. If you
change colors, it will NOT turn off bold or reverse. If you turn off
bold it will NOT turn off colors or underline. If you turn on bold,
it will NOT turn off colors. Each attribute (bold, underline,
reverse, flash, color) are handled independantly and separately.
Each time you turn an attribute on or off, only that attribute is
affected. The sum result of what you see on the screen is then
the cumulative effect of all the attributes which are on. This
means if you turn bold on and then turn on color, you will get
bold color. If you turn on reverse and turn on color, you will
get reversed colors. If you turn on reverse, turn on color, then
turn off color, you will still have reverse! Hopefully this will
make everything much more sane and clean.
*** News 11/13/2001 -- Resizable wserv support (wserv4), /SET WSERV_PATH
I backported the implementation of wserv4 from EPIC5. The main
features of wserv4 are that it uses two channels of communication
to talk to epic, and it can support independant resizing of each
screen. Until now, all of your /window create screens had to be
exactly the same size as your main screen or they wouldn't work.
That restriction has now been removed. All of your screens can be
of whatever size you wish and you can resize them at will. There
is a new /SET available, /SET WSERV_PATH which points to whatever
wserv you want to use. By default it points to epic's wserv, but
just in case your sysadmin didn't install wserv4, you could
compile it yourself and /SET WSERV_PATH to it.
*** News 11/13/2001 -- /FLUSH now uses the "redirect sink"
Until now, /FLUSH worked by actually throwing away all data from
the server until there was a 1 second pause. Since none of this
data was processed, if things like JOINs or QUITs or KICKs were
thrown away, the client could become terribly confused and possibly
even crash. This has changed: now the /flush command does not
throw away all input from the server, but instead just suppresses
all output for the current server command. This means that all of
your /on's will still be processed, but you won't have to see the
output (if you were doing a /who ** or a /links for exmaple).
Bottom line: it is now safe to do /flush again!
*** News 11/13/2001 -- The "redirect sink" -- target 0, and practice uses
You may now do /REDIRECT 0 to suppress all output from a server
command. Target 0 is called the "redirect sink" and any output
that is redirected to it will NOT be displayed. This technique
is very useful for trapping only a few /on's for a complex query
(such as /whois) and not having to worry about extra/unknown
numerics cluttering up the user's screen. Consider this:
on ^318 * { @count++ }
redirect 0 whois hop
Normally, if you were to do "whois hop", you would see all the other
numerics, which would be ugly if you're trying to catch the whois
replies with /on's. This is especially true for networks which use
extra numerics in their whois replies that your script may not know
about. So if you just /redirect 0 your server queries, then any
/on's that you don't catch that would otherwise send output to the
user's screen will redirect their output to the "sink", ie, it will
not be displayed. This should make it much easier to script whois
replies.
*** News 11/12/2001 -- /TIMER, /PAUSE now have sub-second resolution
Previously, /TIMER and /PAUSE have had whole-second granularity.
This means that when you asked for a timer to go off in N seconds,
the timer would actually go off in N seconds, give or take one second
(the resolution). This was because the I/O looper in EPIC only worked
on whole-second granularity. The I/O looper has been rewritten to
use microsecond resolution, so now /TIMER and /PAUSE will go off in
N seconds, give or take a microsecond. This also allows you to
specify sub-second resolution: You can do /timer 1.5 ... and your
timer will go off in 1.5 seconds, not 1 second, not 2 seconds.
*** News 11/12/2001 -- Changes to /SETENV let you unset environment variables
You may now unset environment variables with the /SETENV command by
prefixing the environment variable name with a single hyphen and by
omitting the second argument, like so:
/SETENV -IRCSERVER
You can still set an environment variable that starts with a hyphen:
/SETENV -FOO one two three
You can unset an environment variable that starts with a hyphen:
/SETENV --FOO
You can set an environment variable with no value:
/SETENV EMPTYVAR
but you can't set an empty environment variable that starts with
a hyphen (sorry). If anyone ever finds that they actually need to
be able to do this, let me know and we'll work something out.
*** News 11/12/2001 -- New built in functions for file manipulations
Several new functions have been added to help you manipulate files
that are opened with $open().
$fskip(<fd>)
This function reads the next line of the file and discards it.
It returns the end-of-file condition of the file after the read.
If <fd> is not a valid file, -1 is returned.
$fseek(<fd> <numbytes> <whence>)
This function changes the file position indicator. The file
position indicator is moved <numbytes> (a 31 bit signed number)
away from <whence>, which is a symbolic anchor with the following
possible values:
SET Move <numbytes> from the beginning of the file
CUR Move <numbytes> forward or backward from the
current file position indicator
END Move <numbytes> forward or backward from the
end of the file.
<numbytes> can't be greater than 2GB, and this is a limitation
in the fseek(3) interface, so don't complain to me about it.
If a seek error occurs, -1 is returned and $error(<fd>) will
return 1. If <fd> Is not a valid file, -1 is returned.
$frewind(<fd>)
This function sets the file position indicator to the beginning
of the file. It is the same as $seek(<fd> 0 SET). If <fd> is
not a valid file, -1 is returned.
$ferror(<fd>)
This function returns the file error indicator, either 0 or 1.
This is set whenever any error occurs and can be cleared by
resetting the file position indicator. If <fd> is not a valid
file, -1 is returned.
$isfilevalid(<fd>)
This function returns 1 if <fd> is a valid value previously
returned by $open() and returns 0 otherwise.
EPIC4-1.1.1
*** News -- Nov 9, 2001 -- New built in function, $unsplit(<sep> <word list>)
Unsplit takes two arguments, a separator string and a word list.
The return value is each word in <word list> separated by <sep>
instead of by spaces. Multiple spaces will be condensed into one
<sep>. This is intentionally useful for creating channel lists
to pass to /join. See the example in /WINDOW REJOIN for good ideas.
*** News -- Nov 9, 2001 -- New math functions added (crazyeddy)
The following built in math functions have been added.
$acos(number) Arc cosine
$acosh(number) Inverse hyperbolic cosine
$asin(number) Arc sine
$asinh(number) Inverse hyperbolic sine
$atan(number) Arc tangent of one variable
$atan(number2 number2) Arc tangent of two variables
$atanh(number) Inverse hyperbolic tangent
$cosh(number) Hyperbolic cosine
$exp(number) Exponential value
$jn(int number) Bessel function of the first kind
of the integer order [int]
$log(number) Natural logarithm
$log10(number) Base-10 logarithm
$sinh(number) Hyperbolic sine
$tanh(number) Hyperbolic tangent
$yn(int number) Bessel function of the secnod kind
of the integer order [int]
All of these functions may return a "RANGE" or a "DOMAIN" error,
the nature of which is different for each function. In case of
a "RANGE" error, the return value of the function shall be the
string "RANGE". In case of a "DOMAIN" error, the return value of
the function shall be the string "DOM". If no error occurs, then
a floating point number is returned in "%f" printf format.
*** News -- Oct 24, 2001 -- Support for channel mode +M (adm)
Support for Dalnet's channel mode +M, which prohibits non-registered
users from sending privmsgs to the channel, was added on this date.
*** News -- Oct 24, 2001 -- New built in /set, /SET AUTO_REJOIN_CONNECT
Normally when you are disconnected from a server, and epic is able
to immediately reconnect to a new server, epic will rejoin all of
the channels you were on at the time you were disconnected.
Some scripters do not like this behavior and would prefer that EPIC
not get in their way. This /SET permits you to turn off the auto-
channel-rejoin feature and puts the responsibility for rejoining
channels on connect entirely on the script; EPIC will NOT interfere.
This /SET does not make epic capable of joining channels it does
not otherwise have the capability of rejoining. It only permits
scripters a way to turn off the auto-rejoin-on-reconnect feature.
*** News -- Oct 9, 2001 -- $querywin() now takes an optional server argument
Previously, $querywin() only took a nickname and returned any
window with a query to that nickname regardless of the server.
But if you need to get the query window for a nick on a particular
server, you may now specify the server refnum as the SECOND argument.
For example, $querywin(hop 2) would only return the window refnum
for a query you have with "hop" on server refnum 2. The argument
must be a server refnum (not a server name). If you do not give
a server refnum, backwards compatability is retained.
*** News -- Oct 9, 2001 -- General speed improvements (crazyeddy)
Crazyeddy has spent a lot of effort in improving the speed of
epic's string handling. This means EPIC should be even faster
than ever. Much thanks go to him for his dilligent hard work!
*** News -- Oct 9, 2001 -- New standard script, 'autoget'
I was asked one too many times "how do i turn on autoget in epic?"
Well, just /load autoget and you will get the /autoget command.
Usage:
/autoget
See the patterns you are autogetting.
/autoget <pattern> [<pattern>]
Automagically dcc get any file offered to you
that matches the specified pattern(s). You can
autoget as many patterns as you want.
/autoget -<pattern> [-<pattern>]
Remove the pattern(s) from the autoget list.
/unload autoget
Get rid of the /autoget alias and don't do any
more autogetting.
*** News -- Oct 9, 2001 -- New standard script, 'altchan'
I was asked one too many times "why can't i do <alt>-<number> to
switch between my windows like in BitchX?" Well, just /load altchan
and you will have this functionality. This requires that your
terminal emulator treats <alt>-<char> as <escape>-<char>, which
applies to most of the people who ask this question. ;-)
*** News -- Oct 9, 2001 -- /JOIN command uses /WINDOW REJOIN now
The /JOIN built in command now uses /WINDOW REJOIN as its internal
implementation, instead of /WINDOW CHANNEL. You should now refer
to /WINDOW REJOIN for details of how the /JOIN command works. This
is an improvement, for the record. ;-)
*** News -- Oct 9, 2001 -- New /WINDOW command, /WINDOW REJOIN
The /WINDOW REJOIN command can be used to join channels and
is sensitive to your window bindings. Here is how it works:
/WINDOW REJOIN <#channel>[,<#channel>]
For each channel you list, for the current server,
* If we are on the channel
* If the operative window is connected to the current server
-> Move the channel to the operative window.
* If the operative window is NOT connected to the current server
-> Do nothing (fail silently)
* If we are NOT on the channel
* If there is a window that claims to own this channel (bound)
-> Join the channel and put it in that window.
* If there is NOT a window that claims to own this channel
* If the operative window is connected to the current server
-> Join the channel in the current window
* If the operative window is not connected to the current server
-> Join the channel and put it in any window we find that is
connected to the current server.
It is expressly implied that you can use /WINDOW REJOIN inside of
an /ON and that the channel(s) will *NOT BE REMOVED* from their
bound window(s), if any. What this means is that you can now do
something like this:
alias join_channels_in_new_server (server, ...) {
if (![$*]) { return }
window new server $server rebind $0
fe ($1-) x { window new rebind $x }
^on ^connect $server join $unsplit(, $*)\;^on connect -server
}
*** News -- Oct 9, 2001 -- New /WINDOW command, /WINDOW REBIND
The /WINDOW REBIND command is to be used when you wish to bind
a channel to a window unconditionally. Typically, /WINDOW BIND
will fail if you try to bind a channel other than the current
channel, but /WINDOW REBIND does not fail. If you are on the
channel, then the channel is forcibly made the current channel.
This command is suitable for use in /ON CONNECT where you may
want to bind channels to windows before /WINDOW REJOINing them,
and making sure they go to the window you expect.
*** News -- Oct 9, 2001 -- How to specify server groups in ircII.servers
The format of the "ircII.servers" file has been improved somewhat.
You may now include blank lines in the file, and you may include
comment lines that begin with #. You can include a server group
name in square brackets on a line all by itself, and every server
description that follows it will use that server group as a default.
You can provide as many different server groups as you like.
Example ircII.servers file:
# The two efnet servers I can connect with.
[efnet]
irc.prison.net
irc.east.gblx.net
# Undernet server round robin
[undernet]
irc.us.undernet.org
irc.eu.undernet.org
# Dalnet round robin
[dalnet]
irc.dal.net
*** News -- Oct 9, 2001 -- Server groups are optional.
Don't worry -- the changes below are all backwards compatable.
You will see no change unless and until you are ready to start
using them. By default, all servers are put into the "default"
server group, and epic will behave exactly as it always has.
Only those server that you explicitly put into a different group
will not be part of the "default" group, and act differently.
*** News -- Oct 9, 2001 -- [OBSOLETE] Server groups cannot be changed.
[Previous documentation regarding the inability to change server
groups is now obsolete and is hereby removed. Use $serverctl()
to change server groups].
*** News -- Oct 9, 2001 -- How to specify server groups with /SERVER
The /SERVER and /SERVER -ADD and /WINDOW SERVER commands take a
"server description", which is a single word with multiple
fields separated by colons. The first four fields are the
same as ircII: hostname, portnum, password, and nickname.
But you can now provide a fifth field, which will be the server
group that description should belong to.
Examples:
/server irc.prison.net::::efnet
/server -add irc.east.gblx.net:6666:::efnet
/server -add irc.us.undernet.org:6660:::undernet
/server -add irc.eu.undernet.org:6665:::undernet
/window server irc.dal.net:7000::myregisterednickname:dalnet
*** News -- Oct 9, 2001 -- Server group support (specced by srfrog)
Whenever you are disconnected from a server, epic tries to reconnect
you to the same server. But if it is unsucessful, then it tries to
connect you to the "next" server. Sometimes, however, the "next"
server is on another network, and so you, your windows, and your
channels are rudely dumped onto another network that you didn't
want to be on. This has been a constant source of irritation for
users. Well, now you can control this behavior more closely.
Whenever epic is disconnected from a server, it will only reconnect
to servers that belong to the same "server group" as the disconnected
server. Any server that belongs to another server group will be
"skipped" and epic will NOT try to connect to it. EPIC will still go
through your server list only once. If EPIC cannot find a server in
the same group to connect to, it will tell you to use the /SERVER
command to reconnect.
*** News -- Oct 9, 2001 -- New built in function, $ishalfop()
The $ishalfop() function takes two arguments; a nickname, and a
channel, and returns 1, 0, or -1 depending on whether the person
is a half-op, the person is not a half-op, or we do not know if
the person is a half-op or not. "Half-op" is a hybrid thing.
If you don't understand why EPIC wouldn't know if someone is a
half-op or not, see the docs for $isvoice().
*** News -- Oct 9, 2001 -- New built in function, $igetrmatches() (crazyeddy)
Crazyeddy wrote this, and I don't know what it does. Maybe
he would like to document it.
*** News -- Oct 9, 2001 -- New flags to the /LASTLOG command
Someone reported a crash in the /lastlog command, and rather than
just try to fix a mundane bug, we decided to have a little more fun
and take this opportunity to rewrite the /lastlog command like we
had been planning to do forever. Throw out everything you know
about the lastlog command, here is how it works! (Brief summary:
Every argument now has an option flag to go with it if you want to
use it; backwards compatability is retained; the -regex option
lets you do regex matching (instead of, or in addition to ircII
matching.)
* The /LASTLOG command:
* Syntax:
* /LASTLOG [options] [<string>] [<number1> [<number2>]]
* Options:
* - Do not show header and footer
* -reverse Show matches newest-to-oldest (reverse order)
* instead of oldest-to-newest (normal order)
* -literal <pattern> <string> is search target, not option.
* -regex <regex> line must match <regex>.
* -max <number> Only show first <number> matches
* -number <number> Start at the <number>th recent entry.
* -skip <number> Skip this many leading lastlog entries
* -<LEVEL> Add <LEVEL> to "level mask"
* --<LEVEL> Remove <LEVEL> from "level mask"
* -ALL Add all levels to "level mask"
* --ALL Reset/clear the "level mask" <default>
* <pattern> <pattern> is search target
* <number1> Start from the <number1>th most recent record.
* <number2> Continue <number2> more records after that.
*
* The /LASTLOG command shows all of the lines that have appeared to your
* window's lastlog; the oldest one first, and the newest one last, except
* that the following seven restrictions apply IN THIS ORDER:
* 1 If the -reverse option is specified, lines will be shown in
* "reverse order", that is the newest one first, and the oldest
* one last.
* 2 If any of the "LEVEL" options (including ALL) are specified,
* then the line must have one of the lastlog levels specified
* by the "level mask".
* 3 If the -number option is specified only the most recent <number>
* lines will be looked at.
* 4 If the -skip option is specified, the first <number> lines after
* the start (either the oldest entry, or whatever you specified
* with the -number option) will be skipped (will not be looked at).
* 5 If the -literal option is specified, some portion of the line
* must be matched by the pattern <pattern>.
* 6 If the -regex option is specified, some portion of the line
* must be matched by the regex <regex>.
* 7 If the -max option is specified, only the first <number> matching
* lines will be shown; others will be suppressed.
* Furthermore:
* * The "level mask" is turned off by default which means that all
* rule #2 doesn't apply. --ALL forcibly turns off the level mask.
* * "LEVEL" options are cumulative and sequential. That means that
* if you turn off a level and then later turn it back on, it will
* be on. If you turn off all options with --ALL and then turn
* some back on, those after --ALL will be on.
* * Up to three naked options may be specified for backwards
* compatability with ircII. The very first naked parameter that
* is not a number is considered to be the argument to the -LITERAL
* option. The second naked parameter had better be a number and
* it is taken as the argument to the -NUMBER option. The third naked
* parameter also needs to be a number and is taken as the argument
* to the -SKIP option. This can get confusing; always use the
* options in scripts -- only use backwards compatability options
* at the input prompt. ;-)
*** News -- Oct 9, 2001 -- Random local port usage support improved.
Some of the more paranoid of our epic bretheren were very unhappy
that /set random_local_ports did not co-exist with firewall holes.
The purpose of /set random_local_ports has been changed somewhat.
If it is OFF (traditional behavior), then epic will continue to
ask the operating system for a local port number to use for things
like dcc sends and so on. Some systems (like openbsd) return a
random local port automatically, and so you never need to /set this
to ON. Other systems (like linux) return local ports sequentially,
and so you may want to /set this ON.
When /set to ON, EPIC will attempt to determine your "port range".
On Linux, we read "/proc/sys/net/ipv4/ip_local_port_range" to get
the local port range, and then choose up to 5 random numbers within
that range. If we fail 5 times, we ask the kernel to give us a port.
If you use a firewall, you need to make sure you properly configure
that file so that EPIC can properly find a random port!
On 4.4BSD systems, we first check the EPIC_USE_HIGHPORTS environment
variable. If it is set, then we use sysctl to figure out what the
"high port range" is, and we choose up to 5 random numbers within
that range. If we fail 5 times, we ask the kernel to give us a port.
If you are using a firewall, you need to make sure you properly
configure your sysctl settings so EPIC can properly find a random port!
If EPIC_USE_HIGHPORTS is not set, then epic uses syctl to figure
out what the "normal port range" is.
Operating System: What you need to configure:
----------------- ---------------------------
Linux /proc/sys/net/ipv4/ip_local_port_range
FreeBSD sysctl net.inet.ip.portrange.first
sysctl net.inet.ip.portrange.last
sysctl net.inet.ip.portrange.hifirst
sysctl net.inet.ip.portrange.hilast
OpenBSD sysctl net.inet.ip.portfirst
sysctl net.inet.ip.portlast
sysctl net.inet.ip.porthifirst
sysctl net.inet.ip.porthilast
*** News 10/09/Y2K+1 -- Perl support; new built in functions (crazyeddy)
This sews a perl interpreter (libperl) into the epic binary and
adds bridges between the ircii and perl programming environments.
$perl(), $perlcall() and $perlxcall() have been added to the ircii
language. EPIC::eval, EPIC::cmd and EPIC::expr are available for
doing stuff in epic from the perl environment.
*** News 10/09/Y2K+1 -- Bunch of new updates
Everything for EPIC4-1.1.1 was documented here...
EPIC4-1.0
*** News 03/14/Y2K+1 -- New flag to /xecho, /xecho -v
This will output the line to a visible window. No guarantees
are made to which visible window it will be output, only that
the window *will* be visible. In practice, it's usually the
topmost window on your main screen. That's not a promise, however.
*** News 03/07/Y2K+1 -- New form of the /FOR command, "FOR NEXT"
The for command now supports a FOR .. NEXT type loop.
Syntax:
/FOR <var> FROM <min> TO <max> [STEP <step>] { <commands> }
Semantics:
Consider a list of integers:
(<min>, <min> + <step>, <min> + <step> + <step>, ..., <max>)
For each member of that list, assign that integer value to
$<var> and execute the { <commands> } set.
Example:
/FOR i FROM 1 TO 5 { echo $i }
will output:
1
2
3
4
5
Example:
/FOR i FROM 1 TO 5 STEP 2 { echo $i }
will output:
1
3
5
Special note: This is much cheaper than a traditional /for loop
that does the same thing, or a /fe loop over the return value of
the $jot() function that does the same thing.
Special note: The /CONTINUE and /BREAK commands are honored in
the command body. The /CONTINUE command will behave as a "next"
operation, and the /BREAK command will abort the command entirely.
*** News 03/07/Y2K+1 -- New form of the /FOR command, "FOR IN"
The for command now supports a FOR .. IN LIST type loop.
Syntax:
/FOR <var> IN (<word list>) { <commands> }
Semantics:
Consider the list of ``extended words'':
(<word list>)
For each member of that list, assign that string value to
$<var> and execute the { <commands> } set.
Example:
/FOR i IN (one two three) {echo $i}
will output:
one
two
three
Special note: This acts as a cheap version of the /fe command
for those cases where you need to iterate over each word at a time.
Special note: The /CONTINUE and /BREAK commands are honored in
the command body. The /CONTINUE command will behave as a "next"
operation, and the /BREAK command will abort the command entirely.
*** News 02/05/Y2K+1 -- New /ON, /ON ERROR
When the server sends you an ERROR (or ERROR:) protocol message,
this /on is hooked with the arguments:
$0 The server that sent you the ERROR
$1- The error message itself
*** News 02/05/Y2K+1 -- Formal removal of old, long-broken feature
A feature many of you probably never knew existed was carried over
from ircII. When output occurs to a window, the cursor is supposed
to "hang" in that window for a second and then return to the input
buffer, or when you press a key, whichever happens first. About
six years ago I mangled that feature so that it did not work
correctly, and quite a few people expressed happiness with the
removal of the feature. Well, it never was really removed, it
was just bludgeoned into non-operation. I have now removed the
remnants of the code that still existed. Don't ask me to put this
feature back. Most people hate it. ;-)
*** News 02/05/Y2K+1 -- New built in command, /DEFER
There are some circumstances in which it is dangerous to execute a
command. In these vulnerable circumstances, epic may break, or
even crash if you execute certain commands. The /DEFER command is
a general purpose way to ask epic to execute some number of commands
later one when it is "safe" to do so. The mechanism by which this
works is intentionally unspecified because I expect it will change.
But you can be assured epic will not execute your command until it
knows that it will not crash doing so.
A list of circumstances under which you will need to use the /DEFER
command will be compiled and put up at http://www.epicsol.org/DEFER
and new entries will be added as discovered. In general, if you find
that executing a certain command in an /on causes epic to crash,
you should FIRST TRY TO /DEFER IT. Then if it continues to make
epic crash, then it is probably a bug.
*** News 02/05/Y2K+1 -- EPIC handles disconnections differently now
Up until this time, ircII (and epic) have sometimes closed your
server connection earlier than is truly neccesary, as in when you
get a 437 numeric, or a KILL message. EPIC has been changed so
it will never close the server's connection on you unless you tell
it to explicitly. Instead, EPIC will wait for the server to close
the connection and will then reconnect at that time. This permits
you to see important information, such as the K-line reason after
a 437 numeric on dalnet, for example. Reconnections in general are
much more reasonably handled, which is a nice side effect!
*** News 01/15/Y2K+1 -- DCC Checksum feature has been recalled
The DCC Checksum feature, which it seems everybody loathes and hates
has been recalled ahead of schedule. It was originally scheduled to
disappear silently in EPIC5, but because DCC Checksum tripped over
several bugs in the FreeBSD libc, I decided just to throw the whole
thing overboard and be done with it once and for all. I apologize
to anyone who actually was mistaken into thinking this was a useful
feature.
*** News 12/01/Y2K -- EPIC sanity checks your windows/channels/servers
Very frequently, epic will sanity check the referential integrity
of your channels, windows, and servers. What this means to you, the
user, is that if epic ever detects that windows and channels do not
properly refer to each other, or if windows and servers do not
properly refer to each other, or if channels and servers do not
properly refer to each other, epic will immediately panic and abort,
telling you exactly what went wrong. You should submit a bug report
in the normal way whenever you get one of these messages.
The benefit of this is that if you see any behavior that looks like
epic has gotten confused regarding how your windows/channels/servers
are interacting, that is either the correct behavior, or it is a bug.
But there are many circumstances in which epic can determine that
things are messed up and automatically fix them. This will result in
fewer window/channel/server mixups in the future.
*** News 09/28/Y2K -- New set, /SET SWITCH_CHANNELS_ON_PART
Traditionally, when you use the /PART command (ie, /LEAVE), the
client will automatically do a /PARSEKEY SWITCH_CHANNELS for you,
to make another non-current channel the current channel in the
window. If you do not like this behavior, you can /SET this value
to OFF and when you /PART a current channel, your window will be
left current-channel-less. It's important to note that this may
result in a window having one or more non-current channels and no
current channels. That is expressly the intent of this /SET.
Also note that this /SET is exclusively for the EPIC4-1.0.* branch;
it is already obsolete in EPIC4-1.1.* where channels have already
been taught not to move around from window to window.
*** News 09/28/Y2K -- New set, /SET MAX_RECONNECTS
Traditionally, when you are disconnected from a server for an unknown
reason (ie, for any reason other than being killed, a k-line or
such) the client will attempt infinitely to reconnect you to the
server. This can be a problem if the server is not accepting new
connections (either becuase you are D-lined or K-lined or the server
is down or unreachable or the like), causing epic to behave poorly.
This set permits you to throttle auto-reconnect after a certain number
of unsuccessfull attempts to connect to any one server. So if you
/SET this value to 4, then epic will make (more or less) four
iterations through your server list trying to auto-reconnect you
before it gives up. All auto-reconnections will fail until you, the
user, manually intervene by using the /SERVER command (or by using
the /SERVER command in a script), or whenever you succesfully connect
to a server (and recieve the 001 numeric).
*** News 09/28/Y2K -- New set, /SET HISTORY_CIRCLEQ
Traditionally, the epic history mechanism acted as a circle-queue;
when you reached the oldest item in the history buffer, going
backward then circled you back to the newest item in the history.
If you reached the newest item, going forward took you back to the
oldest entry. There is no way to "get out of" browsing the history,
either. However, if you turn this /SET to OFF, then epic's history
browsing acts more like shells, where when you reach the oldest entry
in the history, you can't go back any further -- and when you reach
the newest entry in the history, you stop on a blank line and cannot
go any further. Also, if you use the ERASE_LINE keybinding, you will
automatically be returned to the blank line at the front of the
history buffer (as if you had pressed cursor-down a bunch of times)
*** News 09/28/Y2K -- New option to /local, /local -dump
You can use this to delete all of the currently scoped local variables.
You cannot delete any other alias's local variables -- only the ones
that you can current see.
*** News 09/28/Y2K -- New verb to $aliasctl(), $aliasctl(* getpackage *)
This works like $aliasctl(* get *), except it returns the package
name of the given alias, rather than the contents of the alias.
*** News 09/28/Y2K -- New option to /who, /who -literal
This option sends whatever arguments you specify directly to the
server without iterpolation by the client. This is useful if you
need to specially format your WHO requests in a way that EPIC does
not support. You should never use /QUOTE WHO -- ever. You should
instead use /WHO -LITERAL, which otherwise acts as /QUOTE WHO does.
From this point forward, any use of /QUOTE WHO results in completely
undefined behavior for all functionality in epic for the remainder of
the execution of that client. You have been warned.
*** News 08/15/Y2K -- New script, "hybrid6"
This script purports to provide the neccesary support for admins
and opers on hybrid6 servers. The beginning of this script was
provided by is-, and further submissions are welcome.
*** News 07/05/Y2K -- New built in /set, /SET LOG_REWRITE
This is just like /SET OUTPUT_REWRITE, except that it rewrites
the line just before it gets sent to the logfile. Note that this
/SET is cumulative with /SET OUTPUT_REWRITE as well as with all
of the other logfile mangling /SET's. That is to say, after all
other sets have been applied, then this /SET is honored as the very
last thing before the data goes to the logfile. The expansion is
parsed exactly as in /SET OUTPUT_REWRITE:
$0 The window refnum the output is going to
or -1 if this is the global logfile
$1- The text itself.
Please do not ask me to set $0 to the window refnum for output to
the global logfile. THAT INFORMATION IS NOT AVAILABLE AT THE TIME
WE OUTPUT TO THE GLOBAL LOGFILE, SO I CANNOT PROVIDE IT EVEN IF I
WANTED TO.
*** News 06/26/Y2K -- New flag for /who, /WHO -dx -- dalnet who support
The dalnet's WHO request takes some extra flags that can be used
to conditionalize, or filter out, some of the data that might
otherwise be returned. You can now use these flags with /who -dx.
The format looks something like this:
/WHO -dx <dalnet options> <arguments to options>
Note that this syntax is not the same as the -ux flag, which is used
for the undernet who request. This is because these flags are modeled
after how the server expects to recieve the arguments. The dalnet
WHO request is "WHO <options> <arguments>", whereas the undernet's
is "WHO <target> <options> <arguments>".
*** News 06/26/Y2K -- New flag for /who, /WHO -ux -- undernet who support
The undernet's WHO request takes some weird extra flags and returns
with weird reply numerics in a kind attempt to avoid breaking EPIC.
However, EPIC is not tolerant of issuing WHO requests outside of the
WHO queue, because it breaks userhost caching. So if you want to use
the extended undernet who request, you must specify the -ux option
*AFTER* you specify the target and *BEFORE* you specify the special
flags. If you would please refer to the "who.stuff" document, this
new option works something like this:
/WHO <mask1> -ux <options> <mask2>
<options> and <mask2> are passed as-is to the server without any
interpretation of any kind by EPIC. The server will rrturn your
results in whatever way it pleases in a 354 numeric. EPIC does
*ABSOLUTELY NOTHING WHATSOEVER* with this numeric reply, save offer
it to you as an /on 354. You are entirely on your own to parse the
results of /on 354.
Only the "-u-i" and "-oper" options are compatable with the -ux flag.
The use of any other options, including -line, -end, -host, and so on,
will avail you not; they are silently ignored.
All must immediately cease and desist using the awful /quote hack
cited in the "who.stuff" document to get around EPIC's attempt to
keep you from doing something that will likely crash the client.
The use of that hack may result in EPIC crashing, and that is _NOT_
my fault.
*** News 06/22/Y2K -- New /window operator, /WINDOW HOLD_INTERVAL
This operator overrides the value of /SET HOLD_INTERVAL for this
window.
*** News 06/22/Y2K -- New built in /set, /SET HOLD_INTERVAL
This set controls how many lines must be added to your hold buffer
before your status line is forcibly refreshed. The default is 10,
which is the traditional value.
*** News 06/22/Y2K -- New built in function, $wordtoindex()
Given a word number (counting from zero), this returns the index
offset into the string (counting from zero) of the first character
in that word. This is useful if you need to find the start of a
word that you are somewhere in the middle of.
*** News 06/22/Y2K -- Numeric parameters available in /wait %cmd and /exec -end
When you are inside a /wait %cmd {...} or /exec -end {...} body, the
following numeric parameters are available:
$0 - The name or number of the exec'd process
$1 - The signal (if any) that killed the process
$2 - The return code (if any) of the procss
This is exactly the same as what you get inside /on exec_exit.
*** News 06/22/Y2K -- New status bar expando, %{2}S
This is the same as %S, except it does not truncate the server name
at all.
*** News 06/22/Y2K -- New built in function, $globi()
$globi() is a case insensitive version of $glob(). It is identical
otherwise.
*** News 06/22/Y2K -- !ID channels on ircnet no longer formatted
At the specific request of Kurt Roeckx (q@ping.be) and with the
permission and blessing of Kaspar Landsberg (kasi), epic no longer
will try to "pretty print" IRCNet's !ID channels. They now appear
as they come from the server.
*** News 06/22/Y2K -- New on, /on channel_sync
This was added as a birthday gift to Whitefang -- Happy 17th birthday!
/ON CHANNEL_SYNC is thrown at the earliest possible moment that it
is safe to perform _ALL_ channel-related built in functions (such
as $userhost(), $chanops(), etc). Before this /ON is thrown, some
or all of the channel-related built in functions may return unuseful
results. The arguments are:
$0 - The channel that is now synced
$1 - The time (in fractional seconds) it took the channel
to sync up.
$2 - The server that this channel is on.
*** News 06/22/Y2K -- New status bar expando, %{1}F
%{1}F is exactly the same as %F (show notified windows with output
since they have been hidden), except that it shows the window name
instead of its refnum, if possible.
*** News 06/22/Y2K -- New built in function, $loadinfo()
$0 of the return value is the current line number in a file being
loaded, and $1- is the name of the file being loaded. This function
only returns meaningful results *during a /load*. Do not call this
function outside of a script being /load'ed.
*** News 06/22/Y2K -- /DCC LIST has more information now
A transfer speed field has been added to the /dcc list output
*** News 06/22/Y2K -- New built in function, $notifywindows()
Returns the windows that have been notified since they were last
hidden. Exactly the same as the %F status line expando.
*** News 06/22/Y2K -- $chanwin() function now works for all channels
It used to only support current channels, now you can get the window
refnum of *any* channel.
*** News 06/22/Y2K -- Support for /SET MAIL 3
If you /SET MAIL 3, then epic will do everything it does in
/SET MAIL 2, and it will also reset the mtime and atime for your
mail box after it is done reading it. This is neccesary if your
mail reader gets confused if someone else reads your mailbox while
it is running.
*** News 06/22/Y2K -- Support for compiling with bounds checking gcc
If your 'gcc' has the bounds checking extensions, then you can
supply the '--with-bc' flag when you run configure to use it.
*** News 06/22/Y2K -- Support for IRCNet's +I channel mode
This is now supported.
*** News 06/22/Y2K -- New status expandos, %{1}S, %{2}S
The status expando %{1}S expands to ...
The status expando %{2}S expands to ....
*** News 06/22/Y2K -- Support for DalNet's +c channel mode
This is now supported
*** News 06/22/Y2K -- Default output of /on msg_group changed
If you do not hook /on msg_group, then the default output format
for the client will now look different than /on public_notice.
*** News 06/22/Y2K -- Holy cow! He finally updated this file!
Yes, this file documents all of the userland changes since the
last update, around December 1999. Sorry for the delay
*** News 12/06/99 -- New option to /BIND, /BIND -SYMBOLIC
You may now bind keys by using their symbolic name. For example,
/BIND -SYMBOLIC key_f1 parse_command {echo hi!}
will bind the F1 key and it will echo "hi!" whenever you press it.
You will get an error message if the symbolic name you specify is
not supported by EPIC, or not defined by the TERM setting you are
currently using. In such a case, you are out of luck. >;-)
*** News 11/25/99 -- New built in functions, $getset(), $builtin_expando()
In order to close a couple of semantic weaknesses, these two
built in functions have been added. Very simply,
$getset(SETNAME) returns the value of /SET SETNAME
$builtin_expando(N) returns the value of $N inline expando
Since it is possible to override the SETNAME or single-character
inline expandos with your own variables, these functions are
provided as absolute ways to get at those values without worrying
about interference from other scripts.
*** News 12/02/99 -- #define SERVERS_FILE may now be ~-ified
Previously, #define SERVERS_FILE was only permitted to be an
absolute pathname, or a relative pathname to $IRCLIB. Now, you
can #define it to be ~/.irc/ircII.servers, for example, to
permit users to have their own server file.
*** News 12/02/99 -- New built in /set, /SET OUTPUT_REWRITE
This is a little bit harder to explain, but the impact of this
/SET is pretty big. Basically, how it works is this:
For every line of output that goes to the screen, /on window is
thrown. However, /on window cannot be recursively called, so
there are some instances where output goes to the window without
/on window having been thrown. This makes it hard to write
general purpose time stamp handlers. Therefore, a general purpose
way of doing final-editing on window output is needed. This set
provides that capability. If this /SET is defined (by default,
it is un-set), then every time a LOGICAL line of output is about
to be sent to a window, the /SET value is expanded, and the result
of that expansion is substituted for the original text. The
expansion is parsed in the context that:
$0 The window refnum the output is going to
$1- The text itself.
Maybe an example would be helpful: If you were to do:
/SET OUTPUT_REWRITE +++$1-
Then all the output to all windows would be preeceded by
three +++'s. You can of course call functions, so you
could also do:
/SET OUTPUT_REWRITE $myfunc($0) $1-
And then your "myfunc" alias could create a prefix banner for
the output line (eg, a timestamp) that is window-spefic.
This is a very expensive operation, but is cheaper than using
an /on window, and probably less of a hassle than redefining
a zillion other /on's. It also is pretty reliable, since it
will always be honored for all lines of output.
--- Amendment on April 10, 2001 ---
When changing /set output_rewrite inside of an alias, please remember
that $'s are expanded before the /set is called, and so things like
$1- or $myfunc($0) would be expanded at the /set time and not at the
rewrite time. Make sure to double up your $$'s in such cases!
alias foo {
set output_rewrite +++$$1-
}
--- Amendment on April 10, 2001 ---
*** News 11/16/99 -- New built in function, $getcap()
This function is a general purpose interface to capabilities that
might be made available to the epic scripter. Right now, the only
capability namespace is for termcap/terminfo. The $getcap() function
takes at least one argument (the namespace) and a variable number of
additional arguments, depending on the needs of the namespace.
The TERM namespace. Usage:
$getcap(TERM <capability name> <captype> <mangle>)
Where "TERM" is the literal string TERM
Where <capability name> is either a termcap capability name or a
terminfo capability name or a "long name", as defined by
the terminfo standard. A list of these names can usually
be found by 'man terminfo' if you have ncurses installed.
I will post this somewhere soon and put a URL here.
Where <captype> is 0 if <capability name> is a "long name",
is 1 if <capability name> is a "terminfo name",
or is 2 if <capability name> is a "termcap name".
Where <mangle> is 0 if you want the capability to be returned in
its "raw" format, and 1 if you want control characters to
be converted into a format suitable for use with /bind or
for echoing to the screen.
*** News 08/31/99 -- New built in function, $insert()
Breaking my prior promise not to introduce any new features, and
due to the extended time all this is taking, some new features have
been added to this release.
The $insert() function takes three arguments: an index position,
a string, and some text. The return value is such that:
$substr(<word> $insert(<N> <word> <text>))
returns <N> (provided of course that <text> does not include <word>).
In other words, it inserts <word> into <text> in the <N>th position,
counting from zero.
*** News 08/31/99 -- New built in functions, $urlencode(), $urldecode()
The $urlencode() function returns the arguments passed to it, except
that all "unsafe" characters (defined as any of the characters:
[[ `'!@#$%^&*(){}<>~|\";? ,/ ]] )
are converted to their hexadecimal equivalent, using the pattern
%XX. This substitution is suitable for converting any arbitrary
text into something that is "safe" to use as a filename.
The $urldecode() function returns the arguments passed to it, except
that all hexidecimal patterns (defined as %XX) are converted to their
equivalent ascii characters.
They are symmetric: $urldecode($urlencode(TEXT)) returns "text"
*** News 08/31/99 -- New flag to /who, /who -nochops
For completeness sake, you can specify the -nochops flag to the
/who command to see only those people who are *not* channel
operators. It is the logical opposite of the -chops flag.
*** News 08/31/99 -- Changes to /save
Its easier to describe how it works now:
/SAVE [arguments] filename
Where [arguments] are zero or more of the following:
-ALIAS save all /ALIASes (no assigns!)
-ALL save everything here
-APPEND don't overwrite [filename]
-ASSIGN save all /ASSIGNs (no aliases!)
-BIND save all /BINDs
-GLOBAL save everything loaded by the 'global' script
-NOTIFY save all /NOTIFYs
-ON save all /ONs
-SET save all /SETs
-SERVER save all /SERVERs
The 'filename' argument is not optional. You must specify it.
You are no longer required to answer "Are you sure?" when you use
the /save command. The save is automatically performed.
*** News 08/31/99 -- New set, /SET DCC_USE_GATEWAY_ADDR
First, an explanation. For those of you behind firewalls, there
are actually two IP addresses that are operative. There is your
local IP address on the machine you are using, and there is the
IP address of the firewall. Many firewalls "peek" at outbound
traffic, looking for things like DCC handshakes, and when found,
substitute the local IP address for the firewall IP address.
Other firewalls don't perform this service, but instead pass all
traffic (after filtering) to the local IP address. In the latter
case, it is necceasary to use the firewall's IP address on any
outbound DCC handshakes, since the firewall does not do substitution.
If this /SET is ON, then whenever you send out a DCC handshake to
a remote peer, the client will use the IP address of the firewall in
the handshake. If this /SET is OFF, then the (normal) behavior
of using the local IP address applies.
*** News 08/31/99 -- New built in function, $stat()
This function returns information relating to a filename, which is
provided as the argument. Only one argument is accepted, so be sure
to double-quote the filename if there are any spaces in it.
The return value is the stuff found in 'struct stat' for that file,
in the following order:
$0 st_dev $1 st_ino
$2 st_mode $3 st_nlink
$4 st_uid $5 st_gid
$6 st_rdev $7 st_size
$8 st_blksize $9 st_blocks
$10 st_atime $11 st_mtime
$12 st_ctime
Please refer to the stat(2) man page for explanations of what these
different values mean. NOTE: 'st_mode' has already been converted
to octal in the return value. NOTE: The values of each of these
fields are expressly system dependant, and no guarantees are made to
the usefulness of any particular field.
*** News 06/18/99 -- New flag to $info, $info(v)
The $info(v) function call returns the "class major minor" version
information. For example, when this item was written, $info(v) was
to return "epic4 pre2 004", indicating an epic4pre2.004 class client.
Other clients may very well use $info(v) to return version information,
and hopefully they wont use 'epic4' as the 'class'. =)
The reason this is being added is because technically speaking,
looking at $J for the version info is a bad idea, and $V is good,
but $V overlaps for all the different classes of ircII clients.
So if (word(0 $info(v)) == [epic4]) then you know youre using an
epic4 client.
*** News 05/28/99 -- New built in function, $ttyname()
It just calls the ttyname(3) function, which returns the name of
the tty that the epic process is attached to, if for whatever
reason you care about that.
*** News 05/28/99 -- New built in function, $lastlog()
This function roughly simulates the /lastlog command, except it
returns a list of numbers that you can pass to $line() to get
interesting information from the lastlog. The syntax is:
$lastlog("window desc" "pattern" "lastlog level")
There must be exactly three arguments passed to this function, and
so if any of them contain spaces, you will need to use double
quotes to protect the wording. The function will return all lines
in the lastlog buffer of the specified "window" that match "pattern"
and also are of one of the types contained in "lastlog level".
For example:
$lastlog(0 *foo* ALL)
Returns all of the lines that contain the string 'foo' of any
lastlog level type in the current window.
Important note #1: Lastlog line numbers are counted from the bottom
of the display to the top. The most recently displayed line is always
numbered 0. The line numbers are also not static. Lines are
continually being added and deleted for each new line of output.
This function returns the line numbers in numeric order, which means
from the bottom up. If you want to traverse from the top down, you
will need to pass the return value of this function through $revw()
to get them in the desired order.
Important note #2: Because 'echo'ing to the screen changes the
order of the line numbers, extreme caution must be used when
outputting anything based on the $lastlog() command -- if you are
not careful to compensate, you might just retreive the wrong line.
It is _not_ my fault if this happens.
*** News 05/28/99 -- Two new extensions to the $line() function:
First, you may now pass a window name or refnum as the optional
second argument. Previously, you could only pass in a window refnum.
Second, you may also specify the literal word "-LEVEL", and the
return value of $line() would include the lastlog level of the
requested line as the first word: For example:
$line(0 -LEVEL)
Might return
"CRAP This is some text"
*** News 05/07/99 -- New function, $realpath()
If your system provides the realpath(3) library call, then this
function will convert a relative or absolute pathname into a
canonical pathname. All symlinks, and any '..' or '.'s are
handled. Note that *THE DIRECTORY PART OF THE PATH YOU PASS TO THIS
FUNCTION MUST ACTUALLY EXIST*, because this is how the library
call works. If an error occurs (such as the path not existing),
the false value is returned. If the realpath library call is not
available on a system, then this function will simply return the
arguments as-is.
*** News 05/07/99 -- New scripts, 'dig' and 'debug.irc'
Refer to them for more information.
*** News 05/07/99 -- New function, $indextoword()
This function converts an $index()-type return value to a $word()-type
argument, so that you can extract the entire word from a string that
contains a character that you know about. For example:
$word($indextoword($index(! $*) $*) $*)
would return the entire word that contained the first instance of
the bang character in $*. This might be useful to extract words
from the input line, when used with $curpos() and $L.
*** News 05/07/99 -- 20 new /set status_user<n>'s.
There are now 20 new /set status_user's available, for a grand total
of 40. The new values are /set status_user20 through status_user39.
They show up on your status bar as %{2}0 through %{3}9. The
difference between these 20 and the other 20 is that these always
display on all your windows, not just the current-type window.
*** News 04/08/99 -- New feature to aliasctl, $aliasctl(* exists *)
This new verb to aliasctl returns 1 if the indicated alias/assign
exists and 0 if it does not.
*** News 02/01/99 -- New operator in new math paser, <=>
If you are a user of the new math parser (see below, /xdebug new_math)
then there is a new operator available. The <=> operator is a binary
operator that takes two lvalues and swaps the rvalues of each operand.
For example, if $foobar is 1 and $booya is 2, then
@ foobar <=> booya
Results in $foobar being 2 and $booya being 1. The operator is right
to left associative, which permits you to string them together to
get a "shift rvalues to the right" operation.
*** News 02/01/99 -- New built in /set, /SET NEW_SERVER_LASTLOG_LEVEL
Some users do not appreciate that when you do a /window server
operation, that the lastlog level of the window is changed to
LOG_ALL. So this /set now controls what it will be set to. The
default is (obviously) LOG_ALL. Some of you will probably change
this to LOG_NONE, I suppose.
*** News 02/01/99 -- New built in flood/ignore levels (srfrog)
There are three new flood-protection types, and three new ignore
levels:
"TOPIC" "JOIN" "NICK"
respectively covering topic changes, channel joins, and nickname
changes.
*** News 02/01/99 -- New built in /set, /SET RANDOM_LOCAL_PORTS
For the delusionally paranoid, you can /set this to ON if you
want EPIC to make a token attempt to use a random port for each
outbound DCC request. If EPIC randomly picks a port that is in
use, then as a fallback, it will just ask the operating system
for a port (to avoid resource starvation).
*** News 02/01/99 -- New built in /set, /SET RANDOM_SOURCE
EPIC now has more flexibility in what it uses as its random
number source. You may now choose between three random number
sources by setting this /set to one of the following values:
0 - Use the /dev/urandom device
PRO: Reasonably good source of non-repeating numbers.
PRO: Reasonably good source of entropic numbers.
CON: Not very portable
1 - Use the classic ircII psuedo-random number generator
PRO: Very good source of non-repeating numbers.
PRO: Always available
CON: Numbers generated have almost no entropy.
2 - Use the alternative epic gettimeofday() generator
PRO: Almost always available
PRO: Numbers generated have modest entropy
CON: Poor source of non-repeating numbers.
If you /set this to 0 or 2, and the appropriate mechanism is
not available, then it will silently use the built in psuedo-random
number generator, which is always available. This variable is used
by the global random number generator, which is used by the DCC
random port guesser (see above), the $random() built in function,
and the $randread() built in function.
*** News 02/01/99 -- New built in function, $hash_32bit() (srfrog)
This function takes a case-insensitive string as its first argument
(so if it has spaces, you need to surround it with double-quotes) and
an optional argument specifying the number of characters to hash, and
converts that number of characters in the string into a 32 bit integer.
The 32 bit hash result is returned.
*** News 01/25/99 -- New feature, alias argument lists
This is kind of hard to explain, and I implemented it all in one day,
so if you try real hard to break this, you probably will. You may
now supply argument lists to your aliases. An alias list is one or
more local variables that will be given portions of the arguments
passed to your alias. For example:
/alias a1 (var1, var2) {echo $var1, $var2)
then
/a1 one two
$var1 becomes "one" and $var2 becomes "two". $* is the empty string.
- If the user passes more arguments than you have on your list, then
all of the excess arguments will go to the last variable. So in
the above example, if you do:
/a1 one two buckle my shoe
then $var1 becomes "one" and $var2 becomes "two buckle my shoe".
$* is the empty string.
- If the user passes less arguments than you have on your list, then
all of the excess variables will recieve the empty value. So in
the above example, if you do:
/a1 one
then $var1 becomes "one", and $var2 is the empty string and $* is
the empty string.
- If you would rather have the variables in the list just "shift off"
the first few variables and leave the rest of the arguments in $*,
then you can specify your last variable as "...", which will just
pop off as many words as neccesary and leave the rest in $*. So
in this example:
/alias a1 (var1, var2, ...) {echo $var1, $var2)
then
/a1 one two buckle my shoe
$var1 is "one", $var2 is "two", and $* is "buckle my shoe".
- If you would like to have any extra arguments thrown away, then you
can specify the last variable as "void". In this example:
/alias a1 (var1, var2, void) {echo $var1, $var2)
then
/a1 one two buckle my shoe
$var1 is "one", $var2 is "two", and $* is the empty string.
- If you would like to provide a default value for a variable, just
in case there is not an argument that should be there, you can
specify it with the "default" qualifier.
/alias a1 (var1, var2 default "baz") {...}
So if you do:
/a1 one
Then $var1 is "one", and $var2 is "baz" (because it is the default
value you specified) and $* is the empty string. The default value
is limited to one extended word, so if you want to have spaces in it,
you need to surround it with double-quotes. The default value will
be expanded, so you may have expandoes (such as $C) in it.
*** News 01/13/99 -- New built in /set, /SET TERM_DOES_BOLD_BLINK (knghtbrd)
If your terminal emulator does bold background colors when you
set the blinking attribute, you can /set this to ON to give a hint
to the client that it is ok to output the BLINK attribute in places
where it would otherwise not do so. A specific example is for the
^C background colors 00-15, of which 4 are "bold". If this /set is
OFF, those 4 colors are always normal intensity, and if this /set is
ON, then those 4 colors will be "blinked", and hopefully your emulator
will turn that into a bold background color.
*** News 12/17/98 -- Built in command /cycle repealed
The built in command /cycle has been repealed. The restriction that
required its implementation has also been repealed. You may now do
/quote part, and so you can use your old /cycle alias.
*** News 12/17/98 -- New built in function, $functioncall()
This built in function can be used to determine if your user alias
was called as a command (eg, /foobar) or as a function (eg, $foobar())
If your user alias was called as a function, $functioncall() will
return 1. Otherwise, it will return 0.
*** News 12/17/98 -- Slight change to built in function argument passing
Historically, built in functions have returned the false value
when a required argument was considered to be "missing". However,
a single space, delimited by quotation marks, has also been considered
to be "missing", so that something like:
$strip(" " one two three)
returned nothing, because the required first argument was "missing".
This has been corrected, so that quote-space-quote is now a valid
argument that is not "missing", and that argument contains a single
space in it. This permits you to pass a space as a required argument
to any function by enclosing it in double quotes. Of course, this
only impacts functions that interpret their arguments as a list of
words.
*** News 12/11/98 -- New window action, /window refnum_or_swap
It has been pointed out that there is no atomic way to make a
given window both current and visible, without failure. This
action provides that capability. It is passed one argument, the
refnum or name of the window to be made current. If the window is
visible, then the client makes that window current (as /window refnum
would do). If the window is hidden, then the client swaps the
window in and makes it current (as /window swap would do). This
action never fails unless you specify a window that doesn't exist.
*** News 12/11/98 -- New built in command, /usrip
EFNet has decided to re-implement the /userip command from
undernet and give it a gratuitously different name. Ugh.
See /userip for more information.
*** News 12/11/98 -- Status line expando %S changed, always displays
Due to overwhelming request, the %S status-line expando now always
displays the server information, even if you are not on multiple
servers. If you have a severe problem with this change, please
let me know.
*** News 12/11/98 -- Clarification of $winchan() and $chanwin()
Nuke has asked me to officially clarify that if you specify a
channel argument, a second argument is optional. The optional
second argument is the server refnum from which you are interested
in the channel. This is to clarify between two channels of the
same name on two different servers, obviously.
*** News 11/10/98 -- /on switch_windows extended a bit
I am documenting this here because there have been some changes
(improvements) which contradict the previous documentation for
/on switch_windows, so a record is needed. Anyhow, as far as i
can tell, the client now will hook /on switch_windows _every_ time
the current window is changed, not just in some select situations.
Hopefully this will make everyone happy. =)
*** News 11/03/98 -- $servername(), $servernick(), $serverports() changed
They are now all happy if you do not provide them with any arguments,
as they will default to the current server refnum (from_server).
*** News 11/03/98 -- New built in function, $prefix(<word list>)
The $prefix() function purports to return the longest string that
is a common leading substring to all the words in the given word
list. For example:
$prefix(one two three) returns the false value
$prefix(p1 p2 p3) returns "p"
$prefix(one-1 one-2 one-3) returns "one-"
*** News 11/03/98 -- New built in function, $maxlen(<word list>)
The $maxlen() function purports to return the length of the longest
string in the given word list. You figure it out. ;-)
*** News 11/03/98 -- New verb for /window, /window clear
This is a pretty obvious one -- how did it get overlooked?
Pretty simple. It clears the current window.
*** News 09/28/98 -- /on dcc_lost hooked for auto-dcc reject
When the client auto-closes your dcc's because they have excceded
the timeout specified in /set dcc_timeout, the client will hook
/on dcc_lost for you with the pertinent information.
*** News 09/28/98 -- New verb for $aliasctl(), pmatch (Colten, nutbar)
You may now do pattern matching on your aliases and assigns
by specifying "pmatch" instead of "match". Unlike the "match"
on bitchx, this does not auto-append a *, so if you want "match"
like behavior, remember to put it on the end. Examples:
$aliasctl(alias pmatch *foo)
returns all alias names that *end* with "foo"
$aliasctl(assign pmatch *g*)
returns all assign names that contain a "g".
*** News 09/28/98 -- New built in function, $isaway() (nutbar)
You give it a server refnum it tells you if youre away on that
server. The default argument is the current server. The
"special" argument of -2 returns 1 if you are away on any server,
0 if you are "here" on every server.
*** News 09/28/98 -- New flags to /exec, -line, -error, -end
These flags allow you to specify code that will be executed for
any of the output events from an /exec'd command. For example:
exec -line {
echo stdout: $*
} -error {
echo stderr: $*
} -end {
echo ALL DONE!
} ls
Note that /exec -end just does a /wait %proc -cmd for you (really),
so it doesnt save you any time to do it that way.
*** News 09/28/98 -- Semantic change to local variables
Due to exceeding popular request, all local variables are "owned"
by their closest enclosing atomic scope and NOT by the closest
enclosing syntactic scope. The /bless command does not affect
this rule in any way. The following illustrates the change:
alias foobar
{
local a 4
if (1) {
# a is 4 here
local b 5
}
# b is still around here, with the value 5.
echo [$a] [$b]
}
*** News 09/28/98 -- New built in function, $getopt() (Crackbaby)
$getopt(<optopt var> <optarg var> <opt string> <argument list>)
Processes a list of switches and args. Returns one switch char each time
it's called, sets $<optopt var> to the char, and sets $<optarg var> to the
value of the next argument if the switch needs one.
Syntax for <opt string> and <argument list> should be identical to
getopt(3). A ':' in <opt string> is a required argument, and a "::" is an
optional one. A '-' by itself in <argument list> is a null argument, and
switch parsing stops after a "--"
If a switch requires an argument, but the argument is missing, $getopt()
returns a '-' If a switch is given which isn't in the opt string, the
function returns a '!' $<optopt var> is still set in both cases.
Example usage:
while (option = getopt(optopt optarg "ab:c:" $*)) {
switch ($option) {
(a) {echo * option "$optopt" used}
(b) {echo * option "$optopt" used - $optarg}
(c) {echo * option "$optopt" used - $optarg}
(!) {echo * option "$optopt" is an invalid option}
(-) {echo * option "$optopt" is missing an argument}
}
}
*** News 09/28/98 -- Lots of changes with key bindings and /bind command
* You no longer have to do this:
/bind ^[ meta1
/bind meta1-[ meta2
/bind meta2-1 metaN
...
You can now do:
/bind ^[ meta1
/bind ^[[ meta2
/bind ^[[1 metaN
And the client wont whine at you.
* /set meta_maps controls the number of META states you have, there
is no limit, but there is a floor of 5 meta maps (meta0 through
meta4). Yes, you can have as many or as few as you want! =)
Note that decreasing this value will destroy any bindings that
depend on states that are going away, the client auto-garbage
collects them and theyre gone forever. Just be forewarned.
* You no longer have to do the first thing, you can just do:
/bind ^[[11~ scroll_back
The client will automagically bind all the intermediate steps to
open meta states and you dont have to worry about negotiating
the meta maps (as long as you use this all the time, the client
will not get confused, but if you start messing around, you might
lose some of your binding chains.)
* /bind accepts a special argument, '-default' which is like /dump
for your keybindings, but it restores the defaults so you can
continue to type. =)
*** News 09/28/98 -- Add per-window status formats
Each window may now have its own, independant status_format variable
seperate from the global defaults. Theyre just like the normal status
formats, except you access them through the /window command:
/window status_format "..."
/window status_format1 "..."
/window status_format2 "..."
It is recommended that you put double-quotes around the status format
as it probably contains spaces and you will want it parsed as just
one argument. Kanan has bugged me for this feature for years, so
hopefully he wont be the only one using it. ;-)
*** News 09/28/98 -- New flag to /xquote, -ALL (Colten)
With /xquote -all, you can send something to every connected server,
perhaps client-side away handling...
*** News 09/28/98 -- $aliasctl(assign match) added. (Colten)
You can now match variables in addition to aliases.
*** News 09/28/98 -- New expression parser (IN DEVELOPMENT)
There is a new expression parser you can play around with by doing
/xdebug new_math. Note that this /xdebug will probably be retained
in the future and will be a no-op, so its safe to use in your scripts.
More about the new expression parser when its closer to being finished.
*** News 09/28/98 -- New flag to /xecho, -x
This flag allows you to output something with all highlight attributes
preserved, no attributes are honored. Note that if you repaint the
screen, these highlights will probably magically go away. ;-) This is
NOT a bug, so its not as useful as it might appear.
*** News 09/28/98 -- New /on, /on switch_windows
This is hooked whenever the client changes what it thinks your
"current" window is in any context:
$0 The old screen number
$1 The old window refnum
$2 The new screen number
$3 The new window refnum
Note that the window might change through forces other than the
'SWITCH_WINDOWS' keybinding. You can have a pretty good idea
when this happens because $0 and $2 will be different.
*** News 09/28/98 -- New built in keybinding, /bind <X> refresh_status
This just updates all your status lines, and nothing else.
*** News 09/28/98 -- You may now 'return' out of /fe, /do, /for, etc
This was not supported before. Probably a bug.
*** News 09/28/98 -- New set, /set mangle_logfiles
You may now mangle the output that is destined to your logfiles
by /set'ting this variable appropriately. It uses the same syntax
as /set mangle_inbound and friends.
*** News 09/28/98 -- You may now strip ALL_OFF in $stripcrap()
Just specify ALL_OFF as one of the items in the first argument.
*** News 09/28/98 -- Support for bzip2
Scripts, help files, and other files that are loaded by the client
may now be in .bz2 format as long as 'bunzip2' is available somewhere
in your PATH.
*** News 09/28/98 -- New built in expando, $''
Yea yea, i know i havent documented anything in a long time, so
here is a bunch all together. This new expando is just like $"",
except that it only waits for the user to press one key before it
returns. BTW, $"" and $'' now use /input and /input_char as their
underlying infrastructure, but put a synchronous wrapper on top of
it, so it is now safe to mix the two input types (such as it is.)
*** News 08/03/98 -- New /on, /ON SWITCH_CHANNELS
This is now hooked whenever any of your windows has its current
channel set. This includes the transitions from channel 0 to
a new channel (when you /join) and from an old channel to channel 0
(when you /part), and when you do a SWITCH_CHANNELS keybinding.
If one of the channels involved is channel 0, then "0" will be the
channel specified.
$0 - The window that the change is happening in
*** You should not assume that this window
is the current window! ***
$1 - The old channel
$2 - The new channel
*** News 07/13/98 -- New stuff for stripping crap out of text
Due to the incessant requests, ive given in and written a general
purpose tool for stripping just about any kind of crap out of text.
The tool is used in two ways: Two new /set's that control just
what (if anything) the client will strip out of incoming and
outbound lines to the *server*, and a new built in function that
allows you to scour arbitrary text in arbitrary ways. Lets get
on to the gory details:
This is the syntax for describing to the client just how to mangle:
ALL - Strip all of the below, except ESCAPE
ANSI - Convert all ANSI to logical characters, and
remove all "unsafe" ansi codes. This does just
what $stripansicodes() does. Note that to remove
any of the attributes below, you need to also
specify ANSI so that any ansi-sequence will be
converted to their logical characters to get
stripped. If you dont specify ANSI, all ansi
codes will be left untouched!
BOLD - Remove all bold_toggle chars.
COLOR - Remove all ^C color sequences.
REVERSE - Remove all reverse_toggle chars.
UNDERLINE - Remove all underline_toggle chars.
BLINK - Remove all blink_toggle (flashing) chars
ROM_CHAR - Remove all rom_char characters
ND_SPACE - Remove all non-descructive spaces
ESCAPE - This is a special one. If you specify ESCAPE,
then any ESC characters will be converted to
<REVERSE>[<REVERSE>. This will defeat your
ability to do ANSI, as there wont actually be
any ansi sequences left! ;-)
You may specify any number of these modifiers by seperating them
with commas. For example, "BLINK,UNDERLINE" means to remove both
blink and underline characters. You can negate the sense of an
attribute by prepending it with a hypen. So "ALL,-REVERSE" removes
all the above attributes EXCEPT that it wont remove reverse chars.
And now how to use this:
/set mangle_inbound <description>
This will mangle all inbound SERVER text in accordance with the
description rules (as specified above).
/set mangle_outbound <description>
This will mangle all outbound SERVER text in accordance with the
description rules (as specified above).
$stripcrap("<description>" text)
This will mangle the given text in accordance with the specified
description (as specified above).
*** Note that in general, using this feature is *very* expensive.
*** News 06/15/98 -- /TOPIC command extended to now unset topics
You can now unset the channels topic by prefixing the channel
name with a hyphen *and not specifying any arguments*. That is
to say, '/topic -#umbrella' will unset the topic (if any) from
the channel #umbrella. You can do '/topic -' to unset the topic
from the current window's channel.
*** News 06/10/98 -- EPIC now under the BSD license
As ircII-current (post 4.4) has been changed to the BSD style
license and ive been informed that permission has been given to
retroactively offer the license to previous versions (eg, 2.8.2),
I'm very happy to release EPIC under the BSD style license.
See doc/Copyright for the specifics.
*** News 05/28/98 -- /on connect now passes in three arguments
/on connect now offers the server's idea of what its name is
as $2. This may very well differ from what we think its name
is supposed to be.
*** News 05/29/98 -- New built in functions $iget[r]matches() (Crackbaby)
This works just like $getmatches(), but it returns the index number
(in alphabetic order) of the array members rather than the item
numbers (in the order they were put into the array.) The first
argument is the array and the second argument is the pattern.
$igetrmatches() is to $getrmatches() what $igetmatches() is to
$getmatches(). Got it?
*** News 05/29/98 -- New /on, /ON SEND_CTCP
When you send a CTCP request or a CTCP reply, this on will be
hooked. The arguments are:
$0 - "PRIVMSG" for requests, "NOTICE" for replies
$1 - Who the CTCP is being sent to
$2 - The type of CTCP being sent
$3- - (Optional) Argument(s) to the CTCP being sent
*** News 05/29/98 -- New built in function $servnum()
You give it a server name, it returns a server refnum for that
server. Returns -1 if the server isnt valid.
*** News 05/29/98 -- New type to /xdebug, "ALL"
If you specify "ALL" to /xdebug, it will turn on all the xdebug
options (as if you had specified the -x command line argument).
Using "-ALL" will turn off all xdebug options.
*** News 05/29/98 -- New flag to /who, -u-i
This flag will direct the client to add the 'x' argument to the
WHO protocol command, which is used by the undernet ircd servers
to give you invisible users. (They changed it so that operators only
see visible users now unless they use this special flag, so that the
server can whine to everyone else about how youre abusing your power.)
Don't use this server in any other situation, as itll probably
confuse the server or something.
*** News 05/29/98 -- $isconnected() no longer requires an argument
If you dont specify an argument, 'from_server' is the default
*** News 05/29/98 -- /on dcc_connect compatability with BitchX
/on dcc_connect will hook with $1 being "SEND" first, and if you
dont grab that, it will offer the same exact thing with $1 being
"GET". This is for compatability with bitchx.
*** News 04/24/98 -- New built in command line argument (Texaco)
The -s command line flag is now honored, and it instructs the
client to not attempt to connect to a server on startup, but
instead show you your server list (so you can /server to one)
*** News 04/24/98 -- New built in function $gettmatch() (Colten)
Im not exactly sure what it does. Someone tell me please? =)
*** News 04/24/98 -- New noise operator for /on, /on ?type
This is kind of hard to explain, but here goes. You may now specify
an /on as having noisy type '?' (a question mark). If you use this
type, the /on will be executed silently (as if you had used /on ^type)
but whether or not the /on actually supresses the default action will
be determined by you at runtime. You are expected to /return a value
from the body of the /on. If you return 1, the default action *will*
be suppressed. If you return 0, the default action *will not* be
suppressed.
*** News 04/18/98 -- **hack** /on set "set-error *" is hooked by /set
Whenever the user does something that would cause the /set command
to emit an error, such as /set booya, where booya is not a valid
built in /set, you can hook /on set "set-error *" to suppress or
redefine the error message.
*** News 04/18/98 -- /bind'ings also follow your /package settings
So if you /unload package, then it will unload any /bind's that
were set in that package.
*** News 04/18/98 -- /on 433, /on 437, /on 438 now pass server as $0
These are the "nick collision" numerics, and now the server that
rejected you is passed as $0. I have cleared this change with Pana,
so BitchX will do this as well shortly.
*** News 04/18/98 -- New built in function $getsets()
If given an argument, it will return all the built in /set values
that are matched by the argument(s). If no arguments are given,
it will return all built in /set values.
*** News 04/18/98 -- Client automatically sends DCC REJECT when you exit
The client will automatically send CTCP DCC REJECTs on your behalf
whenever you close or abort a DCC conenction. This also will happen
when you /exit. This is so the remote peer will know that you will
not be getting the transfer, and if theyre an EPIC or BitchX client,
they will automatically close it for their end as well.
*** News 04/18/98 -- New /set, /SET SCROLLBACK_RATIO
You may now specify, in percentage points, how much of the screen you
want to scroll by every time you scroll forward or backward. This
value should be between 10 and 100, as the client silently truncates
it to those extremes if you dont.
*** News 04/18/98 -- /DCC GET nick * now works
You may specify a star as as special indication that you want to get
all of the files that have been offered by "nick".
*** News 04/18/98 -- New set, /SET DCC_AUTO_TIMEOUT (autoclose old dcc reqs)
If at least N number of seconds has passed (where N is the value of
this set) since you offered or were offered a DCC handshake,
without the connection being accepted by either side, the client
will automatically close the offer on your behalf.
*** News 04/18/98 -- Doing /DCC SEND nick file wont emit error second time
Rather than emitting an unhelpful error message the second time you
try to /DCC SEND to someone (perhaps because the first time you did
the send the person wasnt on), duplicate /DCC SEND requests will now
send a "booster" message identical to the original.
(This works for /dcc chat nick as well)
*** News 04/18/98 -- /DCC RENAME can now rename chat connections
To rename a chat connection, specify the original nickname as '-chat'.
Then specify the old nick and the new nick. Something like this:
/dcc rename -chat oldnick newnick
*** News 04/18/98 -- DCC sliding window (/set dcc_sliding_window) modified
You may now set this to any value, no matter how abusrdly large, and
the client will keep up to this many packets outstanding, but never
so many that the client will block. Previously, if you set this value
too high, the client would block. Now it is safe to set this to
10,000, and acheive pretty good throughput.
*** News 04/18/98 -- New /dcc command, /dcc closeall
This closes all of your registered DCC connections, leaving your DCC
list very empty.
*** News 04/18/98 -- Windows may now have zero visible lines
You may now do /window size 0 to make a window that is nothing but
a status bar.
*** News 04/18/98 -- New /set, /SET ND_SPACE_MAX
For those who want to cap the number of non-destructive spaces that
may appear in any one line of output, you may set this variable to
control the number the client will parse before ignoring them. The
idea is simliar to /set tab_max
*** News 04/18/98 -- New flag to /xecho
If you use the double-hyphen flag to /xecho, it will stop all
argument parsing right there and take the rest of the arguments as
the text to be echoed. This is useful if the first word you want to
output starts with a hyphen
/xecho -- -s booya booya booya boo
outputs
-s booys booys booys boo
*** News 04/18/98 -- New flags to /lastlog
There is a new flag to /lastlog, -all which specifies that the given
lastlog level to search for is to be all qualifying levels. You can
turn off a given level by using a double hyphen (ala --msgs). So, if
you want to see everything in your lastlog EXCEPT your msgs, do this:
/lastlog -all --msgs
Another new flag is -reverse. The -reverse flag instructs the client
to start from the END of your lastlog and go BACKWARDS through the
lastlog when outputting.
*** News 04/02/98 -- New command, /userip
This is the front end to the Undernet command by the same name. It
is exactly like /userhost except it returns the ip address instead of
the named userhost.
*** News 04/02/98 -- New command, /usleep
The /usleep command pauses the client for some number of microseconds.
specified as the argument to the command. This command will probably
be rolled into /sleep at some future time, Watch for this.
*** News 04/02/98 -- $cparse() changed to support bitchx-syntax
If the first argument passed to $cparse() is an extended word, then
only the first argument will be used for the output, and any numeric
expandoes in the first argument will be expanded with the rest of the
arguments to $cparse() -- ala:
$cparse("This is a $0 test" cparse)
*** News 04/02/98 -- /window create now works properly for GNU screen
Kanan did the work for this, you can thank him. ;-)
*** News 04/02/98 -- You may now /msg a DCC RAW connection.
To send a message to a DCC RAW connection, simply msg to =NUM
where NUM is the number that was previously returned by $connect().
Obviously, you can also /query a DCC RAW connection with this, making
it usable for protocol connections to remote servers. I have fixed
and returned the 'mudirc' script, which demonstrates how to make epic
act as a relatively useful mud/moo client.
*** News 03/24/98 -- Scope resolution operator for variables
The client now supports a way to differentiate between local
variables and global variables having the same name. As always,
an expando with no modification will resolve to a local variable
if it can, and a global variable it cannot. However, if the
variable name is prefixed with a single colon (either as an lval
OR as an rval), then the variable will be expanded *only* as a
local variable, and if the local variable does not exist, it will
expand to the false value. If the variable name is prefixed with
two colons (again, either as an lval or an rval), the variable will
be expanded *only* as a global variable, even if a local variable
by that name exists. Here are some examples:
assign foo 1
local foo 2
@ ::foo = 4 # Sets the GLOBAL variable
@ :foo = 6 # Sets the LOCAL variable
@ foo = 8 # Sets the LOCAL variable
@ bar = 12 # Sets the GLOBAL variable
$::foo # is '4'
$:bar # is the false value
$bar # is 12
$foo # is 8
*** News 03/24/98 -- New /on, /ON UNLOAD
As a courtesy to script writers that use /package in order to keep
track of all of the aliases and so forth that they create in their
scripts, /ON UNLOAD will be hooked with the package name (as supplied
to /package) when the user does /unload <packagename>. Presumably,
you could use this to close open logfiles or $connect()s or what
ever garbage collection that is needed.
*** News 03/24/98 -- Built in function $tdiff() enhanced (as a demo)
To demonstrate the proof of concept, the $tdiff() function has been
expanded to support decimals. For example:
$tdiff(60.01) returns "1 minute 0.01 seconds"
If you like this support and want to see it applied to the other
$tdiff*() functions, let me know.
*** News 03/24/98 -- New /set, /SET MIRC_BROKEN_DCC_RESUME
Unfortunately, due to popular demand, i have broken my previous
promise to never #define MIRC_BROKEN_DCC_RESUME, a feature which
breaks both the spirit and the letter of RFC 1459. As a comprimise,
the ability to use this feature is controlled through a new set by
the same name, /SET MIRC_BROKEN_DCC_RESUME which will now and forever
default to OFF. (Since /set's can be changed by a script, there will
not ever be a need for me to change this default to ON.) I stand by
my previous statement that any script that uses this feature is
broken and you should pester the script author to take it out.
*** News 03/24/98 -- /ON DCC_OFFER extended
If you offer a dcc send to another user, then /on dcc_offer will
hook with additional arguments:
$2 - filename being offered
$3 - size of the file being offered
*** News 03/24/98 -- Built in function $isnumber() changed
You may now specify a base argument, prepended with a 'b'.
For example, to determine if '014' is a number in base 6,
$isnumber(014 b6) or $isnumber(b6 014)
It makes no difference whether the base is the first or the
second argument: but you must put a 'b' before it either way.
Bases 0 through 36 are supported. Base 0 (the default) is a
special base that attempts to auto-grok the argument for its
base (see the man page on strtol(3))
*** News 03/24/98 -- New built in function $rest(start text) (Matt)
This function works like $restw(), but it works on strings. It
returns 'text' beginning at the 'start'th character
*** News 03/24/98 -- /bind metaX now shows all of the meta-X bindings
If you do something, like say, /bind meta1, then the client will
show you all the bindings you have that start with meta1.
*** News 03/24/98 -- The slash (/) always recognized as a command char
As a consideration to scripters, the client will always accept
the slash as a command character, even if /set command_chars does
not include it. You may then safely and with a free conscience
do //built_in_command without having to lie awake at night worrying
that someone would take away the slash from you.
*** News 03/06/98 -- Add or delete specific levels from /window level
You may now add or delete levels from your existing /window level
by prepending the level(s) with a plus ('+') for addition and a
minus ('-') for subtraction. For example:
/window level all -- sets the window level
/window level -crap -- removes JUST crap level
/window level +crap -- adds crap level back.
*** News 03/04/98 -- You may now use "special chars" in your input prompt
Previously, you could use ansi sequences to turn on bold and so
forth in your input prompt. Now you may use ircII's "special chars"
to turn them on as well (like ^B, ^C, etc). The flipside of this is
that you may only use "safe" ansi codes, if you use them at all, since
unsafe ansi codes will be stripped out by the client. This is
intended to be a feature, not a bug.
*** News 03/04/98 -- New character for $info(o)
If the return value from $info(o) includes the character 'm', then
you know that you should /set color instead of /set control_color_c.
This can be used in conjunction with the next note...
*** News 03/04/98 -- IMPORTANT! /SET CONTROL_C_COLOR RENAMED TO /SET COLOR
It is important to note this change. If you have /set control_c_color
in your script, you should do one of two things to work around this:
1) Use a compatability /set for older epic4pre1.* clients:
/on ^set "COLOR *" set control_c_color $1
2) OR use a compatability /set for newer epic4pre1.* clients:
/on ^set "CONTROL_C_COLOR *" set color $1
*** News 03/03/98 -- Correct support for "nondestructive spaces".
You may now use the ^S special char as a "non destructive space".
This is emitted by the ansi parser when you do the ^[[<N>C code.
The general idea of a nd space is that any color/highlight/etc that
is active *will not* be output for the space (it is left totaly
blank of all attributes)
*** News 03/02/98 -- New flag to /input, /input -noecho
If you want to input a password, or some other sensitive information,
you may use the -noecho flag to /input to suppress the echoing of
the characters as they are typed.
*** News 03/02/98 -- Ten new /set status_user(10-19) supported.
You may now do /set status_user10 through /set status_user19.
They will show up on your status bar via the %{1}0 through %{1}9
expandoes. See below for explanation of how %{N}M works.
*** News 03/01/98 -- Uppercase user modes supported
Now all 26 of the uppercase user modes are supported, along with
the 26 lower case modes. Should cause the client not to crash
on DALNet and so forth.
*** News 02/27/98 -- Semantic changes for status line expandoes.
It is now possible to specify a "map" for your status line expandos.
The general syntax is: %{N}M where 'N' is some number, and 'M' is
the expando that you want. Note that for different values of 'N',
you will get different expandos for 'M'. The default value of N (if
you do not specify a value) is 0. To give you an idea how this works,
use %{0}S and see that it is the same as %S. I have included (for
testing purposes) a single expando %T on map #1. Use %{1}T and see
that it is *different* than %T. It is expected that this will allow
an effectively unlimited number of status line expandos in the future.
*** News 02/27/98 -- New built in function, $isnumber(text)
You pass it a number, it tells you if it is a number or not. It
correctly handles negative numbers, and hexadecimal/octal. More or
less all it does is call strtol(input, NULL, 0). See the man page
for strtol to see how that works.
*** News 02/27/98 -- Four new mask types for $mask().
There are now four new types of masks for $mask():
N Z is a hostname Z is an ip address
-------------------------------------------------------------------
10 *!*@h.d *!*@d.*
11 *!*u@h.d *!*u@d.*
12 n!*@h.d n!*@d.*
13 n!*u@h.d n!*u@d.*
With the following modifications: In the ``local'' portion of
the hostname, all sequence of numbers are substituted with a
single '*'. That is to say,
$mask(10 nick!user@ppp-147-0-52-129.frobitz.com)
returns
*!*@ppp-*-*-*-*.frobitz.com
*** News 02/22/98 -- New built in function, $stripansicodes(text)
This function will "normalize" the text, suitable for displaying.
Generally, "normalization" has two aspects. The first aspect is that
if DISPLAY_ANSI is ON, then all ansi codes are either converted into
logical codes (^C sequences, or ^B, or ^_, etc), or they are stripped
out entirely. If DISPLAY_ANSI is OFF, then just the escape is mangled,
and the rest is left intact. ^C codes are also converted to a form
that correctly manages bold and blink attributes. THIS IS THE SAME
CODE THAT PREPROCESSES YOUR OUTPUT FOR THE SCREEN. So you can be
assured that What You Get Is What Youre Going To See.
*** News 02/22/98 -- New built in function, $printlen(text)
This function returns the number of _printable characters_ in the
text _as it would appear on the screen_. The string you pass must
not contain any ansi sequences, as they are interpreted as printable
characters. Use $stripansicodes() to remove them.
*** News 02/22/98 -- New math operator, **
The ** operator now acts as an exponential operator. All it does is
call pow(), so you can specify whatever arguments you want with it.
Yes, it correctly handles negative exponants and fractional exponants,
as long as your math library does!
*** News 02/22/98 -- New built in function $remws(lhs / rhs)
This function returns all of the words on the rhs of the the /,
except that any words that appear on the lhs of the / have been
removed first.
*** News 02/22/98 -- New built in function, $pad(len char string)
This allows you to pad a string out to a certain length with
a specified character. If the string is too long, it is NOT
truncated (as opposed to $[x]y).
*** News 02/18/98 -- Twenty new meta maps [obsolete]
Yep. Now there are thirty nine of them. META1-META39.
META4 is still, as always, sticky. [obsoleted by /set max_meta]
*** News 02/18/98 -- New built in function, $channel()
This returns some information about who is on your channel. It
returns a sorted list of nicknames prepended by two characters.
The first character is a '@' if the person is a channel operator,
and '.' if they are not. The second character is '+' if the person
is a channel voice, and '.' if they are not, and '?' if we're not
sure either way.
*** News 02/16/98 -- New built in function, $iscurchan()
This takes a channel argument, and will return '1' if the specified
channel is the current channel for *any* window that is bound to the
current server. It returns 0 otherwise. This is intended to allow
for more flexibility for testing for current channels in /ON's. EG:
Rather than:
/on ^send_public * {if ([$0] == C) {...} {...}}
Try doing:
/on ^send_public * {if (iscurchan($0)) {....} {...}}
This will allow you to do the "right thing" even when $0 is not the
current channel for the current window.
*** News 02/14/98 -- New built in functions: $getuid(), $getgid(), $getpgrp()
As well as $getlogin(). These correspond to the system calls by the
same name. Do a lookup on the man page for information on what they
return.
*** News 02/14/98 -- Changes to how ansi codes are handled
IF YOU HAVE /SET DISPLAY_ANSI ON:
New code contributed by fireclown now eradicates all ansi codes
from the output before it is counted and displayed. Any codes that
are recongized and are "safe" (such as ^[[<X>m, where <X> is one of
the color codes, or bold/blink/reverse/underline), are converted to
the corresponding logical character. All other codes are blown away
entirely. Not just the escape, but the whole thing (at least as much
as we can recognize it.)
IF YOU HAVE /SET DISPLAY_ANSI OFF:
Just like before, the escape is mangled into reverse, and the rest
of the string is untouched.
Also, since all ansi color codes are converted to ^C codes, then
if you /set control_c_color OFF, all color will be inhibited.
Conversely, if you /set control_c_color ON, all color will be
honored. IT NO LONGER IS RELEVANT WHAT YOUR /SET DISPLAY_ANSI
VALUE IS TO DETERMINE HOW YOU SEE COLORS!
*** News 02/14/98 -- New ^C codes
The Control-C Color codes from 00 to 15 are now in "mirc" order
(which is also used by BitchX). This has been changed to make it
easier on scripts that want to be BitchX/EPIC compatable. The
ANSI order codes have been moved to:
30 - 37 Ansi Foreground colors
40 - 47 Ansi Background colors
50 - 57 Emphasized fg/bg colors
Note that 30-37,40-47 corresponds directly to the ^[[<X>m codes
and that 50-57 is either the BOLDED colors of 30-37, or the BLINKING
colors from 40-47, depending on whether or not it is on the lhs or
the rhs of the color code.
*** News 02/14/98 -- Two new debugging flags to /who
/WHO -d (diagnose) will show the contents of the who queue for the
server for your current window
/WHO -f (flush) will remove all the entries of the who queue for
the server for your current window. You must *NEVER* do this
while a WHO request is still pending, or the client will
fall over. If you report this as a bug, i will laugh at you.
*** News 02/14/98 -- New built in function, $rigtype()
You give it some number of ignore levels, it will give you all of the
patterns (exact patterns) that match *only* those levels (no more,
no less.) Dont ask, this is what was requested. ;-)
*** News 02/14/98 -- New built in function, $igtype()
You give it one of your ignore patterns (must be EXACTLY the same.
This is not for use as a matcher. Use $rigmask() for that) and it
will give you the IGNOREd levels on that pattern.
*** News 02/14/98 -- New built in function, $winlevel()
You give it a window description (name or refnum) and it gives
you the lastlog levels that are bound to that window. Simple,
aint it?
*** News 02/14/98 -- New /set, /SET HIGH_BIT_ESCAPE (0 | 1 | 2)
This controls the behavior of how the client handles 8 bit characters.
If this is set to 0, the eighth bit, if any, is always stripped to
yeild a 7-bit ascii value. If this is set to 1, then if the 'km'
termcap variable is set (hint: it almost always is), then the eight
bit character <meta>-X will be converted into a <ESC>-X sequence.
If this is set to 2, then the client will leave the character alone
and parse it as a normal 8 bit character.
*** News 02/14/98 -- New /on, /ON SERVER_LOST
This is (hopefully) hooked any time youre disconnected from any
server for any reason.
*** News 02/14/98 -- Variable modifier : (a colon) implicitly declares local
You may now *** as an lvalue *** prepend the variable name with
a colon to impliclity declare it as a local variable. You must not
use the colon in any rvalue context, or in the /fe or /foreach
commands, as the variable is already declared local there. You need
only use the colon once. Any future references will automatically
use the local variable because it will have been declared that way.
*** News 02/14/98 -- New flag to /xecho, /xecho -s
/xecho -s attempts to emulate the internal "say()" function, and
promises not to output anything if you have run the command with the
^ modifier to suppress any output. (Normally, all /xecho's always
are output, even if you did ^cmd to supress output)
*** News 02/14/98 -- New status line expando, %. (percent-dot)
This outputs the current contents of whatever was set with the
/window status_special command (see below)
*** News 02/14/98 -- New /window command, /WINDOW STATUS_SPEICAL
This /window command sets some window-specific information that
you would like to see displayed on your status bar. It will be
displayed in the status bar using the %. expando (thats a dot)
*** News 02/14/98 -- New built in function, $chop(num text)
This function returns "text" with the LAST "num" characters
removed. If "num" is negative, nothing happens.
*** News 02/14/98 -- /set status_user<3-9> changed
They now go to your current window rather than to a NON current
window. I did this because it seemed everyone wanted it that way.
*** News 02/14/98 -- New set, /set current_window_level <LEVELs>
This set will allow you to specify some number of levels as always
going to the current window *if and only if* the current window is
attached to the same server as the output to that level. Otherwise,
it would go to the "normal" window. This is useful for people who
want informational stuff to always go to a visible window, so they
may choose to do /set current_window_level CRAP
*** News 02/14/98 -- $mychannels() can take an argument
If the argument is a number, then it is taken as a server refnum
that youre interested in. If it is not a number, then it is taken
as a window name that youre interested in. But wait! There's more.
If you must have a need to specify a window refnum instead of a
name, you can prefix it with the '#' character and thatll work too.
*** News 02/14/98 -- Documentation updated
Youll notice this file is way behind the work ive done. So today
im gong to go through and update all the stuff ive done since the
last time i documented it (2 and a half months). They all have
todays date, but theyve been done at various times recently.
*** News 12/29/97 -- New built in function $ischanvoice(nick #channel)
This function returns one of three values depending on the current
+v status of the given nick on the given channel.
0 -- The person is not +v
1 -- The person is +v
-1 -- I dont know
*** News 12/19/97 -- New built in function $mask(type address)
Returns a pattern suitable for /ignore'ing or banning. If 'type'
is N, and the address is Z (either n!u@h.d, or n!u@d.h, where the
former is a host.domain and the latter is an ip address), then the
return value is:
N Z is a hostname Z is an ip address
-------------------------------------------------------------------
0 *!u@h.d *!u@d.h
1 *!*u@h.d *!*u@d.h
2 *!*@h.d *!*@d.h
3 *!*u@*.d *!*u@d.*
4 *!*@*.d *!*@d.*
5 n!u@h.d n!u@d.h
6 n!*u@h.d n!*u@d.h
7 n!*@h.d n!*@d.h
8 n!*u@*.d n!*u@d.*
9 n!*@*.d n!*@d.*
*** News 12/19/97 -- Changes to $winchan() and $chanwin(), now synonyms
Since there is no compelling reason to make a distinction between
$winchan() and $chanwin(), and since the specific distinction that
was made caused no end of problems for both me and scripters, the
two troubled functions are now synonyms of each other. If you pass
it a channel, it will return a window refnum. If you pass in anything
that isnt a channel, it will be considered a window refnum or name,
and the current channel of that window will be returned.
*** News 12/19/97 -- New built in function $winrefs()
This returns the refnums of every currently open window, both hidden
and invisible. While the order of the refnums is *EXPLICITLY*
undefined, it follows in traverse_all_windows() order, which usually
returns windows in physical order on their screens, and the invisibile
windows are last. You may NOT assume this, though. ;-)
*** News 12/19/97 -- New built in function $querywin(target)
Given a query target, this returns a window that has that target
as its current query. If more than one window has the specified
target as its query, which window is returned is indeterminite.
*** News 12/19/97 -- New built in function $uname(description string)
This returns the entire argument string as-is except with the
following modifications, as retreived from the uname(2) system call.
Any instance of will be replaced with
---------------------------------------------------------------------
%m The "machine" (architecture)
%n The "Node" (hostname)
%r The "Release" of the operating system
%s The "Name" of the operating system
%v The "Version" of the operating system
%a The logical value of "%s %n %r %v %m"
%% A single %
*** News 12/19/97 -- New built in pattern matcher
A new pattern matcher has been written. It is expected to be
bug-for-bug compatable with the old pattern matcher. If you see
any discrepencies, no matter how obscure, please let me know.
The reason for the new matcher is that it uses an iterative algorithm
rather than a recursive algorithm, and so is expected to be faster.
*** News 12/19/97 -- New built in commands, /PACKAGE and /UNLOAD
The /PACKAGE command allows you to "group" all of the assigns,
aliases, and ons (and stubs) in a script under a common package
name. When you use the /package command, any alias/assigns/on that
are registered until the end of the file are given the current
package name. You can change the package name anywhere in a script,
even if you have previously used /package. However, packages only
last until the end of the file -- they never propogate upwards.
Scripts that are loaded by other scripts may put themselves under
a different package name than the one being used by the loading
script. By default, a script is put into the package that is
currently active in the script that loaded it (or * if no package
is active)
The idea of a logical grouping is useful for the purposes of
removing the entire package later. So the /unload command allows
you to remove a package that was constructed as above.
The idea behind all this is to allow a script, and anything that
it loads, to be easily removed whenever you want. By simply putting
a /package <something> command at the top of a script, then you can
later do /unload <something> and everything that was loaded in that
original script will be removed.
As these commands will surely be used in the future in ways that
are not really easy to describe now, you should be careful to not
pass more than one argument to /package or /unload. Even though
multiple arguments may be recognized now, for forwards compatability,
you should not get in the habit of doing that.
*** News 12/19/97 -- New built in function $cparse(text)
The $cparse() function returns the given text without modifications
except for the following exceptions:
Any instance of will be replaced with ^C codes to change the
text to text to background to
---------------------------------------------------------------------
%k %K %0 black bold black black
%r %R %1 red bold red red
%g %G %2 green bold green green
%y %Y %3 yellow bold yellow yellow
%b %B %4 blue bold blue blue
%m %M %5 magenta bold magenta magenta
%p %P magenta (think: purple)
%c %C %6 cyan bold cyan cyan
%w %W %7 white bold white white
%F Flashing attribute turned on
%n All colors turned off
%N Don't put a clear-color tag at the of output
%% A single %
Of course, you need to have /set control_c_color on to see the
colors, so this is an easy way for a script to be color-aware
while not forcibly imposing colors on an unwilling user. ;-)
*** News 12/19/97 -- Built in functios $winnum() and $winnam() extended
They can now take a window description (eg, a window name or a
window refnum) as an optional argument, and will return the info
for that window, if it exists. As always, with no arguments it
still defaults to the current window.
*** News 12/18/97 -- New /window command, /WINDOW QUERY
This allows you to set the query nicknames for any window that
you can specify. The /query command now uses it.
*** News 12/18/97 -- New attribute, Blinking
This is a new character attribute, just like underline and bold
and reverse. Not all terminal emulations will support it, but
the linux and freebsd consoles do. By default, the blink key
is ^F (think of flashing), and you can input that by /bind'ing
something to BLINK. You can turn it off with /set blink_video off
*** News 12/16/97 -- New script: "man"
After you do /load man, you will have available a "man" alias
that will search all of the subdirectores if the man-style help
pages for the topic youre looking for. It handles multiple
sections ok. Try /man away to get an idea.
*** News 12/16/97 -- New argument passed to /on join.
A fourth argument is now passed to /on join. Here is a summary of
the the arguments to /on join.
$0 Nickname of who joined
$1 Channel that was joined
$2 Userhost of who joined
$3 Zero more of the strings (+o) or (+v)
(only on avalon 2.9 servers)
-- (+o), if present, is always $3.
-- (+v) can be either $3 or $4.
*** News 12/16/97 -- New argument to /help, -WAIT
If you do /help -wait, then it will not return until the help system
has finished whatever its doing. If the user is not currently doing
/help, it will return immediately.
*** News 12/16/97 -- New argument to /xecho, -NOLOG
The -NOLOG argument to /xecho inhibits the current output line from
being logged, either at the /set log level or the /window log level.
Im not sure why you would want to do this, but Kasi asked for it.
*** News 12/15/97 -- New built in function, $leftpc()
This function returns the LONGEST string of "text" that contains
"N" printable characters, where "N" is the first argument to the
function and everything else is text. For example:
$leftpc(10 onetwothre$chr(27)[34mefour)
return
onetwothree<blue attribute>
Note that any non-printable characters that appear after the N'th
character *will* be included in the output. This is intentional.
*** News 12/11/97 -- New built in function, $rigmask()
This works just like $igmask, but in reverse. You provide it
a nick!user@host pattern, and it returns to you all the ignores
that would be triggered by that pattern.
*** News 12/05/97 -- Ten new meta keybindings, META10 through META19
You now have 19 meta keys to work with. The client attempts as
much as possible to conserve space, so this isnt a RAM buster.
If you dont use the new meta maps, the only space reserved for them
will be a NULL pointer. ;-) Meta4 is still sticky.
*** News 12/03/97 -- New flood protection, change to /ON FLOOD
On flood now takes one more argument:
$0 The person doing the flood
$1 The type of flood theyre doing
$2 The channel (if any) theyre flooding on (NEW!)
$3- The text of the flood.
*** News 12/02/97 -- New flags to /CLEAR and /UNCLEAR
They are -HIDDEN which clears or unclears all the hidden windows,
and -VISIBLE for all of the visible windows. Theyre mutually
exclusive. The last one used prevails. Use -ALL if you want all
windows to be adjusted.
*** News 12/01/97 -- New built in command, /UNCLEAR
This command works just like /CLEAR, except it nails the bottom of
your scrollback display onto the bottom of the screen (or as low as
possible if you dont have a full screen of display yet)
*** News 12/01/97 -- New built in function, $msar()
This is a "multiply substituting" $sar(). You give it any number
of delimited patterns, and it will substitute all of the patterns
on the text. Of course, the obvious limitation is that the text
may not contain the delimiter character.
*** News 11/27/97 -- New built in function, $randread() (srfrog)
Given a filename, this returns a random line from that file.
Yes, it does ~ completion...
*** News 11/25/97 -- New built in function, $igmask()
You give it a pattern, it returns all of the ignore patterns that
are matched by the pattern.
*** News 11/20/97 -- New flag to /timer, -WINDOW <windesc>
This flag will allow you to specify that the timer should go off
in the specified window. Please note that the limiations about
timers that go off in hidden windows still applies. Use this flag
with caution until the problem with timers in hidden windows is
addressed.
*** News 11/20/97 -- Changes to /dcc close
You may now use the words "-all" or "*" to indicate that all of the
dcc's of a given type or dcc's to a given nick should be closed.
For example:
To close all of the dcc's you have open to "foobar",
/dcc close * foobar
To close all of the dcc chat's you have open to anyone,
/dcc close chat *
*** News 11/19/97 -- New built in function, $count()
This function returns the number of times (possibly overlapping)
that a given string appears in some text. For example:
$count(. one.two.three) returns 2.
$count(ll llll) returns 3 (think about it).
*** News 11/12/97 -- New /ON, /ON DCC_OFFER
This hook is activated whenever you make an OUTBOUND DCC OFFER.
(Kind of the complement to /on dcc_request).
Presently, it has exactly two arguments:
$0 is the person to whom you are offering the dcc,
$1 is the type of dcc you are offering.
It is possible that more args could be added in the future on request.
*** News 11/11/97 -- New /SET, /SET STATUS_TRUNCATE_RHS **** RECALLED *****
This set determines which side of the %> in your status bar should be
truncated if the status bar is wider than the screen. If this is set
to ON, then the right hand side of the %> will be truncated back to
80 characters. If this is set to OFF, then the left hand side of the
%> will be truncated so as to allow everything to the right of %> to
be kept.
***** This feature is non-operative due to some *****
***** serious problems. It will remain *****
***** non-operative until such time it is fixed *****
*** News 11/10/97 -- New script, "pipe"
This script implements the $pipe() function, which demonstrates how
you can use /on exec to capture the stdout of an exec'd command and
return it from a function (essentially acting as a pipe or a backtick
type operation). It may not be universally useful as-is. Feel free
to tweak it to your taste.
*** News 11/07/97 -- Improvements to /ON
As part of a larger re-organization of the /on command, three noticible
changes to the semantics of /ON have been made:
1) The @ and # "server-specific" qualifiers have been withdrawn.
If you used this feature, and desperately need to retain it, let
me know and ill work something out with you. I did not reimplement
them on the understanding that nobody would miss them.
2) Doing /on ^type ^"nick" now works as you would expect, that is to
say, it really does nothing, and it would suppress the default
behavior. This is a lower-cost way to do /on ^type "nick" #.
3) You may now do /ON SEND ("send" is just an exmaple, this works for
any hook) to see all of the hooks for types that begin with "send".
Previously, it was impossible to get a listing of more than one
hook type at a time.
*** News 11/05/97 -- Improvements to /TIMER
/TIMER now attempts to keep track of what the current server and
current window were when the timer was registered, and will revert
back to that window/server when the timer expires. This should prove
to be much more intuitive.
*** News 10/28/97 -- New flag to /xecho, /XECHO -R
This flag dumps a raw string to your terminal emulator. It is
imperative to notice that the client does *no interpretation* of the
string. It is dumped right to your terminal by the /xecho command,
so it never gets backed by your window/screen. That means you should
really only use this to output strings that act as a state-change
command to your terminal (eg, setting the xterm title bar, or doing
an unflash.) If you output "modifying" codes (like setting colors or
attributes), it wont get to your window display and will be lost on
the next window redraw.
*** News 10/27/97 -- New /set, /SET NO_FAIL_DISCONNECT (ON|OFF) (nuke)
When this is set to ON, the client will NOT automatically terminate
your connection to the server if a write() fails. This is most useful
for nuke and other people who have static ip's connected to routers
that retain packets while you are disconnected. The default is OFF,
since for most people, a write() failure is a fatal condition.
*** News 10/26/97 -- New built in commands, "break", "continue", "return"
These built in commands are used for controlling the flow of code
execution. They work 99% like they would in C. When youre in a
"while" or "for" loop, the "continue" command will immediately
terminate the current loop and go back to the top (the 'for' command
will run the 'iteration' part as it does in C). When you do a
"break" command in "while" or "for", it immediately terminates the
loop entirely and moves to the next command after the "while" or "for".
The "return" command is used to immediately terminate execution of
an alias or on-event. If an argument is specified, it is assigned to
the local variable FUNCTION_RETURN. Those of you who use the old
"return" alias that just assigns to function_return will find that it
still works, but it wont terminate the execution of the current alias
or on (eg, you wont notice any changes.) Youre encouraged to take
advantage of the new functionality. =)
*** News 10/26/97 -- "FUNCTION_RETURN" now a normal local variable.
When you make a function call, the "function_return" variable is now
instantiated as a regular local variable. Previously, the
function_return variable was trapped for special treatment and was
a write-only value. Now it is a read/write variable, so you can use
it just like any other variable. The one exception to this is that
you may assign to FUNCTION_RETURN in aliases that are called from the
function that instantiated them (as opposed to other local variables
which are not honored in called aliases.) This was done out of
neccesity to be compatable with scripts that presume that you may
assign to FUNCTION_RETURN and it will carry to the closest enclosing
function call. Since FUNCTION_RETURN is stored on the calling stack,
the arbitrary limit of 128 nested function calls no longer exists.
*** News 10/25/97 -- New Status bar expando -- %K
This expando will be displayed on the status bar if you are currently
in scrollback mode in that window. Should be good for people who
forget. ;-) What it actually displays is controlled by a set,
/set status_scrollback. The default is "(Scroll)"
*** News 10/20/97 -- Greatly reduced CPU usage in pre0.30
Some profiling work showed some really monsterous CPU hogs. With
a few minor, yet strategic changes, CPU usage for the testers has
been reduced from 60% to 90% compared to pre0.28. (ive seen cpu usage
under 2:00 a day for someone on 10 channels running with all usermodes
active running clonebot-detection scripts.)
*** News 10/20/97 -- New built in functions, $regcomp(), $regmatch(), etc.
There are four new built in functions that give you an interface
to the posix.2 "regex" pattern matching functionality:
$regcomp(<pattern>)
given a regex pattern, it will return a printable string
representation of the compiled pattern. You must later pass
the return value of this function to $regfree() to avoid
memory leaks. The pattern is assumed to be case insensitive,
and cannot make use of any \(...\) subexpressions.
$regexec(<compiled> <string>)
given a compiled regular expression and some text, it will
return 0 if the string is matched by the compiled pattern,
or will return nonzero on error. The return code can be
passed to $regerror() for specific information. Of note,
the return value '1' means the pattern didnt match.
$regerror(<error code> <compiled>)
given an error code and the compiled regular expression from
which it was generated, this gives you a human readable error
message. If the error was from $regcomp(), then you can pass
the error code "-1", which will then be subtituted with the
last $regcomp() error code. Otherwise, error code should be
the return value from $regexec().
$regfree(<compiled>)
given a compiled regular expression, this returns any resources
that were used by the regular expression. If you fail to
$regfree() everything you $regcomp(), then you will expose a
memory leak, and that wont be my fault. ;-) You must not use
a compiled regular expression after you have called $regfree()
on it. To do so will result in chaos.
*** News 10/20/97 -- New command line flag, -B
This does what the stock client's -b flag does. It loads your .ircrc
file right at client startup time rather than waiting for the client
to connect to a server.
*** News 10/20/97 -- New math operators << and >>.
These are the left-bitshift and right-bitshift operators. Currently
they are only available in their binary forms. There is no support
for <<= and >>=, as support for that would be problematic. Since you
can just do the longhand assignment, their ommision is not a big deal.
*** News 10/16/97 -- New built in functions, $fnexist(), $cexist()
These two functions return 1 if the given built in function, or
the given built in command, exist. It returns 0 if they do not
exist. The idea use for these is to provide an alias or function
that emulates the built in function/command youre looking for, if
theyre absent (as in older versions). Of course, this is more of
a forward looking feature, as it wont help you on older releases. =)
*** News 10/15/97 -- New /set, /SET STATUS_DOES_EXPANDOS (ON|OFF)
This /set controls whether or not any expandos (eg, $vars or $func()s)
in the status line should be expanded or left alone. Please note that
this option is *very expensive*, and so you should not turn it on
unless you really do have expandoes in the status_format, and you
really shouldnt put expandoes in the status_format if you can possibly
get away with it. ;-)
*** News 10/15/97 -- New built in function, $currchans(server)
If you specify an argument, this function will return quoted words
containing a server refnum and a channel name. The channels to be
returned are channels that are currently considered to be "current
channels" for some window that is connected to the specified server.
If you specify a server of -1, then $lastserver() is assumed. If you
specify no arguments, then all current channels will be returned.
It is expected that this will be useful to determine if a given
channel on a given server is a current channel on *any* window.
The return value of this function uses double quotes, so it is
suitable for use in /fe, or to pass to $rmatch(). Just remember to
glob against "* #chan" (with the quotes!) for any server.
*** News 10/15/97 -- Change to /window (Colten)
If you specify a window refnum where /WINDOW excepts to find a command,
then that window will be used as the target window for any further
commands, *but*, that window will not be made the current window (as
it would if you had used REFNUM <refnum>). This is useful for
changing an attribute for a specific window but you dont want the
current window to change. eg:
/window 2 double on
*** News 10/15/97 -- Change to $myservers() (Colten)
If you pass any argument to $myservers(), then a list of refnums to
open servers will be returned. The existing behavior of returning a
list of NAMES to open servers is retained if you pass no arguments.
*** News 10/15/97 -- New built in function, $isconnected(refnum) (Colten)
This function returns 1 if the specified server is currently connected
(eg, you have been successfully registered). If refnum is -1, then
from_server is assumed.
*** News 10/08/97 -- New /window command, /WINDOW SCRATCH (ON|OFF)
This allows you to designate a window as being a "scratch" window.
A 'scratch' window is one that allows direct addressing, and it does
not scroll. The support *just barely works*. That means if you
do anything i didnt expect, you probably will crash the client.
Let me know if you find any ways to confuse this so i can fix them.
To send text to a given line on a scratch window, use /xecho with
the -line flag:
/xecho -window <scratch refnum> -line <line number> text
/XECHO -LINE will whine at you if:
* If the window you specify is not a scratch window.
* You dont specify -window before you specify -line.
* If the line number you specify is out of range for the window.
Suggestions/observations:
* Scratch windows dont deal with being resized very gracefully.
I suggest you do /WINDOW NEW SCRATCH ON FIXED ON so that it cant be
resized on you. You should assume (at this time) that if the window
gets resized, the contents are *undefined*. That will probably be
improved in the future.
* Scratch windows probably should not be attached to servers. Use
/WINDOW NOSERV to make sure they are unbound.
* There is NO SCROLLBACK on scratch windows. When you overwrite a
line, it is gone forever.
* If you "unscratch" a window, then it is implicitly /CLEARed.
This to ensure that the status of the window after being returned
to normal will be coherent. The previous contents of the window
will be retained in the scrollback buffer.
* If you do a normal /echo to a scratch window, it will use the line
below the most previously output line. When you reach the bottom
of the window, it will go back to the top.
*** News 10/08/97 -- New /window command, /WINDOW NOSERV
This allows you to specify that a window is not to be bound to any
specified server. That means the window will NEVER recieve output
from any qualified server event, unless you specifically use /xecho
to redirect output to that window.
*** News 10/01/97 -- IMPORTANT! SEMANTIC CHANGES! IMPORTANT!
The $winchan() functions and $chanwin() functions have been reversed.
That is to say, $winchan() now takes a WINDOW REFNUM argument, and
$chanwin() takes a CHANNEL NAME argument. This is the reverse of
what it has been before, and the change was done in order to keep the
semantics of built in functions coherent (eg, $chan*() functions
always take a channel name, and $win*() functions always take a window
refnum. A /set has been provided to let you have the old semantics.
*** BUT PLEASE MAKE A PLAN TO CONVERT YOUR CODE TO THE ***
*** NEW SEMANTICS. PLEASE PLEASE PLEASE. ***
To let you know if the new semantics or old semantics are in effect,
the new $info command, ``$info(w)'' command will return 1. So add
something like this in your script to get compatability:
if (info(w) == 1) { set winchan_hack ON }
IMPORTANT!!!
The value of $info(w) will change to 2 (two) when this hack has been
phased out in some future version. *** PROGRAM DEFENSIVELY. *** Plan
to do something reasonable if $info(w) returns a value of 2. (This
means that the above /set is not available, and the new semantics are
irrevokably in place.) I promise that the old semantics will not be
irrevokably phased out before EPIC4pre5, and that the old semantics
will most likely be phased out at the time of the production release
(EPIC4.000) Please plan ahead for this.
If all of this ends up being unreasonably complicated or a burden,
then let me know, and i'll work something out with you.
*** News 10/01/97 -- New /set, /SET WINCHAN_HACK
This is a *temporary* feature to help ease the transition for those
who have a substantial amount of code that depends on the semantics
of $winchan() being "backwards" (eg, that it takes a channel argument
rather than a window argument). When this is turned on, $winchan()
and $chanwin() will have their "traditional", or "reverse" semantics.
When this is turned off, they will have their "modern", or "correct"
semantics. THIS SHOULD NEVER BE TURNED ON UNLESS YOU REALLY NEED IT.
Please do NOT write new code with the old semantics, it will only
encourage the broken semantics.
*** News 09/26/97 -- New /on, /ON REDIRECT
This hooks any time something is about to be redirected to someone.
If you hook this silently, the redirect will be suppressed. This
would then be useful to filter out stuff that you might not want
to have redirected.
$0 - the target to whom the text is about to be sent
$1- - the text itself.
*** News 09/20/97 -- New function $servernick()
You give it a server refnum, it gives you your current nickname
on that server. This function has been around a while, it just
never got documented.
*** News 09/20/97 -- #define CONTROL_C_COLOR now in $info(o)
It is represented by the letter 'c'.
*** News 09/20/97 -- New built in function $chanwin() <THIS HAS BEEN CHANGED>
This is the reverse of $winchan(). You give it a window refnum or
name, and it gives you the current channel (if any) for that window.
*** News 09/20/97 -- New built in function, $winnicklist() (Colten)
You pass it either a window refnum or a window name, and it returns
the nicks that are currently on the "nick list" for that window.
(See the help for /window add for info about the nick list). If
you dont specify any arguments, the current window is presumed.
*** News 09/20/97 -- New /set, /SET NO_CONTROL_LOG (Peter Evans)
When this is /set to on, the client will not output any nonprintable,
nonspace characters to the log file. When off, it will have the old
behavior (dumping everything right to the log as it appears on the
screen.)
*** News 09/20/97 -- New /on, /ON WINDOW_CREATE
When a window is created with /on window, then this new hook will
be activated. You may assume that any "window" commands that you
specify in the body will work for the window being created. This
is intended for setting "defaults" for windows, like so:
/on window_create * window double on
*** News 09/18/97 -- Comprimise for /SET STATUS_MAIL
Because there has been some controversy over the inability to "get
rid of that damned colon" for %M in /set status_mail, i have agreed
to take it out. However, for those of us who like to have
/set mail 1, we wont be left with a "(Mail: )". There is a new
script called 'setmail", that traps /set mail, and offers two new
/set's, /set mail_format1, and /set mail_format2, for controlling
how the mail should look like when /set mail 1 and /set mail 2
is engaged (respectively.) I would just suggest that you load it
in your .ircrc (before you /set mail) and see what i mean.
*** News 09/18/97 -- New error tracking feature
If an error occurs while you are loading a script, then the client
will tell you about where the error occured. I say "about", because
the client doesnt actually try to run /load'ed commands until it
reaches the next valid command, so the command that is in error is
always the first one BEFORE the line stated. As well, when you
attempt to /assign to an invalid variable, it will tell you what the
invalid variable name was, so you can hunt it down.
*** News 09/16/97 -- New /set, /SET STATUS_NICK (|Rain|)
This is a control for how your nickname will appear in the status
bar. Following convention, you may use %N in the /set to determine
where the nick should be placed. The default is just %N by itself,
which yeilds the traditional behavior.
*** News 09/11/97 -- New function $nohighlight()
This function will take any arbitrary input and will convert all of
the highlight characters (^B, ^V, ^_, ^O, ^C, and ^[) to a "printable"
format (in reverse). This allows operators to find hidden attributes
in channel names that would otherwise be invisibly stripped.
*** News 09/10/97 -- New function, $deuhc() (Peter Evans)
This function will remove "*!" or "*!*@" from the front of the
specified pattern, if it is present.
*** News 09/09/97 -- New /window argument, /WINDOW SKIP (ON|OFF)
You may now mark that a window should be 'skipped' when you are
moving to the NEXT_WINDOW or PREVIOUS_WINDOW. The only way to
"land" on that window then is to use /WINDOW GOTO or such. This
was intended to be used for windows that are not to recieve input,
such as your OpView window.
*** News 09/09/97 -- New command, /SHOOK <type> <args>
This is a hokey name, i admit. Anyone got a better name for it?
This function allows you to arbitrarily synthesize /on events with
your own arguments. This is intended to retro-fit new problems onto
old solutions. For example, you could do:
/on ^public "% &KILLS Received kill message *" {
shook KILL $2-
}
or something like that, to make your normal /on kill handlers to be
executed while youre on an ef2.9 server. Or so is the idea. Let
me know what you think of this, and if its broken, say so.
**** BE WARNED ****
Code in on hooks that depend on side effects (like $userhost()
being set) will be *utterly confused* by these synthetic events, and
will probably get wildly incorrect results. You yourself are
responsible for making sure that this doesnt happen to you!
*** News 09/09/97 -- New /window argument, /WINDOW FIXED (ON|OFF)
You may now "fix" a window as being a given size. When a window is
"fixed", it will never be shrunk or grown when you shrink or grow
another window, and it is immune to /window balance. You can still
directly shrink or grow a fixed window. The only exception to this
is if all windows on a screen are fixed, and the screen is resized,
the bottom window of the screen will be forcibly resized, although it
would still be "fixed". This was all done so that the OpView window
can be set to 4 lines and it will stay that way unless you explicitly
change it.
*** News 09/09/97 -- New /set, /SET BANNER_EXPAND
If this is set to ON, then the contents of /SET BANNER will be
expanded ($-substitution will occur) before it is used. If it is
OFF, then the value of /SET BANNER is used literally.
*** News 09/05/97 -- Changes to how windows are resized
When you resize your display, then the proportion of window sizes
between the non-fixed windows will be retained. That is to say,
if you had two windows, sizes X and 2X, and you change the screen
so that the first window has size Y, then the second window will have
about size 2Y. When you rebalance your windows (with /window balance),
all the nonfixed windows will be set to approx. the same size.
Fixed windows will not be touched.
*** News 09/05/97 -- Now friendlier with job control
If you want to suspend the client but are worried about it pinging
out, you should be able 'bg' the client now, and it wont stop due
to (tty output) or mangle your screen. You will need to stop the
client (with 'kill -STOP %1') before you 'fg' it again, or the client
wont accept input. This is not a bug, this is a job control problem.
This should satisfy anyone who still pines for 'ircserv' ;-)
*** News 09/04/97 -- New /on, /ON DCC_LIST
Many people have asked for an easy way to reformat the DCC output.
So this new on will output the 8 most interesting capabilities.
Im open to adding new ones, just let me know. The 'banner' of the
list is output with $0 being "Start" and the rest of the fields being
filler.
$0 - The type of DCC connection
$1 - "1" if encryption is on, "0" if its not (future exp)
$2 - Nickname of the peer
$3 - Status of connection
$4 - $time() when connection established, 0 if not connected.
$5 - Size of the file transfer, 0 if not applicable
$6 - Number of bytes transfered, 0 if not connected
$7 - Description field (usually the full filename)
*** News 09/04/97 -- Some new behavior for your display
A lot of the code that handles your display has been rewritten.
The most important changes are: When you scroll backwards, you will
get the lines that actually appeared on your screen, not the lines in
your lastlog. Those lines are output at the width they were split
for, and if your screen is a different size, they wont be re-split.
This is not a bug. Do not report it as a bug. When you are in
scroll mode, the screen will not automatically scroll for you if
the display reaches the end of the screen. Instead, that stuff is
put into the hold buffer. You can use the SCROLL_FORWARD key to go
forward a page *even into the hold buffer*, and all new output will
appear as long as that output doesnt make the screen scroll. Use the
SCROLL_END key to go back to the "normal" scrolling behavior.
You cannot turn HOLD_MODE off if youre in scrollback mode.
*** News 08/27/97 -- New /set, /SET CLOCK_FORMAT
This /set, if set, controls how the client should represent the
current time on your status bar, among other things. Rather than
have the representation be hardcoded in the client, this will give
you the flexiblity to have the time displayed just however you want.
By default, this /set comes UNSET. When this is unset, the more
traditional behavior of /set clock_24hour determines how the time
should appear. If you /set clock_format, it *overrides* the setting
of /set clock_24hour.
*** News 08/25/97 -- New built in functions, $substr() and $rsubstr()
These functions allow you to look for a string inside of another
string. It takes two or more arguments, with the first argument
being the string to look for (use double quotes if it has spaces
in it) and the rest of the arguments being the words to look in.
(You dont need quotes for this arg.) It returns -1 if the string
could not be found, or returns the offset (counting by zero) where
the string may be found in the source. $rsubstr() looks backwards
from the end of the string rather than from the front.
*** News 08/22/97 -- New flag to /XECHO, -B
The /XECHO -B flag instructs the client to prepend the current value
of BANNER_VAR before the line to be output. This allows you to output
something with a banner without having to worry about BANNER_VAR. If
you have have /set show_numerics ON and the hook happens to be a
numeric hook, then the numeric will be output.
*** News 08/20/97 -- Limits on /echo now removed
There have always been limitations to the size of lines being handled
for display. Recent limits have been 2048 characters or 40 lines to
the screen, and 20480 characters to the lastlog or to a log file.
All of these limitations have now been eliminated, and any size line
(within the confines of available memory) can be handled without
excuses.
*** News 08/19/97 -- Handling of ^C colors, new set, /SET CONTROL_C_COLORS
^C colors (eg, ``mIRC colors'') are now handled in the output stream.
Whether or not anything is done with them is controlled by a compile
time option (which is further controlled by a /set). If you #define
CONTROL_C_COLORS, in config.h and you /set CONTROL_C_COLORS ON, then
they will be parsed and converted into colors. If you #undef it,
then the value of the /set will not matter, colors will never be
honored. Sorry, but the "old" behavior of leaving them unchanged in
the output stream is no longer available. You either must honor them
or you must have them filtered out. (I doubt anyone will have a
problem with this.)
By default, the #define is #undef'd, and the /set is turned off.
The defaults will never change in future releases unless there
is overwhelming public pressure to change them.
*** News 08/17/97 -- New operator, #~ (prepend operator)
This is similar to the #= operator, which appends text to a variable.
This operator PREPENDS text to a given variable.
*** News 08/17/97 -- New flag for /timer, -REPEAT
The /timer -REPEAT flag takes one argument, which is given to be
the number of times that the specified action should be repeated
(every specified interval). The /timer -LIST flag reflects the
number of events left to be scheduled.
*** News 08/17/97 -- New script, "MOTD"
This script re-implements client-side MOTD files. It uses the two
below functions. Its only provided for those of you who miss this
feature.
*** News 08/15/97 -- New function $ftime()
This function returns to you the "mtime" of a given file (see stat(2))
In ordinary words, this was the last time that the file was modified.
It is the time that you see for an ordinary "ls -l" listing. It is
returned in seconds since the epoch, so youll need to $strftime() or
$ctime() to convert it to human format.
*** News 08/15/97 -- New function $irclib()
This function is only useful if you need to know where the IRCLIB
is. An example of its use is the "motd" script.
*** News 08/15/97 -- New function, $winbound()
This function takes one argument. If the argument specified is the
name or refnum of a window, then the name of the channel bound to that
window (if any) is the return value. If the argument specified is
the name of a channel, then the window refnum to which it is bound
(if any) is the return value. In case of ambiguity (if you have a
window name that looks like a channel name), the window takes
precedence over the channel.
*** News 08/08/97 -- Notify can now do userhost lookups automatically
Most people (everybody?) do a /userhost request in their
/on notify_signons, and that has been distressing to many servers,
because when you connect there is a flurry of ISON and USERHOST traffic
and many people have gotten trapped in "flooder mode". Some have
tried, with limited success and much agony, to batch up userhost
requests to help. In the interests of cutting down on client->server
traffic needed for NOTIFY events, the client can now automatically
fetch userhosts on your behalf.
To turn on this feature, /set NOTIFY_USERHOST_AUTOMATIC on. When
this is ON, the client will dispatch userhost queries for everybody
who is 'triggered' for that minute. It does intelligent batching,
so you wont be flooding the server as much. This is ideal for when
you initially connect and your flurry of ISONs and USERHOSTs can
sometimes make the server hate you. If this is OFF, then the
traditional behavior applies as normal.
To accomodate this new feature, /on NOTIFY_SIGNON now takes two
arguments: The new second argument is the userhost of the person
signing on. If you have the automatic userhost feature turned off,
the second argument will be empty.
*** News 08/08/97 -- New /set, /SET XTERM
You may now use this set to specify what "xterm" program you want
to use for /window create. Note that this can be overriden by the
XTERM environment variable. This was done on purpose, so that those
who have been setting the XTERM environment variable wont be suprised
by the /set's "default".
*** News 08/08/97 -- New servcmd support (SQUERY, SERVLIST, WALLCHOP)
The client now natively recognizes the SQUERY, SERVLIST commands
from av2.9 servers, and the WALLCHOP command from u2.10 servers.
I didnt implement WALLCHOP in the same way as contributed, so I
might get yelled at and change the implementation soon. ;-)
*** News 08/08/97 -- Can send multiple files with /dcc send
You may now specify more than one file with /dcc send nick <file>.
I guess thats useful in conjunction with $glob(*) or something.
Each request is sent out in a seperate PRIVMSG (obviously), so
you should be careful not to send out TOO many files at a time...
*** News 08/08/97 -- New /on, /ON KILL
This should simplify a lot of people's lives. When you recieve
one of those messages "*** Notice -- Recieved KILL message for ...",
/ON KILL will be hooked with the following arguments:
$0 - The server who sent the message (your server)
$1 - The hapless victim
$2 - The bastard who did the kill
$3 - The server path to the bastard
$4- - The reason for the kill
*** News 08/04/97 -- New /on, /ON OPER_NOTICE
The server uses "sendto_ops" to send an notice to all operators.
The client now automatically deals with this.
$0 - the server that sent you the notice
$1- - the text of the message AFTER the *** Notice --- part.
*** News 07/28/97 -- New built in function, $uhc()
$uhc() takes a single argument, which is a partially constructed
nick!user@host pattern, and returns a fully qualified nick!user@host
pattern. That is to say, any parts that are missing are filled in.
This is a front end to cut_n_fix_glob(), which is the function that
"fills in" your arguments to /ignore, so this works identically as
the nick!user@host argument to /ignore.
$uhc(nick) returns nick!*@*
$uhc(user@host.com) returns *!user@host
$uhc(*.host.com) returns *!*@*.host.com
*** News 07/28/97 -- New /SET, DO_NOTIFY_IMMEDIATELY
If this is set to ON, then when you do the /notify command, an
ISON will be immediately dispatched (the usual behavior.) But if
this is set to OFF, then the ISON is not immediately performed, and
you will have to wait until the top of the next minute to see if
the person is on. This is intended to be used in your .ircrc,
because some users have a zillion people on notify, and they end up
sending enough lines to the server when they connect that they activate
the server's flood control mechanism, then the server starts slowing
you down, and thats just a big hassle.
*** News 07/28/97 -- New /SET, NOTIFY_INTERVAL
This one is a bit tricky. The value of this set is taken to be
a suggestion about how frequently NOTIFY checks should be performed.
This does not ever make the client check at any time other than the
top of every minute, but it is possible to tweak this variable so
that some minutes will be skipped. For most sane people, setting
this to be a multiple of 60 is advised. Setting this to less than
60 does not make it check more frequently than once a minute.
/set notify_interval 60 yeilds the "customary" behavior
/set notify_interval 120 makes it only check every 2 minutes
/set notify_interval 150 makes it check only twice every 5 mins
at minutes 3 (180s) and 5 (300s).
*** News 07/28/97 -- Two new /SETs, AUTO_REJOIN_DELAY and AUTO_RECONNET_DELAY
These two control the amount of time that must pass between when
you are kicked or killed, and the time that you attempt to rejoin
or reconnect. Reconnect is probably not totaly intuitive, as it
attempts to bind the server to the current window *at the time that
the timer expires*, not the window that was disconnected from.
Arguably, this is a bug, and may be "fixed" in the future. The
implementation for these is kind of hairy.
EPIC4pre1
*** News 06/18/97 -- New feature, "CPU SAVER"
Some of you have asked me for a way to make ircII use less CPU
especially when you are idling and detached. Every minute ircII
sends out your notify list, parses the replies, checks the clock,
updates your status line, and other various housekeeping duties.
But when youre detached, you dont really care if your notifies
dont get processed promptly every 60 seconds, you dont care if
the clock is accurate every moment, and you would prefer that
the client not go to the trouble of wasting CPU time just to
keep track. This wont help if youre on busy channels, or
logging wallops, only if the only traffic youre getting are
the pings from the server.
There are several new sets:
/set CPU_SAVER_AFTER - If you havent typed anything after
this many minutes, CPU saver mode activates.
/set CPU_SAVER_EVERY - If cpu saver mode is on, the client will
only do housekeeping every this many minutes.
If either of these two are 0, then cpu saver mode cannot be
activated, and the "traditional" behavior will apply.
If youre interested in seeing when the client is in cpu saver
mode, there is a new status line expando, "%L". There is also
a new /set, /SET STATUS_CPU_SAVER which determines how the %L
expando will look when it is activated (just like STATUS_MAIL)
There is also a new keybinding, "CPU_SAVER", which if bound to
a key will activate cpu saver mode without having to wait.
I did this on a whim, mostly because i havent done any features
in a long time that have required this many changes, and I wanted
to have some fun, so i just let loose with this and went berzerk
If i forgot some obscure feature with this, let me know! ;-)
*** News 05/31/97 -- New environment variable honored, ``IRC_SERVERS_FILE''
Someone had suggested something close to this -- they wanted a
way to specify a SERVERS_FILE as an absolute path rather than
having it in their irclib directory. So you can now set this
environment variable to an absolute path where you would like the
client to get your server list from. This overrides any
built in SERVERS_FILE setting, if appropriate.
*** News 05/31/97 -- Semantic clarification for /TOPIC
Due to the confusion between the very common ``topic'' alias
and the built in TOPIC command syntax, I have expanded the
built in TOPIC command to do everything that everyone expects
TOPIC to do, towit:
/topic This is a topic (set current channel topic)
/topic * This is a topic (same thing)
/topic (see topic on current chan)
/topic * (same thing.)
/topic #chan This is atopic (set topic on #chan)
I strongly advise you to throw away your /topic alias unless it
does something up and beyond this. If it does, let me know, and
I can include its semantics in the client, if its reasonable.
*** News 05/19/97 -- All new syntax for /IF
As if ircII wasnt becoming PERLish enough, ive modified the
/IF command to be more perl-like: You may now use the
"elsif" modifier to indicate a blocked if command, eg:
if (....) {
....
} elsif (...) {
....
} elsif (...) {
....
} else {
....
}
(The final "else" is optional.) Note that the placement of
the "elsif" and "else" modifiers is critical: They MUST be
on the same line as the closing } to which they modify, or the
/LOAD parser will get totaly confused and munge the whole
thing up. This is a limitation that applies only to how
scripts are loaded -- sorry.
*** News 05/09/97 -- New function added, $findw(word ...text ...)
This addresses the two most common complaints people have
about $[r]match():
1) This function returns the WORD NUMBER of the word
in text, such that $word($findw(word .text.) .text.)
returns "word". It returns -1 if word is not found.
2) This function does not do anything screwy about quoting
or unquoting your input. It just looks for the word,
thats it. No pattern matching, no frills, and its fast.
*** News 05/09/97 -- Semantic weakness closed
There was a semantic weakness with respect to the word count
and strlen modifiers ($#var and $@var) such that if you did
not provide a variable to modify, an unuseful value was returned.
Since this was likely to cause confusion, these cases are now
defined to implicitly assume $* as the default argument. eg:
$# all by itself is now the same as $numwords($*)
$@ all by itself is now the same as $strlen($*)
These are *NOT* built in functions. The # and @ characters
still are considered to be modifiers. The weakness was that
these modifiers did not return meaningful values when a value to
modify was not provided: This change stipulates a useful default.
In a seperate, but related topic, a change was also made to
the math parser to honor this change in that context. That
is to say, @ foo = # now assigns to `foo' the number of
arguments in the current context. NOTE THAT THIS IS NOT A
FUNDAMENTAL CHANGE! We're just saying that the default value
for the # and @ modifiers is $*. This is not a "function"!
*** News 05/05/97 -- New flag to /WINDOW, /WINDOW LASTLOG
/WINDOW LASTLOG lets you individually tweak the size of a
window's lastlog. This was introduced because this used to
be the default beahavior of /set lastlog, but now that /set
lastlog is a global action, we still need a way to do this...
*** News 04/29/97 -- New /set, /SET QUIT_MESSAGE
This will be your default quit message. If you do something
stupid, like unset this completely, the client's version will
be used as the default. Of course, any argument you pass to
/quit or /signoff will override this /set.
*** News 04/29/97 -- New /set, /SET DISPATCH_UNKNOWN_COMMANDS
If you type a command that is not recognized by the client,
and youre one of those people who /never/ mistype a command,
then you can /set this to ON, and the client will dispatch any
otherwise unrecognized commands to the server. Im sure your
server admin will love you if you do this.
*** News 04/29/97 -- New built in function, $winchan() <THIS HAS BEEN CHANGED>
You give it a channel name, and an optional server name
or server refnum, and it tells you what window refnum that
channel belongs to. (Written by IceKarma)
*** News 04/29/97 -- New flag to /lastlog, /lastlog -max
You can use /LASTLOG -MAX to specify the maximum number
of matches you want to display, regardless of any other
flags. The default is no limit. This was written by Sheik.
*** News 04/29/97 -- New functionality to /stack, /stack set
You can now do /STACK (PUSH|POP|LIST) SET just as you can
already with ALIAS/ASSIGN/ON. This was written by Colten.
*** News 04/21/97 -- New set, /SET BANNER
The /SET BANNER variable now controls what special banner will
be prepended to informational messages from the client. Up until
now, the banner has been three stars ("***"), and many people dont
like that or want to be able to change it. Now you can.
*** News 04/21/97 -- New on, /ON SET
/ON SET is a way to extend the capabilities of the /set command.
The /ON SET hook is passed two or more arguments, with
$0 -- is the name of the variable to be set
$1- -- is the value the variable will be set to.
The main idea is the ability to offer /set variables that are
not built into the client, and execute ircII code to handle that
situation. The other idea is the ability to suppliment or override
a built-in set variable when it is changed.
If you hook /ON SET with the "SILENT" modifier ('^'), then the
default action (if any) will not be taken. This may mean that
if the variable is not a built in variable, no error will be
output. If the variable IS a built in variable, then the variable
will NOT be set after the fact.
There are two ways to get around this: You can either hook the
/ON SET with the "quiet" modifier ('-'), or you can use the /set
command inside of the /on set body. If you attempt to /set a
variable that is already being parsed by /on set, you will NOT
be offered the /on again -- it will directly set the variable:
Example:
on ^set "exec_protection off" {
echo *** You cannot set EXEC_PROTECTION off!
set exec_protection on
}
Or:
on ^set "auto_rejoin_delay *" {
echo *** AUTO REJOIN delay set to [$1] seconds.
@ myscript.autorejoin.delay = [$1]
}
Then you could do:
/set auto_rejoin_delay 4
*** News 04/17/97 -- $X now reflects your ``real'' userhost
When you connect to a server, the client asks the
server what your userhost is, and then that value is
reflected in the $X variable. Different server connections
may have different $X values.
*** News 04/17/97 -- Changed semantics for USERHOST command
The userhost command will act the same as always, except
under the following condition:
If you do /userhost <nick(s)> -cmd, and *every* nick so
specified is on one of the channel(s) you are on (so that
the client already has the userhost cached), then the -cmd
code will be executed immediately, and the client will *NOT*
ask the server for the userhost information. You are 100%
guaranteed still to get accurate information, you will just
get it without waiting for the server query! The only caveat
is that the AWAY and OPER fields will be specified with the
false value. If you currently use the /userhost command to
determine if a person is an operator, keep reading.
A new flag has been added to the USERHOST command, -direct.
The -direct flag forces the client to do a server query for
the specified nicknames, even if all of the nicknames are
known to the client beforehand. This can be used to get
accurate AWAY and OPER information. This flag only makes sense
with the -cmd flag, since userhost caching does not happen
unless the -cmd flag is specified.
*** News 04/10/97 -- Two new operators =~ and !~
The two operators are intended to be similar to the perl operators:
The lhs of the operator is expected to be a plaintext string, and
The rhs of the operator is expected to be a wildcard expression.
The operator returns a true value if the pattern matches the text,
and it returns the false value if it does not.
This is intended to be a low-cost alternative to the $match() and
$rmatch() built-in functions when the only thing you need to do is
see if a string is matched by a pattern. If you need to select
from more than one pattern, use $match() or $rmatch().
*** News 04/07/97 -- Asynchronous code may use local variables
You may reference local variables in asynchronous code
provided that you follow the rules that have already been
laid down. See the regress/kill script for more info.
1) You have to use /bless in the asynchronous code in order
to have access to the underlying local variables.
2) You have to use /wait in the synchronous code in order to
make sure the local variables dont go away.
3) Make sure you clean up your own messes. Asynchronous code
lying around, resulting in /bless calls when there is no
context for local variables is not a good thing.
*** News 03/31/97 -- New argument to /WAIT command, ``for''
Yes, ``for'' without a hyphen. This command guarantees that
the code given as the argument is executed synchronously.
That is to say, if the arguments, when executed, sent something
to the server, the command will not return until that request
has been completed (as if a wait had been done.) But if the
code does not send a query to the server, no wait is executed,
and the command returns immediately after the code completes.
You can also mix and match ``wait for'' with regular ``wait''
calls and the client will be able to figure out what to do
without waiting extra more than it needs to.
And as always, using /wait or /wait for and /redirect at the
same time is a bad thing (tm), so dont do it. The result is
undefined behavior (eg, what happens isnt my fault.)
*** News 03/19/97 -- About the new who/ison (and soon userhost) queues.
The client now keeps a FIFO (queue) of who/ison/userhost queries
you make. It is *critically* important that you do not confuse
these queues (due to the nature of these server queries, there is
no way to have any reasonable error recovery).
The following behaviors are forbidden (but the client wont stop
you from doing them)
* Using /ON ^RAW_IRC to wedge the 303, 351, or 315 numerics.
If you do this, the queues wont be properly flushed, anyone
waiting on a proper reply wont be handled, and any further
reqeusts will be thought to be previous queries, and all hell
will break loose.
* Using /QUOTE to launch USERHOST, ISON, or WHO requests..
If you do this, the client will whine at you when it gets
unexpected replies and will eat the information. If you launch
another query before the invalid one finishes, all hell will
break loose.
*** THERE IS NO WAY TO RECOVER IF YOU DO THESE THINGS ***
If youre stupid enough to do it, you get what you deserve.
*** News 03/18/97 -- Expanded syntax for $userhost()
For your convenience, the $userhost() function now takes arguments:
You may specify one or more nicknames as arguments to the $userhost()
function, and the corresponding userhost(s) for the nick(s) specified
will be returned. The string <UNKNOWN>@<UNKNOWN> will be inserted
for any nicknames whose userhost is not known. The nickname(s)
specified *must* be people who are on channels you are also on for
the current server! (See the second caveat)
* Caveat -- Because it can take time for the WHO query to complete
after you join a channel, there is no definite way to know if
$userhost() for a person on your channel will succeed or not.
You should probably be prepared to launch a /USERHOST query in
case of failure. This deficiency may be altered or modified in
the future to block if an otherwise valid request is made while
a WHO query is still pending.
* Caveat -- This function will never be modified to launch a server
query. That means that this function will only ever recognize those
nicknames that are common to channels you are on. If you want to find
the userhost for other users, you should use the /userhost command.
*** News 03/18/97 -- Expanded syntax for /who
For your convenience, the /who command now takes two new arguments:
-line {...} The code inside the braces will be executed for each
line returned by the who query. The arguments are
exactly the same as for the /on who hook, except that
this flag is *guaranteed* to override the default
/on who, and will also *go away* when the current who
query is finished.
-end {...} The code inside the braces will be executed at the
end of the who query, when the 315 numeric is parsed.
The arguments are:
$0 - server queried
$1 - body of the query
This is guaranteed to to override the default /on 315,
and will also go away once the current who query is
completed.
These command bodies will be executed asynchronously, which means
that you must assume that the enclosing code scope will complete
before the code is ever executed (e.g., the same rules as for the
/userhost -cmd flag.) unless you use /wait. You are encouraged
to not use /wait if you can figure a way around it. Code that is
not concerned with being stricly backwards compatable with the
stock client is ***strongly encouraged*** to use these new flags.
Underlying this change is a new re-entrant WHO queue, which allows
you to launch more than one WHO query simultaneously. No longer do
concurrent WHO requests have to wait for previous queries to complete,
and no longer (with the above flags) does the caller need to put the
WHO command in a /stack-/on-/wait wrapper.
*** News 03/17/97 -- /on 312, /on 319 changes
All of the whois numerics: 311, 312, 313, 314, 317, 318, 319
now pass $0 as the server name and $1 as the target of the
whois query. All the rest of the arguments are passed as $2-.
Previously, some of these numerics passed the target as $1,
but not all of them. I changed it this way for consistancy.
*** News 03/17/97 -- New: /ON STATUS_UPDATE and $status()
/ON STATUS_UPDATE is hooked whenever any of the status lines
for any of the visible windows changes **and you are in dumb mode**:
$0 is the refnum for the window whose status line has changed
$1 is the status line in that window that has changed
$2- is the actual status line for that window.
$status() can be used to fetch the current status line for any
visible window. Invisible windows do not have their status lines
updated, so they may be inaccurate. This problem may change in
the future. Pass two arguments:
$0 is the refnum for a window
$1 is the status line
*** News 03/02/97 -- Local variables can now span entire array tree
The syntax:
``local x.y.''
will define all variables in the subarray $x[y][...] to be
implicitly considered local variables. That is to say, the
entire variable tree rooted at $x[y] is local to that scope.
This was requested by a user for compatability with another
client. All local variables that are instantiated in this
manner have the same scope as the explicit declaration above.
*** News 02/18/97 -- New built in variable, /SET CONNECT_TIMEOUT <seconds>
Set this to the number of seconds you want your connect()ions to
block before they time out. Note that this doesnt affect
connect()ions that are already in progress, only those that are
started after you set it. The default is 30.
*** News 01/30/97 -- Expanded syntax for /LOCAL, /STUB
You may now specify more than one name per command: Each name
will be treated independantly of all others. The names must be
seperated by a comma, and ***must not*** have any spaces between
the commas and the names (that is, all of the names must form one
logical word). To declare both "foo" and "bar" as local vars,
/local foo,bar
You can do this to stub more than one alias/assign to the same
file, as well:
/stub foo,bar filename
*** News 01/29/97 -- New command /BLESS
Currently this command ignores its arguments. This may change
in the future, so you should not get in the habit of supplying
arguments to this function, for forwards compatability.
The ''BLESS'' command is used to allow an asynchronous scope to
access the local variables of the underlying synchronous context:
alias foobar {
local myvar $0
userhost $1- -cmd {
bless
echo $myvar -- $0!$3@$4
}
wait
}
Note that the use of 'bless' must be paired with an appropriate
call of ``wait'' in the synchronous context, or this wont work.
*** News 01/27/97 -- New flag for /EXEC, -direct
Syntax:
/EXEC -direct <commands>
This simulates the effect that unsetting the SHELL variable
causes, that is, the command is executed directly, without
invoking a subshell. This is appropriate for those who wish
to execute a command passing untrusted data as an argument:
With this flag, there would be no shell to interpret metacharacters,
thus cutting down on that ability to have an accidental back door.
*** News 01/27/97 -- New command, /SETENV
Syntax:
/SETENV <var-name> <new-val>
Sets the process environment variable <var-name> to the value of
<new-val>. This command is not neccesarily useful, nor is it
always appropriate, but it is provided for completeness. There
are several places in the code that can benefit from the ability
to change environment variables after startup (eg, TZ). It also
allows you to set environment variables for /exec'd processes,
and it is also possible to really foul things up if you mangle
important environment variables such as DISPLAY and so on.
*** News 01/24/97 -- New, /ON ODD_SERVER_STUFF
This is hooked whenever the server sends you something
that the client doesnt recognize. This is usually when
you try to connect to a non ircd server, or you use some
extension that isnt yet supported. You are strongly
encouraged to use this interface to support new features
rather than using /on raw_irc because this hook is only
activated when something unexpected occurs (which is rare),
rather than for every incoming line, as raw_irc does.
$0 is the server that sent it to you, '*' if unknown
$1- is the unrecognized command and its arguments.
*** News 01/22/97 -- /FE, /FOREACH use local variables now
The "control variables" for the /FE and /FOREACH command
now are local variables. They will not disturb global variables,
but they will destroy any local variables you have by the same
name. You dont have to explicitly declare the variables as local,
it is done automatically for you. Note that the normal warnings
for local variables still apply -- dont use any variable name that
is the same as a global variable you might want to use later in
the same alias/on.
*** News 01/18/97 -- Support for local variables
You may define a local variable with the following command:
LOCAL <varname> [<value>]
It mirrors the ASSIGN command. Note that local variables act
in exactly the same way as normal variables, except you cannot
get rid of them. You also do not (yet) have any way to get at
a global variable that has the same name as a local variable, so
choose wisely. An example:
alias foobar
{
local b (declare LOCAL var $b as [])
assign a 4 (assigns 4 to GLOBAL $a)
local a 5 (assigns 5 to LOCAL $a)
eval echo $a (outputs '5' -- local)
@ a = [] (clears LOCAL variable)
eval echo $a (outputs '' -- local)
}
Restrictions:
* You cannot have local aliases -- only local variables
* You cannot save local variables.
* You cannot (yet) access a global variable with the same name
as a local variable.
This support is EXPERIMENTAL and still has some development to go
before it is mature.
[[ Additional note ]]
People are apparantly looking in here to see where some of the features
(like translation tables) went to. Please refer to "doc/missing" before
reporting a removed feature as a bug. Thanks.
EPIC3.003 [[MORE BY DEMAND]]
*** News 12/30/96 -- Support for all 26 possible user modes
All user modes are now supported. This should be the last
of it until someone comes up with the bright idea of making
uppercase modes mean different things (and ill strangle the
bastard who does...) I based it on the idea from sheik, but
i took a quite different approach...
*** News 12/27/96 -- New built in command /repeat
Up until now, /repeat has been an alias. This has been a pain
in the butt, because all of them either cant be used recursively,
or theyre terribly expensive to use (or both). So now you have
a zero-overhead /repeat command that can be used without any
headaches.
There are two forms. The old one you all know and love, and a new
form that allows you to specify an expression in parens:
/repeat text command(s) (traditional form)
/repeat (exp) command(s) (new form)
eg, the following two commands are equivalent:
/repeat $var {commands}
/repeat (var) {commands)
*** News 12/12/96 -- New command, /input_char
/input_char is identical to /input, except that it returns after
only one character has been pressed, instead of waiting for the
return key to be pressed. See the 'less' script for an example.
/input_char has problems with /wait and /pause just like /input.
*** News 12/12/96 -- New command, /pause <X>
If you specify an argument, the client will wait X seconds
before continuing. Its kind of a mix between /wait and /sleep,
except that this is nonblocking (unlike sleep) and doesnt send
anything to the server (unlike wait). It also doesnt assure
that you wont have any race conditions (unlikes wait) and it
will parse all incoming traffic normally (unlike sleep).
If no argument is specfied, the client will wait for the user
to press a key. This kind of sort of works, but not really so
much as i would recommend you use it unless you do so as an
experiment as to whether it really works in the real world.
Maybe if you find bugs youll tell me about it? >;-)
/pause does recursive calls to io() (much like /wait does).
That means that it has problems if you intermix calls to /input
while you are /pause'd, and vice versa. Let the coder beware.
*** News 12/12/96 -- New /window option, "BEEP_ALWAYS"
This option allows you to control whether a beep in a hidden
window will still beep. (Up until now, it has not.) If this
is ON, then a beep in a hidden window will beep anyhow. If
this is OFF, then a beep in a hidden window will be silent.
*** News 12/12/96 -- /ON DCC_CONNECT/DCC_REQUEST changed
Arguments to /ON DCC_REQUEST are now:
$0 Nickname of other peer
$1 The type of DCC
$2 Filename or other information
$3 The remote IP
$4 The remote port
$5 Filename (DCC SEND only)
$6 File Size (DCC SEND only)
Arguments to /ON DCC_CONNECT are now:
$0 Nickname of the other peer
$1 The type of DCC
$2 The remote IP
$3 The remote port
$4 Filename (DCC SEND only)
$5 File Size (DCC SEND only)
*** News 12/10/96 -- Virtual Hostname support
The IRCHOST environment variable, and the /hostname (/irchost)
commands reflect this new support. Supposedly it works on
feeding, so i guess its ok. (thanks to flarp)
*** News 12/09/96 -- Double line status bar
/window double and its attendant features have been added.
You can thank Archon for doing all the work =)
*** News 12/06/96 -- New status line variable
You can now use %= in your status format to denote when
you are a channel voice (+v). It only goes on when you are
+v but not also +o. (Crowman)
*** News 11/25/96 -- New Built in function $winvisible()
Archon pestered me enough to put this in that i did so that
he would leave me alone. ;-)
It takes one argument, a reference to a window.
The return value is:
1 if window exists and is visible
0 if window exists and is hidden
-1 if the window does not exist (error)
EPIC3.002 [[MINOR RELEASE]]
*** News 10/29/96 -- New functionality to /timer
You may now specify any arbitrary string (up to 10 characters)
as the refnum for /timer. Example:
/timer -refnum foobar 10 echo booya booya booya boo!
*** News 10/28/96 -- New script ``fake-dcc''
I wrote a new script to demonstrate the two features below.
It allows the client to (at random) substitute any word out
of a list for the word ``DCC'' in a DCC handshake. The
reciever, if they have the same list of words, will then be
able to decode it using this script.
*** News 10/28/96 -- New /on, /ON SEND_TO_SERVER
Any time anything is sent to a server, this will be hooked. It
takes three (or more) arguments:
$0 - the server refnum
$1 - the unix filedescriptor
$2- - what is being sent
Note that using this /on is very expensive -- expensive along the
same lines as /on raw_irc. So please use with discernment.
If you hook this SILENTLY, you will inhibit the sending of the
message to the server. You can then use /QUOTE to send a new
message. Please note that use of /QUOTE in /ON SEND_TO_SERVER
can cause an infinitely loop that will crash your client if you
are not careful. It is up to you to not do that.
on ^send_to_server "% % % PRIVMSG % :$chr(1)DCC*" {
quote PRIVMSG $4 :$chr(1)$getrandword($fake_dcc) $6-
}
*** News 10/28/96 -- New command, /PRETEND
The pretend command allows you to ``pretend'' that a line has come
from the CURRENT server. Use of this command where the current
server is undefined results in undefined behavior. Use of this
command is expensive and can lead to convoluted scripting. You
(of course) can use it however you wanted, but i had in mind a way
to fake out the client when there is no other way to get around
some client limitation. See the ``fake-dcc'' script for an example
of such a case.
on ^raw_irc "% PRIVMSG % :$chr(1)\\[$fake_dcc\\]*" {
pretend $0 $1 $2 :$chr(1)DCC $4-
}
EPIC3.001 [[FINAL PUBLIC RELEASE]]
*** News 10/12/96 -- Solidified syntax for /SERVER
Now you may use either of the forms:
server:port:password:nick
or server port password nick
for the ``server'' argument(s) to /SERVER. Of course, all fields,
except for the ``server'' field, are optional. If you want to
omit a field, you will have to use the colon-seperated syntax.
*** News 10/11/96 -- New built in function
$uniq(... list of words ...) -- The easiest way to explain this is
that each word in the given list is present at most once in the
return value.
*** News 10/04/96 -- New /set, /SET COMMENT_HACK
Sheik wanted this to become a /set rather than a compile time option.
Just remember to make sure this is the right setting, (It should be
ON usually), or your scripts could get very confused.
*** News 10/04/96 -- New /set, /SET DCC_STORE_PATH
This setting determines what directory you want your incoming dcc's
to be stored into. You must have it set correctly before you
/dcc get, as there's no turning back after that. Twiddles are
expanded, there is no default (puts it into the current directory).
*** News 10/03/96 -- New command, /CALL
The built in command "/CALL" outputs to the display the current
script-level stack trace. These are the commands whose execution
is in progress.
If the client crashes (due to a segmentation or bus fault), the
stack trace will be displayed, as an aid to debugging.
There must be a #define WIND_STACK in config.h (the default).
This will show up as an 'a' in $info(o)
*** News 09/23/96 -- New built-in-functions
Several new built in functions are available:
$chmod([filename|fd] perm) -- given either a filename, or a file
descriptor corresponding to a previously $open()ed file, change the
permissions on that file to 'perm', which is an absolute octal value.
Example: $chmod(foobar 0700). See the man page for 'chmod' for
more information.
$umask(perm) -- specfies the bits that are to be turned OFF when
you next create a file. This affects every file that the client
may create during the same session, including but not limited to
any $open()s, or /save's. The old umask is returned, so you can
restore it later if you want to. See the man page for 'umask'
for more information.
*** News 09/18/96 -- Information about /on send_notice
/on send_notice is triggered any time you send a notice or a notice
is sent on your behalf, unless such triggering would cause an infinite
loop, in that case the /on is NOT triggered. If you want to send a
notice without it ever being triggered, try /quote notice instead.
*** News 09/18/96 -- /set AUTO_REJOIN semantics fixed
It should now rejoin in the CORRECT window instead of the current
window. This should make some people happy. =)
*** News 09/18/96 -- New flag to /XECHO -- "-CURRENT"
/XECHO -CURRENT ..... sends "....." to your current window.
Im not really sure why i told people to use this when it didnt
exist. *cough*.
*** News 09/17/96 -- Change to /WINDOW ADD and /WINDOW DELETE.
James pointed out that you cant /WINDOW ADD a nick that begins
with a caret ('^'), and that a caret is a legal n-char.
Furthermore, /WINDOW REMOVE has existed and is the "normal"
way to remove nicknames from the list. Therefore, you may no
longer remove a nick from the window's "nicklist" by prepending
it with a caret ('^'). You must now use /WINDOW REMOVE to remove
any nicknames. You may now /WINDOW ADD nicks that start with a
caret without any error messages.
*** News 09/16/96 -- New set, /SET DCC_SLIDING_WINDOW <int>
When you are sending a file to any peer, EPIC will send
<int> packets at the initiation and attempt to always keep
<int> packets outstanding. This is a simplistic implementation
of the traditional sliding window algorithm. There is no irc-level
error correction: We depend entirely on TCP to keep everything
straight. This should not be a problem, except over lossy networks,
so you should have this /SET to 1 unless you are willing to take a
gamble! Since packet sizes are 2k, and most OSs have socket sendq's
ranging from 4k to 32k, you may have to tweak this /SET for optimal
efficiency on your system (trial and error).
This should have *NO IMPACT* on the person to whom youre sending
the file, regardless of what client theyre using. If you have any
problems, it is probably a bug -- so please let me know.
*** News 09/16/96 -- Silent change to /WINDOW arguments
At the request of kanan, /WINDOW LEVEL, /WINDOW NOTIFY_LEVEL
and /WINDOW LASTLOG_LEVEL now do not require an argument.
If you do not specify an argument, the current level will
be displayed.
*** News 09/02/96 -- New feature covers up weakness in syntax
There was a semantic ambiguity that allowed the following
construction:
/EVAL (...[$0])
to crash the client due to the $0 not being expanded because
the (...) protects expansion. After conferring with several
people, it appeared that no real reason exists to formally
support aliases that begin with a left-paren. This allows the
use of the left-paren to be semantically bound to something
else, to prevent the above from crashing the client, and so the
paren-set was made as a synonym for the @ construction: So that
means the following two STATEMENTS are equivalent:
@ x = 3
(x = 3)
*** News 08/14/96 -- Two new config.h define's.
#define MIRC_BROKEN_DCC_RESUME turns on mIRC compatable
/DCC RESUME feature. It breaks the protocol, so it does
NOT come #define'd by default -- you must turn it on yourself
explicitly so that you take sole responsibility for it.
This shows up as 'i' in $info(o)
#define USE_DCC_CHECKSUM turns on DCC SEND checksumming.
If not defined, you neither send nor honor file checksums
that are sent from other epic clients.
This shows up as 'v' in $info(o).
*** News 08/08/96 -- Silent change to /on send_(msg|public)
With the changes to the send_text subsystem, if you sent a msg
to multiple targets, it will pass all of the nicks to
/on send_msg and /on send_public. This is in contrast to previously,
where it hooked them once per nick. It is still possible for
both to be hooked with the same message, of course.
*** News 08/07/96 -- CTCP PING now works to microsecond resolution
More or less. The client now sends off second + usecond
information, and then calculates the ping time based on
that when it comes back.
*** News 08/06/96 -- Revamped CTCP support
Several changes have happened to the CTCP support:
If any of these changes cause you a great deal of problems, let
me know, and ill work something out with you. The choices made
here were based upon personal and public discussions i had with
people on the epic mailing list, so your mileage may vary:
* If you have an /encrypt set up for a target, any CTCPs you send
to that person will be encrypted now. This is very useful for
encrypting DCC handshakes. This is in addition to your ability
to send CTCPs over pre-existing DCC CHAT connections.
* Since no known clients allow you to send more than one CTCP per
privmsg, and this (multiple CTCPs per privmsg) is a well known
mechanism for flooding, only the first CTCP that would normally
be "returned" is actually returned. All the rest are ignored.
CTCPs that dont "return" are not limited by this restriction.
The one exception to *this* is DCC. Only one CTCP DCC will be
accepted per privmsg.
* Other internal changes have occured. See the source code for
more information. Most of the support has been rewritten.
Nothing else should have changed from the user point of view.
*** News 08/03/96 -- Added socks support from ircii-2.9
ircII-2.9 has support for the 'socks' firewall library,
and so i took that support and added it at the request
of several people.
*** News 08/02/96 -- Implemented workaround for incompatability
I implemented support for the gratutitous incompatability
brought to you by the efnet 2.9 server in the JOIN command.
It should do the "right thing" now.
*** News 07/31/96 -- Finished work on encrypted CTCPs.
I had started support before for encrypted CTCPs. They should
be fully supported now, and they will be used if possible. Note
that this might be a problem if youre carrying on an /encrypt'd
conversation with a non-EPIC peer and you send CTCPs. They will
be encrypted, and the other peer will probably not know what
to do with them. If anyone has a grave problem with this, let
me know and ill work something out with you.
*** News 07/28/96 -- Striping quotation marks
If you want to $strip() out quotation marks, you have to
quote the quotation mark, so it isnt taken as a word
delimiter. People have been reporting $strip(" ....) not
working correct as a bug, but this is _not_ a bug, because
we need a way to be able to strip out spaces
To strip out spaces: $strip(" " ....)
To strip out quotation marks: $strip(\\" ....)
*** News 07/27/96 -- /FEC now has same semantics as /FE
The syntax as /FEC is now the same as the syntax for /FE.
However, the semantics all remain the same. An example of
what you can now do that you couldnt do before:
fec ($variable) a b c {echo $a $b $c}
*** News 05/14/96 -- $tdiff() no longer leaves trailing space
If you do $tdiff(60), you no longer get that trailing space
that was left behind: This was (IMO) a bug, because $tdiff(59)
did not have any trailing spaces.
*** News 05/14/96 -- Can now do /timer -delete all
If you want to delete all your timers, you can do /timer -delete all
and your timer list will be made very empty.
*** News 05/10/96 -- Made 'make install' less painful
Now when you do 'make install', it will attempt to only install
those things that really need to be installed. Only those things
that are newer then the installed components will actually be copied.
This applies to all the binaries, scripts, and translation tables.
*** News 05/09/96 -- Added $mkdir() at request of CrowMan
He asked why we had $rmdir() but not $mkdir().. and i guess
there wasnt any particular reason. So here it is.
*** News 05/08/96 -- Significant profiling project completed
This marks the end of the second major profiling project
in EPIC's history. Some strategic modifications have been
made in an attempt to reduce the rate at which ircII consumes
CPU time. Note that this does not neccesarily make EPIC
"faster", but rather just makes it less of a hog. Future
performance enahancements may occur on an informal basis.
*** News 05/08/96 -- New $info() command, "O" (crowman)
The "O" command (short for "options") returns a string that is
representative of the compiled-in options for the binary.
*** News 05/04/96 -- New command, /HOSTNAME (demon)
At the request of DemoN, ive added the /HOSTNAME command
that allows those with dynamic/multiple IP addresses to
change the address that DCC should use without having to
restart the client.
*** News 04/28/96 -- Added encryption over dcc send/get/chat
Its very simple. At the end of the command line, just
append a '-encrypt PASSWD' where PASSWD is what you want
the dcc encrypted with. It uses ircII's standard encryption,
so it isnt totaly secure, but its "secure enough" for those
who may be snooping. Dont even *THINK* of giving me a hard
time for implementing this.
--------------------------------------------------------
----- This doesnt work at the time of this release -----
--------------------------------------------------------
*** News 04/25/96 -- Added /server -add
Now you can add a server entry w/o having to connect to it.
Just do /server -add hostname portname password
EPIC3 [[ Hurray! We're done! (yea.... right.) ]]
*** News 04/21/96 -- New Built-in function $glob()
Before i begin, you can turn this off by #undef'fing
INCLUDE_GLOB_FUNCTION in config.h. If your system cant compile
the supplied glob.c, you should #undef NEED_GLOB in config.h.
You'll have to try your luck with your system's glob(). If your
system doesnt have a working glob(), and you cant compile glob.c,
then you must #undef INCLUDE_GLOB_FUNCTION.
The $glob() function allows you to specify a "shell-like"
wildcard argument list, for which it will return all the files
that match the patterns. Its "supposed" to behave just like the
shell does, so you should already know how it works. Yes, you
can specify more then one argument. Directories are appended
with a forward-slash ('/'), making it easier to seperate them
from the regular files.
*** News 04/20/96 -- Workaround for lame ircd lossage on ``K-line comments''
(Rant on)
I hate these things. Whoever allowed K-line comments to contain
an unlimited under of words should be drawn and quartered.
(Rant off)
*** News 04/19/96 -- Added $numsort()
Its like $sort(), but it makes an attempt to properly order
numbers present in the text. The strings are alphabetically
sorted except when numbers are placed in identicaly locations.
So 'abc5' is located before 'abc12'. However, 'abcX', where X
is any non-digit, is guaranteed to be treated as if "X" were a
0, when comparing with 'abcY', where Y is a digit.
Examples:
$sort(12 1 5) returns "1 5 12"
$sort(S5 S1 S12) returns "S1 S5 S12"
$sort(B2 A3 C1) returns "A3 B2 C3"
$sort(abcd abc12 abc5) returns "abcd abc5 abc12"
*** News 04/16/96 -- No, the help bot support wasnt removed...
I just #ifdef'd it out. Its #define USE_HELP_BOTS.
Youll have to add it to the config.h to get the support.
*** News 04/12/96 -- AUTO_UNMARK_AWAY will call /away alias if possible
Someone asked that the code that does AUTO_UNMARK_AWAY call the
user's 'away' alias if they had one, so that scripts like superpak
and phoenix could correctly end their msg logging. I should have
told the person to do an /on 306 instead. ;-)
*** News 04/11/96 -- New set, /SET DCC_LONG_PATHNAMES (ON|OFF)
If its ON, youll see the whole pathname of the files youre sending.
if its OFF, youll only see the last part.
*** News 04/11/96 -- More info in the status bar for DCC transfers
As a comprimise to those who want a ncftp-ish "progress-o-meter"
with reverse text et all, i decided to display the total number
of packets in the file transfer and how many have been transfered
so far, so that the percentage you see is more meaningful.
Will this lead some day to ETC? Perhaps.
*** News 04/10/96 -- HACKED_DCC_WARNING no longer default
So many people have had problems with it, that i am #undef'ing
it by default -- you are of course free to #define it if you
like having it.
*** News 04/08/96 -- Dropped support for help bots.
The help bots dont exist any more, so im going to take
out the code that supports them. Ill have to make sure
that the help files are easily available with the release.
*** News 04/08/96 -- Added #define CONNECT_TIMEOUT to config.h
It was silly that it was hard coded and not user-specifiable.
I changed it to 30 seconds (it was 15 before) since 15 seconds
hasnt seemed to cut it for me.
*** News 04/06/96 -- Same thing for /WHILE and /UNTIL
Removed the silly restriction (see below) for /WHILE.
The following are supported:
/while (expr) commands
/while (expr) {commands}
Applies also to /UNTIL.
*** News 04/06/96 -- removed silly restriction on /IF
The silly restriction that required you to enclose the THEN
part of an /IF comamnd even if you didnt have an ELSE part
has been removed. This is not to say you cannot, but rather
to say that you are not required to. The /IF command can now
be of the form(s):
/IF (expr) commands
/IF (expr) {commands}
/IF (expr) {commands} {commands}
Just so long as it appears as all one logical line in the script.
You should use {}s for asthetic reasons if you are using more then
one command in the THEN body. You MUST use {}s if you have an
ELSE part. All this applies to /UNLESS as well.
*** News 04/06/96 -- Added /UNLESS and /UNTIL
/UNLESS is the opposite of /IF.
unless (x == 0) {y = 7}
/UNTIL is the opposite of /WHILE.
until (x == 0) {x--;y += func()}
*** News 04/01/96 -- New built in function, $notify()
If specified with no arguments, returns the nicknames you
have on your notify list. It takes the following arguments:
ON - specifies that only those who are PRESENT should be returned
OFF - specifies that only those who are ABSENT should be returned
SERV X - specifies that server number X should be used.
This flag can be used without the "ON" or "OFF" arguments,
but there isnt much point to that. If the number argument
is missing, the whole function returns nothing.
In case of error (like invalid server number), the function returns
nothing.
*** News 03/27/96 -- $rmdir(), $unlink(), and $rename()
They now expand twiddles, per the suggestion of Crowman.
*** News 03/20/96 -- Added 'sound' script
The 'sound' script is an attempt on my part to support mirc's
CTCP SOUND command. See the script for usage info.
*** News 03/20/96 -- Fix two bugs in /exec
The first one was a lame typo lamage that was the reason posix
systems (freebsd, linux) were having lossage trying to kill off
exec'd processes on quit. That should all be kosher now
The second one is that the signal handlers are reset right after
the fork() in exec'd processes so that if the program being run
coredumps, it wont output that annoying "IRC-II has trapped..."
message back up the pipe to ircII, but will rather die the default
death for memory faults on the system (a coredump).
*** News 03/20/96 -- New built in function -- $sort()
Yes, I finally got off my duff and wrote this. it requires
qsort(3), which is required by ANSI, so i hope everyone has
that without my having to have 'configure' check for it...
*** News 03/20/96 -- Reworked io()
io() no longer recreates the fd_set's every time its called,
it doesnt call functions it doesnt need to call, and several
other optimizations intended to reduce unnecesary CPU usage.
*** News 03/19/96 -- Fixed alias_special_char() to not call parse_inline()
Unscientific tests show that it improves performance of simple
variable lookups by almost 20%.
Performance of expression mode is not effected by this change,
but the performance of [$var] instead of 'var' goes from 50%
slower to 30% slower.
*** News 03/19/96 -- $common() and $diff() fixed
The following things were "broken" with $common() and $diff()
-- If a word in the left part was found in part of a word in
the right part, it was wrongly returned:
$common(one two / phone ugh) returned "one"
-- If a word appeared multiple times in the left part, and it
was present at least once in the right part, it was returned
multiple times:
$common(one two one / one three) returned "one one"
Both of these weaknesses are now fixed.
*** News 03/18/96 -- Fixed /on bug
Up until now, doing something like this didnt work like expected:
/on foo "blah blah"
{
...
}
or
/on foo "blah blah" ....
because the extra spaces fouled up the /ON command. Now any spaces
between the pattern and the body of the ON are ignored. This also
means that anyone who was doing this:
/on foo "blah blah" text to send to channel
should change it to look like this:
/on foo "blah blah" / text to send to channel
This seems to make a lot more sense to me...
*** News 03/18/96 -- Finished the "new and improved" ircserv.
This new ircserv has all the functionality of the old one except
that it actually works now, and its much simpler to both the
client and ircserv itself. The catch is that the client wont work
with the old ircserv any more, and the new ircserv wont work with
old clients. You must install the new ircserv with this version
of the client if you expect to use ircserv.
*** News 03/08/96 -- Support for //^ "feature"
The //^ "feature" that is used by many large and widely used scripts
is now supported again by popular demand. However, you should NOT
use this "feature" in new scripts, *please* use the syntactically
correct ^// construct. Thanks.
*** News 03/07/96 -- Added new command /SWITCH
The syntax is:
switch (control text)
{
(switch 1) /* "switch set" is an expr */
{ /* and some commands to */
body 1 /* execute if it matches the */
} /* control text */
(switch 2) /* A switch set may have */
(switch 3) /* then one expression, and */
{ /* if any of them match, */
body 2 /* then the commands are */
} /* executed. */
}
The "control text" is the text that youre trying to match.
Each "switch set" is comprised of one or more "switch texts"
and a "switch body". If any of the "switch texts" are found
to match (wildcards are allowed) the control text, then the
commands are executed. Only the first such "switch set" found
to match the control text is executed, the rest are ignored.
So it is important to put your most general switches at the
end of the structure.
At the face of it, the general idea is that it is a way to
allow you to do a multi-way selection on a string when there
are more then two possible values. On a deeper level, there
is also the flexibility to parse arguments using regular
expressions and then knowing what to do depending on which
pattern was matched. See the "country" script for an example
of what im talking about.
*** News 03/06/96 -- Workaround for longstanding /foreach bug
It has been a long standing problem that you couldnt use []
notation in the /foreach command
So now instead of being required to do:
/foreach foo.${ii}.${jj} kk { ... }
You have the more asthetically appealing option of:
/foreach foo[$ii][$jj] kk { ... }
Sorry, you still cant (and never will be able to) do
/foreach foo.$ii.$jj kk { ... }
*** News 03/06/96 -- Added new built in function $usermode()
Hard to believe there wasnt one before. You give it a server
number, and it gives you your umode on that server. If no
argument is specified, the "current" server is used. Specify
an argument at your own peril, as no sanity checking is done.
*** News 03/06/96 -- Added new on, /on SILENCE
Whenever you get a SILENCE message from the server, /ON SILENCE
will be hooked. It provides the following arguments:
$0 - a plus ('+') or a minus ('-') depending on whether this
message is for a silence added or removed
$1 - the pattern silenced or unsilenced.
*** News 03/06/96 -- Modified /alias's behavior on error.
Well, it seemed pretty lame indeed that having trailing junk
after the closing } in an alias would cause it to crap on the
entire alias. So now it just emits a warning and adds the alias
anyhow, which is more sensible.
EPIC3pre8 [[ Bug fixes, performance tuning ]]
*** News 03/05/96 -- Added $winsize()
If given an argument, returns the size (height) of the specified
window. If not given an argument, returns the size of the current
window.
*** News 03/04/96 -- /fe now honors "extended" words correctly
The words that are surrounded with quotation marks are now
parsed (correctly) as one word...
*** News 02/28/96 -- /set highlight_char now accepts any string
If the argument to /set highlight_char is not BOLD, UNDERLINE,
or REVERSE, the argument is taken as the string to be used as
your highlight string.
*** News 02/27/96 -- notify now queries each server
Yes, thats right -- /notify now works on each server you
have open independantly of each other. Try it out. =)
Due to logistics problems, each server has an independant
list, but each server must have exactly the same set of
nicknames (you cannot have a different list for each server,
sorry.)
*** News 02/26/96 -- Added the $strftime() function
The $strftime() function from ircII2.8.2 has been integrated.
The biggest change i made to it is that the first argument,
which is an integer representing the time, is optional. If
no time is specified, then the "current" time is used.
*** News 02/25/96 -- Fixed horrendous ++/-- bugs.
The ++/-- operators, that had a few non-trivial bugs before,
have been revamped to work in all situtations. The only catch
is that they do not actually operate on the values until such
time as they are parsed. That is to say that a prefix operator
does not reflect the new value until the operand. A postfix
operator is definitely reflected in tokens after the operand.
For a contrived example, if $foobar is 3,
(foobar++ + foobar) is (3 + 4 == 7), and *not* 6. Also,
(foobar + ++foobar) is (3 + 4 == 7), and *not* 8.
Its not so hard to understand how it works, just that its hard
to accept that it does work that way. ;-)
*** News 02/25/96 -- revamped much of next_unit (parse_inline())
I rewrote most of next_unit() by making a few general macros
and then writing the rest of everything in terms of the macros.
Makes the function a lot easier to read, and allowed me to fix
the ++/-- bugs as described above. This shouldnt affect anything
as i didnt actually change the code used, only how it is arranged.
*** News 02/22/96 -- New built-in function $pass()
This function is the opposite of $strip(). You specify a list of
characters to NOT strip out of the text, and it returns the text
after all the characters that are not in the list are removed.
*** News 02/20/96 -- New built-in function $repeat()
Very simple:
$repeat(count text)
Returns "text" repeated "count" times. You should not assume
any leading spaces are either retained or stripped, but you may
assume spaces after words (including the last word) are retained.
It doesnt put a space between each repitition -- if you need a
space between each repetition, make sure to append a trailing space.
*** News 02/20/96 -- ansi compiling
Please compile EPIC with ansi mode turned on if at all possible!
EPIC3pre7 [[ IS THIS THE LAST BETA RELEASE? WE CAN ONLY HOPE! ]]
*** News 01/16/96 -- Ok. ok. the -S and -s overloaded cla were lame.
The -s and -S command line arguments, which were overloaded to
allow you to specify a default server have now lost that semantic.
-s and -S now have only their classical meanings, whether or not
to use ircserv
*** News 01/15/96 -- The semantics for $splice()
Semantics for the heretoforth "undocumented" function $splice():
$splice(variable start length text)
Where "variable" is the name of a variable.
"variable" is modified such that words "start" to "start+length"
are replaced with the specified text. The words removed
are returned. Using an absurd value for "start" or
"length" just appends the text to the closest end.
Assuming in all cases tha the value of $foobar is "one two three"
$splice(foobar 0 1 booya booya)
returns "one"
$foobar assigned to "booya booya two three"
$splice(foobar 5 4 ooga booya)
returns empty string
$foobar assigned to "one two three ooga booya"
$splice(foobar 1 2 one)
returns "two three"
$foobar assigned to "one one"
If $foobar is empty string:
$splice(foobar 3 4 one)
returns empty string
$foobar assigned to "one"
FYI, $splice() is an expensive function, but not as expensive
as the script version was.
*** News 01/15/96 -- Added $geom()
Returns the value of the global variables CO and LI that
correspond to the number of columns and the number of lines,
respectively, in the main screen for ircII. If you have
more then one screen open and they are of different sizes,
then the actual value(s) returned by this function is at
best undefined. If all the screens are the same size, however,
then that size should always be returned by this function.
*** News 01/13/96 -- Added $chanmode()
Semantics for $chanmode():
$chanmode(#channel)
If #channel is not specified or is an "asterisk", the current
channel is assumed.
This function returns the "channel mode" for the specified
channel. You must be on the channel to use this function.
(See the $key() function for related semantics.)
*** News 01/13/96 -- revamped "timer" mechanism
At the request of several people (esp. Shiek), I have rewritten
the interface to the /timer function and written timer.c which
contains a generic time-delayed callback mechanism. You may use
it in your own C code. See the code for more information.
*** News 01/13/96 -- Silent chagne to /timer
Support for timer refnum zero ("0") is hereby withdrawn due to
the impossibility to portably differentiate between an explicitly
specified zero argument and an error returned from atoi(). More
specifically, if you attempt to use a non-numeric value for the
refnum option to /timer, it would implicitly be assigned the value
of 0, which prohibited the emition of an error message since up until
now specifying a 0 refnum was valid. Now any attempt to use refnum
zero is flagged as an error.
It is possible to support the old (broken) semantics. See the
source code for more information.
*** News 01/07/96 -- Attempts to make $ expandoes boundless
Up until this release, all $ expandoes have been truncated at
a 2048 character length. Since this has made a few people rather
irritated due to unreliable behavior, the behavior has been changed
so that $ expandoes are never truncated at any length.
Testing has shown that this new method is somewhat slower for
extremely large variables (10,000 characters and up), but this is
not totaly unexpected since mallocing off large chunks of memory
and strcpy()ing them around is more expensive then just whipping
up a stack array and strcpy()ing a shorter string into it.
For the sake of sanity, i want to point out that unless your variables
are long enough that they were being truncated, the processing time
for all variables is essentially zero. Also note that this entire
discussion applies only to the use of $ expandos and does not apply
at all to "expression" mode where variables have never been truncated.
*** News 01/02/96 -- /dcc get nick works multiple times.
/dcc get nick will not issue an error about connection already being
in progress unless all connections currently being offered from "nick"
are actually in progress. (Previously, you could only do /dcc get nick
one time, no matter how many files "nick" had offered you.)
*** News 01/01/96 -- New built-in function $info()
Semantics for $info():
Description: A function used to supply non-specific information
about the actual executable image itself.
Arguments: "COMPILE" returns information about who compiled
the binary in the form:
"Compiled by <user>@<host> on <date> at <time>"
"SUM" returns the output from the 'sum' command when
run on the file 'info.c.sh' (see below). If this value
is different from a previous use of the program you can
be insured that the binary *has* been recompiled. Since
absolute protection against tampering is effectively
impossible, the converse can not hold.
More arguments are planned in the future.
*** News 01/01/96 -- Added compile logging to the Makefile
The file "info.c.sh" is now run as a shell script and the result is
compiled each time just before a final link is executed. It records
the user, host, and time the compile was done.
If you do not want your username to be returned by the $info()
function, you can #define ANONYMOUS_COMPILE in the config.h file.
The username will then be "<anonymous>", but the host and time will
be normal.
*** News 12/28/95 -- Cleaned up config.h, vars.h, vars.c
Removed irc-vars that were not used or referenced.
Removed #defines that were not used anywhere.
*** News 12/28/95 -- Fixed a really *stupid* bug with set_int_var
To make a long story short, there were a few places that
were using set_int_var() in an inappropriate manner. Those
have been fixed to use the (correct) function set_var_val().
This was the cause of a few obscure bugs, which have now gone away.
*** News 12/28/95 -- A few modifications to the menus:
* If you are in a menu, pressing the Q key kills off the menu
as if you had done /set -menu.
* The <return> key now selects the current option in the menu.
The old behavior of <return> toggling hold mode is deprecated.
* If you #define MENU_BOTTOM in the config.h file, then that
define will be used as a seperator between a menu and the rest
of the window. The #define'd pattern is repeated for the width
of the screen.
* Cursor keys are now supported while in menu mode. Your cursor
keys must be outputing either ^[[X or ^[OX (where X is A,B,C,or D)
to take advantage of this (every vt-like terminal does this)
*** News 12/28/95 -- Made getting a quit message for youself not fatal
Apparantly it *is* possible to get a quit message for youself
in an otherwise legitimite context. I still dont believe it is
possible, but the bug reports are coming in. Now it just emits
a cryptic error message that is not fatal.
*** News 12/28/95 -- Fixed /dump on (reported by Oldpink)
Fixed dumb bug in hook.c:flush_on_hooks() that was prohibiting
named-hooks from being flushed (numeric hooks were being flushed
just fine).
*** News 12/28/95 -- Fixed $connect() (reported by Chaos and others)
The problem was that in dcc_raw_connect (what $connect()
calls to establish the connection) i forgot to cast the
user-specified portnum to network order, so on wrong-endian
machines it was actually specifying a wrong port. *sigh*
*** News 12/28/95 -- Changed the behavior of alias.c:add_alias()
The semantics of assignment have been changed slightly to support
the removal of variables when their values would be otherwise set
to a string with length 0 (an "empty string"). Such assignments
this cause the variable to "go away". This is not a problem since
referencing a variable that "dont exist" expand to the empty string,
so you get the same value either way. This also affects places where
variables are implicitly assigned (such as $shift() and $splice()).
*** News 12/28/95 -- ADVISORY -- use care with the /OPER command!
Some advice to you opers out there...
1) Dont put your history in a file if you use /oper nick passwd.
Obviously, this puts your passwd in plaintext out on the file
system which is a "bad idea", especially if someone is able to
log in as you, they can use the cursor keys to just back up in
your history and become oper w/o having to crack your passwd.
2) Make sure noone is peeking over your shoulder if you do /oper nick
and type the passwd as "invisible text", as the person peeking
would be able to figure out how many characters your passwd has
which helps them in cracking it.
*** News 12/28/95 -- Added $crypt() from CrowMan
Semantics for $crypt():
$crypt(salt password)
You give it a salt (a two letter combination) and a plaintext
and it returns an encrypted string. This just calls the C library
function $crypt(), so if you dont have it, this wont do you any good.
*** News 12/28/95 -- Added $fexist() and $fsize() from Sheik
Semantics for $fexist() and $fsize():
$fexist(filename) returns 1 if file exists, -1 if not.
$fsize(filename) returns size of file, -1 if file not exist.
*** News 12/28/95 -- Added new key binding, DELETE_TO_PREVIOUS_SPACE
Keybinding deletes characters backwards until if finds a space.
Note that if the character to the left is a space, it wont delete
anything.
EPIC3pre6 [[ LAST MINUTE BUG FIXES/ADDITIONS ]]
*** News 12/3/95 -- New built in function $aliasctl()
Semantics for $aliasctl():
Description: A function that allows for low-level manipulation
of the alias and variable lists. It takes three or more arguments:
The first argument is the string "ALIAS" or "ASSIGN"
The second argument is one of the options "GET", "SET", or "MATCH"
The third argument is the alias/assign you are operating on.
If the operation is "MATCH" and this argument is
an asterisk ('*'), then it will match all top-level
alias/assigns.
The rest of the arguments are used if you are doing a SET.
More operations may be added in the future.
"GET" returns the value of an alias/assign.
"SET" sets the value of an alias/assign.
"MATCH" returns a word-list of all aliases/assigns that begin
with the specified argument. "MATCH" does not descend
into arrays or subarrays: "MATCH" does not accept wildcards,
but does accept the special argument "*" which returns all
first-level alias/assigns.
contrived examples:
$aliasctl(ASSIGN GET foo) returns the value of $foo
$aliasctl(ASSIGN SET foo 3) same as @ foo = 3
$aliasctl(ALIAS GET join) returns the "stuff" for /join
$aliasctl(ALIAS SET join window join)
same as /alias join window join
$aliasctl(ASSIGN MATCH *) Returns all top-level assigns.
Does not return any arrays.
$aliasctl(ALIAS MATCH w) Returns list of all aliases
that start with 'w'
$aliasctl(ALIAS MATCH tk) Returns list of all aliases that
begin with 'tk'
$aliasctl(ALIAS MATCH tk.) Returns list of all aliases in
the array "tk"
*** News 12/3/95 -- New built in functions $numwords() and $strlen()
$numwords() returns the number of words in the given text.
$strlen() returns the number of characters in the given text.
Text with all whitespace characters has zero (0) words.
$numwords() does not recognize "extended words".
Use @var or #var when possible, as they are more efficient.
*** News 12/2/95 -- /FOREACH can work on command aliases
If the named argument to /FOREACH begins with a hyphen ('-')
then iteration will occur over the array of command aliases
specified (as opposed to assign aliases)
*** News 12/1/95 -- /WINDOW size added
You can specify the absolute height of a window by using the
/window size <height> operation. If the specified size is
inappropriate, the client will whine at you.
*** News 12/1/95 -- /LASTLOG displays ANSI codes if #define MURPLE
If you #define MURPLE in your config.h, /LASTLOG will turn on
DISPLAY_ANSI during its execution and turn it back to whatever
you had it set to when its done. If murple likes it, i might
make it the default.
*** News 12/1/95 -- New functions $winserv(), $lastserver(), $servername()
These functions return -1 on error (ie, on illegal value)
$winserv() or $winserv(0) returns the server index for current
window.
$winserv(winrefnum) returns the server index for that
window.
$lastserver() returns the server index for the last
server we parsed. Useful with:
$servername(servrefnum) returns the name of the specified
server.
*** News 12/1/95 -- DISPLAY_ANSI var only lets escapes through
The only ANSI character that is valid and less then 32
is the escape character (27). So if DISPLAY_ANSI is
on, we let it though but reverse all the rest (like say,
the XON/XOFF characters, and ^R and ^T. >;-)
*** News 12/1/95 -- LASTLOG level "ALL" includes USERLOG levels
You get the idea.
*** News 12/1/95 -- $-0 silent change
I think i can explain it best by an example:
For the args " 1 2 3 4", $-1 on the stock client is " 1 2"
but for the string $-0, the stock client does "1". This is
inconsistent: It should never strip the leading spaces on $-n.
So i fixed it so that $-0 is " 1" instead of "1".
*** News 12/1/95 -- /set BEEP off really *means* off
You wont get beeped *at all* if you have BEEP set to off.
Really.
EPIC3pre5 [[[ FINAL BETA RELEASE! ]]]
*** News 11/27/95 -- New built-in function $writeb()
The function $writeb() is exactly the same as $write(),
except it does not append a trailing newline.
*** News 11/27/95 -- New functionality to $read()
Expanded semantics for $read():
$read(fd bytes) -- returns the next "bytes" bytes from
the $open()ed file. It is guaranteed
that many bytes will be read and returned
unless end-of-file occurs.
*** News 11/27/95 -- Added support for NOTEs
Added support for undernet-style NOTEs.
Incoming NOTEs look like this:
[nickname] message (time)
where "nickname" is the person who sent the nick,
"message" is the message, and "(time)" is the time that the
message was sent, if and only if the message was sent more than
one minute ago. If (time) is absent, the message was just sent.
/ON NOTE supplies the following arguments:
$0 nickname of the sender
$1 The time the note was sent -- this field is only
accurate up to plus or minus 60 seconds, so just understand
that you cant trust the seconds to be accurate.
$2- The message
/IGNOREing NOTEs now works.
*** News 11/23/95 -- Sanity for /STACK
People commented that if you attemped to /stack push on XXX,
and there were no /on XXXs present, that an empty "placeholder"
should be placed on the stack, so that when /stack pop on XXX
is executed, the /on XXXs should be cleared, instead of not
clearing them and emitting an error message (agreed, fixed.)
*** News 11/23/95 -- Support for long nicknames
#define ALLOW_LONG_NICKNAMES if you want support for 30
character nicknames. Dont define it if you dont use any
servers that support long nicknames. (Default is undef)
*** News 11/23/95 -- Closed up tty bug
Sometimes, characters with the high bit set were being sneaked into
the client even if the client asked the terminal handler to strip
off the high bit. Now the client just goes ahead and strips off
the high bit itself if 8 bit characters are turned off. This fixes
the bug when people would send XOFF characters with the high bit
set and that would get passed to the terminal, which ignores the high
bit, and turns off the person's flow control -> bad. (chaos)
*** News 11/23/95 -- Support for CS servers
Support for user modes +c, +f, +k, +r, and +u have been added.
EPIC3pre4
*** News September/October/November - lots of bug fixes
So im lame. I didnt add any new features, just fixed bugs as
they popped up.
EPIC3pre3.3
*** News 09/30/95 -- Added a feature to deny a specific host
In some schools that have networked systems (ie, under AFS),
the same executable may be run by any nmber of people on any
number of machines. For these people, there is now a config.h
#define that allows you to set a file that will be checked for
hosts to deny access to the executable.
EPIC3pre3
*** News 09/09/95 -- Got rid of stupid 'count' program!
Converted *.h.proto files to use 'enum' instead of that stupid
'count' program. EPIC no longer requires (f)lex to compile.
*** News 07/31/95 -- major rewrite of built-in functions and regression test
I rewrote most of the built-in functions to fix all of the remaining
bugs that were present. I also whipped up a script to test a lot of
functions to make sure that in the future, ill know right away when
a function isnt working right.
*** News 07/06/95 -- DCC TALK and DCC SUMMON removed
In a move that is likely to be a little controversial, i removed
the DCC TALK and DCC SUMMON features because they seemed to be
1) redundant
2) not implemented very well
And also because we want to make EPIC smaller by ridding it of
extraneous unused features.
*** News 07/03/95 -- Userhost now taken on advice of the server
At the suggestion of DemoN, the client now asks the server what
it thinks our userhost is when we have connected to it, and we
take it at its word. In this way, we no longer have DCC conflicts
when we think our IP address is one thing and the rest of the
world thinks its another...
EPIC3pre2
*** News 06/23/95 -- /on timer actually hooks at the top of each minute
/on TIMER actually hooks when the minute rolls around instead
of "up to" 15 seconds after the minute. Another aspect of this
is that EPIC doesnt do 4 select() calls a minute when youre
idle, it only does one, which lowers the CPU usage.
*** News 06/14/95 -- DCC Transfers now measured to microsecond precision
If your system has gettimeofday() (its a BSDish syscall) EPIC
will report your DCC transfer rates in terms of second/usecond
resolution -- providing a better representation of the kb/sec
for small, fast transfers. Anyone want to tell me what/if there
is a posix or sysv call to get second/usecond info?
EPIC3pre1 (size level 123%)
*** News 05/21/95 Highlight characters may now be bound (keys.c, edit.c)
You may bind any sequence you wish to BOLD, UNDERLINE, REVERSE,
or HIGHLIGHT_OFF. However, please note that no matter what key
you have bound to them, BOLD will always insert a ^B into your
input line, UNDERLINE inserts ^_, etc, etc, etc. Yes. i know this
can be confusing, but unless someone comes up with a big gripe,
im most likely going to leave it this way. The highlight keys come
bound to the highlight bindings that they should be bound to by
default. >;-)
*** News 05/21/95 /set INDENT should work properly with ascii sequences
(screen.c)
Or so i think. Let me know if you dont think it works properly.
*** News 05/20/95 # walls incorrectly hooked (parse.c)
# walls (ie, walls sent to a hostname pattern) were incorrectly
hooked as PUBLIC_MSGs instead of MSG_GROUP. Fixed.
*** News 05/20/95 choices for help now paged (help.c)
When you are given a list of choices to select from in the help
browser (ie, in /help set), the options are paged if you have
HELP_PAGER set.
*** News 05/17/95 built-in aliases now binary searched (alias.c)
The built in aliases (all 101 of them) are now binary searched
instead of sequentially searched. This should make the use of
built in aliases all that much faster, as well as increasing
the speed of your own aliases since the entire builtin alias
list will not have to be traversed before your aliases are
searched.
*** News 05/17/95 Complete rewrite of main loop (irc.c, others)
irc_io has been replaced (modularized, actually). Hopefully
this will make ircII more reliable and less prone to lock ups.
The first thing you will probably notice is that the client
still accepts input from the keyboard even during a /wait
command. Preliminary tests show this new design to be more
sturdy then irc_io ever hoped to be.
*** News 05/11/95 Completed rewrite of ignore (ignore.c, whois.c)
The rewrite of the ignore system has been completed. Ignores are
now officially based on *!*@* patterns instead of nickname or
userhost patterns.
*** News 05/11/95 Key bindings are now allocated dynamically (keys.c)
Up until now, the key maps have been stored in static arrays, 10 maps
of 256 characters for a total of 2560 entries at 13 bytes per entry.
(2 integers a pointer and a char) for a usage of 33,280 bytes (32K).
That has been dropped down to 2560 pointers (10,240 bytes) with 13
bytes still used for each key binding, a savings of 23,040 bytes
(22k) in overhead. You would have to have over 1,770 key bindings
before you will use as much RAM under this new system as you did under
the old system.
*** News 05/11/95 Client no longer needs the 002 numeric (notice.c)
Some people, who hacked the 002 numeric reply on their server, broke
all the ircII clients out there that rely on the 002 numeric being of
a specific format to extract the server name and version info. This
is totaly ludicrous to me, since that is what the 004 numeric is there
for, (to provide server and version info.) So the .ircrc is not
loaded until the 004 numeric is recieved now. The ``kludge'' that
ircd has for older ircII clients is ignored if you recieve the 001
numeric (which signifies a 2.8 class server). If you do not recieve
a 001 numeric, then the server waits until the kludge is recieved to
load the .ircrc, as it has always done for ever and a day.
*** News 05/09/95 Removal of support for 2.5/2.6 (all)
Per the vote taken on the mailing list, all support for ircd2.5
and ircd2.6 has been terminated. Please do not use EPIC on those
servers. (This should not be a problem since there hasnt been a
ircd2.6 server in over three years) I have ripped out large chunks
of code that were specific to ircd2.5 and 2.6, and which were
confusing the whole code and making things harder then they had to
be. Also, code that is specific to ircd2.7 servers has been
#ifdef'd out by default, you can get that code by #define COMPAT_27
in the config.h. If you dont need ircd2.7 compatability, you will
save some amount of space in your executable.
*** News 05/06/95 new command /MESG (output.c)
The new command 'MESG' now does what its counterpart in unix does:
It allows or disallows writes to your screen: If you set it to 'n',
you will not recieve any talk requests or writes from other users
directly onto your screen. If you set it to 'y', you will be able
to recieve talk requests and writes from other users. THIS DOES NOT
RESET THE PREVIOUS STATE WHEN YOU EXIT! If you use 'MESG' to set
permissions on your tty, those permissions will still be set after
you exit.
*** News 05/06/95 new function $trunc (alias.c)
A new function $trunc() is available for rounding or truncating
floating point numbers. It takes two arguments, the first is the
precision and the second is the number. If the first argument is
positive, that is taken as the number of decimal places to round at.
If the first argument is negative, that is taken as the number of
significant digits to round at. The answer will never have more
precision then what you provide. This function uses the system call
printf() to format the output, so your actual output is dependant
upon your system's implementation of printf(). If you provide strange
input (ie, something that isnt a number) you will probably get strange
output. (garbage in, garbage out)
*** News 05/06/95 DCC reject (dcc.c ctcp.c)
If you use the /DCC CLOSE command to close an offered or pending DCC
connection, it will send a CTCP notice to the other peer telling them
that the transaction will not occur. Both peers will then remove the
offer from their respective DCC lists. Either peer (either the sender
or the reciever) may reject the connection by using /DCC CLOSE and the
other peer will be notified. If the other peer is an older client,
they may not handle the CTCP notice gracefully. A script is provided
with the client to supply this functionality to older clients.
*** News 05/06/95 DCC Warning before overwriting file (dcc.c)
If you recieve a dcc send request for a file that already exists, you
will get a warning to that effect, advising you to use /DCC RENAME if
you dont want to overwrite the original file.
*** News 05/06/95 DCC Progress-o-meter (dcc.c, etc)
New status format variable: %D -- shows the progress of the current
DCC send/get transfer showing the nickname and percent of transfer
completed. /DCC LIST now shows the size of the file and the
percentage transfered instead of simply showing the number of bytes
sent.
*** News 05/01/95 Floating point support (alias.c)
There *IS* floating point support. However, it is preliminary and
may not neccesarily be complete or manageable! In all cases where
integers are needed, any floating point values will be truncated to
the next lowest integer (or to the next higher integer if youre
talking about a negative value)
You have to /set FLOATING_POINT_MATH to 1 before you will get any
floating point answers. This is to maintain backwards compatability
with old scripts until i have a chance to assess the damage that
would result in older scripts that assume integer math.
Also note that no matter what FLOATING_POINT_MATH is set to, floating
point math will be done on the operands. if it is set to OFF, the
result will then be truncated after the operation. So any script that
did something like 8 - 3.2 will get the answer '4' instead of the '5'
that previously would have been given.
Please keep in mind that ircII parses its algebraic expressions from
right to left (this is a bug im working on, so dont harass me yet),
so if you try to do floating point math, please be aware that you may
have to use paranthesis to get the right parsing order.
*** News 04/28/95: More security
A new /set, "SECURITY" is in place to allow you to do some primitive
backdoor security. If you set it to 1, you cannot use a variable as
a command. If you set it to 2, you cannot use /exec except
interactively. If you set it to 4, you cannot use the /set command
except interactively. You can add these numbers up to suit the
security you wish to have.
****************************************************************************
EPIC2 [[[ PUBLIC RELEASED VERSION! ]]]
*** News 1995-04-09: ~ operator had wrong precedence (alias.c)
The ~ operator had the wrong precedence. Its now been fixed.
*** News 1995-04-08: $open() now expands twiddles (files.c)
Kev asked me to have the $open() call expand_twiddle so
you can do ~/filenam type stuff.
*** News 1995-04-08: New functions added (alias.c)
The following functions, which act simply as front ends
to the system calls by the same name have been added:
$unlink(file1 [file2 ...]) Delete a list of files
$rename(file1 file2) Rename file1 to file2
$rmdir(file1 [file2 ...]) Delete a list of directories
These functions return the number of files that were not
successfully handled. So, it returns 0 if all went well or
if no arguments were specified.
These functions wont do anything the system call wont do, ie,
theyre rather primative. Use /exec for more complex tasks.
These functions do NOT do any wildcard expansion!
*** News 1995-04-08: EMACS keybindings no longer bound by default (keys.c)
Someone from Europe said that using EPIC on scandinavean
keyboards was difficult at best becuase of the emacs metakey
bindings that i doubt anyone uses anyhow. You can #define
EMACS_KEYBINDS if you want them, or just /bind them in
your .ircrc
*** News 1995-04-08: Nickname not fudged in /nick (numbers.c, etc)
Kanan asked that the /nick command not fudge your nick
if you enter an invalid nickname.
*** News 1995-04-08: Fixed brain dead ignore (ignore.c)
Many, many people have asked why /ignore cannot support
the nick!user@host construct. Well, now it can. In fact,
you can give it any non-ambiguous nick!user@host pattern
and it will recognize it and do the right thing. A userhost
*must* contain either a "@" or a "." Any string with no
"!"s, "@"s, or "."s is assumed to be a nickname.
Also, the /ignore command stores ignores as nick!user@host
patterns now instead of as a "nick" or a "userhost" -- this
is backwards compatable becuase you can think of what used
to be stored as "nick" is now "nick!*@*" and what used to
be stored as "user@host" is now "*!user@host" -- ok?
*** News 1995-04-03: Finished implmenting /stack (stack.c)
/stack (PUSH|POP) (ASSIGN|ALIAS|ON) now works.
/stack LIST isnt implemented yet. Will come in future version.
EPIC2pre5 [[[ FINAL BETA RELEASE! ]]]
*** News 1995-04-02: Modified 'LOAD' command (edit.c)
You may now specify any number of filenames per LOAD command.
Not only will this allow you to tighten up your scripts by
loading many files per LOAD command, but also allows you to
stub several files to one alias (see below) -- of course,
if you use the -args flag, you may not specify more then
one file after the flag to load. The -args flag has effect
only on the one filename that follows it. (see help files)
*** News 1995-04-02: New command "STUB" (alias.c edit.c)
*** NOTE: The use of the word 'alias' can also be
extended to the word 'assign' as well.
You may now "stub" an alias to a file. What this means is
that the first time you attempt to use that alias, the file
it is stubbed to will be loaded. Therefore, if the alias
is never used, the file it is contained in will never be
loaded (Obviously, if another alias that is stubbed to the
same file is used, all aliases in that file will also be
unstubbed.) The idea is that instead of loading a very
large script pack on boot up, you can create a file that
will contain "stubs" to the real files those aliases are in.
If/when you actually use those aliases, at that time will the
file be loaded, so you dont have to load everything every time
if you dont use everything every time. >;-)
Stubs *are* aliases. The /STUB command is used only to enter
stubs. Once they are entered, you can (and must) list or
delete list them using the /ALIAS command just as if it were
a normal alias.
Probably I (or someone who is interested) should write a C
program, or maybe even a perl program that will automatically
generate stub programs for multi-file script packs.
*** News 1995-03-31: Implemented CTCP over DCC (ctcp.c, dcc.c, etc)
You are now allowed to send CTCP commands over an open
DCC CHAT connection by using the form =nickname, just like
you do for /msg =nick. This buys you three things:
* On a really really bad day, you can send files to a person
you are dcc chatting with without having to be at the mercy
of a certain d0g3-st()()p1d server that lags a lot.
* If you dont want to tell the whole net that youre sending
a file to someone, this allows only you and your target to
see the handshake.
* Since all CTCP commands can be sent this way, its just another
way to reduce network traffic, making life better for everyone.
*** News 1995-03-28: Fixed the STACK command (stack.c)
STACK POP ON XXX now works correctly. huzzah!
EPIC2pre4
*** News 1995-03-27: Bug fix for umode +o (parse.c)
Doh! Cant pass a null pointer to do_hook....
*** News 1995-03-27: New privacy feature (config.h, irc.c)
As detailed in the config.h, there is a new privacy feature
in ircII. You are now able to define at compile time, or,
to specify a file containing at run time, user ids in integer
form, that will be authorized to run the program. Unauthorized
users will be "spoofed" -- that is, ircII will execute another
program (that you may also define) without giving any clues.
You may also specify a password that will be used in conjunction
with uid checking.
You can also define a second file that will be used to specify
the uids of those users who will NOT be allowed to use the
program *at all*
See the config.h for a full explanation of the feature.
*** News 1995-03-26: Fixed bug with ${} expando (alias.c)
The ${} expando (that allows you to switch to the expression
context from within the command context) didnt allow nesting
before. I consider this a bug, so i fixed it.
(ie, ${[${foo}bar]} now is the variable $foo followed
by the string 'bar'. Nesting ${}s usually is done
when you are using the tertiary operator)
EPIC2pre3.1
*** News 1995-03-23: new /set: DISPLAY_ANSI
At the request of Deadelvis, i included a new /set that will allow
you to display ANSI characters as is without their being fudged
by the client into reverse characters. It is off by default.
*** *** *** WARNING! *** *** *** WARNING! *** *** ***
If you run the client with this set to ON, you run the risk of
keybombs/whatnot!
*** *** *** *** *** *** *** *** *** *** *** *** *** ***
My advice is to do something like this:
alias real_echo {set DISPLAY_ANSI ON;echo $*;set DISPLAY_ANSI OFF}
then use /real_echo to display things with ansi characters.
*** News 1995-03-23: Unexpected EOF message more informative
the "Unexpected EOF in file ..." error message will now attempt
to tell you what line the beginning { started at. Its not
guaranteed to get the right one, but it will get the first unmatched
{ correct. ;-) (deadelvis)
*** News 1995-03-23: /ignore MSG no longer ignores CTCPs
At the request of DeadelviS, /ignore ... MSG no longer ignores
CTCPs. you have to /ignore ... MSG CTCP now. Unless someone has
a dire problem with this, i will keep it this way. If you have
a dire problem with it, let me know, and ill work something out
with you.
*** News 1995-03-23: wait % functionality restored
Flav alerted me to the fact that wait % was a noop. I put back
its functionality. Dont ask me why phone took it out in the first
place. Whee.
EPIC2pre3 (2.8 compliant)
*** News 1995-03-19: finished prototyping
Most (all?) the header files are now prototyped.
*** News 1995-03-18: new config.h define, "EXEC_COMMAND"
At the request of DemoN, i have included a define in config.h
that will allow you to remove the EXEC command at compile time.
If you remove the EXEC command, it cannot be used unless you
recompile the client again. If you do not define EXEC_COMMAND,
you cannot use the file manipulation functions either. This
is "supposed" to be a security feature. >;-)
*** News 1995-03-17: New /set: AUTO_NEW_NICK
If the server rejects you for a nickname collision, and
you have AUTO_NEW_NICK set to ON, the client will convolute
your nickname in an attempt to get a nickname suitable for
reconnecting. It has a pretty good idea when its out of
guesses, and if that happens, it will fall back and ask
you for a new nickname. If AUTO_NEW_NICK is off, the client
will always ask you for a new nickname if you are collided.
*** News 1995-03-17: New function (alias.c notice.c server.h)
New function:
$version([servernumber]) - returns in text form the "class"
of server specified. The servernumber should be
a number corresponding to a server in your server list
TO WHICH YOU ARE OR ALREADY HAVE BEEN CONNECTED!!
Specifying no arguments implies your current server.
The classes are such:
"2.5" a 2.5 server
"2.6" a 2.6 server
"2.7" a 2.7 server
"2.8" a regular 2.8 server
"u2.8" an undernet 2.8 server (mu/me)
"2.9" a regular 2.9 server
"u2.9" an undernet 2.9 server
"2.10" a regular 2.10 server
"u3.0" an undernet 3.0 server
Please dont get confused if you get the reply "u2.8" from
a server on efnet: All that is meant to convey is that the
server has the capability to handle the extended undernet
numerics and replies.
If you ask for the version of a server to which you have not
been connected, "2.5" will be returned (becuase it is the
lowest common denominator)
*** News 1995-03-16: EPIC finally loads 100% of ircII2.2.9 scripts
Thanks to the prodding of Kanan and Murple, i tracked down
the reason EPIC wouldnt load old script packs. It was in
edit.c in the loader, the part that handled comments was
munging up lines that it shouldnt have been. I am now able
to load textbox, axis, and phoenix without any apparant
problems. (mixed blessing) This is the most fundamental
bug that i have fixed, so it is worth upgrading for.
*** News 1995-03-16: character translation function
New function:
$tr(/oldc/newc/text) - Substitutes any instances of characters
in 'oldc' with corresponding character in 'newc' in
'text'. If 'oldc' is longer then 'newc', then the last
character in 'newc' will be used to extend 'newc' to the
length of 'oldc' Delim is the first character, does not
have to be '/'. Examples:
$tr(/a/b/Mary had a little lamb) returns "Mbry hbd b little lbmb"
$tr(?a??Mary had a little lamb) returns "Mry hd little lmb"
$tr(:abcdefghijklmnopqrstuvqxyz:nopqrstuvwxyzabcdefghijklm:$*)
would do a "rot-13" on the text passed to the alias.
$tr(/$chr($jot($ascii(a) $ascii(z)))/
$chr($jot($ascii(n) $ascii(z)))$chr($jot($ascii(a) $ascii(m)))/$*)
Does the same thing as above.
EPIC2pre2 (2.8 compliant)
*** News 1995-03-14: New IP/name conversion functions
Added three new functions:
$iptoname(ip-addr) given a XXX.XXX.XXX.XXX ip address, returns the
hostname associated with that IP
$nametoip(hostname) given a hostname, returns the XXX.XXX.XXX.XXX
ip address associated with that host.
$convert(whatever) converts whatever you give it to whatever it isnt.
$convert($convert(rush.cc.edu)) should return "rush.cc.edu"
*** News 1995-03-13: file reading/writing by popular request
You now have the capability to manipulate files directly in
irc using several built in functions.
$open(FILENAME <type>) where <type> is R or W depending
on whether you want to Read or Write. Write does
not truncate file, but rather appends. Returns the
file descriptor to the opened file.
$close(fd) closes the file corresponding to the fd.
$read(fd) returns a line from the file corresponding to the fd.
$write(fd text...) writes the line of text to the file
corresponding to the fd.
$eof(fd) returns 1 if the fd is at end-of-file, 0 otherwise.
These functions return -1 if there is some sort of error.
More functions can be added if you tell me what you want to have.
The "read" option uses uzfopen, so you can read compressed files
via this method if you wish.
Example of usage:
alias cat {
@ fd = open($0 R)
do { echo $read($fd) } while (!eof($fd))
@close($fd)
}
EPIC2pre1 (2.8 compilant)
*** News 1995-03-01: do (if.c) (final support in pre2)
Finally got around to supporting the do/while command. It takes
the following form(s):
/do cmds
/do {cmds}
/do {cmds} while (expr)
All forms should work correctly.
*** News 1995-02-28: uzfopen (edit.c ircaux.c help.c)
Added capability for ircII to automatically grok the *.Z, *.z,
and *.gz compressed file extentions and automatically know what
to do with them. You may now compress any LOADable file, or
any HELP file any way you choose (gzip or compress) and ircII
will know what to do. Blew away all uses of the ZCAT macro.
*** News 1995-02-27: Bug fixes, 2.8 compliance (all)
Wow. Now that its all ANSI prototyped, i have to go through and
fix all the function calls that are incorrect, especially most
of the key binding functions. Some of them were (char, char *),
some of them were (char *, void (*)()), and some of them were (void).
Ick. They all take (char, char *) now. I need to go through and
compile ircII with the -Wall option and find all the bugs i can...
*** News 1995-02-15: More Undernet Support (edit.c status.c)
u2.9 commands /RPING, /UPING, and /MAP now supported
u2.9 user mode +d now supported.
mu3 /SILENCE command and replies now supported
*** News 1995-02-09: Hack for 'uname' and 'c-like comments'
see config.h about #define UNAME_HACK and #define COMMENT_HACK
basically, it provides some sanity checking for people who dont
like 1) giving out their uname's, and 2) having scripts like
phoenix break on EPIC. (awwwww! >;-)
*** News 1995-01-10: Bug fixes (alias.c)
A tertiary operator without a colon (? but no :) caused a
coredump: this has been fixed
*** News 1995-01-02: Sanity check for SUPPRESS_SERVER_MOTD (numbers.c)
If you have /set SUPPORT_SERVER_MOTD set to ON, then you
cannot hook /on 372, 375, or 376 the first time you join
a server (ie, its suppressed). You will still hook these
ons any other time you do a /motd.
*** News 1995-01-02: new set: NUM_OF_WHOWAS (vars.h.proto vars.c edit.c whois.c)
Allows you to set the number of WHOWAS replies you will recieve
from the server for any given /WHOWAS command. If the value is
nonpositive, the WHOWAS suppression is turned off and you will
recieve all the WHOWAS replies from the server. If it is set
to a positive number, you will recieve up to but not more then
that number of WHOWAS replies per command.
You can override the set by using /WHOWAS <nickname> <NUMBER>
where number is the number of whowas's you want for that
command ONLY. It does not change the default.
*** News 1994-12-22: Command line parser rewritten (irc.c)
Revamped the command line argument parser, its not quite as
quirky now, and is more able to cope with different styles.
The biggest change (that will break things) is that every flag
must be preceeded by a hypen (ie, -lbs is *not* the same as
-l -b -s any more.)
Of the commands that need to take an argument, the argument
may either be in the same "word" as the flag or may be in
the next word. (ie, -lfoo.irc is the same as -l foo.irc)
Arguments given in the same word to flags that do not expect
an argument elicit a warning but are not fatal.
Naked arguments (arguments not starting with a hyphen) are parsed
just like they always have been, with the first naked argument
being used as the default nickname and any other naked args used
as default server(s)
All taken into account, it is intended that the command line
arguments will now be easier to use and wont be quite so
painful with its (oft) mistaken restrictions...
New command line argument(s):
-n sets the default nickname
The command flags -I and -i will be supported in some future
release. (used to determine default visibility)
***************************************************************************
EPIC1.003 (vars.h.proto vars.c alias.c)
Added new set, /set PAD_CHAR that is used to determine the
padding character used in the "width" expando (ie, $[10]foo).
While syntatically PAD_CHAR may be set to any string, only the
first character will actually be used and the rest are ignored.
EPIC1 (2.6 compliant)
Upgraded to 2.6 (of course)
Functions isalpha() and isdigit() added: isalpha() returns "1"
if first character passed is a lowercase or uppercase letter.
Isdigit() returns "1" if the number is a digit, or is a hypen and
the second character is a digit.
Most (all?) of the word functions now call new_next_arg() instead
of next_arg(). What this means for you is that if you wish, you
can group more than one word inside of quotation marks, and they
will be considered as one "word" for matching/counting/etc.
The usefulness of this will be demonstrated below. ;-)
Flexible hooks have been added: You can enter and recognize
flexible hooks by using single quotes (') instead of double
quotes (") around the pattern in the /on statement.
So: /on join '$N *' echo $*
will /echo $* any time you join a channel. The difference
between a flexible hook and a regular hook is that the
flexible hook's pattern is not static, but rather is dynamic,
and any variables in the pattern will be expanded before it
is matched against the incoming line. This allows you to put
variables/functions in a pattern and have it work right.
Ability added to allow inline explosion of regular expressions.
If you place two or more words inside a \\[ \\] set, the word
that makes the pattern best match the string will be used:
Example: (newlines added solely for readability)
$rmatch(jnelson@rush.cc.edu
"sconway@\\[ugly raisin\\].ucs.indiana.edu"
"jnelson@\\[rush.cc.edu it.uwp.edu\\]")
would return "2" because the 2nd pattern matches the string.
$rmatch(sconway@raisin.ucs.indiana.edu
"sconway@\\[ugly raisin\\].ucs.indiana.edu"
"jnelson@\\[rush.cc.edu it.uwp.edu\\]")
would return "1" becuase the 1st pattern matches the string.
Note the use of quotation marks around the 2nd and 3rd argument
(which contain spaces) allows them to be considered as one
logical word.
An example that combines the previous two features:
/assign $ak nick@user*host lamer@bogus*host
/on JOIN '% % \\[$ak\\]' kick $1 $0
This ON will be parsed as follows: Since this is a flexible hook,
the $ak will be expanded to its value each time someone joins a
channel. Next, it sees that the value of $ak is inside a \\[ \\]
pair, so it subsitutes each word inside the pair into the expression
to see which (if any) best match the pattern. The value of a
\\[ \\] pattern is the number of characters that is matched
by the word in the pattern that exactly matches the most number of
characters in the pattern.
While it is syntatically acceptable to use nested \\[ \\] sets,
the behavior of this is currently undefined and should not be used
or trusted to be consistant in any future releases.
The $which() function can now take two arguments, with the
first being the file to search for, and the second argument
being a colon seperated path. The second argument is optional
and $LOAD_PATH is used if no path is specified.
EPIC-pre1 (2.3.23 compliant)
Ban listings are now counted, and the total number of
bans is displayed (or available via /on 368 as $1)
Undernet numerics are now (mostly) supported, and the
additions to present numerics are also supported
(Obsolete stuff about ZCAT removed)
If you want things the way wintrhawk has them, just
#define WINTRHAWK somewhere in config.h: otherwise things
will appear as they normally are, more conventionally.
2.3.23+11.1
(obviously) upgraded to 2.3.23
Included stuff from wintrhawk: (everything from here on till
you see the 2.3.22+11 line is from WintrHawk)
Added 6 new STATUS_USER [4..9] variables that will only show in
your NON-CURRENT window. SHOW_STATUS_ALL must be OFF for these to
work. You can predefine these in the config.h or utilise them in
exactly the same manner as you would STATUS_USER[..3].
Additionally, all STATUS_USER variables can now be called with
%0..%9 in STATUS_FORMAT with backwards compatibility of:
[%U, %X..%Z] == [%0..%3]
I hope you'll find these usefull in displaying additional
information on your statusbar. Look for my updated scripts that
will take advantage of these in the near future. I actually do plan
to add more STATUS_USER variables but I don't have the time or
patience yet. |8^)
Fixed the core dump problem when you attempt irc -h.
Got rid of the "ircII%s..." bug that refused to show version info on
abnormal termination.
Introduced a new global variable UNAME to define system type and
release information during a CTCP VERSION reply. Maybe one of these
days I'll have it autoconfig'd with the Gnu AutoConfigure Script.
Fixed the bug that hop introduced that would strip all leading
whitespaces from the input line. Maybe he had a hidden agenda for
doing that... I just found it annoying.
DCC TALK was disabled because the routines didn't work right. It's
now fixed.
Also fixed the bug that would cause you to exit even if you answered
"no" to the "Do you want to quit?" prompt after hitting ^C.
Changed +10's IRCFINGER routine. Functionality remains the same.
2.3.22+11
New function: $which() searches your LOAD_PATH for
the filename you specify, and returns the full path
to it. Useful for this example:
alias send_script dcc send $0 $which($1)
You can now enclose arguments to /LASTLOG inside "".
You can also now use wildcards in /LASTLOG to determine
what you want to search against. If you use these two
together, you can search for multi-word regexes.
example: /lastlog "t*is su"
/lastlog -literal "6667 is the port for irc"
/lastlog o*er
$before() and $after() now have a few new features.
You can now supply an optional integer value as the
first argument to these functions, and if present, will
be used to indicate which instance of the characters
you wish to use. If the number is negative, it counts
off from the end. You can also supply more then one
character to look for, if you wish. Some examples:
# completely backwards compatable
$after(! hop!jnelson@pv0420.vincent.iastate.edu)
returns "jnelson@pv0420.vincent.iastate.edu"
$after(-1 . hop!jnelson@pv0420.vincent.iastate.edu)
returns "edu"
$before(2 . hop!jnelson@pv0420.vincent.iastate.edu)
returns "hop!jnelson@pv0420.vincent"
$before(-3 . hop!jnelson@pv0420.vincent.iastate.edu)
returns "hop!jnelson@pv0420"
$after(-5 . hop!jnelson@pv0420.vincent.iastate.edu)
returns "" because there are not 5 .'s
Added new operators: +=, -=, *=, %=, /=, #=. All do
just what they do in C, except for #= which is a
string catenation operator. I hope to have &=, ^=, and |=
in the next release.
New Keybinding: SHOVE_TO_HISTORY: simply takes what you
have in the input line, saves it to your history, and
then clears the input line (presumably for more pressing
needs). You can get back to your line whenever you
wish by just cycling through your history.
Comes bound to ^] by default.
$F now returns the time the client booted up,
in $time() format (long integer in seconds since 1970)
$J now returns the ircII client version you are
running as a string ($V returns the date released)
2.3.17+10
A new hook, /on EXIT will be hooked as the client is exiting.
This hook is not recoverable (the client can not be stopped
from exiting when /on exit is hooked), but you can do some
housekeeping before the client quits with this.
The /DUMP command can now have 4 optional arguments
"ALIAS" dumps all aliases
"VARIABLES" dumps all variables
"ON" dumps all ons
"ALL" dumps everything
If no args are given, all is used as the default.
New function $chr(int int int int)
Returns the string corresponding to the ascii numbers given
$chr(65 66 67 68) returns the string "ABCD"
New Function: $ascii(string)
Returns the ascii numbers corresponding to the chars given
$ascii(ABCD) returns "65 66 67 68"
Thanks to tychy for the following idea.
When you get an incoming dcc handshake, the userhost of
the person who sent you the request is displayed, as well
as the machine that is in the handshake, and the port number
in the handshake.
If the port number is less then 1024, it is rejected.
If the userhost does not agree with the ip number, beware!
Added two functions: $before() and $after()
Syntax: $before(chars text text text)
Usage: Returns the text (before|after) the first instance
of any character in "chars"
$E now returns your idle time.
Added C-like comments /* */.
Limitations:
While comments may span more then one line, code
may not be broken up over one line. For example:
echo test /* this is a comment
this is more comment */booya
will echo "test" and execute the alias booya.
If you #define COMMENT_HACK, you can only have C like
comments that start at the BEGINNING of a line. The
end of the comment still can occur anywhere.
Fixed the serial numbered hook bug. The one where any serial
numbered hooks higher then the first serial number hook set
that did not have a match were not hooked.
Fixed the mother of all memory leaks. The one that leaked
the channel mode each time the status bar was updated. Phone
fixed this but introduced a new bug in the process. That bug
got fixed in EPIC1.
Added the ~ operator (Bitwise negative)
Added the comma operator. What it does is evaluate the
expression to the left of the comma, and throws away the
result, then evaluates the right side and returns it.
If you are kicked from a channel, and there is a channel
key, auto-rejoin will use that key.
2.3.16+9
Reworked the mathematical parser (next_unit) as follows:
* Added the &, |, and ^ operators
* Made && and || short circuit
* Added the tertiary operator
* The order of hirearchy is the same as C++,
the main change being that assignment
has LESS priority then conjunctions.
Are you sick of when your status line repeats the last
character off to the end of the line? Then you can just
/set status_no_repeat ON.
Added the /ABORT command. It does a "save" into the current
directory and then coredumps. If ALLOC_DEBUG is defined,
it does a memory dump, as well. Useful for confused bots.
NOTE: IT WILL *_NOT_* corrupt your .ircrc!
New function $numonchannel(). Returns the number of people
on the channel specified. The channel may not be ommitted,
and you must be on the channel in question. Returns 0 on error.
Replaced Auto-reconnect in a new form, which was removed from
2.3.16. Autoreconnect is done automatically on server kills.
fixed the $ischanop() bug from 2.2.9. The one where if
someone changed nickname, the client thought they were no
longer opped. This bug still seems to be around in 2.8,
but it is not present in EPIC.
2.3.16+8
Changed the /userhost command. You may now use any number of
nicks per command, delimiting the list with "-cmd", and each
nick will be passed through the commands given.
The client does not automatically turn on the screen when it
is done loading a script, but rather honors the value of
/set DISPLAY. Dont ask me why it was changed in the first
place.
A mode stripper has been added: The mode stripper does not
replace /on mode, but rather complements it. You can turn on
the mode stripper with:
/set MODE_STRIPPER on
and then you can catch stripped modes with
/on MODE_STRIPPED "...."
NOTE: /on mode STILL works even with the mode stripper on.
The load parser has been partially rewritten fixing a bug
when a semicolon was the last char on a line.
2.2.9+7
The behavior of the Command Parser has been changed, and you
may now use {} blocks just about anywhere you want to,
including the /userhost and /timer command, without having
to use the /do command. Try playing around with it, and
youll see what i mean.
The "WAIT has been called recursively" problem is no longer
a problem, so the warning message has been removed. Waiting
recusively no longer locks up the client.
New Functions:
$center(length string)
Returns "STRING" centered in a field
of length LENGTH.
To get a string of length 'length' you
will need to use the width expando, ie
$[length]center(length string)
$split(delim string)
Actually, it just changes any occurances
of any character in DELIM to a space.
Useful with the $word() function.
The % operator (modulus, aka remainder) has been added
Full support for postfix and prefix (in|de)crement
operators has been added. They now work correctly
and as you would expect.
Remember: $blah++ is not legal, it must be used as
${blah++}. Also legal is @ blah++.
New Functions/commands:
$SHIFT(var) removes word 0 from $var and returns it
$UNSHIFT(var word) puts "words" at the beginning of $var
$POP(var) removes the last word from $var and returns it
$PUSH(var word) puts "words" at the end of $var, returns $var.
These functions are also provided in command form, so that
they can be used simply for their side effects.
New Function:
$SAR([r][g]/search/replace/text) - search and replace
If 'r' is the first character, "text" is assumed
to be the name of a variable, and the text sub-
titution is done on that variable and the result
is put back into the variable, and is returned.
If 'g' is the first character, all matches of
"search" will be replaced with "replace". Normally
only the first match is replaced.
In any case, the first character that is not 'r' or
'g' is assumed to be the delimiter. You may use any
delimiter you want, but you should take care that
you dont use it in the first two fields (obviously).
The delimiter may safely appear in the last field.
2.2.9+6
New Command: FEC
Syntax: /fec (string) var {commands}
FEC iterates over STRING one character at a time putting
each character into $var. If you specify more then one
variable, the first one is used, the rest are ignored.
For each character in the string, the commands are
executed.
/fec (booya) x {echo $x}
would output "booya" one character on a line.
New Command: DO
Syntax: /do {commands}
Useful for those places where you can only have one
command, and backslashing semicolons doesnt appeal to
you, like in /timer.
*** Note: This command has added capabilities now. But
its straight use is generally uneccesary becuase the command
parser is now able to deal with embedded {} blocks effectively.
FOR, FOREACH, and FE are now all aliases of each other.
If the arguments do not start with a '(', it is assumed
to be the "FOREACH" command. If there is a () pair, and
there are exactly two commas between them, it is assumed
to be a FOR command, else it is assumed to be a FE command.
New functions:
$reverse(text)
reverses all the text character by character
$revw(word ... word)
reverses the text word by word
$jot(min max interval)
returns a list of numbers from "min" to "max" every
"interval" integers, (interval is one if ommited)
EXAMPLE:
$jot(1 10) returns the string
"1 2 3 4 5 6 7 8 9 10"
$jot(2 10 2) returns the string
"2 4 6 8 10"
2.2.9+5 (includes 2.2.9+4.1)
New command: FOR (CMDS1, EXPR, CMDS2) {CMDS3}
Looks and feels just like the C command (sorta)
Upon commension, cmds1 is executed once
Expr is then evaluated, and if expr is TRUE,
Cmds3 and then cmds2 are executed,
Repeat loop.
Stop command
The comma was chosen as a delimeter on purpose, so you can
have multiple commands in a set.
Example:
alias repeat for (@x=0, x<$0, @x++) {$1-}
alias foo for (@x=0; @y=0, x+y<5 , @x=x+2;@y--) {echo $x $y}
New command: DUMP
Deletes all of your aliases, assigns, and ons,
in case you really FUBAR things. You can then
/load global and your .ircrc to effectively reboot.
New functions:
RPATTERN (word patttern pattern...)
Returns all patterns that match "word"
RFILTER (word pattern pattern...)
Returns all patterns that do not match "word"
COPATTERN (pattern variable1 variable2)
For each value in variable1 that matches the pattern,
the corresponding value from variable2 is returned.
ENFORCE_STRICTER_PROTOCOL now forbids kicks from /on who.
Using /on who to kick is lame anyhow....
If you give the function $key() no arguments, or the argument
'*', the current channel will be assumed.
2.2.9+4
New command: /QUEUE <flags> NAME <number> <{commands}>
Flags: -DO run the commands in the named queue. Deletes
the queue by default.
-NO_FLUSH when you run the commands, do not delete
the queue.
-SHOW show the contents of all of the queues
-LIST show the contents of the named queue.
-DELETE remove the numbered entry in the named queue
-FLUSH remove the named queue
o The "QUEUE" command allows you to store a list of commands
into named queues. You may have as many entries into an
individual queue as you like, and you may have as many
named queues as you like.
o Error checking is not very tight right now, so if you try to
crash the command by doing weird stuff, you probably will.
o If you give a list of commands, they must be surrounded by
braces, and they will be added to the named queue.
o At this point, it is not recommended that you use more
then one flag per command, as i have not tested this yet.
Store commands: /queue BOOYA {echo one}
/queue WAHOO {mode * +o nick}
Exec. commands: /queue -do BOOYA
/queue -do -no_flush WAHOO
If you provide no arguments or the argument "*" to the
functions $onchannel(), $chops(), and $nochops(), the
current channel will be assumed.
New function: $key(#channel)
Returns the channel key for #channel, (provided
you are on the channel that you ask about)
2.2.9+3
$X now returns your userhost
$Y now returns your ircname
(*** Deleted info about $tert() function that is obsolete)
Added the builtin function $onchannel() that returns
everyone on the channel given, but is only reliable if
you are ON that channel. Returns a null if you are not.
Added the builtin functions $chops() and $nochops()
They return the channel operators and non-channel
operators on the specified channels.
Karll's "Array Suite" has been incorperated. The source
file is array.c and the instructions are in ARRAY
META5-9 have been added. You now have 9 META keys to
work with. Meta4 is still sticky.
New command "REALNAME" (or "IRCNAME") allows you to change
your REALNAME (the text on the right in the first line of
a whois reply), it will take effect after you use the
command "RECONNECT"
2.2.9+2
Several new built-in functions have been added:
$leftw(x list) returns the x left words in list
$rightw(x list) returns the x right words in list
$restw(x list) returns the Xth word and after
$midw(start stop list) returns the words start to
stop in list
$notw(x list) return list without the Xth word
$insertw(x word list) returns list with word added as
the Xth word
$remw(word list) returns the list without "word"
$pattern(pattern list) returns all words in list that
rmatch pattern
$filter(pattern list) returns all words in list that
do not rmatch pattern
$chngw(x new list) returns list with the Xth word
changed to new.
$tow(word list) returns the list up to/including word
$fromw(word list) returns the list after/including word
$beforew(word list) returns the list before word
$afterw(word list) returns the list after word
$common(list1 / list2) returns all words present in
both list1 and list2 (case insensitive)
$diff(list1 / list2) returns all words not in both list1
and list2 (case insensitive)
/on encrypted_privmsg and /on encrypted_notice added:
they have the same parameters as /on msg and /on notice
expect that they only are hooked when the msg is encrypted.
NOTE: If you hook these with ^, normal /on msgs will not
be hooked. (you can override defaults)
(Obsolete stuff about ZSUFFIX and loaded files removed)
/on disconnect now hooks whenever you are not connected to a
server, as stated in the help files.
2.2.9+
(Obsolete stuff about ZSUFFIX and help files removed)
Four new ONs added: NOTE: /on dcc_raw ALWAYS has higher
priority over any of these ons.
/on DCC_REQUEST tells you when you have recieved a DCC request
$0 is the person sending the request
$1 is the type of DCC request (chat, send)
$2 is the description (filename for dcc send)
$3 is the size of the file (for dcc send)
/on DCC_LOST tells you when a DCC connection terminates
$0 is the user connected to
$1 is the type of connection lost
$2- any additional information as applicable
/on DCC_CONNECT tells you when a DCC connection becomes active
$0 is the user connected to
$1 is the type of connection being made
$2- any addition information as applicable
A new SET has been added, "AUTO_REJOIN". When set to ON,
you will automatically rejoin the channel if you are kicked.
A new command /FE has been added.
FE (list of words) control vars { commands to execute }
FE allows you to go through a given list of words using an
arbitrary number of them at a time, and execute a set of
commands once for each pass. examples:
/alias opalot fe ($2-) x y z {mode $0 $1ooo $x $y $z}
/alias kickalot fe ($1-) xx {kick $0 $xx}
The first would op/deop a list of people 3 at a time
The second kicks a list of people
An arbitrary limit of 255 control variables was used.
A lot of scripts added. Look through them, you might find
some of them useful.
CTCP FINGER returns a null. (if you #define HOP)
|