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/lib/AnyEvent/XMPP/Client.pm#send_message_%28$msg,_$dest_jid,_$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 [url=http://cpansearch.perl.org/src/MSTPLBG/AnyEvent-XMPP-0.55/samples/sendmsg]inna droga, banalnie prosta[/url], przez wywołanie modułu [b]AnyEvent::XMPP::IM::Connection[/b], 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
Time (s) | Query |
---|---|
0.00011 | SET CHARSET latin2 |
0.00003 | SET NAMES latin2 |
0.00124 | SELECT u.*, g.*, o.logged FROM punbb_users AS u INNER JOIN punbb_groups AS g ON u.group_id=g.g_id LEFT JOIN punbb_online AS o ON o.ident='44.197.108.187' WHERE u.id=1 |
0.00076 | REPLACE INTO punbb_online (user_id, ident, logged) VALUES(1, '44.197.108.187', 1711712285) |
0.00069 | SELECT * FROM punbb_online WHERE logged<1711711985 |
0.00055 | SELECT topic_id FROM punbb_posts WHERE id=299052 |
0.00079 | SELECT id FROM punbb_posts WHERE topic_id=28384 ORDER BY posted |
0.00066 | SELECT t.subject, t.closed, t.num_replies, t.sticky, f.id AS forum_id, f.forum_name, f.moderators, fp.post_replies, 0 FROM punbb_topics AS t INNER JOIN punbb_forums AS f ON f.id=t.forum_id LEFT JOIN punbb_forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id=3) WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.id=28384 AND t.moved_to IS NULL |
0.00004 | SELECT search_for, replace_with FROM punbb_censoring |
0.00087 | SELECT u.email, u.title, u.url, u.location, u.use_avatar, u.signature, u.email_setting, u.num_posts, u.registered, u.admin_note, p.id, p.poster AS username, p.poster_id, p.poster_ip, p.poster_email, p.message, p.hide_smilies, p.posted, p.edited, p.edited_by, g.g_id, g.g_user_title, o.user_id AS is_online FROM punbb_posts AS p INNER JOIN punbb_users AS u ON u.id=p.poster_id INNER JOIN punbb_groups AS g ON g.g_id=u.group_id LEFT JOIN punbb_online AS o ON (o.user_id=u.id AND o.user_id!=1 AND o.idle=0) WHERE p.topic_id=28384 ORDER BY p.id LIMIT 0,25 |
0.00526 | UPDATE punbb_topics SET num_views=num_views+1 WHERE id=28384 |
Total query time: 0.011 s |