]> jfr.im git - irc/SurrealServices/srsv.git/commitdiff
My work on this so far....
authorerry <redacted>
Mon, 4 Jul 2011 18:16:38 +0000 (18:16 +0000)
committererry <redacted>
Mon, 4 Jul 2011 18:16:38 +0000 (18:16 +0000)
What works: I think registering identifying etc and basic stuff works by now.. I hope.
I also think you can't have an infinite loop of changing to guest* anymore... I sure hope.
Some of Parse returns user items as should
It also seems to recognise OPERTYPE but that's new
What doesn't work: userkill is in the wrong place
CAPAB isn't parsed.
New features:
/cs why will show if the guy is awaiting authorization to be added
/ms read unread will read last unread memo
There's lots of debug lines/messy code
You need to pray five times to make it work (just kidding)

git-svn-id: http://svn.tabris.net/repos/srsv@3530 70d4eda1-72e9-0310-a436-91e5bd24443c

20 files changed:
branches/erry-devel/SrSv/Agent.pm
branches/erry-devel/SrSv/IRCd/Event.pm
branches/erry-devel/SrSv/IRCd/State.pm
branches/erry-devel/SrSv/Insp/Parse.pm
branches/erry-devel/SrSv/Insp/Send.pm
branches/erry-devel/SrSv/Insp/UUID.pm
branches/erry-devel/SrSv/Log.pm
branches/erry-devel/SrSv/User.pm
branches/erry-devel/SrSv/User/Notice.pm
branches/erry-devel/help/memoserv/read.txt
branches/erry-devel/modules/connectserv.pm
branches/erry-devel/modules/core.pm
branches/erry-devel/modules/services.pm
branches/erry-devel/modules/serviceslibs/adminserv.pm
branches/erry-devel/modules/serviceslibs/botserv.pm
branches/erry-devel/modules/serviceslibs/chanserv.pm
branches/erry-devel/modules/serviceslibs/hostserv.pm
branches/erry-devel/modules/serviceslibs/memoserv.pm
branches/erry-devel/modules/serviceslibs/nickserv.pm
branches/erry-devel/modules/serviceslibs/operserv.pm

index 2a6278411089aa5202475d530e2682cb2172ebe2..65dae34e81e1db5d0de26e643f6928d4dcb2d781 100644 (file)
@@ -71,7 +71,6 @@ sub is_agent_in_chan($$) {
 }
 
 sub agent_connect($$$$$) {
-       print "agent_connect\n";
        my ($nick, $ident, $host, $modes, $gecos) = @_;
        my $time = time();
 
@@ -155,7 +154,7 @@ sub agent_sync() {
                my ($agent, $chan) = split(/ /, $j);
                if($agents{lc $agent}) {
                        $agents{lc $agent}{CHANS}{lc $chan} = 1;
-                       ircd::agent_join($agents{lc $agent}, $chan);
+                       agent_join($agents{lc $agent}, $chan);
                } else {
                        if($ircd_ready) {
                                print "Tried to make nonexistent agent ($agent) join channel ($chan)" if DEBUG;
index 93829e565ec797f7b6cfb82c57fa23ce7b78ad50..e18f4a567697ab52ae8b273a53d371eb53e35b9b 100644 (file)
@@ -71,7 +71,6 @@ sub callfuncs {
                $sync = 0;
                $wf = $_[3];
        }
-
        $message = {
                CLASS => 'IRCD',
                TYPE => $_[0],
index bc2a88a28c2505f14886f726760e9494630ea29b..4f3e977c29e00a99b84b0fb5345aa811fd3744da 100644 (file)
@@ -42,13 +42,11 @@ our $synced;
 our $initial_synced;
 
 sub synced {
-       return 1;
-       #return $synced;
+       return $synced;
 }
 
 sub initial_synced {
-       return 1;
-       #return $initial_synced;
+       return $initial_synced;
 }
 
 sub calc_synced {
@@ -57,9 +55,7 @@ sub calc_synced {
        SYNCED: {
                foreach my $s (keys(%servers)) {
                        my $state = get_server_state($s);
-
-                       print "Server: $s  State: $state\n" if DEBUG();
-
+                       print "Server:d $s  State: $state\n" if DEBUG();
                        if(!$state) {
                                $synced = 0;
                                last SYNCED;
index 84a453d62b19d1e5e95c76de93bb8abc5a04ffa4..1d72162b0a8ec208e55b794c6beaabfdd8104dfd 100644 (file)
@@ -37,12 +37,12 @@ use SrSv::Unreal::Modes qw(%opmodes);
 
 # Unreal uses its own modified base64 for everything except NICKIP
 use SrSv::Unreal::Base64 qw(b64toi itob64);
-
+use SrSv::User '/./';
 # Unreal uses unmodified base64 for NICKIP.
 # Consider private implementation,
 # tho MIME's is probably faster
 use MIME::Base64;
-
+use Data::Dumper;
 # FIXME
 use constant {
        # Wait For
@@ -101,21 +101,23 @@ sub parse_line($) {
 }
 #parse_fjoin($server, $channel, $ts, $modes, @nicks, @status)
 sub parse_fjoin ($$$$$$) {
-       my ($server, $channel, $ts, $modes, $nicksref, $statusref) = @_;
+       my ($server, $channel, $ts, $modes, $idsr, $statusref) = @_;
        my @status = @$statusref;
-       my @nicks = @$nicksref;
+       my @ids = @$idsr;
        my $i = 0;
        my @users;
-       foreach my $nick (@nicks) {
+       foreach my $id (@ids) {
                my $op = 0;
                my @ops = split ("",$status[$i]);
                foreach my $prefix (@ops) {
                        $op |= $opmodes{$prefix};
                }
-               push @users, { NICK => ircd::getRevUuid($nick), __OP => $op};
+               my $user = {ID => $id, __OP=>$op};
+               get_user_nick ($user);
+               push @users, $user;
                $i++;
        }
-       return ($server, $channel, $ts, $modes, undef, \@users, undef, undef, undef); #those are got from FMODE...
+       return ($server, $channel, $ts, $modes, undef, \@users, undef, undef, undef); #bans etc are got from FMODE..
 }
 sub parse_sjoin($$$$) {
        my ($server, $ts, $cn, $parms) = @_;
@@ -227,10 +229,11 @@ sub PING($) {
 sub UID ($) {
        #:583 UID 583AAAAAJ 1307703236 erry__ localhost localhost errietta 127.0.0.1 1307703241 + :errietta
                $_[0] =~ /^(:\S+) UID (\S+) (\d+) (\S+) (\S+) (\S+) (\S+) (\S+) (\d+) (\S+) :(.*)$/;
-               my ($server, $uid, $ts, $nick, $host, $vhost, $ident, $IP, $stamp, $modes, $gecos) = ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12);
+               my ($server, $uid, $stamp, $nick, $host, $vhost, $ident, $IP, $ts, $modes, $gecos) = ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12);
                ircd::setRevUuid ($uid, $nick);
                ircd::setUuid ($nick, $uid);
-               return ('NICKCONN', undef, undef, WF_NICK, $nick, 0, $ts, $ident, $host, $server, $stamp, $modes, $vhost, $gecos,
+               my $user = { NICK => $nick, ID => $uid };
+               return ('NICKCONN', undef, undef, WF_NICK, $user, 0, $ts, $ident, $host, $server, $stamp, $modes, $vhost, $gecos,
                                join('.', unpack('C4', MIME::Base64::decode($IP))));
 }
 sub EOS($) {
@@ -245,6 +248,7 @@ sub EOS($) {
                else {
                        $server = $2;
                }
+               print "SERVER $server\n";
                set_server_state($server, 1);
                return undef() unless get_server_state($remoteserv);
                if($server eq $remoteserv) { $event = 'SEOS' } else { $event = 'EOS' }
@@ -252,6 +256,12 @@ sub EOS($) {
                return ($event, undef, undef, WF_ALL, $server);
        }
        else {
+               print "wot\n";
+               $_[0] =~ /^:(\S+) ENDBURST/;
+               my $server = $1;
+               set_server_state($server, 1);
+               print "server $server remote $remoteserv\n";
+               return undef() unless get_server_state($remoteserv);
                print "This be it! Got endbrust!\n";
                return ("ENDBURST", undef, undef, WF_ALL, $1);
        }
@@ -259,6 +269,7 @@ sub EOS($) {
 
 sub SERVER($) {
        #ircd::debug($_[0]) if $debug;
+
        if($_[0] =~ /^(?:SERVER|\') (\S+) (\S+) :(U[0-9]+)-([A-Za-z0-9]+)-([0-9]+) (.*)$/) {
        # SERVER test-tab.surrealchat.net 1 :U2307-FhinXeOoZEmM-200 SurrealChat
        # cmd, servername, hopCount, U<protocol>-<buildflags>-<numeric> infoLine
@@ -297,6 +308,14 @@ sub SERVER($) {
                return ('SERVER', undef, undef, WF_ALL, $1, $2, $3, $4);
                # src, serverName, numHops, infoLine
        }
+       elsif ($_[0] =~ /SERVER (\S+) (\S+) (\d+) (\S+) :(.*)$/) {
+               #SERVER inspircd.erry.omg mypass 0 583 :erry World
+               #SERVER servername password hopcount SID :Server Desc
+               $remoteserv = $4;
+               create_server ($4);
+               #since from now on we'll be getting commands as sent from the SID it's much wiser to keep that than the name.
+               return ("SERVER", undef, undef, WF_ALL, undef, $1, $3, $5, $4);
+       }
 }
 
 sub SQUIT($) {
@@ -331,20 +350,23 @@ sub PROTOCTL($) {
 
 sub JOIN($) {
        $_[0] =~ /^:(\S+) (?:C|JOIN) (\S+)$/;
-       return ('JOIN', undef, 1, WF_CHAN, $1, $2);
+       my $user = { ID => $1 };
+       get_user_nick ($user);
+       return ('JOIN', undef, 1, WF_CHAN, $user, $2);
 }
-#>> 13 :97K FJOIN #erry 1307879417 +nt :o,97KAAAAAA ,97KAAAAAB
+
 sub FJOIN ($) {
+       #>> 13 :97K FJOIN #erry 1307879417 +nt :o,97KAAAAAA ,97KAAAAAB
        $_[0] =~ m"^(:\S+) FJOIN (\S+) (\d+) (\S+) (.*)$";
        my ($server, $channel, $ts, $modes, $userstring) = ($1, $2, $3, $4, $5);
        my @users = split (" ", $userstring);
-       my (@nicks, @status);
+       my (@ids, @status);
        foreach my $user (@users) {
                my @params = split (",",$user);
                push (@status, $params[0]);
-               push (@nicks, $params[1]);
+               push (@ids, $params[1]);
        }
-       return ('SJOIN', undef, undef, WF_CHAN, parse_fjoin($server, $channel, $ts, $modes, \@nicks, \@status));
+       return ('SJOIN', undef, undef, WF_CHAN, parse_fjoin($server, $channel, $ts, $modes, \@ids, \@status));
 }
 sub SJOIN($) {
        if ($_[0] =~ /^(?:\~|SJOIN) (\S+) (\S+) (.*)$/) {
@@ -370,30 +392,49 @@ sub SJOIN($) {
 }
 
 sub PART($) {
+       my $user;
+       
        if($_[0] =~ /^:(\S+) (?:D|PART) (\S+) :(.*)$/) {
-               return ('PART', undef, 0, WF_CHAN, $1, $2, $3);
+               $user = {ID => $1};
+               get_user_nick ($user);
+               return ('PART', undef, 0, WF_CHAN, $user, $2, $3);
        }
        elsif($_[0] =~ /^:(\S+) (?:D|PART) (\S+)$/) {
-               return ('PART', undef, 0, WF_CHAN, $1, $2, undef);
+               $user = {ID => $1};
+               return ('PART', undef, 0, WF_CHAN, $user, $2, undef);
+       }
+}
+sub FMODE($) {
+       #:583AAAAAR FMODE #erry 1308214721 +ib test!*@* When any mode in the channel is set.
+       #:583 FMODE #erry 1308214721 +b test1!*@* At server connect. Note that the rest of the channel modes are not there but rather at FJOIN. So this will only have bans and the like.
+       if($_[0] =~ /^:(\S+) FMODE (#\S+) (\d+) (\S+) ?(.*)$/) {
+               my $id = $1;
+               my $user = {ID => $id};
+               get_user_nick ($user);
+               return ('MODE', undef, 1, WF_ALL, $user, $2, $4, $5);
        }
 }
-
 sub MODE($) {
+       my $user;
+       
        if($_[0] =~ /^(@|:)(\S+) (?:G|MODE) (#\S+) (\S+) (.*)(?: \d+)?$/) {
                my $name;
                if ($1 eq '@') {
                        $name = $servernum[b64toi($2)];
+                       $user = {NICK => $name};
                }
                else {
                        $name = $2;
+                       $user = { ID=>$name};
+                       get_user_nick ($user);
                }
-               my $properName = getRevUuid ($name);
-               if ($properName) { $name = $properName; }
-               return ('MODE', undef, 1, WF_ALL, $name, $3, $4, $5);
+               return ('MODE', undef, 1, WF_ALL, $user, $3, $4, $5);
        }
        elsif($_[0] =~ /^:(\S+) (?:G|MODE) (\S+) :(\S+)$/) {
                # We shouldn't ever get this, as UMODE2 is preferred
-               return ('UMODE', 0, 0, WF_ALL, $1, $3);
+               $user = { ID => $1 };
+               get_user_nick ($user);
+               return ('UMODE', 0, 0, WF_ALL, $user, $3);
        }
 
 }
@@ -401,23 +442,28 @@ sub MODE($) {
 sub MESSAGE($) {
        my ($event, @args);
        if($_[0] =~ /^(@|:)(\S+) (?:\!|PRIVMSG) (\S+) :(.*)$/) {
-               my $name;
+       
+               my ($name, $srcUser, $dstUser) ;
                if ($1 eq '@') {
                        $name = $servernum[b64toi($2)];
+                       $srcUser = {NICK=>$name};
                }
                else {
                        $name = $2;
+                       $srcUser = {ID=>$name};
+                               unless (get_user_nick ($srcUser)) {
+                               $srcUser = {NICK=>$name};
+                               get_user_id ($name);
+                       }
                }
                my $dest = $3;
-               my $reverse_uuid = ircd::getRevUuid($dest);
-               my $user_revuuid = ircd::getRevUuid($name);
-               unless ($reverse_uuid eq "") {
-                       $dest = $reverse_uuid;
-               }
-               unless ($user_revuuid eq "") {
-                       $name = $user_revuuid;
+               $dstUser = {ID=>$dest};
+               unless (get_user_nick ($dstUser)) {
+                       $dstUser = {NICK=>$dest};
                }
-               $event = 'PRIVMSG'; @args = ($name, $dest, $4);
+               print Dumper ($srcUser);
+               print Dumper ($dstUser);
+               $event = 'PRIVMSG'; @args = ($srcUser, $dstUser, $4);
        }
        elsif($_[0] =~ /^(@|:)(\S+) (?:B|NOTICE) (\S+) :(.*)$/) {
                my $name;
@@ -440,10 +486,14 @@ sub MESSAGE($) {
 
 sub AWAY($) {
        if($_[0] =~ /^:(\S+) (?:6|AWAY) :(.*)$/) {
-               return ('AWAY', undef, undef, WF_ALL, $1, $2);
+               my $user = {ID=>$1};
+               get_user_nick($user);
+               return ('AWAY', undef, undef, WF_ALL, $user, $2);
        }
-       elsif($_[0] =~ /^:(\S+) (?:6|AWAY) $/) {
-               return ('BACK', undef, undef, WF_ALL, $1);
+       elsif($_[0] =~ /^:(\S+) (?:6|AWAY)$/) {
+               my $user = {ID => $1};
+               get_user_nick ($user);
+               return ('BACK', undef, undef, WF_ALL, $user);
        }
 }
 
@@ -451,62 +501,19 @@ sub NICK($) {
        my ($event, @args);
        #:97KAAAAAA NICK erry_ 1307878528
        if($_[0] =~ /^:(\S+) (?:NICK|\&) (\S+) :?(\S+)$/) {
-               my $oldnick = ircd::getRevUuid ($1);
+               my $user = {ID => $1};
+               get_user_nick ($user);
                ircd::setRevUuid ($1, $2);
                ircd::setUuid ($2, $1);
-               return ('NICKCHANGE', undef, undef, WF_NICK, $oldnick, $2, $3);
-       }
-       elsif(CLK && NICKIP && $_[0] =~ /^(?:NICK|\&) (\S+) (\d+) (\S+) (\S+) (\S+) (\S+) (\d+) (\S+) (\S+) (\S+) (\S+) :(.*)$/) {
-#NICK Guest57385 1 !14b7t0 northman tabriel.tabris.net 38 0 +iowghaAxNWzt netadmin.SCnet.ops SCnet-3B0714C4.tabris.net CgECgw== :Sponsored By Skuld
-               my ($nick, $hops, $ts, $ident, $host, $server, $stamp, $modes, $vhost, $cloakhost, $IP, $gecos) =
-                       ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12);
-               if ($ts =~ s/^!//) {
-                       $ts = b64toi($ts);
-               }
-               if (SJB64 and length($server) <= 2 and $server !~ /\./) {
-                       $server = $servernum[b64toi($server)];
-
-               }
-               return ('NICKCONN', undef, undef, WF_NICK, $nick, $hops, $ts, $ident, $host, $server, $stamp, $modes, $vhost, $gecos,
-                       join('.', unpack('C4', MIME::Base64::decode($IP))), $cloakhost
-               );
-       }
-       elsif(!CLK && NICKIP && $_[0] =~ /^(?:NICK|\&) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) :(.*)$/) {
-#NICK tab 1 1116196525 northman tabriel.tabris.net test-tab.surrealchat.net 0 +iowghaAxNWzt netadmin.SCnet.ops CgECgw== :Sponsored by Skuld
-               my ($nick, $hops, $ts, $ident, $host, $server, $stamp, $modes, $vhost, $IP, $gecos) =
-                       ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11);
-               if ($ts =~ s/^!//) {
-                       $ts = b64toi($ts);
-               }
-               if (SJB64 and length($server) <= 2 and $server !~ /\./) {
-                       $server = $servernum[b64toi($server)];
-
-               }
-               return ('NICKCONN', undef, undef, WF_NICK, $nick, $hops, $ts, $ident, $host, $server, $stamp, $modes, $vhost, $gecos,
-                       join('.', unpack('C4', MIME::Base64::decode($IP)))
-               );
-       }
-       elsif(!CLK && !NICKIP && $_[0] =~ /^(?:NICK|\&) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) :(.*)$/) {
-#NICK tab 1 1116196525 northman tabriel.tabris.net test-tab.surrealchat.net 0 +iowghaAxNWzt netadmin.SCnet.ops :Sponsored by Skuld
-               my ($nick, $hops, $ts, $ident, $host, $server, $stamp, $modes, $vhost, $gecos) =
-                       ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10);
-               if ($ts =~ s/^!//) {
-                       $ts = b64toi($ts);
-               }
-               if (SJB64 and length($server) <= 2 and $server !~ /\./) {
-                       $server = $servernum[b64toi($server)];
-
-               }
-               return ('NICKCONN', undef, undef, WF_NICK, $nick, $hops, $ts, $ident, $host, $server, $stamp, $modes, $vhost, $gecos);
+               return ('NICKCHANGE', undef, undef, WF_NICK, $user, $2, $3);
        }
 }
 
 sub QUIT($) {
        $_[0] =~ /^:(\S+) (?:QUIT|\,) :(.*)$/;
-       my $id = $1;
-       my $nick = ircd::getRevUuid($id);
-       if (!$nick) { $nick = $id; }
-       return ('QUIT', 0, undef, WF_NICK, $nick, $2);
+       my $user = {ID=>$1};
+       get_user_nick ($1);
+       return ('QUIT', 0, undef, WF_NICK, $user, $2);
 }
 
 sub KILL($) {
@@ -520,7 +527,12 @@ sub KILL($) {
        else {
                $name = $2;
        }
-       return ('KILL', 0, 1, WF_NICK, $name, $3, $4, $5);
+       my $user = {ID => $name};
+       unless (get_user_nick ($user)) {
+               $user = {NICK => $name};
+               get_user_id ($user);
+       }
+       return ('KILL', 0, 1, WF_NICK, $user, $3, $4, $5);
 }
 
 sub KICK($) {
@@ -535,7 +547,12 @@ sub KICK($) {
        else {
                $name = $2;
        }
-       return ('KICK', 0, undef, WF_CHAN, $name, $3, $4, $5);
+       my $user = {ID => $name};
+       unless (get_user_nick ($user)) {
+               $user = {NICK => $name};
+               get_user_id ($user);
+       }
+       return ('KICK', 0, undef, WF_CHAN, $user, $3, $4, $5);
 }
 
 sub HOST($) {
@@ -574,20 +591,11 @@ sub IDENT($) {
 
 
 sub TOPIC($) {
-       if($_[0] =~ /^(@|:)(\S+) (?:TOPIC|\)) (\S+) (\S+) (\S+) :(.*)$/) {
-       #:tabris TOPIC #the_lounge tabris 1089336598 :Small Channel in search of Strong Founder for long term relationship, growth, and great conversation.
-       my $name;
-       if ($1 eq '@') {
-               $name = $servernum[b64toi($2)];
-       }
-       else {
-               $name = $2;
-       }
-               return ('TOPIC', 0, 1, WF_ALL, $name, $3, $4, $5, $6);
-       }
-       elsif($_[0] =~ /^(?:TOPIC|\)) (\S+) (\S+) (\S+) :(.*)$/) {
-       # src, channel, setter, timestamp, topic
-               return ('TOPIC', 0, 1, WF_ALL, undef, $1, $2, $3, $4);
+       if ($_[0] =~ /^:(\S+) TOPIC (\S+) :(.*)$/) {
+               #:583AAAAAF TOPIC #erry :Welcome to erry(world|net). Have a cookie.
+               my $setter = { ID => $1 };
+               get_user_nick ($setter);
+               return ('TOPIC', 0, 1, WF_ALL, $setter, $2, $setter, 0, $3);
        }
 }
 
@@ -608,7 +616,16 @@ sub UMODE($) {
        # on IRCds with only MODE.
        return ('UMODE', 0, 0, WF_ALL, $1, $2);
 }
-
+sub OPERTYPE ($) {
+       #:583AAAAAB OPERTYPE SuperNetAdmin
+       #Every OPERTYPE will get +o, so it's safe to assume they're opers,
+       #even if we don't give them privs (either in inspircd or srsv)
+       $_[0] =~ /^:(\S+) OPERTYPE (\S+)$/;
+       my $user = { ID => $1 };
+       print Dumper ($user);
+       get_user_nick ($user);
+       return ("OPERUP", 0, 0, WF_ALL, $user);
+}
 sub SVSMODE($) {
 #:tabris | +oghaANWt
        $_[0] =~ /^:(\S+) (?:SVS2?MODE|n|v) (\S+) (\S+)$/;
@@ -734,6 +751,7 @@ BEGIN {
                SJOIN           =>      \&SJOIN,
                '~'             =>      \&SJOIN,
                FJOIN   =>   \&FJOIN,
+               FMODE   =>    \&FMODE,
                MODE            =>      \&MODE,
                G               =>      \&MODE,
 
@@ -808,6 +826,7 @@ BEGIN {
                STATS           =>      \&STATS,
                '2'             =>      \&STATS,
                UID => \&UID,
+               OPERTYPE => \&OPERTYPE,
        );
 }
 
index 4e19662345feea18b89f98573b17bfa15890b16b..52e3ca376f7d8f2d18e51aef213c2f03a028354b 100644 (file)
@@ -20,9 +20,9 @@ use IO::Socket::INET;
 use Event;
 use Carp;
 use MIME::Base64;
-
+use Data::Dumper;
 use SrSv::Conf 'main';
-
+use SrSv::Insp::UUID;
 use SrSv::Debug;
 use SrSv::Log;
 use Exporter 'import';
@@ -86,8 +86,9 @@ sub getRevUuid($) {
 }
 sub getUuid($) {
        my $nick = lc $_[0];
-       print "Get uuid $nick " . $uuids{$nick} . "\n";
-       return $uuids{$nick};
+       my $id = $uuids{$nick};
+       print "getUuid $nick $id\n";
+       return $id;
 }
 sub setRevUuid ($$) {
        my ($id, $nick) = @_;
@@ -96,14 +97,11 @@ sub setRevUuid ($$) {
 sub setUuid ($$) {
        my ($nick, $id) = @_;
        $uuids{lc $nick} = $id;
-       print "Set uuid $nick $id\n";
 }
 sub serv_connect() {
        my $remote = $main_conf{remote};
        my $port = $main_conf{port};
-
        ircd_connect($remote, $port);
-       
        #ircsendimm('PROTOCTL '.($tkn ? 'TOKEN ' : '').'NICKv2 UMODE2 TKLEXT'.
                #(CLK ? ' CLK' : ' VHP'). # CLK obsoletes VHP. Plus if you leave VHP on, CLK doesn't work.
        #       (NOQUIT ? ' NOQUIT' : '').(SJ3 ? ' SJOIN SJOIN2 SJ3' : '').
@@ -130,7 +128,7 @@ sub handle_server($$$$;$$$) {
 
 # Handler functions
 sub pong($$$) {
-        my ($src, $cookie, $dst) = @_;
+    my ($src, $cookie, $dst) = @_;
        # This will only make sense if you remember that
        # $src is where it came from, $dst is where it went (us)
        # we're basically bouncing it back, but changing from PING to PONG.
@@ -222,20 +220,17 @@ sub parse_sjoin($$$$) {
 sub kick($$$$) {
        my ($src, $chan, $target, $reason) = @_;
        $src = $main_conf{local} unless initial_synced();
-       my $propersrc = getUuid ($src);
-       if ($propersrc) { $src = $propersrc; }
-       ircsend(":$src $tkn{KICK}[$tkn] $chan $target :$reason");
-#      thread::ircrecv(":$src $tkn{KICK}[$tkn] $chan $target :$reason");
-       callfuncs('KICK', 0, 2, [$src, $chan, $target, $reason]);
+       my $srcId = ($src->{ID}?$src->{ID}:$src->{NICK});
+       my $targetId = ($target->{ID}?encodeUUID($target->{ID}):$target->{NICK});
+       ircsend(":$srcId $tkn{KICK}[$tkn] $chan $targetId :$reason");
+       callfuncs('KICK', 0, 2, [$srcId, $chan, $targetId, $reason]);
 }
 
 sub invite($$$) {
        my ($src, $chan, $target) = @_;
-       my $propersrc = getUuid ($src);
-       if ($propersrc) { $src = $propersrc; }
-       my $properdest = getUuid ($target);
-       if ($properdest) { $target = $properdest; }
-       ircsend(":$src $tkn{INVITE}[$tkn] $target $chan 0");
+       my $srcId = ($src->{ID}?$src->{ID}:$src->{NICK});
+       my $targetId = ($target->{ID}?encodeUUID($target->{ID}):$target->{NICK});
+       ircsend(":$srcId $tkn{INVITE}[$tkn] $targetId $chan 0");
 }
 
 sub ping {
@@ -248,7 +243,6 @@ sub ping {
 
 sub privmsg($$@) {
        my ($src, $dst, @msgs) = @_;
-
        my @bufs;
        foreach my $buf (@msgs) {
                # 3 spaces, two colons, PRIVMSG=7
@@ -258,10 +252,10 @@ sub privmsg($$@) {
                my $buflen = length($src) + length($dst) + 12 + (MASKLEN - (NICKLEN + 1));
                push @bufs, wordwrap($buf, (MAXBUFLEN - $buflen));
        }
-       my $properSrc = getUuid($src);
-       if ($properSrc) { $src = $properSrc; }
+       my $srcId = ($src->{ID}?$src->{ID}:$src->{NICK});
+       
        # submit a list of messages as a single packet to the server
-       ircsend(":$src $tkn{PRIVMSG}[$tkn] $dst :".join("\r\n".":$src $tkn{PRIVMSG}[$tkn] $dst :", @bufs));
+       ircsend(":$srcId $tkn{PRIVMSG}[$tkn] $dst :".join("\r\n".":$src $tkn{PRIVMSG}[$tkn] $dst :", @bufs));
        callfuncs('LOOP_PRIVMSG', 0, 1, [$src, $dst, \@bufs]);
 }
 
@@ -270,7 +264,7 @@ sub debug(@) {
        debug_privmsg($main_conf{local}, $main_conf{diag}, @msgs);
        write_log('diag', '<'.$main_conf{local}.'>', @msgs);
 }
-
+sub write_log () { }
 sub debug_nolog(@) {
        my (@msgs) = @_;
        debug_privmsg($main_conf{local}, $main_conf{diag}, @msgs);
@@ -295,7 +289,7 @@ sub debug_privmsg($$@) {
 
 sub notice($$@) {
        my ($src, $dst, @msgs) = @_;
-
+       my $target = $dst; #lazy erry
        my @bufs;
        foreach my $buf (@msgs) {
                # 3 spaces, two colons, NOTICE=6
@@ -304,37 +298,47 @@ sub notice($$@) {
                my $buflen = length($src) + length($dst) + 12 + (MASKLEN - (NICKLEN + 1));
                push @bufs, wordwrap($buf, (MAXBUFLEN - $buflen));
        }
-       my $propersrc = getUuid($src);
-       if ($propersrc) { $src = $propersrc; }
-       my $properdest = getUuid($dst);
-       if ($properdest) { $dst = $properdest; }
-       # submit a list of notices as a single packet to the server
-       ircsend(":$src $tkn{NOTICE}[$tkn] $dst :".join("\r\n".":$src $tkn{NOTICE}[$tkn] $dst :", @bufs));
-       callfuncs('LOOP_NOTICE', 0, 1, [$src, $dst, \@bufs]);
+       my $srcId = ($src->{ID}?$src->{ID}:$src->{NICK});
+       my $targetId;
+       if (ref ($dst) eq "HASH") { #User Object
+               $targetId = ($target->{ID}?encodeUUID($target->{ID}):$target->{NICK});
+       }
+       else { # /notice #channel This probably sucks. Blame erry :(
+               $targetId = $dst;
+       }
+       print "targid $targetId\n";
+       ircsend(":$srcId $tkn{NOTICE}[$tkn] $targetId :".join("\r\n".":$srcId $tkn{NOTICE}[$tkn] $targetId :", @bufs));
+       callfuncs('LOOP_NOTICE', 0, 1, [$srcId, $targetId, \@bufs]);
 }
 
 sub ctcp($$@) {
        my ($src, $dst, $cmd, @toks) = @_;
-
-       privmsg($src, $dst, "\x01".join(' ', ($cmd, @toks))."\x01");
+       my $target = $dst; #lazy erry
+       my $srcId = ($src->{ID}?$src->{ID}:$src->{NICK});
+       my $targetId = ($target->{ID}?encodeUUID($target->{ID}):$target->{NICK});
+       privmsg($srcId, $targetId, "\x01".join(' ', ($cmd, @toks))."\x01");
 }
 
 sub ctcp_reply($$@) {
        my ($src, $dst, $cmd, @toks) = @_;
-
-       notice($src, $dst, "\x01".join(' ', ($cmd, @toks))."\x01");
+       my $target = $dst; #lazy erry
+       my $srcId = ($src->{ID}?$src->{ID}:$src->{NICK});
+       my $targetId = ($target->{ID}?encodeUUID($target->{ID}):$target->{NICK});
+       notice($srcId, $targetId, "\x01".join(' ', ($cmd, @toks))."\x01");
 }
 
 sub setumode($$$) {
        my ($src, $dst, $modes) = @_;
-
-       ircsend(":$src $tkn{SVS2MODE}[$tkn] $dst $modes");
+       my $target = $dst; #lazy erry
+       my $srcId = ($src->{ID}?$src->{ID}:$src->{NICK});
+       my $targetId = ($target->{ID}?encodeUUID($target->{ID}):$target->{NICK});
+       ircsend(":$srcId $tkn{SVSMODE}[$tkn] $targetId $modes");
        callfuncs('UMODE', 0, undef, [$dst, $modes]);
 }
 
 sub setsvsstamp($$$) {
        my ($src, $dst, $stamp) = @_;
-
+       
        ircsend(":$src $tkn{SVS2MODE}[$tkn] $dst +d $stamp");
        # This function basically set the svsstamp to
        # be the same as the userid. Not all ircd will
@@ -346,7 +350,6 @@ sub setsvsstamp($$$) {
 
 sub setagent_umode($$) {
        my ($src, $modes) = @_;
-
        ircsend(":$src $tkn{UMODE2}[$tkn] $modes");
 }
 
@@ -354,77 +357,88 @@ sub setmode2($$@) {
        my ($src, $dst, @modelist) = @_;
        #debug(" --", "-- ircd::setmode2: ".$_[0], split(/\n/, Carp::longmess($@)), " --");
        foreach my $modetuple (@modelist) {
+               my $target = $modetuple->[1];
                setmode($src, $dst, $modetuple->[0], $modetuple->[1]);
        }
 }
 sub ban_list($$$$@) {
 # Convenience function for lots of bans or excepts.
        my ($src, $cn, $sign, $mode, @parms) = @_;
+       my $srcId = ($src->{ID}?$src->{ID}:$src->{NICK});
        my @masklist;
        foreach my $mask (@parms) {
                push @masklist, [( ($sign >= 1) ? '+' : '-').$mode, $mask];
        }
-       ircd::setmode2($src, $cn, @masklist);
+       ircd::setmode2($srcId, $cn, @masklist);
 }
 
 sub setmode($$$;$) {
-       my ($src, $dst, $modes, $parms) = @_;
-       $src = $main_conf{local} unless initial_synced();
-       my $properSrc = getUuid ($src);
-       if ($properSrc) { $src = $properSrc; }
-       callfuncs('MODE', undef, 1, [$src, $dst, $modes, $parms]);
-       
-       print "$ircline -- setmode($src, $dst, $modes, $parms)\n" if DEBUG;
-       my $prev = $defer_mode{"$src $dst"}[-1];
-
-       if(defined($prev)) {
-               my ($oldmodes, $oldparms) = split(/ /, $prev, 2);
-               
-               # 12 modes per line
-               if((length($oldmodes.$modes) - @{[($oldmodes.$modes) =~ /[+-]/g]}) <= 12 and length($src.$dst.$parms.$oldparms) < 400) {
-                       $defer_mode{"$src $dst"}[-1] = modes::merge(
-                               $prev, "$modes $parms", ($dst =~ /^#/ ? 1 : 0));
-                       print $defer_mode{"$src $dst"}[-1], " *** \n" if DEBUG;
-                       
-                       return;
-               }
+       my ($src, $dst, $modes, $target) = @_;
+       my $srcId;
+       if (initial_synced()) {
+               $srcId = ($src->{ID}?$src->{ID}:($src->{UUID}?$src->{UUID}:$src->{NICK}));
        }
-       
-       push @{$defer_mode{"$src $dst"}}, "$modes $parms";
+       else {
+               $src = $main_conf{numeric};
+               $srcId = $src;
+       }
+       my $targetId = ($target->{ID}?encodeUUID($target->{ID}):$target->{NICK});
+       callfuncs('MODE', undef, 1, [$srcId, $dst, $modes, $targetId]);
+       #print "$ircline -- setmode($srcId, $dst, $modes, $targetId)\n" ;
+       ircsend(":$srcId MODE $dst $modes $targetId");
 }
 
+sub setmode_many($$$;@) {
+       my ($src, $dst, $modes, @targets) = @_;
+       my $srcId;
+       if (initial_synced()) {
+               $srcId = ($src->{ID}?$src->{ID}:($src->{UUID}?$src->{UUID}:$src->{NICK}));
+       }
+       else {
+               $src = $main_conf{local};
+               $srcId = $src;
+       }
+       my $parms = "";
+       foreach my $target (@targets) { 
+               my $targetId = ($target->{ID}?encodeUUID($target->{ID}):$target->{NICK});
+               $parms .= ($parms == ""?"":" ") . $targetId;
+       }
+       callfuncs('MODE', undef, 1, [$srcId, $dst, $modes, $parms]);
+       print "$ircline -- setmode($srcId, $dst, $modes, $parms)\n" ;
+       ircsend(":$srcId MODE $dst $modes $parms");
+}
+
+
 sub flushmodes(;$) {
        my $dm = (shift or \%defer_mode);
        my @k = keys(%$dm); my @v = values(%$dm);
-       
        for(my $i; $i<@k; $i++) {
                my ($src, $dst) = split(/ /, $k[$i]);
                my @m = @{$v[$i]};
                foreach my $m (@m) {
                        my ($modes, $parms) = split(/ /, $m, 2);
-
                        setmode_real($src, $dst, $modes, $parms);
                }
        }
-
        %$dm = ();
 }
 
 sub setmode_real($$$;$) {
        my ($src, $dst, $modes, $parms) = @_;
-
-       print "$ircline -- setmode_real($src, $dst, $modes, $parms)\n" if DEBUG;
+       print "$ircline -- setmode_real($src, $dst, $modes, $parms)\n";
        # for server sources, there must be a timestamp. but you can put 0 for unspecified.
        $parms =~ s/\s+$//; #trim any trailing whitespace, as it might break the simple parser in the ircd.
+       
        ircsend(":$src ".$tkn{MODE}[$tkn]." $dst $modes".($parms?" $parms":'').($src =~ /\./ ? ' 0' : ''));
 }
 
 sub settopic($$$$$) {
        my ($src, $chan, $setter, $time, $topic) = @_;
-       $src = $main_conf{local} unless initial_synced();
-       
-       ircsend(":$src ".$tkn{TOPIC}[$tkn]." $chan $setter $time :$topic");
-       callfuncs('TOPIC', undef, undef, [$src, $chan, $setter, $time, $topic]);
+       $src = $main_conf{numeric} unless initial_synced();
+       #>> 38 :583AAAAAF TOPIC #erry :Welcome to erry(world|net). Have a cookie.
+       my $srcId = ($src->{ID}?$src->{ID}:$src->{NICK});
+       ircsend(":$srcId ".$tkn{TOPIC}[$tkn]." $chan :$topic");
+       callfuncs('TOPIC', undef, undef, [$srcId, $chan, $setter, $time, $topic]);
 }
 
 sub wallops ($$) {
@@ -434,7 +448,8 @@ sub wallops ($$) {
 
 sub globops ($$) {
        my ($src, $message) = @_;
-       ircsend(":$src $tkn{GLOBOPS}[$tkn] :$message");
+       my $srcId = ($src->{ID}?$src->{ID}:$src->{NICK});
+       ircsend(":$srcId $tkn{GLOBOPS}[$tkn] :$message");
 }
 
 sub kline ($$$$$) {
@@ -444,9 +459,12 @@ sub kline ($$$$$) {
        # you need to use ADDLINE for this. GLINE is a user command
     # format is
     #>> 47 :583AAAAAA ADDLINE G test@testie inspircd.erry.omg 1308118489 0 :hi
+    #NOTE FOR ALL ADDLINES:
+    #note that you need to provide expiry alone, not expiry +time
+    #otherwise you will end up with insanely long bans
     my $setId = getUuid($setter);
     if ($setId) { $setter = $setId; }
-    my $line = ":$setter ADDLINE G $ident\@$host " . $main_conf{local} . " ". time() . " " . ($expiry + time())." :$reason";
+    my $line = ":$setter ADDLINE G $ident\@$host " . $main_conf{local} . " ". time() . " " . ($expiry)." :$reason";
        ircsend($line);
        #return ($type, +1, $ident, $host, $setter, $expire, $time, $reason);
        callfuncs('TKL', undef, undef, [parse_addline($line)]);
@@ -454,33 +472,33 @@ sub kline ($$$$$) {
 
 sub unkline ($$$) {
        my ($setter, $ident, $host) = @_;
-       # TKL - G ident host setter
-# TKL - G ident *.test.dom tabris!northman@netadmin.SCnet.ops
        my $line = "TKL - G $ident $host $setter";
+       my $setId = getUuid($setter);
+    if ($setId) { $setter = $setId; }
+       #:583AAAAAE DELLINE G test@test.com
+       my $line = ":$setter DELLINE G $ident\@$host";
        ircsend($line);
-       callfuncs('TKL', undef, undef, [parse_tkl($line)]);
+       callfuncs('TKL', undef, undef, [parse_delline($line)]);
 }
 
 sub zline ($$$$) {
-        my ($setter, $host, $expiry, $reason) = @_;
+       my ($setter, $host, $expiry, $reason) = @_;
        $setter=$main_conf{local} unless defined($setter);
-
-       #foreach my $ex (@except) { return 1 if $mask =~ /\Q$ex\E/i; }
-       
-        # format is
-        # TKL +/- type ident host setter expiretime settime :reason
-        my $line = "TKL + Z * $host $setter ".($expiry + time).' '.time." :$reason";
+       my $setId = getUuid($setter);
+    if ($setId) { $setter = $setId; }
+    #:583AAAAAE ADDLINE Z test.com inspircd.erry.omg 1308216407 0 :go away
+       my $line = ":$setter ADDLINE Z $host " . $main_conf{local} . " ". time() . " " . ($expiry)." :$reason";
        ircsend($line);
-       callfuncs('TKL', undef, undef, [parse_tkl($line)]);
+       callfuncs('TKL', undef, undef, [parse_addline($line)]);
 }
 
 sub unzline ($$) {
        my ($setter, $host) = @_;
-       # TKL - G ident host setter
-# TKL - G ident *.test.dom tabris!northman@netadmin.SCnet.ops
-       my $line = "TKL - Z * $host $setter";
+       my $setId = getUuid($setter);
+    if ($setId) { $setter = $setId; }
+       my $line = ":$setter DELLINE Z $host";
        ircsend($line);
-       callfuncs('TKL', undef, undef, [parse_tkl($line)]);
+       callfuncs('TKL', undef, undef, [parse_delline($line)]);
 }
 
 sub spamfilter($$$$$$$) {
@@ -506,16 +524,14 @@ sub update_userkill($) {
 }
 
 sub irckill($$$) {
-       my ($src, $targetlist, $reason) = @_;
+       my ($src, $target, $reason) = @_;
        $src = $main_conf{local} unless initial_synced();
-       
-       foreach my $target (split(',', $targetlist)) {
-               next unless update_userkill($target);
-       
-               ircsendimm(":$src ".$tkn{KILL}[$tkn]." $target :$src ($reason)");
-       
-               callfuncs('KILL', 0, 1, [$src, $target, $src, $reason]);
-       }
+       my $srcId = ($src->{ID}?$src->{ID}:$src->{NICK});
+       my $targetId = ($target->{ID}?encodeUUID($target->{ID}):$target->{NICK});
+       my $srcNick = $target->{NICK};
+       return 0 unless update_userkill($targetId);
+       ircsendimm(":$srcId ".$tkn{KILL}[$tkn]." $targetId :$srcNick ($reason)");
+       callfuncs('KILL', 0, 1, [$srcId, $targetId, $srcNick, $reason]);
 }
 
 sub svssno($$$) {
@@ -529,21 +545,15 @@ sub svssno($$$) {
 }
 
 sub svsnick($$$) {
-    my ($src, $oldnick, $newnick) = @_;
+    my ($src, $target, $newnick) = @_;
     $src=$main_conf{local} unless defined($src);
     # note: we will get a NICK cmd back after a 
     # successful nick change.
     # warning, if misused, this can KILL the user
     # with a collision
-    my $properSrc = getUuid ($src);
-    if ($properSrc) {
-       $src = $properSrc;
-    }
-    my $uid = getUuid ($oldnick);
-    if ($uid) {
-       $oldnick = $uid;
-    }
-    ircsend(":$src ".$tkn{SVSNICK}[$tkn]." $oldnick $newnick ".time);
+    my $srcId = ($src->{ID}?$src->{ID}:$src->{NICK});
+       my $targetId = ($target->{ID}?encodeUUID($target->{ID}):$target->{NICK});
+    ircsend(":$srcId ".$tkn{SVSNICK}[$tkn]." $targetId $newnick ".time);
 }
 
 sub svsnoop($$$) {
@@ -554,7 +564,9 @@ sub svsnoop($$$) {
     ircsend(":$main_conf{local} $tkn{SVSNOOP}[$tkn] $targetserver $bool");
 }
 
-sub svswatch ($$@) {
+#START TODO - erry
+
+sub svswatch ($$@) { 
 # Changes the WATCH list of a user.
 # Syntax: SVSWATCH <nick> :<watch parameters>
 # Example: SVSWATCH Blah :+Blih!*@* -Bluh!*@* +Bleh!*@*.com
@@ -613,6 +625,7 @@ sub swhois($$$) {
     $src = $main_conf{local} unless defined($src);
     ircsend(":$src $tkn{SWHOIS}[$tkn] $target :$swhois");
 }
+#END TODO - erry
 
 sub svsjoin($$@) {
        my ($src, $target, @chans) = @_;
@@ -627,12 +640,16 @@ sub __svsjoin($$@) {
     # a note. a JOIN is returned back to us on success
     # so no need to process this command.
     # similar for svspart.
-    ircsend(($src?":$src":'')." $tkn{SVSJOIN}[$tkn] $target ".join(',', @chans));
+    my $srcId = ($src->{ID}?$src->{ID}:$src->{NICK});
+       my $targetId = ($target->{ID}?encodeUUID($target->{ID}):$target->{NICK});
+    ircsend(($srcId?":$srcId":'')." $tkn{SVSJOIN}[$tkn] $targetId ".join(',', @chans));
 }
 
 sub svspart($$$@) {
     my ($src, $target, $reason, @chans) = @_;
-    ircsend(($src ? ":$src" : '')." $tkn{SVSPART}[$tkn] $target ".join(',', @chans).
+    my $srcId = ($src->{ID}?$src->{ID}:$src->{NICK});
+       my $targetId = ($target->{ID}?encodeUUID($target->{ID}):$target->{NICK});
+    ircsend(($srcId ? ":$srcId" : '')." $tkn{SVSPART}[$tkn] $targetId ".join(',', @chans).
        ($reason ? " :$reason" : ''));
 }
 
@@ -647,8 +664,8 @@ sub sqline ($;$) {
 
 sub svshold($$$) {
        my ($nickmask, $expiry, $reason) = @_;
-       #>> 32 :583AAAAAA ADDLINE Q errietta3 inspircd.erry.omg 1308120417 0 :bai
-       my $line = ':' . $main_conf{numeric} . ' ADDLINE Q '.$nickmask.' '.$main_conf{local}.' '.($expiry ? $expiry+time() : 0).' '.time().' :'.$reason;
+       #:583AAAAAA ADDLINE Q hell3o inspircd.erry.omg 1308295479 600 :Bye Bye
+       my $line = ':' . $main_conf{numeric} . ' ADDLINE Q '.$nickmask.' '.$main_conf{local}.' '. time() . ' ' . ($expiry ? $expiry : 0 ) . ' :'.$reason;
        ircsend($line);
        callfuncs('TKL', undef, undef, [parse_addline($line)]);
 }
@@ -663,8 +680,9 @@ sub svsunhold($) {
 
 sub qline($$$) {
        my ($nickmask, $expiry, $reason) = @_;
-       #<< :123 ADDLINE Q NickServ <Whatever>  1308120026 0 1308120026 :Reserved for Services
-       my $line = ':' . $main_conf{numeric} . ' ADDLINE Q '.$nickmask . ' ' . $main_conf{local} . ' '. time() . ' ' . ($expiry ? $expiry+time() : 0).' '.time().' :'.$reason;
+       #:583AAAAAA ADDLINE Q hell3o inspircd.erry.omg 1308295479 600 :Bye Bye
+
+       my $line = ':' . $main_conf{numeric} . ' ADDLINE Q '.$nickmask . ' ' . $main_conf{local} . ' '. time() . ' ' . ($expiry ? $expiry : 0).' :'.$reason;
        ircsend($line);
 
        # at startup we send these too early,
@@ -719,14 +737,18 @@ sub userip($) {
 
 sub chghost($$$) {
        my ($src, $target, $vhost) = @_;
-       ircsend(($src?":$src ":'').$tkn{CHGHOST}[$tkn]." $target $vhost");
-        callfuncs('CHGHOST', 0, 1, [$src, $target, $vhost]);
+    my $srcId = ($src->{ID}?$src->{ID}:$src->{NICK});
+       my $targetId = ($target->{ID}?encodeUUID($target->{ID}):$target->{NICK});
+       ircsend(($srcId?":$srcId ":'').$tkn{CHGHOST}[$tkn]." $targetId $vhost");
+        callfuncs('CHGHOST', 0, 1, [$srcId, $targetId, $vhost]);
 }
 
 sub chgident($$$) {
        my ($src, $target, $ident) = @_;
-       ircsend(($src?":$src ":'').$tkn{CHGIDENT}[$tkn]." $target $ident");
-        callfuncs('CHGIDENT', 0, 1, [$src, $target, $ident]);
+    my $srcId = ($src->{ID}?$src->{ID}:$src->{NICK});
+       my $targetId = ($target->{ID}?encodeUUID($target->{ID}):$target->{NICK});
+       ircsend(($src?":$srcId ":'').$tkn{CHGIDENT}[$tkn]." $targetId $ident");
+        callfuncs('CHGIDENT', 0, 1, [$srcId, $targetId, $ident]);
 }
 
 sub jupe_server($$) {
@@ -742,16 +764,36 @@ sub jupe_server($$) {
 }
 sub agent_dojoin($$) {
        my ($agent, $chan) = @_;
-       my $uuid = getUuid($agent);
-       if ($uuid) { $agent = $uuid; }
-       ircsend(":" . $agent .  " JOIN " . $chan);
+       print "DOJOIN " . Dumper ($agent);
+       my $srcId;
+       if (ref($agent) ne "HASH") {
+               $srcId = getUuid($agent);
+               if (!$srcId) {
+                       $srcId = $agent;
+               }
+               print "SRCID " . Dumper($srcId);
+       }
+       else {
+               my $src = $agent;
+               $srcId = ($src->{ID}?$src->{ID}:($src->{UUID}?$src->{UUID}:$src->{NICK}));
+       }
+       ircsend(":" . $srcId .  " JOIN " . $chan);
 }
 
 sub agent_dopart ($$$) {
        my ($agent, $chan, $reason) = @_;
-       my $uuid = getUuid($agent);
-       if ($uuid) { $agent = $uuid; }
-       ircsend(":$agent $tkn{PART}[$tkn] $chan :$reason");
+       my $srcId;
+       if (ref($agent) ne "HASH") {
+               $srcId = getUuid($agent);
+               if (!$srcId) {
+                       $srcId = $agent;
+               }
+       }
+       else {
+               my $src = $agent;
+               $srcId = ($src->{ID}?$src->{ID}:($src->{UUID}?$src->{UUID}:$src->{NICK}));
+       }
+       ircsend(":$srcId $tkn{PART}[$tkn] $chan :$reason");
 }
 sub rehash_all_servers(;$) {
        my ($type) = @_;
@@ -770,7 +812,7 @@ sub unban_nick($$@) {
 # It is not expected to be portable to other ircds.
 # Similar concepts may exist in other ircd implementations
        my ($src, $cn, @nicks) = @_;
-       
+       my $srcId = ($src->{ID}?$src->{ID}:$src->{NICK});
        my $i = 0; my @nicklist = ();
        while(my $nick = shift @nicks) {
                push @nicklist, $nick;
@@ -780,7 +822,7 @@ sub unban_nick($$@) {
                }
        }
        
-       ircsend(($src ? ":$src " : '' ).$tkn{SVSMODE}[$tkn]." $cn -".'b'x($i).' '.join(' ', @nicklist));
+       ircsend(($srcId ? ":$srcId " : '' ).$tkn{SVSMODE}[$tkn]." $cn -".'b'x($i).' '.join(' ', @nicklist));
        # We don't loopback this, as we'll receive back the list
        # of removed bans.
 }
index 0d1c38f2428229d814cbb01a230674fd38e7e7be..f43585725cc90fe78c32e7be277cf2e9d4328dd9 100644 (file)
@@ -105,16 +105,16 @@ sub encodeUUID($) {
        int2chars($SID_int, \@SID);
        my @UID = (0,0,0,0,0,0);
        int2chars($UID_int, \@UID);
-       print join('', @SID,@UID),"\n";
+       return join('', @SID,@UID);
 }
 
 1;
 
-#=cut
-#my $int = decodeUUID('751AAAAAA');
+##=cut
+#my $int = decodeUUID('583AAAAAE');
 #print "$int\n";
 #print log($int)/log(2), "\n";
-#encodeUUID($int);
-print decodeUUID('583AAAAAK');
+print encodeUUID(142036011587731460);
+#print decodeUUID('583AAAAAK');
 #print encodeUUID (1);
 #=cut
index e22561d89946699526c1f06e5a374584ae400746..33b022b13d660d650075b4d0b5354622a9b44145 100644 (file)
@@ -26,7 +26,7 @@ use SrSv::Process::InParent qw(write_log open_log close_log rotate_logs close_al
 use SrSv::Text::Codes qw( strip_codes );
 
 use SrSv::Conf2Consts qw(main);
-
+use SrSv::IRCd::Send;
 use Exporter 'import';
 BEGIN {
        my %constants = (
@@ -61,11 +61,11 @@ open_log('netdump', 'netdump.log') if main::NETDUMP();
 
 sub wlog($$$) {
        my ($service, $level, $text) = @_;
-
        my $prefix;
        $prefix = "\002\00304" if($level > LOG_INFO);
        $prefix .= $levels[$level];
-       ircd::privmsg($main::rsnick, main_conf_diag, "$prefix\: ($service) $text");
+       my $rsuser = { NICK => $main::rsnick, ID => ircd::getUuid($main::rsnick) };
+       ircd::privmsg($rsuser, main_conf_diag, "$prefix\: ($service) $text");
        write_log('diag', '<'.$main::rsnick.'>', "$prefix\: ($service) $text");
 }
 
index 5b0883c7e7f70c0d42b8d9b010020baba0c5a875..22cd87fe5aad127abaa1a39500873633401b392e 100644 (file)
@@ -27,7 +27,9 @@ SrSv::User - Track users
 =cut
 
 use strict;
-use SrSv::IRCd::UUID;
+use SrSv::Insp::UUID;
+use SrSv::Conf qw(main services sql);
+use SrSv::Conf2Consts qw(main services sql);
 use Exporter 'import';
 BEGIN {
        my %constants = (
@@ -100,7 +102,11 @@ import SrSv::MySQL::Stub {
        __flood_inc => ['NULL', "UPDATE user SET flood = flood + ? WHERE id=?"],
        __flood_expire => ['NULL', "UPDATE user SET flood = flood >> 1"], # shift is faster than mul
 };
+sub kill_user($$) {
+       my ($user, $reason) = @_;
 
+       ircd::irckill(get_user_agent($user) || main_conf_local, $user, $reason);
+}
 sub get_flood_level($) {
        my ($user) = @_;
 
@@ -146,7 +152,6 @@ sub flood_check($;$) {
 sub get_user_id($) {
        my ($user) = @_;
        my ($id, $n);
-       return undef if(is_agent($user->{NICK}) and not $enforcers{lc $user->{NICK}});
 
        unless(ref($user) eq 'HASH') {
                die("invalid get_user_nick call");
@@ -156,27 +161,22 @@ sub get_user_id($) {
                die("get_user_id called on empty string");
        }
        my $properId = ircd::getUuid ($user->{NICK});
+       print "!!!!!!!!!" . ($nick . " " . $properId) . "\n";
        if ($properId != "") {
-               print "Decoding $properId\n";
                $properId = decodeUUID($properId);
                return $user->{ID} = $properId;
        }
-       else { print "Null properId. User->id" . $user->{ID} . "\n"; }
-       if(exists($user->{ID})) { print "Returning user_>id " . $user->{ID} . "\n"; return $user->{ID}; }
-
-
-
+       return undef if(is_agent($user->{NICK}) and not $enforcers{lc $user->{NICK}});
+       if(exists($user->{ID})) {  return $user->{ID}; }
        # a cheat for isServer()
        if($user->{NICK} =~ /\./) {
                return $user->{ID} = undef;
        }
-
        my $nick2;
        while($n < 10 and !defined($id)) {
                $n++;
                $get_user_id->execute($nick);
                ($id) = $get_user_id->fetchrow_array;
-               print "Finally got id from query: $id\n";
                unless($id) {
                        $get_nickchg->execute($nick);
                        ($id, $nick2) = $get_nickchg->fetchrow_array;
@@ -189,7 +189,6 @@ sub get_user_id($) {
                $user->{OLDNICK} = $user->{NICK};
                $user->{NICK} = $nick2;
        }
-
        return $user->{ID} = $id;
 }
 
@@ -199,6 +198,11 @@ sub get_user_nick($) {
        unless(ref($user) eq 'HASH') {
                die("invalid get_user_nick call");
        }
+       if (exists($user->{ID})) {
+               if (my $nick = ircd::getRevUuid ($user->{ID})) {
+                       return $user->{NICK} = $nick;
+               }
+       }
        if(exists($user->{NICK}) and is_online($user->{NICK})) { 
                my $realnick = ircd::getRevUuid($user->{NICK});
                if ($realnick) {
index 5321f92f9dee2bb58df36f48e24cb885628242e3..786e8d30b97fcc57a8448e2ef229452a9cdf227a 100644 (file)
@@ -22,14 +22,16 @@ use Exporter 'import';
 BEGIN { our @EXPORT = qw(notice user_die) }
 
 use SrSv::User qw(get_user_nick);
-
+use SrSv::IRCd::Send qw (getRevUuid    getUuid setRevUuid setUuid);
+use Data::Dumper;
 sub notice($@) {
+       print "FFFFFFFFFFFF\n";
        my $user = shift;
-       
        # FIXME: ref to 'NickServ' should call for the agent-nick in nickserv.pm,
        # but that's not available at this layer, so we'd be making
        # a blind reference to something that _might_ be undef
-       ircd::notice($user->{AGENT} || 'NickServ', get_user_nick($user), @_);
+       my $nsuser = { NICK => 'NickServ', ID => ircd::getUuid('NickServ') };
+       ircd::notice($user->{AGENT} || $nsuser, $user, @_);
 }
 
 sub user_die($@) {
index e215c0e8ea02982f821a281c39ed2b7cd3f7c70d..329423a96a4a29dc02f0b709b3b4c37b59be373e 100644 (file)
@@ -1,5 +1,5 @@
-Syntax: %BREAD {%Bnum%B|%BLAST%B}%B
+Syntax: %BREAD {%Bnum%B|%BLAST%B|%BUNREAD%B}%B
 
-Sends you the text of memo number %Bnum%B, or of the last
+Sends you the text of memo number %Bnum%B, of the last
 (i.e. most recently received) memo if LAST is given
-instead of a number.
+instead of a number, or of the first unread memo if UNREAD is given.
index 0d558a18c25a565bdc3885ca59511fbb05e77be3..4a80f92390a605d3b2a9e2b1750f8fd6c4ec0195 100644 (file)
@@ -34,10 +34,10 @@ my %userlist;
 use SrSv::Agent;
 
 my $csnick = 'ConnectServ';
-
 agent_connect($csnick, 'services', undef, '+pqzBHS', 'Connection Monitor');
+my $csUser = { NICK => $csnick, ID => ircd::getUuid($csnick); }
 agent_join($csnick, main_conf_diag);
-ircd::setmode($csnick, main_conf_diag, '+o', $csnick);
+ircd::setmode($csUser, main_conf_diag, '+o', $csUser);
 
 addhandler('NICKCONN', undef, undef, 'connectserv::ev_nickconn', 1);
 sub ev_nickconn {
index b48a408b5a8528970c7465ecab1a518659c42abb..52049abe73591188184142320d5e119827aa680f 100644 (file)
@@ -42,7 +42,7 @@ proc_init {
 };
 
 our $rsnick = 'ServServ';
-
+our $rsUser = { NICK => $rsnick, ID => ircd::getUuid($rsnick) };
 addhandler('STATS', undef, undef, 'core::stats');
 sub stats($$) {
        my ($src, $token) = @_;
@@ -62,7 +62,7 @@ sub pingtimer($) {
 
 agent_connect($rsnick, 'service', undef, '+ABHSNaopqz', 'Services Control Agent');
 agent_join($rsnick, main_conf_diag);
-ircd::setmode($rsnick, main_conf_diag, '+o', $rsnick);
+ircd::setmode($rsUser, main_conf_diag, '+o', $rsUser );
 
 addhandler('SEOS', undef, undef, 'core::ev_connect', 1);
 addhandler('ENDBURST', undef, undef, 'core::ev_connect', 1);
@@ -76,7 +76,7 @@ addhandler('PRIVMSG', undef, 'servserv', 'core::dispatch', 1);
 sub dispatch {
        print "DISPATCH CALLED\n";
        my ($src, $dst, $msg) = @_;
-       my $user = { NICK => $src, AGENT => $rsnick };
+       my $user = { NICK => $src, AGENT => $rsnick, ID => getUuid($src) };
        if(!adminserv::is_ircop($user)) {
                notice($user, 'Access Denied');
                ircd::globops($rsnick, "\002$src\002 failed access to $rsnick $msg");
index 5c2449a1b79f7aea51692988026588ed20bb8c03..377862ed8e9435ee81da5fc07094f10d0d0a717b 100644 (file)
@@ -15,7 +15,7 @@
 #      Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 package services;
 use strict;
-
+use Data::Dumper;
 use SrSv::Conf::Parameters services => [
        [noexpire => undef],
        [nickexpire => 21],
@@ -103,10 +103,13 @@ if(services_conf_hostserv) {
 our $qlreason = 'Reserved for Services';
 
 foreach my $a (@agents) {
+       print "AGENT " . Dumper($a);
        agent_connect($a->[0], 'services', undef, $a->[1], $a->[2]);
        ircd::sqline($a->[0], $qlreason);
        agent_join($a->[0], main_conf_diag);
-       ircd::setmode($main::rsnick, main_conf_diag, '+o', $a->[0]);
+       my $rsUser = { NICK => $main::rsnick, ID => ircd::getUuid($main::rsnick) };
+       my $agent = { NICK => $a->[0], ID => ircd::getUuid ($a->[0]) };
+       ircd::setmode($agent, main_conf_diag, '+o', $agent);
 }
 
 addhandler('ENDBURST', undef, undef, 'services::ev_connect');
@@ -138,8 +141,8 @@ addhandler('CHGHOST', undef, undef, 'nickserv::chghost');
 addhandler('CHGIDENT', undef, undef, 'nickserv::chgident');
 addhandler('USERIP', undef, undef, 'nickserv::userip');
 addhandler('SQUIT', undef, undef, 'nickserv::squit') if ircd::NOQUIT();
-
-addhandler('PRIVMSG', undef, 'nickserv', 'nickserv::dispatch');
+addhandler("OPERUP", undef, undef, 'nickserv::handle_oper');
+addhandler('PRIVMSG', undef, undef, 'nickserv::dispatch');
 addhandler('PRIVMSG', undef, lc services_conf_nickserv, 'nickserv::dispatch') if services_conf_nickserv;
 
 addhandler('BACK', undef, undef, 'nickserv::notify_auths');
@@ -152,11 +155,11 @@ addhandler('KICK', undef, undef, 'chanserv::process_kick');
 addhandler('MODE', undef, qr/^#/, 'chanserv::chan_mode');
 addhandler('TOPIC', undef, undef, 'chanserv::chan_topic');
 
-addhandler('PRIVMSG', undef, 'chanserv', 'chanserv::dispatch');
+addhandler('PRIVMSG', undef, undef, 'chanserv::dispatch');
 addhandler('PRIVMSG', undef, lc services_conf_chanserv, 'chanserv::dispatch') if services_conf_chanserv;
 
 # OperServ
-addhandler('PRIVMSG', undef, 'operserv', 'operserv::dispatch');
+addhandler('PRIVMSG', undef, undef, 'operserv::dispatch');
 addhandler('PRIVMSG', undef, lc services_conf_operserv, 'operserv::dispatch') if services_conf_operserv;
 
 add_timer('flood_expire', 10, __PACKAGE__, 'services::flood_expire');
@@ -167,7 +170,7 @@ sub flood_expire(;$) {
 }
 
 # MemoServ
-addhandler('PRIVMSG', undef, 'memoserv', 'memoserv::dispatch');
+addhandler('PRIVMSG', undef, undef, 'memoserv::dispatch');
 addhandler('PRIVMSG', undef, lc services_conf_memoserv, 'memoserv::dispatch') if services_conf_memoserv;
 addhandler('BACK', undef, undef, 'memoserv::notify');
 
@@ -177,7 +180,7 @@ addhandler('PRIVMSG', undef, undef, 'botserv::dispatch');
 addhandler('NOTICE', undef, qr/^#/, 'botserv::chan_msg');
 
 # AdminServ
-addhandler('PRIVMSG', undef, 'adminserv', 'adminserv::dispatch');
+addhandler('PRIVMSG', undef, undef, 'adminserv::dispatch');
 addhandler('PRIVMSG', undef, lc services_conf_adminserv, 'adminserv::dispatch') if services_conf_adminserv;
 
 add_timer('', 30, __PACKAGE__, 'services::maint');
@@ -185,7 +188,7 @@ add_timer('', 30, __PACKAGE__, 'services::maint');
 add_timer('', 60, __PACKAGE__, 'nickserv::expire_silence_timed');
 
 # HostServ
-addhandler('PRIVMSG', undef, 'hostserv', 'hostserv::dispatch');
+addhandler('PRIVMSG', undef, undef, 'hostserv::dispatch');
 addhandler('PRIVMSG', undef, lc services_conf_hostserv, 'hostserv::dispatch') if services_conf_hostserv;
 
 # $nick should be a registered root nick, if applicable
index d8ff7cfd7eec6c97926af59bf2a0f52bb96963cd..6b9bc529d8dbeca5d7636173f686b78f5cc564f3 100644 (file)
@@ -59,7 +59,7 @@ for(my $i=0; $i<@flags; $i++) {
 
 our $asnick_default = 'AdminServ';
 our $asnick = $asnick_default;
-
+our $asuser = { NICK => $asnick, ID => "123AAAAAG" };
 our @levels = ('Normal User', 'HelpOp', 'Operator', 'Administrator', 'Root');
 my @defflags = (
        0, # Unused
@@ -98,18 +98,18 @@ sub init() {
 ### ADMINSERV COMMANDS ###
 
 sub dispatch($$$) {
-       my ($src, $dst, $msg) = @_;
+       my ($user, $dstUser, $msg) = @_;
        $msg =~ s/^\s+//;
        my @args = split(/\s+/, $msg);
        my $cmd = shift @args;
-
-       my $user = { NICK => $src, AGENT => $dst };
-
-       services::ulog($asnick, LOG_INFO(), "cmd: [$msg]", $user);
+       $user -> {AGENT} = $dstUser;
+       my $src = $user->{NICK};
+       return unless (lc $dstUser->{NICK} eq lc $asnick);
+       services::ulog($asuser, LOG_INFO(), "cmd: [$msg]", $user);
 
        unless(is_svsop($user) or is_ircop($user)) {
                notice($user, $err_deny);
-               ircd::globops($asnick, "\002$src\002 failed access to $asnick $msg");
+               ircd::globops($asuser, "\002$src\002 failed access to $asnick $msg");
                return;
        }
 
@@ -180,7 +180,7 @@ sub as_svs_add($$$) {
        $set_svs_level->execute($level, $oper, $root);
        
        notice($user, "\002$nick\002 is now a \002Services $levels[$level]\002.");
-       wlog($asnick, LOG_INFO(), "$src added $root as a Services $levels[$level].");
+       wlog($asuser, LOG_INFO(), "$src added $root as a Services $levels[$level].");
 }
 
 sub as_svs_del($$) {
@@ -197,7 +197,7 @@ sub as_svs_del($$) {
        
        $delete_svsop->execute($root);
        notice($user, "\002$nick\002 has been stripped of services rank.");
-       wlog($asnick, LOG_INFO(), "$src stripped $root of services rank.")
+       wlog($asuser, LOG_INFO(), "$src stripped $root of services rank.")
 }
 
 sub as_svs_list($$) {
@@ -261,9 +261,9 @@ sub can_do($$) {
        my $nflag = $flags{$flag};
        
        my ($level, $nick) = get_best_svs_level($user);
-       
+       print ("LEVELS $defflags[$level] $nflag" . "\n");
        if($defflags[$level] & $nflag) {
-               return $nick if (($nflag == $flags{'HELP'}) or is_ircop($user));
+               return $nick if (($nflag == $flags{'HELP'}) or is_ircop($user)); 
        }
        
        return undef;
@@ -276,7 +276,8 @@ sub is_svsop($;$) {
        return $nick if(defined($level) and !defined($rlev));
 
        if($level >= $rlev) {
-               return $nick if (($rlev == S_HELP) or is_ircop($user));
+               return $nick ; #if (($rlev == S_HELP) or is_ircop($user)) FIXME - erry
+               #Problem is inspircd has a gay way of identifying opers, instead of umode +o it sends OPERTYPE crap.
        }
        
        return undef;
@@ -355,6 +356,7 @@ sub get_best_svs_level($) {
        $user->{SVSOP_LEVEL} = $level; $user->{SVSOP_NICK} = $nick;
        
        if(wantarray) {
+               print "LEVEL $level\n";
                return ($level, $nick);
        } else {
                return $level;
index faaf54c3032fa9987d4b965d0d59355998710d72..5a3555adcdf158136286e8fa676e790211aeb4b7 100644 (file)
@@ -22,9 +22,10 @@ use Safe;
 
 use SrSv::Agent;
 use SrSv::Process::Worker 'ima_worker'; #FIXME
-
+use SrSv::Insp::UUID;
 use SrSv::Text::Format qw(columnar);
 use SrSv::Errors;
+use Data::Dumper;
 
 use SrSv::Conf2Consts qw( main services );
 
@@ -45,6 +46,7 @@ use constant {
 our $bsnick_default = 'BotServ';
 our $bsnick = $bsnick_default;
 our $botchmode;
+our $bsuser = { NICK => $bsnick, ID => "123AAAAAF" };
 if(!ircd::PREFIXAQ_DISABLE()) {
        $botchmode = '+q';
 } else {
@@ -95,10 +97,12 @@ sub init() {
 };
 
 sub dispatch($$$) {
-        my ($src, $dst, $msg) = @_;
-       
-       if(lc $dst eq lc $bsnick or lc $dst eq lc $bsnick_default ) {
-               bs_dispatch($src, $dst, $msg);
+    my ($user, $dstUser, $msg) = @_;
+       $user -> {AGENT} = $dstUser;
+       my $src = $user->{NICK};
+       my $dst = $dstUser->{NICK};
+       if(lc $dstUser->{NICK} eq lc $bsnick or lc $dstUser->{NICK} eq lc $bsnick_default ) {
+               bs_dispatch($user, $dstUser, $msg);
        }
        elsif($dst =~ /^#/) {
                if($msg =~ /^\!/) {
@@ -120,13 +124,12 @@ sub dispatch($$$) {
 ### BOTSERV COMMANDS ###
 
 sub bs_dispatch($$$) {
-       my ($src, $dst, $msg) = @_;
+       my ($user, $dst, $msg) = @_;
        $msg =~ s/^\s+//;
        my @args = split(/\s+/, $msg);
        my $cmd = shift @args;
-
-       my $user = { NICK => $src, AGENT => $bsnick };
-
+       $user -> {AGENT} = $dst;
+       my $src = $user->{NICK};
        return if flood_check($user);
 
        if($cmd =~ /^assign$/i) {
@@ -251,11 +254,10 @@ sub bs_assign($$$) {
                agent_part($oldbot, $cn, "Unassigned by \002$src\002.");
        }
 
-       
-       
        if($bot) {
                $assign_bot->execute($bot, $cn);
-               bot_join($chan, $bot);
+               my $botUser = { NICK=>$bot, ID=>ircd::getUuid($bot) };
+               bot_join($chan, $botUser);
                notice($user, "\002$bot\002 now assigned to \002$cn\002.");
        } else {
                $unassign_bot->execute($cn);
@@ -316,8 +318,12 @@ sub bs_add($$$$$) {
        ircd::sqline($botnick, $services::qlreason);
        agent_connect($botnick, $botident, $bothost, '+pqBSrz', $botgecos);
        agent_join($botnick, main_conf_diag);
-       ircd::setmode($main::rsnick, main_conf_diag, '+h', $botnick);
-
+       my $bot = { NICK => $botnick};
+       get_user_id ($bot);
+       my $rsuser = { NICK => $main::rsnick };
+       get_user_id ($rsuser);
+       $rsuser->{ID} = encodeUUID($rsuser->{ID});
+       ircd::setmode($rsuser, main_conf_diag, '+h', $bot);
        notice($user, "Bot $botnick connected.");
 }
 
@@ -456,14 +462,21 @@ sub bs_change($$$$$$) {
        ircd::sqline($botnick, $services::qlreason);
        agent_connect($botnick, $botident, $bothost, '+pqBSrz', $botgecos);
        agent_join($botnick, main_conf_diag);
-       ircd::setmode($main::rsnick, main_conf_diag, '+h', $botnick);
+       my $rsnick = $main::rsnick;
+       my $rsuser = { NICK => $main::rsnick };
+       get_user_id ($rsuser);
+       $rsuser->{ID} = encodeUUID($rsuser->{ID});
+       my $bot = { NICK => $botnick };
+       get_user_id ($bot);
+       ircd::setmode($rsuser, main_conf_diag, '+h', $bot);
 
        notice($user, "Bot $botnick connected.");
 
        $get_bots_chans->execute($oldnick);
        while(my ($cn) = $get_bots_chans->fetchrow_array()) {
                my $chan = { CHAN => $cn };
-               bot_join($chan, $botnick)
+               my $botUser = { NICK=>$botnick, ID=>ircd::getUuid($botnick) };
+               bot_join($chan, $botUser)
                        if chanserv::get_user_count($chan) or cr_chk_flag($chan, CRF_BOTSTAY(), 1);
        }
        $get_bots_chans->finish();
@@ -480,14 +493,13 @@ sub bs_change($$$$$$) {
 ### CHANNEL COMMANDS ###
 
 sub chan_dispatch($$$) {
-       my ($src, $cn, $msg) = @_;
-
+       my ($user, $cn, $msg) = @_;
+       my $src = $user->{NICK};
        my @args = split(/\s+/, $msg);
        my $cmd = lc(shift @args);
        $cmd =~ s/^\!//;
 
        my $chan = { CHAN => $cn };
-       my $user = { NICK => $src, AGENT => agent($chan) };
 
        my %cmdhash = (
                'voice'         =>      \&give_ops,
@@ -570,6 +582,7 @@ sub chan_dispatch($$$) {
 
        sub give_ops {
                my ($user, $cmd, $chan, @args) = @_;
+               
                chanserv::cs_setmodes($user, $cmd, $chan, @args);
        }
        sub up {
@@ -717,28 +730,24 @@ sub bot_say($$$) {
 ### BOT COMMANDS ###
 
 sub bot_dispatch($$$) {
-    my ($src, $bot, $msg) = @_;
-    
+    my ($user, $bot, $msg) = @_;
     my ($cmd, $cn, $botmsg) = split(/ /, $msg, 3);
-
-    my $user = { NICK => $src, AGENT => $bot };
+       my $src = $user->{NICK};
     my $chan = { CHAN => $cn };
-
     return if flood_check($user);
-    
     if ($cmd =~ /^join$/i) {
-           if (adminserv::can_do($user, 'BOT')) {
-           agent_join($bot, $cn);
-       } else { 
-           notice($user, $err_deny);
-       }
+               if (adminserv::can_do($user, 'BOT')) {
+                       agent_join($bot, $cn);
+               } else { 
+                       notice($user, $err_deny);
+               }
     }
     elsif ($cmd =~ /^part$/i) {
-       if (adminserv::can_do($user, 'BOT')) {
-           agent_part($bot, $cn, "$src requested part");
-       } else { 
-           notice($user, $err_deny);
-       }
+               if (adminserv::can_do($user, 'BOT')) {
+                       agent_part($bot, $cn, "$src requested part");
+               } else { 
+                       notice($user, $err_deny);
+               }
     }
     elsif ($cmd =~ /^say$/i) {
        bot_say($user, $chan, $botmsg);
@@ -793,21 +802,26 @@ sub register() {
        while(my ($nick, $ident, $vhost, $gecos, $flags) = $get_all_bots->fetchrow_array) {
                agent_connect($nick, $ident, $vhost, '+pqBSrz'.(($flags & F_DEAF())?'d':''), $gecos);
                ircd::sqline($nick, $services::qlreason);
+               my $bot = { NICK => $nick };
+               get_user_id ($bot);
                agent_join($nick, main_conf_diag);
-               ircd::setmode($main::rsnick, main_conf_diag, '+h', $nick);
+               my $rsuser = { NICK => $main::rsnick };
+               get_user_id ($rsuser);
+               $rsuser->{ID} = encodeUUID($rsuser->{ID});
+               ircd::setmode($rsuser, main_conf_diag, '+h', $bot);
        }
 }
 
 sub eos() {
        $get_botchans->execute();
-       print "BS EOS???\n";
        while(my ($cn, $nick) = $get_botchans->fetchrow_array) {
                my $chan = { CHAN => $cn };
-               print "BS BOT $nick $cn\n";
                if(chanserv::get_user_count($chan)) {
-                       bot_join($chan, $nick);
+                       my $botUser = { NICK=>$nick, ID=>ircd::getUuid($nick) };
+                       bot_join($chan, $botUser);
                }
                elsif(cr_chk_flag($chan, CRF_BOTSTAY(), 1)) {
+                       my $botUser = { NICK=>$nick, ID=>ircd::getUuid($nick) };
                        bot_join($chan, $nick);
                        my $modelock = chanserv::get_modelock($chan);
                        ircd::setmode(main_conf_local, $cn, $modelock) if $modelock;
@@ -830,16 +844,16 @@ sub unset_flag($$) {
 }
 
 sub bot_join($;$) {
-       my ($chan, $nick) = @_;
-
+       my ($chan, $bot) = @_;
        my $cn = $chan->{CHAN};
-
-       $nick = agent($chan) unless $nick;
-       print "Huuuuuuuuuuuuuuuh\n";
+       $bot = agent($chan) unless $bot;
+       my $nick = $bot->{NICK};
        unless(is_agent_in_chan($nick, $cn)) {
-               print "Making $nick join $cn\n";
-               agent_join($nick, $cn);
-               ircd::setmode($nick, $cn, $botchmode, $nick.(ircd::PREFIXAQ_DISABLE() ? ' '.$nick : '') );
+               agent_join($bot, $cn);
+               get_user_id ($bot);
+               my $bot2 = { NICK => $nick, ID => encodeUUID($bot->{ID}) };
+               print "!!!!!!!! BOT $nick " . $bot->{ID} . "\n";
+               ircd::setmode($bot2, $cn, $botchmode, $bot );
        }
 }
 
index c5527bd2bb50758f52bf6a6579caeb43432daa41..c18a7c250d93971c89dbf766cb624a78073decea 100644 (file)
@@ -135,6 +135,7 @@ $chanuser_table = 0;
 
 our $csnick_default = 'ChanServ';
 our $csnick = $csnick_default;
+our $csUser = { NICK => $csnick, ID => "123AAAAAC" };
 
 our ($cur_lock, $cnt_lock);
 
@@ -520,16 +521,15 @@ use SrSv::MySQL::Stub {
 ### CHANSERV COMMANDS ###
 
 sub dispatch($$$) {
-       my ($src, $dst, $msg) = @_;
-       
+       my ($user, $dstUser, $msg) = @_;
+       my $src = $user->{NICK};
        $msg =~ s/^\s+//;
        my @args = split(/\s+/, $msg);
        my $cmd = shift @args;
-
-       my $user = { NICK => $src, AGENT => $dst };
-       print "SRC $src\n";
+       $user->{AGENT} = $dstUser;
+       get_user_id ($user);
        return if flood_check($user);
-
+       return unless (lc $dstUser->{NICK} eq lc $csnick);
        if($cmd =~ /^register$/i) {
                if(@args >= 1) {
                        my @args = split(/\s+/, $msg, 4);
@@ -2052,11 +2052,10 @@ sub cs_why($$@) {
                $get_all_acc->finish();
 
                unless($n) {
-                       #$check_auth_chan = $dbh->prepare("SELECT nickreg.nick, nicktext.data FROM nickreg, nicktext
-                       #WHERE nickreg.id=nicktext.nrid AND nicktext.type=(".nickserv::NTF_AUTH().") AND nicktext.chan=? AND nickreg.nick=?");
                        $check_auth_chan -> execute ($cn, $tnick);
-                       if ($check_auth_chan->fetchrow_array()) {
-                               push @reply, "\002$tnick\002 is awaiting authorization to be added to the $cn access list.\n";
+                       if (my ($nick, $data) = $check_auth_chan->fetchrow_array()) {
+                               my ($adder, $old, $level, $time) = split(/:/, $data);
+                               push @reply, "\002$tnick\002 is awaiting authorization to be added to the $cn \002$levels[$level]\002 list.\n";
                        }
                        else {
                                push @reply, "\002$tnick\002 has no access to \002$cn\002.";
@@ -2073,7 +2072,7 @@ sub cs_why($$@) {
 sub cs_setmodes($$$@) {
        my ($user, $cmd, $chan, @args) = @_;
        no warnings 'void';
-       my $agent = $user->{AGENT} or $csnick;
+       my $agent = $user->{AGENT} or $csUser;
        my $src = get_user_nick($user);
        my $cn = $chan->{CHAN};
        my $self;
@@ -2230,7 +2229,7 @@ sub cs_kick($$$;$$) {
        
        my @targets = split(/\,/, $target);
        foreach $target (@targets) {
-               my $tuser = { NICK => $target };
+               my $tuser = { NICK => $target, UID => ircd::getUuid ($target) };
                my $targetlevel = get_best_acc($tuser, $chan);
 
                if(lc $target eq lc agent($chan) or adminserv::is_service($tuser)) {
@@ -2262,7 +2261,7 @@ sub cs_kick($$$;$$) {
                if($ban) {
                        kickban($chan, $tuser, undef, $reason);
                } else {
-                       ircd::kick(agent($chan), $cn, $target, $reason) unless adminserv::is_service($user);
+                       ircd::kick(agent($chan), $cn, $tuser, $reason) unless adminserv::is_service($user);
                }
        }
        
@@ -2518,7 +2517,7 @@ sub cs_close($$$) {
        $set_close->execute($cn, $reason, $oper, $type);
        cr_set_flag($chan, (CRF_FREEZE | CRF_CLOSE | CRF_DRONE), 0); #unset flags
        cr_set_flag($chan, CRF_HOLD, 1); #set flags
-
+       cr_set_flag($chan, $type, 1); #set flags
        my $src = get_user_nick($user);
        my $time = gmtime2(time);
        my $cmsg = "is closed [$src $time]: $reason";
@@ -3326,7 +3325,7 @@ sub kickban($$$$) {
        enforcer_join($chan) if (get_user_count($chan) <= 1);
        ircd::setmode($agent, $cn, '+b', $mask);
        ircd::flushmodes();
-       ircd::kick($agent, $cn, $nick, $reason);
+       ircd::kick($agent, $cn, $user, $reason);
        return 1;
 }
 
@@ -3341,7 +3340,7 @@ sub kickban_multi($$$) {
 
        foreach my $user (@$users) {
                next if adminserv::is_ircop($user) or adminserv::is_svsop($user, adminserv::S_HELP());
-               ircd::kick($agent, $cn, get_user_nick($user), $reason);
+               ircd::kick($agent, $cn, $user, $reason);
        }
 }
 
@@ -3357,7 +3356,7 @@ sub clear_users($$)  {
        $get_chan_users->execute($cn);
        while(my ($nick, $uid) = $get_chan_users->fetchrow_array) {
                my $user = { NICK => $nick, ID => $uid };
-               ircd::kick($agent, $cn, $nick, $reason)
+               ircd::kick($agent, $cn, $user, $reason)
                        unless adminserv::is_ircop($user) or adminserv::is_svsop($user, adminserv::S_HELP());
                $i++;
        }
@@ -3386,7 +3385,7 @@ sub kickmask($$$$)  {
        $get_chan_users_mask->execute($cn, $nick, $ident, $host, $host, $host);
        while(my ($nick, $uid) = $get_chan_users_mask->fetchrow_array) {
                my $user = { NICK => $nick, ID => $uid };
-               ircd::kick($agent, $cn, $nick, $reason)
+               ircd::kick($agent, $cn, $user, $reason)
                        unless adminserv::is_service($user);
                $i++;
        }
@@ -3416,7 +3415,7 @@ sub kickmask_noacc($$$$)  {
        $get_chan_users_mask_noacc->execute($cn, $nick, $ident, $host, $host, $host);
        while(my ($nick, $uid) = $get_chan_users_mask_noacc->fetchrow_array) {
                my $user = { NICK => $nick, ID => $uid };
-               ircd::kick($agent, $cn, $nick, $reason)
+               ircd::kick($agent, $cn, $user, $reason)
                        unless adminserv::is_service($user);
                $i++;
        }
@@ -3433,11 +3432,12 @@ sub clear_ops($) {
 
        $get_chan_users->execute($cn);
        while(my ($nick, $uid) = $get_chan_users->fetchrow_array) {
-               my $user = { NICK => $nick, ID => $uid };
+               my $user = { NICK => $nick }; 
+               get_user_id ($user);
                my $opmodes = get_op($user, $chan);
                for(my $i; $i < 5; $i++) {
                        if($opmodes & 2**$i) {
-                               push @modelist, ['-'.$opmodes[$i], $nick];
+                               push @modelist, ['-'.$opmodes[$i], $user];
                        }
                }
        }
@@ -3468,25 +3468,17 @@ sub unban_user($@) {
        my ($chan, @userlist) = @_;
        my $cn = $chan->{CHAN};
        my $count;
-       if (defined(&ircd::unban_nick)) {
-               my @nicklist;
-               foreach my $tuser (@userlist) {
-                       push @nicklist, get_user_nick($tuser);
-               }
-               ircd::unban_nick(agent($chan), $cn, @nicklist);
-               #return scalar(@nicklist);
+       if (defined(&ircd::unban_users)) {
+               ircd::unban_users(@userlist);
        }
-       
        foreach my $tuser (@userlist) {
                my $tuid;
                unless($tuid = get_user_id($tuser)) {
                        next;
                }
-
                my (@bans);
                # We don't handle extended bans. Yet.
                $find_bans_chan_user->execute($cn, $tuid, 0);
-               print "tuid : $tuid\n";
                while (my ($mask) = $find_bans_chan_user->fetchrow_array) {
                        $mask =~ tr/\%\_/\*\?/;
                        push @bans, $mask;
@@ -3534,17 +3526,18 @@ sub do_nick_akick($$;$) {
        unless(defined($root)) {
                (undef, $root) = get_best_acc($tuser, $chan, 2);
        }
-
        $get_nick_akick->execute($cn, $root);
        my ($reason) = $get_nick_akick->fetchrow_array(); $get_nick_akick->finish();
-
        return 0 if adminserv::is_svsop($tuser, adminserv::S_HELP());
+       if(defined($reason) && $reason =~ /\|/) {
+               ($reason, undef) = split(/ ?\| ?/, $reason, 2);
+       }
        kickban($chan, $tuser, undef, "User has been banned from ".$cn.($reason?": $reason":''));
 }
 
 sub do_status($$) {
        my ($user, $chan) = @_;
-
+       print "Do status!\n";
        return 0 if cr_chk_flag($chan, (CRF_CLOSE | CRF_DRONE));
        
        my $uid = get_user_id($user);
@@ -3599,7 +3592,6 @@ sub akick_allchan($) {
 
 sub akickban(@) {
        my ($cn, $knick, $bnick, $ident, $host, $reason, $bident) = @_;
-       print "KNICK $knick\n";
        my $target = { NICK => $knick };
        my $chan = { CHAN => $cn };
        return 0 if adminserv::is_svsop($target, adminserv::S_HELP());
@@ -3613,6 +3605,9 @@ sub akickban(@) {
                $ident =~ tr/\%\_/\*\?/;
                $host =~ tr/\%\_/\*\?/;
        }
+       if(defined($reason) && $reason =~ /\|/) {
+               ($reason, undef) = split(/ ?\| ?/, $reason, 2);
+       }
 
        return kickban($chan, $target, "$bnick!$ident\@$host", "User has been banned from ".$cn.($reason?": $reason":''));
 }
@@ -3690,7 +3685,7 @@ sub fix_private_join_before_id($) {
                push @cns, $cn;
        }
 
-       ircd::svsjoin($csnick, get_user_nick($user), @cns) if @cns;
+       ircd::svsjoin($csUser, $user, @cns) if @cns;
 }
 
 ### DATABASE UTILITY FUNCTIONS ###
@@ -4036,6 +4031,7 @@ sub set_modes_allnick($$$) {
 
 # If channel has OPGUARD, $doneg is true.
 sub set_modes($$$;$) {
+       print "GI\n";
        my ($user, $chan, $acc, $doneg) = @_;
        my $cn = $chan->{CHAN};
 
@@ -4095,13 +4091,15 @@ sub set_mode_mask($$$$) {
 
                        if($masks[$sign] & 2**$i) {
                                $out .= $l[$i];
-                               push @args, $nick;
+                               my $user_ = { NICK => $nick, AGENT => $csnick};
+                               get_user_id ($user_);
+                               push @args, $user_;
                        }
                }
        }
 
        if(@args) {
-               ircd::setmode(agent($chan), $cn, $out, join(' ', @args));
+               ircd::setmode_many(agent($chan), $cn, $out, @args);
        }
 }
 
@@ -4158,7 +4156,6 @@ sub can_do($$$;$) {
        my $noreply = $data->{NOREPLY};
        my $acc = $data->{ACC};
        my $overrideMsg = $data->{OVERRIDE_MSG};
-       print "can_do user: " . Data::Dumper::Dumper($user) . "\n";
        if(my $nick = __can_do($chan, $perm, $user, $acc)) {
                # This is becoming increasingly complicated
                # and checking if an override was used is becoming tricky.
@@ -4192,7 +4189,6 @@ sub __can_do($$$;$) {
        my $nick;
        my $cn = $chan->{CHAN};
        $perm = uc $perm;
-       print "user: " . Data::Dumper::Dumper($user) . "\n";
        my $level;
        unless(exists($chan->{"PERM::$perm"})) {
                $level = $chan->{"PERM::$perm"} = get_level($chan, $perm);
@@ -4213,7 +4209,7 @@ sub __can_do($$$;$) {
                }
        }
        $nick = 1 unless $nick;
-
+       print "ACcc $acc $level\n";
        if($acc >= $level and !cr_chk_flag($chan, (CRF_CLOSE | CRF_FREEZE | CRF_DRONE))) {
                set_lastused($cn, get_user_id($user)) if $user;
                return (wantarray ? ($nick, 0) : $nick);
@@ -4271,17 +4267,19 @@ sub can_keep_op($$$$) {
 sub agent($) {
        my ($chan) = @_;
 
-       return $chan->{AGENT} if($chan->{AGENT});
+       if($chan->{AGENT}) {
+               my $a = $chan->{AGENT};
+               $a->{ID} = ircd::getUuid($a->{NICK});
+               return $a;
+       }
        
        unless(initial_synced()) {
-               return $csnick;
+               return $csUser;
        }
-
        $botserv::get_chan_bot->execute($chan->{CHAN});
-       my ($agent) = $botserv::get_chan_bot->fetchrow_array;
-       print "CHAN: " . $chan->{CHAN} . " bot " . $agent . "\n";
-       $agent = $csnick unless $agent;
-
+       my $agentnick = $botserv::get_chan_bot->fetchrow_array;
+       my ($agent) = { NICK => $agentnick, ID => ircd::getUuid($agentnick)};
+       $agent = $csUser unless $agentnick;
        return $chan->{AGENT} = $agent;
 }
 
@@ -4304,7 +4302,7 @@ sub drop($) {
        $drop_chantext->execute($cn);
        $drop_nicktext->execute($cn); # Leftover channel auths
        $drop->execute($cn);
-       ircd::setmode($csnick, $cn, '-r');
+       ircd::setmode($csUser, $cn, '-r');
 }
 
 sub drop_nick_chans($) {
@@ -4406,8 +4404,7 @@ sub user_join($$) {
 # Due to special casing of '0' this wrapper should be used
 # by anyone handling a JOIN (not SJOIN, it's a JOIN) event.
 # This is an RFC1459 requirement.
-       my ($nick, $cn) = @_;
-       my $user = { NICK => $nick };
+       my ($user, $cn) = @_;
        my $chan = { CHAN => $cn };
 
        if ($cn == 0) {
@@ -4422,7 +4419,7 @@ sub user_join($$) {
 }
 
 sub handle_sjoin($$$$$$$) {
-
+       print "wheeeeeeeeee\n";
        my ($server, $cn, $ts, $chmodes, $chmodeparms, $userarray, $banarray, $exceptarray) = @_;
        my $chan = { CHAN => $cn };
 
@@ -4431,6 +4428,8 @@ sub handle_sjoin($$$$$$$) {
        } else {
                update_modes($cn, "$chmodes $chmodeparms") if $chmodes;
        }
+       print "HANDLE  SJOIN $cn\n";
+       print Dumper (@$userarray);
        user_join_multi($chan, $userarray) if scalar @$userarray;
 
        foreach my $ban (@$banarray) {
@@ -4442,7 +4441,6 @@ sub handle_sjoin($$$$$$$) {
 }
 
 sub user_join_multi($$) {
-       print "User join multi???\n";
        my ($chan, $users) = @_;
        my $cn = $chan->{CHAN};
        my $seq = $ircline;
@@ -4500,7 +4498,6 @@ sub user_join_multi($$) {
                my ($reason, $opnick, $time) = get_close($chan);
                my $cmsg = "$cn is closed: $reason";
                my $preenforce = $enforcers{lc $chan};
-               
                if (cr_chk_flag($chan, CRF_CLOSE)) {
                        kickban_multi($chan, $users, $cmsg);
                }
@@ -4517,19 +4514,18 @@ sub user_join_multi($$) {
        }
 
        if(($count == 0  or !is_agent_in_chan($bot, $cn)) and initial_synced()) {
-               unless (lc($bot) eq lc($csnick)) {
+               unless ($bot eq $csUser) {
                        unless(is_agent_in_chan($bot, $cn)) {
                                botserv::bot_join($chan);
                        }
                }
        }
        
-       return unless synced() and not cr_chk_flag($chan, (CRF_CLOSE | CRF_DRONE));
-
+       #return unless synced() and not cr_chk_flag($chan, (CRF_CLOSE | CRF_DRONE));
+       return unless not cr_chk_flag($chan, (CRF_CLOSE | CRF_DRONE));
+       #commands aren't sent before synced() anyway
        my $n;
-       print "F\n";
        foreach my $user (@$users) {
-               print "Are we gettin there yet\n";
                if(do_status($user, $chan)) {
                        $n++;
                        $user->{__DO_WELCOME} = 1;
@@ -4560,9 +4556,7 @@ sub user_join_multi($$) {
 
 sub user_part($$$) {
        my ($nick, $cn, $reason) = @_;
-
        my $user = ( ref $nick eq 'HASH' ? $nick : { NICK => $nick });
-
        user_part_multi($user, [ $cn ], $reason);
 }
 
@@ -4575,12 +4569,10 @@ sub user_part_multi($$$) {
 # Other ircds may not do so. 
 # There is also KICK. some IRCds allow KICK #chan user1,user2,...
 # Unreal it's _supposed_ to work, but it does not.
-
        my ($user, $chanlist, $reason) = @_;
        my @chans;
        foreach my $cn (@$chanlist) {
                push @chans, { CHAN => $cn };
-       
        }
 
        my $uid = get_user_id($user);
@@ -4612,29 +4604,34 @@ sub channel_emptied($) {
 
 sub process_kick($$$$) {
        my ($src, $cn, $target, $reason) = @_;
-       my $tuser = { NICK => $target };
+       my $tuser = { NICK => $target, ID => ircd::getUuid($target)};
        user_part($tuser, $cn, 'Kicked by '.$src.' ('.$reason.')');
 
        my $chan = { CHAN => $cn };
        if ( !(is_agent($src) or $src =~ /\./ or adminserv::is_ircop({ NICK => $src })) and
                ({modes::splitmodes(get_modelock($chan))}->{Q}->[0] eq '+') )
        {
-               my $srcUser = { NICK => $src };
+               my $srcUser = { NICK => $src, ID => ircd::getUuid($src) };
                #ircd::irckill(agent($chan), $src, "War script detected (kicked $target past +Q in $cn)");
                nickserv::kline_user($srcUser, 300, "War script detected (kicked $target past +Q in $cn)");
                # SVSJOIN won't work while they're banned, unless you invite.
-               ircd::invite(agent($chan), $cn, $target);
-               ircd::svsjoin(undef, $target, $cn);
+               ircd::invite(agent($chan), $cn, $tuser);
+               ircd::svsjoin(undef, $tuser, $cn);
                unban_user($chan, $tuser);
        }
 }
 
 sub chan_mode($$$$) {
-       my ($src, $cn, $modes, $args) = @_;
-       my $user = { NICK => $src };
+       my ($user, $cn, $modes, $args) = @_;
+       my $src;
+       if (ref($user) eq "HASH") {
+               $src = $user->{NICK};
+       }
+       else {
+               $src = $user;
+       }
        my $chan = { CHAN => $cn };
        my ($sign, $num);
-       
        # XXX This is not quite right, but maybe it's good enough.
        my $mysync = ($src =~ /\./ ? 0 : 1);
        
@@ -4656,8 +4653,8 @@ sub chan_mode($$$$) {
                if($mode eq '-') { $sign = 0; next; }
                
                my $arg = shift(@args) if($mode =~ $scm or $mode =~ $ocm);
-               my $auser = { NICK => $arg };
-               
+               my $auser = { ID => $arg };
+               get_user_nick ($auser);
                if($mode =~ /^[vhoaq]$/) {
                        next if $arg eq '';
                        next if is_agent($arg);
@@ -4670,8 +4667,7 @@ sub chan_mode($$$$) {
                        if($opguard and $sign == 1 and
                                !can_keep_op($user, $chan, $auser, $mode)
                        ) {
-                               $unmodes .= $mode;
-                               push @unargs, $arg;
+                               push @unargs, ["-" . $mode, $auser];
                        } else {
                                my $nid = get_user_id($auser) or next;
                                my ($r, $i);
@@ -4698,7 +4694,7 @@ sub chan_mode($$$$) {
                        #process_ban($cn, $arg, $src, 128, $sign);
                }
        }
-       ircd::setmode(agent($chan), $cn, $unmodes, join(' ', @unargs)) if($opguard and @unargs);
+       ircd::setmode2(agent($chan), $cn,  @unargs) if($opguard and @unargs);
 }
 
 sub process_ban($$$$) {
@@ -4714,33 +4710,41 @@ sub process_ban($$$$) {
 }
 
 sub chan_topic {
-       my ($src, $cn, $setter, $time, $topic) = @_;
+       my ($src, $cn, $suser, $time, $topic) = @_;
        my $chan = { CHAN => $cn };
-       my $suser = { NICK => $setter, AGENT => agent($chan) };
-
+       $suser -> {AGENT} = agent($chan);
+       my $setter = $suser -> {NICK};
        return if cr_chk_flag($chan, CRF_CLOSE, 1);
        
        if(current_message->{SYNC}) {  # We don't need to undo our own topic changes.
+               print "Line 4720\n";
                $set_topic1->execute($setter, $time, $cn);
                $set_topic2->execute($cn, $topic);
                return;
        }
-
        if(!synced()) {
+               print "Line 4726\n";
                $get_topic->execute($cn);
                my ($ntopic, $nsetter, $ntime) = $get_topic->fetchrow_array;
                if($topic ne '' and $time == $ntime or can_do($chan, 'SETTOPIC', undef)) {
+                       print "Line 4730\n";
                        $set_topic1->execute($setter, $time, $cn);
                        $set_topic2->execute($cn, $topic);
                } else {
+                       print "Line 4734\n";
                        ircd::settopic(agent($chan), $cn, $nsetter, $ntime, $ntopic);
                }
        }
-       
-       elsif(lc($src) ne lc($setter) or can_do($chan, 'SETTOPIC', $suser)) {
+       #lc($src) ne lc($setter) or - removed from previous line because
+       #i think it was breaking it for insp & idk what it did
+       #erry
+       elsif(can_do($chan, 'SETTOPIC', $suser)) {
+               print "LIne 4742\n";
+               print "condition : " . can_do($chan, 'SETTOPIC', $suser);
                $set_topic1->execute($setter, $time, $cn);
                $set_topic2->execute($cn, $topic);
        } else {
+               print "Line 4747\n";
                $get_topic->execute($cn);
                my ($ntopic, $nsetter, $ntime) = $get_topic->fetchrow_array;
                ircd::settopic(agent($chan), $cn, $nsetter, $ntime, $ntopic);
@@ -4759,6 +4763,8 @@ sub eos(;$) {
                if($type == CRF_DRONE) {
                        chan_kill($chan, $cn.$cmsg);
                } else {
+                       my $user = { NICK => $opnick};
+                       get_user_id ($user);
                        ircd::settopic(agent($chan), $cn, $opnick, $time, "Channel".$cmsg);
                        clear_users($chan, "Channel".$cmsg);
                }
index f44c588666f44649edeedc7292b79df1761f4bde..967d431fcd70e183ed3c53d34d01485350300819 100644 (file)
@@ -34,7 +34,7 @@ use SrSv::MySQL::Glob;
 
 our $hsnick_default = 'HostServ';
 our $hsnick = $hsnick_default;
-
+our $hsuser = { NICK => $hsnick, ID => "123AAAAAH" };
 our (
        $set_vhost, $get_vhost, $del_vhost,
        $vhost_chgroot,
@@ -53,15 +53,15 @@ sub init() {
 }
 
 sub dispatch($$$) {
-       my ($src, $dst, $msg) = @_;
+       my ($user, $dstUser, $msg) = @_;
+       my $src = $user->{NICK};
        $msg =~ s/^\s+//;
        my @args = split(/\s+/, $msg);
        my $cmd = shift @args;
-
-       my $user = { NICK => $src, AGENT => $dst };
-
+       $user->{AGENT} = $dstUser;
+       get_user_id ($user);
        return if flood_check($user);
-
+       return unless (lc $dstUser->{NICK} eq lc $hsnick);
        if(lc $cmd eq 'on') {
                hs_on($user, $src, 0);
        }
@@ -118,10 +118,11 @@ sub hs_on($$;$) {
                notice($user, "You don't have a vHost.") unless $identify;
                return;
        }
+       
        if ($vident) {
-               ircd::chgident($hsnick, $src, $vident);
+               ircd::chgident($hsuser, $src, $vident);
        }
-       ircd::chghost($hsnick, $src, $vhost);
+       ircd::chghost($hsuser, $src, $vhost);
 
        notice($user, "Your vHost has been changed to \002".($vident?"$vident\@":'')."$vhost\002");
 }
@@ -131,7 +132,7 @@ sub hs_off($) {
        my $src = get_user_nick($user);
        
        # This requires a hack that is only known to work in UnrealIRCd 3.2.6 and later.
-       ircd::reset_cloakhost($hsnick, $src);
+       ircd::reset_cloakhost($hsuser, $src);
 
        notice($user, "vHost reset to cloakhost.");
 }
index 020621d7cd9345ade57c0710347b1becc5846afb..b487ea46ff6fa3c075784595fef69a61dc79b01a 100644 (file)
@@ -47,7 +47,7 @@ use constant (
 
 our $msnick_default = 'MemoServ';
 our $msnick = $msnick_default;
-
+our $msuser = { NICK => $msnick, ID => "123AAAAAE" };
 our (
        $send_memo, $send_chan_memo, $get_chan_recipients,
 
@@ -62,9 +62,11 @@ our (
 
        $add_ignore, $get_ignore_num, $del_ignore_nick, $list_ignore, $chk_ignore,
        $wipe_ignore, $purge_ignore,
+       $get_first_unread
 );
 
 sub init() {
+       $get_first_unread = $dbh->prepare("SELECT memo.src, memo.chan, memo.time, memo.flag, memo.msg FROM memo, nickreg WHERE nickreg.nick=? AND memo.dstid=nickreg.id AND memo.flag=0 LIMIT 1");
        $send_memo = $dbh->prepare("INSERT INTO memo SELECT ?, id, NULL, UNIX_TIMESTAMP(), NULL, ? FROM nickreg WHERE nick=?");
        $send_chan_memo = $dbh->prepare("INSERT INTO memo SELECT ?, nickreg.id, ?, ?, NULL, ? FROM chanacc, nickreg
                WHERE chanacc.chan=? AND chanacc.level >= ? AND chanacc.nrid=nickreg.id
@@ -119,13 +121,13 @@ sub init() {
 ### MEMOSERV COMMANDS ###
 
 sub dispatch($$$) {
-       my ($src, $dst, $msg) = @_;
+       my ($user, $dstUser, $msg) = @_;
        $msg =~ s/^\s+//;
        my @args = split(/\s+/, $msg);
        my $cmd = shift @args;
-
-       my $user = { NICK => $src, AGENT => $dst };
-
+       $user -> {AGENT} = $dstUser;
+       return unless (lc $dstUser->{NICK} eq lc $msnick);
+       get_user_id ($user);
        return if flood_check($user);
 
        if($cmd =~ /^send$/i) {
@@ -146,10 +148,10 @@ sub dispatch($$$) {
                }
        }
        elsif($cmd =~ /^read$/i) {
-               if(@args == 1 and (lc($args[0]) eq 'last' or $args[0] > 0)) {
+               if(@args == 1 and (lc($args[0]) eq 'last' or $args[0] > 0 or (lc($args[0]) eq 'unread'))) {
                        ms_read($user, $args[0]);
                } else {
-                       notice($user, 'Syntax: READ <num|LAST>');
+                       notice($user, 'Syntax: READ <num|LAST|UNREAD>');
                }
        }
        elsif($cmd =~ /^list$/i) {
@@ -251,7 +253,23 @@ sub ms_read($$) {
                        return;
                }
                @nums = ($num);
-       } else {
+       }
+       elsif (lc($num) eq 'unread') {
+               $get_first_unread->execute($root);
+               $get_memo_full->execute($root, $num-1);
+               unless(($from, $chan, $time, $flag, $msg) = $get_first_unread->fetchrow_array) {
+                       notice($user, "You have no unread memos.");
+                       return;
+               }
+               $set_flag->execute(1, $from, $root, $chan, $time);
+               my @reply;
+               push @reply, "Memo \002$num\002 from \002$from\002 ".
+                       ($chan ? "to \002$chan\002 " : "to \002$root\002 ").
+                       "at ".gmtime2($time), $msg, ' --';
+               notice ($user, @reply);
+               return;
+       }
+       else {
                @nums = makeSeqList($num);
        }
 
@@ -410,7 +428,7 @@ sub notify($;$) {
        my ($user, $root) = @_;
        my (@nicks);
 
-       unless(ref($user)) {
+       unless(ref($user) eq "HASH") {
                $user = { NICK => $user };
        }
 
@@ -454,7 +472,7 @@ sub send_chan_memo($$$$) {
        
        $get_chan_recipients->execute($cn, $level);
        while(my ($u) = $get_chan_recipients->fetchrow_array) {
-               notice({ NICK => $u, AGENT => $msnick }, 
+               notice({ NICK => $u, AGENT => $msuser }, 
                        "You have a new memo from \002$src\002 to \002$cn\002.  To read it, type: \002/ms read last\002");
        }
 }
@@ -463,7 +481,7 @@ sub notice_all_nicks($$) {
        my ($nick, $msg) = @_;
 
        foreach my $u (get_nick_user_nicks $nick) {
-               notice({ NICK => $u, AGENT => $msnick }, $msg);
+               notice({ NICK => $u, AGENT => $msuser }, $msg);
        }
 }
 
index a46eca2e18b85f6e52a2e9908d36fcb1a6b1e602..5ecc2ec3e78b7b632d5ff47b2d9b3a525871d122 100644 (file)
@@ -48,11 +48,11 @@ use SrSv::Hash::Passwords;
 use SrSv::NickControl::Enforcer qw(%enforcers);
 
 use SrSv::Email;
-use SrSv::IRCd::UUID;
+use SrSv::Insp::UUID;
 use SrSv::Util qw( makeSeqList );
-use SrSv::IRCd::Send qw (getRevUuid    getUuid setRevUuid setUuid);
+use SrSv::IRCd::Send qw (getRevUuid    ircd::getUuid setRevUuid setUuid);
 require SrSv::MySQL::Stub;
-
+use Data::Dumper;
 use constant {
        # Clone exception max limit.
        # This number typically means infinite/no-limit.
@@ -83,7 +83,7 @@ use constant {
 
 our $nsnick_default = 'NickServ';
 our $nsnick = $nsnick_default;
-
+our $nsuser = { NICK => $nsnick, ID => "123AAAAAB" }; #FIXME - erry
 our $cur_lock;
 our $cnt_lock = 0;
 
@@ -179,11 +179,17 @@ our (
        $set_vacation_ntf, $get_vacation_ntf,
 
        $set_authcode_ntf, $get_authcode_ntf,
+       $nick_deleteChanUser, $nick_deleteNickCh, $nick_deleteNickId,
+       $id_delUser
 );
 
 sub init() {
        $nick_check = $dbh->prepare("SELECT id FROM user WHERE nick=? AND online=0 AND time=?");
-       $nick_checkExists = $dbh -> prepare ("SELECT nick FROM user WHERE id=?");
+       $nick_checkExists = $dbh -> prepare ("SELECT nick FROM user WHERE id=? AND time=?");
+       $nick_deleteChanUser = $dbh -> prepare ("DELETE FROM chanuser WHERE nickid=?");
+       $nick_deleteNickCh = $dbh -> prepare ("DELETE FROM nickchg WHERE nickid=?");
+       $nick_deleteNickId = $dbh -> prepare ("DELETE FROM nickid WHERE id=?");
+       $id_delUser = $dbh->prepare ("DELETE FROM user WHERE id=?");
        $nick_create = $dbh->prepare("INSERT INTO user SET nick=?, time=?, inval=0, ident=?, host=?, vhost=?, server=?, modes=?,
                gecos=?, flags=?, cloakhost=?, online=1");
        $nick_create2 = $dbh->prepare("INSERT INTO user SET id=?, nick=?, time=?, inval=0, ident=?, host=?, vhost=?, server=?, modes=?,
@@ -191,7 +197,7 @@ sub init() {
 #      $nick_create = $dbh->prepare("INSERT INTO user SET id=(RAND()*294967293)+1, nick=?, time=?, inval=0, ident=?, host=?, vhost=?, server=?, modes=?, gecos=?, flags=?, cloakhost=?, online=1");
        $nick_create_old = $dbh->prepare("UPDATE user SET nick=?, ident=?, host=?, vhost=?, server=?, modes=?, gecos=?,
                flags=?, cloakhost=?, online=1 WHERE id=?");
-       $nick_change = $dbh->prepare("UPDATE user SET nick=?, time=? WHERE nick=?");
+       $nick_change = $dbh->prepare("UPDATE user SET nick=? WHERE nick=?");
        $nick_quit = $dbh->prepare("UPDATE user SET online=0, quittime=UNIX_TIMESTAMP() WHERE nick=?");
        $nick_delete = $dbh->prepare("DELETE FROM user WHERE nick=?");
        $nick_id_delete = $dbh->prepare("DELETE FROM nickid WHERE id=?");
@@ -567,15 +573,16 @@ sub ns_ajoin($$@) {
 }
 
 sub dispatch($$$) {
-       my ($src, $dst, $msg) = @_;
+       $nsuser = { NICK => $nsnick, ID => "123AAAAAB" }; #FIXME = erry
+       my ($user, $dstUser, $msg) = @_;
+       return unless (lc $dstUser->{NICK} eq lc $nsnick);
        $msg =~ s/^\s+//;
        my @args = split(/\s+/, $msg);
        my $cmd = shift @args;
-       my $id = ircd::getUuid ($src);
-       $id = decodeUUID ($id);
-       my $user = { NICK => $src, AGENT => $dst, ID => $id};
+       get_user_id ($user);
+       my $src = $user->{NICK};
+       $user->{AGENT} = $dstUser;
        return if flood_check($user);
-
        if($cmd =~ /^help$/i) {
                sendhelp($user, 'nickserv', @args)
        }
@@ -814,8 +821,8 @@ sub ns_identify($$$;$) {
                                notice($user, "Cannot only change case of nick");
                                return;
                        }
-                       ircd::svsnick($nsnick, $src, $nick);
-                       ircd::setumode($nsnick, $nick, '+r');
+                       ircd::svsnick($nsuser, $user, $nick);
+                       ircd::setumode($nsuser, $user, '+r');
                        return 1;
                }
        }
@@ -862,7 +869,7 @@ sub ns_logout($) {
        $update_lastseen->execute($uid);
        $logout->execute($uid);
        delete($user->{NICKFLAGS});
-       ircd::nolag($nsnick, '-', get_user_nick($user));
+       ircd::nolag($nsnick, '-', $user);
        notice($user, 'You are now logged out');
        services::ulog($nsnick, LOG_INFO(), "used NickServ LOGOUT", $user);
 }
@@ -944,7 +951,7 @@ my @ghostbusters_quotes = (
 
        } else {
                my $ghostbusters = @ghostbusters_quotes[int rand(scalar(@ghostbusters_quotes))];
-               ircd::irckill($nsnick, $nick, "GHOST command used by $src ($ghostbusters)");
+               ircd::irckill($nsuser, $user, "GHOST command used by $src ($ghostbusters)");
                notice($user, "Your ghost has been disconnected");
                services::ulog($nsnick, LOG_INFO(), "used NickServ GHOST on $nick", $user);
                #nick_delete($nick);
@@ -997,11 +1004,11 @@ sub ns_register($$$) {
                else {
                        $identify->execute($uid, $src); $identify->finish();
                        notice($user, 'You are now registered and identified.');
-                       ircd::setumode($nsnick, $src, '+r');
+                       ircd::setumode($nsuser, $user, '+r');
                }
                
                $id_update->execute($src, $uid); $id_update->finish();
-               services::ulog($nsnick, LOG_INFO(), "registered $src (email: $email)".
+               services::ulog($nsuser, LOG_INFO(), "registered $src (email: $email)".
                        (services_conf_validate_email ? ' requires email validation code' : ''),
                        $user);
        } else {
@@ -1422,7 +1429,7 @@ sub ns_set($$$$) {
                        $del_nicktext->execute(NTF_UMODE, $target); $del_nicktext->finish(); # don't allow dups
                        $set_umode_ntf->execute($modes, $target); $set_umode_ntf->finish();
                        foreach my $usernick (get_nick_user_nicks $target) {
-                               ircd::setumode($nsnick, $usernick, $modes)
+                               ircd::setumode($nsuser, $user, $modes)
                        }
 
                        my @out;
@@ -1773,7 +1780,7 @@ sub ns_watch($$$;$) {
                }
 
                $set_watch->execute($mask, time(), $root);
-               ircd::svswatch($nsnick, $src, "+$mask");
+               ircd::svswatch($nsuser, $user, "+$mask");
                notice($user, "\002$mask\002 added to \002$target\002's watch list.");
                return;
        }
@@ -1784,7 +1791,7 @@ sub ns_watch($$$;$) {
                        return;
                }
                $del_watch->execute($root, $mask);
-               ircd::svswatch($nsnick, $src, "-$mask");
+               ircd::svswatch($nsuser, $user, "-$mask");
                notice($user, "\002$mask\002 removed from \002$target\002's watch list.");
        }
        elsif ($cmd =~ /^list$/i) {
@@ -1877,7 +1884,7 @@ sub get_silence_by_num($$) {
                        $expiry = 0;
                };
                $set_silence->execute($mask, time(), $expiry, $comment, $root);
-               ircd::svssilence($nsnick, $src, "+$mask");
+               ircd::svssilence($nsuser, $user, "+$mask");
                notice($user, "\002$mask\002 added to \002$target\002's SILENCE list.");
        }
        elsif ($cmd =~ /^del(ete)?$/i) {
@@ -1909,7 +1916,7 @@ sub get_silence_by_num($$) {
                        push @out_masks, "-$mask";
                        push @reply, "\002$mask\002 removed from \002$target\002's SILENCE list.";
                }
-               ircd::svssilence($nsnick, $src, @out_masks);
+               ircd::svssilence($nsuser, $user, @out_masks);
                notice($user, @reply);
        }
        elsif ($cmd =~ /^list$/i) {
@@ -2341,9 +2348,11 @@ sub unidentify($$;$) {
        $nick = get_root_nick($nick);
 
        foreach my $t (get_nick_user_nicks $nick) {
-               ircd::notice($nsnick, $t, (ref $msg ? @$msg : $msg)) unless(lc $t eq lc $src);
+               my $user = { NICK => $nick, AGENT => $nsuser };
+               get_user_id ($user);
+               ircd::notice($nsuser, $user, (ref $msg ? @$msg : $msg)) unless(lc $t eq lc $src);
                if(is_alias_of($nick, $t)) {
-                       ircd::setumode($nsnick, $t, '-r');
+                       ircd::setumode($nsuser, $user, '-r');
                }
        }
 
@@ -2353,9 +2362,10 @@ sub unidentify($$;$) {
 # For a single alias:
 sub unidentify_single($$) {
        my ($nick, $msg) = @_;
-
+       my $user = { NICK => $nick, AGENT => $nsuser };
+       get_user_id ($user);
        if(is_online($nick)) {
-               ircd::setumode($nsnick, $nick, '-r');
+               ircd::setumode($nsuser, $user, '-r');
        }
 }
 
@@ -2375,7 +2385,7 @@ sub kill_clones($$) {
        my ($c) = $count_clones->fetchrow_array;
 
        if($c > $lim) {
-               ircd::irckill($nsnick, $src, "Session Limit Exceeded");
+               ircd::irckill($nsuser, $user, "Session Limit Exceeded");
                return 1;
        }
 }
@@ -2383,7 +2393,7 @@ sub kill_clones($$) {
 sub kill_user($$) {
        my ($user, $reason) = @_;
 
-       ircd::irckill(get_user_agent($user) || main_conf_local, get_user_nick($user), $reason);
+       ircd::irckill(get_user_agent($user) || main_conf_local, $user, $reason);
 }
 
 sub kline_user($$$) {
@@ -2418,26 +2428,15 @@ sub do_identify ($$$;$$) {
        $get_umode_ntf->finish();
        if(adminserv::get_svs_level($root)) {
                $umodes = modes::merge_umodes('+h', $umodes);
-               ircd::nolag($nsnick, '+', $src);
+               ircd::nolag($nsuser, '+', $user);
        }
        $umodes = modes::merge_umodes('+r', $umodes) if(is_identified($user, $src));
 
        hostserv::hs_on($user, $root, 1);
 
        if(my @chans = get_autojoin_ntf($nick)) {
-               ircd::svsjoin($nsnick, $src, @chans);
+               ircd::svsjoin($nsuser, $user, @chans);
        }
-       nickserv::do_svssilence($user, $root);
-       nickserv::do_svswatch($user, $root);
-
-       chanserv::akick_alluser($user);
-       chanserv::set_modes_allchan($user, $flags & NRF_NEVEROP);
-       chanserv::fix_private_join_before_id($user);
-       
-       services::ulog($nsnick, LOG_INFO(), "identified to nick $nick (root: $root)", $user);
-
-       memoserv::notify($user, $root);
-       notify_auths($user, $root) if $flags & NRF_AUTH;
 
        my $enforced;
        if(enforcer_quit($nick)) {
@@ -2446,18 +2445,29 @@ sub do_identify ($$$;$$) {
        }
 
        if (lc($src) eq lc($nick)) {
-               ircd::setumode($nsnick, $src, $umodes);
+               ircd::setumode($nsuser, $user, $umodes);
                $update_nickalias_last->execute($nick); $update_nickalias_last->finish();
        }
        elsif($svsnick) {
-               ircd::svsnick($nsnick, $src, $nick);
-               ircd::setumode($nsnick, $nick, modes::merge_umodes('+r', $umodes) );
+               ircd::svsnick($nsuser, $user, $nick);
+               ircd::setumode($nsuser, $user, modes::merge_umodes('+r', $umodes) );
                # the update _should_ be taken care of in nick_change()
                #$update_nickalias_last->execute($nick); $update_nickalias_last->finish();
        }
        elsif(defined $umodes) {
-               ircd::setumode($nsnick, $src, $umodes);
+               ircd::setumode($nsuser, $user, $umodes);
        }
+       nickserv::do_svssilence($user, $root);
+       nickserv::do_svswatch($user, $root);
+
+       chanserv::akick_alluser($user);
+       chanserv::set_modes_allchan($user, $flags & NRF_NEVEROP);
+       chanserv::fix_private_join_before_id($user);
+       
+       services::ulog($nsnick, LOG_INFO(), "identified to nick $nick (root: $root)", $user);
+
+       memoserv::notify($user, $root);
+       notify_auths($user, $root) if $flags & NRF_AUTH;
        return ($enforced ? 2 : 1);
 }
 
@@ -2552,16 +2562,15 @@ sub get_hostmask($) {
 
 sub guestnick($) {
        my ($nick) = @_;
-       print "NICK $nick\n";
        $set_guest->execute(1, $nick);
        my $randnick = 'Guest'.int(rand(10)).int(rand(10)).int(rand(10)).int(rand(10)).int(rand(10));
        #Prevent collisions.
        while (is_online($randnick)) {
-               print "Already online!\n";
            $randnick = 'Guest'.int(rand(10)).int(rand(10)).int(rand(10)).int(rand(10)).int(rand(10));
        }
-       print "RANDNICK $randnick\n";
-       ircd::svsnick($nsnick, $nick, $randnick);
+       my $user = { NICK => $nick, AGENT => $nsuser };
+       get_user_id ($user);
+       ircd::svsnick($nsuser, $user, $randnick);
 
        return $randnick;
 }
@@ -2662,7 +2671,8 @@ sub do_expired_silences($$) {
 
        foreach my $user (get_nick_users $nick) {
                $user->{AGENT} = $nsnick;
-               ircd::svssilence($nsnick, get_user_nick($user), map ( { '-'.$_->[0] } @entries) );
+               $user->{ID} = ircd::getUuid($nick);
+               ircd::svssilence($nsuser, $user, map ( { '-'.$_->[0] } @entries) );
                #notice($user, "The following SILENCE entries have expired: ".
                #       join(', ', map ( { $_->[0] } @entries) ));
                notice($user, map( { "The following SILENCE entry has expired: \002".$_->[0]."\002 ".$_->[1] } @entries ) );
@@ -2684,7 +2694,7 @@ sub do_svssilence($$) {
                push @silences, "+$mask";
        }
        $get_silences->finish;
-       ircd::svssilence($nsnick, $target, @silences);
+       ircd::svssilence($nsuser, $user, @silences);
        return;
 }
 
@@ -2704,7 +2714,7 @@ sub do_svswatch($$) {
                push @watches, "+$mask";
        }
        $get_watches->finish;
-       ircd::svswatch($nsnick, $target, @watches);
+       ircd::svswatch($nsuser, $user, @watches);
        return;
 }
 
@@ -2715,13 +2725,13 @@ sub do_umode($$) {
        $get_umode_ntf->execute($rootnick);
        my ($umodes) = $get_umode_ntf->fetchrow_array; $get_umode_ntf->finish();
 
-       ircd::setumode($nsnick, $target, $umodes) if $umodes;
+       ircd::setumode($nsuser, $user, $umodes) if $umodes;
        return
 }
 
 sub notify_auths($$) {
-       my ($user, $nick) = @_;
-
+       my $user = @_;
+       my $nick = get_user_nick ($user);
        $get_num_nicktext_type->execute($nick, NTF_AUTH);
        my ($count) = $get_num_nicktext_type->fetchrow_array(); $get_num_nicktext_type->finish();
        notice($user, "$nick has $count channel authorizations awaiting action.", 
@@ -2735,8 +2745,8 @@ sub protect($) {
 
        return if nr_chk_flag($nick, NRF_EMAILREG());
        my $lev = protect_level($nick);
-       my $user = { NICK => $nick, AGENT => $nsnick };
-       
+       my $user = { NICK => $nick, AGENT => $nsuser };
+       get_user_id ($user);
        notice($user,
                "This nickname is registered and protected. If it is your",
                "nick, type \002/msg NickServ IDENTIFY <password>\002. Otherwise,",
@@ -2762,13 +2772,14 @@ sub protect($) {
 sub warn_countdown($) {
        my ($cookie)  = @_;
        my ($nick, $rem) = split(/ /, $cookie);
-       my $user = { NICK => $nick, AGENT => $nsnick };
-       
+       my $user = { NICK => $nick, AGENT => $nsuser };
+       get_user_id($user);
        if (is_identified($user, $nick)) {
+               print "Line 2778\n";
                $update_nickalias_last->execute($nick); $update_nickalias_last->finish();
                return;
        }
-       elsif(!(is_online($nick)) or !(is_registered($nick))) { return; } 
+       elsif(!(is_online($nick)) or !(is_registered($nick))) { print "Line 2782\n"; return; } 
 
        if($rem == 0) {
                notice($user, 'Your nick is now being changed.');
@@ -2859,6 +2870,7 @@ sub get_user_modes($) {
        $get_umodes->execute($uid);
        my ($umodes) = $get_umodes->fetchrow_array;
        $get_umodes->finish();
+       print "UMODES $umodes\n";
        return $umodes;
 };
 
@@ -2983,7 +2995,7 @@ sub inc_nick_inval($) {
        $get_nick_inval->execute($id);
        my ($nick, $inval) = $get_nick_inval->fetchrow_array;
        if($inval > 3) {
-               ircd::irckill($nsnick, $nick, 'Too many invalid passwords.');
+               ircd::irckill($nsuser, $user, 'Too many invalid passwords.');
                # unnecessary as irckill calls the quit handler.
                #nick_delete($nick);
                return 0;
@@ -3037,7 +3049,7 @@ sub check_identify($) {
        my $nick = get_user_nick($user);
        if(is_registered($nick)) {
                if(is_identified($user, $nick)) {
-                       ircd::setumode($nsnick, $nick, '+r');
+                       ircd::setumode($nsuser, $user, '+r');
                        $update_nickalias_last->execute($nick); $update_nickalias_last->finish();
                        return 1;
                } else {
@@ -3060,7 +3072,7 @@ sub fix_vhosts() {
        add_timer('fix_vhosts', 5, __PACKAGE__, 'nickserv::fix_vhosts');
        $get_hostless_nicks->execute();
        while (my ($nick) = $get_hostless_nicks->fetchrow_array) {
-               ircd::notice($nsnick, main_conf_diag, "HOSTLESS NICK $nick");
+               ircd::notice($nsuser, main_conf_diag, "HOSTLESS NICK $nick");
                ircd::userhost($nick);
                ircd::userip($nick);
        }
@@ -3081,8 +3093,8 @@ sub nick_cede($) {
 ### IRC EVENTS ###
 
 sub nick_create {
-       my ($nick, $time, $ident, $host, $vhost, $server, $svsstamp, $modes, $gecos, $ip, $cloakhost) = @_;
-       my $user = { NICK => $nick };
+       my ($user, $time, $ident, $host, $vhost, $server, $svsstamp, $modes, $gecos, $ip, $cloakhost) = @_;
+       my $nick = get_user_nick ($user);
        get_lock($nick);
        if ($vhost eq '*') {
                if ({modes::splitumodes($modes)}->{x} eq '+') {
@@ -3098,19 +3110,25 @@ sub nick_create {
        }
 
        my $id;
-       if ($id = get_user_id( { NICK => $nick } )) {
+       if ($id = get_user_id( $user )) {
                #$id = decodeUUID ($id);
-               $nick_checkExists->execute ($id);
+               $nick_checkExists->execute ($id, $time);
                my $exists = $nick_checkExists -> fetchrow_array();
                my $flags = (synced() ? UF_FINISHED() : 0);
                unless (defined($exists)) {
+                       $nick_deleteChanUser -> execute ($id);
+                       $nick_deleteNickCh -> execute ($id);
+                       $nick_deleteNickId -> execute ($id);
+                       $id_delUser -> execute ($id);
                        $nick_create2 -> execute ($id, $nick, $time, $ident, $host, $vhost, $server, $modes, $gecos, $flags, $cloakhost);
                }
                else {
                        $nick_create_old->execute ($nick, $ident, $host, $vhost, $server, $modes, $gecos, $flags, $cloakhost, $id);
                }
+               $add_nickchg->execute($ircline, $nick, $nick);
+               release_lock($nick);
                check_identify($user);
-               return $id
+               return $id;
        }
        if($svsstamp) {
                $get_user_nick->execute($svsstamp);
@@ -3133,7 +3151,7 @@ sub nick_create {
                while($i < 10 and !$nick_create->execute($nick, $time, $ident, $host, $vhost, $server, $modes, $gecos, $flags, $cloakhost)) { $i++ }
                $id = get_user_id( { NICK => $nick } ); # There needs to be a better way to do this
        }
-       ircd::setsvsstamp($nsnick, $nick, $id) unless $svsstamp == $id;
+       ircd::setsvsstamp($nsuser, $user, $id) unless $svsstamp == $id;
 
        $add_nickchg->execute($ircline, $nick, $nick);
 
@@ -3167,26 +3185,18 @@ sub nick_create_post($) {
 }
 
 sub nick_delete($$) {
-       my ($nick, $quit) = @_;
-       my $user = { NICK => $nick };
-       
+       my ($user, $quit) = @_;
+       my $nick = $user->{NICK};
        get_lock($nick);
-       
        my $id = get_user_id($user);
-
        $del_nickchg_id->execute($id); $del_nickchg_id->finish();
-
        $quit_update->execute($quit, $id); $quit_update->finish();
        $update_lastseen->execute($id); $update_lastseen->finish();
-
        $get_quit_empty_chans->execute($id);
-
        $chan_user_partall->execute($id); $chan_user_partall->finish();
        #$nick_chan_delete->execute($id); $nick_chan_delete->finish();
        $nick_quit->execute($nick); $nick_quit->finish();
-
        release_lock($nick);
-
        while(my ($cn) = $get_quit_empty_chans->fetchrow_array) {
                chanserv::channel_emptied({CHAN => $cn});
        }
@@ -3221,14 +3231,13 @@ sub squit($$$) {
 }
 
 sub nick_change($$$) {
-       my ($old, $new, $time) = @_;
-
+       my ($user, $new, $time) = @_;
+       my $old = $user->{NICK};
        return if(lc $old eq lc $new);
-
+       print "NICK CHANGE: $old -> $new ($time)\n";
        get_lock($old);
        nick_cede($new);
-       print "Nick change called $old -> $new\n";
-       $nick_change->execute($new, $time, $old);
+       $nick_change->execute($new, $old);
        $add_nickchg->execute($ircline, $new, $new);
        release_lock($old);
        if($new =~ /^guest/i) {
@@ -3236,19 +3245,29 @@ sub nick_change($$$) {
                if($get_guest->fetchrow_array) {
                        $set_guest->execute(0, $new);
                } else {
-                       print "Huuuuuuuuuuuh?\n";
                        guestnick($new);
                }
                return;
        }
-       ircd::setumode($nsnick, $new, '-r') 
+       my $user = { NICK => $new, AGENT => $nsuser };
+       get_user_id($user);
+       ircd::setumode($nsuser, $user, '-r') 
        unless check_identify({ NICK => $new });
 }
-
+sub handle_oper($) {
+       my ($user) = @_;
+       my $nick = $user->{NICK};
+       get_lock($nick);
+       my $id = get_user_id($user);
+       $get_umodes->execute($id);
+       my ($omodes) = $get_umodes->fetchrow_array;
+       $set_umodes->execute(modes::add($omodes, "o", 0), $id);
+       #this is _safe_. even an oper block with no privs gets +o
+       #it's just not passed to srsv for some reason, all we get is :UID opertype X
+}
 sub umode($$) {
-       my ($nick, $modes) = @_;
-       my $user = { NICK => $nick };
-
+       my ($user, $modes) = @_;
+       my $nick = $user->{NICK};
        get_lock($nick);
 
        my $id = get_user_id($user);
index 74518491f74fc7c71921953da924d6466cf972c1..a127253430ad679db905fce6d7da324675958bb0 100644 (file)
@@ -45,7 +45,7 @@ use constant {
 
 our $osnick_default = 'OperServ';
 our $osnick = $osnick_default;
-
+our $osuser = { NICK => $osnick, ID => "123AAAAAD" };
 my %newstypes = (
        u => 'User',
        o => 'Oper'
@@ -127,19 +127,20 @@ sub init() {
 }
 
 sub dispatch($$$) {
-       my ($src, $dst, $msg) = @_;
+       my ($user, $dstUser, $msg) = @_;
        $msg =~ s/^\s+//;
        my @args = split(/\s+/, $msg);
        my $cmd = shift @args;
-
-       my $user = { NICK => $src, AGENT=> $dst };
-
+       $user -> {AGENT} = $dstUser;
+       my $src = $user -> {NICK};
+       return unless (lc $dstUser->{NICK} eq lc $osnick);
+       get_user_id ($user);
        services::ulog($osnick, LOG_INFO(), "cmd: [$msg]", $user);
 
        return if flood_check($user);
-       unless(adminserv::is_svsop($user) or adminserv::is_ircop($user)) {
+       unless(defined(adminserv::is_svsop($user)) or adminserv::is_ircop($user)) {
                notice($user, $err_deny);
-               ircd::globops($osnick, "\002$src\002 failed access to $osnick $msg");
+               ircd::globops($osuser, "\002$src\002 failed access to $osnick $msg");
                return;
        }
 
@@ -395,7 +396,7 @@ sub os_fjoin($$@) {
                notice($user, "You don't have the right access");
                return $event::SUCCESS;
        }
-       ircd::svsjoin($osnick, $target, @chans);
+       ircd::svsjoin($osuser, $target, @chans);
 }
 
 sub os_fpart($$@) {
@@ -419,7 +420,7 @@ sub os_fpart($$@) {
        }
        $reason = join(' ', @params) if @params;
        
-       ircd::svspart($osnick, $target, $reason, @chans);
+       ircd::svspart($osuser, $target, $reason, @chans);
 }
 
 sub os_qline_add($$$$) {
@@ -593,7 +594,7 @@ sub os_svsnick($$$) {
                return $event::SUCCESS;
        }
        nickserv::enforcer_quit($newnick);
-       ircd::svsnick($osnick, $curnick, $newnick);
+       ircd::svsnick($osuser, $curnick, $newnick);
        notice($user, $curnick.' changed to '.$newnick);
        return $event::SUCCESS;
 }
@@ -784,7 +785,7 @@ sub os_except_hostname_del($$) {
        my $hostmask = $hostname;
        $hostmask =~ s/\*/\%/g;
        my $ret = $del_clone_exceptname->execute($hostmask);
-       ircd::notice($osnick, main_conf_diag, "hostname: $hostname; hostmask: $hostmask");
+       ircd::notice($osuser, main_conf_diag, "hostname: $hostname; hostmask: $hostmask");
        
        if($ret == 1) {
                notice($user, "\002$hostname\002 successfully deleted from the hostname exception list");
@@ -922,7 +923,7 @@ sub os_loners($@) {
                        return;
                }
                foreach my $tuser (chanserv::get_users_nochans($noid)) {
-                       $tuser->{AGENT} = $osnick;
+                       $tuser->{AGENT} = $osuser;
                        nickserv::kill_user($tuser,
                                "Killed by \002".get_user_nick($user)."\002".
                                (@args ? ": ".join(' ', @args) : '')
@@ -935,7 +936,7 @@ sub os_loners($@) {
                        return;
                }
                foreach my $tuser (chanserv::get_users_nochans($noid)) {
-                       $tuser->{AGENT} = $osnick;
+                       $tuser->{AGENT} = $osuser;
                        nickserv::kline_user($tuser, services_conf_chankilltime,
                                "K:Lined by \002".get_user_nick($user)."\002".
                                (@args ? ": ".join(' ', @args) : '')
@@ -945,7 +946,7 @@ sub os_loners($@) {
        elsif($cmd =~ /^(msg|message|notice)$/i) {
                notice($user, "Must have message to send") unless(@args);
                foreach my $tuser (chanserv::get_users_nochans($noid)) {
-                       $tuser->{AGENT} = $osnick;
+                       $tuser->{AGENT} = $osuser;
                        notice($tuser, 
                                "Automated message from \002".get_user_nick($user),
                                join(' ', @args)
@@ -964,8 +965,8 @@ sub os_loners($@) {
                }
 
                foreach my $tuser (chanserv::get_users_nochans($noid)) {
-                       $tuser->{AGENT} = $osnick;
-                       ircd::svsjoin($osnick, get_user_nick($tuser), $args[0]);
+                       $tuser->{AGENT} = $osuser;
+                       ircd::svsjoin($osuser, get_user_nick($tuser), $args[0]);
                }
        }
        else {
@@ -990,7 +991,7 @@ sub os_svskill($$$) {
                        return $event::SUCCESS;
                }
 
-               ircd::svskill($osnick, $target, $reason);
+               ircd::svskill($osuser, $target, $reason);
        }
 
        return $event::SUCCESS;
@@ -1006,7 +1007,7 @@ sub os_kill($$$) {
        }
 
        foreach my $target (split(',', $targets)) {
-               my $tuser = { NICK => $target, AGENT => $osnick };
+               my $tuser = { NICK => $target, AGENT => $osuser };
                if (!get_user_id($tuser)) {
                        notice($user, $target.' is not online.');
                        return $event::SUCCESS;
@@ -1059,7 +1060,7 @@ sub os_gline($$$@) {
        }
        unless($zline) {
                if(!$remove) {
-                       ircd::kline($opernick, $ident, $host, $expiry, $reason);
+                       ircd::kline(ircd::getUuid($osnick), $ident, $host, $expiry, $reason);
                } else {
                        ircd::unkline($opernick, $ident, $host);
                }
@@ -1082,7 +1083,7 @@ sub os_gline($$$@) {
                        return;
                }
                if(!$remove) {
-                       ircd::zline($opernick, $host, $expiry, $reason);
+                       ircd::zline($osnick, $host, $expiry, $reason);
                } else {
                        ircd::unzline($opernick, $host);
                }
@@ -1114,7 +1115,7 @@ sub os_clones($@) {
                }
                foreach my $tuser (get_clones($target)) {
                        next unless is_online($tuser);
-                       $tuser->{AGENT} = $osnick;
+                       $tuser->{AGENT} = $osuser;
                        nickserv::kill_user($tuser,
                                "Killed by \002".get_user_nick($user)."\002".
                                (@args ? ": ".join(' ', @args) : '')
@@ -1128,7 +1129,7 @@ sub os_clones($@) {
                }
                foreach my $tuser (get_clones($target)) {
                        next unless is_online($tuser);
-                       $tuser->{AGENT} = $osnick;
+                       $tuser->{AGENT} = $osuser;
                        nickserv::kline_user($tuser, services_conf_chankilltime,
                                "K:Lined by \002".get_user_nick($user)."\002".
                                (@args ? ": ".join(' ', @args) : '')
@@ -1139,7 +1140,7 @@ sub os_clones($@) {
                notice($user, "Must have message to send") unless(@args);
                foreach my $tuser (get_clones($target)) {
                        next unless is_online($tuser);
-                       $tuser->{AGENT} = $osnick;
+                       $tuser->{AGENT} = $osuser;
                        notice($tuser,
                                "Automated message from \002".get_user_nick($user),
                                join(' ', @args)
@@ -1159,8 +1160,8 @@ sub os_clones($@) {
 
                foreach my $tuser (get_clones($target)) {
                        next unless is_online($tuser);
-                       $tuser->{AGENT} = $osnick;
-                       ircd::svsjoin($osnick, get_user_nick($tuser), $args[0]);
+                       $tuser->{AGENT} = $osuser;
+                       ircd::svsjoin($osuser, get_user_nick($tuser), $args[0]);
                }
        }
        else {