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/random
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/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:
 

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
Nas ludzie lubią po prostu, a nie klikając w przyciski ;-)