You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdenetwork/ksirc/default.pl

868 lines
23 KiB

$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", "doftdelist");
&addhook("315", "donefk");
&sl("WHO $talkchannel");
}
&addcmd("fk");
sub hook_doftdelist {
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", "doftdelist");
&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=<NOTHING>);
&doset("AUTOOP", ($l ? "on" : "off"));
chop($l=<NOTHING>);
&doset("AUTOREJOIN", ($l ? "on" : "off"));
<NOTHING>;
chop($l=<NOTHING>);
&doset("FINGER", $l) if $l ne '';
chop($l=<NOTHING>);
%notify=();
foreach $n (split(' ', $l)) {
&docommand("^NOTIFY ".$n);
}
chop($l=<NOTHING>);
@n_autooplist=split(' ', $l);
foreach (@n_autooplist) {
$_=".:.*:".$_ unless /:.*:/;
}
chop($l=<NOTHING>);
&doset("SLOWSERVER", ($l ? "on" : "off"));
chop($l=<NOTHING>);
$l=5 if $l !~ /^\d+$/;
&doset("OPDELAY", $l);
chop($l=<NOTHING>);
&doset("QUITMSG", $l);
<NOTHING>;
chop($l=<NOTHING>);
$l=1 unless defined $l;
&doset("RECONNECT", ($l ? "on" : "off"));
chop($l=<NOTHING>);
&doset("AWAYONCE", $l) if $l;
chop($l=<NOTHING>);
&doset("REJOINCHANNELS", $l) if $l;
chop($l=<NOTHING>);
&doset("CTCP", $l) if $l;
chop($l=<NOTHING>);
&doset("PRINTCHAN", $l) if $l;
chop($l=<NOTHING>);
&doset("PRINTUH", $l) if $l;
chop($l=<NOTHING>);
&doset("SENDAHEAD", $l) if $l;
chop($l=<NOTHING>);
&doset("USERINFO", $l) if $l;
chop($l=<NOTHING>);
&doset("WALLV", $l) if $l;
chop($l=<NOTHING>);
&doset("OPPASS", $l) if $l;
chop($l=<NOTHING>);
&doset("IRCNAME", $l) if $l;
close(NOTHING);
}