Git Product home page Git Product logo

xmpp-php's Introduction

PHP client library for XMPP (Jabber) protocol

Latest Stable Version Total Downloads Latest Unstable Version Build Status License

This is low level socket implementation for enabling PHP to communicate with XMPP due to lack of such libraries online (at least ones I could find that had decent documentation).

XMPP core documentation can be found here.

Installation requirements and example

Project requirements are given in composer.json ( Composer website):

You can use this library in your project by running:

composer require norgul/xmpp-php

You can see usage example in Example.php file by changing credentials to point to your XMPP server and from project root run php Example.php.

Library usage

Initialization

In order to start using the library you first need to instantiate a new Options class. Host, username and password are mandatory fields, while port number, if omitted, will default to 5222 which is XMPP default.

Username can be either bare JID or in JID/resource form. If you are using a bare JID the resource will be added automatically. You can override this by explicitly setting a resource with $client->iq->setResource(). In the second case the username will be automatically parsed to username and resource variables. In case of JID/resource/xyz format, everything after second slash will be ignored. If both JID/resource is present as well as using the $client->iq->setResource() method, which ever was defined last will take precedence.

$options = new Options();

$options
    ->setHost($host)            // required
    ->setPort($port)            // not required, defaults to 5222
    ->setUsername($username)    // required
    ->setPassword($password);   // required

Options object is required for establishing the connection and every other subsequent request, so once set it should not be changed.

Once this is set you can instantiate a new XmppClient object and pass the Options object in.

XMPP client class explanation

Since XMPP is all about 3 major stanzas, (IQ, Message and Presence), I've created separate classes which are dependant on socket implementation so that you can directly send XML by calling a stanza method.

This means that 3 stanzas have been made available from XmppClient class constructor to be used like a chained method on client's concrete class.

Current logic thus is $client->STANZA->METHOD(). For example:

$client->iq->getRoster();
$client->message->send();
$client->presence->subscribe();

Connecting to the server

Beside being a stanza wrapper, XmppClient class offers a few public methods.

$client->connect() method does a few things:

  1. Connects to the socket which was initialized in XmppClient constructor
  2. Opens an XML stream to exchange with the XMPP server
  3. Tries to authenticate with the server based on provided credentials
  4. Starts the initial communication with the server, bare minimum to get you started

Current version supports PLAIN and DIGEST-MD5 auth methods.

TLS is supported by default. If server has support for TLS, library will automatically try to connect with TLS and make the connection secure.

If you'd like to explicitly disable this functionality, you can use setUseTls(false) function on the Options instance so that TLS communication is disabled. Note that this will function in environments where TLS is supported but not required. If TLS is required, program will connect to it independently of the option you set.

Sending raw data

send() message is exposed as being public in XmppClient class, and its intention is to send raw XML data to the server. For it to work correctly, XML which you send has to be valid XML.

Getting raw response

Server responses (or server side continuous XML session to be exact) can be retrieved with $client->getResponse(). This should be used in an infinite loop or for more sustainable solution in some WebSocket solution like Ratchet if you'd like to see continuous stream of everything coming from the server.

If you would like to see the output of the received response in the console you can call the $client->prettyPrint($response) method.

Receiving messages and other responses

In case you are not interested in complete response which comes from server, you may also use $client->message->receive() ($client->getMessages() was removed because it was just a shorthand method for this one) which will match message tags with regex and return array of matched messages. In case you'd like to see the response in the terminal, you can do something like this:

do {
    $response = $client->message->receive();
    if($response)
        echo print_r($response);
} while (true);

Disconnect

Disconnect method sends closing XML to the server to end the currently open session and closes the open socket.

Stanza method breakdown

Remember from here -> $client->STANZA->METHOD()

Message

send() - sending a message to someone. Takes 3 parameters of which the last one is optional. First parameter is the actual message you'd like to send (body), second one is recipient of the message and third one is type of message to be sent. This defaults to chat.

You can find possible types in this RFC document

receive() - covered in this section

IQ

getRoster() - takes no arguments and fetches current authenticated user roster.

setGroup() - puts a given user in group you provide. Method takes two arguments: first one being the group name which you will attach to given user, and other being JID of that user.

Presence

