; #= P&P -rs -1 ; @======================================: ; | Peace and Protection | ; | Themes display and anything "last" | ; `======================================' ; ; Text display support functions ; ; Your input- say, me, msg, describe, notice ; Normally we don't need to alias these except for nick completion purposes ; /theme.msg type target color text ; Shows a themed msg/etc. type is Text or Action ; Returns 1 if msg was shown to active. alias theme.msg { set -u %::text $4- set -u %::target $2 if ($2 ischan) { set -u %::nick $me set -u %::address $gettok($hget(pnp. $+ $cid,-myself),2-,33) set -u %::chan $2 set -u %:echo echo $3 -ti2 $2 theme.text $1 $+ ChanSelf c } elseif ($query($2)) { set -u %::nick $2 set -u %:echo echo $3 -ti2 $2 theme.text $1 $+ QuerySelf } elseif ((=* iswm $2) && ($chat($right($2,-1)))) { set -u %::nick $right($2,-1) set -u %:echo echo $3 -ti2 $2 theme.text $1 $+ QuerySelf } else { set -u %::nick $2 set -u %:echo echo $3 -ati2 $iif($activecid != $cid,$:anp) theme.text TextMsgSelf return 1 } return 0 } ; /theme.msgcopy target color text ; Shows a copy of a msg to active if the query isn't active (this does nothing if target isn't a query) ; Only if settings are set for copy query to active alias -l theme.msgcopy { ; Copy to active? if (($hget(pnp.config,copy.query)) && ($active != $1) && (($active ischan) || ($query($active)))) { set -u %::text $3- set -u %::target $1 ; show as (net)nick if not on active net set -u %::nick $1 set -u %:echo echo $2 -ati2 $iif($activecid != $cid,$:anp) theme.text TextMsgSelf } } ; /notice.beep ; Does a notice event beep (sound, or beep, or nothing) ; Skips if in a sound already alias notice.beep { if (($inwave) || ($inmidi) || ($insong)) return if ($_optn(5,15) == 0) return var %beep = $_optn(1,16) if (%beep == 1) beep elseif (%beep) .splay " $+ $readini($mircini,n,waves,$1) $+ " } ; /notice.window target ; Opens notices window if not open; fills editbox regardless ; Returns window name alias -l notice.window { ; Open window? var %win = $_mservwin(@Notices) if ($window(%win) == $null) { ; (minimize if minimize queries is on) _window 1 $iif($_optn(1,18),-env,-ev) + %win -1 -1 -1 -1 /n @Notices titlebar %win ( $+ $hget(pnp. $+ $cid,net) - F1 to cycle) } ; Don't fill editbox if something is being typed if ($numtok($editbox(%win),32) > 2) return %win ; Determine proper cmd to fill with- opvoc notice, op notice/msg, services reply, reg notice if (@+* iswm $1) editbox -p %win /ovnotice $right($1,-2) elseif (@%* iswm $1) editbox -p %win /ohnotice $right($1,-2) elseif (@* iswm $1) editbox -p %win $iif($event == NOTICE,/onotice,/omsg) $right($1,-1) elseif ($istok($hget(pnp. $+ $cid,-servnick),$1,32)) editbox -p %win / $+ $_botacc($1) else editbox -p %win /notice $1 return %win } ; /show.opnotice target display ; Used to echo an op/etc notice alias show.opnotice { ; Normal- to channel if ($hget(pnp.config,op.notice) == 0) echo $color(notice) -bfmti2 $1 $2- ; To notices window elseif ($hget(pnp.config,op.notice) == 1) { ; Open to target if target contains channel name notice.window $iif($1 isin $target,$target,@ $+ $1) echo $color(notice) -bfmti2 $result $2- } ; To channel events window else { echo $color(notice) -bfmti2 $event.win($1) $2- } } ; $event.win(#chan) ; Opens events window for a channel if not open; returns window name alias -l event.win { ; (minimize if minimize queries is on) var %win = $_mservwin(@Events,- $+ $1) if ($window(%win) == $null) { _window 1 $iif($_optn(1,18),-env,-ev) + %win -1 -1 -1 -1 @Events- titlebar %win ( $+ $hget(pnp. $+ $cid,net) $+ ) } return %win } ; Enable group to allow theming of text, joins, and other basic mIRC output #pp-texts on ; ; Basic text display ; ; /event.chan event text ; set echo yourself. This sets stripped text, chan, nick, address, target ; set linesep yourself if event can use it alias -l event.chan { set -u %::text $strip($2-,mo) set -u %::chan $target set -u %::nick $nick set -u %::address $address set -u %::target $target theme.text $1 c } ; Channel text, action, notice on &^*:TEXT:*:#:{ ; Global message or channel not open if (($me !ison $target) && (#* iswm $target)) { if (* isin $target) return halt } ; Op or regular text? if (@* iswm $target) { set -u %:echo show.opnotice $chan event.chan TextChanOp $1- } else { set -u %:echo echo -lmbfti2 $chan event.chan TextChan $1- } halt } on &^*:ACTION:*:#:{ set -u %:echo echo $color(act) -lmbfti2 $chan ; Op or regular text? event.chan $iif(@* iswm $target,ActionChanOp,ActionChan) $1- halt } on &^*:NOTICE:*:#:{ ; Op or regular text? (or global/not on chan?) if (@* iswm $target) { _ssplay NoticeChanOp set -u %:echo show.opnotice $chan } elseif ($me !ison $target) { _ssplay Notice set -u %:echo echo $color(notice) -lmbfsti2 } else { _ssplay Notice set -u %:echo echo $color(notice) -lmbfti2 $chan } ; Event beep; sound (above) based on type of event notice.beep event.chan NoticeChan $1- halt } ; Private text, action, notice, chat on &^*:TEXT:*:?:{ ; Global message if ($left($target,1) == $) return set -u %::text $strip($1-,mo) set -u %::nick $nick set -u %::address $address set -u %::target $target ; Show to query if open if ($query($nick)) { set -u %:echo echo -lmbfti2 $nick theme.text TextQuery ; Show also to active if copy-query is on, active is a chan/query, and not the current query if (($hget(pnp.config,copy.query) != 1) || ($active == $nick)) halt if (($active !ischan) && ($query($active) != $active)) halt } ; Show to dqwindow? elseif ($_optn(0,22)) { ; Pop window up if empty and mIRC option set to do so if (($line(Message Window,0) == $null) && ($_optn(1,18) == 0)) dqwindow show set -u %:echo echo -lmbfdti2 theme.text TextMsg ; Show also to active if copy-query is on and active is a chan/query if ($hget(pnp.config,copy.query) != 1) halt if (($active !ischan) && ($query($active) != $active)) halt } ; Show to active- either by default, or as a fall-through from above set -u %:echo echo -lmbfati2 $iif($activecid != $cid,$:anp) theme.text TextMsg halt } on &^*:ACTION:*:?:{ set -u %::text $strip($1-,mo) set -u %::nick $nick set -u %::address $address set -u %::target $target ; Show to query if open if ($query($nick)) { set -u %:echo echo $color(act) -lmbfti2 $nick theme.text ActionQuery ; Show also to active if copy-query is on, active is a chan/query, and not the current query if (($hget(pnp.config,copy.query) != 1) || ($active == $nick)) halt if (($active !ischan) && ($query($active) != $active)) halt } ; Show to dqwindow? elseif ($_optn(0,22)) { ; Pop window up if empty and mIRC option set to do so if (($line(Message Window,0) == $null) && ($_optn(1,18) == 0)) dqwindow show set -u %:echo echo $color(act) -lmbfdti2 theme.text ActionQuery ; Show also to active if copy-query is on and active is a chan/query if ($hget(pnp.config,copy.query) != 1) halt if (($active !ischan) && ($query($active) != $active)) halt } ; Show to active- either by default, or as a fall-through from above set -u %:echo echo $color(act) -lmbfati2 $iif($activecid != $cid,$:anp) theme.text TextMsg halt } on &^*:NOTICE:*:?:{ set -u %::text $strip($1-,mo) set -u %::nick $nick set -u %::address $address set -u %::target $target ; Determine method of display ; "Opnotice" if (%.opnotice) { _ssplay NoticeChanOp set -u %:echo show.opnotice %.opnotice } else { _ssplay Notice ; Services or normal nickname? if ($istok($hget(pnp. $+ $cid,-servnick),$nick,32)) var %window = $hget(pnp.config,serv.notice) else var %window = $hget(pnp.config,reg.notice) ; Determine from window setting, mIRC options, etc. where to display ; In order- ; DCC notices- status ; Window is "status"- status ; Window is "notices window"- notices window ; mIRC "to active" set and active is a query/channel- active ; Common channels- to all common channels ; Otherwise- to status if (($1 === DCC) || (%window == 2)) set -u %:echo echo $color(notice) -emsti2 elseif (%window == 1) { notice.window $nick set -u %:echo echo $color(notice) -mbfti2 $result } elseif ((($active ischan) || ($query($active))) && ($_optn(5,13))) set -u %:echo echo $color(notice) -mbfati2 $iif($activecid != $cid,$:anp) elseif ($comchan($nick,0)) { var %num = $comchan($nick,0) while (%num >= 1) { set -u %:echo echo $color(notice) -mbfti2 $comchan($nick,%num) theme.text Notice dec %num } ; Event beep; sound above (notice or opnotice) notice.beep halt } else set -u %:echo echo $color(notice) -emsti2 } ; Event beep; sound above (notice or opnotice) notice.beep theme.text Notice halt } on &^*:CHAT:*:{ ; Ignore sounds if ($1 == SOUND) return set -u %::nick $nick ; Actions treated differently if ($1 == ACTION) { ; Make sure ends in chr(1) before removing it if (* iswm $1-) set -u %::text $strip($left($2-,-1),mo) else set -u %::text $strip($2-,mo) set -u %:echo echo $color(act) -lmbfti2 = $+ $nick theme.text ActionQuery } else { set -u %::text $strip($1-,mo) set -u %:echo echo $color(norm) -lmbfti2 = $+ $nick theme.text TextQuery } halt } alias say { ; Errors if ($1 == $null) { if ($show) _qhelp /say halt } if (($active !ischan) && (=* !iswm $active) && ($query($active) == $null)) { dispa /say $+ : Can't use /say in this window halt } ; Display if ($show) theme.msg Text $active $color(own) $1- ; Actually say text (using .msg because .say doesn't work) .!msg $active $1- ;!! hack for back-on-keypress (until mirc does it on it's own for /msg or allows /.say) if (($_optn(0,9)) && ($server)) .raw away } alias action { me $1- } alias me { ; Errors if ($1 == $null) { if ($show) _qhelp /me halt } if (($active !ischan) && (=* !iswm $active) && ($query($active) == $null)) { dispa /me $+ : Can't use /me in this window halt } ; Display if ($show) theme.msg Action $active $color($iif($color(own) == $color(norm),action,own)) $1- ; Actually say text .me $1- } alias msg { ; Errors if ($2 == $null) { if ($show) _qhelp /msg $1 halt } ; (leave dccs alone) if (=* iswm $1) msg $1- elseif ($show) { var %who = $_ncs(44,$1) ; Display theme.msg Text %who $color(own) $2- if (!$result) theme.msgcopy %who $color(own) $2- ; Actually say text ; (use privmsg due to problems sending to @+#chan) _privmsg %who $2- } ; Actually say text (if no display) else _privmsg $1 $2- } alias describe { ; Errors if ($2 == $null) { if ($show) _qhelp /msg $1 halt } ; (leave dccs alone) if (=* iswm $1) describe $1- elseif ($show) { var %who = $_ncs(44,$1) ; Display theme.msg Action %who $color($iif($color(own) == $color(norm),action,own)) $2- if (!$result) theme.msgcopy %who $color($iif($color(own) == $color(norm),action,own)) $2- ; Actually say text .describe %who $2- } ; Actually say text (if no display) else .describe $1 $2- } alias notice { ; Errors if ($2 == $null) { if ($show) _qhelp /notice $1 halt } if ($show) { var %who = $_ncs(44,$1) ; Display set -u %::text $2- set -u %::target $1 set -u %:echo echo $color(own) -ati2 $iif($activecid != $cid,$:anp) if ($_ischan($1)) { set -u %::nick $me set -u %::address $gettok($hget(pnp. $+ $cid,-myself),2-,33) set -u %::chan $1 theme.text NoticeSelfChan c } elseif ((@* iswm $1) && ($_ischan($right($1,-1)))) { set -u %::nick $me set -u %::address $gettok($hget(pnp. $+ $cid,-myself),2-,33) set -u %::chan $right($1,-1) theme.text NoticeSelfChan c } else { set -u %::nick $1 theme.text NoticeSelf } ; Actually say text .notice %who $2- } ; Actually say text (if no display) else .notice $1 $2- } ; /event.target #chan type ; Event targeting for a channel/type of event ; Returns hide, chan, $true, 0/$null, both ; 'both' is for quits only ; '$true' is events window ; '0/$null' is status alias -l event.target { ; Retrieve setting for this channel or all channels var %val = 0 if ($hget(pnp.config,$+(event.,$2,.,$1)) != $null) %val = $ifmatch elseif ($hget(pnp.config,event. $+ $2) != $null) %val = $ifmatch ; If we found non-zero, return it if (%val) return %val ; Retrieve mIRC setting %val = $gettok($iif($2 == quit,chan.0.both.hide,$iif($2 == nick,chan.hide,chan.0.hide)),$mirc.event($1,$findtok(join.part.quit.mode.topic.ctcp.nick.kick,$2,1,46)),46) return %val } ; $mirc.event(#chan,token) ; Retrieves mirc event settings in a #channel ; Uses defaults if channel-specific not present ; Caches as needed alias -l mirc.event { ; Default events cached? Read in, default to all zeroes if ($hget(pnp,ev.def) == $null) { var %data = $readini($mircini,n,events,default),%pos = 1 if (%data == $null) %data = 0,0,0,0,0,0,0,0 ; Increase all by one, as defaults are "off" by one while (%pos <= 8) { %data = $puttok(%data,$calc($gettok(%data,%pos,44) + 1),%pos,44) inc %pos } ; Cache for up to 8 seconds hadd -u8 pnp ev.def %data } ; Events for this window cached? Start with defaults if ($hget(pnp,ev. $+ $1) == $null) { var %data = $hget(pnp,ev.def),%pos = 1 ; If specific events exist, use those if ($readini($mircini,n,events,$1)) { %data = $ifmatch ; For each zero, replace with default while (%pos <= 8) { if ($gettok(%data,%pos,44) == 0) %data = $puttok(%data,$gettok($hget(pnp,ev.def),%pos,44),%pos,44) inc %pos } } ; Cache for up to 8 seconds hadd -u8 pnp ev. $+ $1 %data } ; Return requested token return $gettok($hget(pnp,ev. $+ $1),$2,44) } ; Mode, Join, Part, Quit, Kick, Nick, Topic on &^*:RAWMODE:#:{ event.target $chan mode if ($result == hide) halt set -u %::chan $chan set -u %::modes $1- set -u %::text $1- set -u %::nick $nick set -u %::address $address if ($result == chan) { set -u %:echo echo $color(mode) -ti2 $chan theme.text Mode c } elseif ($result) { set -u %:echo echo $color(mode) -ti2 $event.win($chan) theme.text Mode c } else { set -u %:echo echo $color(mode) -esti2 theme.text ModeStatus c } halt } on me:&^*:JOIN:#:{ ; Myself set -u %::chan $chan set -u %::nick $nick set -u %::address $address set -u %:echo echo $color(join) -ti2 $chan set -u %:linesep dispr-div $chan theme.text JoinSelf c ; Linesep? if ($hget(pnp.events,JoinSelfLineSep)) dispr-div $chan halt } on &^!*:JOIN:#:{ ; Others event.target $chan join if ($result == hide) halt var %targ = $result set -u %::chan $chan set -u %::nick $nick set -u %::address $address ; Clone count, for %:comments ; Only if enabled and level < 25 if (($_getchopt($chan,7)) && ($_level($chan,$level($fulladdress)) < 25)) { var %num = 1,%who,%mask = $mask($fulladdress,1),%count = $ialchan(%mask,$chan,0) ; If not scanning by ident, and more clones by site alone, use that if ($_getcflag($chan,2) == 0) { if ($ialchan($wildsite,$chan,0) > %count) { %count = $ifmatch %mask = $wildsite } } ; If only one, ignore if (%count > 1) { ; List all other nicks, up to 5 total while ((%num <= %count) && ($numtok(%who,32) < 5)) { if ($ialchan(%mask,$chan,%num).nick != $nick) %who = %who $ifmatch inc %num } ; More we didn't do? if (%num <= %count) %who = %who ... ; Record recent user, recent clones, recent offense _recseen 10 user $nick _recseen 10 clones $nick $+ , $+ $_s2c(%who) _recseen 10 offend $+ $chan $fulladdress clones %count %mask set -u %:comments - $:b(Clones) $+ : %count from $nick ( $+ $_s2cs(%who) $+ ) CtrlF1 whois; ShiftF8 ping $+ $iif(($me isop $chan) || ($me ishop $chan),; F8 to punish) ; Sound effect _ssplay Clones } } ; Display if (%targ == chan) { set -u %:echo echo $color(join) -ti2 $chan theme.text Join c } elseif (%targ) { set -u %:echo echo $color(join) -ti2 $event.win($chan) theme.text Join c } else { set -u %:echo echo $color(join) -esti2 theme.text JoinStatus c } halt } on &^!*:PART:#:{ event.target $chan part if ($result == hide) halt set -u %::chan $chan set -u %::nick $nick set -u %::address $address set -u %::text $strip($1-,mo) ; Display if ($result == chan) { set -u %:echo echo $color(part) -ti2 $chan theme.text Part cp } elseif ($result) { set -u %:echo echo $color(part) -ti2 $event.win($chan) theme.text Part cp } else { set -u %:echo echo $color(part) -esti2 theme.text PartStatus cp } halt } on &^!*:QUIT:{ set -u %::nick $nick set -u %::address $address set -u %::text $strip($1-,mo) ; Loop through all channels var %num = $comchan($nick,0),%status = 0 while (%num >= 1) { var %chan = $comchan($nick,%num) set -u %::chan %chan event.target %chan quit if ($result != hide) { ; Display for this channel if (($result == chan) || ($result == both)) { if ($result == both) %status = 1 set -u %:echo echo $color(quit) -ti2 %chan theme.text Quit cp } elseif ($result) { set -u %:echo echo $color(quit) -ti2 $event.win(%chan) theme.text Quit cp } else { %status = 1 } } dec %num } ; To status? if (%status) { unset %::chan set -u %:echo echo $color(quit) -esti2 theme.text Quit p } halt } on &^*:KICK:#:{ ; Me kicked? if ($knick == $me) { set -u %::chan $chan set -u %::nick $nick set -u %::address $address set -u %::knick $knick set -u %::kaddress $gettok($address($knick,5),2-,33) set -u %::text $strip($1-,mo) ; Display- status set -u %:echo echo $color(kick) -esti2 theme.text KickSelf cp ; To chan (if open) if ($chan ischan) { set -u %:echo echo $color(kick) -ti2 $chan theme.text KickSelf cp ; Rejoin (if not kicking self) if ($nick != $me) { set -u %:echo echo $color(info) -ti2 $chan theme.text Rejoin } } } ; Someone else kicked else { event.target $chan kick if ($result == hide) halt set -u %::chan $chan set -u %::nick $nick set -u %::address $address set -u %::knick $knick set -u %::kaddress $gettok($address($knick,5),2-,33) set -u %::text $strip($1-,mo) ; Display if ($result == chan) { set -u %:echo echo $color(kick) -ti2 $chan theme.text Kick cp } elseif ($result) { set -u %:echo echo $color(kick) -ti2 $event.win($chan) theme.text Kick cp } else { set -u %:echo echo $color(kick) -esti2 theme.text KickStatus cp } } halt } on &^*:NICK:{ set -u %::nick $nick set -u %::newnick $newnick set -u %::address $address ; Loop through all channels var %num = $comchan($newnick,0),%status = 0 while (%num >= 1) { var %chan = $comchan($newnick,%num) set -u %::chan %chan event.target %chan nick if ($result != hide) { ; Display for this channel if (($result) && ($result != chan)) { set -u %:echo echo $color(nick) -ti2 $event.win(%chan) theme.text Nick n } else { set -u %:echo echo $color(nick) -ti2 %chan theme.text Nick n } } dec %num } ; Self nick in status? if ($nick == $me) { unset %::chan set -u %:echo echo $color(nick) -esti2 theme.text NickSelf } halt } on &^*:TOPIC:#:{ event.target $chan topic if ($result == hide) halt set -u %::chan $chan set -u %::text $strip($1-,mo) $+  set -u %::nick $nick set -u %::address $address if ($result == chan) { set -u %:echo echo $color(topic) -ti2 $chan theme.text Topic c } elseif ($result) { set -u %:echo echo $color(topic) -ti2 $event.win($chan) theme.text Topic c } else { set -u %:echo echo $color(topic) -esti2 theme.text TopicStatus c } halt } #pp-texts end ; Allow copy of private text/action to current window even if text display off on &^*:TEXT:*:?:{ copy.toquery $color(norm) $1- } on &^*:ACTION:*:?:{ copy.toquery $color(act) $1- } alias -l copy.toquery { if ($hget(pnp.config,copy.query)) { ; Skip global msgs if ($left($target,1) == $) return ; Active must be a chan or query if (($active !ischan) && ($query($active) != $active)) return ; Active cannot be the current query, but a query must be open or dqwindow enabled if (($active == $nick) || (($query($nick) == $null) && (!$_optn(0,22)))) return ; Show copy to active echo $1 -lmbfati2 $iif($activecid != $cid,$:anp) * $+ %nick $+ * $strip($2-,mo) } } ; Handle opnotices entirely ourselves if text display off; play notice sound even if not an opnotice on &^*:NOTICE:*:#:{ if (@* iswm $target) { _ssplay NoticeChanOp notice.beep show.opnotice $chan - $+ $nick $+ : $+ $target $+ - $strip($1-,mo) halt } else { _ssplay Notice } } ; Handle private notices entirely ourselves if not shown to "normal" location if text display off on &^*:NOTICE:*:?:{ ; Determine method of display ; "Opnotice" if (%.opnotice) { ; Event beep and sound _ssplay NoticeChanOp notice.beep show.opnotice %.opnotice - $+ $nick $+ - $strip($1-,mo) } else { _ssplay Notice ; See event in #pp-texts group for comments- we handle anything where %window is non-zero, and only play beeps then if ($istok($hget(pnp. $+ $cid,-servnick),$nick,32)) var %window = $hget(pnp.config,serv.notice) else var %window = $hget(pnp.config,reg.notice) if (($1 === DCC) || (%window == 2)) { notice.beep echo $color(notice) -esti2 - $+ $nick $+ - $strip($1-,mo) } elseif (%window == 1) { notice.beep notice.window $nick echo $color(notice) -mbfti2 $result - $+ $nick $+ - $strip($1-,mo) } ; Let mirc handle display and event beep else return } halt } ; Versions of cmds to allow quickhelp and nickcompletion (if text display off) alias msg { if ($2 == $null) { if ($show) _qhelp /msg $1 halt } msg $iif($show,$_ncs(44,$1),$1) $2- } alias describe { if ($2 == $null) { if ($show) _qhelp /describe $1 halt } describe $iif($show,$_ncs(44,$1),$1) $2- } alias notice { if ($2 == $null) { if ($show) _qhelp /notice $1 halt } notice $iif($show,$_ncs(44,$1),$1) $2- } ; Show linesep on join if theming off on me:&^*:JOIN:#:{ .timer 1 0 dispr-div $chan } ; Display clones on join if theming off on &^!*:JOIN:#:{ ; Only if enabled and level < 25 if (($_getchopt($chan,7)) && ($_level($chan,$level($fulladdress)) < 25)) { var %num = 1,%who,%mask = $mask($fulladdress,1),%count = $ialchan(%mask,$chan,0) ; If not scanning by ident, and more clones by site alone, use that if ($_getcflag($chan,2) == 0) { if ($ialchan($wildsite,$chan,0) > %count) { %count = $ifmatch %mask = $wildsite } } ; If only one, ignore if (%count > 1) { ; List all other nicks, up to 5 total while ((%num <= %count) && ($numtok(%who,32) < 5)) { if ($ialchan(%mask,$chan,%num).nick != $nick) %who = %who $ifmatch inc %num } ; More we didn't do? if (%num <= %count) %who = %who ... ; Record recent user, recent clones, recent offense _recseen 10 user $nick _recseen 10 clones $nick $+ , $+ $_s2c(%who) _recseen 10 offend $+ $chan $fulladdress clones %count %mask _juryrig2 disprc $chan $:b(Clones) $+ : %count from $nick ( $+ $_s2cs(%who) $+ ) CtrlF1 whois; ShiftF8 ping $+ $iif(($me isop $chan) || ($me ishop $chan),; F8 to punish) ; Sound effect _ssplay Clones } } } ; ; Nicklist coloring ; ; Retain nick colors for each user in hash pnp.nickcol.$cid.#chan ; Retain nick color flags for each user in hash pnp.nickflag.$cid.#chan (p for pinging, L for lagged, * for ircop) ; Nicklist shows all colors; nicks in channel don't show ping/lag colors ; Nicklist and channel nicks can be individually turned on/off for colors ; $_nickcol(nickname,channel) ; Returns two-digit color code alias _nickcol { if ($hget($+(pnp.nickcol.,$cid,.,$2),$1)) return $ifmatch return $color(listbox text) } ; $_nickcol.flag(nickname,channel) ; Returns flags, if any alias _nickcol.flag { return $hget($+(pnp.nickflag.,$cid,.,$2),$1) } ; /_nickcol.set nickname fulladdress channel ; Updates nickname color in hash for a user on a channel ; Assumes hashes exist alias _nickcol.set { var %flag ; Determine op/hop/voice status if ($1 isop $3) %flag = @ elseif ($1 ishop $3) %flag = % elseif ($1 isvoice $3) %flag = + ; Determine if a mIRC nickcolor exists if ($cnick(%flag $+ $1)) { hadd $+(pnp.nickcol.,$cid,.,$3) $1 $cnick(%flag $+ $1,1).color } ; Find a PnP nickcolor else { ; (grab one of the four sets of colors from PnPNickColors based on op status) _nickcol.2 $gettok($hget(pnp.theme,PnPNickColors),$calc($pos(+%@,%flag) + 1),44) $1-3 $hget($+(pnp.nickflag.,$cid,.,$3),$1) hadd $+(pnp.nickcol.,$cid,.,$3) $1 $result } } alias _nickcol.2 { ; (1-8 are colors, 9 nick 10 addr 11 chan 12 flags) ; Pinged, Lagged, Me, Ircop, Color level in userlist, Ignore/Blacklist, Notify failed, Notify/userlist, Default if ((p isin $12) && ($8 isnum)) return $8 if ((L isin $12) && ($7 isnum)) return $7 ; hack so nick changes on your own nick work properly if (($6 isnum) && ($iif($event == NICK,$nick,$9) == $me)) return $6 if ((* isin $12) && ($5 isnum)) return $5 if ($wildtok($level($10),=color*,1,44)) return $remove($ifmatch,=color) if (($4 isnum) && (($10 isignore) || ($istok($level($10),=black,44)))) return $4 if (($3 isnum) && (($9 isnotify) && ($gettok($hget(pnp. $+ $cid,-notify.on. $+ $9),3,32) == fail))) return $3 if (($2 isnum) && (($9 isnotify) || ($level($10) != $dlevel))) return $2 if ($1 isnum) return $1 return $color(listbox text) } ; /_nickcol.flagset nickname channel newflags ; Sets flags for a user (replacing existing) ; Assumes hashes exist alias _nickcol.flagset { hadd $+(pnp.nickflag.,$cid,.,$2) $1 $3 } ; /_nickcol.rem nickname channel ; Removes a user from nicklist color database ; Assumes hashes exist alias _nickcol.rem { hdel $+(pnp.nickcol.,$cid,.,$2) $1 hdel $+(pnp.nickflag.,$cid,.,$2) $1 } ; /_nickcol.kill [channel] ; Deletes nicklist hashes for a chan or everywhere (this cid only) alias _nickcol.kill { if ($1) { if ($hget($+(pnp.nickcol.,$cid,.,$1))) hfree $+(pnp.nickcol.,$cid,.,$1) if ($hget($+(pnp.nickflag.,$cid,.,$1))) hfree $+(pnp.nickflag.,$cid,.,$1) } else { hfree -w pnp.nickcol. $+ $cid $+ .* hfree -w pnp.nickflag. $+ $cid $+ .* } } #pp-nicklist on ; /_nickcol.update nickname channel [callset] ; /_nickcol.updatechan channel [callset] ; /_nickcol.updatenick nickname [callset] ; /_nickcol.updatemask mask [callset] ; Updates color in nicklist for one nickname or mask (all chans), one channel, or one nick on a channel ; callset = true to call _nickcol.set also for each nick, with ial address or blank address if needed ; (this is used when filling the nicklist for the first time or updating things) alias _nickcol.update { if ($3) _nickcol.set $1 $iif($address($1,5),$ifmatch,$1 $+ !*@*) $2 cline $_nickcol($1,$2) $2 $1 } alias _nickcol.updatechan { var %num = $nick($1,0) while (%num >= 1) { _nickcol.update $nick($1,%num) $1 $2 dec %num } } alias _nickcol.updatenick { var %num = $comchan($1,0) while (%num >= 1) { _nickcol.update $1 $comchan($1,%num) $2 dec %num } } alias _nickcol.updatemask { var %num = $ial($1,0) while (%num >= 1) { _nickcol.updatenick $ial($1,%num).nick $2 dec %num } } #pp-nicklist end ; These are used if nicklist coloring is off- none except update chan do anything, which clears colors alias _nickcol.update { return } alias _nickcol.updatechan { var %num = $nick($1,0) while (%num >= 1) { cline -r $1 $nick($1,%num) dec %num } } alias _nickcol.updatenick { return } alias _nickcol.updatemask { return } ; On every /who line- update info raw 352:*:{ if ($me ison $2) { _nickcol.flagset $6 $2 $7 _nickcol.set $6 $6 $+ ! $+ $3 $+ @ $+ $4 $2 _nickcol.update $6 $2 } } ; Whenever someone joins, changes op status, or changes nick- update info on !*:JOIN:#:{ _nickcol.set $nick $fulladdress $chan _nickcol.update $nick $chan ; On join interface called from here; code is later perform.onjoin } on *:OP:#:{ nickcol.onop $opnick } on *:DEOP:#:{ nickcol.onop $opnick } on *:OWNER:#:{ nickcol.onop $opnick } on *:DEOWNER:#:{ nickcol.onop $opnick } on *:HELP:#:{ nickcol.onop $hnick } on *:DEHELP:#:{ nickcol.onop $hnick } on *:VOICE:#:{ nickcol.onop $vnick } on *:DEVOICE:#:{ nickcol.onop $vnick } on *:SERVEROP:#:{ nickcol.onop $opnick } alias -l nickcol.onop { _nickcol.set $1 $iif($address($1,5),$ifmatch,$1 $+ !*@*) $chan _nickcol.update $1 $chan } on *:NICK:{ if ($nick == $newnick) return var %num = $comchan($newnick,0) while (%num >= 1) { _nickcol.flagset $newnick $comchan($newnick,%num) $_nickcol.flag($nick,$comchan($newnick,%num)) _nickcol.set $newnick $newnick $+ ! $+ $address $comchan($newnick,%num) _nickcol.update $newnick $comchan($newnick,%num) _nickcol.rem $nick $comchan($newnick,%num) dec %num } } ; Whenever someone parts, quits, or is kicked- remove info ; Whenever I part or am kicked- remove all info for channel (nickcol and chanflood) on *:PART:#:{ if ($nick == $me) { _nickcol.kill $chan hfree $+(pnp.flood.,$cid,.,$chan) } else { _nickcol.rem $nick $chan } } on *:KICK:#:{ if ($knick == $me) { _nickcol.kill $chan hfree $+(pnp.flood.,$cid,.,$chan) } else { _nickcol.rem $knick $chan } } on *:QUIT:{ var %num = $comchan($nick,0) while (%num >= 1) { _nickcol.rem $nick $comchan($nick,%num) dec %num } } ; ; On join interface - whois, ircopcheck, and anything an addon might add ; alias -l perform.onjoin { ; More than 3 in a row causes a halt in join checks hinc -z pnp. $+ $cid -massjoin if ($hget(pnp. $+ $cid,-massjoin) > 3) { if ($hget(pnp. $+ $cid,-massjoin) > 10) hadd -z pnp. $+ $cid -massjoin 10 } ; If -just- an ircopcheck and no whois to show, we can use /userhost elseif ((%.joinwhois.do == _ircopchk) && (%.joinwhois.show == 0)) { ; Queue all checks for a channel hadd pnp. $+ $cid -ircopchk. $+ $chan $addtok($hget(pnp. $+ $cid,-ircopchk. $+ $chan),$nick,32) ; Peform at 5, or after 500ms if ($numtok($hget(pnp. $+ $cid,-ircopchk. $+ $chan),32) == 5) perform.onjoin.uhost $chan else .timer.ircop.uh. $+ $cid $+ . $+ $chan -m 1 500 perform.onjoin.uhost $chan } ; %.joinwhois.show is 0 to hide, 1 to show, 2 to show in channel ; %.joinwhois.do contains anything to perform on the join whois results elseif ((%.joinwhois.do) || (%.joinwhois.show)) _linedance _whois.queue $nick $iif(%.joinwhois.show == 1,*,$iif(%.joinwhois.show == 2,$chan,0)) _onjoin.whois $chan %.joinwhois.do unset %.joinwhois.show %.joinwhois.do } alias -l perform.onjoin.uhost { ; userhost to check for ircop status _linedance _Q.userhost _ircopchk $+ $1 $+ &n&a&i halt $hget(pnp. $+ $cid,-ircopchk. $+ $1) .timer.ircop.uh. $+ $cid $+ . $+ $1 off hdel pnp. $+ $cid -ircopchk. $+ $1 } ; /_onjoin.whois chan alias alias ... ; called when an on-join whois completes alias _onjoin.whois { ; stop on any error if ($hget(pnp.twhois. $+ $cid,error)) return var %num = 2 while ($ [ $+ [ %num ] ] ) { ; Call each alias in turn, use blackbox to prevent halting on errors _blackbox $ifmatch $1 $hget(pnp.twhois. $+ $cid,nick) inc %num } } ; ; Misc theming ; on &^*:USERMODE:{ if ($1- != $null) { set -u %:echo echo $color(mode) -sti2 set -u %:linesep disps-div set -u %::nick $nick set -u %::address $address set -u %::modes $1- set -u %::text $1- theme.text ModeUser } halt } on &^*:ERROR:*:{ set -u %::text $iif(($1 == ERROR) || ($1 == ERROR:),$2-,$1-) ; Halt /quit error closing link if (($remove($gettok(%::text,1-2,32),:) == Closing Link) && ($hget(pnp. $+ $cid,quithalt != $null))) { if ($ifmatch isin %::text) halt } set -u %:echo echo $color(ctcp) -esti2 set -u %:linesep disps-div set -u %::fromserver $nick theme.text ServerError halt } ;!! Here on not rewritten nicely ; ; Invites ; on &^*:INVITE:#:{ hinc -u30 pnp.flood. $+ $cid recd.inv if (!$_known($nick,$fulladdress)) hinc -u30 pnp.flood. $+ $cid recd.inv. $+ $site ; long channels- flood counts more if ($len($chan) > 30) hinc -u30 pnp.flood. $+ $cid recd.inv. $+ $site if (($hget(pnp.flood. $+ $cid,recd.inv. $+ $site) > 3) || ($hget(pnp.flood. $+ $cid,recd.inv) > 5)) { .ignore -iu120 **!**@** _alert Flood Invite flood from $:b($nick) $chr(40) $+ $address $+ $chr(41) Further invites won't be shown } if (($hget(pnp.flood. $+ $cid,recd.inv. $+ $site) > 2) || ($hget(pnp.flood. $+ $cid,recd.inv) > 3)) halt _recseen 10 user $nick if ($_optn(3,11)) { if ($_cfgi(verify.inv)) { .ajinvite off | .timer -mio 1 0 .ajinvite on hadd pnp. $+ $cid -invited $hget(pnp. $+ $cid,-invited) $chan _linedance .raw mode $chan hadd pnp. $+ $cid -invn. $+ $chan $hget(pnp. $+ $cid,-invn. $+ $chan) $nick } else { _show.invite $nick $chan - Auto-joining _ssplay Invite _recseen 10 user $nick } } elseif ($_cfgi(verify.inv)) { hadd pnp. $+ $cid -invited $hget(pnp. $+ $cid,-invited) $chan _linedance .raw mode $chan hadd pnp. $+ $cid -invn. $+ $chan $hget(pnp. $+ $cid,-invn. $+ $chan) $nick } else { _show.invite $nick $chan - Press ShiftF11 to join _ssplay Invite _recseen 10 chan $chan _recseen 10 user $nick } halt } ; Themed invite ; /_show.invite NICK CHAN comments alias _show.invite { set -u %::nick $1 set -u %::chan $2 set -u %:comments $3- set -u %:echo echo $color(invite) -mti2 $+ $iif($_optn(3,26),a $iif($activecid != $cid,$:anp),s) theme.text Invite } ; ; Menu endings ; menu query { - $iif((($mid($hget(pnp.config,popups.2),9,1) != 0) || ($mouse.key & 2)) && ($active != Notify List),Window) .Hide:hide $active .Close:if (= isin $active) close -cf $1 | elseif ($active == Message Window) dqwindow hide | else closemsg $1 .- .Logging ..On:log on ..Off:log off ..- ..View:viewlog ..Delete:dellog .Clear:clear $iif(($mid($hget(pnp.config,popups.2),10,1) != 0) || ($mouse.key & 2) || ($active == Notify List),Close):if ($active == Notify List) notify -h | else closemsg $1 ;!!$iif(($mid($hget(pnp.config,popups.2),11,1) != 0) || ($mouse.key & 2),Help):{ } } menu channel { - $iif(($mid($hget(pnp.config,popups.3),10,1) != 0) || ($mouse.key & 2),Window) .Hide:hide $active .Close:if ($active ischan) { part # | dispa Parting # $+ ... } | elseif (= isin $active) close -cf $1 | elseif ($active == Message Window) dqwindow hide | else closemsg $1 .- .Logging ..On:log on ..Off:log off ..- ..View:viewlog ..Delete:dellog .Clear:clear $iif(($mid($hget(pnp.config,popups.3),9,1) != 0) || ($mouse.key & 2),Part):part # | dispa Parting # $+ ... ;!!$iif(($mid($hget(pnp.config,popups.3),11,1) != 0) || ($mouse.key & 2),Help):{ } } menu status { - $iif((($mid($hget(pnp.config,popups.5),2,1) != 0) && $server) || ($mouse.key & 2),Channels) .$_rec(chan,1):join %=chan.1 .$_rec(chan,2):join %=chan.2 .$_rec(chan,3):join %=chan.3 .$_rec(chan,4):join %=chan.4 .$_rec(chan,5):join %=chan.5 .- .$_rec(chan,6):join %=chan.6 .$_rec(chan,7):join %=chan.7 .$_rec(chan,8):join %=chan.8 .$_rec(chan,9):join %=chan.9 .$_rec(chan,10):join %=chan.10 .- .$_rec(chan,11):join %=chan.11 .$_rec(chan,12):join %=chan.12 .$_rec(chan,13):join %=chan.13 .$_rec(chan,14):join %=chan.14 .$_rec(chan,15):join %=chan.15 .- .%=chan.clr:_recclr chan .$iif(%=chan.1 || ($mouse.key & 2),$iif($_cfgi(fill.chan),Lock this list,Unlock list $chr(40) $+ currently locked $+ $chr(41))):{ if ($_cfgi(fill.chan)) { disps Channels menu is now locked and will not 'fill' automatically. | _cfgw fill.chan 0 } else { disps Channels menu is unlocked and will fill with channels that you join. | _cfgw fill.chan 1 } } .Join other...:join $_s2c($_entry(0,$null,Channel $+ $chr(40) $+ s $+ $chr(41) to join? $+ $chr(40) $+ You may specify multiple channels. $+ $chr(41))) .- .Edit...:fav $iif((($mid($hget(pnp.config,popups.5),1,1) != 0) && $server) || ($mouse.key & 2),List channels) .With 5 or more users:list >5 .With 10 or more users:list >10 .With 20 or more users:list >20 .With X or more users...:{ var %num = $_entry(-2,$iif($_dlgi(list) isnum,$_dlgi(list),10),List channels with at least how many users?) list > $+ %num _dlgw list %num } .- .All $chr(40) $+ smaller networks $+ $chr(41):list - $iif(($mid($hget(pnp.config,popups.5),4,1) != 0) || ($mouse.key & 2),Nickname) .$_rec(nick,1):nick %=nick.1 .$_rec(nick,2):nick %=nick.2 .$_rec(nick,3):nick %=nick.3 .$_rec(nick,4):nick %=nick.4 .$_rec(nick,5):nick %=nick.5 .$_rec(nick,6):nick %=nick.6 .$_rec(nick,7):nick %=nick.7 .$_rec(nick,8):nick %=nick.8 .$_rec(nick,9):nick %=nick.9 .- .%=nick.clr:_recclr nick | _recent nick 9 0 $me .Other...:nick $_entry(-1,$me,New nickname?) .- .$iif($hget(pnp. $+ $cid,oldrnick) == $null,Random nick):rn .$iif($hget(pnp. $+ $cid,oldrnick),Undo random nick):urn $iif(($mid($hget(pnp.config,popups.5),5,1) != 0) || ($mouse.key & 2),Usermode...):umode $iif((($mid($hget(pnp.config,popups.5),7,1) != 0) && $server) || ($mouse.key & 2),Server) .Port scan:ports .Server links:links .$iif((z isin $hget(pnp. $+ $cid,-feat)) || ($mouse.key & 2),Map of servers):map .List servers ..1 hop away:nearserv 1 ..- ..Up to 2 hops away:nearserv 1 2 ..Up to 3 hops away:nearserv 1 3 ..- ..Custom...:nearserv ? .- .List IRCops:who 0 o .User counts:lusers .- .MOTD:motd .Time:.raw time .Version:.raw version $iif((($mid($hget(pnp.config,popups.5),8,1) != 0) && $server) || ($mouse.key & 2),Stats) .Global bans g:stats g .Local bans k:stats k .Commands m:stats m .Operators o:stats o .Uptime u:stats u .- .$_rec(stats,1):stats %=stats.1 .$_rec(stats,2):stats %=stats.2 .$_rec(stats,3):stats %=stats.3 .$_rec(stats,4):stats %=stats.4 .$_rec(stats,5):stats %=stats.5 .- .%=stats.clr:_recclr stats .Other...:stats - $iif(($mid($hget(pnp.config,popups.5),10,1) != 0) || ($mouse.key & 2),Window) .Hide:hide $active .- .Logging ..On:log on ..Off:log off ..- ..View:viewlog ..Delete:dellog .Clear:clear $iif((($mid($hget(pnp.config,popups.5),6,1) != 0) && $server) || ($mouse.key & 2),Quit...):quit $_rentry(quit,0,$_s2p($msg.compile($_msg(quit),&online&,$_dur($online))),Disconnecting- Quit message?This will be shown on any channels you are on.) ;!!$iif(($mid($hget(pnp.config,popups.5),11,1) != 0) || ($mouse.key & 2),Help):{ } } menu nicklist { - ;!!$iif(($mid($hget(pnp.config,popups.4),12,1) != 0) || ($mouse.key & 2),Help):{ } } menu menubar { - $iif($hget(pnp,hidden) || ($mouse.key & 2),Unhide all):unhide ;!!$iif(($mouse.key & 2) || ($mid($hget(pnp.config,popups.1),10,1) != 0),Help):{ } } ; ; Generic WINDOW (sub)menus (not for picture windows/etc.) ; ; Window that only needs to close menu @Close { Close:_wclose } ; Window that closes on click menu @Close2 { sclick:_wclose rclick:_wclose } alias -l _wclose window -c $active ; All other windows menu @* { - $iif(($hget(pnp.window. $+ $active,select) >= 1) && (($mid($hget(pnp.config,popups.6),1,1) != 0) || ($mouse.key & 2)),Select all):_selectall $active $hget(pnp.window. $+ $active,select) $iif(($hget(pnp.window. $+ $active,copy)) && ((($mid($hget(pnp.config,popups.6),2,1) != 0) && ($sline($active,0))) || ($mouse.key & 2)),Copy):{ if ($sline($active,0)) { var %num = 2,%clip = $strip($sline($active,1)) if ($sline($active,0) > 1) { :loop %clip = %clip $+ $chr(157) $+ $strip($sline($active,%num)) if (%num < $sline($active,0)) { inc %num | goto loop } %clip = %clip $+ $chr(157) } clipboard $replace(%clip,$chr(157),$crlf) } } - $iif(($hget(pnp.window. $+ $active,window)) && (($mid($hget(pnp.config,popups.6),3,1) != 0) || ($mouse.key & 2)),Window) .Hide:window -h $active .Close:_dowclose $active | window -c $active .- .$iif($hget(pnp.window. $+ $active,log),Logging) ..On:log on ..Off:log off ..- ..View:var %file = $readini($_cfg(window.ini),n,$active,log) | if (%file) %file = $logdir $+ %file | else %file = $logdir $+ $active $+ .log | if ($exists(%file)) edit %file | else disps File ' $+ %file $+ ' does not exist! ..Delete:var %file = $readini($_cfg(window.ini),n,$active,log) | if (%file) %file = $logdir $+ %file | else %file = $logdir $+ $active $+ .log | _remove %file .$iif($hget(pnp.window. $+ $active,log),Clear):clear $active | if ($active == @Whois) .remove $_temp(who) .$iif($line($active,0),Save...):_ssplay Question | var %save = $$sfile($logdir\ $+ $active $+ .txt,Save Buffer,Save) | if ($exists(%save)) _fileopt 2 %save | _bufsav $active %save .- .$iif(p !isin $hget(pnp.window. $+ $active,flags),Font) ..Select...:font ..Default:window -h @.fontgrab | var %font = $window(@.fontgrab).fontsize $window(@.fontgrab).font $iif($window(@.fontgrab).fontbold,bold) | window -c @.fontgrab | font %font .- .Position ..$iif($hget(pnp.window. $+ $active,remember),$style(1)) Remember:if ($hget(pnp.window. $+ $active,remember)) { hadd pnp.window. $+ $active 0 | writeini $_cfg(window.ini) $active rem 0 } | else { hadd pnp.window. $+ $active 1 | remini $_cfg(window.ini) $active rem } ..- ..Record now:{ if (f isin $gettok($hget(pnp.window. $+ $active,flags),1,32)) hadd pnp.window. $+ $active position $window($active).x $window($active).y $window($active).dw $window($active).dh else hadd pnp.window. $+ $active position $window($active).x $window($active).y $window($active).w $window($active).h writeini $_cfg(window.ini) $active pos $hget(pnp.window. $+ $active,position) } ..Restore:window $active $hget(pnp.window. $+ $active,position) ..Default:window $active $hget(pnp.window. $+ $active,default) | hadd pnp.window. $+ $active position $hget(pnp.window. $+ $active,default) | remini $_cfg(window.ini) $active pos .$iif(p !isin $hget(pnp.window. $+ $active,flags),$iif(!$window($active).mdi,$style(1)) Desktop):if ($window($active).mdi) _deskon $active | else _deskoff $active $iif(($istok($hget(pnp.window. $+ $active,window),$active,32)) && (($mid($hget(pnp.config,popups.6),4,1) != 0) || ($mouse.key & 2)),Close):_dowclose $active | window -c $active $iif(($istok($hget(pnp.window. $+ $active,window),$active,32)) && (($mid($hget(pnp.config,popups.6),5,1) != 0) || ($mouse.key & 2)),Hide):window -h $active ;!!$iif(($istok($hget(pnp.window. $+ $active,help),$active,32)) && (($mid($hget(pnp.config,popups.6),6,1) != 0) || ($mouse.key & 2)),Help):{ } } ; Common routines alias -l _bufsav savebuf -a $1 " $+ $2- $+ " | disps Contents of $1 saved to ' $+ $2- $+ ' alias -l _deskon if ($window($1).mdi) _desktog $1 1 alias -l _deskoff if ($window($1).mdi) halt | _desktog $1 0 alias -l _desktog { var %title = $window($1).title,%edit = $editbox($1),%set = $hget(pnp.window. $+ $1,flags),%file = $_temp(dsk) if ($2) var %pos = $calc($window($1).x + $window(-3).dx) $calc($window($1).y + $window(-3).dy) else var %pos = $calc($window($1).x - $window(-3).dx) $calc($window($1).y - $window(-3).dy) if (f isin $gettok(%set,1,32)) %pos = %pos $window($1).dw $window($1).dh else %pos = %pos $window($1).w $window($1).h savebuf $1 %file window -c $1 window $gettok(%set,1,32) $+ $iif($2,d) $_p2s($gettok(%set,2,32)) $1 %pos $gettok(%set,3-,32) titlebar $1 %title if (%edit) editbox $1 %edit loadbuf -c $+ $:c1 $1 %file .remove %file if ($2) writeini $_cfg(window.ini) $1 desk 1 else remini $_cfg(window.ini) $1 desk } ; ; Input wrappers ; on &*:INPUT:*:{ if ((($target !ischan) && ($query($target) == $null) && (=* !iswm $target)) || ($cmdbox)) return if (%.input.type == say) { if (($group(#pp-texts) == on) || (/say $1- != %.input.text)) { %.input.text | halt } } elseif (%.input.type == me) { if (($group(#pp-texts) == on) || ($1- != %.input.text)) { %.input.text | halt } } elseif (%.input.type == cmd) { if (?notice iswm $gettok(%.input.text,1,32)) { ntc $gettok(%.input.text,2-,32) | halt } elseif (($target ischan) && ($mid($gettok(%.input.text,1,32),2,1) isin +-)) { var %bits = $right($gettok(%.input.text,1,32),-1),%targ = $gettok(%.input.text,2-,32) goto %bits :+o | op %targ | halt :-o | dop %targ | halt :+h | hfop %targ | halt :-h | dhfop %targ | halt :+b | ban %targ | halt :-b | unban %targ | halt :+v | voc %targ | halt :-v | dvoc %targ | halt :%bits | mode %bits %targ | halt } elseif (%.input.text != $1-) { %.input.text | halt } } } ; Once chat is opened, don't need to save why chat was opened on *:OPEN:=:hdel pnp chat.open. $+ $nick ; Disconnect clearance on *:DISCONNECT:{ _nickcol.kill hadd pnp. $+ $cid net Offline hdel -w pnp. $+ $cid -* hdel -w pnp.flood. $+ $cid * hfree -w pnp.flood. $+ $cid $+ .* hdel -w pnp.ping. $+ $cid * unset %<* _upd.title } ; flash/sounds that must be last ctcp &*:DCC CHAT:?:_ssplay DCC ctcp &*:DCC SEND:?:_ssplay DCCSend on &^*:OPEN:?:*:_ssplay Open | if ($mid($hget(pnp.config,flash.opt),$iif($hget(pnp. $+ $cid,away),2,1),1)) flash $chr(91) $+ Query- $nick: $strip($replace($1-,$chr(32),$chr(160))) $+ $chr(93) on &*:CHAT:*:if ($mid($hget(pnp.config,flash.opt),$iif($hget(pnp. $+ $cid,away),6,5),1)) flash $chr(91) $+ DCC- $nick: $strip($iif($1 == ACTION,$remove($2-,),$1-)) $+ $chr(93) on &*:TEXT:*:?:if ($mid($hget(pnp.config,flash.opt),$iif($hget(pnp. $+ $cid,away),4,3),1)) flash $chr(91) $+ Msg- $nick: $strip($1-) $+ $chr(93) on &*:ACTION:*:?:if ($mid($hget(pnp.config,flash.opt),$iif($hget(pnp. $+ $cid,away),4,3),1)) flash $chr(91) $+ Msg- $nick: $strip($1-) $+ $chr(93) ; Dragdrop defaults on &*:SIGNAL:PNP.DRAGDROP:{ if (($1 == n) && (*.wav iswm $3-)) sound $2 $3- else dcc send $iif(=* iswm $2,$right($2,-1),$2) $3- }