$n_isaway=''; $n_svefile=$ENV{"HOME"}."/.n0thing-pl.sve"; &docommand("^alias fing ctcp \$0 finger"); &docommand("^alias ver ctcp \$0 version"); &docommand("^alias tim ctcp \$0 time"); &docommand("^alias wallop wallops"); &docommand("^alias printuh set printuh"); &docommand("^alias printchan set printchan"); &docommand("^alias localhost set localhost"); &docommand("^alias logfile set logfile"); &docommand("^alias log set log"); &docommand("^alias ex system"); &docommand("^alias ls system ls -al"); &docommand("^alias cat system cat"); &docommand("^alias rm system rm"); &docommand("^alias ps system ps"); &docommand("^alias mail system mail"); &docommand("^alias setfing set finger"); sub cmd_open { &getarg; $newarg=$talkchannel unless $newarg; &tell("*\cbE\cb* Huh? what channel?"), return unless $newarg; $newarg =~ tr/A-Z/a-z/; &sl("MODE $newarg -lsmpik ".$chankey{$newarg}); } &addcmd("open"); sub cmd_l { if ($talkchannel) { &sl("LIST $talkchannel"); &sl("NAMES $talkchannel"); } } &addcmd("l"); sub cmd_a { if ($n_lastmsg) { &msg($n_lastmsg, $args); } else { &tell("*\cbE\cb* How about sending a first /m to someone?"); } } &addcmd("a"); sub cmd_pj { if ($talkchannel) { &sl("PART $talkchannel"); &sl("JOIN $talkchannel"); } } &addcmd("pj"); &docommand("^alias ds dcc send"); &docommand("^alias dl dcc list"); &docommand("^alias cdc dcc close chat"); &docommand("^alias cdg dcc close get"); &docommand("^alias cds dcc close send"); &docommand("^alias dcrename dcc rchat"); &docommand("^alias dcren dcc rchat"); &docommand("^alias rdc dcc rchat"); sub cmd_dc { &getarg; if ($newarg) { &docommand("dcc chat $newarg"); } elsif ($n_lastdc) { &docommand("dcc chat $n_lastdc"); $n_lastdc=''; } } &addcmd("dc"); sub cmd_dg { &getarg; if ($newarg) { &docommand("dcc get $newarg $args"); } elsif ($n_lastdcc) { &docommand("dcc get $n_lastdcc"); $n_lastdcc=''; } } &addcmd("dg"); sub hook_disc { if ($n_rejoinchannels) { $n_old_when=time; $n_old_umode=$umode; @n_old_channels=grep(!&eq($_, $talkchannel), @channels); push(@n_old_channels, $talkchannel) if $talkchannel; %n_old_chankey=%chankey; } &docommand("server 1"), $n_lastreconnect=time if $n_reconnect && time-$n_lastreconnect>15; } &addhook("disconnect", "disc"); sub hook_reconnect { if ($n_rejoinchannels && ($n_old_umode || @n_old_channels) && time <= $n_old_when+15) { $n_old_umode =~ tr/o//d; &sl("MODE $nick +$n_old_umode") if $n_old_umode ne ''; local($chans, $keys)=('', ''); foreach $c (keys (%n_old_chankey)) { $chans .= $c.","; $keys .= $n_old_chankey{$c}.","; } foreach $c (@n_old_channels) { $c =~ tr/A-Z/a-z/; $chans .= $c."," unless defined($n_old_chankey{$c}); } $chans =~ s/,$//; $keys =~ s/,$//; &sl("JOIN $chans $keys") if $chans; $n_old_umode=''; @n_old_channels=(); %n_old_chankey=(); } } &addhook("001", "reconnect"); sub hook_ctcp { if ($_[1] eq 'DCC') { $n_lastdcc=$who if $_[2] =~ /^SEND /; $n_lastdc=$who if $_[2] =~ /^CHAT /; } } &addhook("ctcp", "ctcp"); sub hook_kicked { local($kicked, $where_from, $reason)=@_; if ($n_autorejoin && &eq($kicked, $nick)) { &sl("JOIN $where_from $chankey{$where_from}"); } } &addhook("kick", "kicked"); sub hook_uhnotify { unless ($n_slowserver) { &userhost($_[0], "&tell(\"*\cb)\cb* Signon by $_[0] (\$user\\\@\$host) detected!\");", ""); $silent=1; } } &addhook("notify_signon", "uhnotify"); sub hook_lastmsg { $n_lastmsg=$_[0] unless $_[0] =~ /^[\#\+]/; } &addhook("send_text", "lastmsg"); &addhook("send_action", "lastmsg"); sub hook_away { if ($n_awayonce && $_[0] =~ /^\S+\s+(\S+)\s/) { local($l)=$1; $l =~ tr/A-Z/a-z/; $silent=1 if $n_aways{$l} eq $_[0]; $n_aways{$l}=$_[0]; } } &addhook("301", "away"); sub hook_whois { if ($_[0] =~ /^\S+\s+(\S+)\s/) { local($l)=$1; $l =~ tr/A-Z/a-z/; delete $n_aways{$l}; } } &addhook("311", "whois"); sub set_autorejoin { $set{'AUTOREJOIN'}="on", $n_autorejoin=1 if $_[0] =~ /^on$/i; $set{'AUTOREJOIN'}="off", $n_autorejoin=0 if $_[0] =~ /^off$/i; } &addset("autorejoin"); $set{"AUTOREJOIN"}="on"; $n_autorejoin=1; &docommand("^alias rejoin set autorejoin"); sub set_rejoinchannels { $set{'REJOINCHANNELS'}="on", $n_rejoinchannels=1 if $_[0] =~ /^on$/i; $set{'REJOINCHANNELS'}="off", $n_rejoinchannels=0 if $_[0] =~ /^off$/i; } &addset("rejoinchannels"); $set{"REJOINCHANNELS"}="on"; $n_rejoinchannels=1; &docommand("^alias rejoinchan set rejoinchannels"); sub set_reconnect { $set{'RECONNECT'}="on", $n_reconnect=1 if $_[0] =~ /^on$/i; $set{'RECONNECT'}="off", $n_reconnect=0 if $_[0] =~ /^off$/i; } &addset("reconnect"); $set{"RECONNECT"}="on"; $n_reconnect=1; &docommand("^alias reconnect set reconnect"); sub set_awayonce { $set{'AWAYONCE'}="on", $n_awayonce=1 if $_[0] =~ /^on$/i; $set{'AWAYONCE'}="off", $n_awayonce=0 if $_[0] =~ /^off$/i; %n_awayonce=(); } &addset("awayonce"); $set{"AWAYONCE"}="on"; $n_awayonce=1; &docommand("^alias awayonce set awayonce"); sub set_slowserver { $set{'SLOWSERVER'}="on", $n_slowserver=1 if $_[0] =~ /^on$/i; $set{'SLOWSERVER'}="off", $n_slowserver=0 if $_[0] =~ /^off$/i; } &addset("slowserver"); $set{"SLOWSERVER"}="off"; $n_slowserver=0; &docommand("^alias ss set slowserver"); sub set_wallv { $set{"WALLV"}="on", $n_wallv=1 if $_[0] =~ /^on$/i; $set{"WALLV"}="off", $n_wallv=0 if $_[0] =~ /^off$/i; } &addset("wallv"); $set{"WALLV"}="off"; $n_wallv=0; &docommand("^alias wallv set wallv"); sub set_quitmsg { $n_quitmsg=$set{"QUITMSG"}=$_[0]; } &addset("quitmsg"); $set{"QUITMSG"}=$n_quitmsg=''; &docommand("^alias setquit set quitmsg"); sub set_autoop { $set{"AUTOOP"}="off", $n_autoops=0 if $_[0] =~ /^(off|none)$/i; $set{"AUTOOP"}="on", $n_autoops=1 if $_[0] =~ /^(on|all)$/i; $set{"AUTOOP"}="oppass", $n_autoops=2 if $_[0] =~ /^op(pass)?$/i; } &addset("autoop"); $set{"AUTOOP"}="on"; $n_autoops=1; &docommand("^alias autoop set autoop"); sub set_opdelay { $set{"OPDELAY"}=$n_opdelay=$_[0] if $_[0] =~ /^\d+$/; } &addset("opdelay"); $set{"OPDELAY"}="on"; $n_opdelay=5; &docommand("^alias delay set opdelay"); sub set_oppass { $set{"OPPASS"}=$_[0]; } &addset("oppass"); $set{"OPPASS"}=""; &docommand("^alias oppass set oppass"); sub cmd_ig { &docommand("ignore $args"), return if (!$args || $args =~ /^-/); &getarg; if ($newarg =~ /\@/) { $n_lastignore=$newarg; &docommand("ignore $newarg"); } else { &userhost($newarg, "\$host=&n_hostpat(\$host); \$user =~ s/^\\~//; \$n_lastignore=\"*\$user\\\@\$host\"; &docommand(\"ignore *\$user\\\@\$host\");"); } } &addcmd("ig"); sub cmd_sig { &getarg; &userhost($newarg, "\$host=&n_hostpat(\$host); \$n_lastignore=\"*\\\@\$host\"; &docommand(\"ignore *\\\@\$host\");"); } &addcmd("sig"); sub cmd_unig { &getarg; if ($newarg eq '') { &docommand("ignore -$n_lastignore") if $n_lastignore ne ''; } elsif ($newarg =~ /\@/) { &docommand("ignore -$newarg"); } else { &userhost($newarg, "\$host=&n_hostpat(\$host); \$user =~ s/^\\~//; &docommand(\"ignore -*\$user\\\@\$host\");"); } } &addcmd("unig"); sub n_hostpat { if ($_[0] =~ /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/) { return "${1}.${2}.${3}.*"; } elsif ($_[0] =~ /^([^. \t]+)\.([^. \t]+)\.(.*)$/) { return "*.${2}.${3}"; } else { return $_[0]; } } sub cmd_kb { &getarg; local($why)=($args); $why="game over, man. game over." unless $why; &tell("*\cb0\cb* Must specify a nick to kickban"), return unless $newarg; &tell("*\cb0\cb* You're not on a channel"), return unless $talkchannel; &userhost($newarg, "\$host=&n_hostpat(\$host); \$user =~ s/^\\~//; &sl(\"MODE $talkchannel -o+b $newarg *!*\$user\\\@\$host\"); &sl(\"KICK $talkchannel $newarg :$why\");"); &addcmd("kb"); sub cmd_ksb { &getarg; local($why)=($args); $why="d0rks suck big m00se ballZ" unless $why; &tell("*\cb0\cb* Must specify a nick to kicksiteban"), return unless $newarg; &tell("*\cb0\cb* You're not on a channel"), return unless $talkchannel; &userhost($newarg, "\$host=&n_hostpat(\$host); &sl(\"MODE $talkchannel -o+b $newarg *!*\\\@\$host\"); &sl(\"KICK $talkchannel $newarg :$why\");"); } &addcmd("ksb"); sub cmd_ban { &tell("*\cb0\cb* Must specify a nick to ban"), return unless $args; &tell("*\cb0\cb* You're not on a channel"), return unless $talkchannel; while (&getarg, $newarg ne '') { &userhost($newarg, "\$host=&n_hostpat(\$host); \$user =~ s/^\\~//; &sl(\"MODE $talkchannel +b *!*\$user\\\@\$host\");"); } } &addcmd("ban"); sub cmd_sban { &getarg; &tell("*\cb0\cb* Must specify a nick to site ban"), return unless $newarg; &tell("*\cb0\cb* You're not on a channel"), return unless $talkchannel; &userhost($newarg, "\$host=&n_hostpat(\$host); &sl(\"MODE $talkchannel +b *!*\\\@\$host\");"); } &addcmd("sban"); sub n_unbans { local($n, $l)=('0', ''); foreach (@n0thing_banlist) { if ($n<4) { $l.=" ".$_; $n++; } else { &sl("MODE $n0thing_channel -bbbb $l"); $l=$_; $n=1; } } &sl("MODE $n0thing_channel -".("b" x $n)." $l"); } sub cmd_sb { &dosplat; &getarg; $newarg=$talkchannel unless $newarg; return unless $newarg; $n_svbanchannel=$newarg; @n_svbanlist=(); $n_nxbannb=1; &sl("MODE $newarg b"); } &addcmd("sb"); sub hook_nbbans { local($c, $theban, $by)=((split(/ +/, $_[0]))[1, 2, 3]); if ($n_nxbannb && &eq($c, $n_svbanchannel)) { push(@n_svbanlist, $theban); &tell("*\cbb\cb* $c $n_nxbannb: $theban $by"); $silent=1; $n_nxbannb++; } } &addhook("367", "nbbans"); sub hook_endofbans { $n_nxbannb=0; } &addhook("368", "endofbans"); sub cmd_cb { &tell("*\cb0\cb* You're not on a channel"), return unless $talkchannel; &addhook("367", "onecbban"); &addhook("368", "donebans"); @n0thing_banlist=(); $n0thing_channel=$talkchannel; &sl("MODE $talkchannel b"); } &addcmd("cb"); sub hook_onecbban { local($theban)=((split(/ +/, $_[0]))[2]); push(@n0thing_banlist, $theban); $silent=1; } sub hook_donebans { &remhook("367", "onecbban"); &remhook("367", "oneubban"); &remhook("368", "donebans"); &n_unbans; } sub cmd_unban { &getarg; &tell("*\cb0\cb* Must specify a nick or address to unban"), return unless $newarg; &tell("*\cb0\cb* You're not on a channel"), return unless $talkchannel; if ($newarg =~ /^\d+$/) { $n0thing_channel=$talkchannel; @n0thing_banlist=(); while(1) { $newarg--; &tell("*\cb0\cb* No banlist available for $talkchannel"), return unless &eq($talkchannel, $n_svbanchannel); &tell("*\cb0\cb* No such ban"), return unless $n_svbanlist[$newarg]; push(@n0thing_banlist, $n_svbanlist[$newarg]); &getarg; last unless $newarg; &tell("*\cb0\cb* Cannot mix nicks and numbers"), last unless $newarg =~ /^\d+$/; } &n_unbans; } else { @n0thing_banlist=(); $n0thing_channel=$talkchannel; if ($newarg =~ /\@/) { $newarg="*!".$newarg unless $newarg =~ /\!/; $n_pat=$newarg; &addhook("367", "oneubban"); &addhook("368", "donebans"); &sl("MODE $talkchannel b"); } else { &userhost($newarg, "&n_dounban;"); } } } &addcmd("unban"); &docommand("^alias ub unban"); sub n_dounban { $n_pat=$who."!".$user."\@".$host; &addhook("368", "donebans"); @n0thing_banlist=(); $n0thing_channel=$talkchannel; &sl("MODE $talkchannel b"); } sub hook_oneubban { local($theban)=((split(/ +/, $_[0]))[2]); local($tb0)=($theban); &slashify($theban); push(@n0thing_banlist, $tb0) if ($n_pat =~ /^${theban}$/i); $silent=1; } sub cmd_fkb { &getarg; &tell("*\cb0\cb* Must specify a nick to filter kick ban"), return unless $newarg; &tell("*\cb0\cb* You're not on a channel"), return unless $talkchannel; &userhost($newarg, "\$host=&n_hostpat(\$host); &sl(\"MODE $talkchannel +b *!*\\\@\$host\"); &docommand(\"fk \$host $args\");"); } &addcmd("fkb"); sub cmd_fk { &getarg; &tell("*\cb0\cb* Must specify a pattern to kick"), return unless $newarg; &tell("*\cb0\cb* You're not on a channel"), return unless $talkchannel; $n0thing_channel=$talkchannel; $n0thing_kickpat=$newarg; &slashify($n0thing_kickpat); $n0thing_kickmsg=$args || "though names may change each face retains the mask it wore"; &addhook("352", "dofklist"); &addhook("315", "donefk"); &sl("WHO $talkchannel"); } &addcmd("fk"); sub hook_dofklist { local($a)=@_; local($c, $c, $u, $h, $s, $n)=split(/ +/, $a); (($n."!".$u."\@".$h) =~ /${n0thing_kickpat}/i) && $n ne $nick && &sl("KICK $n0thing_channel $n :$n0thing_kickmsg"); $silent=1; } sub hook_donefk { &remhook("352", "dofklist"); &remhook("315", "donefk"); } sub cmd_setaway { &me("is away - $args - messages will be logged") if $talkchannel; push(@n_savemsg, "-- set away on " . &date(time) . " -- $args"); %n_awaysent=(); $args="\cb\cb" if $args eq ''; &sl("AWAY :$args"); $n_isaway=1; } &addcmd("setaway"); sub cmd_qsetaway { push(@n_savemsg, "-- set away on " . &date(time) . " -- $args"); %n_awaysent=(); $args="\cb\cb" if $args eq ''; &sl("AWAY :$args"); $n_isaway=1; } &addcmd("qsetaway"); if ($n_isaway) { local($sec, $min, $hour)=localtime(time); local($w)=$who; $min="0".$min if $min =~ /^\d$/; push(@n_savemsg, ":\cb${who}\cb!${user}\@${host} (${hour}:${min}): $_[0]\n"); $w =~ tr/A-Z/a-z/; &sl("NOTICE $who :Your messages are being logged - n0thing.pl"), $n_awaysent{$w}=1 unless $n_awaysent{$w}; } } &addhook("msg", "messages"); sub hook_dmessages { if ($n_isaway) { local($sec, $min, $hour)=localtime(time); $min="0".$min if $min =~ /^\d$/; push(@n_savemsg, "=\cb".$_[0]."\cb (${hour}:${min})= ".$_[1]."\n"); } } &addhook("dcc_chat", "dmessages"); sub cmd_setback { $n_isaway=''; &sl("AWAY"); foreach (@n_savemsg) { &tell($_); } if ($#n_savemsg>0) { &getuserline("*** Forget saved messages (y/n)? ", "clear? "); @n_savemsg=() if /^y/i; } else { @n_savemsg=(); } } &addcmd("setback"); sub cmd_clearmes { $n_isaway=''; @n_savemsg=(); } &addcmd("clearmes"); sub cmd_wall { &tell("*\cbE\cb* No text to send"), return unless $args; &tell("*\cbE\cb* You're not on a channel"), return unless $talkchannel; $wallop_text=$args; $wallop_channel=$talkchannel; &addhook("353", "wallopnames"); &sl("NAMES $talkchannel"); } &addcmd("wall"); sub hook_wallopnames { local($wallop, $n, $s, @wallop)=("", 0, 0, split(/ +/, $_[0])); shift @wallop; shift @wallop; shift @wallop; $wallop[0] =~ s/^://; foreach (@wallop) { $wallop.=$_.",", $n++ if s/^\@// || ($n_wallv && s/^\+//) || &eq($_, $nick); if ($n>=9) { $wallop =~ s/,$//; &sl("NOTICE $wallop :\cb[WallOp/$wallop_channel]\cb $wallop_text"); $n=0; $s=1; $wallop=''; } } if ($wallop eq '' && !$s) { &tell("*\cbE\cb* No ops to wallop"); } elsif ($wallop ne '') { $wallop =~ s/,$//; &sl("NOTICE $wallop :\cb[WallOp/$wallop_channel]\cb $wallop_text"); } &remhook("353", "wallopnames"); $silent=1; } sub n_addwaitop { local($nck, $channel)=@_; if ($n_opdelay) { local($n)=($nck); $channel =~ tr/A-Z/a-z/; $n =~ s/(\W)/\\$1/g; if ($n_waitops{$channel} !~ /:${n}:/i) { $n_waitops{$channel} || ($n_waitops{$channel}=":"); $n_waitops{$channel}.=$nck.":"; } unless ($n_timerdue) { $n_timerdue=1; &timer($n_opdelay, "&n_doautoops"); } } else { &sl("MODE $channel +o $nck"); } } sub n_remwaitop { local($nck, $channel)=@_; $channel =~ tr/A-Z/a-z/; $nck =~ s/(\W)/\\$1/g; $n_waitops{$channel} =~ s/:${nck}:/:/gi; delete $n_waitops{$channel} if $n_waitops{$channel} eq ":"; } sub n_doautoops { local($l); foreach $c (keys(%n_waitops)) { if ($n_waitops{$c} ne ":" && $n_waitops{$c}) { $l=$n_waitops{$c}; $l =~ s/^://; $l =~ s/:$//; $l =~ tr/:/ /; &docommand("o ".$c." ".$l); } delete $n_waitops{$c}; } $n_timerdue=''; } sub hook_n_nickchange { local($oldnick)=$who; $oldnick =~ s/(\W)/\\$1/g; foreach $c (keys(%n_waitops)) { $n_waitops{$c} =~ s/:${oldnick}:/:$_[0]:/gi; } } &addhook("nick", "n_nickchange"); sub hook_n_parted { &n_remwaitop($who, $_[0]); } &addhook("leave", "n_parted"); sub hook_n_quitted { local($w)=$who; $w =~ s/(\W)/\\$1/g; foreach $c (keys(%n_waitops)) { $n_waitops{$c} =~ s/:${w}:/:/gi; delete $n_waitops{$c} if $n_waitops{$c} eq ":"; } } &addhook("signoff", "n_quitted"); sub hook_n_modechange { # we only deal with +o, +oo and the like; the worst that can happen # is that we op someone again local ($l)=$_[1]; return unless $_[0] =~ /^[\#\&\+]/; return unless $l =~ s/^\+o+\s+//; foreach $n (split(/ /, $l)) { &n_remwaitop($n, $_[0]); } } &addhook("mode", "n_modechange"); sub slashify { $_[0] =~ s/([^\\])\./$1\\./g; $_[0] =~ s/\*/\.\*/g; $_[0] =~ s/([^\.\*\?\\\w])/\\$1/g; $_[0] =~ tr/?/./; } sub autoopped { local($nuh, $chan, $asked)=@_; # chan = what chan for, $asked = whether it was asked local($p); foreach $p (@n_autooplist) { return 1 if ($asked.":".$chan.":".$nuh) =~ /^${p}$/i; } return ''; } sub addtoops { local($chan, $auto)=@_; if (&autoopped($who."!".$user."\@".$host, $chan, 1)) { &tell("*\cb0\cb* $who is already on your list"); } else { $host=&n_hostpat($host); $user =~ s/^\~//; local($pat)=("*!*".$user."\@".$host); &tell("*\cb0\cb* Adding $who as $pat to your autoop list for $chan"); &sl("NOTICE $who :You have been added to ${nick}'s autoop list for ". ($chan eq '*' ? "all channels" : "$chan")); &sl("NOTICE $who :You should feel *very* honored"); &slashify($pat); &slashify($chan); push(@n_autooplist, $auto.":".$chan.":".$pat); } } sub cmd_addop { if ($args =~ /^([01])\s+(\S+)\s+(\S+)\s*$/) { local($auto, $chan, $uh)=($1, $2, $3); if ($chan ne '*' && $chan !~ /^[#&]/) { &tell("*\cbE\cb* Invalid channel - use '*' or a #channel name"); return; } $chan =~ s/\'//g; $uh="*!".$uh if $uh =~ /\@/ && $uh !~ /\!/; $auto=($auto==0 ? "1" : "."); if ($uh =~ /\!.*\@/) { if (&autoopped($uh, $chan, 1)) { &tell("*\cb0\cb* $uh is already on your list"); return; } &tell("*\cb0\cb* Adding $uh to your auto-op list for $chan"); &slashify($uh); &slashify($chan); push(@n_autooplist, $auto.":".$chan.":".$uh); } else { &userhost($uh, "&addtoops('$chan', '$auto');"); } } else { &tell("*\cb0\cb* Format: /addop (0 or 1) (#chan or *) (nick or user\@host)"); } } &addcmd("addop"); sub hook_joined { local($c)=($_[0]); $c =~ tr/A-Z/a-z/; &n_addwaitop($who, $c) if ($n_autoops==1 && $haveops{$c} && &autoopped($who."!".$user."\@".$host, $c, 0)); } &addhook("join", "joined"); sub hook_opbeg { if ($_[1] =~ /^op$/i && $n_autoops && &eq($nick, $_[0])) { local($chn, $pass)=split(/ +/, $_[2]); $chn =~ tr/A-Z/a-z/; &sl("MODE $chn +o $who") if $haveops{$chn} && $pass eq $set{"OPPASS"} && &autoopped($who."!".$user."\@".$host, $chn, 1); } } &addhook("ctcp", "opbeg"); sub cmd_listop { local($n, $p, $q, $c, $a, $ch)=(0); &getarg; $ch=$newarg || '*'; &tell("*\cb0\cb* That's the people in your autoop list:"); foreach $p (@n_autooplist) { ($a, $c, $q)=split(/:/, $p); $c =~ s/\\//g; $c =~ s/\.\*/*/g; next if (!&eq($c, $ch) && $c ne '*' && $ch ne '*'); $n++; $q =~ s/\\//g; $q =~ s/\.\*/*/g; &tell("*\cb0\cb* ".($a eq '.' ? "1 " : "0 ").$c." ".$q); } &tell("*\cb0\cb* which makes.. uhm... $n people, I think"); } &addcmd("listop"); sub rem_matches { local($nuh, $ent)=@_; $ent=$' if $ent =~ /:.*:/; return 1 if $nuh =~ /${ent}$/i; # not exactly the same as slashify $nuh =~ s/\*/\.\*/g; $nuh =~ s/([^\\])\.([^\*])/$1\\\\*\\.$2/g; $nuh =~ s/([^\.\*\?\\\w])/\\\\*\\$1/g; $nuh =~ tr/?/./; return ($ent =~ /${nuh}$/i); } sub n_remop { local($nuh)=($who."!".$user."\@".$host); @n_autooplist=grep(!&rem_matches($nuh, $_), @n_autooplist); } sub cmd_remop { &getarg; if (!$newarg) { &tell("*\cb0\cb* Must specify a nick or address"); } elsif ($newarg =~ /[\@\*]/) { # $newarg='*!'.$newarg if ($newarg !~ /\!/); &tell("*\cb0\cb* Time to remove $newarg from the autoop list"); @n_autooplist=grep(!&rem_matches($newarg, $_), @n_autooplist); } else { &tell("*\cb0\cb* Time to remove $newarg from the autoop list"); &userhost($newarg, "&n_remop;"); } } &addcmd("remop"); sub cmd_clearop { @n_autooplist=(); &tell("*\cb0\cb* Auto-op list cleared!"); } &addcmd("clearop"); sub cmd_sve { local($p); if (!open(SVE, "> ".$n_svefile)) { &tell("*\cbE\cb* can't write to save file"); return; } print SVE $n_autoops+0, "\n"; print SVE ($n_autorejoin ? "1" : "0"), "\n"; print SVE "\n"; # deprecated, pong reply print SVE $set{"FINGER"}, "\n"; print SVE join(" ", keys(%notify)), "\n"; print SVE join(" ", @n_autooplist), "\n"; print SVE ($n_slowserver ? "1" : "0"), "\n"; print SVE $n_opdelay, "\n"; print SVE $n_quitmsg, "\n"; print SVE "^\n"; # deprecated, command char print SVE ($n_reconnect ? "1" : "0"), "\n"; print SVE $set{"AWAYONCE"}, "\n"; print SVE $set{"REJOINCHANNELS"}, "\n"; print SVE $set{"CTCP"}, "\n"; print SVE $set{"PRINTCHAN"}, "\n"; print SVE $set{"PRINTUH"}, "\n"; print SVE $set{"SENDAHEAD"}, "\n"; print SVE $set{"USERINFO"}, "\n"; print SVE $set{"WALLV"}, "\n"; print SVE $set{"OPPASS"}, "\n"; print SVE $set{"IRCNAME"}, "\n"; close SVE; &tell("*\cb0\cb* save completed!"); } &addcmd("sve"); sub cmd_quit { if ($args eq '') { &docommand("/QUIT $n_quitmsg"); } else { &docommand("/QUIT $args"); } } &addcmd("quit"); &docommand("^alias bye quit"); &docommand("^alias exit quit"); &docommand("^alias signoff quit"); if (open(NOTHING, "< ".$n_svefile)) { local($n, $l); chop($l=); &doset("AUTOOP", ($l ? "on" : "off")); chop($l=); &doset("AUTOREJOIN", ($l ? "on" : "off")); ; chop($l=); &doset("FINGER", $l) if $l ne ''; chop($l=); %notify=(); foreach $n (split(' ', $l)) { &docommand("^NOTIFY ".$n); } chop($l=); @n_autooplist=split(' ', $l); foreach (@n_autooplist) { $_=".:.*:".$_ unless /:.*:/; } chop($l=); &doset("SLOWSERVER", ($l ? "on" : "off")); chop($l=); $l=5 if $l !~ /^\d+$/; &doset("OPDELAY", $l); chop($l=); &doset("QUITMSG", $l); ; chop($l=); $l=1 unless defined $l; &doset("RECONNECT", ($l ? "on" : "off")); chop($l=); &doset("AWAYONCE", $l) if $l; chop($l=); &doset("REJOINCHANNELS", $l) if $l; chop($l=); &doset("CTCP", $l) if $l; chop($l=); &doset("PRINTCHAN", $l) if $l; chop($l=); &doset("PRINTUH", $l) if $l; chop($l=); &doset("SENDAHEAD", $l) if $l; chop($l=); &doset("USERINFO", $l) if $l; chop($l=); &doset("WALLV", $l) if $l; chop($l=); &doset("OPPASS", $l) if $l; chop($l=); &doset("IRCNAME", $l) if $l; close(NOTHING); }