setPriority() - sets priority for given resource. First argument is an integer -128 <> 127. If no second argument is given, priority will be set for currently used resource. Other resource can be provided as a second argument whereas the priority will be set for that specific resource.

subscribe() - takes JID as an argument and asks that user for presence.

acceptSubscription() - takes JID as an argument and accepts presence from that user.

declineSubscription() - takes JID as an argument and declines presence from that user.

Sessions

Sessions are currently being used only to differentiate logs if multiple connections are being made.

XmppClient class takes in second optional parameter $sessionId to which you can forward session ID from your system, or it will be assigned automatically.

You can disable sessions through Options object ($options->setSessionManager(false)), as they can cause collision with already established sessions if being used inside frameworks or similar. Needless to say if this is disabled, forwarding a second parameter to XmppClient will not establish a new session.

More options (not required)

Options object can take more options which may be chained but are not required. These are explained and commented in the code directly in the Options class:

$options
    ->setProtocol($protocol)  // defaults to TCP
    ->setResource($resource)  // defaults to 'norgul_machine_' string + timestamp
    ->setLogger($logger)      // logger instance (logging explained below)
    ->setAuthType($authType)  // Takes on classes which implement Authenticable

Socket options

Most of the socket options are set by default so there is no need to tamper with this class, however you can additionally change the timeout for the period the socket will be alive when doing a socket_read(), and you can do that with $socket->setTimeout().

Logging

Upon new established session the library is creating a xmpp.log log file in logs/ folder:

You can manually set logger when instantiating Options with setLogger($logger). The method accepts any object which implements Loggable interface so you can create your own implementation.

Fun fact: this used to be a PSR-3 logger interface, but I decided it was an overkill for this stage of development.

Other

Example.php has a sendRawXML() method which can be helpful with debugging. Method works in a way that you can provide hand-written XML and send it to the server. On the other hand you can also trigger a method by providing method name instead of XML.

Enter XML: <xml>foo</xml>           <-- will send XML
Enter XML: getRoster                <-- will run getRoster() method
Enter XML: requestPresence [email protected]  <-- will run with argument requestPresence([email protected])

Some valid XMPP XML will be declined (like sending <presence/>) because simplexml_load_string() is not able to parse it as being a valid XML. In cases you need to do some custom stuff like that and you are sure it is a XMPP valid XML, you can remove the parsing line and just let the send() method do its magic.

