From: erry Date: Mon, 4 Jul 2011 18:16:38 +0000 (+0000) Subject: My work on this so far.... X-Git-Url: https://jfr.im/git/irc/SurrealServices/srsv.git/commitdiff_plain/2eef9154680ca8abe240de183e25ec84b4f0b71f My work on this so far.... 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 --- diff --git a/branches/erry-devel/SrSv/Agent.pm b/branches/erry-devel/SrSv/Agent.pm index 2a627841..65dae34e 100644 --- a/branches/erry-devel/SrSv/Agent.pm +++ b/branches/erry-devel/SrSv/Agent.pm @@ -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; diff --git a/branches/erry-devel/SrSv/IRCd/Event.pm b/branches/erry-devel/SrSv/IRCd/Event.pm index 93829e56..e18f4a56 100644 --- a/branches/erry-devel/SrSv/IRCd/Event.pm +++ b/branches/erry-devel/SrSv/IRCd/Event.pm @@ -71,7 +71,6 @@ sub callfuncs { $sync = 0; $wf = $_[3]; } - $message = { CLASS => 'IRCD', TYPE => $_[0], diff --git a/branches/erry-devel/SrSv/IRCd/State.pm b/branches/erry-devel/SrSv/IRCd/State.pm index bc2a88a2..4f3e977c 100644 --- a/branches/erry-devel/SrSv/IRCd/State.pm +++ b/branches/erry-devel/SrSv/IRCd/State.pm @@ -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; diff --git a/branches/erry-devel/SrSv/Insp/Parse.pm b/branches/erry-devel/SrSv/Insp/Parse.pm index 84a453d6..1d72162b 100644 --- a/branches/erry-devel/SrSv/Insp/Parse.pm +++ b/branches/erry-devel/SrSv/Insp/Parse.pm @@ -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-- 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, ); } diff --git a/branches/erry-devel/SrSv/Insp/Send.pm b/branches/erry-devel/SrSv/Insp/Send.pm index 4e196623..52e3ca37 100644 --- a/branches/erry-devel/SrSv/Insp/Send.pm +++ b/branches/erry-devel/SrSv/Insp/Send.pm @@ -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 : # 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 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. } diff --git a/branches/erry-devel/SrSv/Insp/UUID.pm b/branches/erry-devel/SrSv/Insp/UUID.pm index 0d1c38f2..f4358572 100644 --- a/branches/erry-devel/SrSv/Insp/UUID.pm +++ b/branches/erry-devel/SrSv/Insp/UUID.pm @@ -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 diff --git a/branches/erry-devel/SrSv/Log.pm b/branches/erry-devel/SrSv/Log.pm index e22561d8..33b022b1 100644 --- a/branches/erry-devel/SrSv/Log.pm +++ b/branches/erry-devel/SrSv/Log.pm @@ -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"); } diff --git a/branches/erry-devel/SrSv/User.pm b/branches/erry-devel/SrSv/User.pm index 5b0883c7..22cd87fe 100644 --- a/branches/erry-devel/SrSv/User.pm +++ b/branches/erry-devel/SrSv/User.pm @@ -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) { diff --git a/branches/erry-devel/SrSv/User/Notice.pm b/branches/erry-devel/SrSv/User/Notice.pm index 5321f92f..786e8d30 100644 --- a/branches/erry-devel/SrSv/User/Notice.pm +++ b/branches/erry-devel/SrSv/User/Notice.pm @@ -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($@) { diff --git a/branches/erry-devel/help/memoserv/read.txt b/branches/erry-devel/help/memoserv/read.txt index e215c0e8..329423a9 100644 --- a/branches/erry-devel/help/memoserv/read.txt +++ b/branches/erry-devel/help/memoserv/read.txt @@ -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. diff --git a/branches/erry-devel/modules/connectserv.pm b/branches/erry-devel/modules/connectserv.pm index 0d558a18..4a80f923 100644 --- a/branches/erry-devel/modules/connectserv.pm +++ b/branches/erry-devel/modules/connectserv.pm @@ -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 { diff --git a/branches/erry-devel/modules/core.pm b/branches/erry-devel/modules/core.pm index b48a408b..52049abe 100644 --- a/branches/erry-devel/modules/core.pm +++ b/branches/erry-devel/modules/core.pm @@ -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"); diff --git a/branches/erry-devel/modules/services.pm b/branches/erry-devel/modules/services.pm index 5c2449a1..377862ed 100644 --- a/branches/erry-devel/modules/services.pm +++ b/branches/erry-devel/modules/services.pm @@ -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 diff --git a/branches/erry-devel/modules/serviceslibs/adminserv.pm b/branches/erry-devel/modules/serviceslibs/adminserv.pm index d8ff7cfd..6b9bc529 100644 --- a/branches/erry-devel/modules/serviceslibs/adminserv.pm +++ b/branches/erry-devel/modules/serviceslibs/adminserv.pm @@ -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; diff --git a/branches/erry-devel/modules/serviceslibs/botserv.pm b/branches/erry-devel/modules/serviceslibs/botserv.pm index faaf54c3..5a3555ad 100644 --- a/branches/erry-devel/modules/serviceslibs/botserv.pm +++ b/branches/erry-devel/modules/serviceslibs/botserv.pm @@ -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 ); } } diff --git a/branches/erry-devel/modules/serviceslibs/chanserv.pm b/branches/erry-devel/modules/serviceslibs/chanserv.pm index c5527bd2..c18a7c25 100644 --- a/branches/erry-devel/modules/serviceslibs/chanserv.pm +++ b/branches/erry-devel/modules/serviceslibs/chanserv.pm @@ -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); } diff --git a/branches/erry-devel/modules/serviceslibs/hostserv.pm b/branches/erry-devel/modules/serviceslibs/hostserv.pm index f44c5886..967d431f 100644 --- a/branches/erry-devel/modules/serviceslibs/hostserv.pm +++ b/branches/erry-devel/modules/serviceslibs/hostserv.pm @@ -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."); } diff --git a/branches/erry-devel/modules/serviceslibs/memoserv.pm b/branches/erry-devel/modules/serviceslibs/memoserv.pm index 020621d7..b487ea46 100644 --- a/branches/erry-devel/modules/serviceslibs/memoserv.pm +++ b/branches/erry-devel/modules/serviceslibs/memoserv.pm @@ -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 '); + notice($user, 'Syntax: READ '); } } 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); } } diff --git a/branches/erry-devel/modules/serviceslibs/nickserv.pm b/branches/erry-devel/modules/serviceslibs/nickserv.pm index a46eca2e..5ecc2ec3 100644 --- a/branches/erry-devel/modules/serviceslibs/nickserv.pm +++ b/branches/erry-devel/modules/serviceslibs/nickserv.pm @@ -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 \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); diff --git a/branches/erry-devel/modules/serviceslibs/operserv.pm b/branches/erry-devel/modules/serviceslibs/operserv.pm index 74518491..a1272534 100644 --- a/branches/erry-devel/modules/serviceslibs/operserv.pm +++ b/branches/erry-devel/modules/serviceslibs/operserv.pm @@ -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 {