hipScript for Ircle -- Revision notes

These notes are primarily for my own use, but for those who like peeking into the sordid life of a programming project, I include them with the rest of the docs. For more user-oriented notes, see the Recent New Features document.

Instead of using a v#.# version numbering system, I'm using YYMMDD date versioning.

020825

Fixed hipWavSounds so that with /wavinaction move or play set, and the user has auto-dcc off and manually chooses the sounds folder for direct download, the DoPostDCCWork() routine now detects that and copes properly.

Fixed tab nick completion so that a failure to match on a non-/msg line doesn't revert to ircle's historical behavior of wiping the inputline and cycling thru the tabmsg buffer.

Tab nickcomp now works when the nick has non-space-non-nick characters at the front. Say what? !nick<tab> now works.

Tab nickcomp where you hit option-tab in the middle of cycling thru a list of nicks (to disable pals/trim) now changes to the non-trimmed nick you were at when you hit option-tab, instead of reverting to the start of the list.

Added .* to the list of things HipScript will ignore in a plugins folder. This keeps osx and its .DS_Store files happy.

Fixed the installer so that HipTools PPC doesn't get installed on OS 8.5, since it requires 8.6 or later. (Doh!)

New command /wavsearch to en/disable the folder depth-search for .wav files when they're played, since the search takes forever on big disk drives. This is a stopgap measure in lieu of rewriting hipGetFileInfo depth search. Off by default.

Fixed tab completion so sequences of multiple spaces in the inputline don't get reduced to a single space during expansion.

Auto-DNS now throttles itself properly during a multi-IP join flood.

For tab nick completion, when a line starts with ! or @ it's now treated the same as when the line starts with / (it assumes that nick trimming should be disabled).

Now /lastmsg lists the time that last msg arrived.

Fixed a bug where /delay 1:: x would crash ircle. It was actually a bug in applescript involing try/on error processing and having an error happen in the middle of a complex arithmetic expression with coercion from string to number. Now the operands are coerced first, simplifying the expression, and letting proper on error processing happen.

Fixed yet another bug in hipGreeter that caused two sets of double-quote chars to get saved with the greeting string.

Added routine to hipscriptlib: ChannelsUserIsInWithMe(), returns a list of channels in common on the specified connection.

Added routine to hipscriptlib: UserInChannelsWithMeIsA(), takes a list of attributes (op, voice, ircop, helpop) and returns true if the user is in any channel you're in on that connection and has any of the given attribtues. This is a more general purpose replacement for the old UserIsAnOp().

Reworked the main script so that the few commands it provides (/showprefix, /disable, etc) are now invoked in exactly the same way as user commands in plugins (via the usercommand() handler). This lets a script (such as the config importer) feed these commands in programmatically just like any other hipscript command. (The old mechanism was to use a handler of the same name as the command and letting ircle dispatch control into the main script.)

Wrote HipConfigExport and HipConfigImport scripts to translate all known hipscript config data to/from text format. This is Yet Another 90 Percent Solution. There's no way to export config data I don't know about, such as from add-on plugins I didn't write. ::sigh::

020115_68k

Created a release for 68k users, by recompiling the 000822 release as run-only, and retrofitting the hipTabComplete plugin from the current source base into it (with the /pal functionality removed). There are no plans to enhance this release in the future, it is essentially a separate dead branch of the code.

011211

Added hipTabComplete (support for tab nick completion in ircle b11). Also made alias completion work.

Moved the pals list code from hipGreeter to hipScriptLib2 to support tab-complete.

Added a new keyword to /multikick. Now if the word "match" appears after the command (but before any banmask) then all users in the channel whose nick!user@host matches the banmask for any of the selected users will be kicked. Say what? The idea is to kick out spambots and any lurking clones of them all at once.

New command /matchkick. This is like /multikick match, except the nickname appears after the command instead of being based on the selected user in the userlist.

011013

Made it so you can add +o or +v entries to your/cloneokay list and any clones of opped or voiced people will be ignored.

Fixed /dnd so that if you get DDoS msg flooded while it's on it'll throttle the notices it sends to the sources.

Added code to automatically convert prefs from the old ResUtils storage method to the new builtin ircle storage method the first time HipScript loads on a version of Ircle that can support the new method.

When a page is received while you're not /away, the sender is no longer told you've been away for hours (or however long it's been since you were last away).

010930

Added the concept of a delayed kick to the clone/join flood handling. Since flooders so often join/part themselves, trying to kick them is often pointless and just lags you even more. Now there's a 10-entry fifo of pending kicks. The nicks are put on the fifo and when more than 10 exist it pops off the oldest ones and kicks them only if they're still in the channel. 10 seconds after the flooding stops, it kicks anyone left on the fifo.

Added "safe mignore" logic to the clone/join flood handling. This is essentially a throttle that prevents us from sending more than 10 /silence commands per 20 seconds to the server while coping with a join flood. A really nasty DDoS join flood could result in us sending 30-100 silence commands to the server in just a few seconds, resulting in an Excess Flood kill. If the throttling level is exceeded we lose the luxury of using /silence to squelch the flooders at the server, but our regular ignore-join-flooders logic will cover for us.

New command /clonewarn to control whether clones get warned that another one will result in a kick.

New command /joinfloodmodes.

New command /dccprotocol.

Made it so !!command displays the result publicly.

Made auto-whois filter out numeric 309 "user prefers to speak in <language>" replies that some servers implement.

I'm tired of explaining to scared newbies what "Launching preemptive strike" means, so now the text reads "Sending Nickserv passwords (preemptive strike)".

010705

New $lastkick and $mylastkick variables.

New $lastnickchanger variable.

Switch /sping to using /time instead of /version; works with efnet.

Now that greetings can be by connection, channel, and nick!user@host, really long combos of all those would get trunctated when you displayed the greetings list. Now the display routine uses hipWidestString to format thelist based on the longest entry.

/greet will now take a number as well as the greet name, like all other list-based config. (EG, /greet -3)

Fixed /aping silent so that it silences only pings requested by others, but not ones you initiate manually.

An autokick or rnakick entry can now specify the type of ban (*WW etc) by setting the first word of the kickmsg to the mask. This is supported by a new routine, BanModeFromKickmsg(), in hipLib2.

Added /autokick on | off.

New command /multikick.

/whereis now sorts the users on each server alphabetically.

!hipscript in a channel is now ignored, /ctcp #channel hipscript is the one true way.

More clone/join flood handler improvements. Now the flood handler logic is active for both ops and non-ops, but if you're a non-op it of course doesn't try to kick or ban the flooders. Instead, it just ignores everything the flooder is doing, including the join/part/signoff stuff. The idea is to make the whole flood a non-event.

New plugin hsxAutoReban written, but it's probably too specialized to release in general. (It resets any ban placed by any other op in the channel to be a wildcarded ban; useful I guess if you're riding herd on a crew of rookie ops.)