Be aware! Be very aware! sending an invalid XML to the server will probably invalidate currently open XML session and you will probably need to restart the script. This is highly experimental and not maintained really. It is a poor orphan method whose parents have abandoned it and left in a hurry. It may prove to be Harry Potter one day, but hey... we all clearly doubt it. You may be a special snowflake but no one likes you. Onward to orphanagemobil! Begone method (just kidding, I won't delete it)!

Who says readme's are boring.

Dev documentation

For anyone willing to contribute, a quick breakdown of the structure:


  • Options.php - everything that is variable about the library
  • Socket.php - socket related implementation (connecting, reading, writing etc.)
  • XmppClient.php - user friendly methods to interact with the library and stanza wrapper enabling users to call stanza methods through instantiated class. This should contain as little logic as possible, turns out it's not so easy :)

  • AuthTypes - contains methods to authenticate yourself to XMPP server. Besides concrete implementations there is also an abstract class with minor logic to avoid duplication and interface having all the necessary methods should the need for new auth type arise.

  • Buffers - implementation of buffer (or should I say a simple array) which gets filled when socket is calling the receive() method, and it flushes on any read, which happens when calling getResponse() method for example. A brief history of why: I had issues when a non-recoverable error would be thrown. In this situation I had to do 2 things: try to reconnect, show the error to the user. The thing is that getResponse() returns string, and in case of reconnection the program execution would continue returning either nothing or returning error string after the server already connected for the second time, thus misinforming the user of the error which occurred before reconnection. Buffer was born.

  • Exceptions - this is more or less a standard. I am just overriding constructors so I can get my message in.

  • Loggers - containing logic to store logs to the logs/xmpp.log file. The idea was to keep several log types inside (full, simple, no logger), but I found the one made to be sufficient.


Xml

  • Xml.php - a trait consisting of way too many regex matching. This should be reformatted.
  • Stanzas - main logic for all stanza communication with the server. This used to be just plain XML, but I have decided to forward a socket dependency inside so that when you call the method, you actually also send it to the server. That used to be something like $this->socket->send($this->iq->getRoster()) which is correct from the programming perspective, but for the simplicity sake, I like the $client->iq->getRoster() more. I'm open to other suggestions.

CI

Continuous integration is done through Travis CI, and each push goes through a process which is currently as simple as:

  • check unit tests (and god knows I have them)
  • check for syntax errors
  • run phpcs (configuration in phpcs.xml)
  • run phpmd (configuration in phpmd.xml)

TODO's

  • unit testing - unfortunately I have been prolonging this for far too long, maybe there is a good soul out there who enjoys writing tests.
  • throttling - when an unrecoverable error occurs (currently I am catching <stream:error> ones which break the stream) reconnect is being made automatically. In case this is happening over and over again, program will try connecting indefinitely, which is fine to any aspect except logs which will get clogged. I would like to throttle the connection so that it increases the connection time each time it is unsuccessful. Problem here is that I can only catch the error when getting the response, and response can be successful on the first XML exchange (for example when you send opening stream request), while breaking on the second request. With this in mind my only idea was to implement throttling with timestamps or something.
  • sessions - I presume this part is working correctly but should be tested from a framework
  • multiple connections - I think this part works fine, but I am worried that triggering getRoster() while simultaneously fetching a message may delete one server response. If you get in one batch both roster and message, it will be added to the buffer. Calling back the response will get either roster or message, not both. And then buffer will be flushed. This is something that needs thinking.
  • structure of XmppClient - in order to enable the $client->stanza->method I need to instantiate all stanzas within the class. I feel as this could be simplified.

xmpp-php's People

Contributors

7snovic avatar norgul avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

xmpp-php's Issues

Connect With Jabbim - TLS integration

Hi @Norgul I'm back,
I use the last version .
I can't connect with jabbim.com
Screenshot from 2019-04-16 17-02-09
Screenshot from 2019-04-16 17-01-51

`

<stream:stream xmlns:stream="http://etherx.jabber.org/streams" xmlns="jabber:client" id="16631993638058903553" version="1.0" xml:lang="en" from="jabbim.com">
stream:features



</stream:features>



stream:error

not well-formed (invalid token)
</stream:error>
</stream:stream>
`
can you help me ?

Wrong date format in logger

The "minute" format in logger is incorrect. The logs show the time as HOUR:MONTH:SECOND not HOUR:MINUTE:SECOND ;-)

Ability to change socket stream timeout

We are using this library to set presence on for a number of users on our XMPP server. This seems to work well but the it takes a long time to actually set. After some looking around, I found this to be caused by the following in the Socket class:

protected $timeout = 150000; // changing to 1500 significantly reduced the time taken to set all the presence
// ...
stream_set_timeout($this->connection, 0, $this->timeout);

Unfortunately, it does not seem that I can change this via the Options class.

Help with simple example using Prosody xmpp server

Hi! Sorry, I am very new in this XMPP world and english is not my native language.

I am trying to send/receive messages using a Prosody xmpp server, following your basic example:

$options = new Options();
$options
    ->setHost('xmppserver.com')
    ->setPort(2700)
    ->setUsername('admin01')
    ->setPassword('password')
    ->setResource('Resource01');
$client = new XmppClient($options);
$client->connect();
$client->message->send('ping', '[email protected]');
$response = $client->getResponse();
echo '<br>'.$response;

admin01 can connect to the xmppserver.com and send the message without issues.

user01 is configured to auto-reply with a "pong" every time it receives a "ping" message.

When user01 is offline (disconnected) I receive the following response:

[email protected]/Resource01

Here is the log:

2021.05.17 18:36:22 60a2e1d495412 REQUEST::Norgul\Xmpp\Socket::send::53 <message to='[email protected]' type='normal'><body>ping</body></message>
2021.05.17 18:36:23 60a2e1d495412 RESPONSE::Norgul\Xmpp\Socket::receive::75 <message to='[email protected]/Resource01' from='[email protected]' type='error'><error type='cancel'><service-unavailable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/></error></message>

When user01 is online (connected) I receive the following response:

[email protected]/Resource01pong  // Response "pong" is in the end

Here is the log:

2021.05.17 18:38:42 60a0118ad9ae4 REQUEST::Norgul\Xmpp\Socket::send::53 <message to='[email protected]' type='normal'><body>ping</body></message>
2021.05.17 18:38:43 60a0118ad9ae4 RESPONSE::Norgul\Xmpp\Socket::receive::75 <message to='[email protected]' from='[email protected]/Resource01' type='normal' id='XMPPMessage00000007'><body>pong</body></message>

Please, I'd like to know how to check for user presence before send the message and also how to parse the message to only receive what is in the body.

Thank you very much!

Proxy

I can't set proxy on this function stream_socket_client;
My Code (Socket.php):

$context = stream_context_create(array(
            'http' => array(
                'timeout' => 5,
                'proxy' => 127.0.0.1:8080,
                'request_fulluri' => true
            ),
            'ssl' => array(
                'SNI_enabled' => false
            )
        ));

$this->connection = stream_socket_client($options->fullSocketAddress(), $errno, $errstr, 5, STREAM_CLIENT_CONNECT, $context);

Is there any chance to set proxy ?

all works, but very slow

Hi
Hello
My sequence of connecting and sending a message takes about 10 seconds, how can this be accelerated?
My code is
`
$logger = new Logger('xmpp');
$logger->pushHandler(new StreamHandler('php://stdout', Logger::DEBUG));

	$options
		->setHost($hostname)
		->setPort($port)
		->setUsername($adminUsername)
		->setPassword($adminPassword)
		->setLogger(new my_logger());

	$client = new XmppClient($options);

	$client->connect();
	$client->iq->getRoster();
	$client->message->send('Hello world', 'vovan@мщмфтюсщь');
	$client->disconnect();

`
launched on same server with ejabberd.

Thanks !

ssl3_get_server_certificate:certificate verify failed

i am getting an error even with the ssl is installed on my server.

stream_socket_enable_crypto(): SSL operation failed with code 1. OpenSSL Error messages:
error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed

Please help.

Fatal error: require(): Failed opening required 'xmpp-php-master/vendor/autoload.php'

Hi, I cant to try test the Example.php, because it returns:

Warning: require(xmpp-php-master/vendor/autoload.php): failed to open stream: No such file or directory in xmpp-php-master\Example.php on line 79

Fatal error: require(): Failed opening required 'xmpp-php-master/vendor/autoload.php' (include_path='.;C:\php\pear') in xmpp-php-master\Example.php on line 79

can't seem to send message to a groupchat.

I can do:
$client->message->send($message, $recipient,$msg_type);
where $msg_type = 'chat' and send the specified message to the specified recipient.

changing $msg_type to 'groupchat' does not get the message sent to a chat group.

You have to FIRST do something like:
$client->presence->subscribe("[email protected]/resource_name");

BUT xmpp-php sends:

<presence from='[email protected]' to='[email protected]' 
 type='subscribe' />

and that does not work for my openchat chat server. I don't get an error but when I do the send() I get a 406 error.

<error code="406" type="modify"><not-acceptable xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/></error>

If we send:
<presence from='[email protected]' to='[email protected]' />
instead... then the send() to the chat room works.

  • jack

15/20 seconds to send a message

Hi,

I need to understand what I'm doing wrong or what I need to improve in my code to speed up sending messages.

Here my PHP script:

<?php

namespace Norgul\Xmpp;

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

require __DIR__.'/vendor/autoload.php';

$options = new Options();
$options->setHost("xmpp.example.com");
$options->setPort(5222);
$options->setUsername("maria");
$options->setPassword("12345678@");

$client = new XmppClient($options);
$client->connect();
$client->iq->getRoster();

$client->message->send('Sample message', '[email protected]');

$response = $client->getResponse();
$client->prettyPrint($response);

$client->disconnect();

I can send messages, but every message takes 15 to 20 seconds to send, so I think something is wrong.

Here the log generated by the PHP script:

