sleekxmpp with ejabberd muc
<p>I want to make a muc scprit with sleekxmpp and ejabberd use.
What should I do?</p>

<p>I tried this tutorial to understand eating sleekxmpp <a href="http://sleekxmpp.com/getting_started/echobot.html" rel="nofollow">http://sleekxmpp.com/getting_started/echobot.html</a>
but, number of connected users at the ejabberd panel kept getting pulled over 0</p>

<p>code:</p>

<pre><code>#!/usr/bin/env python
# -*- coding: utf-8 -*-


import sys
import logging
import getpass
from optparse import OptionParser

import sleekxmpp

# Python versions before 3.0 do not use UTF-8 encoding
# by default. To ensure that Unicode is handled properly
# throughout SleekXMPP, we will set the default encoding
# ourselves to UTF-8.
if sys.version_info &lt; (3, 0):
    reload(sys)
    sys.setdefaultencoding('utf8')
else:
    raw_input = input


class EchoBot(sleekxmpp.ClientXMPP):

    """
    A simple SleekXMPP bot that will echo messages it
    receives, along with a short thank you message.
    """

    def __init__(self, jid, password):
        sleekxmpp.ClientXMPP.__init__(self, jid, password)

        # The session_start event will be triggered when
        # the bot establishes its connection with the server
        # and the XML streams are ready for use. We want to
        # listen for this event so that we we can initialize
        # our roster.
        self.add_event_handler("session_start", self.start)

        # The message event is triggered whenever a message
        # stanza is received. Be aware that that includes
        # MUC messages and error messages.
        self.add_event_handler("message", self.message)

    def start(self, event):
        """
        Process the session_start event.

        Typical actions for the session_start event are
        requesting the roster and broadcasting an initial
        presence stanza.

        Arguments:
            event -- An empty dictionary. The session_start
                     event does not provide any additional
                     data.
        """
        self.send_presence()
        self.get_roster()

    def message(self, msg):
        """
        Process incoming message stanzas. Be aware that this also
        includes MUC messages and error messages. It is usually
        a good idea to check the messages's type before processing
        or sending replies.

        Arguments:
            msg -- The received message stanza. See the documentation
                   for stanza objects and the Message stanza to see
                   how it may be used.
        """
        if msg['type'] in ('chat', 'normal'):
            msg.reply("Thanks for sending\n%(body)s" % msg).send()


if __name__ == '__main__':
    # Setup the command line arguments.
    optp = OptionParser()

    # Output verbosity options.
    optp.add_option('-q', '--quiet', help='set logging to ERROR',
                    action='store_const', dest='loglevel',
                    const=logging.ERROR, default=logging.INFO)
    optp.add_option('-d', '--debug', help='set logging to DEBUG',
                    action='store_const', dest='loglevel',
                    const=logging.DEBUG, default=logging.INFO)
    optp.add_option('-v', '--verbose', help='set logging to COMM',
                    action='store_const', dest='loglevel',
                    const=5, default=logging.INFO)

    # JID and password options.
    optp.add_option("-j", "--jid", dest="jid",
                    help="JID to use")
    optp.add_option("-p", "--password", dest="password",
                    help="password to use")

    opts, args = optp.parse_args()

    # Setup logging.
    logging.basicConfig(level=opts.loglevel,
                        format='%(levelname)-8s %(message)s')

    if opts.jid is None:
        opts.jid = raw_input("Username: ")
    if opts.password is None:
        opts.password = getpass.getpass("Password: ")

    # Setup the EchoBot and register plugins. Note that while plugins may
    # have interdependencies, the order in which you register them does
    # not matter.
    xmpp = EchoBot(opts.jid, opts.password)
    xmpp.register_plugin('xep_0030') # Service Discovery
    xmpp.register_plugin('xep_0004') # Data Forms
    xmpp.register_plugin('xep_0060') # PubSub
    xmpp.register_plugin('xep_0199') # XMPP Ping

    # If you are working with an OpenFire server, you may need
    # to adjust the SSL version used:
    # xmpp.ssl_version = ssl.PROTOCOL_SSLv3

    # If you want to verify the SSL certificates offered by a server:
    # xmpp.ca_certs = "path/to/ca/cert"

    # Connect to the XMPP server and start processing XMPP stanzas.
    if xmpp.connect():
        # If you do not have the dnspython library installed, you will need
        # to manually specify the name of the server if it does not match
        # the one in the JID. For example, to use Google Talk you would
        # need to use:
        #
        # if xmpp.connect(('talk.google.com', 5222)):
        #     ...
        xmpp.process(block=True)
        print("Done")
    else:
        print("Unable to connect.")
