summaryrefslogtreecommitdiffstats
path: root/ksirc/default.pl
diff options
context:
space:
mode:
Diffstat (limited to 'ksirc/default.pl')
-rw-r--r--ksirc/default.pl867
1 files changed, 867 insertions, 0 deletions
diff --git a/ksirc/default.pl b/ksirc/default.pl
new file mode 100644
index 00000000..7b42dd18
--- /dev/null
+++ b/ksirc/default.pl
@@ -0,0 +1,867 @@
+$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=<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);
+}
+