From: Michael Andreen Date: Tue, 18 Aug 2009 09:48:07 +0000 (+0200) Subject: Added code for Eos + fix for DCC and Quotes X-Git-Url: https://ruin.nu/git/?p=NDIRC.git;a=commitdiff_plain;h=4c40fd39668614135ae9370092b5d17355bad15c Added code for Eos + fix for DCC and Quotes --- diff --git a/Commands/Def.pm b/Commands/Def.pm index e13758d..3216978 100644 --- a/Commands/Def.pm +++ b/Commands/Def.pm @@ -27,6 +27,7 @@ use CGI; use Moose; use MooseX::MethodAttributes; +use NDIRC::Misc; sub anon : Help(syntax: .anon nick message) @@ -224,6 +225,100 @@ SELECT calc FROM calls WHERE id = $1} $c->reply("Calc for call $id: $calc"); } +sub report_incs + : Type(pm) +{ + my ($self,$c,$msg) = @_; + + if ($msg =~ /(\d+):(\d+):(\d+)\*?\s+(\d+):(\d+):(\d+)\s+([^:]*\S+)\s+(?:Ter|Cat|Xan|Zik|Etd)\s+([\d,]+)\s+Attack\s+(\d+)/ + || $msg =~ /(\d+):(\d+):(\d+)\s+(\d+):(\d+):(\d+)\s+\((?:Ter|Cat|Xan|Zik|Etd)\)\s+([^,]*\S+)\s+([\d,]+)\s+(\d+)\s+\(\d+\)/){ + my $dbh = $c->model; + my $amount = $8; + { + $amount =~ s/,//g; + } + + my $st = $dbh->prepare(q{ +SELECT username, uid, pid, defprio +FROM users_defprio u +WHERE pid = planetid($1,$2,$3,tick()) + AND uid IN (SELECT uid FROM groupmembers WHERE gid = 'M') + }); + if (my $user = $dbh->selectrow_hashref($st,undef,$1,$2,$3)){ + + $st = $dbh->prepare(q{ +SELECT nick,alliance,pid,planet_status,relationship +FROM current_planet_stats WHERE x = ? AND y = ? AND z = ? + }); + if (my @attacker = $dbh->selectrow_array($st,undef,$4,$5,$6)){ + $dbh->begin_work; + my $landing_tick = $dbh->selectrow_array(q{SELECT tick() + ?},undef,$9); + my @call = $dbh->selectrow_array(q{ +SELECT call,status,calc +FROM calls WHERE uid = ? AND landing_tick = ? + },undef,$user->{uid},$landing_tick); + my $threefleeter = $dbh->selectrow_array(q{ +SELECT COALESCE(gid = 'X',false) +FROM groupmembers WHERE uid = ? AND gid = 'X' + },undef,$user->{uid}); + unless (@call){ #call doesn't exists, create a new one + @call = $dbh->selectrow_array(q{ +INSERT INTO calls (uid,landing_tick,info) VALUES(?,?,'') RETURNING call + },undef,$user->{uid},$landing_tick); + if ($threefleeter){ + $dbh->do(q{UPDATE calls SET status = 'Ignored' WHERE call = $1},undef,$call[0]); + $c->def_log($call[0], 'This member has been marked as [B]NoDef[/B], do [B]not cover[/B] unless you have a good reaon.'); + } + } + if (@call){ + my $pointlimits = $dbh->prepare(q{SELECT value :: float FROM misc WHERE id = ?}); + my ($minpoints) = $dbh->selectrow_array($pointlimits,undef,'DEFMINPRIO'); + my ($maxpoints) = $dbh->selectrow_array($pointlimits,undef,'DEFMAXPRIO'); + my $color = 3; + if ($user->{defprio} < $minpoints){ + $color = 5; + }elsif ($user->{defprio} < $maxpoints){ + $color = 8; + } + $user->{defprio} = "$user->{defprio}"; + $st = $dbh->prepare(q{SELECT pid FROM incomings WHERE pid = ? AND amount = ? and fleet = ? AND call = ?}); + unless (my @inc = $dbh->selectrow_array($st,undef,$attacker[2],$amount,$7,$call[0])){ + my $incid = $dbh->selectrow_array(q{ +INSERT INTO incomings (call,pid,eta,amount,fleet) VALUES(?,?,?,?,?) RETURNING inc + },undef,$call[0],$attacker[2],$9,$amount,$7); + @attacker = map (valuecolor(0),@attacker); + if (! $threefleeter || $call[2]){ + $c->message(privmsg => $ND::defchan, "New incoming: CallId: $call[0], IncId: $incid $1:$2:$3 ($user->{defprio}) is under Attack by $4:$5:$6, ($attacker[3]), $attacker[1]($attacker[4]) https://nd.ruin.nu/calls/edit/$call[0]"); + }else{ + $c->message(privmsg => $ND::defchan, "Do not cover, NoDef member is under attack by $4:$5:$6, ($attacker[3]), $attacker[1]($attacker[4]) https://nd.ruin.nu/calls/edit/$call[0]"); + } + $dbh->do(q{UPDATE planets SET hit_us = hit_us + 1 WHERE pid = ?},undef,$attacker[2]); + if ($call[1] eq 'Covered'){ + $dbh->do(q{UPDATE calls SET status = 'Open' WHERE call = ?},undef,$call[0]); + $c->message(privmsg => $ND::defchan, "Call is likely not covered anymore, please recalc! calc: $call[3]"); + } + }else{ + @attacker = map (valuecolor(0),@attacker); + $c->message(privmsg => $ND::defchan, "Duplicate call: Callid: $call[0], Covered: $call[1], Open: $call[2] $1:$2:$3 ($user->{defprio}) is under Attack by $4:$5:$6, ($attacker[3]), $attacker[1]($attacker[4]), landing tick: $landing_tick"); + } + + my ($fleetcatch) = $dbh->selectrow_array(q{ +SELECT count(*) FROM launch_confirmations WHERE uid = ? AND back = ? + },undef,$user->{uid},$landing_tick); + if ($fleetcatch > 0){ + $c->message(privmsg => $ND::defchan, "THIS IS A POSSIBLE FLEETCATCH!"); + } + } + $dbh->commit; + }else{ + $c->message(privmsg => $ND::defchan, "Didn't find any planet with coordinates $4:$5:$6 at this tick"); + } + }else{ + $c->message(privmsg => $ND::defchan, "No member registered with coordinates $1:$2:$3"); + } + } + +} 1; diff --git a/Commands/Quotes.pm b/Commands/Quotes.pm index 3353eb6..7d18819 100644 --- a/Commands/Quotes.pm +++ b/Commands/Quotes.pm @@ -68,6 +68,7 @@ sub findquote { my ($self,$c,$pattern) = @_; die 'ARGS' unless $pattern; + my $matcher; if ($self->name eq 'findqre'){ if (defined (eval 'm/$pattern/ix')){ @@ -91,7 +92,7 @@ sub findquote $n++; } if ($match){ - close $file; + $file->flush; $c->command(dcc => $c->nick => SEND => $file); }else{ $c->reply("No quotes matching $pattern."); diff --git a/CommonStates.pm b/CommonStates.pm index dd35657..b91cd9f 100644 --- a/CommonStates.pm +++ b/CommonStates.pm @@ -26,7 +26,6 @@ use POE::Session; use POE::Component::IRC::Plugin::Logger; use POE::Component::IRC::Plugin::BotTraffic; use POE::Component::IRC::Plugin::Connector; -use POE::Component::IRC::Plugin::DCC; use NDIRC::Dispatcher; @@ -58,7 +57,6 @@ sub _start { $kernel->sig( INT => 'signal_handler' ); $irc->plugin_add( 'BotTraffic', POE::Component::IRC::Plugin::BotTraffic->new() ); - $irc->plugin_add( 'DCC', POE::Component::IRC::Plugin::DCC->new() ); $irc->plugin_add('Logger', POE::Component::IRC::Plugin::Logger->new( Path => 'irclogs', DCC => 0, diff --git a/Eos.pm b/Eos.pm new file mode 100644 index 0000000..6a6c96e --- /dev/null +++ b/Eos.pm @@ -0,0 +1,160 @@ +#************************************************************************** +# Copyright (C) 2006 by Michael Andreen * +# * +# This program is free software; you can redistribute it and/or modify * +# it under the terms of the GNU General Public License as published by * +# the Free Software Foundation; either version 2 of the License, or * +# (at your option) any later version. * +# * +# This program is distributed in the hope that it will be useful, * +# but WITHOUT ANY WARRANTY; without even the implied warranty of * +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +# GNU General Public License for more details. * +# * +# You should have received a copy of the GNU General Public License * +# along with this program; if not, write to the * +# Free Software Foundation, Inc., * +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * +#**************************************************************************/ +package NDIRC::Eos; + +use strict; +use warnings; +use feature ':5.10'; + +use POE::Session; +use NDIRC::Misc; +use ND::DB; + +my ($tick,$stattick) = DB()->selectrow_array(q{SELECT tick(),max(tick) FROM planet_stats}); +my $last_announcement = 0; + +sub irc_public { + my ($sender, $heap, $who, $where, $msg) = @_[SENDER, HEAP, ARG0 .. ARG2]; + my ($nick,$username,$address) = ( split /[!@]/, $who ); + my $channel = $where->[0]; + + my $irc = $sender->get_heap(); + + if ($msg =~ /^(\S+): (.+)$/ && $heap->{disp}->has_command('anon',$channel)){ + my $_ = $1; + my $text = $2; + unless ($irc->is_channel_member($channel,$1) || /(Constructing|Researching)/){ + $msg = ".anon $_ $text"; + } + + } + if (parseCommand($msg,$irc,$nick,$address,$channel,$heap->{disp},DB())){ + #Command parsed and run successfully + } +} + + +sub irc_msg { + my ($sender, $heap, $who, $where, $msg) = @_[SENDER, HEAP, ARG0 .. ARG2]; + my ($nick,$username,$address) = ( split /[!@]/, $who ); + my $irc = $sender->get_heap(); + + if (parseCommand($msg,$irc,$nick,$address,'pm',$heap->{disp},DB())){ + #Command parsed and run successfully + }else{ + $irc->yield(privmsg => $ND::defchan, chr(3)."04 $nick >> $msg"); + parseCommand(".report_incs $msg",$irc,$nick,' BATCH ','pm',$heap->{disp},DB()); + } +} + +sub irc_join { + my ($sender, $heap, $who, $channel) = @_[SENDER, HEAP, ARG0 .. ARG1]; + my ($nick,$username,$address) = ( split /[!@]/, $who ); + my $irc = $sender->get_heap(); + + my $dbh = DB(); + + if ($channel =~ /^$ND::memchan$/i){ + if (time - $last_announcement < 1){ + $last_announcement = time; + return; + } + my $user = $dbh->selectrow_hashref(q{ +SELECT uid,pid,hostmask,password + ,(SELECT max(time) FROM forum_thread_visits WHERE uid = u.uid) AS last_forum_visit +FROM users u WHERE hostmask = ? + }, undef, $address); + if ($user){ + if ($user->{password} eq ''){ + $irc->yield(privmsg => $ND::memchan, "$nick: Get a new random password with /msg delling !getpass . If you don't know your username, then you can get it with .points"); + } + if ($tick > 36 && not defined $user->{pid}){ + $irc->yield(privmsg => $ND::memchan, "$nick: go to https://nd.ruin.nu/ and enter your coords."); + } + + if (not defined $user->{last_forum_visit}){ + $irc->yield(privmsg => $ND::memchan, "$nick: Go read the forum! https://nd.ruin.nu/forum"); + }else { + my $unread = $dbh->selectrow_hashref(q{SELECT * FROM unread_posts($1)},undef,$user->{uid}); + if ($unread && $unread->{new}){ + $irc->yield(notice => $nick, "$unread->{new} posts since your last forum visit ($unread->{unread} unread posts in total) https://nd.ruin.nu/forum/allUnread"); + } + } + } + if (time - $last_announcement < 2){ + $last_announcement = time; + return; + } + $last_announcement = time; + } +} + +sub refresh { + my ($kernel,$heap) = @_[KERNEL,HEAP]; + $kernel->delay( refresh => 60 ); + print 'Time: ' . time() . ' Lag: ' . $heap->{connector}->lag() . "\n"; + + my $irc = $heap->{irc}; + my $dbh = DB(); + + my @row = $dbh->selectrow_array(q{SELECT tick(), max(tick) FROM planet_stats}); + if ($tick != $row[0]){ + $tick = $row[0]; + $irc->yield(privmsg => $ND::defchan, "New tick: $tick"); + } + if (defined $row[1] && $stattick != $row[1]){ + $stattick = $row[1]; + $irc->yield(privmsg => $ND::memchan, "New tick: $stattick"); + } + my $ircreqs = $dbh->prepare(q{SELECT id,username,message,channel FROM irc_requests NATURAL JOIN users WHERE not sent}); + my $upircreq = $dbh->prepare(q{UPDATE irc_requests SET sent = TRUE WHERE id = ?}); + $ircreqs->execute; + while (my $req = $ircreqs->fetchrow_hashref){ + if ($req->{channel} eq 'def'){ + $irc->yield(privmsg => $ND::defchan, chr(3)."04 ## $req->{username} via webbie ## >> $req->{message}"); + parseCommand(".report_incs $req->{message}",$irc,$req->{username},' BATCH ','pm',$heap->{disp},$dbh); + }elsif($req->{channel} eq 'scan'){ + $irc->yield(privmsg => $ND::scanchan, "<$req->{username} via webbie> $req->{message}"); + }elsif($req->{channel} eq 'members'){ + $irc->yield(privmsg => $ND::memchan, "<$req->{username} via webbie> $req->{message}"); + } + $upircreq->execute($req->{id}); + } + my $defmissions = $dbh->prepare(q{ +SELECT username,call,tick,dm.fleet,p.value + ,100 * SUM(fs.amount * (metal + crystal + eonium) / 100) / p.value AS value +FROM users u + JOIN current_planet_stats p USING (pid) + JOIN launch_confirmations USING (uid) + JOIN fleets f USING (fid) + JOIN fleet_ships fs USING (fid) + JOIN defense_missions dm ON f.fid = dm.fleet + JOIN ship_stats ss ON fs.ship = ss.name +WHERE NOT dm.announced +GROUP BY username,call,tick,dm.fleet,p.value + }); + my $updefmis = $dbh->prepare(q{UPDATE defense_missions SET announced = TRUE WHERE fleet = ?}); + $defmissions->execute(); + while (my $mission = $defmissions->fetchrow_hashref){ + $irc->yield(privmsg => $ND::defchan, chr(3)."06 $mission->{username} sent def to call $mission->{call}, $mission->{value}% of value (tick $mission->{tick}) https://nd.ruin.nu/calls/edit/$mission->{call}"); + $updefmis->execute($mission->{fleet}); + } +} + +1; diff --git a/ndawn.pl b/ndawn.pl index f2eafaa..eecf5ee 100755 --- a/ndawn.pl +++ b/ndawn.pl @@ -26,7 +26,7 @@ use POE qw(Component::IRC::Qnet::State); use NDIRC::CommonStates; -use NDIRC::Delling; +use NDIRC::Eos; my $nickname = 'ndbot'; my $ircname = 'ND test bot'; @@ -50,9 +50,9 @@ POE::Session->create( package_states => [ 'NDIRC::CommonStates' => [ qw(_default _start irc_001 sig_DIE sig_usr1 sig_usr2 signal_handler irc_disconnected irc_invite) ], - 'NDIRC::Delling' => [ qw(irc_public irc_msg refresh irc_join) ], + 'NDIRC::Eos' => [ qw(irc_public irc_msg refresh irc_join) ], ], - heap => { irc => $irc}, + heap => { irc => $irc }, ); $poe_kernel->run();