</code></pre>

<p>console output:</p>

<pre><code>DEBUG    Loaded Plugin: RFC 6120: Stream Feature: STARTTLS
DEBUG    Loaded Plugin: RFC 6120: Stream Feature: Resource Binding
DEBUG    Loaded Plugin: RFC 3920: Stream Feature: Start Session
DEBUG    Loaded Plugin: RFC 6121: Stream Feature: Roster Versioning
DEBUG    Loaded Plugin: RFC 6121: Stream Feature: Subscription Pre-Approval
DEBUG    Loaded Plugin: RFC 6120: Stream Feature: SASL
DEBUG    Loaded Plugin: XEP-0030: Service Discovery
DEBUG    Loaded Plugin: XEP-0004: Data Forms
DEBUG    Loaded Plugin: XEP-0082: XMPP Date and Time Profiles
DEBUG    Loaded Plugin: XEP-0131: Stanza Headers and Internet Metadata
DEBUG    Loaded Plugin: XEP-0060: Publish-Subscribe
DEBUG    Loaded Plugin: XEP-0199: XMPP Ping
DEBUG    Connecting to 192.168.1.103:5222
DEBUG    Event triggered: connected
DEBUG     ==== TRANSITION disconnected -&gt; connected
DEBUG    Starting HANDLER THREAD
DEBUG    Loading event runner
DEBUG    SEND (IMMED): &lt;stream:stream to='192.168.1.103' xmlns:stream='http://etherx.jabber.org/streams' xmlns='jabber:client' xml:lang='en' version='1.0'&gt;
DEBUG    RECV: &lt;stream:stream from="localhost" id="3423333123714766535" xml:lang="en"&gt;
WARNING  Legacy XMPP 0.9 protocol detected.
DEBUG    Event triggered: legacy_protocol
DEBUG    RECV: &lt;stream:error xmlns="http://etherx.jabber.org/streams"&gt;&lt;host-unknown xmlns="urn:ietf:params:xml:ns:xmpp-streams" /&gt;&lt;/stream:error&gt;
DEBUG    Event triggered: stream_error
DEBUG    End of stream recieved
DEBUG    reconnecting...
DEBUG    Event triggered: session_end
DEBUG    SEND (IMMED): &lt;/stream:stream&gt;
INFO     Waiting for &lt;/stream:stream&gt; from server
DEBUG    Event triggered: socket_error
DEBUG    Event triggered: disconnected
DEBUG     ==== TRANSITION connected -&gt; disconnected
DEBUG    connecting...
DEBUG    Waiting 1.98786049338 seconds before connecting.
</code></pre>

<p>Here is the problem:</p>

<pre class="lang-xml prettyprint-override"><code>DEBUG    SEND (IMMED): &lt;stream:stream to='192.168.1.103' xmlns:stream='http://etherx.jabber.org/streams' xmlns='jabber:client' xml:lang='en' version='1.0'&gt;
DEBUG    RECV: &lt;stream:stream from="localhost" id="3423333123714766535" xml:lang="en"&gt;
WARNING  Legacy XMPP 0.9 protocol detected.
DEBUG    Event triggered: legacy_protocol
DEBUG    RECV: &lt;stream:error xmlns="http://etherx.jabber.org/streams"&gt;&lt;host-unknown xmlns="urn:ietf:params:xml:ns:xmpp-streams" /&gt;&lt;/stream:error&gt;
DEBUG    Event triggered: stream_error
DEBUG    End of stream recieved
</code></pre>

<p>Your client is opening a stream to <code>192.168.1.103</code>, but you get a response that says it is from <code>localhost</code>, and then you get a <code>host-unknown</code> error.  (I presume you entered the JID as <code>echobot@192.168.1.103</code>?)</p>

<p>Your ejabberd is configured to use the hostname <code>localhost</code>.  Change that to <code>192.168.1.103</code> in the configuration file, and you'll be able to connect using that "hostname".</p>

<p>Alternatively, you could enter the JID as <code>echobot@localhost</code>, and force the connection to use a different host, by doing what the comment in the code says about Google Talk:</p>

<pre class="lang-py prettyprint-override"><code>if xmpp.connect(('192.168.1.103', 5222)):
</code></pre>

<p>This would work with the current ejabberd configuration.</p>

python xmpp ejabberd multiuserchat