#
#######################################################################
#######
###### TISii - The Irritating Script II v0.14d
#####
#### by Juggler/BTL
###
##
#
# NOTE: This script uses serial numbers 00, 70..90 and -70..-90 for hooks.
# To find the sections that use serial number 00, search for "#00".
#
# WARNING: Until the script reaches version 1.0 you can assume that it
# is NOT finished, and WILL have bugs/unimplemented features.
#
@ s.TIS_VERSION = [The Irritating Script II v0.14d]
##############################################################################
###
## CHANGELOG
#
#
# 0.14d - 12.07.2001:
#
# Replaced old email and FTP addresses with current information.
#
# 0.14c - 11.07.2001:
#
# Fixed problems with s.wxecho, so messages etc. will go to the
# proper windows again. Added code for printing the time/date every
# 10 minutes when away (useful in logs). Started maintaing this
# changelog.
#
##############################################################################
###
## CONFIGURATION!! Its not a bad idea to edit the following lines...
#
### This tells the script where to store its data files!
##
# The script checks if this is valid, if it does not exist it tries to
# create it - and if all fails it uses the current directory.
#
# Default: @ s.TIS_HOME = [$(HOME)/.tisii]
#
eval if ([$HOME]!=[]) {
# Use the home directory..
#
@ s.TIS_HOME = [$(HOME)/.tisii]
} {
# Default to current dir if $HOME is not set..
#
@ s.TIS_HOME = [$W]
}
###
## Some misc. commands/scripts/binds that I like
# (and don't conflict with TISii)
#
^bind ^I next_window
^bind ^B self_insert
^bind ^V self_insert
^bind ^_ self_insert
^bind ^N switch_channels
load cursor
load edit
load imap
eval echo [!] Bound: ^I (TAB) switches windows, ^N switches channels.
eval echo [!] imap, edit, cursor loaded. Try $(K)edit and $(K)initmap
^eval $(K)$(K)mode $N +i
^set verbose_ctcp on
##############################################################################
###
## The following are DEFAULT values for the script loading feature.
# These can be changed with /i config load..
###
## Modules:
#
@ s.cfg.load.MISC_HELP.d = [Miscellanious help for the script. 1..load]
@ s.cfg.load.REFORMAT_CHANNELS.d = [Change the way channels look? 0..no, 1..yes]
@ s.cfg.load.REFORMAT_MESSAGES.d = [Change the way private messages look? 0..no, 1..yes]
@ s.cfg.load.REFORMAT_STATBAR.d = [Change the status bar? 0..no, 1..yes]
@ s.cfg.load.MSG_HISTORY.d = [Message history code. 1..load+enable, 2..load]
@ s.cfg.load.FLOOD_PROT.d = [Flood protection code. 1..load+enable, 2..load]
@ s.cfg.load.QUIET_DESYNCH.d = [Desynched channel code. 1..load+enable, 2..load]
@ s.cfg.load.QUIET_SPLIT.d = [Netsplit signoff/join filter. 1..load+enable, 2..load]
@ s.cfg.load.CHANNEL_CODE.d = [Commands for chanops. 1..load]
@ s.cfg.load.NOTIFY_STUFF.d = [$(K)Notify code. 1..load+enable, 2..load]
@ s.cfg.load.AWAY_STUFF.d = [$(K)Away related code. 1..load+enable, 2..load]
@ s.cfg.load.LOADED_BLURB.d = ["Script loaded" message: 0..none, 1..normal, 2..brief]
@ s.cfg.load.MISC_HELP = 1
@ s.cfg.load.REFORMAT_CHANNELS = 1
@ s.cfg.load.REFORMAT_MESSAGES = 1
@ s.cfg.load.REFORMAT_STATBAR = 1
@ s.cfg.load.MSG_HISTORY = 2
@ s.cfg.load.FLOOD_PROT = 2
@ s.cfg.load.QUIET_DESYNCH = 2
@ s.cfg.load.QUIET_SPLIT = 2
@ s.cfg.load.CHANNEL_CODE = 1
@ s.cfg.load.NOTIFY_STUFF = 2
@ s.cfg.load.AWAY_STUFF = 2
@ s.cfg.load.LOADED_BLURB = 1
###
## Emulations:
#
@ s.cfg.load.EMULATE_TABKEY.d = [Emulate the TABKEY script (msg hist uses TAB instead of ^R)]
@ s.cfg.load.EMULATE_TABKEY = 0
# Default toggle values:
#
@ s.cfg.load.CHANNEL_CODE.auto_rejoin = 1
@ s.cfg.load.CHANNEL_CODE.nick_cache = 1
@ s.cfg.load.CHANNEL_CODE.no_server_modes = 0
## End of configuration - stop editing now.
eval load $(s.TIS_HOME)/tis2.ini
##############################################################################
###[ MISC ALIASES ... ]#######################################################
##############################################################################
@ s.help.new.a = [A brief history of new/changed features. To read]
@ s.help.new.b = [each about change type: $(s.C.UNDERL)/i help ]
@ s.help.new.c = [ ]
@ s.help.new.v011b = [ v0.11b .. nicklist, flood, messages]
@ s.help.new.v012b = [ v0.12b .. config, rebind, set, save]
@ s.help.new.v013b = [ v0.13b .. config, save, wordcmd, topic, messages, ban]
@ s.help.new.v014b = [ v0.14b .. help, flood, unban, nickcache]
alias m msg
alias d dmsg
alias ig ignore
alias wi whois
alias whosi wi
alias whios wi
alias unig {ignore $0 NONE}
alias rs parsekey refresh_screen
alias dk dcc close
alias umode {$(K)$(K)mode $N $0-}
alias k {kick * $0-}
alias back {away;comment}
alias hold win hold_mode on
alias nhold win hold_mode off
## TISii enhancements:
#
alias n i.names
alias l i.leave
alias j i.join
alias w i.who
alias t i.topic
alias names i.names
alias leave i.leave
alias join i.join
alias who i.who
alias list i.list
alias topic i.topic
alias mode i.mode
alias op {i.mode * +ooo $0-}
alias dop {i.mode * -ooo $0-}
alias vop {i.mode * +vvv $0-}
alias dvop {i.mode * -vvv $0-}
alias msay {i msay $0-}
alias query {i query $0-}
alias version {i version}
@ s.help.aliases.a = [This is a quick list of the shorthand aliases - the ones you will]
@ s.help.aliases.a0000 = [probably use the most. This includes any "emulation" aliases.]
@ s.help.aliases.a0001 = [ ]
@ s.help.aliases.ppl0 = [People: m=msg, d=dmsg, ig=ignore, unig, wh=whois]
@ s.help.aliases.lists = [Lists: n=names, w=who, list]
@ s.help.aliases.misc = [Misc: rs=refresh screen, dk=dcc close, umode, version]
@ s.help.aliases.ch0 = [Channels: msay, l=leave, j=join, k=kick, t=topic]
@ s.help.aliases.ch1 = [ op, vop, dop, dvop]
##############################################################################
###[ CORE ROUTINES ... ]######################################################
##############################################################################
###
## Some settings to make things work better..
#
^set input_aliases off
^set novice off
^set max_recursions 50
^set exec_protection off
^set hide_private_channels off
^set show_channel_names on
^eval set load_path .:$LOAD_PATH
^set lastlog 100
^set lastlog_level PUBLIC MSGS NOTICES ACTIONS DCC CTCP CRAP USERLOG1
^set indent on
^set -continued_line
^set tab on
^set tab_width 8
^set clock on
^set flood_warn off
###
## Some more for EPIC..
#
eval if (rmatch(x$J *EPIC*)) {
^set MODE_STRIPPER off
^set C_LIKE_PARSING off
}
if (s.cfg.load.REFORMAT_STATBAR) {
^set status_format %Z %A%T %*%@%N%#%Q%C%+%S%F%H%B %W%>%M %U%X%Y
^set status_user [Try /I HELP or /HELP]
^set status_user3 i
^set status_query [/msg %Q]
^set status_mail mail(%M)
^set status_notify act(%F)
^set status_away [AWAY]
^set status_hold -M0RE-
^set status_hold_lines %B-
^set -status_overwrite
^set -status_insert
}
# What were these for?
#timer 0 ^window name TIS
#timer 0 ^window level NONE
###
## Misc internal ASSIGNs..
#
@ s.NONNUMERICS = [ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz`~!@#\$%^&()-_=+\\|{};:'"<>,./?\]\[]
@ s.NONASSIGN = [`~!@#\$%^&()-=+\\|{};:'"<>,./?\]\[]
@ s.REF.HELP = [880001 10]
@ s.save.file.CFG = [tis2.cfg configuration]
@ s.save.vars.CFG = [Settings: s.set]
@ s.save.file.LISTS = [tis2.sav lists]
@ s.save.vars.LISTS = [Lists: s.list]
@ s.save.file.LOAD = [tis2.ini load]
@ s.save.vars.LOAD = [Modules/Emulations: s.cfg.load]
@ s.save.file.MISC = [tis2.dat miscellania]
@ s.save.vars.MISC = [Noises: s.misc]
###
## These aliases are updated as the script loads, and end up containing a
# list of commands to execute when /i config xx has completed, if anything
# was altered. Allows me to keep hooks as small and fast as possible,
# without losing flexibility. Eats memory though.. ah well.
#
@ s.rehashcmds.MISC = [comment]
@ s.rehashcmds.LISTS = [comment]
@ s.rehashcmds.LOAD = [s.echo NOTE: Changes will take effect NEXT time you load the script.]
@ s.rehashcmds.CFG = [comment]
@ s.cfg.lastcmds = [comment]
@ s.C.SPACE = [ ]
@ s.C.BEEP = []
@ s.C.REVERSE = []
@ s.C.BOLD = []
@ s.C.UNDERL = []
@ s.C.CTCP = []
@ s.C.CTRLC = []
@ s.C.JUNK = [$(s.C.BOLD)$(s.C.BOLD)]
@ s.C.PHIGH = [$(s.C.BOLD)]
@ s.C.CHIGH = []
@ s.X = [\[$(s.C.BOLD)i$(s.C.BOLD)\]]
@ s.H = [\[$(s.C.BOLD)h$(s.C.BOLD)\]]
if (s.cfg.load.MISC_HELP) {
@ s.help.usage.a = [For each command there is a syntax description like this:]
@ s.help.usage.b = [ ]
@ s.help.usage.c = [ Usage: $(s.C.UNDERL)$(K)i COMMAND \[optional\]]
@ s.help.usage.d = [ ]
@ s.help.usage.e = [In these descriptions the "|" character stands for "or".]
@ s.help.author.a = [The Irritating Script II (TISii) is written by Juggler/BTL.]
@ s.help.author.b = [Please send bug reports, comments or suggestions to bre@klaki.net.]
@ s.help.author.c = [This script is released to the public domain.]
@ s.help.author.e = []
@ s.help.author.f = [See also: $(s.C.UNDERL)/i help updates$(s.C.UNDERL) and $(s.C.UNDERL)/i help register$(s.C.UNDERL)]
@ s.help.updates.a = [The newest revision of TISii can be found at:]
@ s.help.updates.b = [$(s.C.UNDERL)http://bre.klaki.net/programs/irc/tis2.irc]
# misc help..
}
if (s.cfg.load.EMULATE_TABKEY) {
@ s.help.emulation.a = [...]
# emulation help..
}
###
## Misc internal ALIASes..
#
@ s.misc.reformatted.d = [Prefix for reformatted messages.]
@ s.misc.reformatted = [***]
alias s.rehash.rxecho {
eval ^alias S.rxecho \{xecho -LEVEL $$0 $(s.misc.reformatted) $$1-\}
}
@ s.rehashcmds.MISC = s.rehashcmds.MISC ## [\;s.rehash.rxecho]
eval alias S.echo \{xecho -LEVEL USERLOG1 $(s.X) $$0-\}
eval alias S.xecho \{xecho -LEVEL $$0 $(s.X) $$1-\}
eval alias S.hecho \{xecho -LEVEL USERLOG2 $(s.h) $$0-\}
alias S.wxecho {
if ([$s.lastecho]!=[$2-]) {
xecho -WINDOW $1 -LEVEL $0 $(s.C.JUNK)$2-
@ s.lastecho = [$2-]
} {
@ s.silent = 0
}
}
alias S.nickonly {
@ function_return = [$left($index(! $0) $0)]
}
alias S.uhostonly {
@ function_return = [$strip(~ $mid(${index(! $0) + 1} -1 $0))]
}
alias S.ruhostonly {
@ function_return = [$mid(${index(! $0) + 1} -1 $0)]
}
alias S.Wordfrom {
# INCLUSIVE - from, and including word N
#
@ function_return = [$(${[$0] + 1}-)]
}
alias S.Wordto {
# EXCLUSIVE - to, but not including word N
# .. This means that if WordFrom and WortTo are used together, then
# .. the string is returned in full. As it should be. :-)
@ function_return = [$(1-$(0))]
}
alias S.NotWord {
# Arg $0 means the same thing here as for $word()
# Idea ripped from TABKEY - but mine *much* is smaller! :-)
#
if ([$0]) {
@ function_return = [$(1-$(0)) $(${[$0] + 2}-)]
} {
@ function_return = [$2-]
}
}
alias S.c2s {
# Char to Space.
#
@ s.c2s1 = [$1-]
@ s.c2s2 = index($0 $s.c2s1)
while (s.c2s2 != -1) {
@ s.c2s1 = [$left($s.c2s2 $s.c2s1)$(s.C.SPACE)$mid(${s.c2s2 + 1} -1 $s.c2s1)]
@ s.c2s2 = index($0 $s.c2s1)
}
@ function_return = s.c2s1
}
alias S.s2c {
# Space to Char.
#
@ s.sc2c = [$2-]
@ s.sc2r = [$1]
while ([$#s.sc2c] > 0) {
@ s.sc2r = [$(s.sc2r)$(0)$word(0 $s.sc2c)]
@ s.sc2c = [$s.wordfrom(1 $s.sc2c)]
}
@ function_return = [$s.sc2r]
}
alias S.c2c {
# Char to Char.
#
@ s.c2s1 = [$2-]
@ s.c2s2 = index($0 $s.c2s1)
while (s.c2s2 != -1) {
@ s.c2s1 = [$left($s.c2s2 $s.c2s1)$(1)$mid(${s.c2s2 + 1} -1 $s.c2s1)]
@ s.c2s2 = index($0 $s.c2s1)
}
@ function_return = [$s.c2s1]
}
alias S.cXc {
# Char eXchanged with Char.
#
@ s.c2s1 = [$2-]
@ s.c2s2 = index($0$1 $2-)
@ s.c2s3 = []
while (s.c2s2 != -1) {
if (mid($s.c2s2 1 $s.c2s1) == [$0]) {
@ s.c2s3 = s.c2s3 ## [$left($s.c2s2 $s.c2s1)$1]
} {
@ s.c2s3 = s.c2s3 ## [$left($s.c2s2 $s.c2s1)$0]
}
@ s.c2s1 = mid(${s.c2s2 + 1} -1 $s.c2s1)
@ s.c2s2 = index($0$1 $s.c2s1)
}
@ function_return = s.c2s3 ## s.c2s1
}
alias S.Rotate {
#
# Rotates the words in a variable forward or backwards..
#
if ([$1]!=[-1]) {
@ $0 = [$S.WordFrom(1 $($0)) $word(0 $($0))]
} {
@ s.rot2 = [$($0)]
@ s.rot = [$word(${#s.rot2 - 1} $($0))]
@ $0 = [$(s.rot) $S.WordTo(${#s.rot2 - 1} $($0))]
}
@ function_return = [$($0)]
}
alias S.user2banmask {
# Thanks to ChadF for this, and the following routine I borrowed
# them (with permission :) from his cftk.functions script.
#
if ([$index(? $0)] != [-1]) {
@ function_return = [*\\?*]
} {
if ([$index(* $0)] != [-1]) {
@ function_return = [*\\**]
} {
if ([$[1]0] == [~]) {
@ function_return = [*$mid(1 -1 $0)]
} {
@ function_return = [*$0]
}
}
}
}
alias S.host2banmask {
if ([$index(1234567890 $[1]0)] != [-1]) {
@ function_return = [$left(${rindex(. $0) + 1} $0)*]
} {
@ s.h2bm.hd = index(. $0)
if (s.h2bm.hd == rindex(. $0)) {
@ function_return = [*$0]
} {
@ function_return = [*$mid($s.h2bm.hd -1 $0)]
}
}
#
# End of Chad's code..
}
alias S.WildUHost {
@ function_return = [$0!$S.user2banmask($1)@$S.host2banmask($2)]
}
alias S.UnAssign {
foreach $0 s.UA$(0) {
S.UnAssign $(0).$(s.UA$(0))
}
^assign -s.UA$(0)
^assign -$(0)
}
alias S.CopyAtoB {
if ([$($0)]!=[]) {
@ $1 = [$($0)]
}
foreach $0 s.Ca2b$0 {
S.CopyAtoB $0.$(s.Ca2b$0) $1.$(s.Ca2b$0)
}
^assign -s.Ca2b$0
}
alias S.Sub {
# Args:
#
@ $0 = [$($0)] - [$1]
if ([$($0)] < 1) {
^assign -$0
}
}
alias S.Channel {
@ s.0 = 0
if ([$0]==[*]) {
@ s.0 = 1
@ s.tmpc = [$C]
} {
if (ischannel($0)) {
@ s.0 = 1
@ s.tmpc = [$0]
} {
@ s.tmpc = [$C]
}
}
if (!s.tmpc) {@ s.tmpc = [&heimskt&]}
@ function_return = [$s.tmpc]
}
alias S.MassCheck {
# Check for mass-anythings.
# Args:
#
@ $0 = [0$($0)] + [0$1]
if ([$($0)] > [$2]) {
$4-
^assign -$(0)
} {
eval timer $3 S.Sub $(0) 0$1
}
}
alias S.Bindings.hook {
if (match($0 $2_$3_$4_$5_$6_$7_$8_$9)) {
if (!match(%- $1)) {
@ s.binds = [$s.binds $1]
} {
@ s.binds = [$s.binds $1^´]
}
}
}
alias S.Bindings {
# Returns a list of keys bound to command $0
# Spaces should represented with '_' or a wildchar.
#
@ s.binds = []
^stack push on WINDOW
^eval on #^window 00 "% * is bound to *" \{s.Bindings.hook $1 $$2 $$6-\}
rbind $0
^on window -
^stack pop on WINDOW
@ function_return = [$s.binds]
^assign -s.binds
}
@ s.ctrlName.chars = [^L ^I ^M ]
@ s.ctrlName.names = [ENTER TAB ENTER]
alias S.CtrlName {
@ s.cnn = [$match($0 $s.ctrlname.chars)]
if (s.cnn) {
@ function_return = [$word(${s.cnn -1} $s.ctrlname.names)]
} {
@ function_return = [$0]
}
}
alias S.KeyName {
@ s.cn = 0
@ s.cnr = []
while ([$($s.cn)]!=[]) {
@ s.cnc = [$($s.cn)]
if (match(META?-% $($s.cn))) {
@ s.cnr = [$s.cnr $s.CtrlName($word(0 $s.bindings($left(5 $s.cnc) *)))-]
@ s.cnc = [$mid(6 -1 $s.cnc)]
}
@ s.cnr = [$(s.cnr)$s.CtrlName($s.cnc) ]
@ s.cn = s.cn + 1
}
@ function_return = [$s.cnr]
}
alias S.getBind {
# Returns the binding for key $0
#
@ s.binds = []
^stack push on WINDOW
^eval on #^window 00 "% % $0 is bound to *" \{@ s.binds = \[$$6-\]\}
bind $0
^on window -
^stack pop on WINDOW
@ function_return = [$s.binds]
^assign -s.binds
}
alias S.getVariable {
# Returns a list of $0's (alias or assign) that match $1*
#
@ s.alist = []
^stack push on WINDOW
^on #^window 00 "% % Aliases:" #
^on #^window 00 "% % Assigns:" #
if ([$2] != [allow_structs]) {
^on #^window 00 "% % *$1**" #
}
^on #^window 00 "% % *$1*" {
@ s.alist = s.alist ## [$mid(1 $index( $mid(1 -1 $2)) $2) ]
}
$0 $1
^on window -
^stack pop on WINDOW
if (match($1 $s.alist)) {@ s.alist = [$1]}
@ function_return = s.alist
^assign -s.alist
}
alias S.LoopMode {
@ s.lmargs = [$2-5]
$(K)$(K)quote MODE $0 $left(1 $1)$left($#s.lmargs $strip(+- $1$1$1$1)) $2-5
if ([$6]!=[]) {
S.LoopMode $0 $1 $6-
}
}
alias S.Save.Var {
if ([$($0)] != []) {
^msg %save assign $0 $($0)
}
^foreach $0 s.sve.$(0) {
# if (([$($(0).$(s.sve.$(0)))] != []) && ([$(s.sve.$0)]!=[d])) {
if ([$($(0).$(s.sve.$(0)))] != []) {
S.Save.Var $(0).$(s.sve.$(0))
}
}
^assign -s.sve.$(0)
if ([$1]!=[]) {S.Save.Var $1-}
}
alias S.Save.Com {
^msg %save ###
^msg %save ## $0-
^msg %save #
}
alias S.Save {
# s.save [ ] [...]
#
^exec -name save cat > $(s.TIS_HOME)/$(0)
^msg %save #### ## #
^msg %save ##### The $1 file for $(s.TIS_VERSION)
^msg %save ######## ## ## # ## # #
^msg %save @ s.loaded.$1 = 1
@ s.sve = 2
while ([$($s.sve)]!=[]) {
S.Save.Com $s.c2s(_ $($s.sve))
S.Save.Var $(${s.sve + 1})
@ s.sve = s.sve + 2
}
^exec -close %save
wait
}
alias s.nfilt {
# s.nfilt
# Strips users own nick from list, returns op-noop ordered list.
# Sets s.nlist to a list of users without ops.
# Sets s.chops to a list of users with ops.
#
@ s.nlist = [$0-]
@ s.nlt = [$match($N $strip(@+ $s.nlist))]
if (s.nlt) {@ s.nlist = [$s.notword(${s.nlt - 1} $s.nlist)]}
@ s.chops = []
@ s.nlt = [$match(*@* $s.nlist)]
while (s.nlt) {
@ s.chops = [$word(${s.nlt - 1} $s.nlist) $s.chops]
@ s.nlist = [$s.notword(${s.nlt - 1} $s.nlist)]
@ s.nlt = [$match(*@* $s.nlist)]
}
@ function_return = [$s.chops $s.nlist]
}
alias s.DeathScroll {
# Override for commands like /list, /who and /names - which
# create way too much output. (DeathScroll (tm) :-)
#
if ([$1]!=[]) {
$(K)$(K)$0 $1-
} { if ([$C] != 0) {
$(K)$(K)$0 *
} { S.echo Type $(s.C.UNDERL)$(K)$(K)$0$(s.C.UNDERL) if you are ABSOLUTELY sure about that..
}
}
}
###
## Misc external ALIASes
# Enhanced to for alias completion..
#
alias I {
if ([$0]!=[]) {
@ s.tmp = [$s.getVariable(alias I.$0)]
} {
@ s.tmp = [I.]
}
if ([$#s.tmp] < 2) {
@ s.tmp = [$word(0 $mid(2 -1 $s.tmp))]
if ([$(s.parms.$(s.tmp))]!=[]) {
if ([$($(s.parms.$(s.tmp)))] != []) {
I.$(s.tmp) $1-
} {
S.hecho $(s.help.$(s.tmp).a)
}
} {
S.hecho Try $(s.C.UNDERL)$(K)i help$(s.C.UNDERL) for a list of commands.
}
} {
s.echo Commands: $s.c2s(. $s.s2c(, $s.tmp))
xtype -LITERAL $(K)i $0
}
}
## Set up screen width var for help listing..
#
if ([$COLUMNS]!=[]) {
@ s.h.lw = [${COLUMNS - (14 + [$@s.H])}]
} {
@ s.h.lw = 61
}
@ s.parms.help = 0
@ s.help.help.a = [Usage: $(s.C.UNDERL)$(K)i help \[command|?\]]
@ s.help.help.d = [ ]
@ s.help.help.e = [Displays help for \[command\], or a list of commands if none is]
@ s.help.help.f = [specified. See $(s.C.UNDERL)$(K)i help usage$(s.C.UNDERL) for more info.]
alias I.help {
#
# Big.. possibly too complicated, but I like it. It even acts
# reasonably if you start a funny sized IRC window, like 40x40 or
# something. If the $COLUMNS environment variable is set, that is.
# If the COLUMNS variable isn't set it assumes 80 columns.
#
# "Now featuring help topic name completion" ... whee :)
#
@ s.hlp.t = []
if ([$0]!=[]) {
@ s.hlp.t = [$s.getvariable(assign s.help.$0 allow_structs)]
}
if ([$#s.hlp.t] > 0) {
if ([$#s.hlp.t] == 1) {
@ s.hlp.t = [$word(0 $s.hlp.t)] ;
S.hecho $(s.C.BOLD)$toupper($mid(${rindex(. $s.hlp.t) + 1} -1 $s.hlp.t))
foreach $(s.hlp.t) s.ii {
S.hecho $($(s.hlp.t).$(s.ii))
}
} { S.hecho Ambiguous topic: $toupper($0)
}
} {
@ s.hlp.stick = !s.hlp.llist
if ((([$0]==[]) && (!s.hlp.llist)) || ([$0]==[?])) {
S.hecho $(s.C.BOLD)COMMANDS/topics$(s.C.BOLD) \($s.TIS_VERSION\)
S.hecho
@ s.tmp = []
foreach s.help s.ii {
if ([$(s.parms.$(s.ii))]!=[]) {
@ s.tmp = [$s.tmp $[12]s.ii]
} {
@ s.tmp = [$s.tmp $tolower($[12]s.ii)]
}
if ([$@s.tmp] > s.h.lw) {
S.hecho $s.tmp
@ s.tmp = []
}
}
if ([$s.tmp] != []) {
S.hecho $s.tmp
}
S.hecho
@ s.hlp.llist = 1
@ s.hlp.stick = 1
} { if (!s.hlp.llist) {
S.hecho Sorry, try $(s.C.UNDERL)$(K)i help$(s.C.UNDERL) for a list of topics or $(s.C.UNDERL)$(K)help $0-
@ s.hlp.stick = 0
} {
@ s.hlp.stick = ([$0]!=[])
}
}
}
if (s.hlp.stick) {
xtype -LITERAL $(K)i help !
parsekey backspace
^timer -delete $word(0 $s.REF.HELP)
^timer -refnum $s.REF.HELP @ s.hlp.llist = 0
} {
@ s.hlp.llist = 0
}
}
@ s.parms.register = 0
@ s.help.register.a = [Usage: $(s.C.UNDERL)$(K)i register now]
@ s.help.register.d = [Sends your 'registration' to me (the author). This is your way]
@ s.help.register.e = [of saying "thank you". This is of course optional.]
@ s.help.register.f = [ ]
@ s.help.register.g = [$(s.C.BOLD)NOTE$(s.C.BOLD): If you do this I will have a copy of your return email]
@ s.help.register.h = [ address. If you do not like this don't register.]
alias I.register {
if ([$0]==[now]) {
s.echo Executing: $(K)exec echo I use $s.TIS_VERSION |mail bre@klaki.net
s.echo Thank you for registering!
exec echo I use $s.TIS_VERSION |mail bre@klaki.net
} {
I.help register
}
}
@ s.parms.version = 0
@ s.help.version.a = [Usage: $(s.C.UNDERL)$(K)i version]
@ s.help.version.d = [Displays the script, client and server version information.]
alias I.version {
s.rxecho CRAP Script: $s.TIS_VERSION by Juggler/BTL
$(K)$(K)version
}
@ s.parms.set = 0
@ s.help.set.a = [Usage: $(s.C.UNDERL)$(K)i set \[variable \[ON|OFF|\]\]]
@ s.help.set.d = [Alters or displays the configuration for TISii. Specify a]
@ s.help.set.e = [variable to display its current setting and some info on it.]
@ s.help.set.f = [See also: $(s.C.UNDERL)/i help save$(s.C.UNDERL) or $(s.C.UNDERL)/i help lists]
alias I.set {
if (([$0]!=[]) && ([$(s.set.$0)]!=[])) {
if (match($1 ON OFF)) {
@ s.set.$0 = ([$1]==[ON])
} {
if ([$1]!=[]) {@ s.set.$0 = [$1-]}
while (match(0?* $(s.set.$0))) {@ s.set.$0 = [$mid(1 -1 $(s.set.$0))]}
}
S.set.$0
S.Echo $(s.C.BOLD)$toupper($0)$(s.C.BOLD) : $(s.set.$(0).d)
S.Echo $word(${![$(s.set.$0)]} (ON) (OFF)) = [$(s.set.$0)]
} {
S.Echo $(s.C.BOLD)Settings:$(s.C.BOLD)
foreach s.set s.ii {
S.Echo $[-16]s.ii = [$left(5 $word(${![$(s.set.$(s.ii))]} (ON) (OFF)) ) $(s.set.$(s.ii))]
}
}
}
@ s.parms.lists = 0
@ s.help.lists.a = [Usage: $(s.C.UNDERL)$(K)i lists \[list\] \[edit|set|delete \[data\]\]]
@ s.help.lists.c = [ ]
@ s.help.lists.d = [Alter/display (one of) the TISii lists. (e.g. auto_op, ok_flood..)]
@ s.help.lists.e = [See also: $(s.C.UNDERL)/i help save$(s.C.UNDERL) or $(s.C.UNDERL)/i help set]
alias I.lists.edit {
^parsekey erase_line
^xtype -LITERAL $(K)i lists set $0 $(s.list.$0) $1-
}
alias I.lists.set {
@ s.list.$0 = [$1-]
I.lists $0
}
alias I.lists.delete {
^assign -s.list.$(0)
^assign -s.list.$(0).d
s.echo Deleted list $0
}
alias I.lists {
if ([$(s.list.$(0).d)]!=[]) {
s.echo $(s.C.BOLD)$toupper($0)$(s.C.BOLD) : $(s.list.$(0).d)
s.echo > $(s.list.$0)
} {
if ((match($0 edit set delete)) && ([$(s.list.$(1).d)]!=[])) {
I.lists.$0 $1-
} {
s.echo $(s.C.BOLD)List descriptions:
foreach s.list s.ii {
if ([$(s.list.$(s.ii).d)] != []) {
s.echo $[-10]s.ii : $(s.list.$(s.ii).d)
}
}
}
}
}
@ s.parms.save = 1
@ s.help.save.a = [Usage: $(s.C.UNDERL)$(K)i save [ALL] [lists] [cfg] [load] [misc]]
@ s.help.save.c = [ ]
@ s.help.save.d = [Saves TISii data to a file.]
alias I.save {
if ([$(s.save.file.$0)]!=[]) {
S.Save $(s.save.file.$0) $(s.save.vars.$0)
S.echo Saved $word(1 $(s.save.file.$0)) to file $(s.TIS_HOME)/$word(0 $(s.save.file.$0))
if ([$1]!=[]) {
I.save $1-
}
} {
if ([$0]!=[ALL]) {
S.hecho $s.help.save.a
S.echo No such save file: $0
} {
I.Save lists cfg load misc
}
}
}
@ s.parms.repeat = 2
@ s.help.repeat.a = [Usage: $(s.C.UNDERL)$(K)i repeat ]
@ s.help.repeat.d = [Repeats a command N times.]
@ s.repcount = 0
alias I.Repeat {
if (s.repcount == 0) {
while (s.repcount < [0$strip($s.NONNUMERICS $0)]) {
@ s.repcount = s.repcount + 1
$1-
}
@ s.repcount = 0
} {
s.echo $(s.C.BOLD)ERROR$(s.C.BOLD) I.Repeat was called recursively!
}
}
@ s.parms.mctcp = 3
@ s.help.mctcp.a = [Usage: $(s.C.UNDERL)$(K)i multictcp ]
@ s.help.mctcp.d = [Sends N CTCP requests in one line.]
alias I.MCTCP {
@ s.tmp = [$2]
while ([$#s.tmp] < [0$strip(s.NONNUMERICS $0)]) {
@ s.tmp = [$(s.tmp) $(s.C.CTCP)$(s.C.CTCP)$2]
}
quote PRIVMSG $1 :$(s.C.CTCP)$toupper($s.tmp)$(s.C.CTCP)
}
@ s.parms.ctcpreply = 2
@ s.help.ctcpreply.a = [Usage: $(s.C.UNDERL)$(K)i CTCPreply \[text..\]]
@ s.help.ctcpreply.d = [Sends a (fake) CTCP REPLY to a nick/channel.]
alias I.CTCPreply {
quote NOTICE $0 :$(s.C.CTCP)$toupper($1) $2-$(s.C.CTCP)
if ([$VERBOSE_CTCP] == [ON]) {
S.xecho CTCP CTCP $toupper($1) reply to $(0): $2-
}
}
@ s.parms.notify = 0
@ s.help.notify.d = [Delayed-for-aliases notify. See $(s.C.UNDERL)$(K)help notify]
@ s.help.notify.a = [Usage: $(s.C.UNDERL)$(K)i notify <\[-\]nicks..>]
alias I.Notify {
if ([$0] == []) {
$(K)$(K)notify
} {
if (!match(*=* $0-)) {
@ s.inNL = [$s.inNL $0-]
^timer -refnum 20202 10 eval ^notify $$s.inNL\;^assign -s.inNL
}
}
}
@ s.parms.tmpignore = 2
@ s.help.tmpignore.d = [Ignore someone for N seconds. See $(s.C.UNDERL)$(K)help ignore]
@ s.help.tmpignore.a = [Usage: $(s.C.UNDERL)$(K)i tmpignore \[what\]]
alias I.TmpIgnore {
S.echo Ignoring $0 for 0$strip($s.NONNUMERICS $1) seconds.
if ([$2] != []) {
^ignore $0 $2-
} {
^ignore $0 ALL
}
^timer 0$strip($s.NONNUMERICS $1) eval ^ignore $0 NONE\;S.echo Unignoring $0
}
@ s.parms.seeraw = 0
@ s.help.seeraw.d = [Toggle display of unformatted server output (in a window).]
@ s.help.seeraw.a = [Usage: $(s.C.UNDERL)$(K)i seeraw]
alias I.SeeRaw {
if ([$s.SEERAW] == []) {
^window new name SeeRaw level USERLOG4 shrink 32 shrink 16 shrink 8 shrink 4 shrink 2 shrink 1 grow 1 back
^on #-window_kill 90 "SeeRaw" {i.seeraw}
^on #-raw_irc 90 "*" {xecho -LEVEL USERLOG4 $0-}
@ s.SEERAW = [ON]
} {
^on #-window_kill 90 -"SeeRaw"
^on #-raw_irc 90 -"*"
^window refnum SeeRaw kill
^assign -s.SEERAW
}
}
@ s.parms.rebind = 3
@ s.help.rebind.a = [Usage: $(s.C.UNDERL)$(K)i rebind [-Q(uiet)] ]
@ s.help.rebind.d = [Re-binds all keys bound to matching to ]
@ s.help.rebind.e = [Use -Q for quiet.. \(see $(s.C.UNDERL)$(K)help bind ?$(s.C.UNDERL) for a list\).]
alias I.reBind {
@ s.binds2 = [$s.bindings($0 $1)]
while ([$#s.binds2] > 0) {
if (match(%Q% $2)) {
^bind $word(0 $s.binds2) $3-
} {
bind $word(0 $s.binds2) $2-
}
@ s.binds2 = [$s.wordFrom(1 $s.binds2)]
}
}
@ s.parms.msay = 1
@ s.help.msay.a = [Usage: $(s.C.UNDERL)$(K)i msay ]
@ s.help.msay.d = [Send something to ALL channels you are on.]
alias I.msay {
if ([$mychannels()]!=[]) {
msg $s.s2c(, $mychannels()) $0-
} {
S.echo You aren't on any channels!
}
}
alias I.wordcmd._hset {
^on #-$0 90 $2-
if (match(-% $2)) {
^assign -s.wordcmd._$encode($tolower($1)).$0
} {
@ s.wordcmd._$encode($tolower($1)).$0 = [1]
}
}
alias I.wordcmd.PUBLIC {I.wordcmd._hset PUBLIC $1 $0 % % $1" \{$2 $$0-\}}
alias I.wordcmd.ACTION {I.wordcmd._hset ACTION $1 $0 % % $1" \{$2 $$0-\}}
alias I.wordcmd.TOPIC {I.wordcmd._hset TOPIC $1 $0 % % $1" \{$2 $$0-\}}
alias I.wordcmd.MODE {I.wordcmd._hset MODE $1 $0 % % $1" \{$2 $$0-\}}
alias I.wordcmd.MSG {I.wordcmd._hset MSG $1 $0 % $1" \{$2 $$0 &$$N $$1-\}}
alias I.wordcmd.NOTICE {I.wordcmd._hset NOTICE $1 $0 % $1" \{$2 $$0 &$$N $$1-\}}
@ s.parms.wordcmd = 0
@ s.help.wordcmd.a = [Usage: $(s.C.UNDERL)$(K)i wordcmd \[\[<+|->\] \]]
@ s.help.wordcmd.b = [ ]
@ s.help.wordcmd.c = [Where X can be PUBLIC, ACTION, TOPIC, MODE, MSG or NOTICE.]
@ s.help.wordcmd.d = [This creates a hook, activated whenever something matching]
@ s.help.wordcmd.e = ["pattern" is seen. The ircII command is then executed, passing]
@ s.help.wordcmd.f = [the nick, channel and text as arguments. Examples:]
@ s.help.wordcmd.g = [ ]
@ s.help.wordcmd.h = [Wordkick: /i wordcmd +pub,action,topic *word* //kick $$1 $$0 bye]
@ s.help.wordcmd.i = [PervertIg: /i wordcmd +msg *are*you*Fe* /ig $$0 ALL\;echo Ignoring $$0]
@ s.help.wordcmd.j = [ ]
@ s.help.wordcmd.k = [If no parameters are given, a list of hooks is displayed.]
@ s.help.wordcmd.l = [Note: Only one action can be associated with each pattern.]
alias I.wordcmd {
@ s.wct = ["]
if (rmatch($0 +% -%)) {
^alias i.wordcmd._set \{eval I.wordcmd.$s.c2c(, $$(s.C.SPACE)$$$$0-\\\;I.wordcmd. $mid(1 -1 $0)) $$$$0-\}
if ([$left(1 $0)]==[-]) {
@ s.wct = [-"]
@ s.wca = []
} {
@ s.wca = [ \{$2- \;#\}]
}
@ s.wcw = [$1]
} {
^alias i.wordcmd._set \{I.wordcmd.PUBLIC $$0-\}
@ s.wcw = [$0]
@ s.wca = [ \{$1- \;#\}]
}
if (([$s.wcw]!=[]) && (!match($s.wca {}))) {
@ s.wcl = [$strip(" $s.wct)s.wordcmd._$encode($tolower($s.wcw))]
^alias $(s.wcl)$(s.wca)
^assign $(s.wcl)$(s.wca)
i.wordcmd._set $s.wct $s.wcw $s.wcl
} {
@ s.wcc = [s.echo $(s.C.BOLD)Words:\;@ s.wcc = [#]]
foreach s.wordcmd s.XX {
@ s.wct = []
foreach s.wordcmd.$(s.XX) s.YY {
@ s.wct = s.wct ## [,$s.YY]
}
eval $s.wcc
s.echo $[-14]decode($mid(1 -1 $s.XX)) \($mid(1 -1 $s.wct)\): $(s.wordcmd.$(s.XX))
}
if ([$s.wcc]!=[#]) {
s.echo No word-activated commands have been set. Try $(s.C.UNDERL)/i help wordcmd
}
}
}
###
## Overrides to keep people from flooding themselves (by accident),
# or just to make life a bit easier..
#
@ s.parms.query = 0
@ s.help.query.a = [Slightly enhanced $(s.C.UNDERL)$(K)query$(s.C.UNDERL) command, see $(s.C.UNDERL)$(K)help query]
@ s.help.query.b = [+ Sets window name so message styling works with queries.]
alias i.query {
if ([$0]==[]) {
$(K)$(K)query
^window name $rand(9)$rand(9)$rand(9)
} {
$(K)$(K)query $0
^window name $strip(= $0)
}
}
@ s.parms.mode = 0
@ s.help.mode.a = [Slightly enhanced $(s.C.UNDERL)$(K)mode$(s.C.UNDERL) command, see $(s.C.UNDERL)$(K)help mode]
@ s.help.mode.b = [+ Defaults to current channel if none specified.]
alias i.mode {
if ([$N]!=[$0]) {
@ s.tch = [$s.channel($0)]
$(K)$(K)quote MODE $s.tch $($(s.0)-)
} {
$(K)$(K)mode $0-
}
}
@ s.parms.join = 0
@ s.help.join.a = [Slightly enhanced $(s.C.UNDERL)$(K)join$(s.C.UNDERL) command, see $(s.C.UNDERL)$(K)help join]
@ s.help.join.b = [+ Prefixes # character to incomplete channel names.]
alias i.join {
if ([$0]!=[]) {
if ((ischannel($0)) || (match(-I% $0))) {
$(K)$(K)join $0 $1-
} {
$(K)$(K)join #$0 $1-
}
} {
$(K)$(K)join
}
}
@ s.parms.leave = 0
@ s.help.leave.a = [Slightly enhanced $(s.C.UNDERL)$(K)leave$(s.C.UNDERL) command, see $(s.C.UNDERL)$(K)help leave]
@ s.help.leave.b = [+ Default is to leave current channel.]
alias i.leave {
if ([$0]!=[]) {
if (ischannel($0)) {
$(K)$(K)leave $0
} {
$(K)$(K)leave #$0
}
} {
$(K)$(K)leave *
}
}
@ s.parms.topic = 0
@ s.help.topic.a = [Slightly enhanced $(s.C.UNDERL)$(K)topic$(s.C.UNDERL) command, see $(s.C.UNDERL)$(K)help topic]
alias i.topic {
if ([$0]!=[]) {
if (ischannel($0)) {
$(K)$(K)topic $0 $1-
} {
$(K)$(K)topic $C $0-
}
} {
$(K)$(K)topic $C
}
}
@ s.parms.names = 0
@ s.help.names.a = [Slightly enhanced $(s.C.UNDERL)$(K)names$(s.C.UNDERL) command, see $(s.C.UNDERL)$(K)help names]
@ s.help.names.b = [+ Less likely to flood you, default is list for current channel.]
alias i.names {
s.DeathScroll names $0-
}
@ s.parms.list = 0
@ s.help.list.a = [Slightly enhanced $(s.C.UNDERL)$(K)list$(s.C.UNDERL) command, see $(s.C.UNDERL)$(K)help list]
@ s.help.list.b = [+ Less likely to flood you, default is list for current channel.]
alias i.list {
s.DeathScroll list $0-
}
@ s.parms.who = 0
@ s.help.who.a = [Slightly enhanced $(s.C.UNDERL)$(K)who$(s.C.UNDERL) command, see $(s.C.UNDERL)$(K)help who]
@ s.help.who.b = [+ Less likely to flood you, default is list for current channel.]
alias i.who {
s.DeathScroll who $0-
}
## End of core external aliases.
##############################################################################
###[ INTERACTIVE CONFIGURATION ]##############################################
##############################################################################
##
## No hooks. Just some very coooooooooooooooool scripting.
## (I'm proud of this one. Idea and code by ME, Juggler :)
##
## And I did this BEFORE SrFrog did! SO THERE! :)
##
###
## Internal aliases..
#
alias s.iset.set {
s.echo $1 = [$2-]
@ $0.$1 = [$2-]
}
alias s.iset.show {
@ s.iset.tmp = [$word(0 $s.iset.list)]
^parsekey erase_line
^set STATUS_FORMAT $s.iset.tmp %> $($(s.iset.pre).$(s.iset.tmp).d)
TIMER 0 ^xtype -LITERAL $($(s.iset.pre).$(s.iset.tmp))
}
alias s.iset.send {
@ s.iset.setted = 1
s.iset.cmd $word(0 $s.iset.list) $L
s.rotate s.iset.list 1
s.iset.show
}
alias s.iset.done {
^parsekey erase_line
if (!s.iset.submenu) {
^set STATUS_FORMAT $s.iset.kf
if ([$s.iset.ip]!=[]) {
^set INPUT_PROMPT $s.iset.ip
} { ^set -INPUT_PROMPT
}
i.rebind PARSE_COM *S.ISET*-1* -Q BACKWARD_HISTORY
i.rebind PARSE_COM *S.ISET.*1* -Q FORWARD_HISTORY
i.rebind PARSE_COM *ISET.DONE* -Q NEXT_WINDOW
i.rebind PARSE_COM *ISET.SEND* -Q SEND_LINE
^bind ^I $s.iset.oldtab
^bind ^C $s.iset.oldqui
s.echo No longer in edit mode...
}
if (([$s.iset.svf]!=[-]) && (s.iset.setted)) {
input "Save the changes to file? [YES/no] " if (!match(n% $0)) \{i.save $s.iset.svf\}
eval $(s.rehashcmds.$(s.iset.svf))
}
}
alias s.iset.setvar {
@ s.iset.setted = 0
@ s.iset.list = []
@ s.iset.svf = [$0]
@ s.iset.pre = [$1]
^alias s.iset.cmd \{$2-\}
foreach $1 XX {
@ s.iset.list = [$s.iset.list $(XX)]
}
}
## s.iset
#
alias s.iset {
if (!s.iset.submenu) {
s.echo Entering edit mode..
@ s.iset.oldtab = [$s.getbind(^I)]
@ s.iset.oldqui = [$s.getbind(^C)]
^bind ^I parse_command s.iset.done
^bind ^C parse_command s.iset.done
i.rebind FORWARD_HISTORY * -Q parse_command s.rotate s.iset.list 1\;s.iset.show
i.rebind BACKWARD_HISTORY * -Q parse_command s.rotate s.iset.list -1\;s.iset.show
i.rebind SEND_LINE * -Q parse_command s.iset.send
@ s.iset.kf = [$STATUS_FORMAT]
@ s.iset.ip = [$INPUT_PROMPT]
s.echo Press $(s.C.BOLD)TAB$(s.C.BOLD) (^I) when you are finished.
}
s.iset.setvar $0-
^set INPUT_PROMPT = $()
s.iset.show
}
@ s.iset.l.CFG = [SETTINGS .. Customize the script's settings.]
@ s.iset.l.cfg.d = [$s.TIS_VERSION]
@ s.iset.l.cfg.cmd = [s.iset.setvar cfg s.set i set]
@ s.iset.l.LISTS = [LISTS ..... Edit the internal lists.]
@ s.iset.l.lists.d = [$s.TIS_VERSION]
@ s.iset.l.lists.cmd = [s.iset.setvar lists s.list i lists set]
@ s.iset.l.LOAD = [LOAD ...... What parts of the script are loaded.]
@ s.iset.l.load.d = [$s.TIS_VERSION]
@ s.iset.l.load.cmd = [s.iset.setvar load s.cfg.load s.iset.set s.cfg.load]
@ s.iset.l.MISC = [MISC ...... Noises, messages, technical stuff.]
@ s.iset.l.misc.d = [$s.TIS_VERSION]
@ s.iset.l.misc.cmd = [s.iset.setvar misc s.misc s.iset.set s.misc]
@ s.iset.l.HELP = [HELP ...... Help on edit mode.]
@ s.iset.l.help.d = [$s.TIS_VERSION]
@ s.iset.l.help.cmd = [i help config]
alias s.iset.choose {
@ s.iset.submenu = 0
$(s.iset.l.$(0).cmd)
}
@ s.parms.config = 0
@ s.help.config.a = [Usage: $(s.C.UNDERL)$(K)i config \[lists|cfg|load|misc\]]
@ s.help.config.b = [ ]
@ s.help.config.c = [Activates edit mode, a comfortable way to configure TISii's behavior.]
@ s.help.config.d = [The status bar shows a short description of what you are editing.]
@ s.help.config.e = [Press TAB or ^I to leave edit mode when you are finished.]
@ s.help.config.f = [ ]
@ s.help.config.g = [You can select different variables the same way you would scroll]
@ s.help.config.h = [through the command history \(usually ^P or the cursor keys), and]
@ s.help.config.i = [accept changes with the ENTER key. To cancel a change switch to]
@ s.help.config.j = [a different variable without pressing ENTER.]
@ s.help.config.k = [ ]
@ s.help.config.l = [$(s.C.BOLD)Note:$(s.C.BOLD) 0 means OFF, anything else (1 is good) means ON.]
alias I.config {
@ s.iset.submenu = 0
if (match($0 lists cfg load misc)) {
s.iset $s.wordfrom(1 $(s.iset.l.$(0).cmd))
} { s.iset - s.iset.l s.iset.choose
}
}
@ s.help.set.zzzz = [+ For interactive configuration, type $(s.C.UNDERL)/i config]
@ s.help.lists.zz = [+ For interactive configuration, type $(s.C.UNDERL)/i config]
##############################################################################
###[ REFORMAT OUTPUT ]########################################################
##############################################################################
##
## Level #00 hooks: join msg send_msg dcc_chat send_dcc_chat window
## notice send_notice public public_other public_msg
##
## To silence a reformatted message, use a negative serial number
## and set "s.silent" to 1. (Note: done automatically by s.wxecho)
## If things aren't reformatted, you cannot silence them.
##
if (s.cfg.load.REFORMAT_CHANNELS) {
^set show_channel_names off
@ s.misc.public.d = [How to display public (channel) traffic.]
@ s.misc.public_other.d = [How to display channels with no window.]
@ s.misc.public_msg.d = [How to display messages sent to channels.]
@ s.misc.join.d = [How to show you who just joined your channel.]
@ s.misc.public = [<$(s.C.CHIGH)$$(0)$(s.C.CHIGH)>]
@ s.misc.public_other = [$$1 <$(s.C.CHIGH)$$(0)$(s.C.CHIGH)>]
@ s.misc.public_msg = [$$1 <$(s.C.CHIGH)$$(0)$(s.C.CHIGH)>]
@ s.misc.join = [Joined $$(1): $$[9]0 \\\($$userhost()\\\)]
alias s.rehash.public {
^on #^join 00 * \{if (!s.silent) \{s.rxecho CRAP $s.misc.join\;if ([$0]==[$N]) {names $1}\}\{@ s.silent = 0\}\}
^on #^public_other 00 * \{s.wxecho PUBLIC # $s.misc.public_other $$2-\}
^on #^public 00 * \{s.wxecho PUBLIC # $s.misc.public $$2-\}
^on #^public_msg 00 * \{s.wxecho PUBLIC # $s.misc.public_msg $$2-\}
}
@ s.rehashcmds.MISC = s.rehashcmds.MISC ## [\;s.rehash.public]
} ## End of channel reformatting.
if (s.cfg.load.REFORMAT_MESSAGES) {
@ s.misc.msg.d = [How to display messages.]
@ s.misc.send_msg.d = [How to display sent messages.]
@ s.misc.msg = [*$(s.C.PHIGH)$$(0)$(s.C.PHIGH)*]
@ s.misc.send_msg = [*> *$(s.C.PHIGH)$$(0)$(s.C.PHIGH)*]
@ s.misc.dcc_chat.d = [How to display DCC messages.]
@ s.misc.send_dcc_chat.d = [How to display sent DCC messages.]
@ s.misc.dcc_chat = [=$(s.C.PHIGH)$$(0)$(s.C.PHIGH)=]
@ s.misc.send_dcc_chat = [=> =$(s.C.PHIGH)$$(0)$(s.C.PHIGH)=]
@ s.misc.notice.d = [How to display notices.]
@ s.misc.send_notice.d = [How to display sent notices.]
@ s.misc.notice = [-$(s.C.PHIGH)$$(0)$(s.C.PHIGH)-]
@ s.misc.send_notice = [-> -$(s.C.PHIGH)$$(0)$(s.C.PHIGH)-]
alias s.rehash.messages {
^alias s.ShowMsg \{s.wxecho MSGS $$0 $s.misc.msg $$1-\}
^on #^msg 00 * \{s.wxecho MSGS $$0 $s.misc.msg $$1-\}
^on #^send_msg 00 * \{s.wxecho MSGS $$0 $s.misc.send_msg $$1-\}
^alias s.ShowDMsg \{eval s.wxecho MSGS $$0 $s.misc.dmsg $$1-\}
^on #^dcc_chat 00 * \{s.wxecho MSGS $$0 $s.misc.dcc_chat $$1-\}
^on #^send_dcc_chat 00 * \{s.wxecho MSGS $$0 $s.misc.send_dcc_chat $$1-\}
^alias s.ShowNotice \{s.wxecho NOTICES $$0 $s.misc.notice $$1-\}
^on #^notice 00 * \{s.wxecho NOTICES $$0 $s.misc.notice $$1-\}
^on #^send_notice 00 * \{s.wxecho NOTICES $$0 $s.misc.send_notice $$1-\}
}
@ s.rehashcmds.MISC = s.rehashcmds.MISC ## [\;s.rehash.messages]
#### ELSE
} {
alias s.ShowMsg {xecho -LEVEL MSGS *$(0)* $1-}
alias s.ShowDMsg {xecho -LEVEL MSGS =$(0)= $1-}
alias s.ShowNotice {xecho -LEVEL NOTICES $(s.C.JUNK)-$(0)- $1-}
} ## End of message reformatting.
alias s.reformat_window {
@ s.c2s1 = [$1-]
@ s.c2s2 = index($(s.C.CTRLC) $1-)
@ s.c2s3 = []
while (s.c2s2 != -1) {
if ([$mid($s.c2s2 1 $s.c2s1)] == [$(s.C.CTRLC)]) {
@ s.c2s3 = s.c2s3 ## [$left($s.c2s2 $s.c2s1)$(s.C.REVERSE)]
} {
@ s.c2s3 = s.c2s3 ## [$left($s.c2s2 $s.c2s1)$(s.C.CTRLC)]
}
while (match($mid(${s.c2s2 + 1} 1 $s.c2s1) 0 1 2 3 4 5 6 7 8 9 ,)) {
@ s.c2s2 = s.c2s2 + 1
}
@ s.c2s1 = mid(${s.c2s2 + 1} -1 $s.c2s1)
@ s.c2s2 = index($(s.C.CTRLC) $s.c2s1)
}
xecho -WINDOW $0 $s.c2s3$s.c2s1
}
alias s.set.reformat_window {
if (s.set.reformat_window) {
eval ^on #^window 00 "% *$(s.C.CTRLC)*" {s.reformat_window $0-}
} { eval ^on #^window 00 -"% *($s.C.CTRLC)*"
}
}
@ s.set.reformat_window.d = [Clean up mIRC color codes 'n stuff. 0..OFF, 1..ON]
@ s.set.reformat_window = 0
@ s.cfg.lastcmds = s.cfg.lastcmds ## [\;S.set.reformat_window]
# Send an irritating ircII warning to /dev/null. Just about everything
# I do sets this off. :-) But while the client doesn't crash....
#
^on #^window 00 "% --- Recursive call to irc_io() - careful" #
##############################################################################
###[ MSG HISTORY ]############################################################
##############################################################################
##
## Hooks: msg, send_msg, dcc_chat, send_dcc_chat, public, send_public
## notice, send_notice (#70)
##
if (s.cfg.load.MSG_HISTORY || s.cfg.load.EMULATE_TABKEY) {
###
## Assigns (default is 12 history slots, raise value for more :)
#
@ s.list.mhist.d = [Message history buffer]
@ s.list.mhist = []
@ s.list.complete.d = [Commands completed by the message history hotkey.]
@ s.list.complete = [msg dmsg describe whois notice ctcp ping ignore query]
@ s.misc.maxnicks.d = [Maximum number of nicks in nick history buffer.]
@ s.misc.maxnicks = 12
###
## Key Bindings
#
# The following is binding the ircII default, so I don't feel too bad
# about enabling it..
#
^bind ^X META2_CHARACTER
#
if (s.cfg.load.EMULATE_TABKEY) {
^bind ^I parse_command eval I.nicklist.ng\;S.rotate s.list.mhist 1
^bind ^R parse_command eval I.nicklist.ng\;S.rotate s.list.mhist -1
^alias nicklist I.nicklist
^alias addnick I.nicklist.na
@ s.help.emulation.0tk = [TABKEY See $(s.C.UNDERL)/help load tabkey$(s.C.UNDERL) and $(s.C.UNDERL)/i help nicklist]
@ s.help.aliases.tk = [tabkey: nicklist, addnick]
@ s.help.nicklist.k1 = [Keys: ^R / TAB Get last/current nick and rotate list.]
} {
^bind ^R parse_command I.nicklist.ng
^bind ^P parse_command eval S.rotate s.list.mhist 1\;I.nicklist.ng
^bind ^O parse_command eval S.rotate s.list.mhist -1\;I.nicklist.ng
@ s.help.nicklist.k1 = [Keys: ^R Get the current nick, completes command.]
@ s.help.nicklist.k2 = [ ^P / ^O Get last/next nick, and rotate list.]
}
^bind ^X^P parse_command I.nicklist.cr 1
^bind ^X^O parse_command I.nicklist.cr -1
^bind ^X^X parse_command I.nicklist.nd $$word(1 $L)
@ s.help.nicklist.k3 = [ ^X^X Delete nick on command line from list.]
@ s.help.nicklist.k4 = [ ^X^P / ^X^O Get current nick, and rotate command list fwd/back.]
###
## External aliases
#
alias I.nicklist.na {
if ([$0] != []) {
@ s.na = match($0 $s.list.mhist)
if (s.na) {
@ s.list.mhist = [$strip(@ $0 $s.notWord(${s.na - 1} $s.list.mhist))]
} { @ s.list.mhist = [$strip(@ $s.WordTo($s.misc.maxnicks $0 $s.list.mhist))]
}
}
}
alias I.nicklist.cr {
S.Rotate s.list.complete $0
^parsekey erase_line
I.nicklist.ng
}
alias I.nicklist.ng {
@ s.nicklast = [$s.c2s(, $word(0 $s.list.mhist))]
@ s.tmp2 = [$match($strip($(K) $word(0 $L))% $s.list.complete)]
if ((s.tmp2) && (match($(K)% $word(0 $L)))) {
if (ischannel($word(1 $L)) && match(%: $word(2 $L))) {
@ s.tmp3 = 3
} { @ s.tmp3 = 2
}
@ s.tmp = [$(K)$word(${s.tmp2 - 1} $s.list.complete) $(s.nicklast) $s.wordfrom($s.tmp3 $L)]
} { @ s.tmp = [$(K)$word(0 $s.list.complete) $(s.nicklast) $L]
}
^parsekey erase_line
^xtype -LITERAL $s.tmp
}
alias I.nicklist.nd {
if (match($0 $s.list.mhist) && ([$0] != [.])) {
@ s.list.mhist = [$s.notword(${match($0 $s.list.mhist) - 1} $s.list.mhist)]
if (!match(% $s.list.mhist)) {
@ s.list.mhist = [@]
^parsekey erase_line
} { I.nicklist.ng
}
S.echo Nickname $0 deleted from history.
}
}
@ s.parms.nicklist = 0
@ s.help.nicklist.a = [Usage: $(s.C.UNDERL)$(K)i nicklist]
@ s.help.nicklist.b = [Displays the nicks in the message history.]
alias I.nicklist {
@ s.tmp2 = [$strip(@ $s.list.mhist)]
if ([$word(0 $s.tmp2)]!=[]) {
@ s.tmp = [$#s.list.mhist] - 1
S.echo Current: $(s.C.BOLD)$word(0 $s.list.mhist)$(s.C.BOLD) History: $s.WordFrom(1 $s.list.mhist)
S.echo $#s.tmp2 \(max $s.misc.maxnicks\) slots are occupied.
} { S.echo The message history is empty.
}
}
###
## Hooks..
#
alias S.Set.Msg_Hist {
^on #-msg 70 -*
^on #-send_msg 70 -*
^on #-notice 70 -*
^on #-send_notice 70 -*
^on #-dcc_chat 70 -*
^on #-send_dcc_chat 70 -*
^on #-public 70 -*
^on #-send_public 70 -*
if ([$s.set.msg_hist] == [1]) {
@ s.set.msg_hist = [msg notice dcc_chat public]
}
if (match(m% $s.set.msg_hist)) {
^on #-msg 70 * {I.nicklist.na $0}
^on #-send_msg 70 * {I.nicklist.na $0}
}
if (match(n% $s.set.msg_hist)) {
^on #-notice 70 * {I.nicklist.na $0}
^on #-send_notice 70 * {I.nicklist.na $0}
}
if (match(d% $s.set.msg_hist)) {
^on #-dcc_chat 70 * {I.nicklist.na =$0}
^on #-send_dcc_chat 70 * {I.nicklist.na =$0}
}
if (match(p% $s.set.msg_hist)) {
^on #-public 70 * {if (match(%$N% $2-)) {I.nicklist.na $1,$0:}}
^on #-send_public 70 * {if (match(%: $1)) {I.nicklist.na $0,$1}}
}
}
@ s.set.msg_hist.d = [Listed events update msg hist. 1..ALL, 0..NONE ]
@ s.set.msg_hist = (s.cfg.load.MSG_HISTORY == 1)
@ s.cfg.lastcmds = s.cfg.lastcmds ## [\;S.set.msg_hist]
} ## End of msg history code.
##############################################################################
###[ FLOOD PROTECTION ]#######################################################
##############################################################################
##
## Level #00 hooks: raw_irc
## Other hooks: msg/notice/invite/ctcp/ctcp_reply (#-71)
##
if (s.cfg.load.FLOOD_PROT) {
###
## Assigns..
#
@ s.REF.LASTFLOOD = [880101 300]
@ s.REF.UNSILENCE = [880102 300]
@ s.FLOOD.COUNT = 0
@ s.misc.badflood.d = [It only takes one of these to activate flood prot..]
@ s.misc.badflood = [***** **\[**\[* **\]**\]*]
@ s.list.ok_flood.d = [Disables msg flood prot. for nick!user@host patterns.]
@ s.list.ok_flood = []
###
## External aliases..
#
alias I.Flood.D {
^on #^raw_irc 00 -"%$0 % % *"
^on #-raw_irc 00 -"%$0 % #% *"
^on #-raw_irc 00 -"%$0 % &% *"
^timer -delete $(s.flooded.$encode($0).ref)
S.Echo No longer silencing $(0), deleting flood data.
S.UnAssign s.flooded.$encode($0)
if ([$s.lastflood]==[$0]) {
@ s.lastflood = []
}
}
alias I.Flood.S.INVITE {S.rxecho CRAP $0 invited you to channel $mid(1 -1 $4)}
alias I.Flood.S.PRIVMSG {
if (match(*:$(s.C.CTCP)* $4)) {
if (match(??ACTION $4)) {
xecho -LEVEL MSGS *> $s.nickonly($1) $strip($s.C.CTCP $5-)
} { S.rxecho CTCP CTCP $strip(:$(s.C.CTCP) $4) from $s.nickonly($1) ignored.
}
} { s.ShowMsg $s.nickonly($1) $mid(1 -1 $4-)
}
}
alias I.Flood.S.NOTICE {
if (match(*:$(s.C.CTCP)* $4)) {
S.rxecho CTCP CTCP $strip(:$(s.C.CTCP) $4) reply from $s.nickonly($1): $strip($s.C.CTCP $5-)
} { s.ShowNotice $s.nickonly($1) $mid(1 -1 $4-)
}
}
alias I.Flood.P {
S.Echo Displaying flood from $(0):
@ s.lastecho = []
@ s.tmp = [s.flooded.$encode($0)]
@ s.tmp2 = [$($(s.tmp).txt.0)]
@ s.XX = 1
while ([$(s.tmp2)]!=[]) {
I.Flood.S.$word(1 $s.tmp2) $($(s.tmp).who) $s.tmp2
@ s.tmp2 = [$($(s.tmp).txt.$(s.XX))]
@ s.XX = s.XX + 1
}
}
alias I.Flood.S {
I.Flood.P $0
I.Flood.D $0
}
alias I.Flood.I {
I.TmpIgnore *$0 600 ALL -PUBLIC
I.Flood.D $0
}
alias I.Flood.L {
@ s.tmp = 1
foreach s.flooded s.XX {
if (s.tmp) {
S.Echo Flooders being silenced:
@ s.tmp = 0
}
if ([$s.lastflood]==[$decode($s.XX)]) {
S.Echo $decode($s.XX) $(s.C.BOLD)(most recent)
} { S.Echo $decode($s.XX)
}
}
if (s.tmp) {
S.Echo Noone is being silenced.
}
}
@ s.parms.flood = 1
@ s.help.flood.a = [Usage: $(s.C.UNDERL)$(K)i flood list|ignore|delete|print|show \[flooder\]]
@ s.help.flood.c = [ ]
@ s.help.flood.d = [ $(s.C.UNDERL)list $(s.C.UNDERL)Prints a list of flooders being silenced.]
@ s.help.flood.e = [ $(s.C.UNDERL)ignore \[flooder\]$(s.C.UNDERL) Ignores "flooder" or the most recent flooder.]
@ s.help.flood.f = [ $(s.C.UNDERL)delete \[flooder\]$(s.C.UNDERL) Deletes flooder from list.]
@ s.help.flood.g = [ $(s.C.UNDERL)print \[flooder\]$(s.C.UNDERL) Print stored flood data.]
@ s.help.flood.h = [ $(s.C.UNDERL)show \[flooder\]$(s.C.UNDERL) Print data and delete flooder.]
@ s.help.flood.i = [ ]
@ s.help.flood.j = [Use $(s.C.UNDERL)/i set flood_prot.$(s.C.UNDERL) to set the flood protection's sensitivity.]
alias I.Flood {
if (rmatch($0 l%)) {
I.Flood.L
} {
if (rmatch($0 d% s% i% p%)) {
if ([$1]!=[]) {
@ s.fv = [$s.getVariable(assign s.flooded.$encode($1))]
if ([$#s.fv] == 1) {
@ s.fn = [$decode($mid(${rindex(. $s.fv) + 1} -1 $s.fv))]
I.Flood.$left(1 $0) $s.fn
} { if ([$#s.fv] > 1) {
S.Echo $1 matches more than one flooder. Try $(s.C.UNDERL)/i flood list
} { S.Echo No such flooder. Try $(s.C.UNDERL)/i flood list
}
}
} { if ([$s.lastflood]!=[]) {
I.Flood.$left(1 $0) $s.lastflood
} { S.Echo Try $(s.C.UNDERL)/i flood list
}
}
} { S.Echo Try $(s.C.UNDERL)/i help flood$(s.C.UNDERL) or $(s.C.UNDERL)/i flood list
}
}
}
###
## Internal aliases
#
alias S.Flood.Line {
#
# Store up to 15 lines of flood..
#
@ s.flooded.$(0) = [$(s.flooded.$(0))] + 1
@ s.flooded.$(0).txt.$(s.flooded.$(0).cnt) = [$1-]
if ([$(s.flooded.$(0))] > 15) {
#
# Minimize action if whoever it is keeps flooding, after
# storing 15 lines. This is ALMOST like auto-ignoring..
#
S.Echo 15 flood lines from $decode($0) stored, discarding remainder.
^on #^raw_irc 00 "%$decode($0) % % *" #
}
}
alias S.Flood.Hook {
#
# Silence the flood...
#
@ s.lastflood = [$1]
@ s.FLOOD.COUNT = s.FLOOD.COUNT + 1
@ s.flooded.$(2) = 1
@ s.flooded.$(2).who = [$0]
@ s.flooded.$(2).ref = [$word(0 $s.REF.UNSILENCE)$s.FLOOD.COUNT]
@ s.flooded.$(2).txt.0 = [$0!$1 $3 $N :$s.lmsg]
^on #^raw_irc 00 "%$1 % % *" \{s.flood.line $2 $$0-\}
^on #-raw_irc 00 "%$1 % #% *" {comment}
^on #-raw_irc 00 "%$1 % &% *" {comment}
^timer -refnum $(s.flooded.$(2).ref) $word(1 $s.REF.UNSILENCE) I.Flood.D $0
#
# Warn the user, silence THIS flood line..
#
s.echo Flood detected by $(s.C.BOLD)$(1)$(s.C.BOLD) - silencing.
s.echo Type $(s.C.UNDERL)/i flood see$(s.C.UNDERL) to display it, $(s.C.UNDERL)/i help flood$(s.C.UNDERL) for help.
^on #^window 00 * #
^timer 0 ^on #^window 00 -*
}
alias S.Flood.Count {
@ s.tmp = [$encode($strip(~ $1))]
@ s.lmsg = [$4-]
if ((!rmatch($0!$1 $s.list.ok_flood)) && (!ischannel($2))) {
if (rmatch($3$4$5$6$8 $s.misc.badflood)) {
S.Flood.Hook $0 $1 $s.tmp $3
} { S.MassCheck s.FloodLines.$(s.tmp) 1 $s.fp.sense S.Flood.Hook $0 $1 $s.tmp $3
}
}
}
alias S.Set.Flood_prot.fix {
#
# Set flood sensitivity ..
#
if ([$s.set.flood_prot] == 1) {
@ s.set.flood_prot = [3 lines/per 2 seconds]
}
@ s.fp.sense = [$strip($s.NONNUMERICS $word(0 $s.set.flood_prot))]
if (!s.fp.sense) {
@ s.fp.sense = 3
}
@ s.tmp = [$strip($s.NONNUMERICS $word(2 $s.set.flood_prot))]
if (!s.tmp) {
@ s.tmp = 2
}
@ s.set.flood_prot = [$s.fp.sense lines/per $s.tmp seconds]
@ s.fp.sense = [$s.fp.sense $s.tmp]
}
alias S.Set.Flood_prot {
if (s.set.flood_prot) {
S.set.flood_prot.fix
#
# Enable flood protection..
#
^on #-notice -71 "*" {s.flood.count $0 $userhost() X NOTICE $1-}
^on #-msg -71 "*" {s.flood.count $0 $userhost() X PRIVMSG $1-}
^on #-ctcp -71 "*" {s.flood.count $0 $userhost() $1 PRIVMSG $(s.C.CTCP)$2-$(s.C.CTCP)}
^on #-ctcp_reply -71 "*" {s.flood.count $0 $userhost() X NOTICE $(s.C.CTCP)$1-$(s.C.CTCP)}
^on #-invite -71 "*" {s.flood.count $0 $userhost() X INVITE $1-}
} { ^on #-notice -71 -"*"
^on #-msg -71 -"*"
^on #-ctcp -71 -"*"
^on #-ctcp_reply -71 -"*"
^on #-invite -71 -"*"
}
}
@ s.set.flood_prot.d = [Flood prot. sensitivity. 0..OFF, 1..DEFAULTS ]
@ s.set.flood_prot = (s.cfg.load.FLOOD_PROT == 1)
@ s.cfg.lastcmds = s.cfg.lastcmds ## [\;S.set.flood_prot]
###
## Catch standard CTCP floods..
#
alias s.flood.ctcphook {
@ s.tmp = s.uHostOnly($0)
if ([$s.tmp] != [$s.lastflood]) {
@ s.lmsg = [$3-]
S.Flood.Hook $s.c2s(! $0) $encode($s.tmp) PRIVMSG
}
}
alias s.set.no_ctcp_flood {
if (s.set.no_ctcp_flood) {
^eval on #^raw_irc 00 "%!% PRIVMSG % *$(s.C.CTCP)*$(s.C.CTCP)*$(s.C.CTCP)*" {s.flood.ctcphook $0-}
} { ^eval on #^raw_irc 00 -"%!% PRIVMSG % *$(s.C.CTCP)*$(s.C.CTCP)*$(s.C.CTCP)*"
}
}
@ s.set.no_ctcp_flood.d = [Quick CTCP protection, screws up /ignore. 0..OFF, 1..ON]
@ s.set.no_ctcp_flood = 0
@ s.cfg.lastcmds = s.cfg.lastcmds ## [\;S.set.no_ctcp_flood]
} ## End of flood protection
##############################################################################
###[ CLEAN UP DESYNCHED CHANNEL MESSAGES ]####################################
##############################################################################
##
## Level #00 hooks: raw_irc
##
## .. Thanks to Aard for this idea. :-)
if (s.cfg.load.QUIET_DESYNCH) {
###
## Assigns..
#
@ s.desynched = []
###
## Hook (internal) aliases..
#
alias s.desynch.hook {
if ([$0 $3]!=[$s.desynched]) {
s.echo $3 is desynched on $0
@ s.desynched = [$0 $3]
}
}
alias S.set.quiet_desynch {
if (s.set.quiet_desynch) {
^on #^raw_irc 00 "% 404 % % :*" {s.desynch.hook $0-}
^on #^raw_irc 00 "% 442 % % :*" {s.desynch.hook $0-}
} { ^on #^raw_irc 00 -"% 404 % % :*"
^on #^raw_irc 00 -"% 442 % % :*"
}
}
@ s.set.quiet_desynch.d = [Decrease noise created by desynched channels? 1..YES, 0..NO ]
@ s.set.quiet_desynch = (s.cfg.load.QUIET_DESYNCH == 1)
@ s.cfg.lastcmds = s.cfg.lastcmds ## [\;S.set.quiet_desynch]
} ## End of desynch code.
##############################################################################
###[ CLEAN UP SPLIT SIGNOFFS ]################################################
##############################################################################
##
## Level #00 hooks: channel_signoff
## Other hooks: timer/join (#-72)
##
## .. Idea adopted from PhoEniX by Vassago.
if (s.cfg.load.QUIET_SPLIT) {
###
## Internal variables..
#
@ s.SPLIT.COUNT = 0
@ s.REF.SPLIT = [88020 120]
###
## External aliases
#
@ s.parms.whosplit = 0
@ s.help.whosplit.a = [Usage: $(s.C.UNDERL)$(K)i whosplit]
@ s.help.whosplit.d = [Displays a summary of who split in recent netsplits.]
alias I.whosplit {
@ s.tmp = 1
foreach s.SPLIT.NICKS s.ii {
S.echo Split $decode($s.ii): (nicks split)
S.echo $(s.SPLIT.NICKS.$(s.ii))
@ s.tmp = 0
}
if (s.tmp) {
S.echo No netsplit detected. (data may have expired)
}
}
###
## Hook (internal) aliases
#
alias S.split.so {
@ s.tmp = [s.SPLIT.NICKS.$encode($2<->$3)]
if ([$($s.tmp)]==[]) {
S.echo Netsplit \($3\) detected\; $(s.C.UNDERL)$(K)i whosplit$(s.C.UNDERL) to see who left.
}
if (!match($1 $($s.tmp))) {
@ $(s.tmp) = [$($s.tmp) $1]
@ $(s.tmp).WHEN = [$time()]
}
}
alias S.split.jn {
foreach s.SPLIT.NICKS s.ii {
@ s.tmp = [s.SPLIT.NICKS.$s.ii]
@ s.tmp2 = [$match($0 $($(s.tmp)))]
if (s.tmp2) {
@ s.silent = 1
@ $(s.tmp) = [$s.notWord(${s.tmp2 - 1} $($(s.tmp)))]
@ $(s.tmp).WHEN = [$time()]
if (!match(% $($(s.tmp)))) {
^assign -$(s.tmp)
^assign -$(s.tmp).WHEN
}
}
}
}
alias S.split.timer {
foreach s.SPLIT.NICKS s.ii {
@ s.tmp = [s.SPLIT.NICKS.$s.ii]
if ([${time() - [$($(s.tmp).WHEN)]}] > 120) {
^assign -$(s.tmp)
^assign -$(s.tmp).WHEN
}
}
}
alias S.set.quiet_split {
if (s.set.quiet_split) {
^on #^channel_signoff 00 "% % %.% %.%" {s.split.so $0-}
^on #^join -72 * {S.split.jn $0-}
^on #^timer -72 * {S.split.timer}
} { ^on #^channel_signoff 00 -"% % %.% %.%"
^on #^join -72 -*
^on #^timer -72 -*
}
}
@ s.set.quiet_split.d = [Hide signoff/join messages caused by netsplits? 1..YES, 0..NO ]
@ s.set.quiet_split = (s.cfg.load.QUIET_SPLIT == 1)
@ s.cfg.lastcmds = s.cfg.lastcmds ## [\;S.set.quiet_split]
} ## End of split silencer.
##############################################################################
###[ CHANNEL POWER! ]#########################################################
##############################################################################
##
## Level #-73 hooks: mode, join, raw_irc, who, nick
##
if (s.cfg.load.CHANNEL_CODE) {
###
## Shorthand..
#
alias ban i ban
alias unban i unban
alias kban {if (match(-% $0)) {i ban $C $(0)K $1-} {i ban $C -K $0-}}
alias bkick kban
alias um {i lmode $0 u}
alias lm {i lmode}
alias mop {i modenop $0 +o}
alias mdop {i modeop $0 -o}
alias mvop {i modenop $0 +v}
alias mdvop {i modeall $0 -v}
alias whowas i.nickcache -U
@ s.help.aliases.ppl0 = [$(s.help.aliases.ppl0), whowas]
@ s.help.aliases.ch2 = [ ban, kban, unban, lm=last mode, um=undo mode]
@ s.help.aliases.ch3 = [ mop=mass op, mvop, mdop, mdvop]
@ s.misc.kickmsg.d = [Message printed when you $(K)k or autokick someone.]
@ s.misc.kickmsg = [Go away.]
###
## External aliases..
#
@ s.parms.modeop = 1
@ s.help.modeop.a = [Usage: $(s.C.UNDERL)$(K)i modeOp [channel] <+|->]
@ s.help.modeop.d = [Performs a mode change on all channel ops (e.g. -o = massdeop).]
alias I.ModeOp {
@ s.tch = [$s.channel($0)]
s.LoopMode $s.tch $($s.0) $s.chops($s.tch)
}
@ s.parms.modenop = 1
@ s.help.modenop.a = [Usage: $(s.C.UNDERL)$(K)i modeNop [channel] <+|->]
@ s.help.modenop.d = [Performs a mode change on all op-less users (e.g. +v = massvop).]
alias I.ModeNOp {
@ s.tch = [$s.channel($0)]
s.LoopMode $s.tch $($s.0) $s.nchops($s.tch)
}
@ s.parms.modeall = 1
@ s.help.modeall.a = [Usage: $(s.C.UNDERL)$(K)i modeAll [channel] <+|->]
@ s.help.modeall.d = [Performs a mode change on everyone (e.g. +v = massvop).]
alias I.ModeAll {
@ s.tch = [$s.channel($0)]
s.LoopMode $s.tch $($s.0) $strip(@+ $s.names($s.tch))
}
@ s.parms.whocmd = 3
@ s.help.whocmd.a = [Usage: $(s.C.UNDERL)$(K)i whocmd [chnl] [s]<[n]nick|email|mask|full> ]
@ s.help.whocmd.b = [ ]
@ s.help.whocmd.c = [Goes through the /WHO list on [chnl], and for each one comparing]
@ s.help.whocmd.d = [[status/]nick!user@host to the masks given. It then executes ]
@ s.help.whocmd.e = [giving a list of nicks/email addresses/ban masks/nick!user@host as]
@ s.help.whocmd.f = [arguments.]
@ s.help.whocmd.g = [If you prefix the type with an 'S' then you can search by status]
@ s.help.whocmd.h = [(H@*+) as well. Prefixing nick with an 'n' returns the nick list]
@ s.help.whocmd.i = [/names style, ex: sam joe @juggler +silly doofus]
@ s.help.whocmd.j = [ ]
@ s.help.whocmd.k = [Examples: $(K)i whocmd #evil snick *@*/*.edu echo Chanops from *.edu: $$0-]
@ s.help.whocmd.l = [ $(K)i whocmd #evil snick *G*/*.* echo People who are away: $$0-]
alias I.WhoCmd {
@ s.tch = [$s.channel($0)]
^alias I.WhoCmd.C \{$(${s.0 + 2}-)\}
I.WhoCmd.C $s.filtwho($s.tch $($s.0) $s.c2s(, $(${s.0 + 1})))
}
alias I.Ban.Kick {
if ([$2]!=[]) {
$(K)$(K)quote KICK $s.tch $0,$1,$2 :$s.misc.kickmsg
} {
if ([$1]!=[]) {
$(K)$(K)quote KICK $s.tch $0,$1 :$s.misc.kickmsg
} {
$(K)$(K)quote KICK $s.tch $0 :$s.misc.kickmsg
}
}
if ([$3]!=[]) {
I.Ban.Kick $1-
}
}
@ s.parms.ban = 0
@ s.help.ban.a = [Usage: $(s.C.UNDERL)$(K)i ban \[channel\] \[-E|K|P|D|N\] ]
@ s.help.ban.d = [Bans/kicks people from a channel. The flags mean...]
@ s.help.ban.e = [ -K Kick after ban. -1 Ban nick!*user@host.]
@ s.help.ban.f = [ -D Delayed kick. -2 Ban *!*user@host.]
@ s.help.ban.g = [ -P Permanent ban. -3 Ban *!*user@*.host. (default)]
@ s.help.ban.h = [ -S Screw ban. -4 Ban *!*@host.]
@ s.help.ban.i = [ -N No ban, kick only. -5 Ban *!*@*.host.]
@ s.help.ban.k = [ -F Faster, less complete kick code.]
@ s.help.ban.z = [Multiple flags MUST be combined, ex: $(s.C.UNDERL)$(K)i ban #evil -2SD juggler]
alias I.Ban {
@ s.tch = [$s.channel($0)]
if (rmatch($($s.0) -%)) {
@ s.t.arg = [$($s.0)]
@ s.0 = s.0 + 1
} {
@ s.t.arg = [-]
}
if ([$($s.0)]!=[]) {
s.mask.fix $s.t.arg $($(s.0)-)
if (match(% $s.mask.fix)) {
if (!match(%F% $s.t.arg)) {
@ s.mask.nicks = [$strip(@+ $s.nfilt($s.filtwho($s.tch nnick $s.mask.fix)))]
}
if (!match(%N% $s.t.arg)) {
S.LoopMode $s.tch -o $strip(@ $s.chops)
S.LoopMode $s.tch +b $s.mask.fix
}
if (match(% $s.mask.nicks)) {
if (match(%D% $s.t.arg)) {
timer 10 I.Ban.Kick $s.mask.nicks
} {
if (rmatch($s.t.arg %N% %K%)) {
I.Ban.Kick $s.mask.nicks
}
}
}
if (match(%P% $s.t.arg)) {
s.echo Warning: The bans will NOT be automatically removed.
} {
timer 600 S.LoopMode $s.tch -b $s.mask.fix
}
}
} {
$(K)$(K)mode $s.tch b
}
}
@ s.parms.nickcache = 1
@ s.help.nickcache.a = [Usage: $(s.C.UNDERL)$(K)i nickcache <-L|-D|-S|-U|-P> \[username\]]
@ s.help.nickcache.b = [Prints out stats (-S) about the nick cache and displays (-U) or]
@ s.help.nickcache.c = [deletes (-D) entries. Can also list/purge (-L or -P) the whole cache.]
@ s.help.nickcache.d = []
@ s.help.nickcache.e = [The nick cache operates by caching information your client 'sees']
@ s.help.nickcache.f = [all the time, about the nicks you are associating with. It]
@ s.help.nickcache.g = [rewrites the $(K)userhost command to use this cache for speed.]
alias I.NickCache {
if (!match(-% $0)) {
i nickcache
}
if ([$s.set.nick_cache] == [0]) {
s.echo The nick cache is OFF: /I SET NICK_CACHE ON turns it on.
}
@ s.tmp = [$(s.nick_cache.$tolower($encode($1)))]
if (match(-L $0)) {
foreach s.nick_cache s.ii {
s.echo $decode($s.ii) was last seen as $(s.nick_cache.$s.ii)
}
}
if (match(-D $0)) {
s.nick_cache.del $1
s.echo Removed $1 \($s.tmp\) from the nick cache.
}
if (match(-S $0)) {
@ s.tmp = 0
foreach s.nick_cache s.ii {
@ s.tmp = s.tmp + 1
}
s.echo The nick-cache contains $s.tmp entries, and has had $s.nick_cache_hits hits.
}
if (match(-U $0)) {
if ([$s.tmp] == []) {
s.echo $1 is not in the cache.
} {
s.echo $1 was last seen as $s.tmp
}
}
}
@ s.parms.lmode = 0
@ s.help.lmode.a = [Usage: $(s.C.UNDERL)$(K)i lmode \[channel\] [-U]]
@ s.help.lmode.b = [Redisplays the last mode change on a channel, or undoes it.]
alias I.LMode {
@ s.tch = [$s.channel($0)]
@ s.tmp = [$(s.lmode.$encode($tolower($s.tch)))]
if (match(%U% $($s.0))) {
$(K)$(K)quote MODE $s.tch $s.cXc(+ - $word(0 $s.tmp)) $s.wordfrom(1 $s.tmp)
} {
s.echo Last mode change on $(s.tch): "$s.tmp"
}
}
@ s.parms.unban = 1
@ s.help.unban.a = [Usage: $(s.C.UNDERL)$(K)i unban \[channel\] ]
@ s.help.unban.b = [ ]
@ s.help.unban.c = [Attempts to remove any bans on a user, if you specify his nick]
@ s.help.unban.d = [or bans on a group of users if you specify masks. More than one]
@ s.help.unban.e = [nick or mask, or a combination is OK.]
alias I.UnBan {
@ s.tch = [$s.channel($0)]
s.mask.fix -1 $($(s.0)-)
if (match(% $s.mask.fix)) {
@ s.mask.bl.$encode($tolower($s.tch)) = s.mask.fix
@ s.mask.ub.$encode($tolower($s.tch)) = []
^stack push on 367
^stack push on 368
^on #^367 00 "% $s.tch *" \{if \(\(match\($$2 $$\(s.mask.bl.$encode($tolower($s.tch))\)\)\) || \(rmatch\($$2 $$\(s.mask.bl.$encode($tolower($s.tch))\)\)\)\) \{@ s.mask.ub.$encode($tolower($s.tch)) = \[$$\(s.mask.ub.$encode($tolower($s.tch))\)$$2 \]\}\}
$(K)$(K)quote MODE $s.tch b
^on #^368 00 "% $s.tch *" {
^on #^367 00 -"% $1 *"
^on #^368 00 -"% $1 *"
^stack pop on 368
^stack pop on 367
@ s.tmpb = [$(s.mask.ub.$encode($tolower($1)))]
if (match(% $s.tmpb)) {
S.loopmode $1 -b $s.tmpb
}
^assign -s.mask.ub.$encode($tolower($1))
^assign -s.mask.bl.$encode($tolower($1))
}
}
}
###
## Internal aliases...
#
alias s.hide_nc_error {
# Hide "*** : No such nick/channel"
# and "*** They aren't on that channel" errors.
#
^on #^401 00 $0* #
^on #^441 00 $0* #
}
@ s.mask.screw = [azqxswcdevfrbgtnhymjukilop]
@ s.mask.type.1 = [$$2!*$$strip(~ $3)@$$4]
@ s.mask.type.2 = [*!*$$strip(~ $3)@$$4]
@ s.mask.type.3 = [$$s.wilduhost(* $3 $4)]
@ s.mask.type.4 = [*!*@$$4]
@ s.mask.type.5 = [*!*@$$S.host2banmask($4)]
@ s.mask.type.0 = s.mask.type.3
alias s.mask.hook {
if ([$3]!=[]) {
@ s.bant = rmatch($0 %1% %2% %3% %4% %5%)
eval @ s.tmpb = [$(s.mask.type.$(s.bant))]
if (match(%S% $0)) {
@ s.tmpb = [$s.c2c(0123456789$mid($rand(14) 12 $s.ban.screw) ? $s.tmpb)]
}
@ function_return = [$s.tmpb]
} {
s.echo WARNING: Could not find $2 online..
@ function_return = [$2!*@*]
}
}
@ s.mask.fix.1 = [*$$($s.bann)*]
@ s.mask.fix.2 = [$$($s.bann)*]
@ s.mask.fix.3 = [*$$($s.bann)]
@ s.mask.fix.4 = [$$($s.bann)]
@ s.mask.fix.5 = [$$($s.bann)*@*]
@ s.mask.fix.6 = [*$$($s.bann)@*]
@ s.mask.fix.7 = [$$($s.bann)@*]
@ s.mask.fix.8 = [*!*$$($s.bann)*]
@ s.mask.fix.9 = [*!$$($s.bann)]
@ s.mask.fix.10 = [*!*@$$($s.bann)]
@ s.mask.fix.0 = s.mask.fix.1
alias s.mask.fix {
# Prepare masks for proper banning and stuff..
# .. /userhost's nicks automatically or fixes masks.
#
@ s.mask.fix = []
@ s.mask.nicks = []
@ s.bann = [$1-]
@ s.bann = [$#s.bann]
while (s.bann > 0) {
@ s.bant = rmatch($($s.bann) !%@ %!%@ !%@% %!%@% %! !% %!% %@ %@% %.% %)
if (s.bant == 11) {
@ s.mask.nicks = s.mask.nicks ## [$($s.bann) ]
userhost $($s.bann) -CMD @ s.banf = [$$s.mask.hook\($0 $s.tch $$0 $$3 $$4\) $$s.mask.fix]
} {
eval @ s.banf = [$(s.mask.fix.$(s.bant)) $$s.mask.fix]
}
@ s.mask.fix = s.banf
@ s.bann = s.bann - 1
}
@ function_return = [$s.mask.fix]
}
alias s.names {
^stack push on NAMES
^on #^names 00 "$0 *" {@ s.nlist = [$1-]}
$(K)$(K)names $0
wait
^on names -
^stack pop on NAMES
@ function_return = [$s.nlist]
}
alias s.chops {
# Returns a list of OPped people. Strips @ and + chars from nicks.
#
s.nfilt $s.names($0)
@ function_return = [$strip(@+ $s.chops)]
}
alias s.nchops {
# Returns a list of unOPped P-pl. Strips @ and + chars from nicks.
#
s.nfilt $s.names($0)
@ function_return = [$strip(@+ $s.nlist)]
}
alias s.filtwho.email {^eval on #^who 00 "$0 *" \{if \(rmatch\($$1!$$3@$$4 $1-\)\) \{@ s.nlist = \[$$3@$$4 $$s.nlist\]\}\}}
alias s.filtwho.mask {^eval on #^who 00 "$0 *" \{if \(rmatch\($$1!$$3@$$4 $1-\)\) \{@ s.nlist = \[$$s.wilduhost\(* $$3 $$4\) $$s.nlist\]\}\}}
alias s.filtwho.nick {^eval on #^who 00 "$0 *" \{if \(rmatch\($$1!$$3@$$4 $1-\)\) \{@ s.nlist = \[$$1 $$s.nlist\]\}\}}
alias s.filtwho.nnick {^eval on #^who 00 "$0 *" \{if \(rmatch\($$1!$$3@$$4 $1-\)\) \{@ s.nlist = \[$$strip\(HG* $$2\)$$1 $$s.nlist\]\}\}}
alias s.filtwho.full {^eval on #^who 00 "$0 *" \{if \(rmatch\($$1!$$3@$$4 $1-\)\) \{@ s.nlist = \[$$1!$$3@$$4 $$s.nlist\]\}\}}
alias s.filtwho.Semail {^eval on #^who 00 "$0 *" \{if \(rmatch\($$2/$$1!$$3@$$4 $1-\)\) \{@ s.nlist = \[$$3@$$4 $$s.nlist\]\}\}}
alias s.filtwho.Smask {^eval on #^who 00 "$0 *" \{if \(rmatch\($$2/$$1!$$3@$$4 $1-\)\) \{@ s.nlist = \[$$s.wilduhost\(* $$3 $$4\) $$s.nlist\]\}\}}
alias s.filtwho.Snick {^eval on #^who 00 "$0 *" \{if \(rmatch\($$2/$$1!$$3@$$4 $1-\)\) \{@ s.nlist = \[$$1 $$s.nlist\]\}\}}
alias s.filtwho.Snnick {^eval on #^who 00 "$0 *" \{if \(rmatch\($$2/$$1!$$3@$$4 $1-\)\) \{@ s.nlist = \[$$strip\(HG* $$2\)$$1 $$s.nlist\]\}\}}
alias s.filtwho.Sfull {^eval on #^who 00 "$0 *" \{if \(rmatch\($$2/$$1!$$3@$$4 $1-\)\) \{@ s.nlist = \[$$1!$$3@$$4 $$s.nlist\]\}\}}
alias s.filtwho {
# s.filtwho
# Returns a list of users on $0 who's nick!user@host matches one of
# the specified patterns. (This is *much* slower than s.names!)
#
@ s.nlist = []
^stack push on WHO
s.filtwho.$1 $0 $2-
who $0
wait
^on who -
^stack pop on WHO
@ function_return = [$s.nlist]
}
###
## Hook aliases.
#
alias s.channel.autorejoin {
if ((s.set.auto_rejoin) && ([$3]==[$N])) {
timer 1 join $2
@ s.set.auto_rejoin = 0
timer 10 @ s.set.auto_rejoin = 1
}
}
alias S.set.auto_rejoin {
if (s.set.auto_rejoin) {
^on #-raw_irc -73 "% KICK % % :*" {s.channel.autorejoin $0-}
} {
^on #-raw_irc -73 -"% KICK % % :*"
}
}
@ s.set.auto_rejoin.d = [Auto-rejoin channels after being kicked? 1..YES, 0..NO ]
@ s.set.auto_rejoin = s.cfg.load.CHANNEL_CODE.auto_rejoin
@ s.cfg.lastcmds = s.cfg.lastcmds ## [\;S.set.auto_rejoin]
alias s.nick_cache.add {
@ s.nick_cache.$encode($tolower($0)) = [$1]
}
alias s.nick_cache.del {
^assign -s.nick_cache.$encode($tolower($0))
}
alias S.set.nick_cache {
if (s.set.nick_cache) {
^on #-raw_irc -73 "%!%@% *" {s.nick_cache.add $s.nickonly($0) $s.ruhostonly($0)}
^on #-raw_irc -73 "% 302 % :%=%@%" {s.nick_cache.add $mid(1 ${index(= $3) -1} $3) $mid(${index(= $3) +2} -1 $3)}
^on #-who -73 * {s.nick_cache.add $1 $3@$4}
^on #-nick -73 * {
@ s.nick_cache.$encode($tolower($1)) = $(s.nick_cache.$encode($tolower($0)))
^assign -s.nick_cache.$encode($tolower($0))
}
@ s.nick_cache_hits = 0
^alias userhost {
@ s.uhtmp = [$(s.nick_cache.$encode($tolower($0)))]
if ([$s.uhtmp] != []) {
if ([$1] == [-cmd]) {
@ s.nick_cache_hits = s.nick_cache_hits + 1
@ s.i = [$index(@ $s.uhtmp)]
^alias s.tmp $2-
^s.tmp $0 - - $left($s.i $s.uhtmp) $mid(${s.i + 1} -1 $s.uhtmp)
^alias -s.tmp
} {
s.rxecho CRAP $0 is $s.uhtmp
}
} {
$(K)$(K)userhost $0-
wait
}
}
} {
^on #-raw_irc -73 -"%!%@% *"
^on #-raw_irc -73 -"% 302 % :%=%@%"
^on #-nick -73 -*
^on #-who -73 -*
^alias -userhost
}
}
@ s.set.nick_cache.d = [Cache nick!user@host info? 1..YES, 0..NO ]
@ s.set.nick_cache = s.cfg.load.CHANNEL_CODE.nick_cache
@ s.cfg.lastcmds = s.cfg.lastcmds ## [\;S.set.nick_cache]
alias S.set.no_server_modes {
if (s.set.no_server_modes) {
^on #^mode -73 "% % *" {
if (match(%.% $0)) {
$(K)$(K)quote MODE $1 $s.cXc(+ - $2) $3-
} {
@ s.lmode.$encode($tolower($1)) = [$2-]
}
}
} { ^on #^mode -73 "% % *" {@ s.lmode.$encode($tolower($1)) = [$2-]}
}
}
@ s.set.no_server_modes.d = [Undo all mode changes from servers? 1..YES, 0..NO ]
@ s.set.no_server_modes = s.cfg.load.CHANNEL_CODE.no_server_modes
@ s.cfg.lastcmds = s.cfg.lastcmds ## [\;S.set.no_server_modes]
} ## End of channel code.
##############################################################################
###[ NOTIFY STUFF ]###########################################################
##############################################################################
##
## Level #00 hooks: notify_signon, notify_signoff
##
if (s.cfg.load.NOTIFY_STUFF) {
@ s.list.notify.d = [Special notify nick!user@host patterns. Full nick req'd.]
@ s.list.notify = []
@ s.misc.notify_on.d = [Notify_signon messages. $$0 = nick, $$s.notify.info = u@h/ircop/away ]
@ s.misc.notify_on = [Signed on: $$[9]0 \\\($$s.notify.info\\\)]
@ s.misc.notify_off.d = [Notify_signoff message. $$0 = nick, $$1 = u@h/ircop ]
@ s.misc.notify_off = [Signed off: $$[9]0 \\\(was $$s.notify.info\\\)]
@ s.not.1$encode(+) = [, an IrcOp]
@ s.not.2$encode(+) = [, $(K)away]
alias s.notified {
@ s.notify.info = [$3@$4$(s.not.1$encode($1))$(s.not.2$encode($2))]
if (match($0!* $s.list.notify)) {
if (rmatch($0!$3@$4 $s.list.notify)) {
eval s.rxecho CRAP $s.misc.notify_on
@ s.notified.$encode($tolower($0)) = [$3@$4$(s.not.1$encode($1))]
}
} {
eval s.rxecho CRAP $s.misc.notify_on
@ s.notified.$encode($tolower($0)) = [$3@$4$(s.not.1$encode($1))]
}
}
alias s.set.notify_stuff {
if (s.set.notify_stuff) {
^on #^notify_signon 00 * {
if (!s.silent) {
$(K)$(K)userhost $0 -cmd s.notified $$0-
} {
@ s.silent = 0
}
}
^on #^notify_signoff 00 * {
@ s.notify.info = [$(s.notified.$encode($tolower($0)))]
^assign -s.notified.$encode($tolower($0))
if ([$s.notify.info]!=[]) {
eval s.rxecho CRAP $s.misc.notify_off
}
}
} {
^on #^notify_signon 00 -*
}
}
@ s.set.notify_stuff.d = [Enhance notify messages? 1..YES, 0..NO ]
@ s.set.notify_stuff = (s.cfg.load.NOTIFY_STUFF == 1)
@ s.cfg.lastcmds = s.cfg.lastcmds ## [\;S.set.notify_stuff]
} ## end of notify code
##############################################################################
###[ AWAY STUFF ]#############################################################
##############################################################################
##
## Level #00 hooks: channel_signoff, raw_irc
## Other hooks: idle (#74), 305 (#74,#75), 306 (#74,#75),
## msg (#75), notice (#75), dcc_chat (#75)
##
if (s.cfg.load.AWAY_STUFF) {
###
## Assigns
#
@ s.misc.awaystub.d = [This is appended to your $(K)AWAY message when logging.]
@ s.misc.awaystub = [\[Logging Messages\]]
@ s.MLOGC = 0
###
## Shorthand...
#
alias away i.away
###
## External aliases
#
@ s.parms.messages = 0
@ s.help.messages.a = [Usage: $(s.C.UNDERL)$(K)i messages \[kill\]]
@ s.help.messages.d = [Displays and deletes messages that were logged while you were away.]
@ s.help.messages.e = [The "kill" parameters deletes messages without displaying them.]
alias I.Messages {
if (s.MLOGC > 0) {
if (!match(k% $0)) {
s.echo $(s.C.BOLD)Logged messages:$(s.C.BOLD) (deleting)
} {
s.echo Deleting logged messages.
}
foreach s.MLOG s.XX {
if (!match(k% $0)) {s.echo $(s.MLOG.$(s.XX))}
^assign -s.MLOG.$(s.XX)
}
@ s.MLOGC = 0
} {
s.echo No messages have been logged.
}
}
@ s.parms.away = 0
@ s.help.away.a = [Usage: $(s.C.UNDERL)$(K)i away \[message\]]
@ s.help.away.d = [Sets you away, and appends $s.misc.awaystub to the message.]
alias I.away {
if (([$0-] != []) && (s.set.away_logging)) {
$(K)$(K)away $0- $(s.misc.awaystub)
} {
$(K)$(K)away $0-
}
}
###
## Internal aliases
#
alias s.away_lawg {
@ s.mlog.$right(4 0000$(s.MLOGC)) = [\($Z\) $0$1$2$0 $3-]
@ s.MLOGC = s.MLOGC + 1
}
alias S.away_hook {
^on #-timer 75 "*0" {/date}
^on #-msg 75 "*" {s.away_lawg * $0 !$userhost() $1-}
^on #-notice 75 "*" {s.away_lawg - $0 !$userhost() $1-}
^on #-dcc_chat 75 "*" {s.away_lawg = $0 $(s.C.JUNK) $1-}
^on #-305 71 "*" {
^on #-timer 75 -"*0"
^on #-msg 75 -"*"
^on #-notice 75 -"*"
^on #-dcc_chat 75 -"*"
^on #-305 75 -"*"
if (s.MLOGC) {
S.echo Type $(s.C.UNDERL)$(K)i messages$(s.C.UNDERL) to read $(s.MLOGC) logged message(s).
}
}
}
alias S.set.away_logging {
if (s.set.away_logging) {
^on #-306 75 "*" {s.away_hook}
} {
^on #-306 75 -"*"
}
}
@ s.set.away_logging.d = [Log messages while you are $(K)away? 1..YES, 0..NO ]
@ s.set.away_logging = (s.cfg.load.AWAY_STUFF == 1)
@ s.cfg.lastcmds = s.cfg.lastcmds ## [\;S.set.away_logging]
@ s.misc.auto_away_msg.d = [Auto away message. $$0 is idle time in minutes.]
alias S.fix_auto_away_msg {
if (!match(% $s.misc.auto_away_msg)) {
@ s.misc.auto_away_msg = [Idle for $$0 minutes .. ]
}
}
@ s.rehashcmds.MISC = s.rehashcmds.MISC ## [\;S.fix_auto_away_msg]
alias S.auto_away {
if ([$0] >= [$word(0 $s.set.auto_away)]) {
if (([$word(0 $A)] == [Idle]) || ([$A]==[])) {
if ([$A]==[]) {
^on #-306 74 "*" {
^on #^raw_irc 0 "% 306 *" {comment}
^on #-306 74 -"*"
}
^on #-305 74 "*" {
^on #^raw_irc 0 -"% 306 *"
^on #-305 74 -"*"
}
}
eval I.away $s.misc.auto_away_msg
}
} { if ([$word(0 $A)] == [Idle]) {away}
}
}
alias S.set.auto_away {
if ([$word(0 $s.set.auto_away)]) {
@ s.set.auto_away = [$strip($s.NONNUMERICS $word(0 $s.set.auto_away))]
if (s.set.auto_away < 1) {
@ s.set.auto_away = 2
}
@ s.set.auto_away = [$s.set.auto_away minute(s)]
^on #^idle 74 * {S.auto_away $0-}
} {
^on #^idle 74 -*
@ s.set.auto_away = 0
}
}
@ s.set.auto_away.d = [Number of idle minutes before auto-away. 0..OFF ]
if (s.cfg.load.AWAY_STUFF == 1) {
@ s.set.auto_away = 2
} {
@ s.set.auto_away = 0
}
@ s.cfg.lastcmds = s.cfg.lastcmds ## [\;S.set.auto_away]
} ## End of /AWAY stuff.
##############################################################################
###[ TAH DAH!! ]##############################################################
##############################################################################
eval @ s.tmp = [$W]
eval ^cd $s.TIS_HOME
eval if ([$W]==[$s.tmp]) {
^exec mkdir $s.TIS_HOME
^sleep 1
^cd $s.TIS_HOME
eval if ([$W]==[$s.tmp]) {
timer 2 s.echo WARNING: Failed to create $(s.TIS_HOME), using $s.tmp instead.
@ s.TIS_HOME = [$s.tmp]
} {
timer 2 s.echo Created $s.TIS_HOME for script save files.
}
}
eval ^cd $s.tmp
if (s.cfg.load.LOADED_BLURB == 2) {
eval S.echo Installed: $(s.C.BOLD)$s.TIS_VERSION$(s.C.BOLD) by Juggler/BTL
} {
if (s.cfg.load.LOADED_BLURB) {
eval echo ______________________________________________________________________________
eval echo $(s.C.JUNK)
eval echo You have loaded $(s.C.BOLD)$(s.TIS_VERSION)$(s.C.BOLD) by Juggler/BTL
eval echo Type $(s.C.UNDERL)$(K)i help$(s.C.UNDERL) for a list of commands.
eval echo $(s.C.JUNK)
eval echo WARNING: This script is not finished, please don't expect anything to work.
eval echo NOTE: If you just upgraded from an older version, see: $(s.C.UNDERL)$(K)i help new
eval echo ______________________________________________________________________________
eval echo $(s.C.JUNK)
}
}
##
## Check if the script has been configured, and warn user if he hasn't
## done so..
##
@ s.loaded.configuration = 0
eval load $(s.TIS_HOME)/$word(0 $(s.save.file.CFG))
eval load $(s.TIS_HOME)/$word(0 $(s.save.file.LISTS))
eval load $(s.TIS_HOME)/$word(0 $(s.save.file.MISC))
eval eval $s.rehashcmds.CFG
eval eval $s.rehashcmds.LISTS
eval eval $s.rehashcmds.MISC
###
## Configuration check..
#
if (!s.loaded.configuration) {
alias s.AutoCfg {
s.echo
s.echo Configure your script now! Everything was loaded, but
s.echo few things are active. Use $(s.C.UNDERL)$(K)i config load$(s.C.UNDERL) to avoid loading
s.echo things you never use in the future, or to enable emulation of other
s.echo common IRC scripts, such as TABKEY.
s.echo Read $(s.C.UNDERL)$(K) help$(s.C.UNDERL)!!
s.echo
i config cfg
^alias -s.autocfg
}
input "Press ENTER for autoconfiguration (be sure to save!) . . . " s.autocfg
} ## Configuration check..
^assign -s.loaded.configuration
^assign -s.loaded.lists
^assign -s.loaded.load
eval timer 0 eval $s.cfg.lastcmds