# note http://www.gentoo.ru/node/21449 # необходимо закомменировать строку $response{authzid} = $authzid; # в vendor_perl/5.24.3/Authen/SASL/Perl/DIGEST_MD5.pm package jabberbot; use 5.018; use strict; use warnings; use utf8; use open qw(:std :utf8); use Net::Jabber::Bot; use Hailo; use conf qw(loadConf); use botlib qw(weather logger trim randomCommonPhrase); use Exporter qw(import); use vars qw/$VERSION/; $VERSION = '1.0'; our @EXPORT_OK = qw(run_jabberbot); my $c = loadConf(); my $hailo; my $imonline = 0; sub __background_checks { my $bot = shift; unless ($imonline) { $bot->ChangeStatus('Chat', 'I\'m here'); $imonline = 1; } return; } sub __new_bot_message { my %hash = @_; my $bot = $hash{bot_object}; my $text = $hash{body}; if ($hash{'type'} eq 'groupchat') { # ignore self messages return if ($hash{'from_full'} eq $bot->{'from_full'}); # parse messages my $qname = quotemeta($c->{jabberbot}->{aleesa}->{mucname}); if ($text =~ /^$qname$/) { $bot->SendGroupMessage($hash{'reply_to'}, 'Чего тебе?'); } elsif ($text =~ /^$qname[\,|\:]? (.+)/) { $bot->SendGroupMessage($hash{'reply_to'}, $hailo->learn_reply($1)); } elsif ($text eq "$c->{jabberbot}->{aleesa}->{csign}пинг") { $bot->SendGroupMessage($hash{'reply_to'}, 'Понг.'); } elsif ($text eq "$c->{jabberbot}->{aleesa}->{csign}ping") { $bot->SendGroupMessage($hash{'reply_to'}, 'Pong.'); } elsif (substr($text, 0, 1) eq $c->{jabberbot}->{aleesa}->{csign}) { if (substr($text, 1, 3) eq 'rum') { eval { $bot->SendGroupMessage( $hash{'reply_to'}, '/me притаскивает на подносе стопку рома для ' . (split(/\//,$hash{from_full}))[1] . ', края стопки искрятся кристаллами соли.' ); }; } elsif (substr($text, 1, 5) eq 'vodka') { eval { $bot->SendGroupMessage( $hash{'reply_to'}, '/me подаёт водку с маринованным огурчиком для ' . (split(/\//,$hash{from_full}))[1] ); }; } elsif (substr($text, 1, 4) eq 'beer') { eval { $bot->SendGroupMessage( $hash{'reply_to'}, '/me бахает об стол перед ' . (split(/\//,$hash{from_full}))[1] . ' кружкой холодного пива, часть пенной шапки сползает по запотевшей спенке кружки.' ); }; } elsif (substr($text, 1, 7) eq 'tequila') { eval { $bot->SendGroupMessage( $hash{'reply_to'}, '/me ставит рядом с ' . (split(/\//,$hash{from_full}))[1] . ' шот текилы, аккуратно на ребро стопки насаживает дольку лайма и ставит кофейное блюдце с горочкой соли.' ); }; } elsif (substr($text, 1, 6) eq 'whisky') { eval { $bot->SendGroupMessage( $hash{'reply_to'}, '/me демонстративно достаёт из морозилки пару кубических камушков, бросает их в толстодонный стакан и аккуратно наливает Jack Daniels. Запускает стакан вдоль барной стойки, он останавливается около ' . (split(/\//,$hash{from_full}))[1] . '.' ); }; } elsif (substr($text, 1, 8) eq 'absinthe') { eval { $bot->SendGroupMessage( $hash{'reply_to'}, "/me наливает абсент в стопку. Смочив кубик сахара в абсенте кладёт его на дырявую ложечку и пожигает. Как только пламя потухнет, $c->{jabberbot}->{aleesa}->{mucname} размешивает оплавившийся кубик в абсенте и подносит стопку " .(split(/\//,$hash{from_full}))[1] . '.' ); }; } elsif (substr($text, 1, 2) eq 'w ' || substr($text, 1, 2) eq 'п ') { my $city = substr($text, 2); eval { $bot->SendGroupMessage( $hash{'reply_to'}, weather($city) =~ tr/\n/ /r ); }; } elsif ((length($text) == 8 && substr($text, 1, 8) eq 'version') || (length ($text) == 4 && substr($text, 1, 4) eq 'ver')) { $bot->SendGroupMessage($hash{'reply_to'}, 'Версия нуль.чего-то_там.чего-то_там'); } elsif ((length ($text) == 5 && substr($text, 1, 5) eq 'help') || (length ($text) == 7 && substr($text, 1, 7) eq 'помощь')) { my $rate = $bot->message_delay(); # rate limit this :) specially for jabber.ru $bot->message_delay($rate * 5); $bot->SendGroupMessage($hash{'reply_to'}, "!help | !помощь - это сообщение"); $bot->SendGroupMessage($hash{'reply_to'}, "!w город | !п город - погода в городе"); $bot->SendGroupMessage($hash{'reply_to'}, "!ping | !пинг - попинговать бота"); $bot->SendGroupMessage($hash{'reply_to'}, "!some_brew - выдать соответсвующий напиток, на донный момент бармен умеет выдать rum, vodka, beer, tequila, whisky, absinthe"); $bot->SendGroupMessage($hash{'reply_to'}, "!ver|version - написать что-то про версию ПО"); $bot->message_delay($rate); } else { $hailo->learn($text); return; } } else { $hailo->learn($text); return; } } elsif ($hash{'type'} eq 'chat') { $bot->SendPersonalMessage($hash{'reply_to'}, 'Я вас не знаю, идите нахуй.'); return; } return; } sub run_jabberbot { $hailo = Hailo->new( brain => $c->{jabberbot}->{aleesa}->{brain}, order => 2 ); my %conflist = (); $conflist{$c->{jabberbot}->{aleesa}->{room}} = []; my $qname = quotemeta($c->{jabberbot}->{aleesa}->{mucname}); my $bot = Net::Jabber::Bot->new( server => $c->{jabberbot}->{aleesa}->{host}, server_host => $c->{jabberbot}->{aleesa}->{host}, conference_server => $c->{jabberbot}->{aleesa}->{confsrv}, tls => 0, username => $c->{jabberbot}->{aleesa}->{authname}, # threre is some nasty bug in module, so we have to set from_full explicitly from_full => sprintf( "%s@%s/%s", $c->{jabberbot}->{aleesa}->{room}, $c->{jabberbot}->{aleesa}->{confsrv}, $c->{jabberbot}->{aleesa}->{authname} ), password => $c->{jabberbot}->{aleesa}->{password}, alias => $c->{jabberbot}->{aleesa}->{mucname}, # name on confs resource => 'bot', safety_mode => 1, message_function => \&__new_bot_message, background_function => \&__background_checks, loop_sleep_time => 60, forums_and_responses => \%conflist, ); while (sleep 3) { eval { $imonline = 0; $bot->Start(); }; } return; } 1; # vim: set ft=perl noet ai ts=4 sw=4 sts=4: