Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Strony: 1
Cześć
Powstaje robocik XMPP napisany w Perlu, korzystający z modułu AnyEvent::XMPP::Client.
W tej chwili grzecznie i poprawnie loguje się na dwa różne konta jabbera, na każdym odbiera wiadomości, odpowiada odsyłając otrzymaną wiadomość, pierwsze koty poszły za płoty.
W wielkim skrócie kod do jednego konta wygląda tak:
use strict; use utf8; use AnyEvent; use AnyEvent::XMPP::Client; use AnyEvent::XMPP::IM::Account; use AnyEvent::XMPP::Ext::Disco; use AnyEvent::XMPP::Ext::Version; use AnyEvent::XMPP::Namespaces qw/xmpp_ns/; # use diagnostics; binmode STDOUT, ":utf8"; my $jid="robot\@domena.tld"; my $pw='hasełkorobota'; my $j = AnyEvent->condvar; my $konto1 = AnyEvent::XMPP::Client->new( debug => 0 ); my $disco = AnyEvent::XMPP::Ext::Disco->new; $konto1 ->add_extension($disco); $konto1 ->set_presence( undef, 'Robocik melduje posłusznie pełną gotowość bojową ;)...', 1 ); $konto1 ->add_account( $jid, $pw ); print "connecting to $jid...\n"; $konto1->reg_cb( session_ready => sub { my ( $account, $acc ) = @_; }, connect => sub { print "Robot jest połączony...;\) \n"; }, message => sub { my ($cl, $acc, $msg) = @_; my $from = $msg->from; my $message = $msg ->any_body; my $repl = $msg ->make_reply; $repl->add_body ( "Robot usłyszał: $message\n"); $repl->send; print "\nRobot - połącznie od: $from\n"; print "Robot usłyszał: $message\n"; }, contact_request_subscribe => sub { my ( $account, $acc, $roster, $contact ) = @_; $contact->send_subscribed; warn "Subscribed to " . $contact->jid . "\n"; }, error => sub { my ( $konto1, $acc, $error ) = @_; warn "Error encountered: " . $error->string . "\n"; $j->broadcast; }, disconnect => sub { warn "Got disconnected: [@_]\n"; $j->broadcast; }, ); $konto1 ->start; print "Robocik melduje pełną gotowość bojową :\)\n"; $j->wait;
Potrzebuję tego robota wzbogacić o następne funkcje, m.in szyfrowanie OTR lub GPG (to na końcu), oczekiwanie na komunikaty dostarczane przez socket UNIX (i przesyłanie ich dalej), kilka innych funkcji, ale utknąłem w martwym punkcie z jednego powodu:
Potrzebuję zrobić globalną funkcję dostępną w każdym punkcie kodu, w takiej postaci:
sub sendkonto1 { my ($destjid, $text) = @_; # wysyłam treść $text do adresata $destjid przez konto1... }
Próbowałem na kilkadziesiąt różnych sposobów spowodować wysłanie metodą podobną do:
$konto1 -> send_message ( undef, "$text" ,$destjid , $jid2 , "chat");
i za każdym razem mam komunikat w stylu:
send_message: Couldn't get connected account for sending at /usr/lib64/perl5/vendor_perl/5.20.2/AnyEvent/XMPP/Client.pm line 345.
Zasada opisana jest tutaj:
http://search.cpan.org/~elmex/AnyEvent-XMPP-0.52/li … src,_$type%29
Ale w żaden sposób nie mam pomysłu, jak ją podłączyć do istniejącego połączenia z serwerem.
Jest jeszcze inna droga, banalnie prosta, przez wywołanie modułu AnyEvent::XMPP::IM::Connection, zestawienie nim nowego połączenia i wysłanie w postaci:
my $immsg = AnyEvent::XMPP::IM::Message->new (to => '$destjid', body => '$text'); $immsg->send ($con);
tylko że otwieranie nowego połączenia z nowym logowaniem w momencie, kiedy w sąsiedniej funkcji to połączenie jest aktywne i działa na siostrzanym module Client, byłoby 7 szczytem lamerstwa ostatecznego i nie miałoby żadnego sensu. :P
Cały robocik wygląda na razie tak (to raczej wersja alfa, do bety jeszcze kawał drogi):
http://wklej.dug.net.pl/5135
Ma na razie tylko 130 linii (docelowo pewnie będzie z 500 - 600), ale to dalsza sprawa.
Wszelkie uwagi mile widziane.
Pozdro
Ostatnio edytowany przez Jacekalex (2016-03-12 06:45:25)
Offline
Strony: 1