hsxStripColors now works with all combos of the indent and ircii text layout options.

Changed hsxDice to allow up to 99 rolls of 99 dice, per Tolman's suggestions and code.

hsxRepeatFlood now color-strips the line before checking for repeat floods.

New plugin hsxRetype written. Requires HipTools 2.02.

hsxNickComp now has better trim logic. Requires HipTools 2.02. Also changed to work without Dialog Director.

Carbonized HipTools.

Removed all references to gHipLib from standard plugin; hipLib routines are now vectored thru the main script, like hipLib2 routines always have been. This means I've given up the battle to keep the main HipScript within the 32k text limit, and I just have to live with using the Smile editor (ick). References to gHipLib as a global var will still work for a while, until 3rd-party plugins get fixed.

010312

Fix the error response handling for /swhois so that if the person isn't online you only get told that once.

Fixed the substitution for $n and $n- variables so they just turn into nothing if there aren't that many words on the command line after the alias.

/reban now wildcards the last ban anyone did, unless you do /reban mine in which case it wildcards the last ban you did.

/xwhois shows idle time even if it's less than 2 minutes, since that's the whole reason you'd use xwhois instead of swhois.

whois output now identifies dalnet services-admin opers as "SA-ircop".

whois output now shows the dalnet "user has identified for this nick" attribute by showing the user's nick in bold.

A big change in the way $lastban works: $lastban is now the last ban *anyone* set in the channel. New variable $mylastban is the last ban set by you. (I sure hope this doesn't massively screw up people's existing aliases and buttons.)

All the $variables that have the set of standard variants ($varname, $varhost, etc), now also have a $varnick variant too. This is kind of redundant, it means that $lastjoiner and $lastjoinernick are the same thing, etc. But it's also orthogonal (ding ding ding!), since some variables (like $lastban) are fully-qualified nick!user@host by default.

Turns out /dnd off didn't actually turn it off in the connection you typed it in. Now fixed.

Added anti-recursion logic to alias handling. This means you can now redefine builtin commands. Like, say you always want your /gaway to be silent, you can do /alias gaway /gaway -$*.

$channel now substitutes to "#name" instead of "(#name)" if the connection for the window is dead.

New $con variable (connection number)

Tweaked the fast-out clonekicker logic so that if you do an unban that matches an entry on the list of clones/flooders recently kicked, the entry is removed from the cache list. This lets the person rejoin after you unban them without getting instantly kicked again.

The /delay command now understands that @hh:mm:ss with a time less than the current date/time means to do it at that time tomorrow/after-midnight. Also, for the @ format, @hh:mm works correctly now (it used to be wrongly interpretted as @mm:ss).

010121

greets can now be by #channel:con:nick!user@host with wildcards in any component. Did a big rewrite of the greeter in general.

New commands /gconinput and /gchaninput for globally running hipscript commands.

Big reworking of ResolveVars() routine to make the new /gconinput and /ghaninput work right. Had to remove all the assumptions that the resolving should be based on currentchannel and currentconnection and make a way for con to be passed in with other stdvars.

Made main-script load process more robust. In particular, errors during plugin loading are now less likely than before to do Bad Things to your hipscript prefs.

Added $oldnick variable.

Made the banghandler() stuff work with @commands as well as !commands.

Made /swhois show the user@host info too.

auto-greeter now accepts #channel:con

/wavsend now handles quoted filenames

DIOS - chatops/globops are now formatted before specific server msgs, in the server msg handler.

DIOS - hsxWhoFormat functionality rolled into opercommands numeric handler.

DIOS - recache the servername name on a numeric 10000 event, in case it was wrong due to BNC the first time.

Added two new hipscript pseudo-numerics. 10001 means "hipscript is fully loaded, all handlers are initialized". 10002 means "hipscript is about to unload (but save/unload handlers haven't been called yet)". There may or may not be any connections active when these are called. 10001 may mean ircle just started and this is the initial load, or the user may have typed /load hipscript to reload; there's no way to tell.

New autoexec builtin category "load" -- commands to execute whenever hipscript loads or reloads.

Do not disturb is now a per-connection concept, and the config is persistant.

Well dalnet #macintosh had another of those massive join/part/clone floods we've all come to love over the years. As usual, this has resulted in some improvements to the logic in hipChannelOps that copes with such things...

We now ban a clone/join flooder with a mask of **W instead of **V. This should help when they have access to a block of IPs or hostnames.

We now add the flooder's hostname to the cache of recently-banned flooders only if it's not already there. (Duh!) This should help with those really high-speed floods where we were ending up with 500 identical entries in the cache.

When we bankick because of a join flood, we now also search for lurking clones matching the flooder's hostname and kick them all, even if they haven't exceeded the normal clone limit. This helps when some lamer parks a single clone in the channel to watch the results of his join/part flood.

001010

Rolled hsxIgnoreChannelCTCPs into hipMessagesAndCTCPs, added /ccignore command.

Added /cignore to do for private ctcps what /ccignore does for public ones.

Added /dnd command.

Fixed the auto-unaway lag problem.

dalstrike on reconnect now.

New /whereis ping.

000822

Fixed the dalnet unban me commands to match changes in dalnet services.

Added $lastban variable.

Added $lastquitter variable.

The $lastparter variable now includes parts via signoff.

/mignore won't try to ignore if there's a $ in the name/mask to be ignored.

/wping and auto-whois shows idle time if it's over 2 minutes

an autoquery window no longer opens if the persion is on your hsxIdiotHandler list.

/wavget now handles filenames containing spaces.

hsxIdiotHandler now has the concept of temp and perm entries on the idiot list.

hsxNickComp now includes a "Don't post this line" choice in the popup dialog to resolve conflicts.

hsxDice now copes better with lines that start with a digit and a d but aren't really dice-roll requests.

new command /wavdel trashes the last wav file you received, handy for those sucky/obnoxious ones.

