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!

Ogłoszenie

Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.

#1  2016-03-12 06:19:08

  Jacekalex - Podobno człowiek...;)

Jacekalex
Podobno człowiek...;)
Skąd: /dev/urandom
Zarejestrowany: 2008-01-07

[PERL]AnyEvent::XMPP::Client - wysłanie nowej wiadomości?

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:

Kod:

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:

Kod:

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:

Kod:

$konto1 -> send_message ( undef, "$text" ,$destjid , $jid2 , "chat");

i za każdym razem mam komunikat w stylu:

Kod:

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:
 

Kod:

    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)


W demokracji każdy naród ma taką władzę, na jaką zasługuje ;)
Si vis pacem  para bellum  ;)       |       Pozdrawiam :)

Offline

 

Stopka forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson
Możesz wyłączyć AdBlock — tu nie ma reklam ;-)

[ Generated in 0.013 seconds, 11 queries executed ]

Informacje debugowania

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