4
votes

I am basically writing a XMPP client to automatically reply to "specific" chat messages.

My setup is like this:

  • I have pidgin running on my machine configured to run with an account [email protected].
  • I have my own jabber client configured to run with the same account [email protected].
  • There could be other XMPP clients .

    Here is my requirement:

    I am trying to automate certain kind of messages that I receive on gtalk. So whenever I receive a specific message eg: "How are you" , my own XMPP client should reply automatically with say "fine". How are you". All messages sent (before and after my client replies) to [email protected] but should be received by all clients (my own client does not have a UI and can only respond to specific messages.).

    Now I have already coded my client to reply automatically. This works fine. But the problem I am facing is that as soon as I reply (I use the smack library), all subsequent messages that are sent to [email protected] are received only by my XMPP client. This is obviously a problem as my own client is quite dump and does not have a UI, so I don't get to see the rest of the messages sent to me, thereby making me "lose" messages.

    I have observed the same behavior with other XMPP clients as well. Now the question is, is this is a requirement of XMPP (I am sorry but I haven't read XMPP protocol too well). Is it possible to code an XMPP client to send a reply to a user and still be able to receive all subsequent messages in all clients currently listening for messages? Making my client a full fledged XMPP client is a solution, but I don't want to go that route.

    I hope my question is clear.

  • 1

    1 Answers

    5
    votes

    You may have to set a negative presence priority for your bot..

    First thing to know is that in XMPP protocol every client is supposed to have a full JID. This is a bare JID - in your case [email protected] with a resource in the end e.g. [email protected]/pidgin or [email protected]/home (where /pidgin and /home are the resource). This is a part of how routing messages to different clients is supposed to be achieved.

    Then there are the presence stanzas. When going online a client usually sends a presence stanza to the server. This informs about e.g. if the client is available for chat or away for lunch. Along with this information can be sent a priority. When there are more than one clients connected the one with the highest priority will receive the messages sent to the bare JID (e.g. ClientA(prio=50) and ClientB(prio=60) -> ClientB receives the messages sent to [email protected]). But there are also negative priorities. A priority less than 0 states that this client should never be sent any messages. Such a stanza might look like this

    <presence from="[email protected]/bot">
        <priority>-1</priority>
    </presence>
    

    This may fit your case. Please keep in mind it also depends on the XMPP server where your account is located, which may or may have not fully implemented this part of the protocol.

    So to summarize: I recommend you to look through the Smack API how to set a presence and set the priority to <0 for your bot client right after it connected.