The DCC transfer stats (the ones that show speed and get logged when you're away) now include the nick of the person you were transferring to/from.

Fixed a hidden bug in CloseDataFile() (for prefs) that would leak away file handles over time.

000507

Fixed the /dns <nick> coercion-fail bug introducted in the last release.

Removed /watchsound from the docs, since it's long been obsolete.

Fixed a /mignore bug where user@host without a nick would try to ignore *!*@*

When the target of an auto-whois or wping is no longer online by time the repsonse comes back, display that fact instead of waiting 3 minutes and saying the request timed out.

away reminders now happen whenever you're away and have let 5 minutes elapse without typing (instead of just once).

new parm to /aub, notwildcards

new parm to /autowhois, silent

new /gaway feature: -[words] for silent (un-)away.

new command /showprefix

000315

Incoming action msgs (/msg /me) now work with autoquery. They also now get logged.

Fixed a bug in msg/ctcp flooding that could result in a /mignore *!*@* being generated.

Fixed a bug in hsxIdiotHandler that caused a manually-specified mask to be overridden with an auto-generated wildcard mask.

New command /lastmsg re-displays the last msg you received.

When you un-away you now get told how many msgs were logged while you were away (handy if your msglogger window tends to hide behind other windows).

New command /autounaway.

We now track people who depart on netsplits and don't auto-whois if the split mends and they rejoin within 5 minutes.

We now track joiners by hostname and don't auto-whois the same hostname if we just did them -- in other words, if a clone flood is in progress, don't auto-whois them because it just lags us and makes it harder to battle the flood.

Did some more performance tweaking of join/clone flood protection. We now take the fast-out of kicking (without re-banning) a previously-detected lamuh in the join-flood case as well as the clone-flood case. Also, when banning a clone or join flooder, we also /mignore them, since it's a common tactic for them to flood you with CTCPs and MSGs and stuff to try to lag your response to the flood.

New auto-dns option "silent"; it DNS's everyone but reports nothing. Why do this, you ask? Makes iphostban faster.

When auto-whois throttling kicks in due to too many joins too fast, it no longer throttles auto-dns (becase those don't lag you), and it only reports that it's throttling if auto-whois is on, and only reports once every 5 minutes (instead of 3).

Pager now gives active feedback to the person who tried to page you.

New option /msglogger saytime

Fixed the ping-reporting option interactions. /rping on now results in reporting individual pings again, but not channel-pings.

000130

Fixed various -1753 "Disk <<script>> is disconected" errors. One was caused by trying to access an empty nick list for auto-nickfreshen in hipdalnet. Others were due to trying to TypeIn() or ShowIn() a window that was part of a closed connection.

Enhanced ProcessUserOptionList() to do its work quietly if the list-name parm is "".

Enhanced /mignore a bit to work better with hsxIdiotHandler.

Fixed /whereis to handle channels with more than 100 users by forcing summary-mode, and servers with more than 25 users by displaying summary mode for that server in the output, to prevent crashes in HipTools and Ircle from huge-long strings. 

Made the display of the +++ modem DoS stuff have space chars between the pluses. That way, when users cut the string and paste it back to the channel asking "What's this?" it won't hang them up.

000115

Changed the autogreeter so that if "NickNick" (pals list) translation ocurrs, $selecteduser contains the pal name. $lastjoiner is now the name of the joiner untranslated, and $lastjoineruser and $lastjoinerhost are now valid.

The autogreeter can now handle nick!user@host matching with wildcards.

When adding a new /greet, the default is now "nosayaway". This eliminates nasty surprises when you're using /greet to set up commands other than straightforward "Hiya" type greetings.

Fixed a bug in resolving variables of the form $n-

Added /save command, and hipsave() handlers.

The msglogger now always shows the source@host on logged msgs. It also uses hipEventCount instead of a manual list and idle handler to track when we last told someone we're logging the msgs.

Tweaked the dalnet preemptive strike logic; services no longer deop people on return from split, and it seems tobe working well. Now, if services are gone for more than 10 minutes we do an old-style premptive strike, otherwise we count on dalnet doing the right thing. The 10-minute choice is arbitrary and may need tweaking.

Various semi-useful bits of info are now exported to the plugins via the PublicData mechanism, at the request of plugin writers:

HipConfigFolder - string: Fully qualified path to config data
HipPluginFolder - string: Fully qualified path to MyHipPlugins
HipPluginSupportFolder - string: Fully qualified path to MyHipPluginSupport (GUI modules, etc)
HipStdPluginFolder - string: Fully qualfied path to HipPlugins
HipStdPluginSupportFolder - string: Fully qualfified path to HipPluginSupport (GUI modules, etc)
HipLoadedPlugins - list of strings: names of loaded plugins
HipNotLoadedPlugins - list of strings: names of not-loaded plugins (including ~namedPlugins)

These values are read-only, and do not change on the fly. (IE, NotLoadedPlugins are the ones not loaded when the script loaded, and anything added via /disable since then isn't reflected in the list).

Dropped support for the obsolete hipload() handler.

000101

Rewrote /nickfreshen to avoid flodding services when you have a lot of registered nicks.

Added /nickfreshen auto [days]

Updated auto-whois to handle dalnet's new "...is a registered nick" response on a /whois.

Fixed display of watch events in the away-log so the server name isn't shown twice.

hipDalnet now sends nick passwords quicker at connect-time again. This seems to fix some problems with people who use join commands in their autoexecs.

auto-whois doesn't tell you it's flood-limiting if it's turned off now. (D'oh!)

Big internal rearrangment of code, creating hipScriptLib2. Now there's room to add new things to the main module again.

hipWavSounds now logs post-DCC actions in the away-log.

991121a

Fixed the /aping silent option so it doesn't suppress pings you do yourself.

Made the wav-play stuff honor your ircle setting for ctcp-sound-enabled.

Added a really graceless hack to ensure that the msglogger gets the privmsg events last, so that all other loaded plugins can get a shot at handling them before it eats them. This should help bot-like plugins respond to msgs even when the bot is marked /away.

/notice #channel floods now handled better. ops can flood, others can't.

Added /ovcolorstrip.

Tried to fix the bug where an alias that does something to create a new window fails to put any following text or commands into the new window, but Ircle itself seems to prevent this. Left the code to handle it in InputIn(), in case Onno fixes the bug.

Server messages no longer trigger msg-flood protection. (D'oh!)

Incoming ACTIONs as msgs now correctly set $lastmsger and work with /querylast. And, channel actions no longer set $lastctcper.

auto-whois and auto-dns are now automatically disabled in channels for which the ircle ShowJoins is turned off.

Pretty much completely re-wrote the hipDalnet services flood prevention stuff. During a services-bounce episode, it now stops watching services for 1 minute, then starts re-watching. If services bounce again right away, it stops watching for 5 minutes at a time until things calm down. Also, it strives mightily to not send nickserv passwords and op-me commands multiple times in a row just because services are lagged.

If the user has ctcp sound disabled in ircle, hipWavSounds no longer does the depth-search for the sound just so it can report that sounds are disabled. This should help people who keep sounds disabled because they don't like how long it takes to search their massive volumes for files that'll never be found.

990829a

Reworked the dalnet logic to prevent services floods; it got messed up in the last round of changes.

hipScriptLib LoadNamedData() now uses the file handle you pass to it.

Added /reban command.

Added /aub quiet option.

/delay #n now takes x,y,z and x-y ranges.

All wav-related features now work with nested folders within the ircle sounds folder.

 

990814b

Fixed a potential divide-by-zero bug in the new DCC speed reporting.

Recompiled HipTools from scratch; this seems to clear up some mystery glitches.

990814a

The bang (!) command handler now has protections against the modem command lameness, same as CTCPs.

New faster logic for dealing with clone and join floods when you're an op. Join floods now use the new flood counter from HipTools. Clone floods have a new fast-out logic where it notices that a new joiner is a recently-detected clone-flooder, and punts them immediately without doing the full comparison of the hostname against all the other hostnames in the channel. (Talk about having a Blinding Flash of the Obvious.)

Converted msg/notice/invite/ctcp flood counting to new HipTools flood counter. Also, the logic in hipDalnet to prevent flooding services.

When you switch nicks on Dalnet, your password is now sent before being prompted, if you switch to a registered nick.

Auto-whois and auto-dns now turn themselves off temporarily when there are more than 8 joins in 20 seconds in a given channel. (Uses the new HipTools flood-counter.) This should help with join/clone flood performance too.

DCCs now show K/sec on completion.

Discovered that hipDalnet was still keeping a /watch list, even tho hipNotify is responsible for that now. This might be why some folks were having trouble with deleting watch entries and having them come back to life. Now only hipNotify has the list.

New routine KickUser() routes the kickmsg thru ResolveVars(). This means things like autokicks can now contain $vars. Both $lastjoiner and $selecteduser will be the nick of the person you're kicking (even if they're not selected in the user list and/or aren't the last joiner.)

Added the long-lost /rnakick command. It works better this time anyway. It allows autokicking someone based on a combo of their irc realname+nick!user@host, with wildcards.

990728a

New option for /aping, now accepts "silent" as well as "on" and "off". Silent pings people without cluttering up your windows with reports of doing so.

Doing /aub off now properly displays a confirmation of the change.

Adjusted the nickserv prompts that hipDalnet responds to and filters out, to match the rewritten dalnet services.

Plugin input() handlers are now called before commands and aliases are dispatched. This lets an input handler modify the input string and feed it back in via InputIn() even if the string is a command, alias, or bang line.

Clone checking is now bypassed in channels with more than 200 users in them.

If someone requests a ping and they/re already on the pending-ping-report list, it doesn't ping them again.

Reimplemented flood detection and aging.

New command /wavsend

If the ircle download and sounds folder are the same, the post-dcc processing for received wav files no longer chokes.

You can no longer /alias alias ...

Added %prompt() for /button

Fixed a bug in the $lastjoiner support in ResolveVars()

990430a

3rd-party plugins can now add $variables to be handled by the ResolveVars() routine. By definition, 3rd-party variables have the form $(varname), and they are stored by the 3rd-party plugin using SetPublicData("$(varname)", "string value"). (Why I didn't think of this trivial-to-implement solution months ago is the real question.)

New module hipWavSounds (formerly hipSendSounds) with new commands:

/getsound - Get last sound played that you don't already have.
/wavinaction - Off, Move, Play -- Action to take after receiving a .wav file
/wavmute - Off, On, Away -- whether to mute the playing of wav files
/wavnoreplay - time in seconds to suppress playing the same .wav again
/wavresplay - Whether to play resource-based sounds (~kick, etc) from users
/wavsendlimit - Max number of !nick filename.wav to be sending at once.

CTCP and Message flood ignore integrated (hipCTCPs no longer exists). /cignore and /mignore are the same command now. A /mignore now informs the lamer the he's being ignored (if it can figure out the nick). New command /mignoreq to quietly ignore without informing.

Ircle's /cping command and Ping button in the user window are now more properly integrated with hipPingReporting. This eliminates spurious ping reports on a channel ping.

Watch events are now logged to the away-log window when you're /away.

The support for the watch command on dalnet is now split out into a new module, hipNotify. Important New Things will happen with watch/notify support soon, this is a step towards it.

The /autoaway command now accepts on|off parms, and remembers your time setting when you use them.

The installer now turns off the spinning beachball cursor automatically. At least, it tries to.

Commands which have a config list of names and associated values (aliases, autokicks, etc) will now automatically do a wildcard-type listing when you supply just the name. For example, /alias abc will list all aliases with 'abc' in the name.

The /bannick command can now ban someone who isn't in the channel you type it in. Good for those drive-by lamers.

All bans placed by hipscript (/bannick, /autokick, flood kickers, etc) now ban both hostname and ip address. New command /iphostban [on | off] to control this. (On by default.)

New command /playsound in hipAliases, to play a sound locally without sending it to channel/user.

The /autodns command now has an "all" option; when used, it will do name->ip lookups on all joiners. The "on" option continues to do only ip->name translations on unresolved joiners.

When we respond to a CTCP HIPSCRIPT we now display it like Ircle does for other CTCPs.

The autogreeter now does the greeting via InputIn() instead of TypeIn() for a public greeting. This means that greetings can be multi-line, and contain hipscript and ircle commands.

Added a protection against a specific type of modem-based ctcp DoS attack which I'm not going to detail here because I don't want to inspire any lamity by describing how to do it.

Added an explicit coercion to 'file' type in hipSendSounds, since OS 8.6 seems to choke on the implicit coercion.

Fixed a HipTools bug in hipParseNickUserHost that would cause it to misbehave if you tried to parse a string of "nick!" (which ircle will hand back to you as the nickuserhost value for a user that hasn't been /userhost-resolved yet in a channel).

The /whereis command now refuses to do anything if it's entered in a window other than a channel window. This prevents you from getting flooded offline with a /who of all users online.

New standard variable $lastdelayedcmdnum contains the index number of the last delayed command that was scheduled. Can be used to create aliases that place a ban then automatically cancel the auto-unban, among other things. (Note that to do this, the cancel-auto-unban part must be an alias of its own that is referenced from the ban-with-cancel alias.)

Reworked the join()handler in hipChannelOps a bit. It now checks for join-flood before checking the autokick list, so that coping with join floods might be a bit faster. It also now considers only the hostname (not user@hostname) in determining a join flood, to foil floodbots that randomize the username. Because of this change, it also now ignores join floods from any host that matches the cloneokay list (to allow for things like all the dalnet ops using macpower.org BNC host).

990320a

Massive rewrite of internals to use the new HipTools osax. Speeds things up a bit and makes the code smaller.

Added /xwhois command, for doing extended-whois when your ircle prefs are set for non-extended.

Added /button command to allow you to define your own buttons, or override Ircle's buttons.

Added /bnum command to allow you to figure out what button number a given button is.

The /whereis command now uses /who instead of /whois internally, and is way faster. (Thanks to DustBustR for clueing me in on this one.) Also, whereis now displays the full server name, which is a bit more useful on networks where the first node of the name tends to be "irc" for all servers.

981202

Added support for new Ircle 3.0.x event handlers, button() and icmp().

Added a new "fake numeric", command=10000, for plugins to use. This event signals that the connection to a server is complete, and the server is ready to accept commands. It is not foolproof, but it's better than the old method of having handlers key off a numeric 376 (end of motd). It still uses the 376 as a trigger, but only the first 376 to come in after the connection is opened. Also, if the server doesn't have a motd, the 10000 event is triggered 10 seconds after the connection-complete (bogus, but what can we do?).

981129c

Small fix to the installer.

981129b

Just recompiled everything for Ircle 3.0.3US.

981129a

Added new options 'qadd' and 'qexec' to the /delay command. This allows other plugins to schedule delayed execution of a command with cluttering up the window with the normal delayed-command stuff.

Added command /dalstrike to manual force a preemptive strike to happen immediately.

Added command /nrping to let the user maintain the list of nicks for which ping-times are never reported back to the target.

981012d

Fixed a glitch in hipScriptLib that gave an error when using the $selectedusername variable in an alias.

Fixed the installer script to work better on non-USEnglish systems. It uses the new OS 8.x "path the scripting additions" if it can, otherwise it tries to locate the folder in the usual places, and if all else fails, it asks the user to locate the folder with a folder-chooser dialog.

The list of disabled plugins is now displayed at load time, so users won't wonder why something isn't working.

981012c

Fixed a rather serious bug that would pop up an Applescript error when a message came in while you were /away, and you didn't have the ircle timestamping options on.

981012b

Fixed a bug that caused hipScriptLib to be added to the disabled-plugins list again each time HipScript was loaded. This list just kept growing forever. (Can you say "Out of Memory"? I knew you could.)

Fixed the installer script to automatically increase Ircle's memory partition to 3500k if it wasn't at least that already.

981012a

Moved pager from hipAway to hipCTCPs.

Massive internal changes to improve load time.

If you're paged while you're /away, it's now logged in the msglogger.

The msglogger now timestamps the lines if the user doesn't have the ircle timestamp option set.

The /aping off command now properly disables responding to !ping as well. Also, the local user can type !ping to get other people's scripts to respond. (It used to give a silly error.)

Installer script now part of the package. 

980712b

Fixed a typo that causes the channel list in an autowhois-all to not show up. Doh!

980712a

ACTIONs (/me) are no longer considered in watching for ctcp floods.

In auto-whois, when a user's realname contains colors or text attributes, the output is reset to normal after the realname display, so the rest of the line is readable.

Autoquery now opens a query window in the right connection, when you've got multiple connections open.

New command, /msgloggersound.

/dns now works with nicknames as well as hostnames.

New command, /bannick.

New command, /getsound.

New command, /whereis.

980530a

If the pager is off, the ctcp page is now passed thru to other plugins.

If you're /away, dcc chat requests are no longer auto-ignored by the script.

New command, /msgfloodokay, lets you set nick!user@host masks of folks who are allowed to "flood" you.

When hipscript short-circuits ircle's normal processing of events (like routing notices to certain windows, or auto-opening a query window), it now plays the sound as configured in standard ircle prefs.

When a query window auto-opens, the channel window that was previously active is now re-topped (unless a dcc chat was topped, because ircle has a bug with that).

Removed the /watchsound command; watch sounds now use the user's Ircle preferences for Notify sound.

980509test (limited release)

If you have a query window open to someone who's /away, you no longer see the away msg from the server for each line you send to them.

If you have no active connections, you won't get set auto-away anymore.

Now if you enter /away when you're not away in that connection, the ircle dialog box comes up like it should.

When the /dalverbose secure option was set and the script automatically replied to a nickserv prompt, it would show the password rather than nickname it was sending. Not very secure. Fixed now.

If you were mode +s, and an ircop killed a bunch of clones, that would look like a flood of notices and try to /mignore **!*@*. Now the flood logic ignores server msgs.

980429a

Fixed a glitch in auto-away: if you're auto-away and manually enter a /away or /gaway command, it clears the internal flag that says you're auto-away; having that flag set after you manually reset the away msg led to some odd behaviors.

MaskNickUserHost() in HipScriptLib now checks for a * in a name already, and if it's there, it doesn't try to wildcard it any further.

980424a

New routine DeleteNthNamedData() for delete-by-number in user interface.

/autoexec now allows multiple entries for a given mask. Like, you can have any number of separate entries to execute on *.dal.net, etc. You have to delete such entries by number.

Fixed a bug in hipChannelOps: the idle handler was never getting called, and thus the lists of clones kicked and banned would never get cleaned off.

Added /nickflood, /joinflood, /ctcpflood, /msgflood, all for protections against being flooded.

The /clonelimit command now lets you set a kickmsg like the other flood commands.

Lines in the message log now appear in the user's selected message color.

Channel-releated notices routed to a channel window now appear in the user's selected notice color. Also, more notices are now routed correctly (catches [*#channel*] type stuff.)

Added /awayinfo command.

Added /autoaway command.

Dalnet watch events are now displayed in the user's selected notify color.

Fixed a bug in storing the pager on/off/away status (it was always coming up as On at load time).

980405a

Fixed a bug in hipSendSounds that would cause script errors if running on an older version of ircle that doesn't support changing dcc protocol from a script.

Fixed a bug in setting up delayed commands that was causing bans placed by other parts of hipscript to not get an auto-unban scheduled for them. (Needed to be using con, target throughout in _delay()).

Changed the ov notice router to output the notice in the user's configured notice color.

Added $lastXXXXnamemask and $lastXXXXhostmask variables.

Added /autokick command.

980229a

Fixed a bug in the auto-whois timeout logic. (Bad variable name in the idle handler).

Improved the logic for handling dalnet services bounce.

980328a

Added a feature so that if a file to be sent by hipSendSounds is an alias, it sends the file the alias points to, not the alias itself. (Really, ircle should handle that properly.) Note that this logic contains a workaround for a Finder bug: in getting the original item an alias points to, Finder has the rude habit of topping itself. The code re-tops Ircle to compensate. This is not ideal, in the Ircle might not've been the top app to start with. Oh well.

Added logic to hipWhois so that auto-whois and auto-dns never have more than 10 outstanding requests. This helps with channels like #funfactory where there can be 100+ joins per minute and the server just can't feed us the whois results fast enough.

Added logic to hipWhois so that instead of having one outstanding whois per nick, it's now one per nick per connection. This is handy for wping from two connections to see which route is faster to a user.

Added /dalverbose command.

Fixed the autogreeter so that if it finds a type of greeting (say, Pals) that is inactive, it keeps searching for other types of greetings (say, by-channel) that might apply.

Changed /away to /quote away in the /gaway processing, so that you only get un-awayed once per connection (since Ircle gets it wrong).

Began converting the !hipscript command support to /ctcp <user> hipscript.

hipSendFiles now automatically sets the DCC protocol to MacBinary if the file has a resource fork, binary otherwise, and then restores the user's prefered protocol.

Fixed a bug in the last CTCPer/MSGer logic that would prevent it from updating the variables if new msg/ctcp came in from the same sourcehost but a different nick than last time.

Fixed a bug in hipDalnet where IdentifyImportantNicks() would try to send an identify command for a nickname not in the registered nicks list.

Moved the logic that saves lastCTCPer and lastMSGer into hipScriptLib, so that you don't need to be using hipCTCPs or hipMessages plugins to use corresponding $last.... variables. Also, tweaked the logic to store the info as strings and parse them into nuhRecords in ResolveVars() for better performance.

The hipCTCPs plugin now ignores requests to send a directory listing of sound files. If Onno makes this an ircle prefence, this feature can go away. If he doesn't, this hipscript feature can be made settable.

New greeter option 'awayonly', displays the greeting only if you're /away.

980319a

New utility routines DisplayUserOptionList() and UpdateUserOptionList() in hipScriptLib. These eliminate identical code in each plugin using a simple list of options, and ensure that all lists behave the same (list with numbers, delete by number works, etc). Still need to do something similar for semi-simple lists (like the Pals list) that consist of name/value pairs.

New command /disable to manage plugins.

Applied Valydius' fix to the clone kicker logic that prevents re-kicking the same clones repeatedly, which could result in getting killed for flooding kick commands. Also, added logic so that a /clonelimit value greater than 50 disables clone detection and kicking completely.

Fixed the error that would happen during loading if you had folders nested inside the plugins folders. It still doesn't load plugins from nested folders (it should) but at least it doesn't die over the presence of nested folders.

980317

Added sayaway option back to the autogreet settings.

Improved performance of utility routines FirstWord(), AllButFirstWord(), SplitAtFirstWord(). (Note to self: the AS "offset of <char> in <string>" is REALLY slow compared to text item processing!).

Used what I learned about performance of text items to speed up the load times a little bit.

980307a

Fixed a bug in dispatching idle events to plugins. Only the first registered idle handler (hipDelayedCommands) ever got called. This led to an ever-growing list of ping reporting stuff, since the list cleanups happen in the idle handler there. Eventually, you could run out of memory.

Added /swhois (short or summary whois) command.

Added logic to timeout an auto-whois after 2 minutes, so the list of pending replies wouldn't grow forever if the user dropped offline or something.

Added $lastMSGer and $lastCTCPer families of variables for aliases.

980228

Fixed a glitch in /autoexec processing, where the $nick variable in a command wasn't resolving to the nickname of the connection just made (ircle bug, imo; put in a workaround).

Fixed a glitch in the new clone detector logic. Now it detects clones again.

/showcolor now allows numbers from 0 thru 31.

Fixed a bug that would cause an AS error box to pop up on the first incoming message to the messagelogger if the top window wasn't a normal channel. (Long-standing Ircle bug with the select command.)

Fixed the auto-sound-sender so that if you have clones in the same channel, only the nickname addressed responds to the ! request, instead of all the clones.

Added logic to hipDalNet so that if nickserv bounces on and offline lots of times fast (like a bad server resync) it'll stop watching that nick for a minute.

980225a

Consolidated and renamed some plugins: hipAutoWhois is now hipWhois. hipAutoUnban is now hipChannelOps, and contains what used to be hipCloneCheck.

Added the /msglogger command and a rather unique message logger to hipMessages.

Added the /wping feature to psuedo-ping a user.

Added the /autoexec feature, since Ircle can't do HipScript commands or aliases in its autoexec.

Made some performance improvements in the clone detection and kickban routines.

Added a hack (conceptually horrendous, but rather elegent in code) that improves performance of handling aliases by tightly coupling the main hipscript input() handler with a special handler called aliasinput() in the hipAliases module.

Made another pass thru all the plugins, making sure that calls to hipScriptLib routines use direct calls via gHipLib rather than vectoring thru hipscript, at least in the case of all event handlers (but not necessarily all usercommands right now). IE, more performance tweaks.

Removed the /mode yournick +i hack from hipDalNet, since that's now better handled (for users that want to be invisible) with /autoexec *.dal.net /mode $nick +i.

980220

Eliminated the hipMiscCommands plugin; moved the /gme and /gsay commands to hipAliases. (Just to cut down on plugin load-time overhead.)

The sound file autosender now handles filenames that contain spaces, enclosed in quotes.

hipDalNet plugin now sets /mode yournick +i at connect time, since ircle and dalnet aren't getting along right now in this regard.

Fixed the ShowIn() routines per a discussion with Onno. Things should now always end up in the right window, in the right color, even on multiple connections.

980219a

Fixed a minor bug that would detect a "ping me" when that isn't what the user really wanted. (Shame on me.)

Removed all dregs of the internal help system, it wasn't working out. (And the html docs are better).

Converted all docs to html format.

Fixed /mignore last and /cignore last to completely wildcard the nick, as well as the smart user@host wildcarding.

Added the auto-whois and auto-dns features.

980211a

Fixed major buggage in the list and record utilities in hipScriptLib. When I converted the utility routines to use Ircle's match command for better performance, I hadn't considered what would happen if the list items or item name contained wildcards. Answer is: Bad Things happen. Now, the match command is used to quickly generate a list of candidate items (99% of the time it'll only be one item matched), and then that list is further checked for an exact match in the AS code.

Fixed a bug in MaskNickUserHost() that was putting two @ symbols in a wildcarded hostname.

Enhanced "/mignore last" and "/cignore last" to wildcard the user@host part of the name intelligently.

Changed the handling of the /watch command so that a leading + character is no longer needed to add items to the list. I hesitate to do this, but I'm sick of typing that +. The downside is that if dalnet adds any new options (besides 'l' and 's') to the watch command, we'll misinterpret them as items to add to the watch list when the user enters them. Then a new release of hipscript will be needed.

Added new features to the delayed commands time handling, including @hh:mm:ss to set a command to run at an absolute time instead of relative to the current time (use 24-hour-clock time or append PM to the time string as needed). Also, you can now adjust an existing delayed command relative to the current time with .+hh:mm:ss (the leading dot makes the adjustment relative to now; without the dot it's relative to the scheduled time). This allows things like "/alias d1 /delay #$1 .+00:01:00" to have "/d1 n" change the time on command #n to 1 minute from now.

Fixed a glitch where a failed load of hipscript due to hipScriptLib not found would lead to a Stack Overflow error when you tried to /[un]load. Now a failed load gives a friendlier error message, advises that you /unload immediately, and doesn't stack overflow.

980207

Enhanced the /watch support (it now locally filters on user@host, since dalnet won't do that for you). Added /watchsound command.

980126a

hipDalNet now keeps the /watch list in the config data and sets all watches whenever you connnect to a dalnet server.

980124a

Improvement in load time and memory usage. (Changed the way gHipLib is passed to plugins that use it; it was making many copies of the hiplib module in memory.) On my machine, load time has dropped from 15 to 9 seconds. Other users report improvement as much as 75->20 seconds.

980112

HipScripLib was getting loaded twice; it doesn't anymore.

980103

Fixed a bug in the wallops() handler (wallopsHandlers property not defined).

Added logic to hipDalNet preemptive strike to prevent getting killed for flooding services, even if services misbehaves very badly (like logging off/on 10 times in 20 seconds because some lamebrain oper does a /kill nickserv).

Added logic to hipDalNet to keep track of the nickname under which you have sop/aop privs in each op channel. On a preemptive strike and at logon, it identifies to nickserv for all such nicknames, even if that's not the name you're using at the moment.

980101

Performance tweak of all plugins to try to improve load/unload times. (Somewhat successful).

New variables for ResolveVars(); $selectedusername, $selecteduserhost, $lastjoinername, $lastjoinerhost. These work in aliases, but not in autogreets. Also, $* for ircII lovers (but $0 is still "all params" too, for compatibility).

Fixed a bug in delayed commands that could leave you with the same command in multiple places on the list if you adjusted the time backwards on it.

971231a

Complete rebuild of the bang (!) handling system.

971229

Finished up the hipCloneCheck plugin.

Made ping reporting more robust when it receives bogus ping replies from lamer scripts.

Fixed some glitches in the exampleBartender plugin.

FIxed the /aping command so that /aping off actually works now.

971228

Fixed a bug in handling delayed commands -- if you're not in the channel where the command is to be entered, it would error out. Fix was to put an on error section into InputIn().

971226a

Added /showcolor command so user can set whether the script displays in red (color 2) or not, since Onno can't make up his mind about supporting colors in scripts. Colors other than 0 will work only if you have the 12/21/97 release of ircle b10.

Added hipMessages plugin, including /autoquery command, and /querylast command. /querylast is best aliased to something like /q, and will open a query window to the person who last sent you a message. /autoquery auto-opens a query window when a msg comes in.

971223a

Added a feature to ResolveVars() (used by aliases) where $2- means "the second and all following values". (Creeping ircii-ism.)

Added a pager to hipAway.

971221a

Fixed a bug in bang handling, where a public !hipscript would cause all users to publicly report their version. What a flood! Now it reports privately to the requestor again, even for a public request.

Also, an example simple bartender plugin is now included, but by default it doesn't load.

971220b

Minor fixes to hipDalnet.

971220a

Internal cleanups and enhancements to bang handling and NamedData routines.

971218

Optimized handling of numeric() in plugins by letting plugin specify which numerics it wants.

Added "•••" prefix to output displayed by script; yet another workaround for the fact that we can't display in color like we used to.

971217a

Added support for the new DalNet /watch command (like /notify only better).

Added "preemptive strike" logic to hipDalNet to send your nickname password and re-op commands for any channels you're in as soon as Nick/ChanServ rejoin after a netsplit. Also, the nickserv password is sent as soon as you log on as well as when prompted; this helps folks who use access masks and don't get prompted at logon time.

971215

Well, Onno finally released b10, and it has all the bugs of b9 plus some new ones. So, I added a workaround for the bug where text typed into a dcc chat window by a script doesn't echo locally.

Added a new command, /aping, for turning the auto-ping (ping me) feature on or off.

Fixed the logic for greet-by-name so that even if a person is in the pals list it'll find their name in the greet list instead of using the generic Pals greeting.

Converted 'display' to 'echo' for local displays. This at least gets us blue text for script output.

971214

Complete rewrite from earlier versions. All features of earlier versions are supported in this version, except for metric conversions and ctcp reply spoofing.