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







Podobno człowiek...;)








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