use SrSv::IRCd::Send;
# FIXME
BEGIN { *SJB64 = \&ircd::SJB64 }
-
+use Data::Dumper;
our %agents;
our @defer_join;
sub is_agent($) {
my ($nick) = @_;
+ print "is agent $nick";
+ print "EXISTS: " . Dumper($agents{lc $nick});
return (defined($agents{lc $nick}));
}
$s =~ s/[^a-z0-9\-]/_/g;
}
- my $file = HELP_PATH . join('/', @subject) . '.txt';
+ my $file = HELP_PATH . join('/', @subject) . '.txt';
my @array = readhelp($file);
unless($array[0]) {
notice($user, "No help for \002".join(' ',
#ircd::debug($_[0]) if $debug;
if($_[0] =~ /^(?:SERVER|\') (\S+) (\S+) :(U[0-9]+)-([A-Za-z0-9]+)-([0-9]+) (.*)$/) {
- # SERVER test-tab.surrealchat.net 1 :U2307-FhinXeOoZEmM-200 SurrealChat
- # cmd, servername, hopCount, U<protocol>-<buildflags>-<numeric> infoLine
+ # SERVER test-tab.surrealchat.net 1 :U2307-FhinXeOoZEmM-200 SurrealChat
+ # cmd, servername, hopCount, U<protocol>-<buildflags>-<numeric> infoLine
$remoteserv = $1;
create_server($1);
$servernum[$5] = $1;
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 (@ids, @status);
- foreach my $user (@users) {
- my @params = split (",",$user);
- push (@status, $params[0]);
- push (@ids, $params[1]);
+ if ($_[0] =~ m"^(:\S+) FJOIN (\S+) (\d+) (\S+) (:?)(.*)$") {
+ my ($server, $channel, $ts, $modes, $userstring) = ($1, $2, $3, $4, $6);
+ my @users = split (" ", $userstring);
+ my (@ids, @status);
+ foreach my $user (@users) {
+ my @params = split (",",$user);
+ push (@status, $params[0]);
+ push (@ids, $params[1]);
+ }
+ return ('SJOIN', undef, undef, WF_CHAN, parse_fjoin($server, $channel, $ts, $modes, \@ids, \@status));
+ }
+ #>> 15 :583 FJOIN #opers 1310128904 +Pis :
+ #CHANNELS CONFIGURED TO STAY OPEN WITH CHMODE +P (INSP)
+ elsif ($_[0] =~ m"^(:\S+) FJOIN (\S+) (\d+) (\S+) :$") {
+ print "WHOOOOOOF";
+ #FIXME - Update channel modes.
}
- return ('SJOIN', undef, undef, WF_CHAN, parse_fjoin($server, $channel, $ts, $modes, \@ids, \@status));
}
sub SJOIN($) {
if ($_[0] =~ /^(?:\~|SJOIN) (\S+) (\S+) (.*)$/) {
}
elsif($_[0] =~ /^:(\S+) (?:D|PART) (\S+)$/) {
$user = {ID => $1};
+ get_user_nick ($user);
return ('PART', undef, 0, WF_CHAN, $user, $2, undef);
}
}
unless (get_user_nick ($dstUser)) {
$dstUser = {NICK=>$dest};
}
- print Dumper ($srcUser);
- print Dumper ($dstUser);
$event = 'PRIVMSG'; @args = ($srcUser, $dstUser, $4);
}
elsif($_[0] =~ /^(@|:)(\S+) (?:B|NOTICE) (\S+) :(.*)$/) {
}
sub QUIT($) {
- $_[0] =~ /^:(\S+) (?:QUIT|\,) :(.*)$/;
- my $user = {ID=>$1};
- get_user_nick ($1);
- return ('QUIT', 0, undef, WF_NICK, $user, $2);
-}
-
-sub KILL($) {
-#:tabris KILL ProxyBotW :tabris.netadmin.SCnet.ops!tabris (test.)
-#:ProxyBotW!bopm@ircop.SCnet.ops QUIT :Killed (tabris (test.))
- $_[0] =~ /^(@|:)(\S+) (?:KILL|\.) (\S+) :(\S+) \((.*)\)$/;
- my $name;
- if ($1 eq '@') {
- $name = $servernum[b64toi($2)];
- }
- else {
- $name = $2;
+ if ($_[0] =~ /^:(\S+) QUIT :Killed \((\S+) \((.*)\)\)$/) {
+ #:583AAAAAH QUIT :Killed (erry (die))
+ my $victim = {ID=>$1};
+ get_user_nick ($victim);
+ my $murderer = {NICK=>$2};
+ get_user_id ($murderer);
+ my $reason = $3;
+ return ('KILL', 0, 1, WF_NICK, $murderer, $victim, $reason, undef);
+ }
+ elsif ($_[0] =~ /^:(\S+) QUIT :(.*)$/) {
+ my $user = {ID=>$1};
+ get_user_nick ($user);
+ return ('QUIT', 0, undef, WF_NICK, $user, $2);
}
- my $user = {ID => $name};
- unless (get_user_nick ($user)) {
- $user = {NICK => $name};
- get_user_id ($user);
+}
+sub OPERQUIT ($) {
+ if ($_[0] =~ /^:(\S+) QUIT :(.*)$/) {
+ my $user = {ID=>$1};
+ get_user_nick ($user);
+ return ('QUIT', 0, undef, WF_NICK, $user, $2);
}
- return ('KILL', 0, 1, WF_NICK, $user, $3, $4, $5);
}
+sub KILL($) {
+ #All insp sends is :583AAAAAH QUIT :Killed (erry (die))
+ #_VERY_ helpful.
+ #UNLESS you kill someone who's in the services server:
+ #:583AAAAAA KILL 123AAAAAA :Killed (erry (die))
+ #:123AAAAAA OPERQUIT :Killed (erry (die))
+ #And yes, for (some?) opers it's OPERQUIT not QUIT
+ #Joy, JOY, JOY!
+ $_[0] =~ /^:(\S+) KILL (\S+) :(.*)$/;
+ my $murderer = {ID=>$1};
+ get_user_nick ($murderer);
+ my $victim = {ID=>$2};
+ get_user_nick ($victim);
+ return ("KILL", 0, 1, WF_NICK, $murderer, $victim, $3, undef);
+}
sub KICK($) {
#:tabris KICK #diagnostics SurrealBot :i know you don't like this. but it's for science!
$_[0] =~ /^(@|:)(\S+) (?:KICK|H) (\S+) (\S+) :(.*)$/;
#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);
}
'2' => \&STATS,
UID => \&UID,
OPERTYPE => \&OPERTYPE,
+ OPERQUIT => \&OPERQUIT, #Opers are so special, they get their own QUIT.
);
}
sub getUuid($) {
my $nick = lc $_[0];
my $id = $uuids{$nick};
- print "getUuid $nick $id\n";
return $id;
}
sub setRevUuid ($$) {
# $dst is always $main_conf{local} anyway...
# this is only valid b/c we never have messages routed THROUGH us
# we are always an end point.
- ircsendimm(":$dst $tkn{PONG}[$tkn] $src :$cookie");
+ ircsendimm(":$dst PONG $src :$cookie");
}
else {
- ircsendimm("$tkn{PONG}[$tkn] :$src");
+ ircsendimm("PONG :$src");
}
}
sub endburst {
#print "Synced: ", synced(), "\n\n";
#exit;
- ircsendimm(':'.$main_conf{local}.' '.$tkn{EOS}[$tkn], 'VERSION');
+ ircsendimm(':'.$main_conf{local}.' EOS VERSION');
agent_sync();
flushmodes(\%preconnect_defer_mode);
}
sub netinfo($$$$$$$$) {
- ircsendimm($tkn{NETINFO}[$tkn].' 0 '.time." $_[2] $_[3] 0 0 0 :$_[7]");
+ ircsendimm('NETINFO 0 '.time." $_[2] $_[3] 0 0 0 :$_[7]");
$main_conf{network} = $_[7];
}
sub tssync {
- ircsendimm((SJB64 ? '@'.itob64($main_conf{numeric}) : ':'.$main_conf{local})." $tkn{TSCTL}[$tkn] SVSTIME ".time);
+ ircsendimm((SJB64 ? '@'.itob64($main_conf{numeric}) : ':'.$main_conf{local})." TSCTL SVSTIME ".time);
}
sub parse_sjoin($$$$) {
$src = $main_conf{local} unless initial_synced();
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");
+ ircsend(":$srcId KICK $chan $targetId :$reason");
callfuncs('KICK', 0, 2, [$srcId, $chan, $targetId, $reason]);
}
my ($src, $chan, $target) = @_;
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");
+ ircsend(":$srcId INVITE $targetId $chan 0");
}
sub ping {
# if(@_ == 1) {
- ircsend(':'.$main_conf{local}.' '.$tkn{PING}[$tkn].' :'.$main_conf{local});
+ ircsend(':'.$main_conf{local}.' PING :'.$main_conf{local});
# } else {
# ircsend(':'.$_[2].' '.$tkn{PONG}[$tkn].' '.$_[0].' :'.$_[1]);
# }
my $srcId = ($src->{ID}?$src->{ID}:$src->{NICK});
# submit a list of messages as a single packet to the server
- ircsend(":$srcId $tkn{PRIVMSG}[$tkn] $dst :".join("\r\n".":$src $tkn{PRIVMSG}[$tkn] $dst :", @bufs));
+ ircsend(":$srcId PRIVMSG $dst :".join("\r\n".":$src PRIVMSG $dst :", @bufs));
callfuncs('LOOP_PRIVMSG', 0, 1, [$src, $dst, \@bufs]);
}
}
# submit a list of messages as a single packet to the server
- ircsendimm(":$src $tkn{PRIVMSG}[$tkn] $dst :".join("\r\n".":$src $tkn{PRIVMSG}[$tkn] $dst :", @bufs));
+ ircsendimm(":$src PRIVMSG $dst :".join("\r\n".":$src PRIVMSG $dst :", @bufs));
callfuncs('LOOP_PRIVMSG', 0, 1, [$src, $dst, \@bufs]);
}
$targetId = $dst;
}
print "targid $targetId\n";
- ircsend(":$srcId $tkn{NOTICE}[$tkn] $targetId :".join("\r\n".":$srcId $tkn{NOTICE}[$tkn] $targetId :", @bufs));
+ ircsend(":$srcId NOTICE $targetId :".join("\r\n".":$srcId NOTICE $targetId :", @bufs));
callfuncs('LOOP_NOTICE', 0, 1, [$srcId, $targetId, \@bufs]);
}
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");
+ ircsend(":$srcId SVSMODE $targetId $modes");
callfuncs('UMODE', 0, undef, [$dst, $modes]);
}
sub setsvsstamp($$$) {
my ($src, $dst, $stamp) = @_;
- ircsend(":$src $tkn{SVS2MODE}[$tkn] $dst +d $stamp");
+ ircsend(":$src SVS2MODE $dst +d $stamp");
# This function basically set the svsstamp to
# be the same as the userid. Not all ircd will
# support this function.
+ #and insp doesn't.
# We obviously already know the userid, so don't
# use a callback here.
#callfuncs('UMODE', 0, undef, [$dst, $modes]);
sub setagent_umode($$) {
my ($src, $modes) = @_;
- ircsend(":$src $tkn{UMODE2}[$tkn] $modes");
+ ircsend(":$src UMODE2 $modes");
}
sub setmode2($$@) {
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($srcId, $cn, @masklist);
+ ircd::setmode2($src, $cn, @masklist);
}
sub setmode($$$;$) {
my ($src, $dst, $modes, $target) = @_;
my $srcId;
if (initial_synced()) {
- $srcId = ($src->{ID}?$src->{ID}:($src->{UUID}?$src->{UUID}:$src->{NICK}));
+ if (ref($src) eq "HASH") {
+ $srcId = ($src->{ID}?$src->{ID}:($src->{UUID}?$src->{UUID}:$src->{NICK}));
+ }
+ else {
+ $srcId = $src;
+ }
}
else {
$src = $main_conf{numeric};
$srcId = $src;
}
- my $targetId = ($target->{ID}?encodeUUID($target->{ID}):$target->{NICK});
+ my $targetId;
+ if (ref ($target) eq "HASH") {
+ $targetId = ($target->{ID}?encodeUUID($target->{ID}):$target->{NICK});
+ }
+ else {
+ $targetId = $target;
+ }
callfuncs('MODE', undef, 1, [$srcId, $dst, $modes, $targetId]);
#print "$ircline -- setmode($srcId, $dst, $modes, $targetId)\n" ;
ircsend(":$srcId MODE $dst $modes $targetId");
# 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' : ''));
+ ircsend(":$src MODE $dst $modes".($parms?" $parms":'').($src =~ /\./ ? ' 0' : ''));
}
sub settopic($$$$$) {
$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");
+ ircsend(":$srcId TOPIC $chan :$topic");
callfuncs('TOPIC', undef, undef, [$srcId, $chan, $setter, $time, $topic]);
}
sub wallops ($$) {
my ($src, $message) = @_;
- ircsend(":$src $tkn{WALLOPS}[$tkn] :$message");
+ ircsend(":$src WALLOPS :$message");
}
sub globops ($$) {
my ($src, $message) = @_;
my $srcId = ($src->{ID}?$src->{ID}:$src->{NICK});
- ircsend(":$srcId $tkn{GLOBOPS}[$tkn] :$message");
+ ircsend(":$srcId GLOBOPS :$message");
}
sub kline ($$$$$) {
#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)." :$reason";
+ my $setId;
+ if (ref ($setter) eq "HASH") {
+ $setId = $setter->{ID};
+ }
+ else {
+ $setId = $setter;
+ }
+ my $line = ":$setId 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)]);
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)");
+ ircsendimm(":$srcId KILL $targetId ($reason)");
callfuncs('KILL', 0, 1, [$srcId, $targetId, $srcNick, $reason]);
}
# with a collision
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);
+ ircsend(":$srcId SVSNICK $targetId $newnick ".time);
}
sub svsnoop($$$) {
$src = $main_conf{local} unless defined($src);
if ($bool > 0) { $bool = '+'; } else { $bool = '-'; }
#this is SVS NO-OP not SVS SNOOP
- ircsend(":$main_conf{local} $tkn{SVSNOOP}[$tkn] $targetserver $bool");
+ ircsend(":$main_conf{local} SVSNOOP $targetserver $bool");
}
#START TODO - erry
# Example: SVSWATCH Blah :+Blih!*@* -Bluh!*@* +Bleh!*@*.com
# *** We do not track this info nor care.
my ($src, $target, @watchlist) = @_;
- my $base_str = ":$src ".$tkn{SVSWATCH}[$tkn]." $target :";
+ my $base_str = ":$src SVSWATCH $target :";
my $send_str = $base_str;
while (@watchlist) {
my $watch = shift @watchlist;
# Example: SVSSILENCE Blah :+Blih!*@* -Bluh!*@* +Bleh!*@*.com
# *** We do not track this info nor care.
my ($src, $target, @silencelist) = @_;
- my $base_str = ":$src ".$tkn{SVSSILENCE}[$tkn]." $target :";
+ my $base_str = ":$src SVSSILENCE $target :";
my $send_str = $base_str;
while (@silencelist) {
my $silence = shift @silencelist;
my ($src, $target, $oflags) = @_;
$src = $main_conf{local} unless defined($src);
- ircsend(":$src $tkn{SVSO}[$tkn] $target $oflags");
+ ircsend(":$src SVSO $target $oflags");
}
# *** We do not track this info nor care.
my ($src, $target, $swhois) = @_;
$src = $main_conf{local} unless defined($src);
- ircsend(":$src $tkn{SWHOIS}[$tkn] $target :$swhois");
+ ircsend(":$src SWHOIS $target :$swhois");
}
#END TODO - erry
# similar for svspart.
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));
+ ircsend(($srcId?":$srcId":'')." SVSJOIN $targetId ".join(',', @chans));
}
sub svspart($$$@) {
my ($src, $target, $reason, @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).
+ ircsend(($srcId ? ":$srcId" : '')." SVSPART $targetId ".join(',', @chans).
($reason ? " :$reason" : ''));
}
# not sure if it'll accept a servername or not.
# consider defaulting to ServServ
die('svskill called w/o $src') unless $src;
- ircsend(':'.$src.' '.$tkn{SVSKILL}[$tkn].' '.$target.' :'.$reason);
+ ircsend(':'.$src.' SVSKILL '.$target.' :'.$reason);
callfuncs('QUIT', 0, undef, [$target, $reason]);
}
sub userhost($) {
my ($target) = @_;
- ircsend($tkn{USERHOST}[$tkn]." $target");
+ ircsend("USERHOST $target");
}
sub userip($) {
my ($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");
+ ircsend(($srcId?":$srcId ":'')." CHGHOST $targetId $vhost");
callfuncs('CHGHOST', 0, 1, [$srcId, $targetId, $vhost]);
}
my ($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");
+ ircsend(($src?":$srcId ":'')." CHGIDENT $targetId $ident");
callfuncs('CHGIDENT', 0, 1, [$srcId, $targetId, $ident]);
}
# :nascent.surrealchat.net SERVER wyvern.surrealchat.net 2 :SurrealChat
die "You can't jupe $server"
if ((lc($server) eq lc($remoteserv)) or (lc($server) eq lc($main_conf{local})));
- ircsend(':'.$main_conf{local}.' '.$tkn{SQUIT}[$tkn]." $server :");
- ircsend(':'.$main_conf{local}.' '.$tkn{SERVER}[$tkn]." $server 2 :$reason");
+ ircsend(':'.$main_conf{local}." SQUIT $server :");
+ ircsend(':'.$main_conf{local}." SERVER $server 2 :$reason");
set_server_juped($server);
}
sub agent_dojoin($$) {
my ($agent, $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;
my $src = $agent;
$srcId = ($src->{ID}?$src->{ID}:($src->{UUID}?$src->{UUID}:$src->{NICK}));
}
- ircsend(":$srcId $tkn{PART}[$tkn] $chan :$reason");
+ ircsend(":$srcId PART $chan :$reason");
}
sub rehash_all_servers(;$) {
my ($type) = @_;
$type = undef() if(defined($type) && !($type =~ /^\-(motd|botmotd|opermotd|garbage)$/i));
foreach my $server (get_online_servers()) {
- ircsend(':'.$main::rsnick.' '.$tkn{REHASH}[$tkn].' '.$server.(defined($type) ? ' '.$type : '') );
+ ircsend(':'.$main::rsnick.' REHASH '.$server.(defined($type) ? ' '.$type : '') );
}
}
while(my $nick = shift @nicks) {
push @nicklist, $nick;
if(++$i >= 10) {
- ircsend(($src ? ":$src " : '' ).$tkn{SVSMODE}[$tkn]." $cn -".'b'x($i).' '.join(' ', @nicklist));
+ ircsend(($src ? ":$src" : '' )." SVSMODE $cn -".'b'x($i).' '.join(' ', @nicklist));
$i = 0; @nicklist = ();
}
}
- ircsend(($srcId ? ":$srcId " : '' ).$tkn{SVSMODE}[$tkn]." $cn -".'b'x($i).' '.join(' ', @nicklist));
+ ircsend(($srcId ? ":$srcId " : "SVSMODE $cn -".'b'x($i).' '.join(' ', @nicklist)));
# We don't loopback this, as we'll receive back the list
# of removed bans.
}
# Similar concepts may exist in other ircd implementations
my ($src, $cn) = @_;
- ircsend(($src ? ":$src " : '' ).$tkn{SVSMODE}[$tkn]." $cn -b");
+ ircsend(($src ? ":$src " : '' ). "SVSMODE $cn -b");
# We don't loopback this, as we'll receive back the list
# of removed bans.
}
my ($src, $sign, @targets) = @_;
$src = $main_conf{local} unless $src;
foreach my $target (@targets) {
- ircsend(':'.$src .' '.$tkn{SVS2NOLAG}[$tkn].' '.$sign.' '.$target);
+ ircsend(':'.$src .' SVSNOLAG '.$sign.' '.$target);
}
}
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");
}
=cut
use strict;
-
+use Data::Dumper;
use Exporter 'import';
BEGIN {
my %constants = (
};
-
+use SrSv::Insp::UUID;
use SrSv::IRCd::Send; #package ircd
use SrSv::Process::Init;
use SrSv::MySQL '$dbh';
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");
+ die("invalid get_user_id call");
}
-
- if(exists($user->{ID})) { return $user->{ID}; }
-
my $nick = $user->{NICK};
-
+ if($nick eq '') {
+ die("get_user_id called on empty string");
+ }
+ my $properId = ircd::getUuid ($user->{NICK});
+ if ($properId != "") {
+ $properId = decodeUUID($properId);
+ return $user->{ID} = $properId;
+ }
+ 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;
}
-
- if($nick eq '') {
- die("get_user_id called on empty string");
- }
-
my $nick2;
while($n < 10 and !defined($id)) {
$n++;
$user->{OLDNICK} = $user->{NICK};
$user->{NICK} = $nick2;
}
-
return $user->{ID} = $id;
}
sub get_user_nick($) {
my ($user) = @_;
-
unless(ref($user) eq 'HASH') {
die("invalid get_user_nick call");
}
-
- if(exists($user->{NICK}) and is_online($user->{NICK})) { return $user->{NICK} }
+ 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) {
+ $user->{ID} = $user->{NICK};
+ $user->{NICK} = $realnick;
+ return $realnick;
+ }
+ else {
+ return $user->{NICK};
+ }
+ }
# Possible bug? This next bit only works to chase the nick-change
# if the caller already did a get_user_id to find out
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($$$) {
# 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), @_);
+ ircd::notice($user->{AGENT} || 'NickServ', $user, @_);
}
sub user_die($@) {
addhandler('PRIVMSG', undef, 'servserv', 'core::dispatch', 1);
sub dispatch {
- print "DISPATCH CALLED\n";
- my ($src, $dst, $msg) = @_;
- my $user = { NICK => $src, AGENT => $rsnick, ID => getUuid($src) };
+ my ($user, $dstUser, $msg) = @_;
+ return unless (lc $dstUser->{NICK} eq lc $rsnick);
+ $user->{AGENT} = $dstUser;
+ my $src = $user->{NICK};
+ my $dst = $dstUser->{NICK};
if(!adminserv::is_ircop($user)) {
notice($user, 'Access Denied');
ircd::globops($rsnick, "\002$src\002 failed access to $rsnick $msg");
}
my $cmd = $msg;
$cmd =~ s/raw\s+//i;
+ print "$cmd\n";
ircsend($cmd);
}
if($msg =~ /^help$/) {
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);
addhandler('USERIP', undef, undef, 'nickserv::userip');
addhandler('SQUIT', undef, undef, 'nickserv::squit') if ircd::NOQUIT();
addhandler("OPERUP", undef, undef, 'nickserv::handle_oper');
+addhandler('PRIVMSG', undef, undef, 'core::dispatch');
addhandler('PRIVMSG', undef, undef, 'nickserv::dispatch');
addhandler('PRIVMSG', undef, lc services_conf_nickserv, 'nickserv::dispatch') if services_conf_nickserv;
use SrSv::NickReg::Flags qw(NRF_NOHIGHLIGHT nr_chk_flag_user);
use SrSv::MySQL '$dbh';
-
+use Data::Dumper;
use constant {
S_HELP => 1,
S_OPER => 2,
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));
}
sub is_svsop($;$) {
my ($user, $rlev) = @_;
-
+
my ($level, $nick) = get_best_svs_level($user);
+ return $nick if (is_agent($nick)); #something odd with srsv kicking itself
return $nick if(defined($level) and !defined($rlev));
if($level >= $rlev) {
- 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 $nick if (($rlev == S_HELP) or is_ircop($user))
}
return undef;
return $user->{IRCOP} if(exists($user->{IRCOP}));
my %umodes = modes::splitumodes(nickserv::get_user_modes($user));
-
no warnings 'deprecated';
if(($umodes{'o'} eq '+') or ($umodes{'S'} eq '+')) {
$user->{IRCOP} = 1;
$user->{SVSOP_LEVEL} = $level; $user->{SVSOP_NICK} = $nick;
if(wantarray) {
- print "LEVEL $level\n";
return ($level, $nick);
} else {
return $level;
use SrSv::User qw(get_user_nick get_user_id :flood);
use SrSv::User::Notice;
use SrSv::Help qw( sendhelp );
-
use SrSv::ChanReg::Flags;
use SrSv::NickReg::Flags qw(NRF_NOHIGHLIGHT nr_chk_flag_user);
if($msg =~ /^\!/) {
$has_bot->execute($dst);
return unless($has_bot->fetchrow_array);
- chan_dispatch($src, $dst, $msg);
+ chan_dispatch($user, $dst, $msg);
} else {
chan_msg($src, $dst, $msg);
}
my @args = split(/\s+/, $msg);
my $cmd = lc(shift @args);
$cmd =~ s/^\!//;
-
+ my $chan = { CHAN => $cn };
+ $user->{AGENT} = agent($chan);
my $chan = { CHAN => $cn };
my %cmdhash = (
}
elsif(cr_chk_flag($chan, CRF_BOTSTAY(), 1)) {
my $botUser = { NICK=>$nick, ID=>ircd::getUuid($nick) };
- bot_join($chan, $nick);
+ bot_join($chan, $botUser);
my $modelock = chanserv::get_modelock($chan);
ircd::setmode(main_conf_local, $cn, $modelock) if $modelock;
}
$set_founder->execute($root, $cn); $set_founder->finish();
set_acc($root, $user, $chan, FOUNDER);
-
notice($user, ($override ? "The previous founder, \002$prev\002, has" : "You have") . " been moved to the co-founder list of \002$cn\002.");
notice_all_nicks($user, $root, "\002$root\002 has been set as the founder of \002$cn\002.");
services::ulog($csnick, LOG_INFO(), "set founder of \002$cn\002 to \002$root\002", $user, $chan);
-
+ $del_nick_akick->execute($cn, $root); $del_nick_akick->finish(); #just in case
$get_successor->execute($cn);
my $suc = $get_successor->fetchrow_array; $get_successor->finish();
if(lc($suc) eq lc($root)) {
sub check_akick($$;$) {
my ($user, $chan, $check_only) = @_;
- print "Do status!\n";
if(adminserv::is_svsop($user, adminserv::S_HELP())) {
return 0;
}
notice($user, $msg);
foreach my $u (get_nick_user_nicks $nick) {
- notice({ NICK => $u, AGENT => $csnick }, $msg) unless lc $src eq lc $u;
+ notice({ NICK => $u, AGENT => $csUser }, $msg) unless lc $src eq lc $u;
}
}
}
sub handle_sjoin($$$$$$$) {
- print "wheeeeeeeeee\n";
my ($server, $cn, $ts, $chmodes, $chmodeparms, $userarray, $banarray, $exceptarray) = @_;
my $chan = { CHAN => $cn };
} 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) {
$get_nicks_by_email,
$nick_deleteChanUser, $nick_deleteNickCh, $nick_deleteNickId,
- $id_delUser
+ $id_delUser, $nick_delUser,
);
sub init() {
$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_delUser = $dbh->prepare ("DELETE FROM user WHERE nick=?");
$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=?,
} else {
my $ghostbusters = @ghostbusters_quotes[int rand(scalar(@ghostbusters_quotes))];
- ircd::irckill($nsuser, $user, "GHOST command used by $src ($ghostbusters)");
+ my $baduser = {NICK => $nick};
+ get_user_id ($baduser);
+ ircd::irckill($nsuser, $baduser, "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);
$id_update->execute($src, $uid); $id_update->finish();
services::ulog($nsuser, LOG_INFO(), "registered $src (email: $email)".
(services_conf_validate_email ? ' requires email validation code' : ''),
- $user);
+ $src);
} else {
$unlock_tables->execute; $unlock_tables->finish;
notice($user, 'Your nickname has already been registered.');
$nick_checkExists->execute ($id, $time);
my $exists = $nick_checkExists -> fetchrow_array();
my $flags = (synced() ? UF_FINISHED() : 0);
+ print "FFFF\n";
unless (defined($exists)) {
$nick_deleteChanUser -> execute ($id);
$nick_deleteNickCh -> execute ($id);
$nick_deleteNickId -> execute ($id);
$id_delUser -> execute ($id);
+ $nick_delUser -> execute ($nick);
$nick_create2 -> execute ($id, $nick, $time, $ident, $host, $vhost, $server, $modes, $gecos, $flags, $cloakhost);
}
else {
chanserv::channel_emptied({CHAN => $cn});
}
$get_quit_empty_chans->finish();
- ns_logout ($user);
}
sub squit($$$) {
}
sub killhandle($$$$) {
- my ($src, $dst, $path, $reason) = @_;
+ my ($srcUser, $dstUser, $path, $reason) = @_;
+ my $dst = $dstUser->{NICK};
+ my $src = $srcUser->{NICK};
+ print "KILL $src $dst\n";
unless (is_agent($dst)) {
- nick_delete($dst, "Killed ($src ($reason))");
+ print "WhootS";
+ nick_delete($dstUser, "Killed ($src ($reason))");
}
}
if($cmd =~ /^set/i) {
nickserv::kill_user($user, "OS SET doesn't exist here");
}
- ircd::globops($osnick, "\002$src\002 failed access to $osnick $msg");
+ ircd::globops($osuser, "\002$src\002 failed access to $osnick $msg");
return;
}
CREATE TABLE `chanperm` (
`name` char(10) NOT NULL default '',
- `id` smallint(5) unsigned NOT NULL auto_increment,
+ `id` bigint(20) unsigned NOT NULL auto_increment,
`level` tinyint(4) NOT NULL default '0',
`max` tinyint(3) unsigned NOT NULL default 0,
PRIMARY KEY (`name`),
) ENGINE=MyISAM;
CREATE TABLE `nickid` (
- `id` int(10) unsigned NOT NULL default '0',
+ `id` bigint(10) unsigned NOT NULL default '0',
`nrid` int(11) unsigned NOT NULL default '0',
PRIMARY KEY (`id`,`nrid`),
KEY `nrid` (`nrid`)
) ENGINE=HEAP;
CREATE TABLE `nickreg` (
- `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
+ `id` bigint(11) unsigned NOT NULL AUTO_INCREMENT,
`nick` char(30) NOT NULL default '',
`pass` char(127) binary NOT NULL default '',
`email` char(127) NOT NULL default '',
DROP TABLE IF EXISTS `chanuser`;
CREATE TABLE `chanuser` (
`seq` mediumint(8) unsigned NOT NULL default '0',
- `nickid` int(11) unsigned NOT NULL default '0',
+ `nickid` bigint(11) unsigned NOT NULL default '0',
`chan` char(32) NOT NULL default '',
`joined` tinyint(3) unsigned NOT NULL default '0',
`op` tinyint(4) NOT NULL default '0',