2019.06.10 03:06:30 5cfdf3de3f7f4 REQUEST::Norgul\Xmpp\Socket::send::57 <?xml version='1.0' encoding='UTF-8'?><stream:stream to='xmpp.example.com' xmlns:stream='http://etherx.jabber.org/streams' xmlns='jabber:client' version='1.0'>
2019.06.10 03:06:32 5cfdf3de3f7f4 RESPONSE::Norgul\Xmpp\Socket::receive::78 <?xml version='1.0'?><stream:stream id='5454702324109226903' version='1.0' xml:lang='en' xmlns:stream='http://etherx.jabber.org/streams' from='xmpp.example.com' xmlns='jabber:client'><stream:features><starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'><required/></starttls></stream:features>
2019.06.10 03:06:32 5cfdf3de3f7f4 REQUEST::Norgul\Xmpp\Socket::send::57 <starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>
2019.06.10 03:06:34 5cfdf3de3f7f4 RESPONSE::Norgul\Xmpp\Socket::receive::78 <proceed xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>
2019.06.10 03:06:34 5cfdf3de3f7f4 REQUEST::Norgul\Xmpp\Socket::send::57 <?xml version='1.0' encoding='UTF-8'?><stream:stream to='xmpp.example.com' xmlns:stream='http://etherx.jabber.org/streams' xmlns='jabber:client' version='1.0'>
2019.06.10 03:06:36 5cfdf3de3f7f4 RESPONSE::Norgul\Xmpp\Socket::receive::78 <?xml version='1.0'?><stream:stream id='1254184880686051019' version='1.0' xml:lang='en' xmlns:stream='http://etherx.jabber.org/streams' from='xmpp.example.com' xmlns='jabber:client'><stream:features><mechanisms xmlns='urn:ietf:params:xml:ns:xmpp-sasl'><mechanism>DIGEST-MD5</mechanism><mechanism>PLAIN</mechanism><mechanism>SCRAM-SHA-1</mechanism><mechanism>X-OAUTH2</mechanism></mechanisms><register xmlns='http://jabber.org/features/iq-register'/></stream:features>
2019.06.10 03:06:36 5cfdf3de3f7f4 REQUEST::Norgul\Xmpp\Socket::send::57 <auth xmlns='urn:ietf:params:xml:ns:xmpp-sasl' mechanism='PLAIN'>AG1hcmlhADEyMzQ1Njc4QA==</auth>
2019.06.10 03:06:38 5cfdf3de3f7f4 RESPONSE::Norgul\Xmpp\Socket::receive::78 <success xmlns='urn:ietf:params:xml:ns:xmpp-sasl'/>
2019.06.10 03:06:38 5cfdf3de3f7f4 REQUEST::Norgul\Xmpp\Socket::send::57 <?xml version='1.0' encoding='UTF-8'?><stream:stream to='xmpp.example.com' xmlns:stream='http://etherx.jabber.org/streams' xmlns='jabber:client' version='1.0'>
2019.06.10 03:06:40 5cfdf3de3f7f4 RESPONSE::Norgul\Xmpp\Socket::receive::78 <?xml version='1.0'?><stream:stream id='1118384314067387153' version='1.0' xml:lang='en' xmlns:stream='http://etherx.jabber.org/streams' from='xmpp.example.com' xmlns='jabber:client'><stream:features><bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'/><session xmlns='urn:ietf:params:xml:ns:xmpp-session'><optional/></session><c ver='M0fso8w56U7RB1HYmBkwKOuBrgw=' node='http://www.process-one.net/en/ejabberd/' hash='sha-1' xmlns='http://jabber.org/protocol/caps'/><sm xmlns='urn:xmpp:sm:2'/><sm xmlns='urn:xmpp:sm:3'/><ver xmlns='urn:xmpp:features:rosterver'/><csi xmlns='urn:xmpp:csi:0'/></stream:features>
2019.06.10 03:06:40 5cfdf3de3f7f4 REQUEST::Norgul\Xmpp\Socket::send::57 <iq type='set' id='5cfdf3e84a9bf'><bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'><resource>norgul_machine_1560146920</resource></bind></iq>
2019.06.10 03:06:42 5cfdf3de3f7f4 RESPONSE::Norgul\Xmpp\Socket::receive::78 <iq type='result' id='5cfdf3e84a9bf'><bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'><jid>[email protected]/norgul_machine_1560146920</jid></bind></iq>
2019.06.10 03:06:42 5cfdf3de3f7f4 REQUEST::Norgul\Xmpp\Socket::send::57 <presence/>
2019.06.10 03:06:44 5cfdf3de3f7f4 RESPONSE::Norgul\Xmpp\Socket::receive::78 <presence xml:lang='en' to='[email protected]/norgul_machine_1560146920' from='[email protected]/norgul_machine_1560146920'><x xmlns='vcard-temp:x:update'/></presence><presence xml:lang='en' to='[email protected]/norgul_machine_1560146920' from='[email protected]/norgul_machine_1560144963'><x xmlns='vcard-temp:x:update'/><delay from='[email protected]/norgul_machine_1560144963' stamp='2019-06-10T05:36:05.659905Z' xmlns='urn:xmpp:delay'/></presence><presence xml:lang='en' to='[email protected]/norgul_machine_1560146920' from='[email protected]/norgul_machine_1560144532'><x xmlns='vcard-temp:x:update'/><delay from='[email protected]/norgul_machine_1560144532' stamp='2019-06-10T05:28:55.324303Z' xmlns='urn:xmpp:delay'/></presence><presence xml:lang='en' to='[email protected]/norgul_machine_1560146920' from='[email protected]/norgul_machine_1560144631'><x xmlns='vcard-temp:x:update'/><delay from='[email protected]/norgul_machine_1560144631' stamp='2019-06-10T05:30:33.998640Z' xmlns='urn:xmpp:delay'/></presence><presence xml:lang='en' to='[email protected]/norgul_machine_1560146920' from='[email protected]/norgul_machine_1560144960'><x xmlns='vcard-temp:x:update'/><delay from='[email protected]/norgul_machine_1560144960' stamp='2019-06-10T05:36:02.821380Z' xmlns='urn:xmpp:delay'/></presence>
2019.06.10 03:06:44 5cfdf3de3f7f4 REQUEST::Norgul\Xmpp\Socket::send::57 <iq type='get' id='5cfdf3ec51787'><query xmlns='jabber:iq:roster'/></iq>
2019.06.10 03:06:46 5cfdf3de3f7f4 RESPONSE::Norgul\Xmpp\Socket::receive::78 <iq xml:lang='en' to='[email protected]/norgul_machine_1560146920' from='[email protected]' type='result' id='5cfdf3ec51787'><query xmlns='jabber:iq:roster'/></iq>
2019.06.10 03:06:46 5cfdf3de3f7f4 REQUEST::Norgul\Xmpp\Socket::send::57 <message to='[email protected]' type='chat'><body>Complementando mensagem para envio e tudo certo</body></message>
2019.06.10 03:06:48 5cfdf3de3f7f4 REQUEST::Norgul\Xmpp\Socket::send::57 </stream:stream>
2019.06.10 03:06:48 5cfdf3de3f7f4 RESPONSE::Norgul\Xmpp\Socket::receive::78 </stream:stream>

re: 15/20 seconds to send a message

I saw issue #6... but not sure I fully agree with the solution. Other php clients don't have the delay.
If you set the timeout to 0 ( it is set to 1 ) in: src/Socket.php

    /**
     * Period in seconds during which the socket will be active when doing a socket_read()
     */
    protected $timeout = 0;

    /**
     * Socket constructor.
     * @param Options $options
     * @throws DeadSocket
     */
    public function __construct(Options $options)

There is no delay in sending the message.

There is an error in:
src/Buffers/Response.php
... but this:

    public function read()
    {
        if(!empty($this->response)) {
                $implodedResponse = implode('', $this->response);
                $this->flush();
                return $implodedResponse;
        } else {
                return $this->response;
        }
    }

corrects thost issues.... I don't know if this will cause issues down the line or not.

It seems like AS-IS that

    /**
     * Period in seconds during which the socket will be active when doing a socket_read()
     */
    protected $timeout = 1;

IMPOSES a 1 second delay on a socket send/read and that's not what the timeout stuff usually does. If you change that to 10.. it waits 10 seconds after each send... timeout is supposed to say wait UP TO that many seconds... not wait that many seconds.

  • jack

List of supported XEPs

Greetings!

Do you have a list of supported XEPs?

Do you support PubSub? (i.e. XEP-0060: Publish-Subscribe)

Thanks in advance,
Schimon

How set status "online"

Good day.
I made changes to the Example.php file, everything works, but the status of the bot is "offline".
Please tell me how to set the status of the bot "online".

Reconnect on error / disconnect

I am currently using this library to build a Bot to run automation tasks.

However when it loses connectivity because either the server became unavailable or was restarted it does not automatically reconnect.

Is there a way for me to get the status and if the connection is no longer working to trigger a reconnect?

So far I have not been able to find a reliable way to do this.

Thanks!

TimeOut Connect Google Hangout

Hi @Norgul , I use your library and I try to connect with Google Hangout with this config

use Norgul\Xmpp\Options;
use Norgul\Xmpp\XmppClient;

class XmppController extends Controller
{
    protected static $host     = 'gmail.com';
    protected static $port     = 5222;
    protected static $username = 'user_gmail'; // [email protected]
    protected static $password = 'password_gmail';
    public function __construct()
    {
        ini_set('display_errors', 1);
        ini_set('display_startup_errors', 1);
        error_reporting(E_ALL);
    }
    public function getMessage()
    {
        $options = new Options();
        $options
            ->setHost(self::$host)
            ->setPort(self::$port)
            ->setUsername(self::$username)
            ->setPassword(self::$password);
        $client = new XmppClient($options);
        $client->connect();
        $client->getRoster();
        $client->sendMessage('Hello world', '[email protected]');
        $client->getResponse();
        do {
            $client->getResponse();
        } while (true);
    }
}

but always request time out.
can you help me ?

Resource binding before authentication

Hey, found your library and in love with the simplicity, but there is actually one issue. Trying to setup library on Symfony frramework, successfully did it, but then I'm trying to send message got this error:

Cannot bind resource before authentication

After setting TLS to TRUE, after setting resource response is "invalid-namespace" and message is not delivered.
Please fix ASAP!!

` protected static $host = 616.pub';
protected static $port = 5222;
protected static $username = 'randomas1';
protected static $password = 'randomas1';

/**
 * @Route("/", name="homepage")
 */
public function indexAction(Request $request)
{
    $options = new Options();

    $options
        ->setHost(self::$host)
        ->setPort(self::$port)
        ->setUsername(self::$username)
        ->setPassword(self::$password);

    $client = new XmppClient($options);
    $client->connect();
    $client->iq->getRoster();

    $client->message->send('Hello world', '[email protected]');

    return new Response($client->getResponse());`

Fatal error: Uncaught TypeError

I get the following error while texting. Why?

Fatal error: Uncaught TypeError: Return value of Norgul\Xmpp\XmppClient::initDependencies() must be an instance of Norgul\Xmpp\void, none returned in /home/domain/public_html/src/XmppClient.php:51 Stack trace: #0 /home/domain/public_html/c2msj/src/XmppClient.php(43): Norgul\Xmpp\XmppClient->initDependencies() #1 /home/cplusxyz/public_html/index.php(19): Norgul\Xmpp\XmppClient->__construct(Object(Norgul\Xmpp\Options)) #2 /home/domain/public_html/index.php(114): Norgul\Xmpp\test('mhmtz', 'anon-a0ffd6926c...', '557b2a84cc1f64c...', 'hello') #3 {main} thrown in /home/domain/public_html/src/XmppClient.php on line 51

raspberry pi 3

I have raspberry 3. installed composer.
I run php composer.phar require norgul\xmpp-php, I get "Installation failed, deleting ./composer.json.
In RequireCommand.php line 225:
No composer.json present in the current directory (./composer.json), this may be the cause of the following exception.
In PackageDiscoveryTrait.php line 376:
Could not find a matching version of package norgulxmpp-php. Check the package spelling, your version constraint and that the package is available in a stability which matches your minimum-stability (stable).
"
I run php composer.phar create-project norgul/xmpp-php, I get "Your requirements could not be resolved to an installable set of packages.
Problem 1

  • Root composer.json requires friendsofphp/php-cs-fixer 3.0.x-dev (exact version match), found friendsofphp/php-cs-fixer[dev-master, v0.1.0, ..., v0.5.7, v1.0, ..., v1.13.3, v2.0.0-alpha, ..., v2.19.3, v3.0.0-beta.1, ..., v3.26.1] but it does not match the constraint."
    What should I do to install xmpp-php on Raspberry Pi 3?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.